LLM
minimind项目解构
相关名词
- Pretrain:预训练
- SFT(Supervised Fine-Tuning):有监督微调
- RLHF(Reinforcement Learning from Human Feedback):人类反馈强化学习
- KD(Knowledge Distillation):知识蒸馏,黑盒蒸馏、白盒蒸馏。
- LoRA(Low-Rank Adaptation):通过低秩分解的方式对于训练模型进行微调。
- RMSNorm(Root Mean Square Layer Normalization): $$\begin{aligned} % Step 1: RMS Calculation \text{RMS}(\mathbf{x}) = \sqrt{\frac{1}{n} \sum_{i=1}^{n} x_i^2 + \epsilon} \\ % Step 2: Normalization and Scaling \mathbf{y} = \frac{\mathbf{x}}{\text{RMS}(\mathbf{x})} \odot \mathbf{g} \\ \end{aligned}$$
- AMP(Automatic Mixed Precision, 自动混合精度)
DDP(DistributedDataParallel)
pytorch官方推荐的标准分布式训练方法。分工合作,任务均摊。
- 并行计算:DDP中,每个GPU都有一份模型的副本,每块GPU拿到一份切好的数据,独立的进行模型的前向传播和反向传播,计算自己这份数据的梯度。
- 梯度同步:在更新模型参数之前,所有GPU会互相通信,将各自计算出的梯度汇总并求平均值。DDP的梯度同步是并行的,可以在反向传播计算梯度的同时进行通信(梯度同步)。
- 统一更新:最后,每块GPU都使用这个完全相同的平均梯度来更新自己本地的模型副本。
- Ring All-Reduce:DDP使用All-Reduce算法(通常是高效的Ring All-Reduce)来同步梯度。
Ring All-Reduce
为了避免单点瓶颈,DDP(通过NCCL)通常采用Ring All-Reduce算法,它让所有GPU组成一个逻辑上的环,通过两轮循环高效地完成任务:
假设每个梯度张量都被切分成了N块(N=GPU数量),以流水线的方式发送
- 第一阶段:Scatter-Reduce
- 每个GPU将自己的梯度块发送给环中的下一个GPU,同时从上一个GPU接收梯度块。(每个节点发送不同位置的梯度块)。
- 收到梯度块后,将其与自己本地对应的梯度块相加,然后下次发送最新加过的梯度块。
- 这个过程重复N - 1次。
- 结果:经过N - 1步,每个GPU上都拥有了一个完整的、经过全局求和的梯度块。
- 第二阶段:All-Gather
- 现在,每个GPU都持有一份最终结果的“片段”。它们再次在环中传递这些片段。
- 每个GPU将自己持有的最终梯度块发送给下一个GPU,同时接收上一个GPU发来的最终梯度块。
- 这个过程也重复N-1次。
- 结果:所有GPU都收集到了所有片段,从而在本地拼凑出完整、经过全局求和的梯度。