跳转到内容

张量并行

数据并行把模型复制到多卡;张量并行(TP)把模型切开——单个矩阵乘的权重矩阵按列或按行切到多卡上,每卡算一块,结果拼起来。它是唯一能解决"单层装不下"的并行方式,也是通信最贵、最依赖节点内 NVLink 的并行方式。

TP 的动机不是"想并行",是"不切装不下"。一个大模型的单层参数:

  • 7B 模型:一层 ~50 MB——单卡轻松
  • 175B 模型(GPT-3 级):一层 ~1.2 GB——还好
  • 但加上激活、优化器状态后,千亿模型的单层前向激活就能超过 80 GB 单卡

更硬的约束是单卡的计算时间:batch 拉满后单卡算一层仍然太慢,MFU 上不去(长序列场景尤甚)。TP 把单层的计算与显存都摊到多卡上——这是 DP 做不到的(DP 只能摊 batch,不能摊层)。

Transformer 的核心是 MLP:Y=GELU(XA) B\text{MLP}: Y = \text{GELU}(XA)\,B 和 Attention\text{Attention}。Megatron-LM 的经典切法:

列切(column-parallel):权重 AA 按列切成 A=[A1,A2]A = [A_1, A_2],每卡算自己的列:

XA=[XA1, XA2](各卡独立计算,无需通信)XA = [XA_1,\ XA_2] \quad \text{(各卡独立计算,无需通信)}

行切(row-parallel):接着权重 BB 按行切,每卡用自己那份列切的输入算自己的部分和:

XB=X1B1+X2B2(需要 all-reduce 求和)XB = X_1B_1 + X_2B_2 \quad \text{(需要 all-reduce 求和)}

MLP 的标准组合:列切 + 行切,一层只在结尾做一次 all-reduce。通信量:

每次 all-reduce=2×p−1p×激活大小\text{每次 all-reduce} = 2 \times \frac{p-1}{p} \times \text{激活大小}

每层前向 + 反向共 4 次(前向 1、反向 1、每半各一),以 7B 模型、batch 8、seqlen 4096 计,每层 all-reduce ~100+ MB——每层都通信、GB 级累计、延迟敏感,这就是 TP 必须待在 450 GB/s 的 NVLink 域内的原因(跨机 IB 上一算就慢 10 倍)。

Attention 同理:Q/K/V 投影列切(多头天然按头切分),输出投影行切。多头注意力的"头"维度就是现成的切分维度——8 头切 8 卡,每卡算自己的头,最后 output 投影处 all-reduce。

把 TP 的每层通信需求算成对带宽的硬要求。TP=8 时每卡每步的通信时间:

Tcomm=4×p−1p×SlayerBT_{\text{comm}} = 4 \times \frac{p-1}{p} \times \frac{S_{\text{layer}}}{B}

要 TP 不拖慢计算(通信时间 < 计算时间的 20%),反解出带宽下限:

TP 度激活大小(7B,batch 8,4096)需要带宽对应硬件
2~25 MB~200 GB/sNVLink 够
8~100 MB~450 GB/s恰好 NVLink 域内
16+~200 MB~900 GB/sNVLink5/NVL72 或跨机不可行
跨机同上—慢 10 倍,❌

TP 的可行域 = NVLink 域(8 卡传统,Blackwell NVL72 扩到 72 卡)。这个结论反过来塑造了集群设计:节点内 NVLink 带宽是"买 TP 度"的钱。

TP 有个隐藏浪费:LayerNorm 和 Dropout 的激活不分片(每卡全量)。序列太长时这部分撑爆显存。Megatron-SP(Sequence Parallelism)把这部分按序列维度切开,与 TP 的 all-reduce 互相转换:

TP 区域(按 hidden 切) ←all-reduce/gather→ SP 区域(按 seqlen 切)

all-reduce 拆成 all-gather + reduce-scatter,恰好完成两种切法的转换,通信量不增。这是长序列训练的标准配置:TP + SP 总是成对出现。

  • TP 度的选择:能小则小(2、4、8),TP 每加一倍,通信翻倍、单卡计算减半——在"装得下"的前提下选最小的 TP
  • Megatron vs FSDP 的分工:TP 切层内,FSDP/ZeRO 切层间(优化器状态),两者正交可叠加
  • 词表与 embedding:词表维度(15 万 × hidden)也是显存大户,Megatron 按词表切 embedding(Vocab-Parallel)
  • 调试:TP 数值等价性易碎(all-reduce 顺序影响浮点求和),切分后 loss 与单卡基线应有微小但稳定的差异,突然变大就是切分 bug
场景建议
7B 以下,单卡 80 GB不用 TP,ZeRO-2/FSDP 就够
13–70B,单卡装不下但层装得下FSDP 优先;MFU 低再考虑 TP=2/4
70B+,单层激活撑爆显存TP=4/8 必备,配 SP
千亿+,节点内都装不下单层TP=8 + 更大互联域(NVL72)或改用 PP
长序列(32k+)TP+SP 标配,或上下文并行
  • TP 是唯一能切"单层"的并行:列切 + 行切的组合让 MLP/Attention 每层只通信一次 all-reduce。
  • 多头注意力的头维度是天然的 TP 切分维度。
  • 每层通信 GB 级累计、延迟敏感,TP 的可行域 = NVLink 域(8 卡或 NVL72)。
  • Megatron-SP 按 seqlen 切 LayerNorm/Dropout 激活,与 TP 成对出现、通信量不增。
  • TP 度能小则小:"装得下"前提下选最小值;TP 每加一倍通信翻倍。
  • TP 与 FSDP 正交可叠加:TP 切层内,FSDP 切层间。