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,
模型越小、速度越快,精度也會越低。