~/yomxxx/posts/2026-10-16-count-ngram-host-memory-scaling-paper.mdx
Paper

$ cat The COUNT 论文速读:把 n-gram 计数表搬进主机内存的免费午餐

-- 5 min read ·

scaling 关系的研究正在从算力轴转向内存轴。10 月 14 日,华盛顿大学的 Ian Magnusson、Noah A. Smith 和 Pang Wei Koh 提交了这篇名为 The COUNT 的论文(arXiv 2610.20456),标题本身就是方法宣言:Counting Offline Unlocks N-gram Transformers——离线数数,就能解锁 n-gram 语言模型的内存扩展。

问题:内存轴上的扩展被 GPU 显存卡死了

过去两年,一系列工作试图给语言模型加上「外挂记忆」:为大量 n-gram 或文档片段添加嵌入,让模型掌握训练语料的长尾知识。这类方法的共同结构是把存储与计算解耦——每次前向传播只读取嵌入表的一小行,而整张表的体积远大于单行,所以表可以做得很大而算力不涨。

但现有方法有一个共同的昂贵假设:嵌入是可学习参数,要从零训练。训练意味着频繁的读写,读写意味着必须放进 GPU 显存。于是「内存扩展」这项名义上为了省算力设计的技术,扩展上限被最贵的资源卡住。与此同时,服务器的主机内存便宜一个数量级、容量大得多,却在训练管线里大量闲置。

方法:不学嵌入,数数就行

COUNT 的核心动作是删掉「学习」这个环节。它的做法分三步:

  1. 离线统计:在训练语料上预计算 n-gram 计数表,存放在主机内存。
  2. 构造嵌入:对当前的 n-gram 历史,查表找到语料中最常跟随它的若干个下一词元,用这些词元的词频做权重,把语言模型自己的 unembedding 向量加权组合,得到这个 n-gram 的嵌入。
  3. 作为输入:把这个嵌入作为额外输入嵌入喂给主干模型,与正常词元嵌入并行。

第二点是全文最巧妙的设计:模型自带的 unembedding 矩阵已经编码了词元的语义关系,COUNT 只是用语料统计去「混合」这些现成向量,因此零新增可学习参数、零 GPU 侧训练开销。计数表更新只是重新跑一遍统计脚本。

结果:三条结论

论文给出的核心数字有三组:

  • 算力等效:固定算力预算下,给 1B 参数模型的预训练加 COUNT,验证损失的改善幅度与「多花 57% 算力但不加 COUNT」的对照组相当。
  • 显存受限场景更优:当 GPU 显存不足时,与其让主干参数和可学习 n-gram 嵌入对半分显存,不如主干占满显存、n-gram 信息全部走 COUNT 放主机——前者效果更好。
  • 推理时免训练换域:把通用语料的计数表换成领域语料(医疗、法律、代码等)的计数表,模型在推理时直接偏向新领域的词元分布,全程无训练。

第三条对工程侧最有吸引力。传统的领域适配要么微调(要 GPU、要数据、要防止灾难性遗忘),要么 RAG(要搭检索管线、要处理上下文塞入)。COUNT 的换表方案介于两者之间:一个统计脚本加一次文件替换,代价接近于零。

为什么这篇论文值得精读

它触碰了一个正在成形的共识:模型的「知识」未必都要压缩进权重。权重负责推理与泛化,长尾的统计事实可以外置到便宜介质上按需读取。这个思路与 KNN-LM、检索增强一脉相承,但 COUNT 把「外置」的成本降到了「数一遍数」的量级,把「读取」的位置放到了主机内存而非显存。

工程视角下的三个跟进方向:

  1. 推理服务整合:在 vLLM 这类服务框架里,COUNT 的嵌入查询可以做成一个异步预取层,主机内存做 LRU 缓存。论文没做这步,但路径清晰。
  2. 与 KV 缓存管理共存:长上下文场景里主机内存同时承担 KV 卸载和 n-gram 计数表,两者竞争同一块廉价内存,容量规划值得单独研究。
  3. 计数表的版本管理:换域适配的粒度可以细到「用户级」——用某个用户的历史文档统计计数表,实现个性化偏置。隐私和合规是新的问题。

在检索增强谱系里的位置

把 COUNT 放进「知识外置」的方法谱系里,它的坐标会更清楚。这个谱系上至少有四代技术:

  • KNN-LM:推理时用 k 近邻检索训练语料分布,与模型输出分布插值。效果好,但检索库要在线查询,延迟开销大。
  • 检索增强生成(RAG):把文档块喂进上下文。灵活,但吃上下文窗口,还要搭一整套检索管线。
  • 可学习 n-gram 嵌入:把共现信息训练进额外参数。快,但被 GPU 显存容量卡死扩展上限。
  • COUNT:预计算计数表放主机内存,零训练、零在线检索、零上下文占用。

COUNT 的独特之处是把三个成本项同时压到了最低:训练成本为零(只统计)、推理延迟接近零(本地内存随机读)、上下文成本为零(不占窗口)。代价是表达能力的天花板也最低——它只能编码「这个 n-gram 后面通常跟什么」的局部统计,语义泛化完全依赖主干模型。

这个取舍在特定场景下恰好是对的:模型已经「会推理」,缺的只是长尾事实的「记忆」。让权重管推理、让外挂记忆管事实,分工比全部塞进权重更经济。

与 KV 缓存管理的潜在竞争

一个论文没有展开、但部署侧必须面对的问题:主机内存在推理服务里不是闲置资源。KV 缓存卸载、前缀缓存、日志缓冲都在竞争同一块内存。COUNT 的计数表体积取决于语料规模和 n 阶数,没有给出上限数字——如果一张领域计数表就要占几十 GB,与 KV 卸载策略的冲突就需要显式规划。

反过来想,这也是机会:KV 缓存的调度器已经解决了「有限廉价内存上放什么、何时换入换出」的问题,把计数表纳入同一个调度框架,工程上是自然的延伸。谁先在 vLLM 或 SGLang 里把这件事做出来,谁就拿到了论文到生产的最后一公里。

实验全部停留在 1B 参数规模;n-gram 统计只能捕捉局部共现,对需要长程推理的任务没有帮助;主机内存到 GPU 的 PCIe 带宽在高并发服务场景可能成为新瓶颈——每次前向读嵌入行虽小,但批量请求下的聚合带宽需求没有在论文里充分压力测试。

但方向判断是清晰的:当算力的摩尔曲线放缓,把扩展压力转移到「便宜且闲置」的资源上是正确的问题意识。主机内存,可能是下一个被 AI 重新定价的硬件。

Frequently asked questions

COUNT 和传统的 n-gram 嵌入方法有什么本质区别?
传统方法把 n-gram 嵌入当可学习参数,从零训练,读写都发生在昂贵的 GPU 显存里,扩展性被显存容量卡死。COUNT 完全不引入可学习参数:n-gram 计数在离线阶段统计好,存放在便宜量大主机内存上,每次前向只需读取一小行嵌入数据。存储与计算由此解耦,内存可以无限外扩。
「等效 57% 更多算力」是怎么得出的?
作者在固定算力预算下预训练 1B 参数模型做对照:一组加 COUNT 作为额外输入嵌入,另一组把同样的算力预算提高 57% 但不用 COUNT。两组在验证损失上的改善幅度相当。也就是说,在算力受限的场景里,COUNT 提供了一条用「便宜的内存」换「昂贵的算力」的路径。
推理时换计数表就能适配新领域,靠谱吗?
这是论文最实用的卖点。因为计数表与模型参数完全解耦,你可以把通用语料计数表换成医疗、法律等领域语料的计数表,模型无需任何再训练就能在推理时偏向新领域的词元分布。当然它的上限仍然是统计共现信息,理解能力还是靠主干模型,适合做领域偏置而非领域专家。
这对推理侧部署有什么直接价值?
主机内存比 GPU 显存便宜一个数量级以上,而且目前大量闲置。对部署方来说,COUNT 提供了第三条扩展路线:显存装不下时,以往只能在「换更大卡」和「量化压缩」之间选,现在可以把长尾知识外置到主机内存。论文还指出 GPU 显存紧张时,让主干参数占满显存、计数表放主机,比主干和可学习嵌入对半分更好。
论文的局限是什么?
实验规模停在 1B 参数模型,scaling 曲线在更大模型上是否成立需要后续验证;计数表只覆盖 n-gram 统计共现,对长程依赖和语义推理没有增益;主机内存与 GPU 之间的带宽也可能在高吞吐服务场景成为新的瓶颈点。这些都在「值得跟进」而非「推翻结论」的范畴。
// next.txt ›

Some outbound links in this post are affiliate links — see disclosure.