
# 训练作业日志中提示"No such file or directory"
#### 问题现象
训练作业运行失败，日志中提示"No such file or directory"。
例如：找不到训练输入的数据路径时，会提示"No such file or directory"。
例如：找不到训练启动文件时，也会提示"No such file or directory"。
#### 原因分析
- 找不到训练输入数据路径，可能是报错的路径填写不正确。用户请按照以下思路进行逐步排查：
  1. [检查报错的路径是否为OBS路径]
  
  2. [检查报错的路径是否存在]
   
- 找不到启动文件，可能是训练作业启动命令的路径填写不正确，参考[使用自定义镜像创建训练作业时，检查启动文件路径]排查解决。
- 可能为多个进程或者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}/。
如果报错路径为训练数据路径，需要在以下两个地方完成适配，具体适配方法请参考自定义算法适配章节的[训练配置](https://support.huaweicloud.com/develop-modelarts/develop-modelarts-0006.html#section8)：
1. 在创建算法时，您需要在输入路径配置中设置[代码路径参数](https://support.huaweicloud.com/develop-modelarts/develop-modelarts-0003.html)，默认为"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开发环境调试训练代码，避免代码迁移过程中的错误。
- 直接使用线上notebook环境调试请参考[使用JupyterLab开发模型](https://support.huaweicloud.com/devtool-modelarts/devtool-modelarts_0012.html)。
- 配置本地IDE（Pycharm或者VSCode）连接云上环境调试请参考[使用本地IDE开发模型](https://support.huaweicloud.com/devtool-modelarts/devtool-modelarts_0019.html)。
 
