PageGram: Multi-Head N-gram Memory at the Read Cost of a Flat Table

发表时间: 2026-10 · Tech report by Empero AI (empero.org)

原文: https://github.com/empero-org/pagegram/blob/main/paper.pdf

作者/机构:Leon Lehmann (Empero AI Research, [email protected], 通讯: [email protected], 代码: http://github.com/empero-org/pagegram)


速读

一句话结论 PageGram 将多头 N-gram 记忆表同阶的所有头映射进同一个闪存页面内,在完全不损失模型质量的前提下,将端侧推理时的每 token 闪存随机读取次数从 16 次降至 2 次,并在固态硬盘(NVMe)上实现了 5 到 8 倍的查找吞吐提升。

要解决什么问题 基于哈希查找的 N-gram 记忆表能以极低的计算量为语言模型增加数十亿参数,现有最强架构(如 Engram 路线)采用多头独立哈希寻址以降低全盘哈希冲突率。但在端侧设备上,数十亿参数的表无法常驻内存,必须存放在以 4 KiB 页面为单位读取的闪存(flash)中。原有多头架构将每个头的表独立分散存放,导致 2 阶(bigram)和 3 阶(trigram)各 8 个头在每个 token 生成时需要触发 16 次分散的随机闪存读取;同时,内存页面缓存(RAM page cache)每次换入的页面仅能为单个头提供服务,导致缓存命中收益极低,闪存 I/O 成为严重的延迟卡点。若退回单头扁平表(flat table)虽只需 2 次读取,但一旦哈希冲突两个 N-gram 便完全不可区分。

怎么做的 PageGram 的核心思路是保留多头结构以维持部分区分能力,但消除物理存储上的分散读取,强行将同一 N-gram 阶数下的所有头约束在同一个页面中。系统将每阶表切分为 $P_n$ 个页面,每个页面内部划分出 $K \times S$ 个槽位(slot),即每个头在该页面内拥有 $S$ 个可选槽位。寻址时先用全局哈希定位页面,再由各头在页面内哈希选择具体槽位:

$$p_n(x) = b_n(x) \bmod P_n$$

$$\mathrm{row}_{n,k}(x) = \mathrm{base}_n + \left(p_n(x) K + k\right) S + \left(u_{n,k}(x) \bmod S\right)$$
其中 $b_n$ 为页面哈希,$u_{n,k}$ 为各头的内部哈希。这样,每个 N-gram 阶数仅需读取 1 个页面,2 阶和 3 阶合并仅需 2 次闪存读取。读取出来的 $2K$ 个头向量经由哈希符号调制后拼接,通过可学习投影矩阵解码并注入残差流。该机制的关键调节杜杆是不变量 $S$(每头槽位数):单头的冲突概率固定为 $1/S$,而在已知某一头冲突的前提下,两词在其余头中额外冲突的期望头数为 $(K-1)/S$。$S$ 决定了多头间哈希冲突的相关性——$S=1$ 时完全退化为扁平表;$S$ 极大时头之间解耦并逼近 Engram 风格;设定适中的 $S$(如 $S=4$)可将冲突集中在少数同页词之间,使解码器更容易学习分离干扰,同时换入的单个缓存页面能一次性服务全部 $K$ 个头。

效果如何 实验使用 61M 参数的小型解码器(6 层,隐藏维度 384)在 228M tokens 多语言预训练数据上评估,统一挂载 200M 参数的 N-gram 表,在单张 RTX 5090 上运行;对比基线包括无表基准、扁平单头表(NanoGPT speedrun 路线)以及 16 个独立素数大小表的多头寻址(Engram 路线)。在 60M tokens 训练后,PageGram($S=4$)测试集损失达到 5.084,在全部 5 个随机种子上均优于扁平表(平均低 0.067 nats)和 Engram 风格寻址(平均低 0.142 nats)。训练延长至 120M tokens 时,PageGram 与 Engram 风格持平(仅相差 0.010 nats),且仍平均优于扁平表;在 92M 参数的更大模型上,其效果在种子噪声范围内与扁平表相当。消融显示 $S=4$ 最具稳定性,而 $S \ge 8$ 会在特定种子上出现性能劣变;此外引入 Engram 式上下文动态门控在当前规模下反而使损失恶化 0.140 nats。部署方面,表权重转为 4-bit NF4 格式仅损失 0.0004 nats;在 20B 参数表配合 1 GiB 缓存的闪存测试中,PageGram 每 token 仅需 0.99 次闪存读取,远低于 Engram 风格的 9.18 次;在 NVMe 实测中提供 5 到 8 倍的每秒查找吞吐(1 队列深度下达到 8,343 次/秒对比 1,048 次/秒)。主要代价在于当 $S=4$ 时单页为 1,088 字节,每 3 页放入 1 个 4 KiB 块会产生约 25% 的文件存储冗余。

1. 主要贡献

哈希 N-gram 表为语言模型提供了数十亿个参数,这些参数只占用内存而不增加计算开销。当前最优秀的架构设计是将每个 N-gram 哈希到多个独立的头上。在终端设备(如手机或笔记本电脑)上,这类大型表通常无法常驻内存,只能存储在闪存(Flash Storage)中,而闪存是以 4 KiB 页面为基本单位进行读取的。独立的哈希头导致每个 token 产生多达 16 次分散的随机闪存读取,且内存页面缓存对这种访问模式几乎失效。

针对该硬件受限问题,本文提出了 PageGram。其核心理念与贡献如下:

Figure 1 PageGram matches or beats both standard tables and reads eight times less from flash.
图 1:PageGram 在匹配或超越标准表性能的同时,将闪存读取量降低了 8 倍。a:无外部表、扁平哈希表、Engram 风格多头寻址与 PageGram(均为 200M 参数表,5 个种子的平均值)在 60M 训练 token 内的 Held-out Loss 曲线。b:各模型相对于扁平表的最终 Loss 差异,按种子成对展示(圆点代表单个种子)。c:在 20M 测试 token 上,20B 参数量、4-bit 量化的表在不同 RAM 页面缓存大小下的每 token 随机闪存读取次数。


2. 背景知识 / 关键 Observation / 设计原则

2.1 哈希 N-gram 记忆网络(Hashed N-gram Memory)

2.2 多头寻址机制(Multi-Head Addressing)

2.3 闪存硬件受限分析(Reading a Table from Flash)


3. 方法细节

3.1 内存布局(Layout)

Figure 2 Where an n-gram's rows live, for one n-gram order.
图 2:针对单阶 N-gram 的行存储布局示意图(虚线代表 4 KiB 闪存页面)。a:扁平表单次读取一行宽度为 $d$ 的向量。b:Engram 风格寻址中每个头独立哈希到各自的子表中,导致头向量离散分布在不同页面,需要 8 次独立读取。c:PageGram 先通过哈希定位到一个物理页面,各头从该页内的 $S$ 个槽位中挑选一行(图中 $S=4$)。在结合二元和三元阶数时,单个 token 的页面读取次数分别为 2 次、16 次与 2 次。

3.2 槽位数($S$)对冲突相关性的调控机制(What the Slots Control)

3.3 训练优化与部署量化(Training and Storage)


4. 实验环境与设置


5. 实验结果与深度分析

5.1 60M Token 下相同表容量的性能表现

外部记忆架构 表参数量 闪存随机读取数/token Held-out Loss (5 种子均值±标准差) 相对于无表基线 ($\Delta$) 相对于扁平表基线 ($\Delta$) 胜过扁平表的种子数 4-bit 量化损失增加量 训练吞吐 (Tokens/s)
无外部表 (No table) 0 0 5.484 ± 0.025 — +0.333 ± 0.063 0/5 — 113K
扁平表 (Flat table) 200M 2 5.151 ± 0.043 -0.333 ± 0.063 基准 — +0.0006 110K
Engram 风格寻址 200M 16 5.225 ± 0.075 -0.259 ± 0.094 +0.074 ± 0.033 0/5 +0.0004 109K
PageGram ($S=4$) 200M 2 5.084 ± 0.052 -0.400 ± 0.045 -0.067 ± 0.063 5/5 +0.0004 108K
PageGram ($S=15$) 200M 2 5.126 ± 0.088 -0.357 ± 0.100 -0.025 ± 0.092 3/5 +0.0004 109K

数据出处:论文 Table 1 与 Fig. 1

5.2 长期训练与更大模型表现

实验设置 评估种子数 无外部表 扁平表 Engram 风格 PageGram ($S=4$) PageGram 相对扁平表成对差异
60M tokens 训练 5 5.484 5.151 5.225 5.084 -0.067 ± 0.063
120M tokens 训练 3 4.220 4.159 4.125 4.136 -0.024 ± 0.052
更大模型 ($d=512$), 60M 1 5.567 5.417 — 5.473 +0.056

数据出处:论文 Table 2


6. 机制分析:相关冲突(Correlated Collisions)

6.1 单头碰撞与跨头特征对比

N-gram 阶数 存储布局 每头行独立容纳数 ($\lambda$) 行计数方差/均值 (Var/mean) 外部噪声干扰比例 (Foreign) 碰撞后额外共享头期望值 额外共享头发生概率
Bigram Engram 风格 25.3 0.993 - 1.003 0.669 < 0.001 < 0.01%
Bigram PageGram ($S=15$) 25.3 0.996 - 1.005 0.669 0.467 38.3%
Trigram Engram 风格 61.7 0.993 - 1.005 0.894 < 0.001 < 0.01%
Trigram PageGram ($S=15$) 61.7 0.995 - 1.002 0.894 0.467 38.3%

数据出处:论文 Table 3

6.2 槽位数 $S$ 的扫描与稳定性规律

槽位数 $S$ 额外共享头理论期望值 $(K-1)/S$ 评估种子数 Held-out Loss 相对扁平表差异 ($\Delta$) 胜过扁平表的种子数
1 7.00 3 5.140 ± 0.041 -0.023 ± 0.030 3/3
4 1.75 5 5.084 ± 0.052 -0.067 ± 0.063 5/5
8 0.88 3 5.199 ± 0.074 +0.036 ± 0.075 1/3
15 0.47 5 5.126 ± 0.088 -0.025 ± 0.092 3/5
60 0.12 3 5.171 ± 0.103 +0.008 ± 0.099 2/3
$\infty$ (Engram-style) 0.00 5 5.225 ± 0.075 +0.074 ± 0.033 0/5

数据出处:论文 Table 4 与 Fig. 3

Figure 3 The slots per page set how collisions correlate.
图 3:单页槽位数 $S$ 控制冲突相关性。固定 200M 参数表,展示 60M token 训练后 Held-out Loss 随 $S$ 的变化曲线。实心圆点代表单种子,空心圆点代表在稳定性分析中出现劣化的特殊种子 1,实线横条为均值。浅黄色区域为扁平表的均值与方差带。


7. 消融实验细节

实验分支 评估种子数 Held-out Loss 相对基准参考差异 ($\Delta$)
PageGram ($S=4$) 基准 5 5.084 ± 0.052 基准
+ Engram 上下文相关门控 (Context Gate) 3 5.206 ± 0.044 +0.140 ± 0.016
表规模缩减为 1/4 (50M 参数) 3 5.272 ± 0.035 +0.206 ± 0.086
PageGram ($S=15$) 基准 5 5.126 ± 0.088 基准
+ Engram 上下文相关门控 (Context Gate) 3 5.221 ± 0.041 +0.062 ± 0.131
表规模缩减为 1/4 (50M 参数) 3 5.324 ± 0.056 +0.166 ± 0.063

数据出处:论文 Table 5


8. 闪存读取与物理 I/O 实测

表规模 布局架构 4 KiB 块存储体积 零缓存单 token 离散块读取数 64 MiB 缓存下每 token 读取 256 MiB 缓存下每 token 读取 1 GiB 缓存下每 token 读取 4 GiB 缓存下每 token 读取
3.2B PageGram ($S=4$) 1.99 GiB 2 1.29 1.06 0.50 0.03
3.2B PageGram ($S=15$) 1.59 GiB 2 1.28 1.02 0.36 0.02
3.2B Engram 风格 1.59 GiB 16 11.35 9.26 3.59 0.02
10B PageGram ($S=4$) 6.21 GiB 2 1.32 1.17 0.89 0.32
10B PageGram ($S=15$) 4.97 GiB 2 1.32 1.16 0.85 0.18
10B Engram 风格 4.97 GiB 16 11.67 10.48 8.10 1.54
20B PageGram ($S=4$) 12.42 GiB 2 1.33 1.20 0.99 0.63
20B PageGram ($S=15$) 9.93 GiB 2 1.33 1.19 0.96 0.55
20B Engram 风格 9.93 GiB 16 11.75 10.77 9.18 5.27

数据出处:论文 Table 6 与 Fig. 4a

Figure 4 Flash cost of a deployed table.
图 4:实际部署表的闪存开销评估。a:在 20M 测试 token 驱动下,针对 3.2B、10B 和 20B 规模的 4-bit 外部表,未命中 RAM LRU 页面缓存的每 token 随机闪存读取数(纵坐标在小于 1 时为线性刻度,大于 1 时为对数刻度)。b:针对 20B 参数表,在不同并发并发读取深度(In-flight Reads)下,使用直接 I/O 从真实 NVMe 驱动器实测的每秒查表吞吐量。

8.1 真实 NVMe 硬件吞吐实测(20B 参数表)

并发在途读取请求数 (In-flight Reads) 1 并发 2 并发 16 并发 64 并发
PageGram 查表吞吐 (Lookups/s) 8,343 23,615 33,508 118,874
Engram 风格查表吞吐 (Lookups/s) 1,048 4,607 5,205 17,405
PageGram 吞吐加速比 7.96× 5.13× 6.44× 6.83×

数据出处:论文 Table 6 与 Fig. 4b


9. 附录与补充细节

9.1 附录 A:超参数与实验配置汇总

9.2 附录 B:外部表学习率网格扫描探针

参数表类型 $\times 20$ 学习率倍率 $\times 70$ 学习率倍率 $\times 200$ 学习率倍率
扁平表 (Flat table) 6.282 6.148 6.297
Engram 风格 6.244 6.180 6.193
PageGram ($S=15$) 6.236 6.160 6.162

数据出处:论文 Table 8

9.3 附录 C:全种子单次运行原始结果汇总

实验分支配置 Seed 0 Seed 1 Seed 2 Seed 3 Seed 4
无外部表基准 (No table) 5.455 5.471 5.480 5.494 5.520
扁平表 (Flat table) 5.175 5.164 5.150 5.188 5.078
Engram 风格寻址 5.270 5.242 5.211 5.299 5.104
PageGram ($S=1$) 5.168 5.159 5.093 — —
PageGram ($S=4$) 5.010 5.071 5.117 5.146 5.074
PageGram ($S=8$) 5.149 5.284 5.163 — —
PageGram ($S=15$) 5.105 5.283 5.088 5.070 5.086
PageGram ($S=60$) 5.143 5.284 5.084 — —
$S=4$ + 上下文门控 5.156 5.223 5.239 — —
$S=4$ 缩减为 1/4 表 5.313 5.249 5.255 — —
$S=15$ + 上下文门控 5.268 5.197 5.198 — —
$S=15$ 缩减为 1/4 表 5.273 5.384 5.316 — —
120M Token 长期训练
无外部表基准 4.231 4.154 4.276 — —
扁平表 4.146 4.157 4.175 — —
Engram 风格寻址 4.139 4.114 4.124 — —
PageGram ($S=4$) 4.182 4.112 4.114 — —
放大模型 ($d=512, 8$ 层)
无外部表基准 5.567 — — — —
扁平表 5.417 — — — —
PageGram ($S=4$) 5.473 — — — —

数据出处:论文 Table 9

9.4 附录 D 与 E:硬件模拟仿真与系统验证保障


10. 方法细节中的引用汇总

标号 完整文献信息 在方法/正文中的引用段落与原文描述
[1] Alizadeh et al. LLM in a flash: Efficient large language model inference with limited memory. In ACL, 2024. 2.3 节与 9 节:指出数十亿参数规模的大表无法驻留在手机或笔记本电脑的 RAM 中,从闪存介质中按需读取是其标准替代范式。
[2] Berges et al. Memory layers at scale. arXiv preprint arXiv:2412.09764, 2024. 9 节:讨论利用类似注意力机制检索参数的 Product-Key Memory 层,其地址依赖于运行时的隐层激活状态,无法在网络前向之前提前异步预取。
[3] Bloom. Space/time trade-offs in hash coding with allowable errors. Communications of the ACM, 1970. 9 节:介绍利用多个独立哈希函数将全局碰撞拆解为局部部分碰撞的理论起源(Bloom Filter 原理)。
[4] Cheng et al. Conditional memory via scalable lookup: A new axis of sparsity for large language models. arXiv:2601.07372, 2026. 1 节、2.2 节、7 节、9 节:阐述 Engram 架构,包括采用 $K=8$ 个头独立哈希到素数大小子表中,以及在其输出端配置动态上下文门控的做法。
[5] Cormode and Muthukrishnan. An improved data stream summary: The count-min sketch and its applications. Journal of Algorithms, 2005. 9 节:作为利用多哈希函数缓解冲突干扰的经典数据流结构被引用。
[6] Dettmers et al. QLoRA: Efficient finetuning of quantized LLMs. In NeurIPS, 2023. 3.3 节与 9 节:用于实际部署的 4-bit NormalFloat (NF4) 数据格式来源,每 64 个参数绑定一个 FP16 缩放因子。
[7] Hägele et al. Scaling laws and compute-optimal training beyond fixed training durations. In NeurIPS, 2024. 4 节:用于指导 60M/120M 训练阶段的 Warmup-Stable-Decay (WSD) 学习率衰减调度策略。
[8] Hu et al. MiniCPM: Unveiling the potential of small language models with scalable training strategies. arXiv:2404.06395, 2024. 4 节:同样作为 WSD 学习率衰减调度策略在大模型预训练中的成功依据被引用。
[9] Huang et al. Overtokenized transformer: Vocabulary is generally worth scaling. In ICML, 2025. 1 节、2.2 节、5 节、9 节:阐述 Over-encoding 方法,即通过多头独立哈希扩增 N-gram 词表嵌入,并揭示了表容量与训练损失间的对数线性扩展定律。
[10] Jordan et al. modded-nanogpt: Speedrunning the NanoGPT baseline. GitHub repository, 2024. 2.1 节、3.3 节、9 节:论文采用其提出的行级自适应 RMS 更新算法(包含跳过步数的权重衰减重放机制)以及致密学习率 70 倍的表更新设置。
[11] Lample et al. Large memory layers with product keys. In NeurIPS, 2019. 9 节:作为依赖隐藏状态实时动态寻址的先驱记忆网络层被引用对比。
[12] Liu et al. Scaling embeddings outperforms scaling experts in language models. arXiv:2601.21204, 2026. 1 节与 9 节:指出在大语言模型中直接扩展嵌入表(Embedding)的参数容量比盲目扩展 MoE 专家网络表现更为优越。
[13] Loshchilov and Hutter. Decoupled weight decay regularization. In ICLR, 2019. 4 节:基础 Transformer 稠密参数优化所采用的标准 AdamW 算法出处。
[14] Putze et al. Cache-, hash- and space-efficient bloom filters. In WEA, 2007. 9 节:提出 Blocked Bloom Filters 概念,即为了硬件缓存局域性而将一个 Key 的所有哈希位约束在一个 Cache Line 内,即便牺牲部分理论独立性也能大幅提高吞吐。
[15] Roy et al. N-Grammer: Augmenting transformers with latent n-grams. arXiv:2207.06366, 2022. 9 节:早期将隐式 N-gram 特征嵌入向量融合入 Transformer 架构的代表性工作。
[16] Su et al. RoFormer: Enhanced transformer with rotary position embedding. arXiv:2104.09864, 2021. 4 节:模型自注意力模块中所采用的 RoPE(旋转位置编码)技术出处。
[17] Svenstrup et al. Hash embeddings for efficient word representations. In NeurIPS, 2017. 2.1 节与 9 节:作为自然语言处理中利用哈希共享权重机制压缩参数的先驱文献被引用。
[18] Weinberger et al. Feature hashing for large scale multitask learning. In ICML, 2009. 2.1 节与 9 节:大规模机器学习领域通过哈希函数将高维稀疏特征映射到共享紧凑向量空间的早期基石文献。
[19] Yu et al. Scaling embedding layers in language models. In NeurIPS, 2025. 2.3 节与 9 节:提出的 SCONE 框架将超大 N-gram 表外包存储在加速卡显存之外(如系统内存/NVMe),以此节省推断算力。
[20] Zhang and Sennrich. Root mean square layer normalization. arXiv:1910.07467, 2019. 4 节:Transformer 块内部用于替换标准 LayerNorm 的高效 RMSNorm 归一化方法。

11. 结论

多头 N-gram 外部记忆模块通过解耦哈希头将严重的完全碰撞转化为局部碰撞,但在端侧落地时却因分散寻址而付出了每个头产生一次随机闪存读取的高昂代价。PageGram 打破了“多头必然离散”的思维定势,通过页面内槽位划分技术,将单个阶数下的所有多头行集中在同一个 4 KiB 物理页面中,成功将单 token 的闪存物理读取压减至与扁平表完全相同的 2 次。

理论分析与大量对照实验表明,多头哈希冲突的高度相关性非但没有损害模型质量,反而在中小规模预训练阶段提升了解码器的优化效率,实现了显著优于 Engram 风格和扁平表的收敛表现;而在长周期训练下,该结构依然能够无损继承多头机制的表征上限。配合 4-bit NF4 紧凑格式,PageGram 在实际 NVMe 硬件上提供了 5 至 8 倍的查表吞吐加速比,为大语言模型在端侧设备上高效调用超大规模稀疏记忆提供了实用可行的工程方案。