- 人工智能
- 深度学习
- 分布式训练
【免费下载链接】accelerate
🚀 A simple way to launch, train, and use PyTorch models on almost any device and distributed configuration, automatic mixed precision (including fp8), and easy-to-configure FSDP and DeepSpeed support
导读
本文围绕 HuggingFace Accelerate 项目(当前仓库src/accelerate)的 模型量化指南 展开,系统讲解如何借助bitsandbytes集成,用几行代码将任意 PyTorch 模型以 8-bit 或 4-bit 精度加载,从而在显存受限的设备(如单卡 GPU、Google Colab)上运行数十亿参数的大模型。读完本文,你将掌握BnbQuantizationConfig的全部配置项与取值、load_and_quantize_model的底层加载流程、8-bit 模型保存与重新加载、CPU/磁盘模块卸载(offload)以及量化模型的 PEFT 微调注意事项。
bitsandbytes 集成总览
Accelerate 将bitsandbytes的量化能力封装进了自身工具链:你可以在不改变模型架构的前提下,把模型中的torch.nn.Linear层替换为bitsandbytes的 8-bit(bnb.nn.Linear8bitLt)或 4-bit(bnb.nn.Linear4bit)实现,其余层保持原始精度。这一集成主要落地在三个位置:
- 配置类 BnbQuantizationConfig:定义量化参数并做合法性校验;
- 加载入口 load_and_quantize_model:完成层替换、权重装载与设备分发;
- 工具导出 utils/init.py:从
accelerate.utils暴露BnbQuantizationConfig与load_and_quantize_model。
如果你使用的是transformers模型,建议直接遵循 transformers 官方量化文档(其底层同样调用 Accelerate 的这套机制),而本文面向的是任意 PyTorch 模型(示例使用 minGPT 的 GPT-2)。
环境准备(Pre-Requisites)
动手前需要安装以下依赖:
- 安装
bitsandbytes库:
pip install bitsandbytes非 CUDA 设备(如 ROCm 多后端)请参照 bitsandbytes 的安装指南,选择对应后端版本。
- 从源码安装最新版
accelerate(8-bit / 4-bit 量化能力持续演进,建议使用最新源码而非过旧的 PyPI 发布版):
pip install git+https://github.com/huggingface/accelerate.git- 安装示例依赖
minGPT与huggingface_hub:
git clone https://github.com/karpathy/minGPT.git pip install minGPT/ pip install huggingface_hub核心加载流程:init_empty_weights + load_and_quantize_model
第一步:用 init_empty_weights 构建空模型
init_empty_weights是一个上下文管理器,在其内部创建的模型所有参数都会被放到metadevice 上,因此实例化模型几乎不消耗任何显存或内存。源码见 big_modeling.py:它通过init_on_device(torch.device("meta"))劫持register_parameter,把参数注册为 meta 设备上的空张量。这解决了"先加载 FP32 模型再量化"导致的峰值内存问题。
以 minGPT 的 GPT-2 为例:
from accelerate import init_empty_weights from mingpt.model import GPT model_config = GPT.get_default_config() model_config.model_type = 'gpt2-xl' model_config.vocab_size = 50257 model_config.block_size = 1024 with init_empty_weights(): empty_model = GPT(model_config)注意:在
init_empty_weights下创建的模型没有实际权重,不能直接model.to(device),必须通过后续的权重装载函数把权重填进去(详见下文)。
第二步:获取权重路径
权重路径可以是以下任意一种:
- 一个完整的
state_dict文件(如pytorch_model.bin); - 一个分片 checkpoint 的索引
.json文件; - 一个包含唯一
.index.json索引与若干分片文件的目录; - 一个包含唯一
pytorch_model.bin文件的目录。
用huggingface_hub下载分片权重:
from huggingface_hub import snapshot_download weights_location = snapshot_download(repo_id="marcsun13/gpt2-xl-linear-sharded")第三步:配置 BnbQuantizationConfig
BnbQuantizationConfig(定义见 dataclasses.py)是量化的参数中心。其字段、默认值与说明如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
load_in_8bit | False | 是否启用 8-bit 量化 |
llm_int8_threshold | 6.0 | 离群值(outlier)阈值,仅load_in_8bit=True时生效 |
load_in_4bit | False | 是否启用 4-bit 量化 |
bnb_4bit_quant_type | "fp4" | 4-bit 量化数据类型,可选{"fp4", "nf4"} |
bnb_4bit_use_double_quant | False | 是否启用嵌套量化(对第一次量化的量化常数再次量化) |
bnb_4bit_compute_dtype | "fp16" | 计算精度,可选{"fp32", "fp16", "bf16"},输入可以是 fp32 而计算用 bf16 以提速 |
torch_dtype | None | 其余未量化层的数据类型;bitsandbytes 建议 8-bit 模型设为torch.float16,4-bit 模型与计算精度一致 |
skip_modules | None | 不参与量化的模块名列表,这些模块保持torch_dtype |
keep_in_fp32_modules | None | 不参与量化且保持torch.float32的模块名列表 |
8-bit 配置示例:
from accelerate.utils import BnbQuantizationConfig bnb_quantization_config = BnbQuantizationConfig(load_in_8bit=True, llm_int8_threshold=6)4-bit 配置示例:
from accelerate.utils import BnbQuantizationConfig bnb_quantization_config = BnbQuantizationConfig( load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4", )参数校验与自动补全(源码级细节)
从 dataclasses.py 的__post_init__可以看到以下约束:
load_in_4bit与load_in_8bit不能同时为True,也不能同时为False(否则抛ValueError);bnb_4bit_quant_type仅接受"fp4"/"nf4";bnb_4bit_compute_dtype与torch_dtype支持传入字符串("fp32"/"fp16"/"bf16")并自动转换为对应的torch.dtype;load_in_4bit=True时目标 dtype 被设为CustomDtype.INT4,load_in_8bit=True时被设为torch.int8;llm_int8_threshold仅对 8-bit 有意义,若 4-bit 下修改该值会发出警告;torch_dtype未指定时:8-bit 模型默认torch.float16,4-bit 模型默认等于bnb_4bit_compute_dtype。
第四步:加载并量化
from accelerate.utils import load_and_quantize_model quantized_model = load_and_quantize_model( empty_model, weights_location=weights_location, bnb_quantization_config=bnb_quantization_config, )底层发生了什么
load_and_quantize_model的实现位于 utils/bnb.py,核心步骤可以概括为:
- 版本检查:8-bit 需要
is_8bit_bnb_available(),4-bit 需要is_4bit_bnb_available(),版本不兼容直接报错; - 确定跳过模块:若未显式传
skip_modules,会自动调用 get_keys_to_not_convert 找出需要保持全精度的模块(典型如lm_head,以及被 tie 的权重),以保证数值稳定性;同时keep_in_fp32_modules会被追加进不转换名单; - 标记兼容属性:给模型挂上
is_loaded_in_4bit/is_loaded_in_8bit,便于 PEFT 等库识别; - 空模型分支:若模型在 meta 设备上,则在
init_empty_weights上下文中通过 replace_with_bnb_layers 递归地把所有nn.Linear替换为bnb.nn.Linear8bitLt(8-bit,传入llm_int8_threshold)或bnb.nn.Linear4bit(4-bit,传入 compute dtype、double quant、quant type),随后计算设备映射、用load_checkpoint_in_model装载权重、最后用dispatch_model分发; - 已加载模型分支:若模型已带权重,会发出"不推荐"警告后直接在原模型上做层替换与 dtype 转换(
keep_in_fp32_modules保持 fp32,其余浮点参数转为torch_dtype),并把模型搬到 GPU/XPU。
仓库测试 tests/test_quantization.py 覆盖了上述路径,包括 8-bit / 4-bit 的内存占用验证(test_memory_footprint)、线性层确实被替换为 bnb 层(test_linear_are_8bit/test_linear_are_4bit)、fp32 保留模块转换(test_fp32_8bit_conversion)、自定义 device_map 加载(test_cpu_gpu_loading_custom_device_map)等,可作为你自行验证行为的参考。
8-bit 模型的保存与重新加载
你可以用Accelerator.save_model保存量化后的模型:
from accelerate import Accelerator accelerate = Accelerator() new_weights_location = "path/to/save_directory" accelerate.save_model(quantized_model, new_weights_location) quantized_model_from_saved = load_and_quantize_model( empty_model, weights_location=new_weights_location, bnb_quantization_config=bnb_quantization_config, device_map="auto", )Accelerator.save_model(实现见 accelerator.py)默认以safetensors格式(safe_serialization=True)保存,支持按max_shard_size(默认"10GB")自动分片;若模型包含被卸载的参数,会先聚合离线的 state dict 再保存。
需要特别注意的是:4-bit 模型的序列化目前尚不支持,只有 8-bit 模型可以保存与重新加载。
将模块卸载到 CPU 与磁盘(Offload)
当 GPU 显存不足以容纳整个量化模型时,可以把部分模块卸载到 CPU 甚至磁盘,这复用了 Accelerate 大模型推理(big model inference)的底层能力(参见 大模型推理指南 与 big_modeling.py 中dispatch_model的实现)。被卸载的模块在前向传播需要时会被临时搬到 GPU,用完再放回。
- 8-bit 量化:被选中的模块会被转换为 8-bit 精度;
- 4-bit 量化:被选中的模块会保持你在
BnbQuantizationConfig中传入的torch_dtype;待 4-bit 序列化支持落地后,这些卸载模块的 4-bit 转换能力也会随之补充。
只需传入自定义device_map即可:
device_map = { "transformer.wte": 0, "transformer.wpe": 0, "transformer.drop": 0, "transformer.h": "cpu", "transformer.ln_f": "disk", "lm_head": "disk", }从 utils/bnb.py 的源码可以看到:当device_map是包含多键的字典时,值为"cpu"/"disk"的模块会被加入modules_on_cpu,并且在 4-bit 模式下会被追加到skip_modules(即这些模块不被 4-bit 化,保持torch_dtype)。
另外,若使用device_map="auto"/"balanced"/"balanced_low_0"/"sequential"等字符串策略,get_quantized_model_device_map 会结合max_memory、no_split_module_classes自动推断设备映射;其中 4-bit 模型不允许将量化模块自动派发到 CPU/磁盘——此时应显式传入自定义device_map并配合offload_folder使用。
量化模型的微调:PEFT 适配器路线
量化模型不支持纯 8-bit / 4-bit 的全量训练。可行的微调方式是参数高效微调(PEFT)——在量化权重之上训练 LoRA 等适配器。需要注意的是:
- 目前并非任意量化模型都能直接挂适配器;对于 transformers 模型,其官方已支持在量化模型上添加适配器,可遵循 transformers 官方量化文档,并参考其 4-bit 微调 demo;
- 加载用于训练的量化模型时不要传
device_map,模型会被自动加载到 GPU; device_map="auto"仅用于推理场景。
实战效果参考:Google Colab 上运行 GPT2-1.5B
官方提供了一个 Google Colab demo,演示在免费单卡环境运行量化后的 GPT2 模型。文中给出的数据(作为可复现的实测参考):GPT2-1.5B 的 FP32 检查点约占 6GB 内存;量化后,8-bit 模块占用约 1.6GB,4-bit 模块占用约 1.2GB,显存开销缩减至原来的约 1/4~1/5,这正是 bitsandbytes 集成的核心价值:让消费级 GPU 也能加载与推理大模型。
总结与适用边界
- 何时使用:单卡显存不足以加载 FP32/FP16 模型时,优先考虑 8-bit / 4-bit 量化加载;
- 核心 API 一览:
init_empty_weights(空模型)+BnbQuantizationConfig(量化参数)+load_and_quantize_model(装载与量化)+Accelerator.save_model(仅 8-bit 可保存)+ 自定义device_map(CPU/磁盘卸载); - 已知限制:4-bit 模型暂不支持序列化;量化模型只能通过 PEFT 适配器微调;4-bit 自动 device_map 不允许把量化层派发到 CPU/磁盘;
- 运行前提:量化过程需要 GPU(或 Intel XPU)环境,CPU 上无法完成 bitsandbytes 量化加载。
以上能力均可在当前仓库 src/accelerate/utils/bnb.py、src/accelerate/utils/dataclasses.py 与 tests/test_quantization.py 中进一步验证与探索。
- 人工智能
- 深度学习
- 分布式训练
【免费下载链接】accelerate
🚀 A simple way to launch, train, and use PyTorch models on almost any device and distributed configuration, automatic mixed precision (including fp8), and easy-to-configure FSDP and DeepSpeed support
相关推荐
Oumi 模型量化实战指南:基于 AWQ 与 BitsAndBytes 的 4-bit/8-bit 权重量化
Oumi 模型量化实战指南:基于 AWQ 与 BitsAndBytes 的 4 bit/8 bit 权重量化 Oumi 提供了内置的模型量化(Quantizat
人工智能大模型预训练微调强化学习模型推理服务模型评测MCP 服务分布式训练模型量化TorchVision 量化 ResNeXt 模型使用指南:基于 QuantizableResNet 的 8-bit 推理实战
TorchVision 量化 ResNeXt 模型使用指南:基于 QuantizableResNet 的 8 bit 推理实战 本文以 docs/source/
计算机视觉深度学习图像处理数据集OLMo 模型推理:基于 AutoGPTQ 的 4-bit 后训练量化实战指南
OLMo 模型推理:基于 AutoGPTQ 的 4 bit 后训练量化实战指南 本篇技术指南聚焦 OLMo 开源项目中的 LLM 推理子模块( inferenc
人工智能大模型预训练微调
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考