趋近智
GPTQ 和 AWQ 等精密的量化技术,以及评估所得模型性能和准确性的方法,是优化大型语言模型 (LLM) 的重要策略。然而,应用这些技术通常不只是运行一个使用默认设置的脚本那么简单。量化库提供的默认参数通常是一个合理的起点,但要为您的特定应用获得模型大小、推理速度和准确性之间的最佳平衡,往往需要仔细调整。本实践指南将引导您调整常用的量化参数,以有效应对这些权衡,尤其是在处理潜在的准确性下降问题时。
可以把量化参数看作是您可以调节的旋钮,以影响最终模型。调节一个旋钮可能会提高推理速度,但会略微降低准确性,而另一个旋钮可能会恢复准确性,但代价是模型略大或量化过程变慢。目标是为您的应用程序需求找到最佳平衡点。
我们将侧重于训练后量化 (PTQ) 方法中常见的参数,例如 GPTQ 和 AWQ,它们在 AutoGPTQ 或 AutoAWQ 等库中得到实现。
假设您使用默认设置的 GPTQ 将一个 70 亿参数的 LLM 量化为 INT4。初步评估(使用第 3 章的方法)显示以下结果:
我们现在的目标是调整量化参数以恢复部分损失的准确性,必要时,可能接受性能或模型大小的微小权衡。
PTQ 方法依赖于校准数据集,通过观察激活的典型范围来确定最佳量化参数(如缩放因子和零点)。该数据集的大小和代表性很重要。
假设我们最初的量化使用了 128 个样本。我们可以尝试增加这个数量。
# 量化函数使用示例
from model_quantizer import quantize_gptq # 虚构库
# 加载模型和分词器
model = AutoModelForCausalLM.from_pretrained("your_base_model")
tokenizer = AutoTokenizer.from_pretrained("your_base_model")
# 加载或准备校准数据(例如,来自相关数据集的样本)
calibration_data = load_calibration_data("path/to/calibration_set.jsonl")
# 初始量化(示例)
# quantize_gptq(model, tokenizer, calibration_data, num_samples=128, output_dir="quantized_model_128")
# 实验:增加校准样本数量
print("正在使用 256 个校准样本进行量化...")
quantize_gptq(model, tokenizer, calibration_data, num_samples=256, output_dir="quantized_model_256")
print("正在使用 512 个校准样本进行量化...")
quantize_gptq(model, tokenizer, calibration_data, num_samples=512, output_dir="quantized_model_512")
# 每次运行后,评估准确性(困惑度、下游任务)和性能
接下来,您将评估使用 256 和 512 个样本生成的模型。准确性是否提升了?提升了多少?这种提升是否值得更长的量化时间?通常,在某个点之后回报会递减。
图表展示了随着校准数据集大小的增加,困惑度可能如何降低(提升),同时提升的速度通常会减缓。
像 GPTQ 和 AWQ 这样的算法通常不是按张量或按通道进行量化,而是对层内较小的权重组进行量化。group_size 参数控制有多少权重共享相同的量化参数(缩放因子和零点)。
# 调整组大小示例
from model_quantizer import quantize_gptq # 虚构库
# 假设模型、分词器、数据已按之前方式加载
num_calib_samples = 256 # 根据上一步或合理默认值选择
# 实验组大小(默认可能为 128)
print("正在使用 group_size=64 进行量化...")
quantize_gptq(model, tokenizer, calibration_data,
num_samples=num_calib_samples,
group_size=64,
output_dir="quantized_model_gs64")
print("正在使用 group_size=32 进行量化...")
quantize_gptq(model, tokenizer, calibration_data,
num_samples=num_calib_samples,
group_size=32,
output_dir="quantized_model_gs32")
# 评估每个组大小下的准确性和性能
在使用不同组大小进行量化后,评估其中的权衡。与 group_size=64 或 group_size=128 相比,group_size=32 是否显著提高了准确性?模型大小增加了多少?推理延迟受到怎样的影响?
此图显示,减小组大小(例如,从 128 减到 32)可能会提高准确性,但可能略微增加延迟。最佳选择取决于应用程序要求。
一些量化算法具有独特的超参数。例如,GPTQ 在计算用于权重更新的逆 Hessian 矩阵时,会使用一个阻尼因子(通常表示为 damp_percent)。
damp_percent 或类似名称的参数。# 调整阻尼因子示例
from model_quantizer import quantize_gptq # 虚构库
# 假设模型、分词器、数据、样本数量、组大小均已设置
best_group_size = 64 # 根据上一步选择
# 实验阻尼因子(默认可能为 0.01)
print("正在使用 damp_percent=0.005 进行量化...")
quantize_gptq(model, tokenizer, calibration_data,
num_samples=num_calib_samples,
group_size=best_group_size,
damp_percent=0.005,
output_dir="quantized_model_damp005")
print("正在使用 damp_percent=0.02 进行量化...")
quantize_gptq(model, tokenizer, calibration_data,
num_samples=num_calib_samples,
group_size=best_group_size,
damp_percent=0.02,
output_dir="quantized_model_damp02")
# 评估不同阻尼因子下的准确性
调整算法特有的超参数(如阻尼)通常收益较小,相比校准数据集大小或组大小,且可能需要更多实验。通常在主要参数调优后,如果仍存在显著准确性问题,才会考虑尝试。
微调量化参数很少是一次性完成的过程。它涉及一个迭代循环:
仔细记录每次实验中使用的参数以及相应的评估结果。这种系统化的方法有助于您了解模型和任务对不同量化设置的敏感程度,并收敛到最佳配置。
这种仔细的参数调整实践不可或缺,它有助于提升效率的上限,同时保持大型语言模型的能力,将量化的理论潜力转化为实际、高性能的部署。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造