long-context-attention

GitHub
660 79 较难 1 次阅读 2天前Apache-2.0开发框架语言模型
AI 解读 由 AI 自动生成,仅供参考

long-context-attention(又名 YunChang)是一款专为长上下文大语言模型训练与推理设计的开源加速工具。它提出了一种“统一序列并行”(USP)机制,巧妙融合了 DeepSpeed-Ulysses 和 Ring-Attention 两种主流分布式注意力算法的优势,旨在突破现有技术在处理超长文本时的性能瓶颈。

传统方案往往面临两难:Ulysses 虽计算高效,但受限于注意力头数量,难以适配 GQA 或 MQA 等现代架构;Ring-Attention 虽通用性强,但在计算效率和通信带宽利用率上略显不足。long-context-attention 通过混合并行策略,既保留了对各种注意力机制的广泛兼容性,又显著提升了大规模集群下的训练速度与稳定性,有效避免了通信死锁风险。

该工具特别适合从事大模型研发的工程师、算法研究人员以及需要优化长文本处理性能的 AI 开发者。其技术亮点在于灵活适配多种硬件环境:不仅支持 NVIDIA H100/A100 等 GPU 上的 FlashAttention V2/V3 加速,还能为不支持 FlashAttention 的 NPU 提供基于 PyTorch 的基础实现。作为已被 NVIDIA TransformerEngine 集成的成熟方案,long-context-attention 为构建高效、可扩展的长上下文模型提供了坚实的技术底座。

使用场景

某大型金融科技公司正在训练一款需要处理百页法律合同与长周期市场报告的生成式 AI 模型,团队试图在有限的 GPU 集群上扩展上下文窗口至 128k。

没有 long-context-attention 时

  • 架构兼容性差:由于模型采用了高效的 GQA(分组查询注意力)架构,传统的 DeepSpeed-Ulysses 因并行度受限于头数而无法启用,导致无法利用序列并行加速。
  • 训练效率低下:若强行使用 Ring-Attention 替代,其分块计算机制导致 FlashAttention 利用率下降,即使重叠通信与计算,总耗时仍显著高于理论最优值。
  • 大规模部署风险高:Ring-Attention 依赖的异步点对点通信在跨节点大规模扩展时带宽利用率低,且极易引发通信死锁,导致训练任务频繁中断。
  • 资源扩展受限:为了规避上述问题,团队不得不减少单卡显存占用或缩小模型规模,牺牲了模型对长文档的理解能力。

使用 long-context-attention 后

  • 完美支持先进架构:long-context-attention 通过混合并行策略,打破了对注意力头数的限制,使 GQA 和 MQA 模型也能顺畅运行序列并行。
  • 性能显著提升:该工具融合了 Ulysses 的计算高效性与 Ring 的显存优势,在保持 FlashAttention 满血运行的同时,大幅缩短了每步训练时间。
  • 通信稳定可靠:采用更优化的集体通信模式替代异步点对点传输,不仅提升了带宽利用率,还彻底消除了大规模集群下的死锁隐患。
  • 硬件适配灵活:无论是支持 FA v3 的 H100 集群,还是仅支持 FA v2 的 A100 甚至部分 NPU 设备,都能通过配置参数获得最佳的注意力计算方案。

long-context-attention 通过统一序列并行技术,让团队在不改变模型架构的前提下,实现了超长上下文训练的高效、稳定与低成本落地。

运行环境要求

操作系统
  • Linux
GPU
  • 必需
  • 支持 NVIDIA GPU (A100, H100, B100, L40, L20) 和 AMD GPU
  • H100/B100 需支持 FlashAttention v3
  • A100/L40 需支持 FlashAttention v2
  • 也支持不支持 FA 的 NPU (使用 Torch 后端,但不支持反向传播)
  • 未明确具体显存大小,但针对长上下文训练通常需大显存
内存

未说明

依赖
notes1. FlashAttention 是最关键的外部依赖,安装错误常源于此。根据硬件不同需选择 FA v2、v3 或不安装 (NPU 场景)。 2. 若使用 NPU 且无 FlashAttention 支持,需设置 attn_type=AttnType.TORCH_EFFICIENT,但注意该模式不支持反向传播 (backward pass)。 3. 在 Megatron-LM 中使用因果掩码 (causal mask) 的负载均衡 Ring Attention 时,必须预先对输入 Token 和 RoPE 参数进行重排序。 4. 支持混合序列并行 (Unified Sequence Parallelism),结合了 Ulysses 和 Ring-Attention 的优势,适用于长上下文 LLM 训练和推理。
python未说明
torch
flash-attn (2.6.x, 2.7.x, 或 v3 beta)
SpargeAttn (可选)
SageAttention (可选)
FlashInfer (可选)
long-context-attention hero image

快速开始

YunChang:一种统一的序列并行(USP)注意力机制,用于长上下文大模型的训练和推理。

[技术报告] USP:一种适用于长上下文生成式 AI 的统一序列并行方法

本仓库提供了一种序列并行方法,它融合了两种流行的分布式注意力机制——DeepSpeed-Ulysses-Attention 和 Ring-Attention 的优势,从而具备更通用、更强的适应性以及更好的性能。该项目基于 zhuzilin/ring-flash-attention 构建,并参考了 DeepSpeed-Ulysses 的实现。

USP 已被应用于 NVIDIA/TransformerEngineAttnFuncWithCPAndKVP2P 中。您可以在 API attn_forward_func_with_cp 中使用它。

为什么不能单独使用 Ulysses 和 Ring Attention?

  • Ulysses 对注意力头的数量较为敏感。其并行度不能超过头数,因此不适用于 GQA(分组查询注意力)和 MQA(多查询注意力)场景。例如,当只有一个注意力头时,Ulysses 无法有效工作。此外,由于张量并行也需要在头数维度上进行划分,因此要实现 Ulysses 与张量并行的兼容性较为困难。

  • 在计算和通信效率方面,Ring-Attention 低于 Ulysses。Ring-Attention 将 Query、Key 和 Value(QKV)分割成较小的块,这可能导致在使用 FlashAttention 时效率下降。即使通信和计算过程完全重叠,总执行时间仍会落后于 Ulysses。此外,Ring-Attention 使用异步点对点通信,不仅带宽利用率低于集体通信方式,而且在大规模部署中还存在潜在的通信死锁风险。

LongContextAttention,又称统一序列并行和混合序列并行

LongContextAttention 是一种 统一的序列并行,也称为 混合序列并行,它结合了 DeepSpeed-Ulysses-Attention 和 Ring-Attention 的优点,从而克服了这两种方法各自的局限性。

1. 安装

FlashAttention 是最重要的外部依赖项,也是安装和使用 yunchang 时经常出错的原因。Yunchang 支持 flash_attn 2.6.x 和 2.7.x 版本,包括 v3 和 v2 版本。此外,yunchang 还支持在没有 flash_attn 的情况下运行,这非常适合 NPU 设备。

如下图所示,根据是否使用 flash_attn,有三种使用方法:

  1. 对于 H100、B100 等支持 FA v3 的硬件,ring_flash_attn 使用 FA v3。

  2. 对于 A100、L40 等支持 FA v2 的硬件,ring_flash_attn 使用 FA v2。

  3. 对于 NPU 等不支持 FA 的硬件,可以使用 PyTorch 实现注意力计算。在这种情况下,无需安装 flash_attn,应使用 LongContextAttention(ring_impl_type="basic", attn_type=AttnType.TORCH_EFFICIENT)注意:AttnType.TORCH_EFFICIENT 不支持反向传播。

选项 1:通过 pip 安装

pip install flash-attn

pip install yunchang

应用 FlashAttention V3:由于 FA V3 处于测试版发布阶段,您需要从源代码安装 FlashAttention V3。

请按照 FlashAttention 测试版发布 的说明,为 NVIDIA Hopper GPU 安装 V3 版本。我们采用了 2024 年 11 月 10 日的提交 b443207c1fc4c98e4532aad4e88cfee1d590d996

选项 2:本地构建

pip install .

AMD GPU 的安装:install_amd.md

2. 使用

请参阅 test/test_hybrid_qkvpacked_attn.pytest/test_hybrid_attn.py 了解具体用法。

简而言之,我们以 zigzag 式的环形注意力实现为例:

  1. 调用 set_seq_parallel_pg 设置进程组。
  2. 使用 zigzag_extract_local 提取局部张量。为了使环形注意力负载均衡,我们需要对输入 token 或输入张量进行重新排序。
  3. 然后将 LongContextAttention(ring_impl_type="zigzag") 作为注意力实现的直接替代品使用。
from yunchang import (
    AsyncLongContextAttention,
    LongContextAttention,
    set_seq_parallel_pg,
    EXTRACT_FUNC_DICT
)
from yunchang.kernels import AttnType

sp_ulysses_degree = 2
sp_ring_degree = 4

# 支持 world_size = 8
set_seq_parallel_pg(sp_ulysses_degree, sp_ring_degree, rank, world_size)

# attn_type 可以是 FA、FA3 或 TORCH_EFFICIENT。
longctx_attn = LongContextAttention(ring_impl_type="zigzag", attn_type=AttnType.FA)

# 如果您使用的是不支持 flash_attn 的 NPU,可以使用以下代码。
# LongContextAttention(ring_impl_type="zigzag", attn_type=AttnType.TORCH_EFFICIENT)

# 提取全局 Q、K、V 的局部片断。
local_q = EXTRACT_FUNC_DICT["zigzag"](
        Q, rank, world_size=world_size, rd=sp_ring_degree, ud=sp_ulysses_degree
    ).detach().clone()
...

local_out = usp_attn(
        local_q,
        local_k,
        local_v,
        dropout_p=dropout_p,
        causal=True, # zigzag 和 stripe 是针对 causal=True 的负载均衡策略
        window_size=window_size,
        softcap=0.0,
        alibi_slopes=alibi_slopes,
        deterministic=deterministic,
        return_attn_probs=True,
    )

3. 测试

如果您尚未安装 yuanchang,请将项目根目录添加到 PYTHONPATH:

export PYTHONPATH=$PWD:$PYTHONPATH
  • FlashAttn/Torch 测试
torchrun --nproc_per_node=4 ./test/test_hybrid_attn.py --sp_ulysses_degree 2 --ring_impl_type "zigzag" --causal --attn_impl fa --use_bwd
torchrun --nproc_per_node=4 ./test/test_hybrid_attn.py --sp_ulysses_degree 2 --ring_impl_type "zigzag" --causal --attn_impl torch
torchrun --nproc_per_node 8 test/test_hybrid_qkvpacked_attn.py
  • Sage/SpargeAttention 测试(仅前向传播,非因果)

您需要从源码安装 SpargeAttnSageAttention

torchrun --nproc_per_node=4 ./test/test_hybrid_attn.py --sp_ulysses_degree 2 --attn_impl sage_fp8
torchrun --nproc_per_node=4 ./test/test_hybrid_attn.py --sp_ulysses_degree 4 --attn_impl sparse_sage --sparse_sage_tune_mode
  • FlashInfer 测试(仅前向传播)

请从 这里 安装 FlashInfer。

torchrun --nproc_per_node=4 --master_port=1234 ./test/test_hybrid_attn.py --sp_ulysses_degree 2 --ring_impl_type 'basic_flashinfer' --attn_impl flashinfer

4. 在 Megatron-LM 中验证

数据并行(DP)和统一序列并行(ulysses=2+ring=2)的损失曲线非常接近,如图所示。这一对齐结果证实了统一序列并行的准确性。

当使用负载均衡环形注意力机制并施加因果掩码时,必须使用 EXTRACT_FUNC_DICT 函数对 Query 张量进行重新排序。

在 Megatron-LM 中,您可以在将输入标记送入模型之前对其进行重新排序,并对 RoPE 参数应用相同的重新排序。有关详细说明,请参阅我们的论文。

有关示例实现,您可以查看此 PR,其中将 USP 集成到了 BAAI 的 Megatron-LM 框架中。

6. 基准测试

bash ./scripts/run_qkvpack_compare.sh

在一台 8xA100 NVLink 机器上,基准测试结果如下:

在一台 8xL20 PCIe 机器和一台 4xA100 PCIe 机器上,基准测试结果如下:

一些结论:

  1. 如果头数足够多,Ulysses 的性能优于 Ring-Attention。Ulysses 的 All-to-All 通信在单机内非常高效,开销比例极低。相比之下,Ring 将计算和通信分开,这增加了总的计算时间,即使完全重叠,其速度也仍慢于 Ulysses。

  2. QKV 打包版本(LongContextAttentionQKVPacked)比 QKV 非打包版本(LongContextAttention)更好,且随着序列长度的缩短,这种差异更加明显。MAQ 和 GQA 只能使用非打包版本。

  3. 在 Ring-Attention 的不同实现变体中,zigzagstripe 的性能优于 basic。通常情况下,zigzag 略好于 stripe,但随着序列长度的增加,zigzag 和 stripe 之间的差异变得不那么明显。值得注意的是,zigzag 和 stripe 对序列维度都有特定的布局要求。

  4. 混合并行性在异构网络设备上表现良好。例如,在 8-GPU L20 配置中,当 ulysess_degree 设置为 2、ring_degree 设置为 4 时,可达到最佳性能。

7. 4D 并行的最佳实践

我们在一篇技术报告中分析了将序列并行引入数据并行/ZeRO 并行/张量并行/流水线并行的影响,该报告可在 这里 查阅。

以下列出了一些最佳实践:

  1. 我们建议使用统一序列并行(Unified-SP)代替 SP-Ring 和 SP-Ulysses,因为它兼具两者的功能,并提供更多优势。

  2. 数据并行(DP)与序列并行(SP):我们建议尽可能优先使用 DP,只有在批量大小(bs)不足以进行划分时,才考虑是否采用 SP。

  3. 使用 SP 时,应始终与 ZeRO-1/2 结合使用。

  4. 统一序列并行的通信成本低于 Megatron-LM 序列并行下的张量并行!您可以使用统一序列并行来替代张量并行,以获得更好的速度。然而,目前将张量并行切换为 SP+ZeRO2 并不能增加训练中的序列长度。而 SP+ZeRO3 则可以训练与 TP-sp 相似的序列长度。我们建议,在采用 GQA 时,SP 在通信成本方面可能比 TP 更具优势,因为 GQA 可以降低 SP 的通信成本,同时不影响 TP。

  5. 可以设置更高的 SP 并行度,这可能需要在头数有限的情况下设置较大的 ring degree,以便在更多计算设备上训练长序列。但 TP 却无法设置较高的并行度。

8. 应用 USP 的项目

我很荣幸本仓库已为以下项目做出了贡献:

  1. xdit-project/xDiT
  2. NVlabs/VILA
  3. feifeibear/Odysseus-Transformer
  4. Ascend/AscendSpeed
  5. jzhang38/EasyContext
  6. FlagOpen/FlagScale
  7. zhiyuanhubj/LongRecipe
  8. NVIDIA/TransformerEngine
  9. xdit-project/mochi-xdit

9. 引用我们

USP:一种用于长上下文生成式 AI 的统一序列并行方法

@article{fang2024unified,
  title={A Unified Sequence Parallelism Approach for Long Context Generative AI},
  author={Fang, Jiarui and Zhao, Shangchun},
  journal={arXiv preprint arXiv:2405.07719},
  year={2024}
}

版本历史

0.6.42026/01/13
0.6.3.post12025/04/21
0.6.32025/04/18
0.6.22025/04/08
0.6.12025/03/20
0.6.02024/12/26
0.5.12024/12/26
0.5.02024/12/11
0.4.32024/12/05
0.4.22024/11/19
0.4.12024/11/15
0.4.02024/11/15
0.3.52024/09/19
0.3.22024/09/19
v0.3.12024/09/14
v0.32024/08/27
v0.22024/06/25
v0.12024/04/11

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|4天前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|5天前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

149.5k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|今天
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|昨天
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|4天前
插件开发框架