Optimum 文档
量化
并获得增强的文档体验
开始使用
量化
AutoGPTQ 集成
🤗 Optimum 与 AutoGPTQ 库 合作,提供了一个简单的 API,用于在语言模型上应用 GPTQ 量化。通过 GPTQ 量化,您可以将您喜欢的语言模型量化为 8、4、3 甚至 2 位。这不会带来大的性能下降,并且具有更快的推理速度。大多数 GPU 硬件都支持这一点。
如果您想使用 GPTQ 量化 🤗 Transformers 模型,请遵循此文档。
要了解有关 GPTQ 中使用的量化技术的更多信息,请参考
请注意,AutoGPTQ 库提供了更高级的用法(triton 后端、融合注意力机制、融合 MLP),这些用法尚未与 Optimum 集成。目前,我们仅利用 CUDA 内核进行 GPTQ。
要求
您需要安装以下要求才能运行以下代码
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)
保存模型
要保存您的模型,请使用 GPTQQuantizer
类中的 save 方法。它将创建一个文件夹,其中包含您的模型状态字典以及量化配置。
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 内核的发布,与 4 位模型的 exllama 内核相比,您可以获得更快的推理速度。默认情况下它是激活的:在 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
库以获取更多详细信息。