NoMAD-Attention: Efficient LLM Inference on CPUs Through Multiply-add-free Attention
概览
NoMAD-Attention 通过**“把 Q·K 乘加改写成寄存器查表+加法”**,用 CPU SIMD 寄存器的超低延迟随机 shuffle(≈1–2 cycles)来取代传统注意力里的大规模 FMA 运算,从而在 16 k 上下文长度下可为 4-bit LLaMA-7B 带来近 2× 整体吞吐提升,同时几乎不损失精度。(arxiv.org, arxiv.org)
1 设计要点速览
2 「分段」(Sub-quantizer/Segment) 的真正含义
按特征维度切块:把 d-维向量拆成 S = d/d_sub 个子向量,每段独立量化。
匹配 SIMD 寄存器:一段 16 质心 × 8 bit = 128 bit;恰好一条 xmm/NEON 可一次随机 shuffle。
速度–精度权衡:
d_sub=1
误差最低,Q·K 阶段加速 ≈ 5–10×;d_sub=4
精度略降,Key 体积仅 4 B,整体吞吐提升可达 2.1×。(proceedings.neurips.cc, arxiv.org)
3 在线推理三步流程
3.1 Key 编码(每新 K 一次)
cs(kt)=argminc∈[0,15]∥πs(kt)−bs,c∥2,s=1…Sc_s(k_t)=\arg\min_{c\in[0,15]}\|\pi_s(k_t)-b_{s,c}\|^2,\quad s=1\ldots S
得到的 4-bit 代码写入 Key-code Cache。O(d) 乘加,与序列长度无关。(arxiv.org)
3.2 Query 构建 LUT(每步一次)
对每段计算
LUTs[c]=⟨πs(qt), bs,c⟩, c=0…15\text{LUT}_s[c]=\langle\pi_s(q_t),\,b_{s,c}\rangle,\;c=0\ldots15
再动态映射到 0–255 并存入寄存器。总算量仍 O(d)。(arxiv.org, arxiv.org)
3.3 MAD-free 点积
⟨qt,ki⟩^ = ∑s=1SLUTs [codes(ki)]\widehat{\langle q_t,k_i\rangle}\;=\;\sum_{s=1}^{S}\text{LUT}_s\!\bigl[\text{code}_s(k_i)\bigr]
每条 K 只需 S 次寄存器取数+加法,完全无乘法。(arxiv.org, stackoverflow.com)
4 复杂度与性能
论文 Figure 7 的延迟分解显示,Q·K 被压缩为 1/10 以内,而 Key Caching 仅占 3–6 % 总时延。(neurips.cc, proceedings.neurips.cc)
5 常见疑问 & 澄清
6 优势与局限概览
优势
零微调、兼容现有权重。
仅依赖 x86 AVX2/AVX-512 或 ARM NEON 的基本 shuffle 指令。
Key-cache 更小,减少内存带宽。
局限
质心固定 16 个受 128-bit 限制,表达力受限。
MLP 等算子仍需 FMA;整模型上限 ≈ 2×。
老旧 CPU(无 SSSE3/NEON)不支持。
7 术语速查
参考文献 / 延伸阅读
NoMAD-Attention 原论文 (2024)(arxiv.org)
NeurIPS 2024 Poster 补充材料 & Figure 7(neurips.cc)
NoMAD-Attention HTML 附录(算法与图示)(arxiv.org)
StackOverflow 对
_mm_shuffle_epi8
用法解释(stackoverflow.com)FAISS
ProductQuantizer
API 文档(faiss.ai)Quicker ADC:SIMD-友好 PQ 查表优化(arxiv.org)
CPU 寄存器访问 1–2 cycle 说明(论文 HTML 第 1 节)(arxiv.org)
SIMD shuffle 1 cycle 延迟讨论(Hacker News 节选)(news.ycombinator.com)
SIMD 性能博客:常见指令延迟(stackoverflow.blog)
Branchfree.org SIMD 分类文章(branchfree.org)
(以上链接均可进一步追踪算法细节与 SIMD 微架构特性)