1、数据并行(DP)
如果有三张卡,就会有三个模型(一个模型复制三份)
并行顺序:
①数据切分成三块
②模型复制三份
③每个模型对自己那部分数据前向传播
④得到的三份输出全都汇聚到GPU0(第一张卡)
⑤在GPU0上计算loss和梯度
⑥把梯度分三份分别给三个GPU
⑦每个GPU分别进行自己那部分的反向传播
⑧反向传播结果归到GPU0,由GPU0进行总计算,减小梯度,更新参数,再把更新后的模型重新复制三份到三个GPU。再次划分数据为三份。
优点:速度快
缺点:GPU0既要分发任务又要存放模型,容易OOM。模型大小受限于单卡容量(第一张卡显存的85%左右大小的模型是比较合适的),并且需要每张卡内都完整执行训练过程
2、模型并行
①层间并行(流水并行,pipeline parrallel,PP,把模型按层拆开,GPU0是第一层以此类推):当第一个batch的数据正向传播到最后一个GPU计算结束开始反向传播,传播到倒数第二个GPU上的时候,最后一个GPU开始计算第二个batch的反向传播值,以此类推。当第一个batch反向传播到第一个GPU的时候,第二个GPU上是第二个batch,第三个GPU上是第三个batch...
②层内并行(张量并行,tensor parrallel,TP,按照权重把模型的每层都拆开):相当于multihead的head分开。注意 head 数要能整除卡数。
3、混合并行
数据并行+层内+层间并行
假设一共有384张卡,每48张卡复制一个模型,那么数据可以分为8份【数据并行 n=8】
对每48张卡实现层内和层间并行:对multihead ➗ 4 ,那么此时模型每层需要 12 张卡 【层内并行 n=4】
对于层间并行就是执行流水线计算 【层间并行 n=12】
deepspeed的stage含义:
ZeRO-0:只数据并行
ZeRO-1:对优化器状态分片(显存降低4倍)
ZeRO-2:对优化器状态、梯度都进行分片(显存降低8倍)
ZeRO-3:对优化器状态、梯度、模型参数都进行分片(显存降低更多,但通信成本增加1.5倍)
zero-offload:内存扩展显存
zero-infinity:NVMe固态硬盘扩展
速度:0>1>2>2+offload>3>3+offload
GPU内存占用情况与速度相同(显存降得越多,速度越慢)
4、真正的分布式数据并行(Distributed Data Parallel,DDP):
①多个进程,每个进程都加载数据和模型(DP只有GPU0加载数据和模型,然后分发)
②各进程同时前向传播
③各进程分别计算loss,反向传播,计算梯度(不需要汇总到GPU0)
④各进程间通信,将梯度在各卡同步(此时每个卡梯度相同)
⑤各进程分别更新模型(不需要再从GPU0复制)