1.模型并行 vs 数据并行
左侧模型并行:是网络太大,一张卡存不了,那么拆分,然后进行模型并行训练。
右侧数据并行:多个显卡同时采用数据训练网络的副本。
2.模型并行
用的比较少,目前没有啥例子来说明一下这模型并行。
3.数据并行
这种并行方式用的比较多,资料也比较多,我有实际应用过,积累如下。
数据并行的操作要求我们将数据划分成多份,然后发送给多个 GPU 进行并行的计算。
注意:多卡训练要考虑通信开销的,是个trade off的过程,不见得四块卡一定比两块卡快多少,可能是训练到四块卡的时候通信开销已经占了大头
下面是一个简单的示例。要实现数据并行,第一个方法是采用 nn.parallel
中的几个函数,分别实现的功能如下所示:
-
复制(Replicate):将模型拷贝到多个 GPU 上;
-
分发(Scatter):将输入数据根据其第一个维度(通常就是 batch 大小)划分多份,并传送到多个 GPU 上;
-
收集(Gather):从多个 GPU 上传送回来的数据,再次连接回一起;
-
并行的应用(parallel_apply):将第三步得到的分布式的输入数据应用到第一步中拷贝的多个模型上。
- PyTorch也提供了简单的函数,只用几行代码可实现简单高效的并行GPU计算。
①nn.parallel.data_parallel(module, inputs, device_ids=None, output_device=None, dim=0, module_kwargs=None)
②class torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0)
可见二者的参数十分相似,通过device_ids参数可以指定在哪些GPU上进行优化,output_device指定输出到哪个GPU上。唯一的不同就在于前者直接利用多GPU并行计算得出结果,而后者则返回一个新的module,能够自动在多GPU上进行并行加速。
# method 1
new_net= nn.DataParallel(net, device_ids=[0, 1])
output= new_net(input)
# method 2
output= nn.parallel.data_parallel(new_net, input, device_ids=[0, 1])
参考:
0.动画解释基础知识:https://fyubang.com/2019/07/08/distributed-training/
1.总结的非常好:https://www.cnblogs.com/yh-blog/p/12877922.html
2.官方文档模型并行:https://pytorch.apachecn.org/docs/1.2/intermediate/model_parallel_tutorial.html
3.数据并行的一个Gitdemo:https://github.com/fnangle/text_classfication-with-bert-pytorch-
4.PyTorch 并行训练指南:单机多卡并行、混合精度、同步 BN 训练:https://bbs.cvmart.net/topics/2672
5.单机多卡:https://fyubang.com/2019/07/23/distributed-training3/