torch_npu_run是torchrun在大集群场景的改进版,提升集群建链性能。
torch_npu_run相对torchrun有以下改进:
在分布式训练中,一般每个节点会开启一个torch_run进程,也被称为agent进程。agent负责管理本节点上多个训练进程的启动和结束等状态,训练进程也被称为worker。原生torchrun是让所有的agent和worker与0号节点(node0)上的agent建立TCP连接,如图1所示。torchrun的方式下建链时间会随着训练进程数的增多呈线性增长,导致性能瓶颈。
torch_npu_run是在torch_run的基础上引入了tcpStore分层架构方案,即在每一个节点上由agent启动一个新角色proxy,管理worker的通信。节点上的worker与proxy建立UnixSocket连接,所有的proxy与node0的proxy建立TCP连接。实现通信的分层,打破建链时间线性瓶颈,使得建链时间复杂度从O(n)降低到,如图2所示。
启动分布式训练任务时,推荐使用该特性。
export MASTER_IP_ADDR=** # 将**填写node_rank0的IP地址 export MASTER_PORT=** # 将**填写为一个空闲的tcp端口号 torch_npu_run --rdzv_backend=parallel --master_addr=$MASTER_IP_ADDR --master_port=$MASTER_PORT --nnodes=1 --nproc_per_node=8 ddp_test.py
# 第一台机器 export MASTER_IP_ADDR=** # 将**填写node_rank0的IP地址 export MASTER_PORT=** # 将**填写为一个空闲的tcp端口号 torch_npu_run --rdzv_backend=parallel --master_addr=$MASTER_IP_ADDR --master_port=$MASTER_PORT --nnodes=2 --node_rank 0 --nproc_per_node=8 ddp_test.py # 第二台机器 export MASTER_IP_ADDR=** # 将**填写node_rank0的IP地址 export MASTER_PORT=** # 将**填写为一个空闲的tcp端口号 torch_npu_run --rdzv_backend=parallel --master_addr=$MASTER_IP_ADDR --master_port=$MASTER_PORT --nnodes=2 --node_rank 1 --nproc_per_node=8 ddp_test.py
# 第一台机器 export MASTER_IP_ADDR=** # 将**填写node_rank0的IP地址 export MASTER_PORT=** # 将**填写为一个空闲的tcp端口号 torch_npu_run --rdzv_backend=parallel --master_addr=$MASTER_IP_ADDR --master_port=$MASTER_PORT --nnodes=2 --node_rank 0 --nproc_per_node=8 --enable_tiered_parallel_tcpstore=true ddp_test.py # 第二台机器 export MASTER_IP_ADDR=** # 将**填写node_rank0的IP地址 export MASTER_PORT=** # 将**填写为一个空闲的tcp端口号 torch_npu_run --rdzv_backend=parallel --master_addr=$MASTER_IP_ADDR --master_port=$MASTER_PORT --nnodes=2 --node_rank 1 --nproc_per_node=8 --enable_tiered_parallel_tcpstore=true ddp_test.py
ddp_test.py为模型训练脚本,ddp_test.py仅为示例,用户可根据实际脚本名称进行修改。
无