AI Pulse

模型输出里自己声明要哪几段上下文,引擎只让token看那些块

llama.cpp最近多了一个分支,名叫focus-llama。它实现的是Google DeepMind和KAIST AI发表的Declarative Attention(声明式注意力)。简单说,模型会在自己的输出里声明需要哪些上下文块,写成<focus magic_chunks="N“>标签。引擎一旦检测到标签,后续token就只能关注被点名的部分。不靠评分器,不用重新训练,一段提示词加上引擎对标签的反应就够了。

论文给的数字是:整体解码时间能降到常规做法的0.71倍(Gemma)和0.77倍(Qwen),约等于提速三成。代价是能力小幅下降,论文提到约2-3%。这个数字看起来不大,但分支作者还没跑过准确度基准,实际影响有多大还说不准。

这两个速度数字都来自论文里基于vLLM的实现。focus-llama的作者还没给自己的代码跑过基准,也没有准确度测评。他目前只做了小规模冒烟测试:用Qwen混合/GDN模型和一个小型密集模型,检查了首token的logprobs。

改动集中在服务器端。原版llama-server在生成过程中没法修改KV缓存的范围,focus-llama为此加了新接口,能在prefill中途或之后丢弃请求的KV token范围。默认的标签驱动模式下,客户端先把文档分好块。服务器在生成时解析模型吐出的第一个<focus magic_chunks=”N">标签,然后把其他块丢掉。这个动作一次性、单向,不会回头恢复。另一种序列模式则会保留原始序列完整。

真正的限制在底层。llama.cpp目前没有论文vLLM版本里那种分页块表,单纯掩码并不会减少实际读取的KV数据量。要真正跳过那些块,得靠内核支持或数据压缩。从源码看,CUDA上的单token解码现在并不会跳过被掩码的块。所以在当前形态下,实际加速能有多少,要看后续内核层的优化。另外,在混合模型上,受限制的只有注意力层,循环状态不受影响。

速度和质量怎么权衡,已经有人在讨论了。有评论说,如果这种加速每次都能稳定带来很高的提升,那点能力损失值得。也有人想看到更多数据,尤其是低量化级别的小模型——本身能力余量就小,2-3%的轻微恶化可能被放大。

focus-llama在GitHub上公开可见,作者欢迎研究过llama.cpp KV缓存和循环内存的人来反馈。这个分支目前还是个人项目。能不能被上游接受、让普通用户不用手动fork就用上,取决于后续的实测数字和优化进度。

阅读原文
📚 相关主题 大语言模型开源性能优化

订阅 AI Pulse

每天 08:00 · 12:30 · 18:30 · 23:50 更新