DDP原理:
为什么快?
DDP通过Ring-Reduce(梯度合并)的数据交换方法提高了通讯效率,并通过启动多个进程的方式减轻Python GIL的限制,从而提高训练速度。
神经网络中的并行有以下三种形式:
- Data Parallelism
- 这是最常见的形式,通俗来讲,就是增大batch size提高并行度。
- 平时我们看到的多卡并行就属于这种。比如DP、DDP都是。这能让我们方便地利用多卡计算资源。
- 能加速。
- 这是最常见的形式,通俗来讲,就是增大batch size提高并行度。
- Model Parallelism
- 把模型放在不同GPU上,计算是并行的。
- 有可能是加速的,看通讯效率。
- Workload Partitioning
- 把模型放在不同GPU上,但计算是串行的。
- 不能加速。
参考:[原创][深度][PyTorch] DDP系列第一篇:入门教程 - 知乎 (zhihu.com)
[原创][深度][PyTorch] DDP系列第一篇:入门教程 - 知乎 (zhihu.com)
注意点:
- 保存模型:
考虑到以后可能需要单卡加载你多卡训练的模型 ,建议在保存模型时,去除模型参数字典里面的module,如何去除呢,使用model.module.state_dict()代替model.state_dict()
2. 每一个epoch里面真正的打乱数据
for epoch in range(args.num_epochs):
train_sampler.set_epoch(epoch) # shuffle数据