🚀 BitNet b1.58 2B4T - 扩展原生1位大语言模型
本仓库包含 BitNet b1.58 2B4T 的权重文件。这是由微软研究院开发的首个开源、原生1位大语言模型(LLM),参数规模达20亿。
该模型在4万亿个标记的语料库上进行训练,证明了原生1位大语言模型可以达到与同规模领先的开放权重、全精度模型相当的性能,同时在计算效率(内存、能源、延迟)方面具有显著优势。
➡️ 技术报告:BitNet b1.58 2B4T技术报告
➡️ 官方推理代码:microsoft/BitNet (bitnet.cpp)
✨ 主要特性
- 低精度量化:采用原生1.58位权重和8位激活值(W1.58A8),在保证性能的同时大幅降低计算资源需求。
- 高效架构:基于Transformer架构,使用
BitLinear
层进行优化,提升计算效率。
- 多阶段训练:经过预训练、有监督微调(SFT)和直接偏好优化(DPO)等多个阶段,使模型更好地符合人类偏好。
📦 安装指南
要求
pip install git+https://github.com/huggingface/transformers.git@096f25ae1f501a084d8ff2dcaf25fbc2bd60eba4
💻 使用示例
基础用法
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "microsoft/bitnet-b1.58-2B-4T"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16
)
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)
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)
print("\nAssistant Response:", response)
📚 详细文档
模型变体
Hugging Face上提供了该模型权重的多个版本:
模型详情
属性 |
详情 |
架构 |
基于Transformer,使用BitLinear 层(BitNet框架)进行修改。使用旋转位置嵌入(RoPE);在FFN层使用平方ReLU(ReLU²)激活函数;采用subln 归一化;线性层和归一化层无偏置项。 |
量化 |
原生1.58位权重和8位激活值(W1.58A8)。前向传播时,权重使用绝对值均值量化为三元值{-1, 0, +1};激活值使用绝对值最大值量化(按标记)为8位整数。关键的是,该模型是使用此量化方案从头开始训练的,而非训练后量化。 |
参数 |
约20亿 |
训练标记 |
4万亿 |
上下文长度 |
最大序列长度为4096个标记。建议:对于需要非常长上下文的任务(超出预训练长度或用于专门的长推理任务),建议在最终微调阶段之前进行中间长序列适应/训练。 |
训练阶段 |
1. 预训练:使用两阶段学习率和权重衰减策略,在公共文本/代码和合成数学数据上进行大规模训练。2. 有监督微调(SFT):使用求和损失聚合和特定超参数调整,在遵循指令和对话数据集上进行微调。3. 直接偏好优化(DPO):使用偏好对与人类偏好对齐。 |
分词器 |
LLaMA 3分词器(词汇表大小:128,256) |
如何使用(使用bitnet.cpp
)
请参考 bitnet.cpp GitHub仓库获取详细的编译步骤、使用示例和命令行选项。
评估
BitNet b1.58 2B4T与同规模领先的开放权重全精度大语言模型进行了对比评估。以下是关键结果(所有模型均为指令调优版本):
基准测试 |
LLaMA 3.2 1B |
Gemma-3 1B |
Qwen2.5 1.5B |
SmolLM2 1.7B |
MiniCPM 2B |
BitNet b1.58 2B |
内存(非嵌入) |
2GB |
1.4GB |
2.6GB |
3.2GB |
4.8GB |
0.4GB |
延迟(CPU解码) |
48ms |
41ms |
65ms |
67ms |
124ms |
29ms |
能源(估计) |
0.258J |
0.186J |
0.347J |
0.425J |
0.649J |
0.028J |
训练标记(预训练) |
9T* |
2T** |
18T |
11T |
1.1T |
4T |
ARC挑战 |
37.80 |
38.40 |
46.67 |
43.52 |
44.80 |
49.91 |
ARC简单 |
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 |
平均 |
44.90 |
43.74 |
55.23 |
48.70 |
42.05 |
54.19 |
*LLaMA 3.2 1B使用剪枝和蒸馏技术。
**Gemma-3 1B使用蒸馏技术。
重要提示和使用建议
⚠️ 重要提示
使用标准的transformers库(即使使用所需的分支)使用此模型时,请不要期望在性能效率(速度、延迟或能源消耗方面)有所提升。当前transformers内的执行路径不包含利用BitNet架构优势所需的专门、高度优化的计算内核。通过transformers运行模型可能会导致推理速度和能源使用与该框架内的标准全精度模型相当,甚至可能更差。虽然由于量化权重,您可能会观察到内存使用减少,但通过这种标准transformers使用路径无法获得主要的计算效率优势。要实现技术论文中展示的效率优势,您必须使用专用的C++实现:bitnet.cpp。
💡 使用建议
对于需要非常长上下文的任务(超出预训练长度或用于专门的长推理任务),建议在最终微调阶段之前进行中间长序列适应/训练。
📄 许可证
模型权重和代码根据 MIT许可证 发布。
🔧 技术细节
偏差、风险和局限性
- 预测可能会延续训练数据中存在的偏差。
- 对非英语语言和代表性不足的领域支持有限。
- 存在生成不准确或有害内容的风险。
- Bitnet模型在回答与选举相关的关键查询时缺陷率较高,可能会导致呈现不正确或无权威性的选举关键信息。我们正在努力改进模型在这方面的性能。用户应向所在地区的选举机构核实与选举相关的信息。
免责声明
我们不建议在未经进一步测试和开发的情况下将BitNet b1.58用于商业或实际应用。此模型旨在用于研究和开发目的。虽然已通过SFT和DPO进行了对齐,但它仍可能产生意外、有偏差或不准确的输出。请谨慎使用。