MindSpeed LLM长序列并行指南:Ring Attention与Ulysses上下文并行详解
【免费下载链接】MindSpeed-LLM昇腾LLM分布式训练框架项目地址: https://gitcode.com/Ascend/MindSpeed-LLM
MindSpeed LLM是昇腾 NPU 上的 LLM 分布式训练框架,其上下文并行(Context Parallel,CP)能力专门解决长序列训练难题:通过Ring Attention与Ulysses两大算法,把超长序列切分到多卡并行计算,让 128K 甚至更长的序列训练变得可行。本文面向新手,讲清两种长序列并行方案的原理差异、核心参数与最佳实践。
为什么长序列训练这么难?
随着会话式 AI、长文档摘要、代码库理解等场景普及,训练序列长度从 4K 一路飙升到 128K 以上。麻烦在于:
- 显存爆炸:自注意力矩阵随序列长度 S 呈O(S²)增长,单卡根本放不下;
- 传统并行不覆盖序列维:数据并行、张量并行、流水线并行都不切分序列维度,S 变大时单步显存依然失控。
因此需要一种沿序列维度切分的并行方式,这就是上下文并行(CP)要解决的问题。
两大上下文并行算法:Ring Attention vs Ulysses
MindSpeed LLM 提供多种 CP 算法,其中最具代表性的是megatron_cp_algo(Ring Attention)和ulysses_cp_algo(Ulysses),通过参数--context-parallel-algo一键切换。
🔄 Ring Attention:环状分块 KV 通信
Ring Attention 借鉴分块 Softmax 原理,把序列切成 N 块,每块由一个 CP rank 持有本地 QKV。计算时各 rank 先做本地 attention,再通过环状(Ring)通信把 KV 块逐段传给下一个 rank,边传边算,循环一轮后得到全局完整结果。核心特点:
- 通信与计算可互相掩盖:KV 块在环上传递的同时本地 attention 继续算,通信开销几乎被"藏"掉;
- 无需数据拼接:全程分块计算,支持的理论序列长度近乎无限;
- 无头维整除约束:不要求 head_size 能被 cp_size 整除,适配性广;
- 要求FlashAttention 必须开启,且序列分块足够长才能掩盖好通信。
核心实现在 AttentionWithCp,其中前向过程会构建内外两个 Ring P2P 通信结构,按 rank 顺序逐块取 KV 并更新 softmax 归一化因子。参数注册与合法性校验集中在 context_parallel_feature.py,例如 CP 不支持 ALiBi 位置编码、推理 KV Cache 等组合会被直接拦截。
🚀 Ulysses:All-to-All 序列-头转置
Ulysses 的思路完全不同:每个 rank 持有完整序列,但只负责 1/N 的注意力头。每层 attention 前后各做一次all-to-all通信,把"切序列"的布局转成"切头"的布局来计算,算完再转回来。特点:
- 通信量与序列长度解耦,CP 较小时(经验上 CP ≤ 4)通信占比低,吞吐更高;
- 对注意力头数量有整除要求(头数需能被 cp_size 整除);
- 框架内置
--kv-head-repeat-before-uly-alltoall开关,支持 GQA/MQA 模型在 all-to-all 前扩展 KV 头,见 ulysses_context_parallel.py。
一图看懂:两种方案怎么选?
| 维度 | Ring Attention(megatron_cp_algo) | Ulysses(ulysses_cp_algo) |
|---|---|---|
| 切分方式 | 每 rank 持有序列分块,环传 KV | 每 rank 持有全序列,切注意力头 |
| 通信模式 | P2P 环状逐块传递(可重叠计算) | 每层两次 all-to-all |
| 头数整除要求 | 无 | 需 head 数被 cp_size 整除 |
| 适合场景 | CP 较大、超长序列(32K/128K+) | CP 较小(≤4)、序列中等偏长 |
| 显存/延迟特点 | 通信延迟略高但可掩盖 | CP 小时延迟更低、吞吐更高 |
官方长序列微调文档中也有实测佐证:Llama2-7B、32K 序列、TP2/CP4 配置下,Ulysses 吞吐 192.3 TFLOP/s/GPU,高于 Ring 的 102.7 TFLOP/s/GPU,详见 fine-tuning-with-context-parallel.md。
快速上手:关键参数与配置方法
一键开启上下文并行步骤
- 设置并行规模与算法:
--context-parallel-size(CP 卡数)+--context-parallel-algo; - 对齐序列长度:
--seq-length必须能被 cp_size 整除; - 选择掩码类型:训练建议
--attention-mask-type causal; - 开启通信优化:
--use-cp-send-recv-overlap让 send/recv 重叠。
最快配置方法:参数速查表
| 参数 | 说明 |
|---|---|
--context-parallel-size | CP 并行卡数,默认 1 |
--context-parallel-algo | 可选megatron_cp_algo(Ring)/ulysses_cp_algo/hybrid_cp_algo/kvallgather_cp_algo等 |
--seq-length | 序列总长度,需被 cp_size 整除 |
--attention-mask-type | causal(倒三角,推荐)或general(全量) |
--use-cp-send-recv-overlap | 建议开启,掩盖 CP 通信延迟 |
--cp-window-size | Ring 窗口大小,默认 1 |
典型超长序列训练配置示例:
--seq-length 131072 \ --context-parallel-size 8 \ --context-parallel-algo megatron_cp_algo \ --attention-mask-type causal \ --use-cp-send-recv-overlap实战避坑:让长序列并行跑出最佳性能
📌分块长度别太小:Ring Attention 的通信掩盖依赖足够长的计算块。经验法则是seq-length / context-parallel-size > 8K,否则 8K 以下短分块会导致通信反而慢于计算,得不偿失。
📌Mask 选 causal:GPT 类模型训练场景默认用causal,性能与显存都优于general全量计算。
📌FlashAttention 是硬依赖:开启 CP 时必须同时开启 Flash Attention 特性,否则功能不可用。
📌组合约束要留意:CP 与 ALiBi 位置编码、KV Cache、超长滑窗等互斥;DeepSeek V4 类模型需使用kvallgather_cp_algo或deepseek_v4_cp_algo,这些都会在参数校验阶段给出明确报错(见 validate_args)。
📌打包微调场景:多样本 pack 训练时配合--reset-position-ids与--reset-attention-mask,让 attention mask 按 EOD 分句生成锯齿状掩码,与 CP 分块计算正确配合,方法详见 长序列微调文档。
相关代码与文档在哪里?
- 官方文档(Ring Attention 原理与使用):docs/zh/pytorch/features/mcore/ring-attention-context-parallel.md
- 长序列 CP 微调指南:docs/zh/pytorch/features/mcore/fine-tuning-with-context-parallel.md
- CP 特性入口与参数定义:mindspeed_llm/features_manager/context_parallel/context_parallel_feature.py
- Ring Attention 核心算子:mindspeed_llm/core/context_parallel/ring_context_parallel.py
- CP 数据切批工具:mindspeed_llm/core/context_parallel/get_batch_utils.py
- Ulysses 特性封装:mindspeed_llm/features_manager/context_parallel/ulysses_context_parallel.py
总结
MindSpeed LLM 的上下文并行让长序列训练不再是显存噩梦:Ring Attention以环状 KV 通信 + 计算掩盖取胜,适合 CP 较大、序列超长的大规模场景;Ulysses以 all-to-all 转置取胜,CP 较小时延迟更低、吞吐更高。记住三条经验——序列分块大于 8K、Mask 用 causal、FlashAttention 必开,就能在昇腾集群上稳定跑通 128K 级别的长序列训练。
【免费下载链接】MindSpeed-LLM昇腾LLM分布式训练框架项目地址: https://gitcode.com/Ascend/MindSpeed-LLM
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考