Hugging Face 4 位量化与 QLoRA 发布
TL;DR
Hugging Face 发布了 4‑bit 量化(bitsandbytes)与 QLoRA 微调技术的集成,使得大多数 Transformer 模型能够在单个消费级 GPU 上运行并进行适配,内存开销极小。
4‑bit 量化概述
- 4‑bit 量化将模型权重压缩至 4 位,同时保持计算在更高精度(通常为 bfloat16 或 float16)。
bitsandbytes库提供两种 4‑bit 格式:NF4(Normalized Float‑4,默认)和 FP4(原始 4‑bit 浮点)。推荐使用 NF4 以获得更好精度。- 双重量化 (
bnb_4bit_use_double_quant=True) 增加第二层量化步骤,可为每个参数节省约 0.4 位。 - 量化后的权重以 4‑bit 存储,但矩阵乘法在 16‑或 32‑位下执行,因此不需要特殊 GPU 硬件——仅需 CUDA ≥ 11.2。
QLoRA:高效微调量化模型
- QLoRA 冻结 4‑bit 量化的预训练模型,并注入低秩适配器(LoRA)作为唯一可训练参数。
- 训练期间,梯度通过冻结的 4‑bit 模型流向 LoRA 层,后者在 16‑bit bfloat16 中更新。
- 内存使用大幅降低,能够在单块 48 GB GPU 上微调 65 B 参数模型,同时匹配完整 16‑bit 的性能。
- 论文引入 NormalFloat‑4 (NF4)、双重量化以及分页优化器,以保持内存峰值低。
- 由此产生的 Guanaco 系列模型在单卡微调 24 h 后,达到 ChatGPT Vicuna 基准分数的 99.3%。
支持的模型与模态
- 任何可以使用
accelerate的device_map参数加载的模型,都可以进行 4‑bit 量化。 - 截至本次发布,支持的架构包括 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 量化
bnb_4bit_use_double_quant=True, # 嵌套量化
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‑bit 模型上使用 LoRA 适配器。
- Hugging Face 提供的示例 notebook 展示了在免费 Google Colab 实例上微调 GPT‑Neo‑X(20 B)。
- 基准测试使用了 TRL 库中的
SFTTrainer;相关脚本可在链接的 GitHub gist 中获取。
基准测试与内存影响
| 模型 | FP16 大小 | GPU (显存) | 量化方式 | 计算数据类型 | 梯度检查点 | 序列长度 | 是否 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‑bit 推理不支持 CPU。
- 模型支持 – 任何兼容
accelerate的device_map的架构均可量化。 - 训练 – 不支持纯 4‑bit 训练;微调必须使用 PEFT 方法(如 LoRA),正如 QLoRA 论文所示。
- 使用场景 – 使得 RLHF 流程成为可能,单个 4‑bit 基础模型可在普通硬件上承载多个适配器(奖励模型、策略等)。
资源
- 论文: QLoRA (arXiv 2305.14314)
- 推理 notebook: Google Colab 演示
- 微调 notebook: Google Colab 微调演示
- 代码: QLoRA GitHub 仓库
- 试玩: 在博客中链接的 Hugging Face Space 试用 Guanaco 33B 模型。
含义
- 通过降低推理和适配器微调的硬件门槛,使大语言模型更加大众化。
- 为没有大型 GPU 集群的研究团队提供实验 30 B 以上模型的可能性。
- 为在消费设备或低成本云实例上部署强大聊天机器人提供了实用路径。
致谢: 本次发布归功于华盛顿大学团队、Pedro Cuenca(审阅)、Olivier Dehaene 与 Omar Sanseviero 的集成支持。