趋近智
提供动手示例,展示如何将标准预训练模型转换为GGUF、GPTQ和AWQ等量化格式,并借助Hugging Face Optimum和bitsandbytes等工具进行加载和使用。重点关注可应用于您自己项目的实际流程。
开始之前,请确保您已安装所需的库。我们将主要使用Hugging Face生态系统中的库以及与特定格式相关的工具。您还需要一个基础的预训练模型进行操作。为演示目的,这些示例中我们将使用 gpt2 或 distilbert-base-uncased 等较小的模型,但这些原理也适用于更大的LLM。
# 安装用于一般transformers使用、Optimum和特定量化工具的库
pip install transformers torch accelerate optimum[exporters]
# 针对GPTQ (CPU/GPU)
pip install auto-gptq
# 针对GGUF转换和加载 (CPU)
pip install ctransformers[cpu] # 或者 ctransformers[cuda] 支持GPU
# 您可能还需要克隆llama.cpp仓库以获取其转换脚本
# git clone https://github.com/ggerganov/llama.cpp.git
# cd llama.cpp
# pip install -r requirements.txt
注意: 确切的依赖项和设置可能因特定模型、硬件(CPU/GPU)和所选量化库(例如,auto-gptq 在量化期间需要CUDA以加速GPU)而异。请始终查阅您所用工具的文档。我们假定您已安装PyTorch并配置好合适的Python环境。
ctransformers加载GGUF因在CPU上高效运行模型而广受欢迎,常与llama.cpp项目相关联。让我们将Hugging Face模型转换为GGUF,并使用提供便捷Python接口的ctransformers库来加载它。
将Hugging Face模型转换为GGUF的标准方法是使用llama.cpp仓库中提供的convert.py脚本。
下载基础模型: 确保您要转换的模型已下载到本地,或者可以通过其Hugging Face标识符(例如,gpt2)访问。
运行转换脚本: 在终端中导航到您克隆的llama.cpp目录。基本命令结构如下所示:
python convert.py /path/to/your/huggingface/model \
--outfile ./output_model.gguf \
--outtype q4_0 # 指定所需的量化类型(例如,q4_0, q5_k_m, q8_0)
/path/to/your/huggingface/model替换为您下载的模型目录的实际路径(包含config.json、pytorch_model.bin等),或者如果是脚本支持直接加载,则替换为Hugging Face模型ID。--outfile指定输出GGUF文件的名称和位置。--outtype定义量化策略。llama.cpp支持多种类型;q4_0(4比特量化,方法0)是显著减小尺寸的常见起点。请查阅llama.cpp文档,获取可用类型(如f16代表float16,q4_k_m代表4比特K-quants medium,q8_0代表8比特等)的详细说明。一旦您有了.gguf文件,就可以使用ctransformers加载它。
from ctransformers import AutoModelForCausalLM
# 指定您的GGUF文件路径
gguf_model_path = "./output_model.gguf"
# 加载量化模型
# 如有需要,指定model_type(例如'llama', 'gpt2'),通常可以从文件中推断出来
llm = AutoModelForCausalLM.from_pretrained(gguf_model_path, model_type='gpt2')
# 生成文本(示例)
prompt = "Quantization is the process of"
print(f"Prompt: {prompt}")
output_tokens = llm(prompt, stream=False, max_new_tokens=50) # stream=False 用于简化输出
print(f"Generated Text: {output_tokens}")
# 示例输出(会有所不同):
# 提示: 量化是...的过程
# 生成文本: 减少用于表示模型参数(如权重和激活)的数字精度。这可以减少模型的内存占用,并能加速推理速度,特别是在为低精度算术优化的硬件上。然而,它可能会影响模型的...
这演示了加载GGUF模型并执行基本推理。ctransformers处理了与底层llama.cpp库交互的复杂性。
AutoGPTQ或Transformers加载GPTQ是流行的PTQ方法,通常在低比特率(如4比特)下能产生良好的准确性。我们可以使用AutoGPTQ或Hugging Face Optimum等库执行量化,然后加载生成的模型。
这里是使用auto-gptq库的一个示例。此过程通常需要支持CUDA的GPU以获得合理的速度。
from transformers import AutoModelForCausalLM, AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
import torch
# --- 配置 ---
model_id = "gpt2" # 或另一个合适的模型
quantized_model_dir = "gpt2-gptq-4bit"
calibration_data = ["Quantization is important for LLMs.",
"Large language models require significant compute.",
"Reducing model size helps deployment."] # 示例校准数据
# --- 加载基础模型和分词器 ---
tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=True)
# 如果缺少填充令牌则添加(GPT-2常见)
if tokenizer.pad_token is None:
tokenizer.add_special_tokens({'pad_token': '[PAD]'})
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16, low_cpu_mem_usage=True)
# 如果添加了填充令牌,则调整令牌嵌入大小
model.resize_token_embeddings(len(tokenizer))
# --- 准备校准数据 ---
# 对校准数据集进行分词
tokenized_calibration_data = [tokenizer(text, return_tensors="pt").input_ids for text in calibration_data]
# --- 定义量化配置 ---
# 常见选择:4比特,分组大小128
quantize_config = BaseQuantizeConfig(
bits=4, # 量化的比特数
group_size=128, # 量化分组大小(权重被分组在一起)
desc_act=False, # 使用激活降序(有时可提高准确性)
damp_percent=0.1, # Hessian计算的阻尼百分比
dataset=tokenized_calibration_data # 如果格式正确,直接传递分词数据
)
# --- 执行量化 ---
# 封装基础模型以进行量化
quantized_model = AutoGPTQForCausalLM.from_pretrained(model, quantize_config)
# 开始量化过程(需要GPU)
print("Starting GPTQ quantization...")
quantized_model.quantize(tokenized_calibration_data) # 再次传递分词数据以进行处理
print("Quantization complete.")
# --- 保存量化模型和分词器 ---
# 确保分词器也保存在同一目录中
quantized_model.save_quantized(quantized_model_dir, use_safetensors=True)
tokenizer.save_pretrained(quantized_model_dir)
print(f"Quantized model saved to {quantized_model_dir}")
关于GPTQ的重要提示:
auto-gptq的量化步骤计算量大,并极大受益于支持CUDA的GPU。bits、group_size、desc_act和damp_percent是您可以调整的超参数,用于平衡准确性与模型大小/速度。您可以再次使用AutoGPTQForCausalLM加载已保存的GPTQ模型,或者如果格式兼容(特别是当使用use_safetensors=True保存时),通常也可以直接通过Hugging Face transformers加载。
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# 量化模型保存的路径
quantized_model_dir = "gpt2-gptq-4bit"
# 加载量化模型和分词器
# 如有需要,使用AutoGPTQ类,或直接尝试Transformers
# model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0") # 使用AutoGPTQ加载器
# 或通常更简单地使用Transformers(如果保存正确)
tokenizer = AutoTokenizer.from_pretrained(quantized_model_dir)
model = AutoModelForCausalLM.from_pretrained(
quantized_model_dir,
device_map="auto", # 自动将部分放置在可用设备(GPU/CPU)上
torch_dtype=torch.float16 # 通常需要以兼容
)
print(f"Loaded quantized model from {quantized_model_dir}")
# 生成文本(示例)
prompt = "Running inference with a GPTQ model is"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device) # 确保输入在同一设备上
outputs = model.generate(**inputs, max_new_tokens=50)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"Prompt: {prompt}")
print(f"Generated Text: {generated_text}")
# 示例输出(会有所不同):
# 提示: 使用GPTQ模型运行推理是
# 生成文本: 使用GPTQ模型运行推理通常比原始FP16或FP32模型更快,并需要更少的内存。AutoGPTQ库提供了方便的方法来高效加载和运行这些量化模型,通常会利用优化的内核以提升性能。
AWQ(激活感知权重校准)是另一种先进的PTQ方法。通常,您会发现Hugging Face Hub上已有使用AWQ量化的模型。加载它们通常很直接,类似于加载GPTQ模型,只要模型仓库中包含必要的配置即可。
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# 预量化AWQ模型的示例ID(请替换为实际ID)
# 注意:为简单演示寻找公开、小型的AWQ模型较难。
# 这只是一个示例。您通常会使用更大的模型ID。
awq_model_id = "casperhansen/mistral-7b-instruct-v0.1-awq" # 大型AWQ模型的示例
print(f"Attempting to load AWQ model: {awq_model_id}")
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(awq_model_id)
# 加载模型 - 需要安装 'pip install autoawq'
# device_map="auto" 有助于在可用设备上分配
model = AutoModelForCausalLM.from_pretrained(
awq_model_id,
device_map="auto",
torch_dtype=torch.float16 # AWQ通常与float16激活配合使用
)
print("AWQ model loaded successfully.")
# 生成文本(推理步骤与GPTQ类似)
prompt = "AWQ quantization focuses on"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=40)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"Prompt: {prompt}")
print(f"Generated Text: {generated_text}")
注意: 加载AWQ模型通常需要安装特定的后端库,例如
autoawq(pip install autoawq)。如果模型仓库设置正确,transformers中的from_pretrained方法会处理必要的配置加载。
加载量化模型后,如何确保它确实以较低精度运行?
auto-gptq中的QuantLinear或bitsandbytes中的特定层)替换。您可能会找到与比例、零点或比特宽度相关的属性。此次实践会话展示了将模型转换为GGUF和GPTQ格式,并使用相关Python库进行加载。具体的工具和命令可能会有所演变,但在LLM量化体系中,转换/量化然后加载的核心流程在不同格式和库之间保持一致。使用不同模型和量化设置进行这些步骤的实践,对于理解它们的实际用途很有必要。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造