训练作业日志中提示“No such file or directory”
问题现象
训练作业运行失败,日志中提示“No such file or directory”。
例如:找不到训练输入的数据路径时,会提示“No such file or directory”。
例如:找不到训练启动文件时,也会提示“No such file or directory”。
原因分析
- 找不到训练输入数据路径,可能是报错的路径填写不正确。用户请按照以下思路进行逐步排查:
- 找不到启动文件,可能是训练作业启动命令的路径填写不正确,参考使用自定义镜像创建训练作业时,检查启动文件路径排查解决。
- 可能为多个进程或者worker读写同一个文件。如果使用了SFS,则考虑是否多个节点同时写同一个文件。分析代码中是否存在多进程写同一文件的情况。建议避免作业中存在多进程,多节点并发读写同一文件的情况。
检查报错的路径是否为OBS路径
使用ModelArts时,用户数据需要存放在自己OBS桶中,但是训练代码运行过程中不能使用OBS路径读取数据。
原因:
训练作业创建成功后,由于在运行容器直连OBS服务进行训练性能很差,系统会自动下载训练数据至运行容器的本地路径。所以,在训练代码中直接使用OBS路径会报错。例如训练代码的OBS路径为obs://bucket-A/training/,训练代码会被自动下载至${MA_JOB_DIR}/training/。
假设训练代码的OBS目录为obs://bucket-A/XXX/{training-project}/,“{training-project}”是存放训练代码的文件夹名称。训练时会自动下载OBS中{training-project}目录下的数据到训练容器的本地路径$MA_JOB_DIR/{training-project}/。
如果报错路径为训练数据路径,需要在以下两个地方完成适配,具体适配方法请参考自定义算法适配章节的输入输出配置部分:
- 在创建算法时,您需要在输入路径配置中设置代码路径参数,默认为“data_url”。
- 您需要在训练代码中添加超参,默认为“data_url”。使用“data_url”当做训练数据输入的本地路径。
检查报错的路径是否存在
由于用户本地开发的代码需要上传至ModelArts后台,训练代码中涉及到依赖文件的路径时,用户设置有误的场景较多。
推荐通用的解决方案:使用os接口得到依赖文件的绝对路径,避免报错。
示例:
|---project_root #代码根目录 |---BootfileDirectory #启动文件所在的目录 |---bootfile.py #启动文件 |---otherfileDirectory #其他依赖文件所在的目录 |---otherfile.py #其他依赖文件
在启动文件中,建议用户参考以下方式获取依赖文件所在路径,即示例中的otherfile_path。
import os current_path = os.path.dirname(os.path.realpath(__file__)) # BootfileDirectory, 启动文件所在的目录 project_root = os.path.dirname(current_path) # 工程的根目录,对应ModelArts训练控制台上设置的代码目录 otherfile_path = os.path.join(project_root, "otherfileDirectory", "otherfile.py")
使用自定义镜像创建训练作业时,检查启动文件路径
以OBS路径“obs://obs-bucket/training-test/demo-code”为例,训练代码会被自动下载至训练容器的“${MA_JOB_DIR}/demo-code”目录中,demo-code为OBS存放代码路径的最后一级目录,可以根据实际修改。
使用自定义镜像创建训练作业时,在代码目录下载完成后,镜像的启动命令会被自动执行。启动命令的填写规范如下:
- 如果训练启动脚本用的是py文件,例如train.py,运行命令可以写为python ${MA_JOB_DIR}/demo-code/train.py。
- 如果训练启动脚本用的是sh文件,例如main.sh,运行命令可以写为bash ${MA_JOB_DIR}/demo-code/main.sh。
其中demo-code为OBS存放代码路径的最后一级目录,可以根据实际修改。
建议与总结
- 直接使用线上notebook环境调试请参考使用JupyterLab开发模型。
- 配置本地IDE(Pycharm或者VSCode)联接云上环境调试请参考使用本地IDE(VS Code)开发模型。