更新时间:2024-10-30 GMT+08:00

日志提示"Permission denied"

问题现象

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

  • OSError: [Errno 13]Permission denied: '/xxx/xxxx'
  • 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接口并发读写同一文件。

处理方法

  1. 对挂载盘的数据加权限,可以改为与训练容器内相同的用户组(1000),假如/nas盘是挂载路径,执行如下代码。
    chown -R 1000:1000 /nas 
    或者
    chmod 777 -R /nas
  2. 如果是自定义镜像中拉取的.sh脚本没有执行权限,可以在自定义脚本启动前执行"chmod +x xxx.sh"添加可执行权限。
  3. ModelArts控制台上创建训练作业自定义镜像入口,默认以1000 uid用户来启动v2容器镜像,将ma-user的uid从1102改为1000,改变方式如下(假若需要sudo权限,可取消sudoers行的注释):

  4. 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替换。
  5. 分析代码中是否存在并发读写同一文件的逻辑,如有则进行修改。

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

    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开发环境调试训练代码,避免代码迁移过程中的错误。