[naie@notebook-npu-bde28a8c-568c5bcb58-mlj9c multi_GPU_training]$ netstat -tulnp | grep 29500
[naie@notebook-npu-bde28a8c-568c5bcb58-mlj9c multi_GPU_training]$ netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.234.91.164:8888 0.0.0.0:* LISTEN 367/python
tcp6 0 0 10.234.91.164:2222 :::* LISTEN 210/java
[naie@notebook-npu-bde28a8c-568c5bcb58-mlj9c multi_GPU_training]$ netstat -tulnp | grep 8888
tcp 0 0 10.234.91.164:8888 0.0.0.0:* LISTEN 367/python
[naie@notebook-npu-bde28a8c-568c5bcb58-mlj9c multi_GPU_training]$ netstat -tulnp | grep 2222
tcp6 0 0 10.234.91.164:2222 :::* LISTEN 210/java
[naie@notebook-npu-bde28a8c-568c5bcb58-mlj9c multi_GPU_training]$ netstat -tulnp | grep localhost
[naie@notebook-npu-bde28a8c-568c5bcb58-mlj9c multi_GPU_training]$ netstat -tulnp | grep 65536
[naie@notebook-npu-bde28a8c-568c5bcb58-mlj9c multi_GPU_training]$ netstat -tulnp | grep 'localhost'
[naie@notebook-npu-bde28a8c-568c5bcb58-mlj9c multi_GPU_training]$
01 单卡训练
配置环境变量后,执行单卡训练脚本拉起训练,命令示例如下(以下参数为举例,用户可根据实际情况自行改动):
python3 main.py --batch-size 128 \ # 训练批次大小,请尽量设置为处理器核数的倍数以更好的发挥性能
--data_path /home/data/resnet50/imagenet # 数据集路径
--lr 0.1 \ # 学习率
--epochs 90 \ # 训练迭代轮数
--arch resnet50 \ # 模型架构
--world-size 1 \
--rank 0 \
--workers 40 \ # 加载数据进程数
--momentum 0.9 \ # 动量
--weight-decay 1e-4 \ # 权重衰减
--gpu 0 # device号, 这里参数名称仍为gpu, 但迁移完成后实际训练设备已在代码中定义为npu
02 多卡分布式训练
https://www.hiascend.com/document/detail/zh/Pytorch/60RC2/ptmoddevg/trainingmigrguide/PT_LMTMOG_0080.html
多卡训练分为单机多卡训练与多机多卡训练,二者均需要将单机训练脚本修改为多机训练脚本,配置流程如下。
(1)单机多卡训练
- 先参考单卡脚本修改为多卡脚本章节
- 再参考拉起多卡分布式训练章节,选择拉起合适的方式,进行必要的修改后,执行对应的拉起命令。
单卡脚本修改为多卡脚本
1.在主函数中添加如下代码。
local_rank = int(os.environ["LOCAL_RANK"])
device = torch.device('npu', local_rank)
torch.distributed.init_process_group(backend="hccl",rank=local_rank)
2.在获取训练数据集后,设置train_sampler
train_sampler = torch.utils.data.distributed.DistributedSampler(train_data)
3.定义模型后,开启DDP模式
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[local_rank], output_device=local_rank)
4.将数据加载器train_dataloader与train_sampler相结合。
train_dataloader = DataLoader(dataset = train_data, batch_size=batch_size, sampler = train_sampler)
拉起多卡分布式训练
在单机和多机场景下,有5种方式可拉起分布式训练:
- shell脚本方式(推荐)
- mp.spawn方式
- Python方式
- torchrun方式:仅在PyTorch 1.11.0及以上版本支持使用。
- torch_npu_run方式(集群场景推荐):此方式是torchrun在大集群场景的改进版,提升集群建链性能,仅在PyTorch 1.11.0版本支持使用。
1.shell脚本方式
Shell 脚本是一种脚本语言,它允许用户编写一系列的命令,这些命令可以被 Shell 执行。Shell 脚本可以自动化任务,使得重复性的工作可以快速、一致地完成。
export HCCL_WHITELIST_DISABLE=1
RANK_ID_START