大模型序列长度日益增加:GPT4o 128k,Claude3 200k,Gemini-1.5 Pro 2M
长序列训练的瓶颈:分布式的 Attention 计算很慢

ByteScale:主要解决的问题是,如何提高 “由短序列拼成的长序列“ 的训练效率(sequence packing),提出了 Hybrid Data Parallism(HDP)
TP + SP(Sequence-Parallel)

TP 下的 MLP 和 Attention 计算流
DeepSpeed Ulysses:https://zhuanlan.zhihu.com/p/4496065391
Attention 层内是切 head,Attention 层外是切序列
优缺点:通信量小。但序列并行在 attention 里面是和 tp 一起去切 head,对 GQA 不友好

Colossal AI 的 Ring Attention 方案:https://zhuanlan.zhihu.com/p/689067888
每个节点接收临近的 $k_i$,然后计算 $qk_i^T$,然后 allgather 得到 $qk^T$
每个节点接收临近的 $v_i$,然后计算 $f(qk^T)v_i$,然后 allgather 得到 output
优缺点:不受 head 数限制。通信量更大

Nvidia mCore Context Parallel(CP):https://docs.nvidia.com/megatron-core/developer-guide/latest/api-guide/context_parallel.html
从原理上基本等于 SP + CP(在 Ring-Self-Attention 基础上有一些额外优化)
前向的 AG 是为了收集完整的 KV 序列,对应其反向的 RS
图中反向的额外 AG (Attn ouput 之前那个)是用于从切分后的 KV 做重计算,为了减少激活内存占用

AG/RS 在唤醒拓扑下,可以用点对点通信实现
1)Imbalanced Computation
通常情况下,8k/32k 等训练长度,一般都是多个样本(sample) 拼在一起得到一个序列(sequence),这个过程叫 sequence packing
但由于 Attention 的 O(n^2) 计算量,如果 packing 到一个序列中的 sample 有长有短, 那整个序列的计算时间其实会浮动的。例如,由 2 个 16k 拼成的 32k,计算时间会比 32 个 1k 拼成的 32k 序列计算时间更长。


这可能会导致下图的 dp bubble(快的 dp 组要等慢的 dp 组)。其中可以看到,第一个 dp 组的 pp bubble 明显也比第二个 dp 组的更长

2)Redundant Communication