将DP(DataParallel)改造为DDP(DistributedDataParallel)
昇腾目前暂不支持DP模型的训练,但PyTorch中的DDP是DP的一种扩展,可以更好地支持分布式训练。并且DDP使用更先进的通信策略,可以更好地处理梯度同步和通信效率。所以当DP不支持时,可以使用DDP来替代。
按照以下步骤将DP替换为DDP后执行模型训练。
- 删除如下DataParallel相关代码。
model = nn.DataParallel(model)
- 执行如下命令导入DDP模块。
from torch.nn.parallel import DistributedDataParallel as DDP
- 执行如下命令初始化进程组。
import torch.distributed as dist dist.init_process_group(backend='hccl', init_method='env://', world_size=world_size, rank=rank)
- 执行如下命令将模型封装在DDP中。
model = DDP(model, device_ids=[rank])
“device_ids”为指定使用的NPU设备。
- 执行如下命令调整优化器。
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) optimizer = torch.nn.parallel.DistributedDataParallel(optimizer)
- 执行如下命令调整数据加载器。
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, sampler=train_sampler)
“DistributedSampler”会自动根据进程数量划分数据集,并为每个进程分配相应的数据子集。
在训练过程中,需要使用“DistributedSampler”来保证每个进程训练的数据不重叠,同时需要将数据和模型移动到相应的NPU设备上进行计算。
- 执行如下命令训练模型。
for epoch in range(num_epochs): train_sampler.set_epoch(epoch) for inputs, labels in train_loader: inputs, labels = inputs.to(rank), labels.to(rank) outputs = model(inputs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step()
父主题: 参考信息