华为云AI开发平台ModelArts日志提示”Permission denied”_云淘科技

问题现象

训练作业访问挂载的EFS,或者是执行.sh启动脚本时,出现如下错误:

[Errno 13]Permission denied: ‘/xxx/xxxx’

图1 错误日志

bash: /bin/ln: Permission denied
自定义镜像中,bash:/home/ma-user/.pip/pip.conf:Permission Denied
自定义镜像中,tee: /xxx/xxxx: Permission denied cp: cannot stat ”: No such file or directory

原因分析

出现该问题的可能原因如下:

[Errno 13]Permission denied: ‘/xxx/xxxx’

上传数据时文件所属与文件权限未修改,导致训练作业以work用户组访问时没有权限了。
在代码目录中的.sh拷贝到容器之后,需要添加“x”可执行权限。

bash: /bin/ln: Permission denied

因安全问题,不支持用户开通使用In命令。

bash:/home/ma-user/.pip/pip.conf:Permission Denied

因从V1切换到V2时,ma-user的uid仍是1102未改变导致。

tee: /xxx/xxxx: Permission denied cp: cannot stat ”: No such file or directory

可能原因是用户使用的启动脚本为旧版本的run_train.sh,脚本里面有某些环境变量在新版本下发的作业中并不存在这些环境变量导致。

可能原因是使用Python file接口并发读写同一文件。

处理方法

对挂载盘的数据加权限,可以改为与训练容器内相同的用户组(1000),假如/nas盘是挂载路径,执行如下代码。

chown -R 1000:1000 /nas 
或者
chmod 777 -R /nas

如果是自定义镜像中拉取的.sh脚本没有执行权限,可以在自定义脚本启动前执行”chmod +x xxx.sh”添加可执行权限。
ModelArts 控制台上创建训练作业自定义镜像入口,默认以1000 uid用户来启动v2容器镜像,将ma-user的uid从1102改为1000,改变方式如下(假若需要sudo权限,可取消sudoers行的注释):

v1训练作业环境变量迁移v2说明:

v1的DLS_TASK_NUMBER环境变量,可以使用v2的MA_NUM_HOSTS环境变量替换,即选择的训练节点数。
v1的DLS_TASK_INDEX环境变量,当前可以使用v2的VC_TASK_INDEX环境变量替换,下一步使用MA_TASK_INDEX替换,建议使用demo script中的方式获取,以保证兼容性。
v1的BATCH_CUSTOM0_HOSTS环境变量,可以使用v2的${MA_VJ_NAME}-${MA_TASK_NAME}-0.${MA_VJ_NAME}:6666替换。
一般而言,v1的BATCH_CUSTOM{N}_HOSTS环境变量,可以使用v2的${MA_VJ_NAME}-${MA_TASK_NAME}-{N}.${MA_VJ_NAME}:6666替换。

分析代码中是否存在并发读写同一文件的逻辑,如有则进行修改。

如用户使用多卡的作业,那么可能每张卡都会有同样的读写数据的代码,可参考如下代码修改。

import moxing as mox
from mindspore.communication import init, get_rank, get_group_size
init()
rank_id = get_rank()
# 仅让0号卡进行数据下载
if rank_id % 8 == 0:
    mox.file.copy_parallel('obs://bucket-name/dir1/dir2/', '/cache')

建议与总结

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

直接使用线上notebook环境调试请参考使用JupyterLab开发模型。
配置本地IDE(Pycharm或者VSCode)联接云上环境调试请参考使用本地IDE开发模型。

父主题: 权限问题

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家