Accelerate 模型量化实战:基于 bitsandbytes 的 8-bit / 4-bit 模型加载与推理
2026/9/24 16:05:02 网站建设 项目流程
  • 人工智能
  • 深度学习
  • 分布式训练

【免费下载链接】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

项目地址:https://gitcode.com/gh_mirrors/ac/accelerate
点击查看免费下载

导读

本文围绕 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暴露BnbQuantizationConfigload_and_quantize_model

如果你使用的是transformers模型,建议直接遵循 transformers 官方量化文档(其底层同样调用 Accelerate 的这套机制),而本文面向的是任意 PyTorch 模型(示例使用 minGPT 的 GPT-2)。

环境准备(Pre-Requisites)

动手前需要安装以下依赖:

  1. 安装bitsandbytes库:
pip install bitsandbytes

非 CUDA 设备(如 ROCm 多后端)请参照 bitsandbytes 的安装指南,选择对应后端版本。

  1. 从源码安装最新版accelerate(8-bit / 4-bit 量化能力持续演进,建议使用最新源码而非过旧的 PyPI 发布版):
pip install git+https://github.com/huggingface/accelerate.git
  1. 安装示例依赖minGPThuggingface_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_8bitFalse是否启用 8-bit 量化
llm_int8_threshold6.0离群值(outlier)阈值,仅load_in_8bit=True时生效
load_in_4bitFalse是否启用 4-bit 量化
bnb_4bit_quant_type"fp4"4-bit 量化数据类型,可选{"fp4", "nf4"}
bnb_4bit_use_double_quantFalse是否启用嵌套量化(对第一次量化的量化常数再次量化)
bnb_4bit_compute_dtype"fp16"计算精度,可选{"fp32", "fp16", "bf16"},输入可以是 fp32 而计算用 bf16 以提速
torch_dtypeNone其余未量化层的数据类型;bitsandbytes 建议 8-bit 模型设为torch.float16,4-bit 模型与计算精度一致
skip_modulesNone不参与量化的模块名列表,这些模块保持torch_dtype
keep_in_fp32_modulesNone不参与量化且保持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_4bitload_in_8bit不能同时为True,也不能同时为False(否则抛ValueError);
  • bnb_4bit_quant_type仅接受"fp4"/"nf4"bnb_4bit_compute_dtypetorch_dtype支持传入字符串("fp32"/"fp16"/"bf16")并自动转换为对应的torch.dtype
  • load_in_4bit=True时目标 dtype 被设为CustomDtype.INT4load_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,核心步骤可以概括为:

  1. 版本检查:8-bit 需要is_8bit_bnb_available(),4-bit 需要is_4bit_bnb_available(),版本不兼容直接报错;
  2. 确定跳过模块:若未显式传skip_modules,会自动调用 get_keys_to_not_convert 找出需要保持全精度的模块(典型如lm_head,以及被 tie 的权重),以保证数值稳定性;同时keep_in_fp32_modules会被追加进不转换名单;
  3. 标记兼容属性:给模型挂上is_loaded_in_4bit/is_loaded_in_8bit,便于 PEFT 等库识别;
  4. 空模型分支:若模型在 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分发;
  5. 已加载模型分支:若模型已带权重,会发出"不推荐"警告后直接在原模型上做层替换与 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_memoryno_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

项目地址:https://gitcode.com/gh_mirrors/ac/accelerate
点击查看免费下载

相关推荐

上一篇:魔兽争霸III终极修复指南:5分钟解决现代系统兼容性问题
下一篇:精准高效:WeChatExporter自定义日期区间导出微信聊天记录实用指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询