Docker部署TensorFlow Serving模型返回404,模型信息缺失
解决方案
一、先解决404错误(核心问题)
你的REST请求路径缺少v1前缀,这是TensorFlow Serving REST API的必填部分,直接导致了404。同时还要确认Docker挂载配置是否正确:
修正请求URL
将请求地址从:'http://localhost:8501/models/model_name:predict'修改为:
'http://localhost:8501/v1/models/model_name:predict'验证Docker挂载配置
确保Docker命令挂载的是包含model_name目录的父文件夹,并且设置了MODEL_NAME环境变量。正确的启动命令示例:docker run -p 8501:8501 -v /本地路径/包含model_name的父目录:/models -e MODEL_NAME=model_name tensorflow/serving比如你的模型保存在
/tmp/tmpXXX/model_name/1/,那么挂载的就是/tmp/tmpXXX,而不是/tmp/tmpXXX/model_name。检查模型加载状态
用curl请求模型状态,确认是否加载成功:curl http://localhost:8501/v1/models/model_name返回类似如下JSON则说明加载正常:
{ "model_version_status": [ { "version": "1", "state": "AVAILABLE", "status": { "error_code": "OK", "error_message": "" } } ] }
二、处理输出名称不匹配问题
你的模型输出名称是dense_2,而代码中尝试读取predictions,即使请求成功也会报错。有三种解决方式:
方式1:修改模型最后一层的名称(推荐)
在构建迁移学习模型时,直接给最后一层指定name='predictions':
# 基于MobileNetV2构建模型示例 base_model = tf.keras.applications.MobileNetV2(input_shape=(224,224,3), include_top=False) x = base_model.output x = tf.keras.layers.GlobalAveragePooling2D()(x) # 最后一层设置name为predictions output_layer = tf.keras.layers.Dense(5, name='predictions')(x) model = tf.keras.Model(inputs=base_model.input, outputs=output_layer) # 训练后保存 tmpdir = tempfile.mkdtemp() save_path = os.path.join(tmpdir, "model_name/1/") tf.saved_model.save(model, save_path)
方式2:保存前修改现有模型的输出名称
如果不想重新训练,可在保存模型前修改输出张量的名称并重新定义签名:
tmpdir = tempfile.mkdtemp() save_path = os.path.join(tmpdir, "model_name/1/") # 修改输出张量名称 model.outputs[0]._name = 'predictions' # 重新定义服务签名 @tf.function(input_signature=[tf.TensorSpec(model.input_shape, model.input_dtype)]) def serving_default(inputs): outputs = model(inputs) return {'predictions': outputs} # 带自定义签名保存模型 tf.saved_model.save(model, save_path, signatures={'serving_default': serving_default})
方式3:修改请求后的解析代码
直接用实际的输出名称dense_2解析结果:
prediction = json_response.json()['dense_2'][0] print(prediction)
内容的提问来源于stack exchange,提问作者parabolic_boomerang
相关产品推荐
相关产品推荐

