大模型训练优化
Megatron
计算优化
OP 融合
组合不同的算子以减少运算和空间开销。
将模型网络中顺序执行的多个OPs进行融合能够减少OP 调度的开销,提升训练速度。目前Fleet 中支持如下3种的OP 融合:
- fuse_all_optimizer_ops:表明是否融合(fuse) 是否融合 optimizer_op,仅对部分 optimizer 可用(SGD、Adam和Momentum)。
- fuse_elewise_add_act_ops:表明是否融合(fuse) elementwise_add_op和activation_op。
- fuse_bn_act_ops:表明是否融合(fuse) batch_norm_op 和 activation_op。
自动混合精度
- Dynamic loss scaling:在AMP训练过程中,为了避免精度下溢,每训练一定数量批次的数据,就将Loss放大指定倍数。如果Loss在放大过程中发生上溢,则可以再缩小一定倍数,确保整个训练过程中,梯度可以正常收敛。
- op黑白名单
通信融合
每次触发通信都会有一些额外的操作(如先建立连接等),减少这些额外的操作将对性能有很大帮助。如果能够将多次通信的内容先拼接成连续的数据,然后在一次通信内全部发送/接收,那么将会更充分的利用硬件资源,获得更大的性能提升。AllReduce 融合默认情况下会将同一layer中参数的梯度的多个AllReduce操作合并成一个。 比如对于 fc 中有Weight和Bias两个参数,打开该选项之前,需要两次AllReduce操作;打开该选项之后,只用一次AllReduce 操作。这样可以减少梯度同步时的通信耗时。
通信计算重叠(Overlap)
计算和IO放入不同流中,实现执行时间上重叠
通信拓扑优化
分层通信思想,ring-allreduce,Double binary trees等多种拓扑结构
通信频率优化
用于低带宽场景(如: 公有云上训练,联邦训练)中,梯度同步在低带宽网络下的延迟成为训练速度的主要瓶颈
- DGC Deep Gradient Compression
使用深度梯度压缩选择重要梯度进行通信来减少通信量,降低对通信带宽的依赖。
DGC 论文中的 预热训练 (warming up training), 动量修正 (Momentum Correction), 局部梯度修剪 (local gradient clipping), 动量因子掩藏 (Momentum factor masking) 等策略, 和 正则化项修正 (Weight Decay Correction) 避免稀疏梯度通信训练带来的最终模型精度损失。 - LocalSGD
显存优化
Recompute
Forward Recomputation Backpropagation
FRB:该策略通过清除正向计算过程中的中间计算结果,来降低训练过程中使用的存储空间,从而确保硬件有足够的内存做更大batch Size 的训练。
Recompute-Offload
Recompute-Offload 原理大致可以分为两步:
- Forward: 当checkpoint在前向中被生成后,将其卸载(Offload)到Host 内存中,让其所占据的显存可以被释放。
- Backward:当checkpoint在反向中被重新调用之前,将其预取(Pre-fetch) 回显存中,完成之后的重计算。
并行优化
https://colossalai.org/docs/concepts/paradigms_of_parallelism/
https://www.zhihu.com/question/508671222/answer/2290801813
https://www.cnblogs.com/marsggbo/p/16871789.html
Data Parallel
all-reduce
Model Parallel
Tensor Parallel
all-gather
Pipeline Parallel
model is split by layer into several chunks, each chunk is given to a device.
Optimizer-Level Parallel
重计算(Recomputation or Checkpointing)
零冗余优化器 (Zero REdundancy Optimizer)
专家并行 MOE
高级优化
4D混合并行
并行方式 | 优点 | 缺点 |
---|---|---|
数据并行 | 并行加速比最高 | 显存占用高 |
模型并行 | 单个算子拆分到多个硬件,适合机器内相同多个硬件加速 | 通信量高 |
流水线并行 | 适合超大规模训练 | 设备利用率、计算效率差,可以用micro-batch优化 |
Sharding |
总训练速度 和 (单卡速度卡数多卡加速比)有关。 单卡速度由数据读取和计算速度决定,多卡加速比由计算/通信效率决定。
对于混合并行:假设每个mini-batch切分为micro_step个micro batches,每个micro-batch的batch size为micro_bsz,并假设流水线的级数为pp_num。
- 对于sharding,每个micro step需要对参数进行2次broadcast和1次reduce操作,因此每个micro step中总的通信量为2*M+M=3M,其中M为参数量大小。
- 对于数据并行,每个micro step需要使用allreduce sum操作同步当前机器上所有参数的梯度信息。
- 假设模型参数在所有流水线间均匀切分,那么每个流水线级中包含的参数量为M/pp_num,因此每个micro step总的通信量为2M/pp_num,其中2表示allreduce sum的通信因子。对于流水线并行,每个micro step传输的通信量为流水线相邻层间activation的大小;对于Transformer类模型,相邻层间的activation大小为hid_size * micro_bsz * seq_len;其中,hid_size表示模型参数隐层大小,seq_len表示模型参数序列长度,micro_bsz表示每个micro的batch size。
- 对于模型并行,每个Transformer Encoder层包含两次allreduce sum通信,每次通信量大小为hid_sizemicro_bszseq_len;由于结合流水线并行,每个流水线级中包含的Transformer Encoder的层数为L/pp_num,其中,其中L表示模型总的Transformer Encoder的层数,其余各参数的意义同上;因此,模型并行配置下每台机器内部每个micro step的通信总量为4L*(hid_sizemicro_bszseq_len)/pp_num,其中因子4表示allreduce_sum通信因子2与每个Transformer Encoder层包含两次allreduce sum通信次数的乘积。