Tensorflow Serving Predict API报'base64数据格式错误'问题排查
解决TensorFlow Serving调用时的'not formatted correctly for base64 data'错误
这个问题的核心原因其实很清楚:你调用API时默认使用了模型的serving_default签名,而这个签名的输入类型是DT_STRING——TensorFlow Serving对字符串类型的输入会默认期望你传入base64编码的数据,但你提供的是原始浮点数数组,自然会触发格式不匹配的错误。而你真正想使用的是predict_fraud签名,它的输入是DT_FLOAT,完全不需要base64编码。
下面是两种直接有效的解决方法:
方法1:调用API时显式指定目标签名
修改你的请求URL,在模型名称后加上:predict_fraud,明确告诉TensorFlow Serving使用这个签名处理请求:
POST /v1/models/payfraud:predict_fraud
请求体保持你原来的格式即可:
{ "inputs": [ { "payFraudInput": [[44.26, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]] } ] }
这样Serving就会使用predict_fraud签名的DT_FLOAT输入定义,直接解析你的浮点数数组,不会再要求base64编码。
方法2:将predict_fraud设为默认签名(可选)
如果你希望每次调用默认就使用这个签名,有两种方式:
- 重新导出模型:在保存模型的时候,将
predict_fraud设置为默认的服务签名(修改模型导出代码,指定signature_def_map中的默认项)。 - 启动Serving时指定:启动TensorFlow Serving容器时,添加
--model_name=payfraud --signature_def_name=predict_fraud参数,强制指定默认使用的签名。
另外补充一点:你之前尝试base64编码请求仍失败,大概率是因为即使编码了,serving_default签名的输入结构可能和你传入的格式不匹配(比如它可能期望单字符串输入,而你编码了数组结构),所以根本路径还是切换到正确的签名上。
内容的提问来源于stack exchange,提问作者H.Gruber
相关产品推荐
相关产品推荐

