Skip to content

TP(Tensor Parallelism) ​

Tensor Parallelism(TP)在每个 Transformer Layer 内切分权重、激活和计算,由多个 TP Rank 共同完成同一批 token 的前向计算。Dense Transformer 的 Attention 和 MLP 通常都采用“Column Parallel 切分中间特征,Row Parallel 归并输出”的 Megatron-LM 风格。

下文只讨论 Dense Decoder Layer 的前向计算,设 T=B×S 为 token 数,H 为隐藏维度,p 为 TP Degree。

1. Column Parallel 与 Row Parallel ​

对线性层 Y=XW,Column Parallel 沿权重的输出维度切分:

W=[W0,…,Wp−1],Yr=XWr

每个 Rank 只生成一部分输出特征,完整结果在逻辑上为 Y=Concat(Y0,…,Yp−1)。如果后续算子能直接消费同样的分片,不需要立即 All-Gather。

Row Parallel 沿矩阵乘的归约维度 K 切分输入和权重:

X=[X0,…,Xp−1],W=[W0⋮Wp−1]Y=XW=∑r=0p−1XrWr

每个 Rank 计算形状与 Y 相同的局部部分和,再通过 All-Reduce Sum 得到完整输出。

2. Attention ​

设输入 X∈RT×H,Query Head 数为 hq,KV Head 数为 hkv,Q/K Head Dimension 为 dk,Value Head Dimension 为 dv。多数 LLM 中 dk=dv=dh。

2.1 Q/K/V/O 的维度关系 ​

四个投影矩阵的形状为:

权重形状投影或输入形状
WQH×(hqdk)Q:[T,hq,dk]
WKH×(hkvdk)K:[T,hkv,dk]
WVH×(hkvdv)V:[T,hkv,dv]
WO(hqdv)×HZ:[T,hqdv]

推导的核心是:Attention 按 Query Head 独立计算。令 GQA 的共享比例为 g=hq/hkv,第 i 个 Query Head 使用第 ⌊i/g⌋ 个 KV Head:

Zi=Softmax(QiK⌊i/g⌋Tdk)V⌊i/g⌋,Zi∈RT×dv

KV Head 可以被多个 Query Heads 共享,但每个 Query Head 都产生一个独立的 dv 维输出。因此完整 Attention 输出为:

Z=Concat(Z0,…,Zhq−1)∈RT×(hqdv)

所以 WO 的输入维度由 hq 决定,而不是由 hkv 决定。

2.2 Q/K/V 投影按 Head 切分 ​

Q/K/V 投影使用 Column Parallel:

WQ=[WQ(0),…,WQ(p−1)],Qr=XWQ(r)

WK 和 WV 使用相同切分。当 Head 数可整除 p 时,每个 Rank 持有 hq/p 个 Query Heads 和 hkv/p 个 KV Heads:

text
Q_r: [T, h_q  / p, d_k]
K_r: [T, h_kv / p, d_k]
V_r: [T, h_kv / p, d_v]

不同 Query Heads 的 Attention 计算之间没有数据依赖。只要共享同一 KV Head 的 Query Heads 与该 KV Head 位于同一 Rank,各 Rank 就可独立执行 RoPE、Attention Score、Softmax 和 Value 加权。因此 Q/K/V 投影和 Attention 核心计算之间不需要 TP 集合通信;KV Heads 被切分时,KV Cache 也按本地 KV Heads 分片。

2.3 本地 Head Concat 与 Output Projection ​

Attention 为每个本地 Query Head 产生输出 Zr,j∈RT×dv。在进入本地 WO 前,需要沿 Head 维连接这些输出:

Zr=Concat(Zr,0,…,Zr,hq/p−1)∈RT×(hqdv/p)

这是 Rank 内部的语义操作,不涉及 TP 集合通信。实现通常已经将本地 Heads 存在同一个张量中,因此不需要逐 Head 调用 concat,而是通过布局转换和 reshape 将 Head 维展平到 GEMM 的归约维:

text
[B, h_q / p, S, d_v]
  → transpose
[B, S, h_q / p, d_v]
  → reshape
[T, h_q d_v / p]

输出布局连续时可能只需要 reshape;否则需要 transpose + contiguous,Fused Attention Kernel 也可直接产生适合 Output Projection 的布局。

局部 Concat 完成后,不需要收集其他 Rank 的 Heads。将 WO∈R(hqdv)×H 按对应 Query Heads 切成 Row Parallel 分片:

Z=[Z0,…,Zp−1],WO=[WO(0)⋮WO(p−1)]

则:

ZWO=∑r=0p−1ZrWO(r)

每个 Rank 先计算 Pr=ZrWO(r)∈RT×H,再对 Pr 执行 All-Reduce Sum。这与“Gather 所有 Heads → 乘完整 WO”数学等价;输出 Bias 应在归并后只加一次。

GQA/MQA 的 KV Head 数可能小于 TP Degree。此时框架需要复制 KV Heads,或限制 p 必须整除 hkv;具体策略取决于实现。

3. MLP ​

以 SwiGLU MLP 为例,中间维度为 F:

G=XWgate,U=XWup,Z=SiLU(G)⊙U,Y=ZWdown

Wgate,Wup∈RH×F 使用 Column Parallel,且必须沿相同的 F 区间切分:

Gr=XWgate(r),Ur=XWup(r),Zr=SiLU(Gr)⊙Ur

这样 SwiGLU 的激活和逐元素乘法都可在本地完成,Zr∈RT×(F/p) 无需 All-Gather。

Wdown∈RF×H 使用 Row Parallel,每个 Rank 持有 Wdown(r)∈R(F/p)×H:

Pr=ZrWdown(r),Y=AllReduceSum(Pr)

张量并行:MLP 列切分、行切分与层内归并

4. 通信与约束 ​

经典 TP 布局中,每个 Rank 在 Decoder Layer 输入处持有完整 X。前向通信边界为:

模块Column Parallel本地计算Row Parallel归并
AttentionQ/K/V Projection本地 Heads AttentionOutput Projection1 次 All-Reduce
MLPGate/Up ProjectionSwiGLUDown Projection1 次 All-Reduce

因此一个标准 Decoder Layer 通常有两次 TP All-Reduce。归并后的激活在各 Rank 上一致,Residual Add 和 RMSNorm 可以本地执行。

与 Sequence Parallel 组合时,Row Parallel 后的 All-Reduce 可拆成 Reduce-Scatter,使各 Rank 只保留一段 token 激活;在下一个需要完整 token 输入的 Column Parallel 前再执行 All-Gather。

TP 还有以下实现约束:

  • hq、hkv 和 F 通常需要与 TP Degree 兼容。
  • 量化 Group Size、Fused QKV 布局和 SwiGLU Gate/Up 排列必须与分片边界对齐。
  • TP Degree 越大,每个 Rank 的 GEMM 越小,集合通信占比越高;TP Group 通常优先放在 NVLink/NVSwitch 等高速互联域内。

5. 参考 ​

  1. Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism
  2. NVIDIA Megatron Core:Parallelism Strategies Guide
  3. Hugging Face Transformers:Llama Tensor Parallel Plan