作者: Jyotinder Singh
创建日期 2025/10/16
最后修改日期 2025/10/16
描述: 如何对 Keras 和 KerasHub 模型运行仅权重 GPTQ 量化。
GPTQ(“Generative Pre-Training Quantization”,生成式预训练量化)是一种训练后、仅权重的量化方法,它使用损失的二阶近似(通过 Hessian 估计)来最小化将权重压缩到较低精度(通常是 4 位整数)时引入的误差。
与标准的训练后技术不同,GPTQ 将激活保持在较高精度,只量化权重。这通常能在低比特宽度设置下保持模型质量,同时仍然提供大量的存储和内存节省。
Keras 通过 keras.quantizers.GPTQConfig 类支持 KerasHub 模型的 GPTQ 量化。
本指南使用 KerasHub 的 Gemma3CausalLM 模型,这是一个小型(10 亿参数)因果语言模型。
import keras
from keras_hub.models import Gemma3CausalLM
from datasets import load_dataset
prompt = "Keras is a"
model = Gemma3CausalLM.from_preset("gemma3_1b")
outputs = model.generate(prompt, max_length=30)
print(outputs)
Keras is a deep learning library for Python. It is a high-level API for neural networks. It is a Python library for deep learning
您可以通过 keras.quantizers.GPTQConfig 类配置 GPTQ 量化。
GPTQ 配置需要校准数据集和分词器,它使用这些来估计 Hessian 和量化误差。这里,我们使用了 WikiText-2 数据集的一小部分用于校准。
您可以调整几个参数来权衡速度、内存和准确性。其中最重要的参数是 weight_bits(将权重量化到的比特宽度)和 group_size(一起量化的权重数量)。组大小控制量化的粒度:较小的组通常会产生更好的准确性,但量化速度较慢,并且可能使用更多内存。对于 4 位量化(weight_bits=4),一个不错的起点是 group_size=128。
在此示例中,我们首先准备了一个微小的校准集,然后使用 .quantize(...) API 在模型上运行 GPTQ。
# Calibration slice (use a larger/representative set in practice)
texts = load_dataset("wikitext", "wikitext-2-raw-v1", split="train[:1%]")["text"]
calibration_dataset = [
s + "." for text in texts for s in map(str.strip, text.split(".")) if s
]
gptq_config = keras.quantizers.GPTQConfig(
dataset=calibration_dataset,
tokenizer=model.preprocessor.tokenizer,
weight_bits=4,
group_size=128,
num_samples=256,
sequence_length=256,
hessian_damping=0.01,
symmetric=False,
activation_order=False,
)
model.quantize("gptq", config=gptq_config)
outputs = model.generate(prompt, max_length=30)
print(outputs)
Keras is a Python library for deep learning. It is a high-level interface to the TensorFlow library.
Keras is a great library
GPTQ 量化模型可以保存到预设(preset)中,并在其他地方重新加载,就像任何其他 KerasHub 模型一样。
model.save_to_preset("gemma3_gptq_w4gs128_preset")
model_from_preset = Gemma3CausalLM.from_preset("gemma3_gptq_w4gs128_preset")
output = model_from_preset.generate(prompt, max_length=30)
print(output)
Keras is a Python library for deep learning. It is a high-level interface to the TensorFlow library.
Keras is a great library
在单个 NVIDIA 4070 Ti Super(16 GB)上收集的微基准测试。基线为 FP32。
数据集:WikiText-2。
| 模型(预设) | 困惑度增加 % (↓ 越好) | 磁盘存储减少 Δ % (↓ 越好) | VRAM 减少 Δ % (↓ 越好) | 首词延迟 Δ % (↓ 越好) | 吞吐量 Δ % (↑ 越好) |
|---|---|---|---|---|---|
| GPT2 (gpt2_base_en_cnn_dailymail) | 1.0% | -50.1% ↓ | -41.1% ↓ | +0.7% ↑ | +20.1% ↑ |
| OPT (opt_125m_en) | 10.0% | -49.8% ↓ | -47.0% ↓ | +6.7% ↑ | -15.7% ↓ |
| Bloom (bloom_1.1b_multi) | 7.0% | -47.0% ↓ | -54.0% ↓ | +1.8% ↑ | -15.7% ↓ |
| Gemma3 (gemma3_1b) | 3.0% | -51.5% ↓ | -51.8% ↓ | +39.5% ↑ | +5.7% ↑ |
详细的基准测试数字和脚本可在 此处 找到。
所有模型在磁盘空间和 VRAM 使用量方面都有显著减少,磁盘空间节省约为 50%,VRAM 节省范围从 41% 到 54%。报告的磁盘节省量低估了实际权重压缩量,因为预设还包含非权重资产。
困惑度仅略有增加,表明量化后模型质量在很大程度上得以保留。