如何向TF Serving模型批量发送多张图片及解决请求报错问题
向TF Serving发送多张图片批量推理方案及问题修复
向TF Serving提交多张图片做批量推理是原生支持的可行方案,你当前遇到的异常由两个可直接修复的问题导致:
- 核心拼写错误:解析TF Serving返回结果时,你把返回字段名拼错了。正确的预测结果字段是
predictions,你写的predictons少了一个字母i,触发键不存在的错误,最终只输出了你写错的键名字符串。 - 缺少基础的响应校验逻辑,请求如果触发服务端错误,你无法第一时间拿到错误详情,只会在解析键名时报错。
代码修正说明
- 你构造批量输入的逻辑是正确的:遍历读取所有图片后直接拼成第一维为batch size的numpy数组即可,你注释掉
nv.expand_dims(image,axis=0)的操作是对的,不需要给单张图额外扩维度,最终生成的数组形状应为(图片总数, 300, 300, 通道数),完全符合TF Serving的批量输入格式要求。 - 发送请求时只要保证
instances.tolist()转换后保留原有4维结构,就可以正常被服务端解析。 - 新增HTTP响应状态校验,请求异常时直接抛出状态错误,方便定位问题。
修正后的预测请求代码如下:
import requests import json def make_prediction(instances): url = get_url() data = json.dumps({"signature_name": "serving_default", "instances": instances.tolist()}) headers = {"content-type": "application/json"} json_response = requests.post(url, data=data, headers=headers) # 校验请求是否成功 json_response.raise_for_status() resp = json.loads(json_response.text) # 修正字段拼写错误 predictions = resp['predictions'] return predictions
如果批量推理的图片数量多、单图尺寸大,可以替换为gRPC接口对接TF Serving,相比HTTP JSON接口序列化/传输效率更高,批量吞吐量表现更好,小批量测试场景下用现有HTTP接口即可满足需求。
内容的提问来源于stack exchange,提问作者AlirezaTomari
相关产品推荐
相关产品推荐

