Bitnet.cpp: Efficient Edge Inference for Ternary LLMs
论文笔记: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
三大实现挑战:
- 符号-无符号权重分离(Signed-Unsigned Weight Splitting): 分别存储 1-bit 符号权重和 4-bit 索引权重,避免连续 5-bit 存储导致的内存不对齐
- 1-bit 符号操作: 利用公式 兼容 AVX2 和 NEON 指令
- 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_0 | LUT-based | 2 | ✗ |
| TL1_1 | LUT-based | 2 | ✓ |
| TL2_0 | LUT-based | 1.67 | ✗ |
| TL2_1 | LUT-based | 1.67 | ✓ |
| I2_S | MAD-based | 2 | ✓ |
关键公式
公式 1: MAD 矩阵乘
含义: 标准逐元素乘后求和,计算复杂度 ,内存访问
符号说明:
- : 激活矩阵第 列
- : 权重矩阵第 行
- : 输出矩阵,形状
公式 2: Bit-wise LUT-based mpGEMM
含义: 在比特级分组,先预计算 bLUT(大小 ),再查表累加
符号说明:
- : 权重比特宽度(三值时 )
- : group size(决定 LUT 大小)
- : bit-wise Lookup Table,大小
公式 3: Element-wise LUT-based mpGEMM(ELUT)
含义: 在元素级分组,预计算 eLUT(大小 ),更细粒度、bpw 更低
符号说明:
- : 权重基数(三值时 )
- : group size(三值 + SIMD 128-bit 限制下最大 )
- : element-wise Lookup Table,大小
公式 4: 1-bit 符号恢复
含义: 用单个比特的 sign 恢复有符号值,通过 XOR 和 ADD 实现,兼容 AVX2/NEON
符号说明:
- : 1-bit 符号位, 表示正, 表示负
- : 无符号 4-bit 索引值
- : 恢复后的有符号值
公式 5: ELUT 复杂度分析
含义: 预处理代价随 增长,累加代价随 减小;对大 (隐藏维度)ELUT 优于 MAD
符号说明:
- : 矩阵维度( 为隐藏维度,LLM decoding 时 )
- : LUT 预计算开销因子
公式 6: 三值 Element-wise bpw
含义: 利用镜像合并将 TL2 的有效比特数降至 1.67,低于 bit-wise 的 2 bpw
符号说明:
- 除以 2: 镜像合并将 LUT 大小减半
- : TL2 的 group size
关键图表
Figure 1: 100B 模型端到端推理速度对比
{: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 无损推理示例
{:width 600}
说明: 展示 Bitnet.cpp 如何保持 BitNet b1.58 的训练约束(per-tensor int8 激活 + 三值权重),实现推理与训练完全等价的无损推理。
Figure 3: mpGEMM 方法分类图
{:width 600}
说明: 四象限分类:横轴为计算策略(MAD/LUT),纵轴为粒度(Bit-wise/Element-wise)。Bitnet.cpp 的 TL 填补了 Element-wise LUT 空白,I2_S 修正了 Element-wise MAD 的量化不一致。
Figure 4: K=4 时不同 mpGEMM 方法的计算差异
{:width 600}
说明: 直观对比 MAD-based、bit-wise LUT-based、element-wise LUT-based 三种方法在 K=4 时的计算流程差异,说明 element-wise 粒度的优势。
Figure 5: TL2 符号-无符号权重分离设计
{:width 600}
说明: TL2 将每组 3 个三值权重分解为 4-bit 无符号索引(用于 LUT 查找)和 1-bit 符号位(用于最终符号恢复),解决非整数 bpw 的内存对齐问题。
Figure 6: TL1 和 TL2 的计算序列
{:width 600}
说明: 展示 block 组织方式( 维度)。TL1 每 block 处理 256/bm 个元素,TL2 处理 192/bm 个元素,体现两者在寄存器利用率上的差异。
Figure 7: 多模型规模端到端性能
{:width 700}
说明: 700M 到 100B 模型规模下的推理速度。TL2_0 在 Intel 平台全面领先,在 Apple M2 上与 T-MAC 持平或更快(大模型优势更明显)。
Figure 8: Intel i7-13700H 上 3.8B 模型多线程性能
{:width 600}
说明: 多线程测试中,TL2_0 随线程数持续提升(memory-bound 状态来得更晚),而 T-MAC 在 5+ 线程后性能下降,印证 TL2_0 更低的 bpw 带来更低的内存压力。
Figure 9: ELUT 性能潜力曲线
{:width 600}
说明: 理论分析 ELUT 在不同 group size 和寄存器长度下的性能上限,表明当前硬件(128-bit SIMD)尚未达到 ELUT 的理论极限。
Figure 10: 吞吐量与带宽曲线
{:width 600}
说明: 在 Intel Core i5-13400F 上,4 线程时带宽饱和,验证 Intel 平台的内存带宽瓶颈效应(<100 GB/s vs Apple M2 Ultra 的 >800 GB/s)。
Figure 11: 寄存器长度与原始延迟关系
{:width 600}
说明: 模拟不同 SIMD 寄存器长度(更长寄存器支持更大 group size),展示 ELUT 随寄存器扩展的加速潜力,为未来 CPU 硬件设计提供指导。
Table 2: 端到端推理质量评估
| 方法 | WikiText2 困惑度↓ | WinoGrande 准确率↑ | HellaSwag 准确率↑ |
|---|---|---|---|
| Float16 | 11.29 | 55.32 | 43.0 |
| Q4_0 | 11.57 | 55.09 | 42.25 |
| TL1_0 | 11.30 | 55.32 | 43.0 |
| TL2_0 | 11.30 | 55.32 | 43.0 |
| TL1_1 | 11.29 | 55.32 | 43.0 |
| TL2_1 | 11.29 | 55.32 | 43.0 |
| I2_S | 11.29 | 55.32 | 43.0 |
关键发现: TL1_0/TL2_0 的质量损失极小(困惑度仅差 0.01),I2_S/TL_1 系列完全无损,均优于 Q4_0 的有损量化。
Table 7: 推理速度对比(tokens/s)
Intel i7-13700H 20C 64G:
| 模型 | Float16 | Q4_0 | T-MAC | TQ1_0 | TQ2_0 | TL1_0 | TL2_0 | I2_S |
|---|---|---|---|---|---|---|---|---|
| 700M | 30.73 | 67.57 | 76.29 | 114.20 | 123.94 | 75.62 | 126.99 | 125.37 |
| 1.5B | 15.02 | 35.46 | 42.38 | 64.86 | 71.92 | 43.44 | 74.16 | 77.75 |
| 3.8B | 5.85 | 16.33 | 18.12 | 26.59 | 33.19 | 17.91 | 35.43 | 35.04 |
| 7B | 3.30 | 9.09 | 12.29 | 17.96 | 19.92 | 11.89 | 20.72 | 20.62 |
| 13B | 1.78 | 5.04 | 6.44 | 10.55 | 11.21 | 6.32 | 11.41 | 10.62 |
| 30B | N/A | 2.13 | 2.54 | 4.62 | 5.25 | 2.65 | 4.99 | 5.70 |
| 70B | N/A | 0.94 | 1.32 | 2.09 | 2.32 | 1.49 | 2.42 | 2.30 |
| 100B | N/A | 0.67 | 0.73 | 1.48 | 1.61 | 0.75 | 1.69 | 1.65 |
Apple M2 Ultra (ARM):
| 模型 | Float16 | Q4_0 | T-MAC | TQ1_0 | TQ2_0 | TL1_0 | TL2_0 | I2_S |
|---|---|---|---|---|---|---|---|---|
| 700M | 110.65 | 197.38 | 220.22 | 217.64 | 237.61 | 214.53 | 229.21 | 238.16 |
| 1.5B | 59.49 | 117.77 | 135.27 | 130.10 | 145.68 | 132.68 | 138.28 | 143.43 |
| 3.8B | 28.31 | 71.89 | 91.84 | 73.14 | 88.66 | 90.73 | 92.12 | 91.65 |
| 7B | 14.87 | 39.47 | 53.37 | 45.55 | 54.90 | 52.77 | 55.42 | 54.74 |
| 13B | 8.42 | 23.28 | 31.72 | 25.83 | 34.63 | 32.12 | 33.22 | 32.88 |
| 30B | 3.78 | 10.98 | 16.40 | 12.85 | 15.46 | 15.02 | 19.59 | 16.41 |
| 70B | 1.71 | 5.16 | 9.48 | 6.30 | 8.16 | 9.23 | 10.37 | 8.39 |
| 100B | N/A | 3.56 | 6.45 | 4.53 | 6.18 | 6.34 | 7.45 | 6.50 |
Table 3: 不同方法 bpw 对比
| C | g | bpw (bit-wise) | bpw (element-wise) |
|---|---|---|---|
| 3 | 3 | 2 | 1.67 |
| 4 | 2 | 2 | 2 |
| 5 | 2 | 3 | 2.5 |
关键发现: 三值情况(C=3, g=3)下 element-wise 方法实现 1.67 bpw,是唯一能突破 2 bpw 限制的方案。
Table 5: TL1 权重打包映射(部分)
| W[i] | W[i+1] | 索引 |
|---|---|---|
| -1 | -1 | 0000 |
| -1 | 0 | 0001 |
| -1 | 1 | 0010 |
| 0 | -1 | 0011 |
| 0 | 0 | 0100 |
| 0 | 1 | 0101 |
| 1 | -1 | 0110 |
| 1 | 0 | 0111 |
| 1 | 1 | 1000 |
说明: 9 种组合(3²)打包为 4-bit 索引,预计算 LUT 大小为 9。
Table 6: TL2 权重打包映射(样例)
| W[i] | W[i+1] | W[i+2] | 符号位 | 索引 |
|---|---|---|---|---|
| -1 | -1 | -1 | 1 | 1101 |
| -1 | -1 | 0 | 1 | 1100 |
| 0 | 0 | 0 | 0 | 0000 |
| 1 | 1 | 1 | 0 | 1101 |
说明: 27 种三元组中镜像合并后剩 14 种有效索引,加上 1-bit 符号位,共 5 bits 分两路存储。
实验
数据集
| 数据集 | 规模 | 特点 | 用途 |
|---|---|---|---|
| WikiText2 | 标准 | 语言建模困惑度 | 质量评估 |
| WinoGrande | 1267 题 | 常识推理 | 质量评估 |
| HellaSwag | 10000 题 | 句子完成 | 质量评估 |
实现细节
测试模型: 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