开发者指南 / Keras 中的 GPTQ 量化

Keras 中的 GPTQ 量化

作者: Jyotinder Singh
创建日期 2025/10/16
最后修改日期 2025/10/16
描述: 如何对 Keras 和 KerasHub 模型运行仅权重 GPTQ 量化。

在 Colab 中查看 GitHub 源代码


什么是 GPTQ?

GPTQ(“Generative Pre-Training Quantization”,生成式预训练量化)是一种训练后、仅权重的量化方法,它使用损失的二阶近似(通过 Hessian 估计)来最小化将权重压缩到较低精度(通常是 4 位整数)时引入的误差。

与标准的训练后技术不同,GPTQ 将激活保持在较高精度,只量化权重。这通常能在低比特宽度设置下保持模型质量,同时仍然提供大量的存储和内存节省。

Keras 通过 keras.quantizers.GPTQConfig 类支持 KerasHub 模型的 GPTQ 量化。


加载 KerasHub 模型

本指南使用 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

配置和运行 GPTQ 量化

您可以通过 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%。报告的磁盘节省量低估了实际权重压缩量,因为预设还包含非权重资产。

困惑度仅略有增加,表明量化后模型质量在很大程度上得以保留。


实用技巧

  • GPTQ 是一种训练后技术;不支持量化后的训练。
  • 始终使用模型的自身分词器进行校准。
  • 使用代表性的校准集;小片段仅用于演示。
  • 从 W4 group_size=128 开始;根据模型/任务进行调整。