多卡分布式训练
多卡训练配置流程
多卡训练分为单机多卡训练与多机多卡训练,二者均需要将单机训练脚本修改为多机训练脚本,配置流程如下。
- 单机多卡训练,先参考单卡脚本修改为多卡脚本章节,再参考拉起多卡分布式训练章节,选择拉起合适的方式,进行必要的修改后,执行对应的拉起命令。
- 多机多卡训练,先参考单卡脚本修改为多卡脚本章节,再参考准备多机多卡训练环境进行必要的配置,最后参考拉起多卡分布式训练章节,选择拉起合适的方式,进行必要的修改后,执行对应的拉起命令。
单卡脚本修改为多卡脚本
本节以适配样例(DDP场景(one NPU per process))章节的代码为样例,为用户介绍将单卡训练脚本修改为多卡训练脚本的核心步骤。
- 在主函数中添加如下代码。
- 在shell脚本中循环传入local_rank变量作为指定的device。
local_rank = int(os.environ["LOCAL_RANK"])
- 用local_rank自动获取device号。
device = torch.device('npu', local_rank)
- 初始化,将通信方式设置为hccl。
torch.distributed.init_process_group(backend="hccl",rank=local_rank)
- 在shell脚本中循环传入local_rank变量作为指定的device。
- 在获取训练数据集后,设置train_sampler。
train_sampler = torch.utils.data.distributed.DistributedSampler(train_data)
- 定义模型后,开启DDP模式。
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[local_rank], output_device=local_rank)
- 将数据加载器train_dataloader与train_sampler相结合。
train_dataloader = DataLoader(dataset = train_data, batch_size=batch_size, sampler = train_sampler)
准备多机多卡训练环境
多卡分布式训练场景分为单机多卡训练和多机多卡训练。如果用户准备进行单机多卡训练,请跳过本章节。如果用户要进行多机多卡训练,则需要进行以下准备操作。以下操作除模型修改外,只需配置执行一次。
- 集合通信仅支持1/2/4/8P粒度的分配。
- 以下操作只需配置执行一次。
- 准备组网,以两台8卡服务器组网为例。
通过交换机或光口直连的方式完成计算设备组网搭建。
- 配置device IP。
- 在AI Server0上配置device IP,以下IP为示例。
hccn_tool -i 0 -ip -s address 192.***.***.001 netmask 255.255.255.0 hccn_tool -i 1 -ip -s address 192.***.***.001 netmask 255.255.255.0 hccn_tool -i 2 -ip -s address 192.***.***.001 netmask 255.255.255.0 hccn_tool -i 3 -ip -s address 192.***.***.001 netmask 255.255.255.0 hccn_tool -i 4 -ip -s address 192.***.***.001 netmask 255.255.255.0 hccn_tool -i 5 -ip -s address 192.***.***.001 netmask 255.255.255.0 hccn_tool -i 6 -ip -s address 192.***.***.001 netmask 255.255.255.0 hccn_tool -i 7 -ip -s address 192.***.***.001 netmask 255.255.255.0
- 在AI Server1上配置device IP,以下IP为示例。
hccn_tool -i 0 -ip -s address 192.***.***.002 netmask 255.255.255.0 hccn_tool -i 1 -ip -s address 192.***.***.002 netmask 255.255.255.0 hccn_tool -i 2 -ip -s address 192.***.***.002 netmask 255.255.255.0 hccn_tool -i 3 -ip -s address 192.***.***.002 netmask 255.255.255.0 hccn_tool -i 4 -ip -s address 192.***.***.002 netmask 255.255.255.0 hccn_tool -i 5 -ip -s address 192.***.***.002 netmask 255.255.255.0 hccn_tool -i 6 -ip -s address 192.***.***.002 netmask 255.255.255.0 hccn_tool -i 7 -ip -s address 192.***.***.002 netmask 255.255.255.0
配置device IP需遵守以下规则:
- 针对Atlas 训练系列产品,AI Server中的第0/4、1/5、2/6、3/7号device需处于同一网段,第0/1/2/3号device在不同网段,第4/5/6/7号device在不同网段;对于集群场景,各AI Server对应的位置的device需处于同一网段,AI Server0和AI Server1的0号网卡需处于同一网段、1号网卡需要在同一网段。
- 针对Atlas A2 训练系列产品,多台节点的NPU在同一网段即可。
- 每个IP都不能冲突,相同网段下的IP需在最后8位做区分。
- 使用hccn_tool 确保两机器的卡间连通性,从device0 - devcie7 测试8次,确保两台机器间所有卡都连通。
hccn_tool -i 0 -netdetect -s address xx.xx.xx.xx hccn_tool -i 0 -net_health -g #-s address:xx.xx.xx.xx是另外一台机器的device i的IP #-i:device序号
- 使用hccn_tool工具验证device IP是否配置正确。
- 查询每个device的ip:
hccn_tool -i 0 -ip -g
- 打印查询结果:
ipaddr:192.***.***.001 netmask:255.255.255.0
如果返回success则表示已经连通。
- 查询每个device的ip:
- 在AI Server0上配置device IP,以下IP为示例。
- 关闭防火墙。
- Ubuntu系统防火墙关闭命令。
ufw disable
- Redhat或CentOS 7系统防火墙关闭命令。
systemctl stop firewalld
- Ubuntu系统防火墙关闭命令。
- 确认交换机状态正常。
执行以下命令,返回值不为空则正常。
for i in {0..7}; do hccn_tool -i $i -lldp -g; done
- 修改模型。可参考单卡脚本修改为多卡脚本,将模型脚本上传至AI Server0和AI Server1任意路径下。
- 拉起多机多卡训练,具体可参考拉起多卡分布式训练。
- 在所有脚本统一主节点的MASTER_PORT和MASTER_ADDR。
- 配置相应的rank与world_size。
- 查看host日志。
所有host日志统一保存在~/ascend/log路径下,用户可以在该路径下查看每个host的device日志。
- 由于Master节点允许处理的并发建链数受Linux内核参数“somaxconn”与“tcp_max_syn_backlog”的限制,所以,针对大规模集群组网,若“somaxconn”与“tcp_max_syn_backlog”取值较小会导致部分客户端概率性提前异常退出,导致集群初始化失败。
大规模集群组网场景下,建议用户根据集群数量适当调整“somaxconn”与“tcp_max_syn_backlog”参数的值,例如:
sysctl -w net.core.somaxconn=65535 sysctl -w net.ipv4.tcp_max_syn_backlog=65535 sysctl -w net.ipv4.ip_local_reserved_ports=60000-60015
如果用户在物理机场景训练,则需要在物理机上配置以上命令;若是在容器场景训练,则需要在容器中配置以上命令。
拉起多卡分布式训练
在单机和多机场景下,有5种方式可拉起分布式训练:
- shell脚本方式(推荐)
- mp.spawn方式
- Python方式
- torchrun方式:仅在PyTorch 1.11.0及以上版本支持使用。
- torch_npu_run方式(集群场景推荐):此方式是torchrun在大集群场景的改进版,提升集群建链性能,仅在PyTorch 1.11.0版本支持使用。
附录拉起多卡训练脚本示例中,以一个简单模型脚本为样例,展示了每种拉起方式脚本代码的修改方法以及各种拉起方式的适配方法,用户可以参考学习。
- 集合通信存在如下约束:
- 数据并行模式中不同device上执行的图相同。
- 针对Atlas 训练系列产品:allreduce和reduce_scatter仅支持int8、int32、float16和float32数据类型。
- 针对Atlas A2 训练系列产品:allreduce和reduce_scatter仅支持int8、int32、float16、float32和bfp16数据类型。
- 分布式训练场景下,HCCL会使用Host服务器的部分端口进行集群信息收集,需要操作系统预留该部分端口。默认情况下,HCCL使用60000-60015端口,若通过环境变量HCCL_IF_BASE_PORT指定了Host网卡起始端口,则需要预留以该端口起始的16个端口。
sysctl -w net.ipv4.ip_local_reserved_ports=60000-60015
- 若用户准备进行2卡训练,可将8卡训练脚本进行改写,改为2卡训练脚本。可参见以下修改方法:
- 若8卡脚本的batchsize是单卡脚本的batchsize的8倍,则将8卡训练时的batch size和learning rate同时除以4,作为2卡训练时的batch size和learning rate。
- 如果使用for循环启动训练入口脚本,则将for循环的次数改为2次。
- world size或者rank size修改为2,并确保训练脚本中dist.init_process_group()中world_size参数为2。
- 如果有指定device list参数,且取值范围为0-7,则将其改为0-1。
父主题: 启动脚本配置