执行SageMaker PyTorch Estimator时报错:No such file or directory: 'train'
SageMaker本地模式训练找不到'train'文件排查方案
核心问题梳理
你用SageMaker本地模式训练时,指定了file://data/train作为输入路径(本地确实存在该目录),但进程报错找不到'train'文件,结合你的代码和Dockerfile,从以下几个方向排查:
1. 确认代码执行的工作目录与路径映射
file://data/train是相对路径,必须保证你运行Python代码时的当前工作目录下确实存在data/train文件夹。可以在代码开头加一行调试代码确认:import os print("当前工作目录:", os.getcwd()) print("本地data/train是否存在:", os.path.exists("data/train"))- 若相对路径容易出错,直接换成绝对路径测试,比如
file:///home/your_username/data/train(替换成你的实际绝对路径)。
2. 镜像用错了!推理镜像不能用于训练
你Dockerfile里用的是pytorch-inference镜像,这是专门用于模型推理的镜像,缺少SageMaker训练容器的核心逻辑(比如数据挂载、训练环境变量注入)。必须换成训练镜像:
修改Dockerfile的第一行:
# 替换成对应版本的训练镜像 FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:2.5.1-cpu-py311-ubuntu22.04-sagemaker
3. 检查train.py的数据读取逻辑是否正确
SageMaker本地模式会把你指定的inputs路径,自动挂载到容器内的/opt/ml/input/data/training目录,同时会通过环境变量SM_CHANNEL_TRAINING传递这个路径。你的train.py必须读取这个路径下的数据,而不是当前工作目录:
正确的读取逻辑示例:
import os # 获取训练数据目录,兼容SageMaker环境和本地调试 train_data_dir = os.environ.get("SM_CHANNEL_TRAINING", "./data/train") # 示例:读取目录下的文件 print("容器内训练数据目录内容:", os.listdir(train_data_dir))
如果你的train.py里直接写死读取当前目录下的'train'文件/文件夹,必然找不到,因为容器的工作目录是/opt/ml/code,数据在/opt/ml/input/data/training。
4. 手动验证容器内的挂载情况
可以临时修改Dockerfile的CMD,让容器启动后不执行训练,而是停留在bash:
CMD ["bash", "-c", "ls -la /opt/ml/input/data/training && sleep 3600"]
重新构建镜像后启动训练,然后用docker ps找到容器ID,执行docker exec -it <容器ID> bash进入容器,查看/opt/ml/input/data/training下是否有数据,确认挂载是否正常。
内容的提问来源于stack exchange,提问作者Samlex
相关产品推荐
相关产品推荐

