文档首页/ AI开发平台ModelArts/ 故障排除/ 训练作业/ 云上迁移适配故障/ 训练作业日志中提示“No such file or directory”
更新时间:2024-10-30 GMT+08:00

训练作业日志中提示“No such file or directory”

问题现象

训练作业运行失败,日志中提示“No such file or directory”。

例如:找不到训练输入的数据路径时,会提示“No such file or directory”。

例如:找不到训练启动文件时,也会提示“No such file or directory”。

原因分析

检查报错的路径是否为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}/。

如果报错路径为训练数据路径,需要在以下两个地方完成适配,具体适配方法请参考自定义算法适配章节的输入输出配置部分

  1. 在创建算法时,您需要在输入路径配置中设置代码路径参数,默认为“data_url”
  2. 您需要在训练代码中添加超参,默认为“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存放代码路径的最后一级目录,可以根据实际修改。

建议与总结

在创建训练作业前,推荐您先使用ModelArts开发环境调试训练代码,避免代码迁移过程中的错误。