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

将TensorFlow模型部署到SageMaker端点时遇SavedModel未找到错误求助

解决SageMaker部署TensorFlow模型时的「no SavedModel bundles found」错误

问题根源

  1. 模型格式不匹配:你持有的generic_graph.pb是TensorFlow冻结图格式,但SageMaker的TensorFlowModel组件默认要求标准SavedModel格式(必须包含saved_model.pb和对应variables目录结构),直接重命名冻结图无法替代标准SavedModel文件。
  2. 目录结构错误:SageMaker对SavedModel的目录层级有严格要求,你当前的打包结构不仅缺少SavedModel必需的变量文件,还错误地将labels.txt放入variables目录,导致组件无法识别有效模型包。
  3. 版本兼容性风险:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:42:32