随着大语言模型的发展,参数量逐渐扩大,大语言模型的训练和运行通常需要大量的计算资源,这也限制了大语言模型在一些场景尤其是端侧的应用,所以,探索剪枝,蒸馏等量化方式,已经成为大语言模型研究的一个重要方向。
近期微软开源了bitnet-b1.58-2B-4T模型,bitnet是一种在极低比特权重运行的模型架构。传统的量化如int8量化,甚至更低int4,int2等,通过进一步的降低精度,理论上提升了模型的工作效率,降低了模型工作需要的计算资源,但同时按照经验来看,量化的性能下降风险很大,随着精度的降低,保持模型的准确率越发的困难。
而量化的最终理论极限是1位,其中权重被限制为仅两个值(例如 +1 和 -1)。
这就是二值神经网络 (BNN) 的领域。BitNet 的核心思想是通过采用 1 位权重表示来大幅降低 LLM 的计算成本。如果权重为二进制 (+1/-1),那么 Transformer 中计算最密集的运算——矩阵乘法——可以在很大程度上被简单的加减运算所取代。这有望带来以下优势:
大幅减少内存:存储权重仅需要一位,而不是 16 位或 32 位。
显著加速:加法在计算上比浮点乘法便宜得多。
更低的能耗:操作越简单,消耗的电量就越少。
然而,训练稳定且准确的 BNN,尤其是在 LLM 规模上,已被证明极其困难。在训练过程中直接将权重量化为 +1/-1 可能会阻碍学习过程,通常会导致与全精度模型相比质量损失显著。
虽然最初的 BitNet 概念可能旨在实现纯 1 位权重,但“b1.58”是另一种一种具体的、略有不同的量化方案。此名称对应于1.58 位表示,这在数学上源于使用三进制权重。三进制量化允许权重取三个值: +1、0 或 -1,而不仅仅是两个值 (+1, -1)。
为什么是三进制的?
引入稀疏性:将权重表示为“0”的能力使模型能够有效地“关闭”某些连接,从而引入稀疏性。这有利于提高模型容量,并且可能比纯二元网络(每个连接都必须为正或负)更容易训练。
提升表示能力(相对于 1 位):虽然精度仍然极低,但三种可能状态(+1、0、-1)比两种状态(+1、-1)提供了略高的灵活性。这种小幅提升对于维持复杂语言任务的性能至关重要。
保持效率:与二进制权重类似,三进制权重仍然允许矩阵乘法以加法/减法为主(乘以 +1、-1 或 0 较为简单)。相比 FP16,其核心效率优势基本保持不变。
“1.58 位”来自信息论计算:log₂(3) ≈ 1.58。每个参数大约需要 1.58 位信息来存储其状态(+1、0 或 -1)。
该实现可能涉及用nn.Linear
自定义层替换 Transformer 架构中的标准层,该自定义BitLinear
层在前向和后向传递期间对其权重强制实施此三元约束。
同时模型的size为20亿参数量,训练用的tokens为4T。
BitNet b1.58 2B4T 与类似规模的领先开放权重全精度LLM 进行了比较。以下是主要结果(所有模型均为指令调优版本):
Benchmark | LLaMA 3.2 1B | Gemma-3 1B | Qwen2.5 1.5B | SmolLM2 1.7B | MiniCPM 2B | BitNet b1.58 2B |
Memory (Non-emb) | 2GB | 1.4GB | 2.6GB | 3.2GB | 4.8GB | 0.4GB |
Latency (CPU Decoding) | 48ms | 41ms | 65ms | 67ms | 124ms | 29ms |
Energy (Estimated) | 0.258J | 0.186J | 0.347J | 0.425J | 0.649J | 0.028J |
Training Tokens (Pre-train) | 9T* | 2T** | 18T | 11T | 1.1T | 4T |
ARC-Challenge | 37.80 | 38.40 | 46.67 | 43.52 | 44.80 | 49.91 |
ARC-Easy | 63.17 | 63.13 | 76.01 | 62.92 | 72.14 | 74.79 |
OpenbookQA | 34.80 | 38.80 | 40.80 | 46.00 | 40.20 | 41.60 |
BoolQ | 64.65 | 74.22 | 78.04 | 75.78 | 80.67 | 80.18 |
HellaSwag | 60.80 | 57.69 | 68.28 | 71.71 | 70.81 | 68.44 |
PIQA | 74.21 | 71.93 | 76.12 | 76.12 | 76.66 | 77.09 |
WinoGrande | 59.51 | 58.48 | 62.83 | 68.98 | 61.80 | 71.90 |
CommonsenseQA | 58.48 | 42.10 | 76.41 | 63.55 | 71.74 | 71.58 |
TruthfulQA | 43.80 | 38.66 | 46.67 | 39.90 | 41.41 | 45.31 |
TriviaQA | 37.60 | 23.49 | 38.37 | 45.97 | 34.13 | 33.57 |
MMLU | 45.58 | 39.91 | 60.25 | 49.24 | 51.82 | 53.17 |
HumanEval+ | 31.10 | 37.20 | 50.60 | 28.00 | 43.90 | 38.40 |
GSM8K | 38.21 | 31.16 | 56.79 | 45.11 | 4.40 | 58.38 |
MATH-500 | 23.00 | 42.00 | 53.00 | 17.60 | 14.80 | 43.40 |
IFEval | 62.71 | 66.67 | 50.12 | 57.91 | 36.81 | 53.48 |
MT-bench | 5.43 | 6.40 | 6.12 | 5.50 | 6.57 | 5.85 |
Average | 44.90 | 43.74 | 55.23 | 48.70 | 42.05 | 54.19 |
使用transformers进行推理:
环境安装:
!pip install git+https://github.com/shumingma/transformers.git
示例代码
import torch
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_id = "AI-ModelScope/bitnet-b1.58-2B-4T"
# Load tokenizer and model
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16
)
# Apply the chat template
messages = [
{"role": "system", "content": "You are a helpful AI assistant."},
{"role": "user", "content": "How are you?"},
]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
chat_input = tokenizer(prompt, return_tensors="pt").to(model.device)
# Generate response
chat_outputs = model.generate(**chat_input, max_new_tokens=50)
response = tokenizer.decode(chat_outputs[0][chat_input['input_ids'].shape[-1]:], skip_special_tokens=True) # Decode only the response part
print("\nAssistant Response:", response)
使用bitnet.cpp推理
git clone --recursive https://github.com/microsoft/BitNet.git
cd BitNet
# 在个人电脑建议安装虚拟环境
# 在魔搭免费CPU notebook资源不需要安装虚拟环境
# python3.11 -m venv 3.11
# source 3.11/bin/activate
pip install -r requirements.txt
pip install modelscope
modelscope download AI-ModelScope/bitnet-b1.58-2B-4T-gguf --local_dir models/BitNet-b1.58-2B-4T
python setup_env.py -md models/BitNet-b1.58-2B-4T -q i2_s
python run_inference.py -m models/BitNet-b1.58-2B-4T/ggml-model-i2_s.gguf -p "You are a helpful assistant" -cnv
推理性能(MAC M2芯片)