Jianyu Wei, Shijie Cao, Ting Cao, Lingxiao Ma, Lei Wang, Yanyong Zhang, Mao Yang
USTC, UCAS, Microsoft Research
EuroSys 2025
Presenter: wzw
Date: 2026-03-24
low-bit weight 虽然省了存储,但执行端仍要做 W{1,2,3,4}A16 的 mpGEMV/mpGEMM,现有 CPU kernel 往往退回 dequantize + higher-precision compute。bit-serial LUT lookup + accumulation,并围绕 CPU 寄存器 / SIMD / layout 做系统化优化。llama.cpp,kernel 最多快 6.6x、端到端吞吐最高约 2.8x~6.7x,能耗下降 20.6%~61.2%,BitNet-3B 在 M2 Ultra 上可到 71 tok/s。
dequantization overhead,以及 每种 bitwidth 都要单独写 layout + kernel。
llama.cpp 从 4-bit -> 2-bit 并没有线性提速,3-bit 甚至会比 4-bit 慢约 15%。$$ AW = \sum_i 2^i AW_i $$
INT4 / INT3 / INT2 的差异被收敛成 bit-plane 个数差异。A × W_i 才能继续改写成 “预计算 activation + 运行时查表”。
[1,g] 子向量预计算 LUT,再用权重 pattern 作为 index 查表并累加。
g=4 时,每组 1-bit 权重只有 16 种 pattern,因此 activation 可先预计算成一张长度 16 的 LUT。unpack index + lookup + add,不再显式做 decode + multiply-accumulate。on-chip memory,优先是 registers,并调用 NEON TBL 或 AVX2 PSHUF 做并行查表。N/M first 改成先沿 K 构表,再在 M 方向复用同一张 LUT。
1.42x,说明 T-MAC 的收益很大一部分来自 memory-format co-design。
fp16 压成 int8,减少寄存器与带宽压力。1/4,这是“寄存器驻留”能否成立的硬约束。TVM + LLVM + AutoTVM 为不同 shape / 平台生成 kernel,而不是手写一份静态实现。NEON vqtbl1q_u8 / AVX2 _mm256_shuffle_epi8 做 lookup;量化后还能用 vrhaddq_u8 / _mm256_avg_epu8 做 fast aggregation。llama.cpp 会冲突,作者最终改成 生成 C++ 单线程 block kernel,再挂到 llama.cpp threadpool。g=4 很重要,因为它正好让 LUT 与 SIMD width 匹配;更大 g 会明显抬高寄存器与指令开销。M2 Ultra, Raspberry Pi 5, Jetson AGX Orin, Surface Book 3。Llama-2-7B/13B 的 4/3/2/1-bit,以及 BitNet 1-bit / 1.58-bit。llama.cpp b2794 (May 2024);mpGEMM 场景额外对比 llama.cpp (BLAS)。100 次;model eval: 生成 64 tokens × 20 轮。
1/2/3/4-bit 上最高分别达到 11.2x / 5.8x / 4.7x / 3.1x。2-bit 仍能在四个平台上拿到 4.0x / 4.0x / 5.3x / 2.5x。
llama.cpp 后,单线程 Raspberry Pi 5 上三种模型分别有 2.8x / 6.7x / 5.8x 的 speedup。30 tok/s、8 核 71 tok/s,在 Raspberry Pi 5 上也能到 11 tok/s。
M2 Ultra 多线程上,三种模型的功耗分别下降 10.3% / 10.3% / 17.3%。20.6% / 61.2% / 51.3%。
TM-base 只有 intrinsic lookup,但最多仍比 baseline 慢 17%;说明“想到 LUT”本身并不够。table quantization 先把性能拉回 baseline 附近,随后 tiling、permutation、interleaving 分别继续带来 1.45x、1.39x、1.42x。Fast Aggregation 时,T-MAC 与 llama.cpp 的模型质量几乎一致。Llama-2-7B-4bit 单线程上,llama.cpp = 5.65 tok/s,T-MAC = 7.34 tok/s,但 WikiText2 PPL 都是 5.96,WinoGrande 都是 70.8。Fast Aggregation 后吞吐可到 8.97 tok/s,但 WikiText2 PPL 变成 6.38、WinoGrande 降到 67.8。Jetson AGX Orin 上,T-MAC 的 CPU kernel 在 W1A16 上明显优于 GPU,在 W2A16/W3A16 上也接近 GPU。Llama-2-7B-2bit 上,T-MAC CPU = 15.62 tok/s,llama.cpp CPU = 7.08,llama.cpp GPU = 20.03;虽然吞吐仍落后 GPU,但 每 token 能耗只有 0.66 J,远低于 GPU 的 1.54 J。Surface Laptop 7 上 2-bit 能到 31.83 tok/s,约为 NPU 的 3x;OnePlus 12 上相对 Adreno GPU 最多 9.7x。llama.cpp,对 preprocessing cost 与更新代 CPU kernel 的比较还不够充分。sub-4-bit、decode-dominant、memory-bound 场景;prefill 或更高精度下优势会收缩。CPU ISA extension / tiny LUT accelerator,或者和 KV-cache optimization / speculative decoding 做更完整的系统协同。