You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署TensorFlow Serving模型返回404,模型信息缺失

解决方案

一、先解决404错误(核心问题)

你的REST请求路径缺少v1前缀,这是TensorFlow Serving REST API的必填部分,直接导致了404。同时还要确认Docker挂载配置是否正确:

  1. 修正请求URL
    将请求地址从:

    'http://localhost:8501/models/model_name:predict'
    

    修改为:

    'http://localhost:8501/v1/models/model_name:predict'
    
  2. 验证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。

  3. 检查模型加载状态
    用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:47:49