CodexQA

行业与实践研究与基准测试

几何平均快 1.55 倍,但短行采样会输:腾讯怎么测精确 Top-K

CodexQA 团队阅读约 6 分钟

腾讯 HPC-Ops 在 Hy4-Preview 的 FP32 索引分数上测精确 Top-K,K=2048。20 个形状都通过集合合同,相对最快外部精确实现几何平均 1.55 倍。245K 轨迹 1.36 倍,430K 为 1.48 倍。16K 和 24K 行上精确提议全胜,采样不是默认都该开。

本文目录

几何平均快 1.55 倍,但短行采样会输:腾讯怎么测精确 Top-K

HPC-Ops 是腾讯给长上下文稀疏注意力做的精确 Top-K(从一行分数里取出分数最高的 K 个下标,并列时边界上任意合法选择都算对)。论文许可证为 CC BY 4.0,arXiv 提交日是 2026-09-08,通讯作者是 Wei Liu,单位 Tencent Inc.。分数来自腾讯混元 Hy4-Preview 的索引器,在进入筛选之前用 FP32 抓下来。被测算子取 K=2048,并保留原来参差不齐的行长。

作者要分开两件事:采样只用来提议一条粗边界,完整行再证明这条边界,并对没凑满 K 个的行做补救。所以加速不能靠「大约对」。

什么叫精确,时间怎么量

环境是 NVIDIA H20,78 个 SM、96 GiB。CUDA 12.8,PyTorch 2.11.0+cu128,CUTLASS Python DSL 4.5.0。TensorRT-LLM 的 CuTe 内核走这套 DSL。

计时用执行流上的 CUDA event,报的是预热和状态整理之后、重复 CUDA Graph 的每次调用中位数。计时区间只有算子执行。输入准备、分配、构造参照、正确性检查和一次性编译都不算进去。终端步和完整步的机制对照是 10 次预热、两轮各 50 次回放的状态整理,再 7 轮轮换、每轮 100 次回放取平均。宽度交叉扫描是 10 次预热加 7 轮各 100 次。分数计算加筛选的集成检查是 8 次预热、两轮各 25 次、7 轮各 50 次。轨迹和步骤延迟是对应各次调用中位数之和。

正确性按集合合同检查每一行:下标互异,且落在有效前缀里。行长大于 K 时,选出的集合必须正好 K 个,集合内最小分不低于集合外最大分;边界同分可以任选,不要求输出顺序,也不设浮点容差。行长小于等于 K 时,必须包含全部有效下标,空位用合同规定的哨兵。延迟比只用通过精确检查的执行。非法结果、非法访问和显存不足分开报,不混进加速比。

对照是各家最接近的精确实现,并且都吃同一段有效 FP32 前缀。变长接口直接用原行长。只接受稠密输入的接口,在计时前把无效后缀设成负无穷,行数、分配宽度和调用边界不变。版本钉在具体提交:HPC-Ops 用 f39028d,入口是 hpc.topk;vLLM 用 c5d840f,预填走 top_k_per_row_prefill,解码走 top_k_per_row_decode 且 next_n=1;TensorRT-LLM 用 f5cbe6b,含重读和显存溢出两种策略,以及解码路径和八 CTA 路径;SGLang 用 155aa26 的 JIT Top-K V2;FlashInfer 用 56ed540,自动选算法且 sorted=False;PyTorch 用 70d99e9 的 torch.topk,largest=True、sorted=False,只当稠密参照。每个形状只保留该家族里通过精确检查的最快入口。

20 个形状都最快,显存溢出不算加速

算子矩阵把每次调用的行数 M 取 512、1024、2048、4096、8192,列宽取 128K、256K、512K 和大约 1M,共 20 个形状。分数是 Hy4-Preview 抓到的原值。每个宽度保留最后连续 8192 行因果窗口,再切成不重叠的小组,所以变的是并行度和总工作量,不是分数分布。无效因果后缀在计时前设成负无穷。一个形状的延迟是所有小组和重复执行的中位数。图里超出共同量程的 PyTorch 被截断,缺的点表示该形状没有通过精确检查的结果。

HPC-Ops 在 20 个形状上都通过精确检查,并且都是最快。相对各形状上最好的外部精确结果,128K 列是 1.29 到 1.42 倍,256K 是 1.49 到 1.53 倍,512K 是 1.60 到 1.72 倍,1M 是 1.68 到 1.75 倍,几何平均 1.55 倍。20 个形状里 18 个的最好外部结果来自 SGLang,另外两个是最长宽度上 M=512 的 TensorRT-LLM 解码路径。固定列宽时,优势对 M 比较稳;列越长,优势越大。

TensorRT-LLM 的显存溢出策略会按完整 M 乘 N 再留 2MN 个 32 位项,而不是按实际溢出量。行批和上下文一起变长时会显存不足。HPC-Ops 不做这块整矩阵额外占用。这篇把显存失败单独算,不把它写成对方更慢。

框架轨迹:245K 快 1.36 倍,430K 快 1.48 倍

在所测的 vLLM 调度里,预填和解码先被切成有界步骤,索引器再切一次,让物化出来的 FP32 分数矩阵待在固定工作区里。上下文变长后,一次调用能放下的行数大约按宽度成反比下降。调度步上限是 6.4 万个查询 token。245K 请求有 4 个调度步、26 次 Top-K;430K 请求有 7 个调度步、71 次 Top-K。每次调用的行数、分配宽度、有效行长、边界和顺序都保持原样。

相对最快的外部精确基线 SGLang,轨迹级延迟从 77.15 毫秒降到 56.53 毫秒(245K,1.36 倍),从 233.50 毫秒降到 158.12 毫秒(430K,1.48 倍)。vLLM 和 TensorRT-LLM 仍然精确,但两条轨迹都更慢。430K 的终端前缀上,收益到 1.55 倍。

再把选择器接到同一个 DeepGEMM FP8 多查询注意力分数算子后面,两次操作放进一张 CUDA Graph。相对 SGLang V2,Top-K 段从 27.41 毫秒降到 18.15 毫秒(245K,1.51 倍),从 38.01 毫秒降到 24.06 毫秒(430K,1.58 倍)。整条「打分加选择」从 339.99 毫秒降到 330.84 毫秒,以及从 488.01 毫秒降到 474.70 毫秒,只省 9.15 和 13.31 毫秒。这条链外面的模型层没有计时。

采样不是处处都该开

默认主目标是 1.5K,步长 s=128,副目标 1.75K。只开主边界时,ρ=1 约有三分之一的行要走精确补救,采样优势被抹掉。1.25K 把补救降到 5.7%–7.8%。1.5K 把补救降到 1% 以下,加速 1.51 到 1.54 倍。再加深只是平台,不是更尖的最优点。

步长从 16 扫到 256。s=16 几乎不用补救,但只快约 1.05 倍。到 s=64,补救仍低于 0.01%。s=128 加速 1.51 到 1.54 倍,补救低于 0.9%。s=256 补救升到 2.48%–3.26%,两边都变慢。

两个终端步上,主边界分别少收 0.40% 和 0.86% 的行。条件补救把剩余精确补救降到 0.015% 和 0.060%,分别解决 96% 和 93% 的失手。受影响的行上,粗补救平均耗时从 95.6 微秒降到 37.4 微秒(245K),从 166.7 微秒降到 63.1 微秒(430K),比整行精确补救少 61%–62% 的补救路径时间。

把下游精确选择器固定、只换边界算法时,稀疏定位把提议时间从大约 18 微秒降到 2 微秒(245K),从 33 微秒降到 3.5 微秒(430K),解释了延迟差的 92% 和 97%。整步从 32.8 毫秒降到 18.3 毫秒、从 43.2 毫秒降到 24.2 毫秒,约 1.79 倍和 1.78 倍。

宽度从 16K 扫到 64K,每个宽度 14 个负载格(7 种行数乘两份抓取)。16K 和 24K 上,精确提议全胜。32K 到 56K 胜负混杂。64K 上两种采样都赢全部 14 格,中位加速 s=64 为 1.13 倍,默认 s=128 为 1.22 倍。所以短行该走精确边界,采样只留给足够宽的行,转折是一段区间,不是一根硬阈值。

这组数字不能外推的地方

测试卡只有 H20,分数只来自 Hy4-Preview 的 FP32 索引器抓取,K 固定 2048。框架结果是回放,不是线上服务的端到端时延,模型其余层也没进计时。加速比只比较通过精确检查的实现;显存不足和图上缺失点不能当成更慢。PyTorch 曲线为了看清别的内核被截断过。这里的采样只负责提议边界,不是用近似结果代替精确 Top-K。

腾讯,Siran Liu、Yang Xue、Theo Tang 等,Sample-Guided Exact Top-K Selection for Long-Context Sparse Attention,2026-09-08,https://arxiv.org/abs/2609.08450

觉得有用,转给同事

微信扫码

用微信扫一扫,在手机上打开后即可转发。

用 RSS 订阅

提交勘误