Optimum 文档

量化

您正在查看的是需要从源码安装。如果您想通过 pip 进行常规安装,请查看最新的稳定版本 (v1.27.0)。
Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

量化

AutoGPTQ 集成

🤗 Optimum 与 AutoGPTQ 库 合作,提供了一个简单的 API,可对语言模型应用 GPTQ 量化。通过 GPTQ 量化,您可以将自己喜欢的语言模型量化到 8、4、3 甚至 2 位。这不会导致性能大幅下降,并且推理速度更快。大多数 GPU 硬件都支持此功能。

如果您想使用 GPTQ 量化 🤗 Transformers 模型,请参阅此文档

要了解有关 GPTQ 中使用的量化技术的更多信息,请参阅

请注意,AutoGPTQ 库提供了更多高级用法(triton 后端、融合注意力、融合 MLP),这些用法尚未与 Optimum 集成。目前,我们只利用了 GPTQ 的 CUDA 内核。

要求

您需要安装以下要求才能运行以下代码

  • AutoGPTQ 库:`pip install auto-gptq`

  • Optimum 库:`pip install --upgrade optimum`

  • 从源代码安装最新的 `transformers` 库:`pip install --upgrade git+https://github.com/huggingface/transformers.git`

  • 安装最新的 `accelerate` 库:`pip install --upgrade accelerate`

加载和量化模型

`GPTQQuantizer` 类用于量化您的模型。为了量化您的模型,您需要提供一些参数

  • 位数:`bits`
  • 用于校准量化的数据集:`dataset`
  • 用于处理数据集的模型序列长度:`model_seqlen`
  • 要量化的块名称:`block_name_to_quantize`

通过 🤗 Transformers 集成,您无需传递 `block_name_to_quantize` 和 `model_seqlen`,因为我们可以检索它们。但是,对于自定义模型,您需要指定它们。另外,请确保您的模型在量化之前已转换为 `torch.float16`。

from transformers import AutoModelForCausalLM, AutoTokenizer
from optimum.gptq import GPTQQuantizer, load_quantized_model
import torch
model_name = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)

quantizer = GPTQQuantizer(bits=4, dataset="c4", block_name_to_quantize = "model.decoder.layers", model_seqlen = 2048)
quantized_model = quantizer.quantize_model(model, tokenizer)
GPTQ 量化目前仅适用于文本模型。此外,量化过程可能需要很长时间,具体取决于硬件(175B 模型使用 NVIDIA A100 需要 4 个 GPU 小时)。请在 Hugging Face Hub 上检查您想量化的模型是否已有 GPTQ 量化版本。

保存模型

要保存您的模型,请使用 `GPTQQuantizer` 类的保存方法。它将创建一个文件夹,其中包含您的模型状态字典和量化配置。

save_folder = "/path/to/save_folder/"
quantizer.save(model,save_folder)

加载量化权重

您可以使用 `load_quantized_model()` 函数加载量化权重。通过 Accelerate 库,可以更快地加载模型并降低内存使用。模型需要使用空权重进行初始化,然后作为下一步加载权重。

from accelerate import init_empty_weights
with init_empty_weights():
    empty_model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
empty_model.tie_weights()
quantized_model = load_quantized_model(empty_model, save_folder=save_folder, device_map="auto")

Exllama 内核,实现更快推理

随着 exllamav2 内核的发布,与 exllama 内核相比,4 位模型的推理速度更快。它默认激活:`load_quantized_model()` 中的 `disable_exllamav2=False`。要使用这些内核,您需要将整个模型放在 GPU 上。

from optimum.gptq import GPTQQuantizer, load_quantized_model
import torch

from accelerate import init_empty_weights
with init_empty_weights():
    empty_model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
empty_model.tie_weights()
quantized_model = load_quantized_model(empty_model, save_folder=save_folder, device_map="auto")

如果您希望使用 exllama 内核,则需要通过设置 `exllama_config` 来更改版本

from optimum.gptq import GPTQQuantizer, load_quantized_model
import torch

from accelerate import init_empty_weights
with init_empty_weights():
    empty_model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
empty_model.tie_weights()
quantized_model = load_quantized_model(empty_model, save_folder=save_folder, device_map="auto", exllama_config = {"version":1})

请注意,目前 exllama/exllamav2 内核仅支持 4 位模型。此外,建议在您使用 peft 微调模型时禁用 exllama/exllamav2 内核。

您可以在此处找到这些内核的基准测试

微调量化模型

在 Hugging Face 生态系统中,通过官方支持适配器,您可以微调已使用 GPTQ 量化的模型。有关更多详细信息,请参阅 `peft` 库。

< > 在 GitHub 上更新