引言DistributedDataParallel(DDP)是一个支持多机多卡、分布式训练的深度学习工程方法。PyTorch现已原生支持DDP,可以直接通过torch.distributed使用,超方便,不再需要难以安装的apex库啦! Show 概览想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I do! 本文是DDP系列三篇(基本原理与入门,底层实现与代码解析,实战与技巧)中的第一篇。本系列力求深入浅出,简单易懂,猴子都能看得懂(误)。本篇主要在下述四个方面展开描述:
请欢快地开始阅读吧! Quick Start不想看原理?给你一个最简单的DDP Pytorch例子! 依赖PyTorch(gpu)>=1.5,python>=3.6 环境准备推荐使用官方打好的PyTorch docker,避免乱七八糟的环境问题影响心情。
代码单GPU代码
加入DDP的代码
大白话原理假如我们有N张显卡,
是不是很简单呢? 与DP模式的不同那么,DDP对比Data Parallel(DP)模式有什么不同呢? DP模式是很早就出现的、单机多卡的、参数服务器架构的多卡训练模式,在PyTorch,即是:
在DP模式中,总共只有一个进程(受到GIL很强限制)。master节点相当于参数服务器,其会向其他卡广播其参数;在梯度反向传播后,各卡将梯度集中到master节点,master节点对搜集来的参数进行平均后更新参数,再将参数统一发送到其他卡上。这种参数更新方式,会导致master节点的计算任务、通讯量很重,从而导致网络阻塞,降低训练速度。 但是DP也有优点,优点就是代码实现简单。要速度还是要方便,看官可以自行选用噢。 DDP为什么能加速?本节对上面出现的几个概念进行一下介绍,看完了你就知道为什么DDP这么快啦! Python GILGIL是个很捉急的东西,如果大家有被烦过的话,相信会相当清楚。如果不了解的同学,可以自行百度一下噢。 而DDP启动多进程训练,一定程度地突破了这个限制。 Ring-Reduce梯度合并Ring-Reduce是一种分布式程序的通讯方法。
简单说明 图片来自:https://www.zhihu.com/question/57799212/answer/612786337
并行计算图片来自:https://medium.com/@esaliya/model-parallelism-in-deep-learning-is-not-what-you-think-94d2f81e82ed统一来讲,神经网络中的并行有以下三种形式:
如何在PyTorch中使用DDP看到这里,你应该对DDP是怎么运作的,为什么能加速有了一定的了解,下面就让我们学习一下怎么使用DDP吧! 如何在PyTorch中使用DDP:DDP模式DDP有不同的使用模式。DDP的官方最佳实践是,每一张卡对应一个单独的GPU模型(也就是一个进程),在下面介绍中,都会默认遵循这个pattern。 但是,我们也是可以给每个进程分配多张卡的。总的来说,分为以下三种情况:
在本文中,先不会讲每个进程多张卡要怎么操作,免得文章过于冗长。在这里,只是让你知道有这个东西,用的时候再查阅文档。 如何在PyTorch中使用DDP:概念下面介绍一些PyTorch分布式编程的基础概念。 基本概念在16张显卡,16的并行数下,DDP会同时启动16个进程。下面介绍一些分布式的概念。 group 即进程组。默认情况下,只有一个组。这个可以先不管,一直用默认的就行。 world size 表示全局的并行数,简单来讲,就是2x8=16。
rank 表现当前进程的序号,用于进程间通讯。对于16的world sizel来说,就是0,1,2,…,15。
local_rank 又一个序号。这是每台机子上的进程的序号。机器一上有0,1,2,3,4,5,6,7,机器二上也有0,1,2,3,4,5,6,7
如何在PyTorch中使用DDP:详细流程精髓DDP的使用非常简单,因为它不需要修改你网络的配置。其精髓只有一句话
原本的model就是你的PyTorch模型,新得到的model,就是你的DDP模型。 准备工作但是,在套`model = DDP(model)`之前,我们还是需要做一番准备功夫,把环境准备好的。
前向与后向传播有一个很重要的概念,就是数据的并行化。
其他需要注意的地方
调用方式像我们在QuickStart里面看到的,DDP模型下,python源代码的调用方式和原来的不一样了。现在,需要用
单机模式
多机模式 复习一下,master进程就是rank=0的进程。
小技巧
mp.spawn调用方式PyTorch引入了torch.multiprocessing.spawn,可以使得单卡、DDP下的外部调用一致,即不用使用torch.distributed.launch。 python main.py一句话搞定DDP模式。 给一个mp.spawn的文档:代码文档 下面给一个简单的demo:
mp.spawn与launch各有利弊,请按照自己的情况选用。 总结既然看到了这里,不妨点个赞/喜欢吧! 在本篇中,我们介绍了DDP的加速原理,和基本用法。如果你能充分理解文章内容,那么,你可以说对DDP初步入门了,可以开始改造你的算法程序,来吃掉多卡训练速度提升这波红利了! 在DDP系列的后面两篇中,我们还会介绍DDP的底层实现方法,以及DDP的一些实战。这些属于进阶的文章,如果你的DDP程序运行情况不理想/没有获得速度提升,或者你比较有探究精神/学习兴趣浓厚,那么一定不要错过后面这两篇^.^ 最后让我们来总结一下所有的代码,这份是一份能直接跑的代码,推荐收藏!
Citation
|