AI开发平台MODELARTS-在ModelArts Standard上运行GPU多机多卡训练作业:上传算法到SFS

时间:2024-12-17 18:07:05

上传算法到SFS

  1. 下载Swin-Transformer代码。
    git clone --recursive https://github.com/microsoft/Swin-Transformer.git
  2. 修改lr_scheduler.py文件,把第27行:t_mul=1. 注释掉。
  3. 修改data文件夹下imagenet22k_dataset.py,把第28行:print("ERROR IMG LOADED: ", path) 注释掉。
  4. 修改data文件夹下的build.py文件,把第112行:prefix = 'ILSVRC2011fall_whole',改为prefix = 'ILSVRC2021winner21k_whole'。
  5. 在Swin-Transformer目录下创建requirements.txt指定python依赖库:
    # requirements.txt内容如下
    
    timm==0.4.12
    termcolor==1.1.0
    yacs==0.1.8
  6. 准备run.sh文件中所需要的obs文件路径。
    1. 准备imagenet数据集的分享链接

      勾选要分享的imagenet21k_whole数据集文件夹,单击分享按钮,选择分享链接有效期,自定义提取码,例如123456,单击“复制链接”,记录该链接。

    2. 准备obsutil_linux_amd64.tar.gz的分享链接

      单击此处下载obsutil_linux_amd64.tar.gz,将其上传至OBS桶中,设置为公共读。单击属性,单击复制链接。

      链接样例如下:

      https://${bucketname_name}.obs.cn-north-4.myhuaweicloud.com/${folders_name}/pytorch.tar.gz
  7. 在Swin-Transformer目录下,创建运行脚本run.sh。
    • 脚本中的"SRC_DATA_PATH=${imagenet数据集在obs中分享链接}",需要替换为上一步中的imagenet21k_whole文件夹分享链接。
    • 脚本中的"https://${bucket_name}.obs.cn-north-4.myhuaweicloud.com/${folder_name}/obsutil_linux_amd64.tar.gz",需要替换为上一步中obsutil_linux_amd64.tar.gz在OBS上的路径(需将文件设置为公共读)。

    单机单卡运行脚本:

    # 在代码主目录下创建一个run.sh,内容如下
    
    #!/bin/bash
    
    # 从obs中下载数据到本地SSD盘
    DIS_DATA_PATH=/cache
    SRC_DATA_PATH=${imagenet数据集在obs中分享链接}
    OBSUTIL_PATH=https://${bucket_name}.obs.cn-north-4.myhuaweicloud.com/${folder_name}/obsutil_linux_amd64.tar.gz
    mkdir -p $DIS_DATA_PATH && cd $DIS_DATA_PATH && wget $OBSUTIL_PATH && tar -xzvf obsutil_linux_amd64.tar.gz && $DIS_DATA_PATH/obsutil_linux_amd64*/obsutil share-cp $SRC_DATA_PATH $DIS_DATA_PATH/ -ac=123456 -r -f -j 256 && cd -
    
    IMAGE_DATA_PATH=$DIS_DATA_PATH/imagenet21k_whole
    MASTER_PORT="6061"
    
    /home/ma-user/anaconda3/envs/pytorch/bin/python -m torch.distributed.launch --nproc_per_node=1 --master_addr localhost --master_port=$MASTER_PORT main.py --data-path $IMAGE_DATA_PATH --cfg ./configs/swin/swin_base_patch4_window7_224_22k.yaml --local_rank 0

    多机多卡运行脚本:

    # 创建run.sh
    
    #!/bin/bash
    
    # 从obs中下载数据到本地SSD盘
    DIS_DATA_PATH=/cache
    SRC_DATA_PATH=${imagenet数据集在obs中分享链接}
    OBSUTIL_PATH=https://${bucket_name}.obs.cn-north-4.myhuaweicloud.com/${folder_name}/obsutil_linux_amd64.tar.gz
    mkdir -p $DIS_DATA_PATH && cd $DIS_DATA_PATH && wget $OBSUTIL_PATH && tar -xzvf obsutil_linux_amd64.tar.gz && $DIS_DATA_PATH/obsutil_linux_amd64*/obsutil share-cp $SRC_DATA_PATH $DIS_DATA_PATH/ -ac=123456 -r -f -j 256 && cd -
    IMAGE_DATA_PATH=$DIS_DATA_PATH/imagenet21k_whole
    MASTER_ADDR=$(echo ${VC_WORKER_HOSTS} | cut -d "," -f 1)
    
    MASTER_PORT="6060"
    NNODES="$VC_WORKER_NUM"
    NODE_RANK="$VC_TASK_INDEX"
    NGPUS_PER_NODE="$MA_NUM_GPUS"
    
    /home/ma-user/anaconda3/envs/pytorch/bin/python -m torch.distributed.launch --nnodes=$NNODES --node_rank=$NODE_RANK --nproc_per_node=$NGPUS_PER_NODE --master_addr $MASTER_ADDR --master_port=$MASTER_PORT main.py --data-path $IMAGE_DATA_PATH --cfg ./configs/swin/swin_base_patch4_window7_224_22k.yaml
    • 推荐先使用单机单卡运行脚本,待正常运行后再改用多机多卡运行脚本。
    • 多机多卡run.sh中的“VC_WORKER_HOSTS”“VC_WORKER_NUM”“VC_TASK_INDEX”“MA_NUM_GPUS”为ModelArts训练容器中预置的环境变量。训练容器环境变量详细介绍可参考查看训练容器环境变量
  8. 通过obsutils,将代码文件夹放到OBS上,然后通过OBS将代码传至SFS相应目录中。
  9. 在SFS中将代码文件Swin-Transformer-main设置归属为ma-user。
    chown -R ma-user:ma-group Swin-Transformer
  10. 执行以下命令,去除Shell脚本的\r字符。
    cd Swin-Transformer
    sed -i 's/\r//' run.sh

    Shell脚本在Windows系统编写时,每行结尾是\r\n,而在Linux系统中行每行结尾是\n,所以在Linux系统中运行脚本时,会认为\r是一个字符,导致运行报错“$'\r': command not found”,因此需要去除Shell脚本的\r字符。

support.huaweicloud.com/bestpractice-modelarts/modelarts_20_2040.html