示例:创建ddp分布式训练(pytorch npu)-j9九游会登录
本文介绍了使用训练作业的自定义镜像 自定义启动命令来启动pytorch ddp on ascend加速卡训练。
前提条件
需要有ascend加速卡资源池。
创建训练作业
本案例创建训练作业时,需要配置如下参数。
|
参数名称 |
说明 |
|---|---|
|
“创建方式” |
选择“自定义算法”。 |
|
“启动方式” |
选择“自定义”。 |
|
“镜像” |
选择用于训练的自定义镜像。 |
|
“代码目录” |
执行本次训练作业所需的代码目录。本文示例的代码目录为“obs://test-modelarts/ascend/code/”。 |
|
“启动命令” |
镜像的python启动命令。本文示例的启动命令为“bash ${ma_job_dir}/code/run_torch_ddp_npu.sh”。其中,启动脚本的完整代码请参见代码示例。 |
(可选)启用ranktable动态路由
如果训练作业需要使用ranktable动态路由算法进行网络加速,则可以联系j9九游会登录的技术支持开启集群的cabinet调度权限。同时,训练作业要满足如下要求才能正常实现ranktable动态路由加速。
- 训练使用的python版本是3.7、3.8或3.9。
- 训练作业的实例数要大于或等于3。
- 路由加速的原理是改变rank编号,所以代码中对rank的使用要统一。
- 需要确保训练作业的实例规格是节点满卡,如节点8卡场景,每个节点都必须是8卡,不能出现2卡或4卡场景。
将训练作业完成如下修改后,启动训练作业即可实现网络加速。
- 将训练启动脚本中的“node_rank="$vc_task_index"”修改为“node_rank="${rank_after_acc:-$vc_task_index}"”。
- 将训练启动脚本中的“master_addr="${vc_worker_hosts%%,*}"”修改为“master_addr="${ma_vj_name}-${ma_task_name}-${ma_master_index:-0}.${ma_vj_name}"”。
- 在创建训练作业页面配置环境变量“route_plan”,取值为“true”,具体操作请参见管理训练容器环境变量。
代码示例
训练作业的启动脚本示例如下。
启动脚本中设置plog生成后存放在“/home/ma-user/modelarts/log/modelarts-job-{id}/worker-{index}/”目录,而“/home/ma-user/modelarts/log/”目录下的“*.log”文件将会被自动上传至modelarts训练作业的日志目录(obs)。如果本地相应目录没有生成大小>0的日志文件,则对应的父级目录也不会上传。因此,pytorch npu的plog日志是按worker存储的,而不是按rank id存储的(这是区别于mindspore的)。目前,pytorch npu并不依赖rank table file。
#!/bin/bash
# ma preset envs
master_host="$vc_worker_hosts"
master_addr="${vc_worker_hosts%%,*}"
nnodes="$ma_num_hosts"
node_rank="$vc_task_index"
# also indicates npu per node
ngpus_per_node="$ma_num_gpus"
# self-define, it can be changed to >=10000 port
master_port="38888"
# replace ${ma_job_dir}/code/torch_ddp.py to the actutal training script
python_script=${ma_job_dir}/code/torch_ddp.py
python_args=""
export hccl_whitelist_disable=1
# set npu plog env
ma_vj_name=`echo ${ma_vj_name} | sed 's:ma-job:modelarts-job:g'`
task_name="worker-${vc_task_index}"
task_plog_path=${ma_log_dir}/${ma_vj_name}/${task_name}
mkdir -p ${task_plog_path}
export ascend_process_log_path=${task_plog_path}
echo "plog path: ${ascend_process_log_path}"
# set hccl timeout time in seconds
export hccl_connect_timeout=1800
# replace ${anaconda_dir}/envs/${env_name}/bin/python to the actual python
cmd="${anaconda_dir}/envs/${env_name}/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 \
--use_env \
$python_script \
$python_args
"
echo $cmd
$cmd
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨