在AWS SageMaker部署TF2.1模型后Ping健康检查失败问题排查
这个问题我之前也碰到过,核心原因就是SageMaker的TensorFlow Serving容器对模型打包结构有严格规范,再加上代码里没指定正确的模型名称,导致容器找不到要加载的模型。
问题根源
从CloudWatch的错误日志 Could not find any versions of model None 就能直接定位:SageMaker的TF Serving容器在尝试加载一个名为None的模型,但你的模型打包结构或者代码配置没提供正确的模型名称。
SageMaker TF Serving容器要求模型包的结构必须是双层目录:
model.tar.gz └── {MODEL_NAME} # 自定义的模型名称,比如my_model └── {VERSION_NUMBER} # 必须是整数版本号,比如1 ├── saved_model.pb ├── assets/ └── variables/
你大概率是直接把saved_model.pb、assets、variables放在了model.tar.gz的根目录,或者代码里没指定model_name参数,容器默认用None作为模型名称去查找,自然找不到对应的模型文件。
至于本地测试正常,是因为你可能直接给TF Serving指定了包含saved_model.pb的目录,不需要额外的层级结构,但SageMaker容器有自己的运行规范,必须遵循这个目录要求。
解决方案
1. 重新打包模型
先调整模型的文件夹结构:
- 创建一个自定义名称的文件夹(比如
my_model) - 在这个文件夹下创建一个整数命名的版本文件夹(比如
1) - 把
saved_model.pb、assets、variables全部移动到版本文件夹里
最终结构应该是:
my_model/ └── 1/ ├── saved_model.pb ├── assets/ └── variables/
然后重新打包成model.tar.gz:
tar -czvf model.tar.gz my_model/
2. 修改代码,指定模型名称
在创建Model对象时,添加model_name参数,值要和你刚才打包的顶级文件夹名称完全一致(比如my_model):
实时端点代码修改:
tensorflow_serving_model = Model( model_data=model_data, role=role, sagemaker_session=sagemaker_session, image=image, framework_version='2.1', model_name='my_model' # 新增这一行,和tar包里的顶级文件夹名匹配 )
批量转换代码修改:
tensorflow_serving_model = Model( model_data=model_data, role=role, sagemaker_session=sagemaker_session, image=image, name='deep-net-0', framework_version='2.1', model_name='my_model' # 新增这一行 )
3. 重新部署任务
上传修改后的model.tar.gz到S3,再重新运行部署端点或批量转换的代码,这时SageMaker容器就能正确识别并加载模型,顺利通过健康检查了。
内容的提问来源于stack exchange,提问作者Doctor_Fu

