加速文档

模型量化

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

模型量化

bitsandbytes 集成

Accelerate 将 bitsandbytes 量化引入你的模型。现在你可以通过几行代码,以 8 位或 4 位加载任何 pytorch 模型。

如果你想将 Transformers 模型与 bitsandbytes 一起使用,你应该遵循这份文档

要了解更多关于 bitsandbytes 量化如何工作的信息,请查看关于 8 位量化4 位量化 的博客文章。

先决条件

你将需要安装以下要求

  • 安装 bitsandbytes
pip install bitsandbytes

对于非 CUDA 设备,你可以参考 bitsandbytes 安装指南 这里

  • 从源码安装最新的 accelerate
pip install git+https://github.com/huggingface/accelerate.git
  • 安装 minGPThuggingface_hub 以运行示例
git clone https://github.com/karpathy/minGPT.git
pip install minGPT/
pip install huggingface_hub

工作原理

首先,我们需要初始化我们的模型。为了节省内存,我们可以使用上下文管理器 init_empty_weights() 初始化一个空模型。

让我们以 minGPT 库中的 GPT2 模型为例。

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)

然后,我们需要获取模型权重的路径。路径可以是 state_dict 文件(例如 “pytorch_model.bin”)或包含分片检查点的文件夹。

from huggingface_hub import snapshot_download
weights_location = snapshot_download(repo_id="marcsun13/gpt2-xl-linear-sharded")

最后,你需要使用 BnbQuantizationConfig 设置你的量化配置。

这是一个 8 位量化的示例

from accelerate.utils import BnbQuantizationConfig
bnb_quantization_config = BnbQuantizationConfig(load_in_8bit=True, llm_int8_threshold = 6)

这是一个 4 位量化的示例

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")

要使用选定的配置量化你的空模型,你需要使用 load_and_quantize_model()

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)

保存和加载 8 位模型

你可以使用 accelerate 的 save_model() 保存你的 8 位模型。

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")

请注意,目前不支持 4 位模型序列化。

将模块卸载到 CPU 和磁盘

如果你的 GPU 上没有足够的空间来存储整个模型,你可以将一些模块卸载到 CPU/磁盘。这在底层使用了大型模型推理。查看这份 文档 以获取更多详细信息。

对于 8 位量化,选定的模块将被转换为 8 位精度。

对于 4 位量化,选定的模块将保持在用户在 BnbQuantizationConfig 中传入的 torch_dtype 中。当 4 位序列化成为可能时,我们将添加支持以将这些卸载的模块转换为 4 位。

你只需要传入一个自定义的 device_map 即可将模块卸载到 CPU/磁盘。卸载的模块将在需要时被调度到 GPU 上。这是一个示例

device_map = {
    "transformer.wte": 0,
    "transformer.wpe": 0,
    "transformer.drop": 0,
    "transformer.h": "cpu",
    "transformer.ln_f": "disk",
    "lm_head": "disk",
}

微调量化模型

无法在这些模型上执行纯 8 位或 4 位训练。但是,你可以通过利用参数高效微调方法 (PEFT) 来训练这些模型,例如在它们之上训练适配器。请查看 peft 库以获取更多详细信息。

目前,你无法在任何量化模型之上添加适配器。但是,随着 Transformers 模型正式支持适配器,你可以微调量化模型。如果你想微调 Transformers 模型,请遵循这份 文档。查看这个 演示,了解如何微调 4 位 Transformers 模型。

请注意,在加载模型进行训练时,你不需要传递 device_map。它会自动将你的模型加载到你的 GPU 上。请注意,device_map=auto 应该仅用于推理。

示例演示 - 在 Google Colab 上运行 GPT2 1.5b

查看 Google Colab 演示,了解如何在 GPT2 模型上运行量化模型。GPT2-1.5B 模型检查点为 FP32 格式,使用 6GB 内存。量化后,使用 8 位模块时使用 1.6GB,使用 4 位模块时使用 1.2GB。

< > 在 GitHub 上更新