Transformers 文档

GPTQ

Hugging Face's logo
加入 Hugging Face 社区

并获取增强的文档体验

开始使用

GPTQ

GPTQModelAutoGPTQ 实现了 GPTQ 算法,这是一种后训练量化技术,其中权重矩阵的每一行都独立量化,以找到最小化误差的权重版本。这些权重被量化为 int4,但在推理期间动态恢复为 fp16。这可以节省 4 倍的内存使用量,因为 int4 权重在融合内核中反量化,而不是在 GPU 的全局内存中。推理也更快,因为较低的位宽占用更少的通信时间。

AutoGPTQ 在未来可能会被弃用,因为它缺乏对新模型和功能的持续支持。有关更多详细信息,请参阅 GPTQModel 部分。

首先安装 Accelerate、Transformers 和 Optimum。

pip install --upgrade accelerate optimum transformers

然后运行以下命令安装 GPTQ 库。

GPTQmodel
AutoGPTQ
pip install gptqmodel --no-build-isolation

创建一个 GPTQConfig 类,并设置要量化的位数、用于校准量化权重的数据集以及用于准备数据集的分词器。

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m")
gptq_config = GPTQConfig(bits=4, dataset="c4", tokenizer=tokenizer)

您可以将您自己的数据集作为字符串列表传递,但强烈建议使用 GPTQ 论文中的相同数据集。

dataset = ["auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm."]
gptq_config = GPTQConfig(bits=4, dataset=dataset, tokenizer=tokenizer)

加载要量化的模型并将 GPTQConfig 传递给 from_pretrained()。设置 device_map="auto" 以自动将模型卸载到 CPU 以帮助将模型放入内存,并允许模型模块在 CPU 和 GPU 之间移动以进行量化。

quantized_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m", device_map="auto", quantization_config=gptq_config)

如果您因为数据集太大而内存不足(不支持磁盘卸载),请尝试传递 max_memory 参数以分配设备(GPU 和 CPU)上要使用的内存量。

quantized_model = AutoModelForCausalLM.from_pretrained(
    "facebook/opt-125m",
    device_map="auto",
    max_memory={0: "30GiB", 1: "46GiB", "cpu": "30GiB"},
    quantization_config=gptq_config
)

根据您的硬件,从头开始量化模型可能需要一些时间。在免费层级的 Google Colab GPU 上量化 facebook/opt-350m 模型可能需要约 5 分钟,但在 NVIDIA A100 上量化 175B 参数模型将需要约 4 小时。在量化模型之前,最好检查 Hub 是否已存在模型的 GPTQ 量化版本。

模型量化后,您可以使用 push_to_hub() 将模型和分词器推送到 Hub,以便轻松共享和访问。这将保存 GPTQConfig

quantized_model.push_to_hub("opt-125m-gptq")
tokenizer.push_to_hub("opt-125m-gptq")

save_pretrained() 在本地保存量化模型。如果模型是使用 device_map 参数量化的,请确保在保存之前将整个模型移动到 GPU 或 CPU。下面的示例将模型保存在 CPU 上。

quantized_model.save_pretrained("opt-125m-gptq")
tokenizer.save_pretrained("opt-125m-gptq")

# if quantized with device_map set
quantized_model.to("cpu")
quantized_model.save_pretrained("opt-125m-gptq")

使用 from_pretrained() 重新加载量化模型,并设置 device_map="auto" 以自动将模型分布在所有可用的 GPU 上,从而更快地加载模型,而无需使用比所需更多的内存。

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto")

Marlin

Marlin 是一个仅支持 4 位的 CUDA GPTQ 内核,针对 NVIDIA A100 GPU (Ampere) 架构进行了高度优化。后量化权重的加载、反量化和执行高度并行化,与原始 CUDA GPTQ 内核相比,提供了显着的推理改进。Marlin 仅适用于量化推理,不支持模型量化。

可以使用 GPTQConfig 中的 backend 参数激活 Marlin 推理。


from transformers import AutoModelForCausalLM, GPTQConfig

model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto", quantization_config=GPTQConfig(bits=4, backend="marlin"))

ExLlama

仅支持 4 位模型,如果您使用 PEFT 微调量化模型,我们建议停用 ExLlama 内核。

ExLlamaLlama 模型的 Python/C++/CUDA 实现,旨在通过 4 位 GPTQ 权重实现更快的推理(查看这些基准测试)。当您创建 GPTQConfig 对象时,默认情况下会激活 ExLlama 内核。

为了进一步提高推理速度,请通过配置 GPTQConfig 中的 exllama_config 参数来使用 ExLlamaV2 内核。

import torch
from transformers import AutoModelForCausalLM, GPTQConfig

gptq_config = GPTQConfig(bits=4, exllama_config={"version":2})
model = AutoModelForCausalLM.from_pretrained(
    "{your_username}/opt-125m-gptq",
    device_map="auto",
    quantization_config=gptq_config
)

仅当整个模型都在 GPU 上时才支持 ExLlama 内核。如果您在 CPU 上使用 AutoGPTQ 0.4.2+ 进行推理,请在 GPTQConfig 中禁用 ExLlama 内核。这将覆盖 config.json 文件的量化配置中与 ExLlama 内核相关的属性。

import torch
from transformers import AutoModelForCausalLM, GPTQConfig

gptq_config = GPTQConfig(bits=4, use_exllama=False)
model = AutoModelForCausalLM.from_pretrained(
    "{your_username}/opt-125m-gptq",
    device_map="cpu",
    quantization_config=gptq_config
)

GPTQModel

建议使用 GPTQModel,它最初是 AutoGPTQ 的一个维护分支,因为它后来与 AutoGTPQ 分道扬镳,并具有一些重要功能。GPTQModel 具有更快的量化速度、更低的内存使用率和更准确的默认量化。

GPTQModel 提供非对称量化,与对称量化相比,它可以潜在地降低量化误差。它与 AutoGPTQ 不向后兼容,并非所有内核 (Marlin) 都支持非对称量化。

GPTQModel 还更广泛地支持最新的 LLM 模型、多模态模型(Qwen2-VL 和 Ovis1.6-VL)、平台(Linux、macOS、Windows 11)和硬件(AMD ROCm、Apple Silicon、Intel/AMD CPU 和 Intel Datacenter Max/Arc GPU 等)。

Marlin 内核也针对 A100 GPU 进行了更新,其他内核也进行了更新,以包括对旧模型和具有非均匀输入/输出特征的模型的自动填充。

资源

运行带有 PEFT 的 GPTQ 量化 notebook 以获得实践经验,并阅读 Making LLMs lighter with AutoGPTQ and transformers 以了解有关 AutoGPTQ 集成的更多信息。

< > 在 GitHub 上更新