SageMaker自定义容器部署TensorFlow Keras模型触发模型保存权限错误
问题根因
这个报错是Amazon SageMaker训练、推理两个阶段的目录挂载权限差异导致的:训练阶段/opt/ml/model为可写路径,专供训练任务输出模型产物;但推理部署阶段该路径为只读挂载,任何写入操作都会触发权限报错。你遇到这个问题的核心原因是把训练阶段才需要执行的model.save逻辑放到了推理服务的启动执行路径里。
排查步骤
- 检查自定义容器的入口脚本(Dockerfile中
ENTRYPOINT、CMD指定的执行文件),确认model.save代码的执行触发条件:仅允许在训练流程中执行,禁止出现在推理服务的初始化、请求处理逻辑中。 - 检查
Estimator的输出配置,确认训练任务结束后模型产物已经正常上传到关联的S3存储路径,部署时是从S3拉取已生成的模型加载运行,不是触发重新训练逻辑。 - 可以在推理报错的容器中执行
mount | grep /opt/ml/model命令,验证该路径的只读挂载属性。
解决方案
- 拆分训练、推理逻辑,仅在训练阶段执行模型保存操作
如果是用同一个脚本同时处理训练、推理两类任务,通过SageMaker内置环境变量做执行路径分流,示例代码如下:
import os from tensorflow.keras.models import load_model # 训练阶段执行逻辑 if "SM_TRAINING_ENV" in os.environ: # 训练流程代码省略 model.save("/opt/ml/model") # 推理阶段执行逻辑 else: # 仅加载模型,不执行保存操作 model = load_model("/opt/ml/model")
- 如果推理阶段确实有临时文件写入需求,不要写入
/opt/ml/model路径,改为写入容器内的/tmp目录,该路径在推理阶段默认是可写的。 - 不要在自定义容器的Dockerfile中手动修改
/opt/ml/model的目录权限,该路径的挂载权限由SageMaker在不同阶段自动配置,手动修改不会生效。
内容的提问来源于stack exchange,提问作者Klimentina Djeparoska
相关产品推荐
相关产品推荐

