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)根据您的硬件,从头开始量化模型可能需要一些时间。在免费的Google Colab GPU上量化facebook/opt-350m模型可能需要约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 是一个 Python/C++/CUDA 实现的 Llama 模型,旨在通过 4 位 GPTQ 权重实现更快的推理(查看这些 基准测试)。当您创建 GPTQConfig 对象时,ExLlama 内核默认激活。为了进一步提高推理速度,可以通过配置 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)仅支持4位模型,如果您正在使用PEFT微调量化模型,我们建议停用ExLlama内核。
ExLlama 内核仅在模型完全在 GPU 上时受支持。如果您在 CPU 上使用 AutoGPTQ(版本 > 0.4.2)进行推理,则需要禁用 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)