GPTQ
该 AutoGPTQ 库实现了 GPTQ 算法,一种训练后量化技术,其中权重矩阵的每一行都被独立量化以找到一个最小化误差的权重版本。这些权重被量化为 int4,但在推理期间动态恢复为 fp16。这可以将内存使用量节省 4 倍,因为 int4 权重在融合内核而不是 GPU 的全局内存中进行反量化,而且您还可以预期推理速度加快,因为使用较低位宽需要更少的时间进行通信。
在开始之前,请确保安装了以下库
pip install auto-gptq pip install --upgrade accelerate optimum transformers
要量化模型(目前仅支持文本模型),您需要创建一个 GPTQConfig 类,并设置要量化的位数、用于校准量化权重的数据集和用于准备数据集的标记器。
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
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)
加载要量化的模型,并将 gptq_config
传递给 from_pretrained() 方法。设置 device_map="auto"
以自动将模型卸载到 CPU 上,以帮助将模型放入内存,并允许模型模块在 CPU 和 GPU 之间移动以进行量化。
quantized_model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=gptq_config)
如果您因数据集过大而内存不足,则不支持磁盘卸载。如果是这种情况,请尝试将 max_memory
参数传递给分配要在您的设备(GPU 和 CPU)上使用的内存量。
quantized_model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", max_memory={0: "30GiB", 1: "46GiB", "cpu": "30GiB"}, quantization_config=gptq_config)
根据您的硬件,从头开始量化模型可能需要一些时间。量化 facebook/opt-350m 模型在免费层的 Google Colab GPU 上可能需要约 5 分钟,但在 NVIDIA A100 上量化一个 175B 参数的模型可能需要约 4 个小时。在量化模型之前,最好检查 Hub,看看 GPTQ 量化版本的模型是否已存在。
模型量化后,您可以将模型和标记器推送到 Hub,以便轻松共享和访问。使用 push_to_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")
ExLlama
ExLlama 是 Llama 模型的 Python/C++/CUDA 实现,旨在通过 4 位 GPTQ 权重实现更快的推理(查看这些 基准测试)。当您创建 GPTQConfig 对象时,ExLlama 内核会默认激活。要进一步提高推理速度,请使用 ExLlamaV2 内核,方法是配置 exllama_config
参数
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)
仅支持 4 位模型,如果您使用 PEFT 微调量化模型,我们建议禁用 ExLlama 内核。
仅当整个模型都在 GPU 上时,才支持 ExLlama 内核。如果您使用 AutoGPTQ(版本 > 0.4.2)在 CPU 上进行推理,则需要禁用 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)