2026 年 8 月,微软开源了 BitNet 推理框架,用 1.58 bit 三值权重量化技术,让 100B 参数的大模型在单 CPU 上跑到 5-7 tok/s,x86 平台下比 llama.cpp 快 2.37 ~ 6.17 倍,能耗降低 82%。

这不是标题党。我们来拆一下背后的技术逻辑。


传统量化的天花板

LLM 部署的第一大痛点是显存。以 FP16 加载一个 70B 模型需要约 140GB 显存,单张消费级显卡想都别想。于是量化成了标配:INT8(8 bit)、INT4(4 bit)依次登场,把模型体积压缩到原来的 1/2 ~ 1/4。

但传统量化有两个硬伤:

  1. 量化误差不可逆——从 16 bit 压缩到 4 bit,每压缩一级都丢失信息,4 bit 几乎是工程可行性的下限。
  2. 乘法仍然很贵——INT4 推理仍然依赖浮点矩阵乘法,CPU 上的吞吐量被 SIMD 指令宽度和内存带宽双重卡死。

也就是说,传统量化的天花板本质上不是精度,而是计算模式没有变


三值量化:把乘法变成加减法

BitNet 的核心创新是 1.58 bit 三值权重。每一个权重只取三个值:-1、0、+1。

等一下,1.58 这个数字怎么来的?

log⁡2(3)≈1.585\log_2(3) \approx 1.585log2(3)1.585

因为三个取值只需要 log⁡2(3)\log_2(3)log2(3) bit 就能编码。这就比 2 bit 还小,逼近信息论意义上"三态"的极限。

更关键的是:当权重只剩 -1、0、+1 时,矩阵乘法退化成了加减法。 输入向量中的每个元素与 +1 相乘等于保留原值,与 -1 相乘等于取反,与 0 相乘等于跳过。整个前向传播变成了条件加减累加——CPU 最擅长的事情。

下面是一个简化的推理内核示意:

def bitnet_linear(x, weight_sign, weight_mask, bias):
    """
    x:          (in_features,) 输入向量
    weight_sign: (out_features, in_features) 权重的符号,取值为 -1 / 1
    weight_mask: (out_features, in_features) 非零掩码,True 表示权重非零
    bias:       (out_features,) 偏置
    """
    out = bias.clone()
    for o in range(out_features):
        acc = 0.0
        for i in range(in_features):
            if weight_mask[o, i]:
                acc += x[i] if weight_sign[o, i] > 0 else -x[i]
        out[o] = acc
    return out

实际工程实现比这复杂得多(需要用位运算压缩存储、SIMD 向量化、多线程并行),但核心思想就是这样:矩阵乘法 → 条件加减


为什么 CPU 上反而更快

这听起来反直觉:GPU 的 FLOPS 是 CPU 的几十倍,怎么会反过来?

关键在于计算密度变了

  • FP16 下,每个权重占 2 字节,一个 100B 模型光权重就 200GB,远超出任何单卡显存。即使用多卡拆分,PCIe 带宽也会成为瓶颈。
  • 1.58 bit 下,一个权重只占约 0.2 字节(含掩码和符号的压缩编码),100B 模型压缩到约 20GB。这个量级刚好能塞进高端服务器的 DDR5 内存。

于是整个推理链路变成:从内存读权重 → CPU 做加减法 → 输出。瓶颈从"显存不够"变成了"内存带宽",而 DDR5 的带宽(单通道约 50-60 GB/s,八通道近 500 GB/s)完全能撑起 5-7 tok/s 的吞吐。

微软官方给出的 x86 性能对比:

框架模型规模硬件吞吐 (tok/s)能耗
llama.cpp (Q4)70B双路 Xeon1-2基准 (100%)
BitNet100B双路 Xeon5-718%
llama.cpp (Q4)13BM2 Ultra~15基准
BitNet100BM2 Ultra30+更低

注:以上数据综合自微软官方博客及社区早期评测,实际表现因硬件配置而异。


工程实践:从训练到部署

BitNet 不是事后量化方案,而是 训练时就用三值权重。它的训练流程大致是:

  1. 全精度影子权重:训练时维护一份 FP16/FP32 的影子权重,梯度更新照常进行。
  2. 前向三值化:每次前向传播前,将影子权重量化为 -1/0/+1(通过一个与绝对值成正比的概率函数来决定取 0 还是取 ±1,这个 trick 被称为 “stochastic ternarization”)。
  3. 直通估计器 (STE):反向传播时梯度直接穿过量化函数,近似更新影子权重。

训练完成后,影子权重被丢弃,只保留最终的三值权重编码和 scale 因子。

部署就更简单了:官方提供了 C++ 推理库,支持 x86 AVX-512 和 ARM NEON 两种指令集加速,一行命令启动:

bitnet serve --model /path/to/bitnet-model \
             --threads 32 \
             --ctx-len 8192

现实局限与展望

目前 BitNet 有几个明确的局限:

  • 模型需要从头用 BitNet 架构训练,不能直接把现有 LLaMA/Qwen 等模型转成 1.58 bit。微软已经释出了几个官方训练好的 BitNet 变体,但社区生态还在早期。
  • 精度天花板:三值权重的表达能力天然弱于全精度。在复杂推理、数学、代码等强依赖精细权重交互的任务上,同参数量的 BitNet 模型目前仍落后于 FP16 基线。这也是为什么 100B 才能追平传统 70B 的推理质量——“用参数数量换权重精度”。
  • 训练成本:从零训一个 100B 的 BitNet 并不比训传统模型便宜多少。真正的收益在推理端。

但这些局限挡不住趋势。当部署成本从"8 张 A100"变成"一台双路 Xeon 服务器",LLM 的落地场景会剧烈膨胀:边缘计算、离线设备、隐私敏感场景、成本敏感的中小企业——全部受益。


从 INT8 到 INT4 到 1.58 bit,量化的故事一直在讲"更小";BitNet 进一步证明了"更小"有时反而"更快"。当矩阵乘法变成加减法,算力壁垒被结构性地削平了一大块。这才是真正的 game changer。


标签:#大模型推理 #模型量化 #BitNet #CPU推理 #微软开源 #深度学习工程

更多推荐