Distributed Training and Reasoning Optimization of LLM

Sufficient memory: Can we go faster? 1

  1. 数据并行 (Data Parallelism - DP)

Memory is a constraint. What to do? 2. 模型并行 (Model Parallelism - MP)

  • 张量并行 (Tensor Parallelism - TP)
  • 流水线并行 (Pipeline Parallelism - PP)
  1. 序列与上下文并行 (Sequence & Context Parallelism)
  • 序列并行 (Sequence Parallelism - SP)
  • 上下文并行 (Context Parallelism - CP)
  1. 专家并行 (Expert Parallelism - EP)
  1. TPx (2D 张量并行 - 维1):将模型权重和输入数据在模型维度(hidden dimension)上进行切分 。
  2. TPy (2D 张量并行 - 维2):将输入数据在序列长度(sequence length)维度上进行切分,与 TPx 共同构成 2D 张量并行,减少冗余并提高内存效率 。
  3. SP (序列并行 - Sequence Parallelism):通过 AlltoAll 操作将切分维度从序列轴转置到注意力头(attention head)轴,使每个设备独立处理部分注意力头 。
  4. CP (上下文并行 - Context Parallelism):在处理长序列时,通过环形(ring-based)通信在多个设备间切分并同步序列上下文 。
  5. DP (数据并行 - Data Parallelism):将训练数据(mini-batch)切分到不同设备上,每个设备维护模型的一个副本(或通过 ZeRO 进行分片)并同步梯度 。
  6. PP (流水线并行 - Pipeline Parallelism):将模型的不同层(layers)分布在不同的设备阶段,数据以微批次(micro-batches)形式在层间流水化执行 。
  7. EP (专家并行 - Expert Parallelism):针对 MoE(混合专家)模型,将不同的专家分配到不同设备,每个 Token 根据路由算法发送至对应的专家进行计算 。

SP 和 CP 的主要区别在于 SP 需要切分权重

C++ Template

Metaprogramming 就是写一段程序,这段程序可以生成或者修改一段程序,Macro and Template 都是实现 Metaprogramming 的手段。

特化(specialization)和部分特化(Partial Specialization)或者说叫偏特化,都是为了让编译器明确执行路径或者说接口选择

Attention

从抽象层面来理解注意力的 QKV 计算,实际是为原始 token 序列生成了一个新的信息表示。这个过程分为两个步骤:

  1. QK 计算 token 间的相关性,这种相关性会通过注意力分数来体现
  2. 基于相关性对 V 中的数据求解加权平均

具体而言,从矩阵的角度来看,Q 的每一行是一个 token 的原始信息,与 $K^T$ 的计算结果则表征了原始的一个 token 对于其他 token 的关注程度(此时如果 K 中行序发生改变,则 $K^T$ 中列序将发生改变,那么 $QK^T$ 的计算结果中一个 token 对其他 token 的关注程度,这个“其他 token”的顺序是发生了变化的);考虑与 V 的计算,由于左乘矩阵每一行依然对应到原始 token,所以与 V 的计算结果每一行依然是原始 token 的信息(如果 K 中行序发生变化,那么 V 的行序也需要对应变化,即只需要保证 $QK^T$ 的列能够正确作为对应 token 信息的权重)

Pytorch

在 Pytorch 语义下,目前理解其中的关键就在于待训练参数计算逻辑两点,并且这两点共同构成了各种封装好的模块

troch.nn.Linear 为例,可以通过 nn.Parameter 手动创建参数,然后自行创建计算逻辑。但是由于线性计算的需求较为普遍,因此 Pytorch 也直接提供了封装好的线性层模块,按理说这种封装的本质就是在内部实现上用 nn.Parameter 定义权重(weight)和偏置(bias,可选),同时封装“输入特征与权重矩阵相乘 + 加偏置” 的计算逻辑(有待确定)。

0%