Bitnet.cpp: Efficient Edge Inference for Ternary LLMs

作者: Jinheng Wang, Hansong Zhou, Ting Song, Shijie Cao, Yan Xia, Ting Cao, Jianyu Wei, Shuming Ma, Hongyu Wang, Furu Wei 年份: 2025 会议: arXiv 分类: 量化与低秩

论文笔记:Bitnet.cpp: Efficient Edge Inference for Ternary LLMs

元信息

项目内容
机构Peking University, USTC, UCAS, Microsoft Research
日期February 2025
项目主页https://github.com/microsoft/BitNet/tree/paper
对比基线llama.cpp / T-MAC
链接arXiv / Code

一句话总结

针对三值 LLM(BitNet b1.58)在边缘 CPU 上的推理,设计了 element-wise LUT 和 MAD 两类 mpGEMM 核,实现了最高 6.25x 加速且无精度损失。

核心贡献

TL 系列核(Ternary Lookup Table): 首个 element-wise LUT-based mpGEMM 核,通过镜像合并将 bpw 降至 1.67,比 bit-wise LUT(T-MAC)快最高 2.32x

I2_S 核(Int2 with Scale): 首个严格遵循 BitNet b1.58 训练约束(per-tensor int8 激活)的 MAD-based 核,实现无损推理

ELUT 推广: 将 Element-wise LUT 方法推广至通用低比特 LLM,理论分析和实验均验证其潜力

问题背景

要解决的问题

BitNet b1.58 将权重约束为 {-1, 0, 1}(约 1.58 bpw),但非整数比特数与内存对齐要求冲突,导致现有实现效率低下

llama.cpp 的 TQ1_0(1.69 bpw)实际运行比 2-bit 方案更慢;T-MAC 的 bit-wise LUT 存在空间利用率低的问题

现有方法的局限

Bit-wise LUT(T-MAC): 对三值权重存在空间浪费,bpw 固定为 2,无法利用三值稀疏性压低至 1.67 bpw

Element-wise MAD(TQ2_0): 使用 block 量化(与 BitNet b1.58 的 per-tensor 训练约束不一致),无法实现无损推理;且要求 K 是 256 的倍数,灵活性差

bit-wise 方案: 天然排除非整数 bpw,无法利用三值模型的特殊结构

本文的动机

Element-wise 粒度可在 SIMD 寄存器范围内将 group size 扩大到 g=3,对三值权重(C=3)实现 bpw = log₂(3³/2) ≈ 1.67,低于 bit-wise 的 2 bpw

严格匹配 BitNet b1.58 训练约束(per-tensor 量化),是实现无损推理的关键

方法详解

mpGEMM 分类框架

论文首先建立了 mpGEMM 的二维分类:

计算策略: MAD-based(先乘后加)vs LUT-based(查表累加)

操作粒度: Bit-wise(操作在比特级,不支持非整数 bpw)vs Element-wise(操作在元素级,支持非整数 bpw)

四象限中,Bitnet.cpp 提出的 TL 填补了”Element-wise LUT-based”空白,I2_S 则在”Element-wise MAD-based”上修正了现有方法的量化不一致问题。

核心模块

模块 1: TL(Ternary Lookup Table)

设计动机: 利用 Element-wise LUT 的 fine-grained 优势,在 SIMD 寄存器(128-bit,最多 16 个 int8)范围内最大化 group size

镜像合并(Mirror Consolidation):

  • 对于三值(C=3),group size g=3 时 LUT 大小为 3³=27,超出寄存器限制
  • 观察到 eLUT 中恰好一半值与另一半互为相反数(镜像对称),合并后 LUT 大小降至 3³/2=13.5 → 14,可放入 16 个槽
  • 从而 g=3 可行,bpw = log₂(14)/3 ≈ 1.67(TL2);g=2 对应 TL1,bpw=2

两种实现:

  • TL1(g=2, bpw=2): 两个权重打包为 4-bit 索引,LUT 大小 3²=9
  • TL2(g=3, bpw=1.67): 符号-无符号分离存储,LUT 大小 14

三大实现挑战:

  1. 符号-无符号权重分离(Signed-Unsigned Weight Splitting): 分别存储 1-bit 符号权重和 4-bit 索引权重,避免连续 5-bit 存储导致的内存不对齐
  2. 1-bit 符号操作: 利用公式 x=sign(sign+x)x' = \text{sign} \oplus (\text{sign} + x) 兼容 AVX2 和 NEON 指令
  3. Block-fitting 权重分裂: 当 K 不被 3 整除时,静态拆分为 ThreeK(用 TL2)和 TwoK(用 TL1),避免 padding 带来的延迟

模块 2: 无损推理——Pack-and-Unpack 技术

问题: SIMD 查表操作使用 8-bit 累加,溢出导致精度损失(T-MAC 的做法是将累加值量化回 int8,引入额外误差)

解决方案 Pack-and-Unpack:

  • 将 int16 累加值通过 pack 指令拆为两部分
  • 对两部分分别执行查表
  • 用 unpack 指令合并结果,全程维持 int16 精度
  • 生成 TL1_1 和 TL2_1 两个无损变体

模块 3: I2_S(Int2 with Scale)

核心修正: 现有 TQ2_0 使用 block 量化,与 BitNet b1.58 的 per-tensor int8 激活训练方案不匹配

I2_S 严格采用 element-wise 方案 + per-tensor int8 激活量化,保证推理与训练约束完全一致

性能与 TQ2_0 相当,但可实现无损推理;支持 K 为 128 倍数(TQ2_0 要求 256 倍数,更灵活)

Bitnet.cpp 核库总览

Kernel类型bpw无损
TL1_0LUT-based2
TL1_1LUT-based2
TL2_0LUT-based1.67
TL2_1LUT-based1.67
I2_SMAD-based2

关键公式

公式 1: MAD 矩阵乘

R=i=1KAiWiR = \sum_{i=1}^{K} A_i W_i

含义: 标准逐元素乘后求和,计算复杂度 O(MNK)O(MNK),内存访问 O(MNK)O(MNK)

符号说明:

  • AiA_i: 激活矩阵第 ii
  • WiW_i: 权重矩阵第 ii
  • RR: 输出矩阵,形状 (M,N)(M, N)

公式 2: Bit-wise LUT-based mpGEMM

R=i=1bj=1K/gLookup(bLUTj,Wij)R = \sum_{i=1}^{b} \sum_{j=1}^{K/g} \text{Lookup}(\text{bLUT}_j, W_{ij})

含义: 在比特级分组,先预计算 bLUT(大小 2g2^g),再查表累加

符号说明:

  • bb: 权重比特宽度(三值时 b=2b=2
  • gg: group size(决定 LUT 大小)
  • bLUT\text{bLUT}: bit-wise Lookup Table,大小 2g2^g

公式 3: Element-wise LUT-based mpGEMM(ELUT)

R=i=1K/gLookup(eLUTi,Wi)R = \sum_{i=1}^{K/g} \text{Lookup}(\text{eLUT}_i, W_i)

含义: 在元素级分组,预计算 eLUT(大小 CgC^g),更细粒度、bpw 更低

符号说明:

  • CC: 权重基数(三值时 C=3C=3
  • gg: group size(三值 + SIMD 128-bit 限制下最大 g=3g=3
  • eLUT\text{eLUT}: element-wise Lookup Table,大小 CgC^g

公式 4: 1-bit 符号恢复

x=sign(sign+x),xint8, sign{0,1}x' = \text{sign} \oplus (\text{sign} + x), \quad x \in \text{int8},\ \text{sign} \in \{0, 1\}

含义: 用单个比特的 sign 恢复有符号值,通过 XOR 和 ADD 实现,兼容 AVX2/NEON

符号说明:

  • sign\text{sign}: 1-bit 符号位,00 表示正,11 表示负
  • xx: 无符号 4-bit 索引值
  • xx': 恢复后的有符号值

公式 5: ELUT 复杂度分析

Preprocessing: O ⁣(NKCgg),Accumulation: O ⁣(MNKg)\text{Preprocessing: } O\!\left(\frac{NKC^g}{g}\right),\quad \text{Accumulation: } O\!\left(\frac{MNK}{g}\right)

含义: 预处理代价随 Cg/gC^g/g 增长,累加代价随 1/g1/g 减小;对大 MM(隐藏维度)ELUT 优于 MAD

符号说明:

  • M,N,KM, N, K: 矩阵维度(MM 为隐藏维度,LLM decoding 时 N=1N=1
  • Cg/gC^g/g: LUT 预计算开销因子

公式 6: 三值 Element-wise bpw

bpwelement-wise=log2(Cg/2)g=log2(33/2)31.67\text{bpw}_{\text{element-wise}} = \frac{\log_2(C^g / 2)}{g} = \frac{\log_2(3^3 / 2)}{3} \approx 1.67

含义: 利用镜像合并将 TL2 的有效比特数降至 1.67,低于 bit-wise 的 2 bpw

符号说明:

  • 除以 2: 镜像合并将 LUT 大小减半
  • g=3g=3: TL2 的 group size

关键图表

Figure 1: 100B 模型端到端推理速度对比

Figure 1{:width 700}

说明: TL2_0 在 Intel i7-13700H 上以 1.69 tokens/s 处理 100B 模型,相比 T-MAC 快 2.32x,相比 Float16 快 6.25x。Apple M2 Ultra 达到 7.45 tokens/s。括号内为 bpw,“N/A”表示 CPU 内存不足以加载模型。

Figure 2: BitNet b1.58 无损推理示例

Figure 2{:width 600}

说明: 展示 Bitnet.cpp 如何保持 BitNet b1.58 的训练约束(per-tensor int8 激活 + 三值权重),实现推理与训练完全等价的无损推理。

Figure 3: mpGEMM 方法分类图

Figure 3{:width 600}

说明: 四象限分类:横轴为计算策略(MAD/LUT),纵轴为粒度(Bit-wise/Element-wise)。Bitnet.cpp 的 TL 填补了 Element-wise LUT 空白,I2_S 修正了 Element-wise MAD 的量化不一致。

Figure 4: K=4 时不同 mpGEMM 方法的计算差异

Figure 4{:width 600}

说明: 直观对比 MAD-based、bit-wise LUT-based、element-wise LUT-based 三种方法在 K=4 时的计算流程差异,说明 element-wise 粒度的优势。

Figure 5: TL2 符号-无符号权重分离设计

Figure 5{:width 600}

说明: TL2 将每组 3 个三值权重分解为 4-bit 无符号索引(用于 LUT 查找)和 1-bit 符号位(用于最终符号恢复),解决非整数 bpw 的内存对齐问题。

Figure 6: TL1 和 TL2 的计算序列

Figure 6{:width 600}

说明: 展示 block 组织方式(bm×bybm \times by 维度)。TL1 每 block 处理 256/bm 个元素,TL2 处理 192/bm 个元素,体现两者在寄存器利用率上的差异。

Figure 7: 多模型规模端到端性能

Figure 7{:width 700}

说明: 700M 到 100B 模型规模下的推理速度。TL2_0 在 Intel 平台全面领先,在 Apple M2 上与 T-MAC 持平或更快(大模型优势更明显)。

Figure 8: Intel i7-13700H 上 3.8B 模型多线程性能

Figure 8{:width 600}

说明: 多线程测试中,TL2_0 随线程数持续提升(memory-bound 状态来得更晚),而 T-MAC 在 5+ 线程后性能下降,印证 TL2_0 更低的 bpw 带来更低的内存压力。

Figure 9: ELUT 性能潜力曲线

Figure 9{:width 600}

说明: 理论分析 ELUT 在不同 group size 和寄存器长度下的性能上限,表明当前硬件(128-bit SIMD)尚未达到 ELUT 的理论极限。

Figure 10: 吞吐量与带宽曲线

Figure 10{:width 600}

说明: 在 Intel Core i5-13400F 上,4 线程时带宽饱和,验证 Intel 平台的内存带宽瓶颈效应(<100 GB/s vs Apple M2 Ultra 的 >800 GB/s)。

Figure 11: 寄存器长度与原始延迟关系

Figure 11{:width 600}

说明: 模拟不同 SIMD 寄存器长度(更长寄存器支持更大 group size),展示 ELUT 随寄存器扩展的加速潜力,为未来 CPU 硬件设计提供指导。

Table 2: 端到端推理质量评估

方法WikiText2 困惑度↓WinoGrande 准确率↑HellaSwag 准确率↑
Float1611.2955.3243.0
Q4_011.5755.0942.25
TL1_011.3055.3243.0
TL2_011.3055.3243.0
TL1_111.2955.3243.0
TL2_111.2955.3243.0
I2_S11.2955.3243.0

关键发现: TL1_0/TL2_0 的质量损失极小(困惑度仅差 0.01),I2_S/TL_1 系列完全无损,均优于 Q4_0 的有损量化。

Table 7: 推理速度对比(tokens/s)

Intel i7-13700H 20C 64G:

模型Float16Q4_0T-MACTQ1_0TQ2_0TL1_0TL2_0I2_S
700M30.7367.5776.29114.20123.9475.62126.99125.37
1.5B15.0235.4642.3864.8671.9243.4474.1677.75
3.8B5.8516.3318.1226.5933.1917.9135.4335.04
7B3.309.0912.2917.9619.9211.8920.7220.62
13B1.785.046.4410.5511.216.3211.4110.62
30BN/A2.132.544.625.252.654.995.70
70BN/A0.941.322.092.321.492.422.30
100BN/A0.670.731.481.610.751.691.65

Apple M2 Ultra (ARM):

模型Float16Q4_0T-MACTQ1_0TQ2_0TL1_0TL2_0I2_S
700M110.65197.38220.22217.64237.61214.53229.21238.16
1.5B59.49117.77135.27130.10145.68132.68138.28143.43
3.8B28.3171.8991.8473.1488.6690.7392.1291.65
7B14.8739.4753.3745.5554.9052.7755.4254.74
13B8.4223.2831.7225.8334.6332.1233.2232.88
30B3.7810.9816.4012.8515.4615.0219.5916.41
70B1.715.169.486.308.169.2310.378.39
100BN/A3.566.454.536.186.347.456.50

Table 3: 不同方法 bpw 对比

Cgbpw (bit-wise)bpw (element-wise)
3321.67
4222
5232.5

关键发现: 三值情况(C=3, g=3)下 element-wise 方法实现 1.67 bpw,是唯一能突破 2 bpw 限制的方案。

Table 5: TL1 权重打包映射(部分)

W[i]W[i+1]索引
-1-10000
-100001
-110010
0-10011
000100
010101
1-10110
100111
111000

说明: 9 种组合(3²)打包为 4-bit 索引,预计算 LUT 大小为 9。

Table 6: TL2 权重打包映射(样例)

W[i]W[i+1]W[i+2]符号位索引
-1-1-111101
-1-1011100
00000000
11101101

说明: 27 种三元组中镜像合并后剩 14 种有效索引,加上 1-bit 符号位,共 5 bits 分两路存储。

实验

数据集

数据集规模特点用途
WikiText2标准语言建模困惑度质量评估
WinoGrande1267 题常识推理质量评估
HellaSwag10000 题句子完成质量评估

实现细节

测试模型: bitnet_b1_58-large(HuggingFace: 1bitLLM/bitnet_b1_58-large)

推理范围: 700M ~ 100B 多个规模(通过 BitNet b1.58 系列)

测试平台: Intel i7-13700H(x86, <100 GB/s 带宽)和 Apple M2 Ultra(ARM, >800 GB/s 带宽)

测量: 每组 10 次取平均,单线程 decoding 速度(tokens/s)

对比方法: Float16、Q4_0(llama.cpp)、T-MAC、TQ1_0、TQ2_0

核心结论

I2_S vs Float16:最高 6.25x 加速

TL2_0 vs T-MAC(Intel):最高 2.32x 加速;Apple M2 上 1.19x(带宽高,LUT 优势较小)

TL2_0 vs TQ1_0(Intel):1.33x;Apple M2:1.65x

无损推理:I2_S、TL1_1、TL2_1 与 Float16 推理结果完全一致

批判性思考

优点

系统性建立了 mpGEMM 分类框架,既有理论分析(复杂度、bpw 推导)又有工程实现

TL 的镜像合并是一个简洁且有效的洞察,bpw 1.67 是三值模型理论最优的 element-wise 压缩率

Pack-and-Unpack 技术解决了 LUT 累加溢出问题,无需额外精度代价,设计优雅

面向实际部署:支持多平台(x86 AVX2 + ARM NEON),提供完整推理框架(bitnet.cpp 集成进 llama.cpp 生态)

局限性

仅针对三值 LLM 和边缘 CPU decoding 阶段,prefilling 阶段(计算密集型)未覆盖

Apple M2 Ultra 上 TL2_0 vs T-MAC 优势仅 1.19x,高带宽平台优势有限

ELUT 方法在当前 128-bit SIMD 硬件上受寄存器长度制约(g≤3),性能未达理论上限;需要更长 SIMD 寄存器才能充分释放潜力

依赖 BitNet b1.58 的 QAT 训练方案,不适用于 PTQ 得到的三值模型

潜在改进方向

扩展到 prefilling 阶段(需从 memory-bound 转向 compute-bound 的优化策略)

支持 GPU/FPGA 上的 ELUT 实现(理论分析表明 GPU 上 TBL 操作有显著优势)

随 CPU 寄存器扩展(未来 256/512-bit SIMD),可将 g 扩展至 4+,进一步降低 bpw

探索激活值量化的联合优化(目前 per-tensor int8 激活是固定约束)

可复现性评估

  • 代码开源(https://github.com/microsoft/BitNet/tree/paper)
  • 预训练模型(HuggingFace 有 large 版本,其他规模需自行训练)
  • 训练细节完整(实验平台和测量方法详细描述)
  • 数据集可获取(WikiText2、WinoGrande、HellaSwag 均为公开数据集)

关联笔记

基于

BitNet b1.58: 三值 LLM,Bitnet.cpp 的推理对象

llama.cpp: 推理框架基础,TQ1_0/TQ2_0 来自此项目

对比

T-MAC: bit-wise LUT-based mpGEMM,Bitnet.cpp TL 的直接对比方法

GPTQ: 权重量化代表方法(PTQ 路线)

方法相关

mpGEMM: 混合精度矩阵乘核心概念

Element-wise LUT: TL 系列的核心计算范式

BitNet: 1-bit LLM 前置工作

QAT: Quantization-Aware Training,BitNet b1.58 的训练范式

SIMD: 硬件加速指令集(AVX2/NEON)

硬件/数据相关

Apple M2: 高带宽 ARM 测试平台(>800 GB/s)

Intel i7-13700H: 低带宽 x86 测试平台(<100 GB/s)

速查卡片

Bitnet.cpp

  • 核心: 为三值 LLM 设计的 element-wise LUT(TL)和无损 MAD(I2_S)推理核
  • 方法: TL2(bpw=1.67,镜像合并)+ Pack-and-Unpack 无损技术 + I2_S(per-tensor 量化对齐)
  • 结果: vs Float16 最高 6.25x;vs T-MAC 最高 2.32x;I2_S/TL_1 无精度损失
  • 代码: https://github.com/microsoft/BitNet/tree/paper

笔记创建时间: 2026-03-15