跳转至

CodeGEMM: A Codebook-Centric Approach to Efficient GEMM in Quantized LLMs

会议: NeurIPS 2025 arXiv: 2512.17970 代码: GitHub 领域: model_compression 关键词: 模型量化, codebook 量化, GEMM 加速, LLM 推理, 低比特量化, CUDA kernel, lookup table

一句话总结

提出 CodeGEMM,一种以 codebook 为中心的 GEMM kernel,通过预计算 centroid 与 activation 的内积并缓存为 Psumbook,替代传统反量化流程,在 2-bit 量化 LLM 上实现 1.83×(8B)到 8.93×(70B)的端到端加速。

研究背景与动机

  • 领域现状:weight-only quantization 是 LLM 推理中缓解内存瓶颈的主流方案;codebook-based 量化(如 AQLM、GPTVQ、QuIP#)在极低比特(如 2-bit)下能保持较好精度,已成为前沿方向
  • 现有痛点:codebook 量化的推理 kernel 依赖 dequantization 流程——需将完整 codebook 加载到片上可编程缓存(shared memory),再逐元素查找 centroid 并重建权重,导致:(1) codebook 可能超出 shared memory 容量(如 AQLM 1×16 配置需 1MB,远超 A100 的 164KB); (2) 每次 GEMM 都重复计算相同 centroid 与 input 的乘积,存在大量冗余
  • 核心矛盾:codebook 量化在精度上优于 uniform 量化,但其推理效率反而可能更差——AQLM 1×16 的 kernel 延迟甚至高于 FP16 baseline,完全抵消了压缩带来的内存优势
  • 本文要解决什么:设计一个高效的 codebook-centric GEMM kernel,同时降低计算复杂度和片上存储需求,使 codebook 量化在极低比特下既保精度又提速
  • 切入角度:观察到 codebook 中 centroid 数量有限(\(2^b\) 个),而权重矩阵行数 \(M\) 远大于 \(2^b\),因此大量 code 指向相同 centroid,导致与 input 的内积被重复计算。将这些内积预计算并缓存即可消除冗余
  • 核心 idea:用 Psumbook(预计算的 partial sum 查找表)替代 codebook 本身缓存到 shared memory,推理时直接按 code 索引取出预计算结果做累加,跳过 dequantization 步骤

方法详解

整体框架

CodeGEMM 将传统 codebook GEMM 的"加载 codebook → 反量化 → 矩阵乘法"三步流程简化为"构建 Psumbook → 按 code 索引取值 → 累加"。具体地:(1) 将 input tile 按 vector length \(v\) 分段;(2) 对每段 input 与所有 \(2^b\) 个 centroid 做内积,结果存入 Psumbook(缓存在 shared memory 中);(3) 利用 code 矩阵中的索引直接从 Psumbook 读取对应的 partial sum 并累加得到输出。整个过程无需加载完整 codebook,也无需逐元素 dequantize。

关键设计一:Psumbook 预计算与缓存

  • 做什么:对每段 input \(\mathbf{x}^j\),预计算其与所有 centroid 的内积 \(p_i^j = \sum_{k=0}^{v-1} c_k^i \times x_k^j\),将这些标量结果存入 Psumbook
  • 核心思路:codebook 存储的是 \(v\) 维向量(centroid),而 Psumbook 存储的是标量(内积结果),空间复杂度从 \(\mathcal{O}(m \cdot 2^b \cdot v)\) 降至 \(\mathcal{O}(m \cdot 2^b \cdot t_w/v)\),与向量长度 \(v\) 成反比
  • 设计动机:传统方法需要将整个 codebook 放入 shared memory,大 codebook(如 \(2^{16}\) 个 centroid)直接超出容量限制;Psumbook 仅存标量结果,显著降低片上存储需求,使得各类 codebook 配置都能在 shared memory 中运行

关键设计二:计算复杂度缩减

  • 做什么:CodeGEMM 的计算复杂度为 \(\mathcal{O}(MNK \cdot m/v)\),相比标准 GEMM 的 \(\mathcal{O}(MNK)\) 降低了 \(v/m\)
  • 核心思路:Psumbook 构建阶段 \(C_{build} = \mathcal{O}(m \cdot 2^b \cdot K \cdot N)\)\(M \gg 2^b\) 时可忽略;读取阶段每个 code 仅需一次查表(而非 \(v\) 次乘加),故 \(C_{read} = \mathcal{O}(m \cdot M \cdot K/v \cdot N)\)
  • 设计动机:dequantization-based kernel 只优化了数据搬运效率,计算量与 FP16 GEMM 完全相同;CodeGEMM 同时优化数据搬运和计算量,是真正的计算效率提升

关键设计三:统一 kernel 支持灵活超参数探索

  • 做什么:单一 kernel 实现支持 codebook 数量 \(m\)、向量长度 \(v\)、bits per code \(b\)、group size \(g\) 等超参数的任意组合
  • 核心思路:不同超参数组合可在相同的平均 bit 数下产生截然不同的 latency-accuracy 权衡(如 \((v=4,m=1,b=8,g=128)\)\((v=16,m=3,b=8,g=32)\) 均约 2-bit,但性能差异显著)
  • 设计动机:现有 codebook kernel 通常仅针对固定配置优化;统一 kernel 允许用户系统性地探索 latency–memory–accuracy 三角权衡,找到特定场景下的最优配置

关键设计四:细粒度 group normalization

  • 做什么:在量化前对权重按 group size \(g\) 做归一化,\(g\) 越小归一化越精细(\(g=v\) 为 per-vector,\(g=-1\) 为 per-row)
  • 核心思路:细粒度归一化降低量化误差,以少量额外 memory(存储 scale factor)换取精度提升
  • 设计动机:在 70B 模型上,细粒度归一化使 CodeGEMM 的精度追平 AQLM 1×16(后者使用 \(2^{16}\) codebook),但 throughput 高出 8.93×

损失函数与训练策略

  • 量化优化:采用 AQLM 的 block-wise codebook 优化策略,在校准数据集上通过 K-means 聚类确定 centroid
  • PV-Tuning:可选的后量化校准方法,进一步优化 codebook 以提升精度(+PV-Tuning 后 CodeGEMM-m1v4g128 在 Llama-3.1-8B 上平均精度从 53.93 提升至 63.96)

实验

实验一:Kernel 级延迟与端到端吞吐(Llama-3.1-8B,2-bit)

方法 配置 Kernel 延迟 (μs) 端到端吞吐 (tok/s) 平均精度
cuBLAS (FP16) 332.45 103.8 71.26
AQLM 1×16 645.51 49.0 63.57
AQLM 2×8 250.12 124.5 47.82
QuIP# e8p 162.63
LUTGEMM q2-g128 160.1
CodeGEMM m1v4g128 152.69 228.3 53.93
CodeGEMM+PV m1v4g128 152.69 228.3 63.96

CodeGEMM-m1v4g128 kernel 延迟最低(152.69μs),端到端吞吐 228.3 tok/s 是 AQLM 1×16 的 4.66×;加上 PV-Tuning 后精度(63.96)超过 AQLM 1×16(63.57),实现 1.83× 的端到端加速。

实验二:70B 模型可扩展性

方法 \(\bar{q}\) tok/s MMLU WG HS ARC-E ARC-C Avg.
AQLM 1×16 2.055 5.5 73.07 76.16 80.83 82.20 57.17 73.89
AQLM 2×8 2.002 19.0 61.45 59.59 52.83 48.82 28.67 50.27
CodeGEMM m1v4g32 2.500 49.1 71.21 76.64 79.43 82.41 56.06 73.15
CodeGEMM m1v4g128 2.125 51.2 68.15 74.90 75.37 79.42 52.73 70.11

在 70B 模型上,CodeGEMM-m1v4g128 吞吐 51.2 tok/s 是 AQLM 1×16(5.5 tok/s)的 8.93×;CodeGEMM-m1v4g32 精度 73.15 接近 AQLM 1×16 的 73.89,但吞吐快近 9 倍。

实验三:能效与硬件利用率

方法 TFLOPS 功耗 (W) GFLOPS/W Mem Util (%)
cuBLAS (FP16) 1.58 318.55 4.95 96.94
AQLM 1×16 0.75 126.54 5.93 6.00
AQLM 2×8 2.59 254.20 10.18 19.96
CodeGEMM m1v4g128 6.12 316.38 19.36 49.80

CodeGEMM 的能效(19.36 GFLOPS/W)是 AQLM 2×8 的 1.9×,内存子系统利用率(49.80%)远高于 AQLM(6%–20%),说明 DRAM 访问更结构化、更高效。

亮点

  • 核心创新:用 Psumbook(预计算内积)替代 codebook 缓存,同时降低计算复杂度(\(v/m\) 倍)和空间复杂度(\(v^2/t_w\) 倍),是对 codebook 量化推理范式的根本性改进
  • 大模型扩展性极佳:模型越大优势越明显(8B 1.83× → 70B 8.93×),因为大模型的 codebook 更容易超出 shared memory 限制
  • 统一 kernel 支持超参数探索:单一 kernel 覆盖多种 \((m, v, b, g)\) 配置,首次系统性揭示 codebook 量化的 latency–memory–accuracy 三维权衡
  • 工程完成度高:提供能效、硬件利用率等系统级评估,不仅是算法创新也是工程贡献

局限性

  • 实验仅在 NVIDIA A100 上测评,未验证对其他 GPU 架构(如 H100、consumer GPU)的适配性
  • 精度评估主要依赖 perplexity 和 zero/few-shot 任务,缺少长文本生成等实际应用场景的评测
  • Psumbook 构建开销在 batch size 较大时可能增加(\(C_{build}\)\(N\) 线性相关),论文对 large-batch 场景分析不足
  • 量化方法本身沿用 AQLM,未在量化算法层面创新;PV-Tuning 为外部方法
  • 未评估与 KV cache 量化、speculative decoding 等推理优化技术的兼容性

相关工作

  • Codebook 量化:AQLM(加性多 codebook)、GPTVQ(GPTQ+codebook)、QuIP#/QTIP(旋转平滑+格 codebook/trellis 编码)、VPTQ(向量量化)
  • Uniform 量化 kernel:GPTQ/AWQ 的 INT3/INT4 kernel、LUT-GEMM(lookup table 加速 BCQ 格式)
  • Look-Up Table 计算:LUT-GEMM、FigLUT 等在硬件层面利用 LUT 加速;CodeGEMM 可视为 codebook 域的 LUT-based 计算
  • 关键区别:现有 codebook kernel 均基于 dequantization 范式(load codebook → reconstruct → multiply),CodeGEMM 首次提出 codebook-centric 范式(precompute → lookup → accumulate)

评分

  • 新颖性: ⭐⭐⭐⭐ — Psumbook 的思路简洁优雅,对 codebook 量化推理范式是本质性改进
  • 实验充分度: ⭐⭐⭐⭐ — 覆盖 8B/70B 模型、多种配置对比、kernel/端到端/能效多维评测,但缺 large-batch 和多 GPU 架构实验
  • 写作质量: ⭐⭐⭐⭐ — 动机清晰、图示直观、复杂度分析完整,整体写作质量高
  • 价值: ⭐⭐⭐⭐ — 对 codebook 量化部署有直接实用价值,70B 模型 8.93× 加速令人印象深刻