SageMaker模型部署报错:/opt/ml/model只读文件系统OSError
SageMaker部署自定义模型报错Read-only file system的解决方案
问题重现
执行部署代码时抛出只读文件系统错误:
部署代码:
predictor = model.deploy(1, instance_type='ml.t2.medium', serializer=csv_serializer)错误信息:
OSError: [Errno 30] Read-only file system,报错路径指向/opt/ml/model
已尝试的无效操作:修改目录权限、调整模型输出路径、更换不同规格实例、遵循官方自定义容器教程、尝试Stack Overflow相关方案。
核心原因
- 容器入口配置错误:Dockerfile中固定设置
ENTRYPOINT ["python3", "/opt/ml/train.py"],导致部署阶段容器仍执行训练脚本。而SageMaker部署时会将/opt/ml/model挂载为只读目录,训练脚本若尝试写入该路径则触发错误。 - 误用环境变量:错误设置了PyTorch官方容器的
SAGEMAKER_SUBMIT_DIRECTORY变量,但当前是基于Ubuntu的自定义容器,该变量不适用。 - 代码目录不符合SageMaker规范:将代码直接复制到
/opt/ml/根目录,与SageMaker挂载的模型目录冲突。
解决方案
1. 修改Dockerfile,适配SageMaker自定义容器规范
更新后的Dockerfile如下:
FROM ubuntu:18.04 MAINTAINER Amazon AI <sage-learner@amazon.com> ARG REGION=us-west-2 RUN apt-get -y update && apt-get install -y --no-install-recommends \ wget \ python3-pip \ python3-setuptools \ nginx \ ca-certificates \ && rm -rf /var/lib/apt/lists/* # 添加sagemaker-containers包,用于自动区分训练/部署阶段 RUN pip3 install numpy pandas flask gunicorn sagemaker-containers ENV PYTHONUNBUFFERED=TRUE ENV PYTHONDONTWRITEBYTECODE=TRUE ENV PATH="/opt/ml:${PATH}" # 将代码复制到SageMaker自定义容器标准代码目录 COPY model-1 /opt/ml/code/ WORKDIR /opt/ml/code/ # 设置自定义容器环境变量,指定代码目录和入口脚本 ENV SAGEMAKER_CODE_DIR /opt/ml/code ENV SAGEMAKER_PROGRAM train.py # 使用sagemaker-containers的CLI自动处理训练/部署逻辑 ENTRYPOINT ["python3", "-m", "sagemaker_containers.cli"]
2. 确保serve脚本配置正确
- 确认
serve脚本位于/opt/ml/code目录下,脚本内容需实现推理服务启动逻辑(如启动Flask/Gunicorn并加载/opt/ml/model中的模型文件)。 - 保留build脚本中对
serve的权限设置:chmod +x model-1/serve
3. 调整训练脚本的模型输出路径
在train.py中,将训练好的模型保存到/opt/ml/model目录(SageMaker训练阶段的标准模型输出路径),示例代码片段:
import pickle import os model_output_path = os.environ.get('SM_MODEL_DIR', '/opt/ml/model') with open(os.path.join(model_output_path, 'model.pkl'), 'wb') as f: pickle.dump(trained_model, f)
4. 重新构建并推送容器
执行build_and_push.sh脚本,将更新后的镜像推送到ECR仓库,之后重新执行部署操作。
内容的提问来源于stack exchange,提问作者priya khokher
相关产品推荐
相关产品推荐

