序列并行
TP 切不动的地方(LayerNorm、softmax),沿着序列长度再切一刀。长上下文时代的救生圈。
两个动机
- TP 的盲区:Megatron TP 只切矩阵乘,LayerNorm 与 Dropout 仍整份复制在 TP 组内,激活显存的"零头"随
不变。序列并行(SP)把这两块沿 维切成 份,与 TP 共用一组卡; - 超长上下文:
级时注意力激活( )与计算(预训练篇:注意力项反超参数项)都需要沿序列切分——这催生了 Ring Attention 这类以序列为主维度的并行。
机制一:Megatron 式 SP(与 TP 配对)
关键观察:TP 区域之间的边界(allreduce
- 进入 TP 区域前:allreduce 改为 reduce-scatter(每卡只留激活的
序列片); - 离开 TP 区域:identity 改为 allgather(各卡要完整序列做 LayerNorm 后的矩阵乘)。
通信总量完全不变(allreduce = reduce-scatter + allgather,集合通信篇),激活显存却省了:LayerNorm/Dropout 区域的激活从
机制二:Ring Attention(沿序列切注意力)
超长序列时把
只要单块注意力计算时间
flowchart LR
A["卡0: Q₀K₀V₀"] -- "传 K₀V₀" --> B["卡1: Q₁K₁V₁"]
B -- "传 K₁V₁" --> C["卡2: Q₂K₂V₂"]
C -- "传 K₂V₂" --> D["卡3: Q₃K₃V₃"]
D -- "传 K₃V₃" --> A环形 K/V 传递:每步传一块、算一块,
深入推导:SP 的显存节省量与 Ring Attention 的通信模型
SP 节省量。以 7B、TP=8、
Ring Attention 通信量。每卡
(据 Korthikanti et al. 2022、Liu et al. 2023。)
思考题
- SP 为什么能做到"通信量不变、显存变少"?代价是什么?
、单卡注意力激活爆炸,你的并行工具箱按什么顺序取用? - Ring Attention 的因果注意力负载不均,zigzag 分块怎么补?
参考答案
- allreduce 拆成 reduce-scatter + allgather 是恒等变换,总通信字节不变;显存少是因为激活在 LN/Dropout 区域以切片态驻留。代价:通信原语从"大块一次"变成"两段",对实现与 overlap 调度更挑剔;且 SP 度数必须与 TP 相同(共用卡)。
- 先 SP+TP(8 卡内把激活压到
)→ 激活仍不够加选择性重算(34→18 项)→ 再不够 Ring/Context Parallelism 沿序列扩卡。顺序原则:先域内零成本手段,后跨机手段。 - 把序列切成
份、交错分配(卡 拿第 与第 块),让每卡的"因果下三角"面积相等——一个对角块配一个反对角块,负载差从 降到 。
小结
- SP 与 TP 共卡:allreduce ↔ reduce-scatter+allgather 等价替换,通信不变、LN/Dropout 激活按
省。 - Ring Attention 沿序列环形传 K/V,通信藏在分块计算后面,是超长上下文的基础设施。
- SP 是激活显存公式里唯一的免费再切一刀,长上下文配置的默认件。
参考资料
- Korthikanti et al., Reducing Activation Recomputation in Large Transformer Models(arXiv 2205.05198)
- Liu et al., Ring Attention with Blockwise Transformers for Near-Infinite Context(arXiv 2310.01889)
- Li et al., Sequence Parallelism: Long Sequence Training from System Perspective(arXiv 2105.13120,另一路线 ColAI-SP)
- Jacobs et al., Deepspeed Ulysses(arXiv 2309.14509,沿头切分的序列并行)