Vertex AI部署YOLOv8模型推理报错:请求大小超限,代码是否正确?
一、原始代码存在两处关键错误
归一化步骤缺失
YOLOv8训练时默认会将图像像素值归一化到[0,1]区间(即除以255),你的代码中注释掉了image = image / 255.0,如果训练阶段做了归一化,推理时跳过这一步会导致模型输出结果异常,这一步必须恢复。错误使用Vertex AI内置预测参数
ImageObjectDetectionPredictionParams是Vertex AI针对官方内置目标检测模型设计的参数,自定义部署的YOLOv8 SavedModel无法识别这些参数,设置后完全不会生效,需要删除这部分代码。后续如果需要过滤预测结果,要自行处理模型输出的output0张量。
二、当前报错的直接原因是请求大小超限,但并非“图片大小”问题
报错提示请求大小超过1.5MB,根源在于你将处理后的float32张量直接转base64传输:
- 处理后的张量尺寸为
1×3×960×960,每个float32元素占4字节,原始张量大小约11MB,base64编码后体积会增加约33%,达到约14.7MB,远超Vertex AI预测请求的1.5MB限制。 - 这不是原始图片的大小问题,而是你传输的是未压缩的张量数据,正确做法是直接传输原始图片(或压缩后的图片),让模型端点负责预处理,或者采用更高效的传输方式。
修正建议
恢复归一化步骤
取消image = image / 255.0的注释,确保输入数据和训练时的预处理逻辑一致。移除无效参数
删除parameters = predict.params.ImageObjectDetectionPredictionParams(...).to_value()代码段,调用client.predict时不传入parameters参数。优化请求数据传输
不再传输预处理后的张量,改为传输原始图片的base64编码:# 读取原始图片并转base64 with open(im_test_path, "rb") as f: encoded_image = base64.b64encode(f.read()).decode("utf-8") instance = {"images": encoded_image}同时需要修改模型逻辑,让端点侧完成图像resize、BGR转RGB、归一化、转NCHW等预处理操作——可以在导出SavedModel时将预处理逻辑嵌入模型,或者在Vertex AI部署时添加预处理容器。
内容的提问来源于stack exchange,提问作者Jeanne Chaverot

