DDP原理:
为什么快?
DDP通过Ring-Reduce(梯度合并)的数据交换方法提高了通讯效率,并通过启动多个进程的方式减轻Python GIL的限制,从而提高训练速度。
神经网络中的并行有以下三种形式:
参考:[原创][深度][PyTorch] DDP系列第一篇:入门教程 - 知乎 (zhihu.com)?
[原创][深度][PyTorch] DDP系列第一篇:入门教程 - 知乎 (zhihu.com)
注意点:
1. 保存模型:
考虑到以后可能需要单卡加载你多卡训练的模型,建议在保存模型时,去除模型参数字典里面的module,如何去除呢,使用model.module.state_dict()代替model.state_dict()
2.??每一个epoch里面真正的打乱数据
for epoch in range(args.num_epochs):
train_sampler.set_epoch(epoch) # shuffle数据
3. 设置多个gpu的BN同步(下面第一句代码)
# 设置模型并行
model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) # 多个gpu的BN同步
model = torch.nn.parallel.DistributedDataParallel(model.cuda())
SyncBatchNorm 是一个 PyTorch 模块,可对小批量数据执行批量标准化,但会同步分布式训练环境中所有 GPU 的平均值和标准差统计数据。
这与标准 PyTorch BatchNorm 模块形成对比,后者在每个 GPU 上独立计算平均值和标准差统计数据。
写的很完整的一篇文章: