大语言模型框架-Megatron-LM 源码分析
Megatron-LM 是 NVIDIA 开源的大语言模型框架,是很多披露的大语言模型的训练使用的源头框架,很多公司基于其二次开发新的语言模型系统,例如 Megatron-LM-DeepSpeed。
Megatron 核心解决问题就是提供多种分布式切分并行策略,让大语言模型能够部署在多卡分布式环境下。本文将针对张量并行、流水并行、数据并行的实现展开源码分析。MoE 我们可以当成一种特殊的稀疏化结构,就不在本章进行介绍。

图片来自 DeepSpeed(本文不介绍 ZeRO,感兴趣读者可参考相关论文)
1 张量并行
张量并行分为行切和列切并行(指的是对输入矩阵切法),具体读者可以参考 Megatron 论文,其实现方式是继承实现 Linear 层,进而实现其中的并行策略,只需要替换模型中的 Linear 即可,后面我们也会看到 MoE 也是这种实现技巧。

world_size = get_tensor_model_parallel_world_size() self.input_size_per_partition = divide(input_size, world_size)
通过这部分代码进行并行 partition 划分,worldsize 是配置的 tensorparallel 的卡数,将完整 input 切成这么多份数,在每个执行这个代码的 rank 进行权重创建。

如果输入不是并行切分好的,通过 scatter 去拿这部分权重对应的输入数据。
scatter [图来源 PyTorch 官网]

forward 实现是配合异步 allreduce 进而将计算和 comm 通信并发执行。


async_grad_allreduce (bool required): Do the allreduce of input gradients asyncronously with the computation of weight gradients. If sequence_parallel is True, this must be False, as no all reduce is performed. 是对在 BP 阶段输入的 gradients 是否进行异步计算






































