微信扫一扫,关注公众号

  • 科技行者

  • 算力行者

见证连接与计算的「力量」

首页 HyQuant:给大模型的注意力机制“分等座”,用混合精度省下三倍解码速度

HyQuant:给大模型的注意力机制“分等座”,用混合精度省下三倍解码速度

2026-10-14 19:40
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2026-10-14 19:40 • 科技行者

你有没有想过一个问题:一列高铁上,为什么有商务座、一等座和二等座,而不是让所有人挤在同一种座位上?

答案很简单,因为不是每个座位都同样重要。VIP客户需要更宽敞的空间和更好的服务,而大部分乘客只需要能坐下就行。如果强行让所有人享受商务座的待遇,车厢装不下几个人;如果强行把所有人塞进二等座,VIP客户就要投诉了。

大模型的注意力机制,其实也面临同样的问题。

这篇来自上海交通大学、西安交通大学、厦门大学和腾讯犀牛鸟实验室的论文,讲的就是如何给大模型的注意力"分等座",从而在几乎不损失准确率的前提下,把解码速度提升到原来的3.58倍。这个方法叫HyQuant。

**当推理越来越长,显存和算力开始吃不消**

从OpenAI的o1系列到DeepSeek,现在的大模型越来越喜欢"想很久再回答",动辄生成几万个token的思维链。这种长文本推理带来了两个阶段性的瓶颈。

在Prefill阶段,模型需要一次性处理整段输入文本,这个过程主要靠大规模矩阵乘法完成,是算力密集型任务。而到了Decode阶段,模型每生成一个新token,都要把之前所有token的键值信息重新读取一遍,这时候显存的容量和带宽反而成了瓶颈。

量化*:把模型中原本用高精度数字(比如16位浮点数)表示的参数或激活值,压缩成低精度数字(比如4位整数)来存储和计算,从而节省内存和计算开销的技术。

量化技术本来是解决这两个瓶颈的常规武器,压缩得越狠,省的资源越多。可问题是,如果把注意力模块里的数值全部粗暴地压到很低的位宽,模型的输出质量会明显下降。论文里提到,2026年一项针对Qwen3的量化实证研究就发现了这一点。

更麻烦的是,现有的方法基本上把所有token当作"平等的乘客"来处理,用统一的精度标准去压缩它们。但事实是,注意力分布本身极不均衡,少数几个位置贡献了绝大部分的注意力权重,如果用统一压缩率去处理它们,就等于让VIP和普通乘客挤同一种座位,误差会集中爆发在那几个关键位置上。

**注意力图里的“竖条纹”:少数token撑起了大半江山**

研究团队在观察Qwen3-8B、Gemma4-31B、Qwen3.5-4B、Llama3-8B等多个模型家族的注意力热力图时,发现了一个反复出现的现象:除了常见的对角线结构(也就是每个词更关注附近的词),图上还总会出现一些垒直的亮色条纹。

这些竖条纹意味着,某些特定的key位置会被大量不同的query反复关注,而不是只被某一个特定的问题关注一次。换句话说,这些位置像是句子里的"常驻明星",无论后面问什么,都绕不开它们。

这种现象其实和之前学界提到的"注意力汇聚"(attention sink)现象是相通的,Xiao等人在StreamingLLM里、Jiang等人在MInference里都描述过类似的结构,只是叫法和用途不同。

这类持续被关注的位置往往只占全部token的不到5%,但研究团队用实验数据算了一笔账:在Llama-3.1-8B上,全局得分最高的前1%的key位置就能覆盖58.83%的注意力质量,前5%能覆盖64.09%;如果再加上一个局部滑动窗口,覆盖率能冲到85.63%。Qwen3-8B的数据也差不多,前5%加窗口能覆盖82.53%。

这就好像一个班级里,成绩单显示前5%的学生贡献了全班80%以上的知识点讨论量。如果老师批改作业时,对每个学生都花同样的时间精力,那大部分时间其实是浪费的,而真正需要重点关注、生怕出错的,恰恰是那5%的核心学生。如果反过来平均分配精力,最终班级整体的表现反而会因为核心学生的错误没被纠正而下滑。这正是HyQuant想要解决的分配问题。

**误差不是均匀分布的:压错一个关键token,代价被放大数十倍**

光知道少数token重要还不够,研究团队进一步验证了另一件事:低比特量化带来的误差,恰恰在这些高分位置上被无限放大。

道理不难理解。这些高分key会被后续成百上千次的query反复调用,如果它本身存的数值有偏差,这个偏差就会随着每一次调用被重复"传染"出去,越滚越大。

团队在Qwen3-8B第28层上做了误差分析,用全精度的FlashAttention作为参照标准,测量了注意力输出的均方误差(MSE)。结果显示,统一4位量化的误差明显比统一8位量化大得多。但更关键的发现是,如果只把最高分的1%或5%位置保留成全精度,其余全部量化成4位,误差会大幅下降,几乎追平8位量化的水平,这个规律在从1K到32K不同长度的序列上都保持稳定。

这就像修桥梁的时候,如果整座桥用同一种钢材打造成本极高,但完全用便宜材料又容易在承重最大的桥墩处出现裂缝甚至坍塌。工程师真正做的,是在承重关键的桥墩位置用高强度钢材,其余部分用普通材料,这样既控制了整体成本,又保住了结构安全。如果反过来在关键桥墩上偷工减料,代价可能是整座桥的坍塌,远比省下的材料费用惨重。

**HyQuant的设计:把token分成三类座位**

基于上面两个发现,HyQuant的核心思路其实很直接:对每一层每个注意力头,把所有的key位置分成三个互不重叠的集合。

第一类是竖线位置*:也就是那些持续被大量query反复关注的高分key,论文中用符号KVL表示,这部分保留全精度。

第二类是局部滑动窗口*:指当前生成位置附近最近的一段固定长度的历史token,论文里设定窗口大小为128,这部分同样保留全精度,因为距离越近的上下文往往在语义上关联更强。

第三类是剩下的绝大多数token,全部量化到低比特(比如4位)存储和计算,这一部分占了95%的比例。

竖线位置的识别方法也很轻量。团队用最近的若干个query向量作为"代理查询",去和历史key做一次矩阵乘法,累加得到每个key位置的重要性分数,再取分数最高的一部分作为竖线集合。这个过程每64个token才执行一次,计算量很小,论文中提到这部分额外开销只占总运行时间的3%到5%。

这种做法有点像图书馆管理员整理书架。绝大多数书可以放进仓库压缩存储,只在有人借阅时再取出来;但有那么几本被反复借阅、几乎每天都有人查的畅销书,管理员会专门留在前台的显眼架子上,随手就能拿到,不用每次都跑仓库翻找。如果把畅销书也塞进仓库压缩存储,取用效率会大幅下降;但如果把所有书都摆在前台,前台又根本放不下。分层存放,才是既省空间又保效率的做法。

**Prefill阶段:融合两条路径的注意力算子**

在计算密集的Prefill阶段,HyQuant设计了一个融合算子,把量化路径和全精度路径拼接在一起同时计算。

具体来说,query块会分别和量化后的KQ、全精度的竖线token与窗口token做点积运算,两条路径的结果拼接后再统一走softmax归一化。整个过程沿用了FlashAttention*式的在线softmax机制(一种边扫描边计算、不需要把整个注意力矩阵一次性存进显存的算法),只是多了一条全精度的分支。这样设计的好处是,算子结构没有被打乱,额外开销非常有限。

实现上,团队用INT8/FP8或INT4/FP4这样的低精度格式处理量化的主体计算,同时用FP16/BF16保留竖线和窗口部分的精度。

**Decode阶段:边解压边计算,不占用额外显存搬运**

到了显存带宽吃紧的Decode阶段,HyQuant把这套思路用到KV缓存的压缩上。缓存里绝大部分历史key和value以低比特格式存储,只有竖线位置和滑动窗口内的数据保留全精度。

这里有个技术细节值得展开说:一般的量化KV缓存方案,做法是"先解压再计算",也就是把压缩存储的低比特数据先完整还原成全精度,再送进标准的注意力计算流程。HyQuant反过来,采用"边解压边计算"的融合设计,扫描到一个量化的KV块时,立刻在线解压并直接参与softmax累加,从始至终都不会把完整的全精度缓存重新构造出来。

这个区别看起来细微,但实际效果差别很大。论文对比了KIVI和KVTuner这两个采用"先解压再计算"策略的基线方法,发现HyQuant的融合方式明显减少了内存搬运的次数,因为解压出来的临时数据根本不需要额外写回显存再读取。

这就像点外卖时,有的餐厅是先把所有菜炒好装进保温箱运到你家,你打开箱子直接吃;另一种做法则是骑手边骑车边帮你保温加热,到你家门口那一刻菜刚好做好端上来。前者需要额外的保温箱空间和二次搬动的动作,后者省掉了这道中间环节。对于显存带宽这种"稀缺资源"来说,少一次数据搬运,就是多一份效率。

**实验结果:几乎不掉分,速度翻好几倍**

论文在Qwen3-8B、Qwen3-32B、Llama-3.1-8B-Instruct和GLM-4-9B四个模型上,用LongBench、GSM8K、MATH500三套基准测试进行了验证。

在LongBench v1的长文本理解任务上,Qwen3-8B用全精度FlashAttention-2跑出的平均分是44.59,而HyQuant用K4V4量化(也就是key和value都用4位存储)加上5%的竖线保留,跑出了45.04分,反而略微超过了全精度基线。作为对比,同样是4位量化的KIVI只有37.68分,SageAttention是38.13分,KVTuner是40.45分。差距一目了然。

数学推理任务上的表现同样扎实。GSM8K数据集上,全精度基线是95.88分,HyQuant是96.52分;MATH500上全精度是80.14分,HyQuant是78.73分,基本持平。

速度方面的提升更直观。下面这张表格反映了解码阶段随着上下文长度增加,HyQuant相对全精度FlashAttention-2的核心算子加速比。

| 序列长度 | FA2延迟(ms/token) | HyQuant延迟(ms/token) | 加速比 |

|---|---|---|---|

| 1,024 | 0.224 | 0.170 | 1.32× |

| 4,096 | 0.805 | 0.263 | 3.06× |

| 16,384 | 3.181 | 0.903 | 3.52× |

| 32,768 | 6.354 | 1.775 | **3.58×** |

可以看到,上下文越长,加速效果越明显,这正好对应了长文本推理里KV缓存越大、显存压力越重的现实场景。而端到端的解码速度提升相对温和一些,在32K长度时达到1.17倍,因为端到端速度还受到其他非注意力模块的影响。

在多批次并发的实际部署场景下,HyQuant同样表现突出。在32K上下文、单张H100显卡的测试中,当批次大小提升到16时,全精度FlashAttention-2和其他基线方法都已经显存溢出(OOM),只有HyQuant还能稳定运行,达到231.6 tokens/s的吞吐量。这说明省下来的显存空间,在真实的高并发服务场景里能撑起更大的服务容量。

**消融实验:竖线保留比例怎么选**

团队还做了细致的参数敏感性分析。如果把竖线token的保留比例从2%逐步提到10%,LongBench的平均分从46.06一路涨到51.91分。这说明保留的关键token越多,精度确实越有保障,但相应地全精度KV缓存的占用也会增加。综合权衡后,团队选择了5%作为默认设置,作为准确率和效率的平衡点。

滑动窗口的大小也做了对比:窗口从64扩大到256,准确率从92.54涨到95.74,误差指标也随之下降。这说明局部窗口和竖线保留两个机制并非互相替代,而是互补关系,单独用哪一个效果都不如两者结合。

论文里还专门做了一个概念性的对比实验,拿MInference里"只保留竖线位置做稀疏计算"的思路来对比。结果显示,如果完全丢弃非竖线的长尾token(也就是把它们直接从注意力计算中剔除,而不是量化保留),narrativeqa任务的F1分数会从31.49暴跌到14.69,hotpotqa从62.83跌到38.55。这个对比清楚地说明了HyQuant和纯粹稀疏化方法的本质区别:HyQuant保留了所有token的信息,只是精度不同,而不是像稀疏注意力那样直接把大部分token从计算中删掉。这个区别决定了HyQuant能维持几乎无损的准确率,而单纯的稀疏方法会丢失大量有用信息。

Q&A

Q1:HyQuant是什么?

A:HyQuant是一种混合精度量化框架,专门用来优化大模型注意力机制的计算和存储效率。它把注意力中持续被关注的"竖线"token和局部窗口保留在全精度,其余大部分token压缩成低比特格式,从而在几乎不损失准确率的前提下大幅提升解码速度。

Q2:HyQuant相比其他KV缓存量化方法有什么优势?

A:HyQuant采用"边解压边计算"的融合设计,不需要把量化的KV缓存提前完整还原再计算,减少了显存搬运开销。实验显示,在32K上下文长度下,它的解码核心算子速度比全精度FlashAttention-2快3.58倍,同时准确率优于KIVI、KVTuner等同样做4位量化的基线方法。

Q3:HyQuant需要保留多少比例的高精度token?

A:论文默认设置为保留5%的竖线token和一个大小为128的局部滑动窗口,这部分维持全精度,其余95%的token量化到4位。实验表明,5%左右是准确率和效率之间比较实用的平衡点,比例越高准确率略有提升,但全精度存储的开销也会相应增加。

分享至
0赞

好文章,需要你的鼓励

推荐文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-