跳到正文
vLLM Blog· Tencent Hunyuan AI Infra Team and vLLM Team·· 2026-07-06精选AI 评分62

腾讯混元 HPC-Ops 的 Attention 与 MoE 后端合入 vLLM 主干

vLLM × HPC-Ops: High-Performance Attention and MoE Backends from Tencent Hunyuan

AI 导读

腾讯混元 AI Infra 团队将 HPC-Ops 的 Attention 与 MoE 内核合入 vLLM 主干,成为一等后端,均针对 NVIDIA Hopper 架构优化,在 H20 上表现最佳。

推荐理由

腾讯混元把生产环境验证过的 Attention 与 MoE 内核合入 vLLM 主干,读者可据此了解混合长度解码与低延迟 MoE 的调度思路。

正文 · AI 翻译

TL;DR

来自 HPC-Ops 的 Attention 和 MoE 内核——由腾讯混元 AI Infra 团队构建的生产级算子库——现已作为一等后端进入 vLLM main 分支(Attention PR #46020、MoE PR #45924)。两者均针对 NVIDIA 的 Hopper 架构进行了优化,在 H20 上表现最强:

  • Attention:一个逐步、负载均衡的解码调度器,外加融合的 RoPE + QK-Norm + KV 写入前导。在混合长度解码上,相比静态 split-KV 调度最高提升 2.95×,相比 FlashInfer 和 FlashAttention 平均提升 2.25×。
  • MoE:一个完全融合、低延迟的 FP8 MoE 流水线。在 TP8 / EP1 下平均提升 1.59×,在 TP1 / EP8 下相比 Triton 和 CUTLASS 平均提升 1.21×,且输出质量相当。

在 8× H20 上对 Hy3 进行端到端测试,这两个后端合计相比 vLLM 默认后端将 TTFT 降低约 24%,将 TPOT 降低约 17%。

两者都通过 vLLM 的后端接口接入原生 vLLM——无需修改源码,也无需长期维护分支。

本文涵盖三件事:HPC-Ops 是什么,这两个已上游的后端如何设计与集成,以及它们在 H20 上的性能表现。

为什么这很重要

生产级 LLM 服务不再像大多数内核最初调优时那样是均匀的单轮批次。真实流量是动态且长度混合的,模型越来越多地采用带长上下文的 MoE,而智能体工作负载对两者都提出了更高要求。在这种规模下,延迟在很大程度上取决于内核如何在 GPU 上调度工作以及在阶段之间移动数据,而不仅仅是原始矩阵乘法吞吐量。在注意力解码中,固定的 split-KV 调度会因混合批次中最长的请求而停滞,同时让短请求上的计算闲置。在 MoE 中,每个专家的 GEMM 很小,而传统流水线将 token 收集到每个专家的缓冲区中,在每个阶段都要付出启动开销,并在其间通过 HBM 移动中间结果。

vLLM 已经为社区提供了一个快速、灵活的服务引擎;剩余的延迟和吞吐量取决于注意力与 MoE 内核能多好地吸收这种杂乱的真实流量。这正是 HPC-Ops 的目标——一个在腾讯大规模生产服务中经过锤炼的算子库,而服务 Hy3 的同一批内核现已作为一等 Attention 和 MoE 后端上游到 vLLM。

关于 Hy3 系列模型的简要说明

Hy3 是腾讯混元的 Mixture-of-Experts 模型,面向智能体执行、编码和长程推理。它仅激活其 295B 参数中的 21B,就达到了同尺寸级别中最强的智能体能力之一——可与大 2–3 倍的开源旗舰模型匹敌——同时大幅减少幻觉,实现更可靠的多轮使用。在底层,它使用 192 个专家、top-8 路由、GQA 注意力(64 个头、8 个 KV 头、头维度 128)、256K 上下文窗口,以及用于投机解码的 3.8B MTP 层;它以 BF16 和 FP8(Hy3-FP8)形式发布。

本文有意不讨论模型本身——而是讨论服务它的内核,接下来我们转向这一点。

HPC-Ops:一个生产级算子库,现已进入 vLLM

HPC-Ops 是一个面向 LLM 推理的开源算子库,由腾讯混元 AI Infra 团队构建并维护。它聚焦于决定实际服务延迟和吞吐的热点路径——attention、MoE、GEMM、采样、归一化以及通信-计算融合——原生支持 BF16 和 FP8,并提供简洁的 Python API,可直接接入推理框架。这些 kernel 针对 NVIDIA 的 Hopper 架构进行了优化,在 H20 上表现尤为突出。

这些 kernel 已在腾讯内部大规模混元生产服务中得到验证。在本次发布中,其中两个 kernel 已作为一等后端合入 vLLM:

vLLM 后端优化内容精度合入版本
Attention负载均衡的 decode + 融合 RoPE/QK-Norm 前导BF16 / FP8PR #46020
融合 MoE全融合低延迟 MoE 流水线FP8PR #45924

本文其余部分将聚焦这两个后端。

Attention 后端:动态负载均衡调度

挑战:每个 batch 中的变长 decode

在 decode 阶段,每个 token 生成步骤都会对请求的完整 KV cache 执行 attention。一个已累积 16K token 上下文的请求,其计算量大约是刚起步的 1K 请求的 16 倍。在生产服务中,输出长度不可预测,而连续批处理会让处于不同生成阶段的请求进入同一次 kernel 启动——因此单个 batch 中经常混合着极短和极长的序列。

现有的 decode kernel 通过固定的启动网格将工作映射到 CTA,以 KV head、请求和 split-KV 分块索引为键——而 split-KV 的拆分度必须在所有请求间保持一致,这迫使人们在两个糟糕的选项之间做选择。固定拆分数量,最长的序列就会成为瓶颈:短请求的 CTA 在很短的时间内完成并闲置。改为固定分块大小,拆分数量就必须按任何请求所需的最大值来设置,于是短请求会被空分块填充,这些分块启动后找不到工作便退出——浪费调度槽位。无论哪种方式,总 kernel 时间都由最重的 CTA 决定,而其他 CTA 则停滞,白白浪费 SM 周期。

解决方案:按步负载均衡的 decode 调度器

HPC-Ops attention 后端用扁平的持久化设计取代固定网格,它根据 batch 的实际长度分布自适应,而非依赖启动时的拆分策略,分三个阶段构建。

  • 分配。一个轻量级的 assign kernel 将每个 KV 序列切分为统一的 64-token 分块。所有 head 和请求的总分块数除以可用 CTA 数量,得到每个 CTA 的预算——即桶大小。分块按 head 主序、batch 次序遍历,并依次填入 CTA 桶中:一旦某个 CTA 的桶满了,后续分块就溢出到下一个 CTA。因此,长序列会按其长度比例拆分到多个 CTA,而短序列只贡献少量分块,不会独占一个 CTA。每个 CTA 的最小工作量下限可防止总工作量较小时过度拆分,确保分块数量保持可控,下游 combine 成本不会超过调度收益。由此得到的任务映射在每个 decode 步骤计算一次,并被该步骤中的每个 transformer 层复用,因此其开销被摊薄至接近零。
  • 计算与合并。随后运行一个持久化内核网格:每个 CTA 在其分配的任务箱上循环,取出一个任务描述符,为该分块计算注意力,将部分输出和 log-sum-exp 写入一个拆分缓冲区,然后推进到下一个任务,直到遇到终止符。由于网格是持久化的,任务之间没有重新启动的开销,波次之间也没有空闲间隙——每个 SM 在整个内核执行期间都保持饱和。最后一个轻量级的合并内核读取每个(head, request)对的分块数量,并将每个分块的部分结果归约为最终的 BF16 输出。

最终效果是,无论序列长度分布多么倾斜,所有 CTA 都承担大致相等的工作量,并几乎同时完成。静态调度中固有的长尾停顿被消除,之前浪费在空闲等待上的 GPU 周期被转化为有用的计算。

Dynamic Partitioning: Uniform Tiling and Balanced Bucketing
动态分区:均匀分块与均衡分桶

融合的注意力前奏

在注意力运行之前,每一层通常会将 QK-Norm、RoPE 和 KV 缓存写入——以及在 FP8 中的查询量化——作为独立的内存受限步骤来执行。HPC-Ops 将它们融合为单个算子(HpcRopeNorm):从融合的 QKV 投影开始,它按照模型要求的顺序应用 QK-Norm 和 RoPE(Hy3 在 RoPE 之前进行归一化),将 K 和 V 直接写入分页缓存,并且在 FP8 中,输出一个带有其缩放因子的逐 token、逐 head 的 FP8 查询,这样注意力内核就无需重新量化。一个内核取代了这些独立的启动及其在每一层注意力前奏中的 HBM 往返,无论是在预填充还是解码中。

与 vLLM 集成

HPC-Ops 注意力 API 作为原生注意力后端集成到 vLLM 中,与现有的后端如 FlashAttention 和 FlashInfer 并列。具体来说,HpcAttentionBackend 继承自 vLLM 的 AttentionBackend 基类,并通过标准后端注册机制进行注册。

MoE 后端:融合的低延迟 FP8 MoE 流水线

挑战:小型专家 GEMM 及其周边开销

MoE 推理有两种截然不同的情形。在大批量、高吞吐量时,专家 GEMM 规模较大且受计算限制,现有实现在这种情况下通常表现良好。低延迟解码则相反:每个专家只接收少量 token,因此专家 GEMM 规模小且受内存限制。针对大型矩阵乘法调优的内核在这些形状上无法充分利用 GPU,而且由于每个专家产生的分块数量各不相同且逐步变化,这些小分块很难均匀地分布到 GPU 上。

GEMM 周边的工作加剧了这一问题。传统的 MoE 路径是一系列独立内核的链条:路由 token、将它们收集到按专家划分的缓冲区、Gate-Up GEMM、激活与量化、Down GEMM,以及将 top-k 加权归约回 token 位置。收集操作在任何矩阵乘法开始之前就在 HBM 中物化了一个收集后的 token 张量,而每个阶段都要付出自己的内核启动开销和中间结果的 HBM 往返。在解码中,GEMM 本身已经很小,所有这些开销与 GEMM 工作本身叠加在一起。

解决方案:融合的 FP8 MoE 流水线

HPC-Ops MoE 后端对整个 MoE 路径进行了重新架构:路由与索引预处理、Gate-Up GEMM、激活与量化、Down GEMM 以及 top-k 加权归约被融合为一条紧凑的执行路径,消除了多阶段设计的冗余开销。

  • 路由与索引构建。 一次共享内存计数遍历将 token 分配给专家,并为每个专家分配连续的输出范围,从而减轻大 token 路由带来的全局原子操作压力,并构建 GEMM 直接使用的路由索引和逐 tile 任务映射。
  • Gate-Up GEMM。 Gate-Up GEMM 通过路由索引直接读取原始 token,跳过了独立的 gather 步骤。随后激活与 FP8 量化作为单独融合内核运行,其输出由 Down GEMM 直接读取。
  • 占用率优先,无需 warp 特化。 单个 warp 组同时处理数据搬运与计算,将内存延迟隐藏从 CTA 内软件流水线转移到跨 CTA 硬件调度,并提高每个 SM 的常驻 CTA 数量。随后启动一个持久化网格以保持每个 SM 满载,消费任务映射并将每个专家的小而不均匀的 tile 集合均匀分配到各 CTA 上。
  • PDL 链式阶段。 程序化依赖启动(Programmatic Dependent Launch)将每个内核启动与前一个内核的尾部重叠,消除阶段之间的气泡,一直延续到最终的 top-k 加权归约,后者还可以合并共享专家的输出。

这些设计共同使中间结果和启动操作远离关键路径。专家以 FP8 运行,同时支持逐张量和分块缩放,并达到与基线相当的输出质量。

与 vLLM 集成

HPC-Ops Fused MoE API 作为原生 MoE 后端集成到 vLLM 中,与 DeepGEMM 和 Triton 等现有后端并存。具体而言,HPCExperts 继承自 vLLM 的 FusedMoEExpertsModular 基类,并通过标准后端注册机制进行注册。

在 vLLM 中使用 HPC-Ops 后端

本指南介绍如何在 vLLM 中启用 HPC-Ops 后端(Attention 和 MoE)。

安装

开始之前,请从源码安装 HPC-Ops:

git clone https://github.com/Tencent/hpc-ops.git
cd hpc-ops
 
# Build and install the wheel package
make wheel
python3 -m pip install dist/*.whl

快速开始

HPC-Ops Attention 后端目前仅支持 Hy3 系列模型。

要使用 HPC-Ops Attention 后端为标准 Hy3 模型启动 vLLM 服务器,请运行:

vllm serve tencent/Hy3 \
    --tensor-parallel-size 8 \
    --attention-backend HPC_ATTN

对于 Hy3-FP8 模型,需要一些额外的选项:

vllm serve tencent/Hy3-FP8 \
    --tensor-parallel-size 8 \
    --attention-backend HPC_ATTN \
    --kv-cache-dtype fp8_e4m3 \
    --block-size 64

提示: 要为自定义模型启用 HPC-Ops Attention 后端,请在模型的 forward 方法中将 rope_norm 替换为 HpcRopeNorm。参考 PR #46020。

HPC-Ops MoE 后端仅支持 FP8 模型。

要使用 HPC-Ops MoE 后端启动 vLLM 服务器,请运行:

vllm serve tencent/Hy3-FP8 \
    --tensor-parallel-size 8 \
    --moe-backend hpc

硬件支持

HPC-Ops 后端目前仅在 NVIDIA Hopper 架构 GPU 上受支持,并在 H20 上提供最佳性能。

H20 上的性能

Fused MoE:HPC-Ops 对比 Triton / CUTLASS

我们在 Hy3 模型配置下,分别在 TP8 / EP1 和 TP1 / EP8 设置下,将 HPC-Ops MoE 后端与 Triton 和 CUTLASS MoE 后端进行了基准测试。按批次大小平均,HPC-Ops 在 TP8 / EP1 下比最佳基线快 1.59 倍,在 TP1 / EP8 下快 1.21 倍,在主导低延迟解码的中小批次大小上收益最大。

表 1:TP8 / EP1 下不同 batch size 的 FusedMoE 延迟(µs)(专家权重分片在 8 个 rank 上)

BatchHPC-Ops(µs)Triton(µs)CUTLASS(µs)
442.056.474.5
1685.7124.2209.2
32124.0184.3275.6
64147.2374.9330.3
128161.5302.9345.3
256170.1310.9351.6
512194.5331.6369.2
1024281.4652.7438.3
2048491.8731.5794.4
4096872.01366.01230.7
81921695.02216.82362.9
163843241.94329.14364.4

表 2:TP1 / EP8 下不同 batch size 的 FusedMoE 延迟(µs)(专家分片在 8 个 rank 上)

BatchHPC-Ops(µs)Triton(µs)CUTLASS(µs)
4118.6147.4140.4
8136.7192.8170.7
16149.8198.4263.5
32153.6214.6264.4
64166.5358.1266.8
128213.5251.7272.6
256386.2454.9493.5
512705.5691.7741.7
10241342.61369.11359.1
20482513.92668.72530.4
HPC-Ops FusedMoE on H20 — Hy3
HPC-Ops FusedMoE 在 H20 上 — Hy3

混合长度批次下的 Decode:动态调度 vs 静态调度

Attention 后端最突出的优势是在混合长度批次上的 decode。为了单独考察调度器,我们将 FP8 decode 从均匀的 KV 长度分布扫描到高度倾斜的分布(标签 A×B = A 个请求,KV 长度为 B),并将 HPC-Ops 动态调度与静态 split-KV 调度、FlashInfer 和 FlashAttention 进行对比。相比静态调度的优势随倾斜程度增加而增大,从小型均匀批次上的持平,到 1×128K + 31×4K 混合场景下的 2.95×。在这些场景中,动态调度平均比 FlashInfer 和 FlashAttention 中最快者快 2.25×。

表 3:不同 KV 长度分布下的 Decode 延迟(ms)

Decode 场景HPC-Ops 动态(ms)HPC-Ops 静态(ms)FlashInfer(ms)FlashAttention(ms)动态 vs 静态
64×0.5K0.0130.0130.0500.0251.00×
64×4K0.0330.0430.2210.0951.32×
32×0.125K + 32×4K0.0200.0330.1190.0531.59×
2×32K + 30×4K0.0320.0560.1690.0941.76×
1×64K + 15×4K0.0420.0970.1180.0652.32×
1×128K + 31×4K0.0630.1860.2200.0972.95×
Decode Attention on H20 — Hy3: dynamic vs static scheduling
Decode Attention 在 H20 上 — Hy3:动态调度 vs 静态调度

Attention:HPC-Ops vs FlashAttention / Triton / FlashInfer

我们进一步使用 vLLM 的 attention benchmark,在 prefill、extend 和 decode 形状上将 HPC-Ops Attention 后端与 FlashAttention、Triton 和 FlashInfer 进行了基准测试。在这些形状中,HPC-Ops 几乎在所有情况下都与三者中最快者持平或更快。

表 4:Attention 延迟(ms)对比 FlashAttention、Triton 和 FlashInfer

Batch SpecTypeBatch SizeHPC-Ops(ms)FlashAttention(ms)Triton(ms)FlashInfer(ms)
q512prefill10.0470.0690.1230.070
q1ks2kextend10.4060.4311.1320.431
q2kprefill10.5300.5741.5250.609
q4kprefill12.0022.0935.8162.144
q8kprefill17.8837.95722.7028.084
2q1ks4kextend21.8351.8305.0461.829
8q1s1kdecode80.0190.0310.0350.021
16q1s2kdecode160.0540.0980.1060.052
32q1s1kdecode320.0570.1020.0800.058
64q1s4kdecode640.2990.6200.5100.340

端到端:Hy3 在 8× H20 上

最后,我们在 8× NVIDIA H20 GPU 上评估了采用 HPC-Ops MoE 和 Attention 后端的 Hy3 模型相对于 vLLM 默认后端的端到端(E2E)性能。在所有测试用例中,HPC-Ops 后端始终优于 vLLM 默认后端,在 TTFT 和 TPOT 上均实现了大幅降低。TTFT 平均下降约 24%,TPOT 平均下降约 17%,在最大 batch size 下最高可达约 30%。

表 5:不同 batch size 下的 TPOT(输出长度 = 4K)

Batch SizeBaseline TPOT(ms)HPC TPOT(ms)Improvement
18.007.76+3.0%
411.1410.67+4.2%
813.4911.31+16.2%
1617.9813.56+24.6%
3224.1318.32+24.1%
6431.1021.90+29.6%

表 6:不同 batch size 下的 TTFT(输入长度 = 8k,禁用 Chunked Prefill,禁用 Prefix Caching)

Batch SizeBaseline TTFT(ms)HPC TTFT(ms)Improvement
1565.69431.00+23.8%
41920.151471.43+23.4%
83948.223035.44+23.1%
167807.185885.63+24.6%

表 7:不同输入长度下的 TTFT(batch size = 16,禁用 Chunked Prefill,禁用 Prefix Caching)

Input LengthBaseline TTFT(ms)HPC TTFT(ms)Improvement
2k1792.621363.13+24.0%
4k3704.272886.40+22.1%
8k7807.125893.93+24.5%

下一步计划

这只是与 vLLM 社区长期合作的开端。我们将继续与 vLLM 维护者和贡献者合作,改进和扩展这些能力,并在进一步成熟后向上游提交更多工作。非常欢迎反馈、问题和基准测试,我们期待共同构建开放、高性能的推理。

致谢

我们要感谢各团队中为将这些后端引入 vLLM 而共同努力的众多人员:

  • 腾讯混元 AI Infra — 构建并优化 HPC-Ops Attention 和 MoE 内核,并将其作为后端贡献给 vLLM。Sethran Liu、Chase Shao、Shengy Wei、Theo Cheng、Ryann Xue、Lando Jiang、Looper Zhao、Haank Lin、Aiden Ren、Lehua Ding、Chengv Jiang、Steven Kuang、Liqi He、Kipper Gong、Reedlau Liu、Raccoon Liu、Dick Zhu。
  • 腾讯网络平台部 — 在通信优化方面的紧密协作。Xuan Zhang、Haoran Zhao、Yuanyuan Gong、Yadong Liu、Jinzhu Wang、Yinben Xia、Xiang Li、Quan Wen、Zekun He。
  • vLLM/Inferact — 提供开放的后端接口、评审和设计讨论。Kaichao You、Yongye Zhu、Yifan Qiao。
  • NVIDIA — 在内核和性能优化方面的紧密协作。Yuanhang Sun、Perkz Zheng、Yuxi Chi、Jiang Shao、Jun Gu、Meng Wang、River Liu、Gary Ji、Chandler Zhou。

我们还要感谢更广泛的开源内核社区,本工作建立在其成果之上并与之进行对比,包括 NVIDIA CUTLASS/CuTe、TensorRT-LLM、FlashInfer、FlashAttention 和 Triton。

来源:vLLM Blog · vllm.ai