将TensorFlow模型部署到SageMaker端点时遇SavedModel未找到错误求助
解决SageMaker部署TensorFlow模型时的「no SavedModel bundles found」错误
问题根源
- 模型格式不匹配:你持有的
generic_graph.pb是TensorFlow冻结图格式,但SageMaker的TensorFlowModel组件默认要求标准SavedModel格式(必须包含saved_model.pb和对应variables目录结构),直接重命名冻结图无法替代标准SavedModel文件。 - 目录结构错误:SageMaker对SavedModel的目录层级有严格要求,你当前的打包结构不仅缺少SavedModel必需的变量文件,还错误地将
labels.txt放入variables目录,导致组件无法识别有效模型包。 - 版本兼容性风险:使用TensorFlow 2.3.0部署时,若模型是用TF1.x导出的非标准SavedModel,也可能触发识别失败。
具体解决步骤
1. 将冻结图转换为标准SavedModel
如果只有generic_graph.pb,需先将其转换为SageMaker支持的SavedModel格式,执行以下代码:
import tensorflow as tf # 加载冻结图文件 with tf.io.gfile.GFile('generic_graph.pb', 'rb') as f: graph_def = tf.compat.v1.GraphDef() graph_def.ParseFromString(f.read()) # 重置默认图并导入冻结图 tf.compat.v1.reset_default_graph() tf.import_graph_def(graph_def, name='') # 导出标准SavedModel export_dir = './model/1' with tf.compat.v1.Session() as sess: # 替换为你模型实际的输入、输出节点名称 tf.compat.v1.saved_model.simple_save( sess, export_dir, inputs={'input': tf.compat.v1.get_default_graph().get_tensor_by_name('INPUT_NODE_NAME:0')}, outputs={'output': tf.compat.v1.get_default_graph().get_tensor_by_name('OUTPUT_NODE_NAME:0')} )
提示:可通过
tf.compat.v1.get_default_graph().get_operations()命令查看模型的输入输出节点名称。
2. 正确打包model.tar.gz
- 整理后的目录结构需符合如下要求:
model.tar.gz └── model └── 1 ├── saved_model.pb ├── variables/ │ ├── variables.data-00000-of-00001 │ └── variables.index └── labels.txt - 在
model目录的上级目录执行打包命令,避免引入多余层级:tar -czvf model.tar.gz model/
3. 验证打包文件
上传至S3前,本地解压model.tar.gz,确认model/1/saved_model.pb存在,且variables目录下有完整的变量文件。
4. 调整部署代码(可选)
如果模型是基于TF1.x导出的,部署时可添加兼容参数:
sagemaker_session = sagemaker.Session() role = 'my-role' model = TensorFlowModel(model_data='s3://my-bucket/model.tar.gz', role=role, framework_version='2.3.0', model_server_workers=1) predictor = model.deploy(initial_instance_count=1, instance_type='ml.m5.large')
额外排查点
- 确认S3路径
's3://my-bucket/model.tar.gz'真实存在,且SageMaker角色拥有该存储桶的读取权限。 - 查看CloudWatch日志的完整输出,确认SageMaker查找SavedModel的路径是否与你的打包结构匹配。
内容的提问来源于stack exchange,提问作者Malachi Erskine
相关产品推荐
相关产品推荐

