Transformers 文档
GPTQ
并获得增强的文档体验
开始使用
GPTQ
GPTQModel 和 AutoGPTQ 实现了 GPTQ 算法,这是一种训练后量化技术,其中权重矩阵的每一行都独立量化,以找到使误差最小化的权重版本。这些权重被量化为 int4,但在推理过程中会动态恢复为 fp16。这可以将内存使用量节省 4 倍,因为 int4 权重在融合内核中进行反量化,而不是在 GPU 的全局内存中。推理速度也更快,因为较低的位宽需要更少的通信时间。
由于缺乏对新模型和功能的持续支持,AutoGPTQ 未来可能会被弃用。有关更多详细信息,请参阅 GPTQModel 部分。
首先安装 Accelerate、Transformers 和 Optimum。
pip install --upgrade accelerate optimum transformers
然后运行以下命令安装 GPTQ 库。
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 仅适用于量化推理,不支持模型量化。
Marlin 推理可以通过 GPTQConfig 中的 backend
参数激活。
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 内核。
ExLlama 是 Llama 模型的 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
)
ExLlama 内核仅在整个模型位于 GPU 上时才受支持。如果您正在 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 进行了更新,其他内核也已更新,以包含对旧模型和具有非均匀输入/输出特征的模型的自动填充。
资源
运行 GPTQ 量化与 PEFT notebook 获取实践经验,并阅读 使用 AutoGPTQ 和 Transformers 使 LLM 更轻量化 以了解有关 AutoGPTQ 集成的更多信息。
< > 在 GitHub 上更新