BitsAndBytes(简称 BnB)是一个用于“压缩”大语言模型的工具包
BitsAndBytes(简称 BnB)是一个用于“压缩”大语言模型的工具包,能把模型从原来的16位或32位,压成4位或8位,减少显存占用,同时保持尽量高的精度。
🧩 为什么叫 Bits and Bytes?
它的名字就揭示了它的本质:
- Bits(比特):指的是更小单位的表示,比如 4-bit、8-bit 的低精度表示。
- Bytes(字节):指的是标准 8-bit 表示 或 更多位的数据。
合在一起,意思是“控制模型用多少位来表示参数”,从而节省资源。
💡 为什么要用 BitsAndBytes?
训练/推理 大型语言模型(LLaMA、GPT、Mistral 等)时,如果使用原始精度(16-bit float),会导致:
- 显存爆炸(16GB 显卡跑不动)
- 加载速度慢
- 部署成本高
而 BitsAndBytes 允许我们把模型压缩成 8-bit 或 4-bit,让你:
✅ 在消费级显卡上运行
✅ 加载更快
✅ 精度损失小,可控
🔢 举例说明:原始模型 vs BnB 压缩模型
以 LLaMA 2-7B 模型为例:
模型格式 | 占用显存(大概) | 精度情况 |
---|---|---|
FP16 原始模型 | 14~16 GB | 精度最高 |
BnB 8-bit 模型 | 8~9 GB | 精度接近 |
BnB 4-bit 模型 | 4~5.5 GB | 精度略降 |
🔧 技术实现
BitsAndBytes 使用了两种核心压缩方式:
压缩类型 | 说明 | 举例 |
---|---|---|
8-bit 量化 | 把每个参数从 16-bit → 8-bit | 数值范围从 ±65536 → ±256 |
4-bit 量化 | 每个参数用 4-bit 表示,更极限 | 一个 float 压缩为 16 分之一大小 |
它也提供了三种主流 量化模式(不用深究,但知道名字有用):
nf4
(最常用,效果稳定)fp4
(浮点 4bit)int4
(整数 4bit)
🧪 示例:怎么用 BitsAndBytes 加载压缩模型(Python)
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers import BitsAndBytesConfig# 配置 4-bit 加载
bnb_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_compute_dtype="float16", # 用 fp16 来计算bnb_4bit_quant_type="nf4", # 用 NF4 量化算法
)model_name = "unsloth/llama-3.1-8b-unsloth-bnb-4bit"model = AutoModelForCausalLM.from_pretrained(model_name,quantization_config=bnb_config,device_map="auto"
)tokenizer = AutoTokenizer.from_pretrained(model_name)
📌 总结一下,说得更简单点:
- BitsAndBytes 就是个压缩工具包,能让大模型“瘦身”,轻松跑在普通电脑上;
- 你只要看到 bnb-4bit、bnb-8bit,就知道用了这个工具;
- Unsloth 只是把它优化得更厉害一些而已。
🧱 1. 什么是「量化(Quantization)」?
把模型里那些“高精度的数字”变成“低精度的小数字”,以此来减少模型体积、降低显存占用、提升加载速度。
🎯 举个例子:
比如你有个模型参数是:
原始值:0.123456789(float32,32位)
如果我们只保留4位小数:
量化后:0.1235(float16 或 8-bit 或 4-bit)
你会失去一点精度,但整体性能几乎没变,资源节省巨大!
🧠 2. FP16 是什么?
✅ 定义:
FP16
= “16-bit Floating Point”- 是一种精度比 float32 低、但比 8-bit 高的数据格式
✅ 用途:
- 用来训练或推理大型模型时节省内存
- 精度和速度之间取得平衡,几乎不影响模型效果
🔢 3. 什么是 4-bit?
✅ 定义:
- 表示每个参数只用 4位(半个字节)来存储
- 比 FP16(16位)压缩了 4倍
✅ 代价:
- 节省显存最多
- 但精度有所降低(不同算法影响不同)
🛠️ 4. BitsAndBytes 是什么?
✅ 定义:
BitsAndBytes(简称 BnB)是一个库,用于自动把大模型做成 8-bit 或 4-bit 的压缩版本,并且保持它们能在 GPU 上跑。
✅ 用法:
- 在 Transformers 中加载模型时配合使用:
from transformers import BitsAndBytesConfig
✅ 支持的压缩方式:
模式 | 含义 | 用处 |
---|---|---|
bnb-8bit | 8-bit 量化 | 精度几乎不降,省一半显存 |
bnb-4bit | 4-bit 量化 | 精度略降,显存最省 |
🧱 5. 什么是 bnb-4bit?
✅ 定义:
就是“使用 BitsAndBytes 工具,将模型压缩成 4bit 精度的版本”。
你看到名字中有:
llama-2-7b-bnb-4bit
就说明这个模型:
- 是用 BitsAndBytes 压成了 4-bit
- 通常占用显存为原始的 1/4 ~ 1/3
- 精度比 FP16 略低,但在很多实际应用中,效果差异不大
🧩 总结一下:区别和联系
术语 | 类别 | 是啥? | 举例 | 和别人啥关系 |
---|---|---|---|---|
量化 | 技术名词 | 降低模型精度压缩模型 | FP32 → 8bit → 4bit | 总称,下面几种都属于量化方式 |
FP16 | 精度类型 | 用16位浮点表示参数 | 原始模型的精简版 | 是一种 中等压缩的量化方式 |
4-bit | 精度类型 | 每个参数只用4位表示 | 参数值范围更小 | 精度最低,但节省显存最多 |
BitsAndBytes | 工具 | 把模型压成 4bit/8bit 工具 | bnb-4bit 就是它压的 | 是 实现量化的工具库 |
bnb-4bit | 文件/模型后缀 | 使用 BitsAndBytes 做的 4-bit 模型 | llama-2-7b-bnb-4bit | 是 4-bit 的一种具体实现方式 |
📌 举个通俗场景类比
想象你有一本书:
格式 | 类比 |
---|---|
FP32 | 原版硬皮精装书 |
FP16 | 纸质平装版 |
bnb-8bit | 黑白复印本 |
bnb-4bit | 缩印+删图版手册 |
你还能看懂它在讲啥,但体积轻多了。
✅ 如果你在开发中怎么选?
你拥有的资源 | 推荐格式 | 使用方式 |
---|---|---|
显卡很强(A100/4090) | FP16 或 FP32 | 不用压缩,保持最佳精度 |
显卡一般(8GB) | bnb-4bit | 用 BitsAndBytes 量化运行 |
CPU 推理 | GGUF+CPU 模式 | 用 llama.cpp 加载 .gguf |
🧠 一句话总结:
FP32、FP16、8bit、4bit 都是表示数字的格式,表示的越精细,占用的空间越大。
压缩后模型运行更快、显存占用更小,但精度也会降低。
📦 它们的关系(由高到低精度):
格式 | 全称 | 精度(位) | 精度高吗? | 显存占用 | 举例 |
---|---|---|---|---|---|
FP32 | Float 32位 | 32-bit | ⭐⭐⭐⭐⭐ | 🟥最大 | 0.1234567890123456 (精确) |
FP16 | Float 16位 | 16-bit | ⭐⭐⭐⭐☆ | 🟧中等 | 0.1234 (舍去一部分小数) |
8bit | 整数8位 | 8-bit | ⭐⭐☆☆☆ | 🟨小 | 0.12 (小数更少) |
4bit | 整数4位 | 4-bit | ⭐☆☆☆☆ | 🟩最小 | 0.1 (最粗略的近似) |
💬 用比喻来说:
格式 | 类比成衣服定制 |
---|---|
FP32 | 高级西装,按厘米剪裁(超精准) |
FP16 | 成衣店西装,按大中小分尺码(较精准) |
8bit | 淘宝快时尚,按身高估尺码(能穿) |
4bit | 地摊衣服,只分男女(凑合能穿) |
🔢 用数字实际表示的范围与精度
假设你要保存数字 0.123456789
格式 | 实际能保存成啥 |
---|---|
FP32 | 0.123456789 (全部保留) |
FP16 | 0.1235 (只保留4位有效) |
8bit | 0.12 (可能只有两位有效) |
4bit | 0.1 (基本靠近大概意思) |
🧪 举个真实例子:加载 LLaMA2-7B 模型
格式 | 模型大小 | 显存要求 | 精度变化 | 是否可训练 |
---|---|---|---|---|
FP32 | 14GB+ | 28~32GB | 无损 | ✅ 可训练 |
FP16 | ~13GB | 14~16GB | 几乎无损 | ✅ 可训练 |
8bit | ~8GB | 8~9GB | 有些误差 | ❌ 通常只推理 |
4bit | ~4.2GB | 5~6GB | 精度损失多 | ❌ 通常只推理 |
🔧 技术区别
格式 | 类型 | 是否浮点 | 描述 |
---|---|---|---|
FP32 | 浮点数 | ✅ 是 | 32位浮点,训练 & 推理标准格式 |
FP16 | 浮点数 | ✅ 是 | 用一半的位表示 float |
8bit | 整数/量化 | ❌ 否 | 一般用于推理(int8) |
4bit | 整数/量化 | ❌ 否 | 极致压缩,用于推理(int4) |
✅ 什么时候用哪个?
你有的显存/算力 | 推荐格式 | 原因 |
---|---|---|
>= 32GB 显存 | FP32 | 最高精度,适合训练 |
>= 16GB 显存 | FP16 | 精度接近 FP32,适合训练和推理 |
>= 8GB 显存 | 8bit | 可跑大模型推理,损失精度较少 |
>= 4GB 显存 | 4bit | 极限压缩,仅用于推理,速度快 |
🧠 总结一句话:
想省资源用 4bit 或 8bit,
想高精度用 FP16 或 FP32,
模型越小、速度越快,精度也会越低。