分布式深度学习是指使用包含多个工作线程的分布式系统来执行推理或训练深度学习。
参考 Parallelism in Distributed Deep Learning
人们一直在考虑通过横向扩展来加速深度学习,并引入了许多并行化机制(即将计算分发给多个工作线程的方式),主要分为数据并行、张量并行和管道并行三种类型。
1 数据并行
数据并行(Data Parallelism, DP)是指将大小为 N 的数据集划分为 P 块,随机分配到 M 个设备 Device 中(每个 Device 上只处理 1 块输入且传入的数据不同),模型也被复制为 N 个,每个 Device 上都拷贝一份完整的模型参数,每块模型均在每块数据上进行训练,各自完成前向和后向传播计算得到梯度,对梯度进行更新后,再传回各个 Device,需要确保所有 Device 彼此之间同步模型权重的梯度。
数据并行的模型有 Google 发布的 Parameter Server 和 Baidu 发布的 All-Reduce。
Parameter Server 结构图如下:
All Reduce = ReduceScatter 迭代两次 + AllGather 迭代两次,结构如下图所示。
实现细节请参考AllReduce如何实现:
假设我们有 M 个 Device,数据集大小为 N,划分为 P 块分给每一个 Device,每个块数据的大小是 N/P,总共进行有(P-1)次数据交换(每次数据交换涉及发送和接收两条消息),因此总延迟为 2 * (P-1),ReduceScatter 迭代两次和 AllGather 迭代两次,即总带宽为 2 * (P - 1) * N / P。
- 延迟(Latency):也称为网络延迟,是指数据从发送端到接收端的传输时间。
- 带宽(Bandwidth):是指网络连接可以传输的数据量,通常以比特每秒(bps)为单位表示。
- 带宽和延迟之间的关系可以用一个比喻来理解:带宽就像是一条高速公路的宽度,而延迟则相当于在这条公路上行驶的速度。
但数据并行中存在限制:
每个 GPU 上都复制了一份完整模型,当模型变大时,很容易打爆 GPU 的显存。
2 模型并行
流水线并行和张量并行可以归类为模型并行(Model Parallelism, MP),因为它们都是将模型切成更小的块。
2.1 流水线并行
流水线并行(Pipeline Parallelism, PP),又称为 Inter-Layer Parallelism,是对模型层间做划分。例如,模型原本有 4 层,你想在 2 个 GPU 之间运行 Pipeline,那么每个 GPU 只要按照先后顺序存 2 层模型(即将 T1 和 T2 放到 GPU0 ,T3 和 T4 放到 GPU1)。
但流水线并行也存在缺点:参考流水线并行
在计算过程中,必须顺序执行,后面的计算过程依赖于前面的计算结果,导致GPU效率不高。
2.2 张量并行
张量并行(Tensor Parallelism, TP),又称作 Intra-Layer Parallelism,是对模型层内做划分,将每个 Transformer 层内的矩阵乘法被分割到多个 GPU 上,会在多个设备 Device 之间划分模型的各个层,将某一层的计算分配到不同的 Device 上,从而解决 GPU 显存容量和计算限制的问题,使得权重和关联的优化器状态不需要同时存储在一个处理器上(这也可以被理解为将大矩阵运算拆分成多个小矩阵运算,然后分布到不同的设备上进行计算)。