Docker部署TensorFlow Serving失败的问题求助
首先,从报错信息能明确看出核心问题:TensorFlow Serving在/models/simple_cnn_model/1路径下找不到saved_model.pb文件,这和你的本地模型目录结构、Docker挂载配置都有关系,下面拆解问题并给出修复步骤:
1. 本地模型目录结构不符合TensorFlow Serving要求
TensorFlow Serving对模型目录有严格要求:必须是模型名称目录 → 版本号目录 → 模型核心文件的层级结构,标准格式如下:
<本地模型根目录>/ <MODEL_NAME>/ <版本号(比如1)>/ saved_model.pb variables/ variables.data-00000-of-00001 variables.index assets/
而你的目录结构是把saved_model.pb、variables、assets直接放在了savedmodel根目录,和1目录同级——这就导致容器内/models/simple_cnn_model/1是空的,自然找不到模型文件。
2. 错误覆盖了系统默认的PATH环境变量
在PowerShell中,PATH是系统自带的环境变量,用来存储可执行文件的搜索路径,你直接覆盖它不仅会导致系统命令无法正常执行,也不是定义自定义路径的正确姿势。
修复步骤
步骤1:调整本地模型目录结构
把所有模型核心文件(saved_model.pb、variables、assets)移动到1目录下,调整后的结构应该是:
savedmodel/ 1/ saved_model.pb variables/ variables.data-00000-of-00001 variables.index assets/
如果想更规范,也可以给模型套一层名称目录(推荐):
savedmodel/ simple_cnn_model/ 1/ saved_model.pb variables/ assets/
步骤2:使用自定义环境变量替代PATH
在PowerShell中定义专属变量,避免干扰系统变量:
# 对应第一种目录结构(savedmodel下直接是版本目录1) set-variable -name "MODEL_PATH" -value "D:\Other\tf-serving-example\savedmodel" # 对应规范目录结构(savedmodel下有simple_cnn_model目录) set-variable -name "MODEL_PATH" -value "D:\Other\tf-serving-example\savedmodel\simple_cnn_model"
步骤3:修改Docker启动命令
根据你调整后的目录结构选择对应命令:
对应第一种目录结构:
挂载MODEL_PATH到/models/simple_cnn_model,让容器内/models/simple_cnn_model/1成为有效版本目录:
docker run -p 8501:8501 --mount type=bind,source=$MODEL_PATH,target=/models/simple_cnn_model -e MODEL_NAME=simple_cnn_model -t tensorflow/serving
对应规范目录结构:
直接挂载到/models,TensorFlow Serving会自动在/models下查找MODEL_NAME对应的目录:
docker run -p 8501:8501 --mount type=bind,source=$MODEL_PATH,target=/models/simple_cnn_model -e MODEL_NAME=simple_cnn_model -t tensorflow/serving
或者更简洁的写法:
docker run -p 8501:8501 --mount type=bind,source="D:\Other\tf-serving-example\savedmodel",target=/models -e MODEL_NAME=simple_cnn_model -t tensorflow/serving
验证部署是否成功
容器启动后,用PowerShell发送HTTP请求验证:
Invoke-RestMethod http://localhost:8501/v1/models/simple_cnn_model
如果返回包含模型版本信息的JSON响应,说明部署成功。
内容的提问来源于stack exchange,提问作者Vlad Timofeev

