torchrun启动分布式训练

yangzilong 发表于 2022/02/11 14:54:43 2022/02/11
【摘要】 并行训练是一种重要的训练形式,本文介绍如何通过pytorch启动多节点并行训练任务。

训练v1启动方式

基于客户镜像,需要额外安装几个包:

  1. apt-get install wget --不挂载sfs的话,需要用wget从obs上获取启动脚本

  2. apt-get install iputils-ping --为了训练v1域名能解析到ip

  3. 解决shell运行时报错 [: : unexpected operator** --输入dpkg-reconfigure dash 后选择no

#!/bin/sh
# 解析ip, only executed on 0 node
if [ $DLS_TASK_INDEX -eq 0 ]; then
    for ((i=0; i<$DLS_TASK_NUMBER; i++))
    do
        if [[ "$DLS_TASK_NUMBER" == "1" ]]
        then
            eval hostname=\$BATCH_CURRENT_HOST
        else
            eval hostname=\$BATCH_CUSTOM${i}_HOSTS
        fi
        host_arr=(${hostname//:/ })
        echo "[Modelarts Service Log]host_arr ${host_arr[*]}"
        ip=""
        while [ -z "$ip" ]; do
            ip=$(ping -c 1 ${host_arr[0]} | grep "PING" | sed -E 's/PING .* .([0-9.]+). .*/\1/g')
            echo "[Modelarts Service Log]current ip ${ip}"
        done
    done
fi

export NCCL_DEBUG=INFO

if [ $DLS_TASK_NUMBER == 1 ]; then
    MASTER_ADDR=localhost
    MASTER_PORT=6000
    NNODES=1
    NODE_RANK=0
else
    MASTER_PORT="6060"
    MASTER_HOST="$BATCH_CUSTOM0_HOSTS"
    MASTER_ADDR="${MASTER_HOST%%:*}"
    #MASTER_PORT="${MASTER_HOST##*:}"
    NNODES="$DLS_TASK_NUMBER"
    NODE_RANK="$DLS_TASK_INDEX"
	JOB_ID="1234"
fi

if [ $NODE_RANK == 0 ]
then
    EXT_ARGS="--rdzv_conf=is_host=1"
else
    EXT_ARGS=""
fi

echo `date`
CMD="torchrun --nnodes=$NNODES --node_rank=$NODE_RANK --nproc_per_node=8 $EXT_ARGS --rdzv_id=$JOB_ID --rdzv_backend=c10d --rdzv_endpoint=$MASTER_ADDR:$MASTER_PORT test.py"
echo $CMD
$CMD

新版训练启动方式

新版训练开启容错模式后,自动检查域名解析ip是否正常,故不需要额外添加解析ip的代码,只需要替换对应环境变量,获取分布式任务所需的启动参数

shell启动脚本

#!/bin/bash
if [[ $MA_NUM_HOSTS == 1 ]]; then
    MASTER_ADDR=localhost
    MASTER_PORT=6000
    NNODES=1
    NODE_RANK=0
else
    MASTER_HOST="$VC_WORKER_HOSTS"
    MASTER_ADDR="${VC_WORKER_HOSTS%%,*}"
    MASTER_PORT="6060"
    NNODES="$MA_NUM_HOSTS"
    NODE_RANK="$VC_TASK_INDEX"
	JOB_ID="1234"
fi

if [[ $NODE_RANK == 0 ]]; then
    EXT_ARGS="--rdzv_conf=is_host=1"
else
    EXT_ARGS=""
fi

CMD="python -m torch.distributed.run --nnodes=$NNODES --node_rank=$NODE_RANK $EXT_ARGS --nproc_per_node=8 --rdzv_id=$JOB_ID --rdzv_backend=c10d --rdzv_endpoint=$MASTER_ADDR:$MASTER_PORT  /home/ma-user/modelarts/user-job-dir/code/test.py"
echo $CMD
$CMD
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。