Hugging Face 4 位元量化與 QLoRA 發布
TL;DR
Hugging Face 發佈了 4‑位元量化(bitsandbytes)與 QLoRA 微調技術的整合,使大多數 Transformer 模型能在單一消費級 GPU 上執行並進行微調,且記憶體開銷極低。
4‑位元量化概述
- 4‑位元量化將模型權重壓縮至 4 位元,同時保持計算在較高精度(通常為 bfloat16 或 float16)。
bitsandbytes函式庫提供兩種 4‑位元格式:NF4(Normalized Float‑4,預設)與 FP4(原始 4‑位元浮點)。建議使用 NF4 以獲得較佳準確度。- 雙重量化(
bnb_4bit_use_double_quant=True)會加入第二個量化步驟,為每個參數節省約 0.4 位元。 - 量化後的權重以 4‑位元儲存,但矩陣乘法仍在 16‑或 32‑位元執行,故不需要特殊 GPU 硬體——只要 CUDA ≥ 11.2 即可。
QLoRA:量化模型的高效微調
- QLoRA 將 4‑位元量化的預訓練模型凍結,僅在 Low‑Rank Adapters(LoRA)上進行訓練。
- 訓練時,梯度會穿過凍結的 4‑位元模型流向 LoRA 層,這些層以 16‑位元 bfloat16 更新。
- 記憶體使用量降低到足以在單張 48 GB GPU 上微調 65 B 參數模型,同時匹配完整 16‑位元的效能。
- 論文引入 NormalFloat‑4 (NF4)、雙重量化與分頁優化器,以降低記憶體峰值。
- 產生的 Guanaco 系列模型在單 GPU 上經過 24 小時微調後,達到 ChatGPT Vicuna 基準分數的 99.3 %。
支援的模型與模態
- 任何可透過
accelerate的device_map參數載入的模型,都能以 4‑位元方式量化。 - 發佈時支援的架構包括 LLaMA、OPT、GPT‑Neo、GPT‑NeoX、BLOOM、CodeGen、視覺模型(例如 BLIP‑2、ViT)等(完整列表請見部落格文章)。
- 此方法同時適用於文字、視覺與多模態模型。
快速入門指南
pip install -U bitsandbytes
pip install -U git+https://github.com/huggingface/transformers.git
pip install -U git+https://github.com/huggingface/peft.git
pip install -U git+https://github.com/huggingface/accelerate.git
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
import torch
config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NF4 quantization
bnb_4bit_use_double_quant=True, # nested quantization
bnb_4bit_compute_dtype=torch.bfloat16
)
model = AutoModelForCausalLM.from_pretrained(
"facebook/opt-350m",
quantization_config=config,
device_map="auto"
)
- 使用
load_in_4bit=True(或上述的BitsAndBytesConfig)載入模型。 - 載入後請勿手動指定裝置位置,
device_map會自動處理。 - 可調整
bnb_4bit_compute_dtype以加速訓練(例如torch.bfloat16)。
使用 QLoRA 進行訓練
- 安裝 PEFT 函式庫,並在凍結的 4‑位元模型上套用 LoRA 適配器。
- Hugging Face 提供的示範 notebook 展示了在免費的 Google Colab 實例上微調 GPT‑Neo‑X(20 B)。
- 基準測試使用了 TRL 函式庫的
SFTTrainer;相關腳本可在連結的 GitHub gist 中取得。
基準測試與記憶體影響
| 模型 | FP16 大小 | GPU(VRAM) | 量化方式 | 計算資料型別 | 梯度檢查點 | 序列長度 | OOM? |
|---|---|---|---|---|---|---|---|
| LLaMA‑7B | 14 GB | 1 × T4 (16 GB) | 4‑bit NF4 + bfloat16 | bfloat16 | 否 | 512 | ✅ 無 OOM |
| LLaMA‑7B | 14 GB | 1 × T4 (16 GB) | 4‑bit NF4 + bfloat16 | bfloat16 | 是 | 1024 | ✅ 無 OOM |
| LLaMA‑13B | 27 GB | 1 × T4 (16 GB) | 4‑bit NF4 + fp16 | fp16 | 是 | 512 | ✅ 無 OOM |
| LLaMA‑13B | 27 GB | 1 × T4 (16 GB) | 4‑bit NF4 + fp16 | fp16 | 是 + 雙重量化 | 1024 | ✅ 無 OOM |
- 此表說明 4‑bit NF4 搭配雙重量化與可選的梯度檢查點,可避免在 8‑bit 或 FP16 基線下發生的記憶體不足(OOM)問題。
常見問題
- 硬體需求 – 只需相容 CUDA 的 GPU;4‑位元推論不支援 CPU。
- 模型支援 – 任何相容
acceleratedevice_map的架構皆可量化。 - 訓練 – 不支援純 4‑位元訓練;微調必須使用 PEFT 方法(如 LoRA),正如 QLoRA 論文所示。
- 使用情境 – 讓 RLHF 工作流程得以在單一 4‑位元基礎模型上,同時載入多個適配器(獎勵模型、策略模型等),且硬體需求相當低。
資源
- 論文: QLoRA (arXiv 2305.14314)
- 推論 notebook: Google Colab demo
- 微調 notebook: Google Colab fine‑tuning demo
- 程式碼: QLoRA GitHub repo
- 試玩平台: 在部落格連結的 Hugging Face Space 中試用 Guanaco 33B 模型。
影響
- 降低大型語言模型的硬體門檻,讓推論與適配器微調更易於在消費級設備上執行。
- 讓沒有大型 GPU 叢集的研究團隊也能實驗 30 B 以上的模型。
- 為在消費裝置或低成本雲端實例上部署強大聊天機器人提供了實用路徑。
致謝:此發佈感謝華盛頓大學團隊、Pedro Cuenca(審稿)、Olivier Dehaene 與 Omar Sanseviero 的整合支援。