作者: Jyotinder Singh
创建日期 2025/10/09
最后修改日期 2025/10/09
描述: Keras 中量化的概述(int8、float8、int4、GPTQ)。
现代大型模型通常是内存和带宽受限的:大部分推理时间都花在了将张量在内存和计算单元之间移动上,而不是进行数学运算。量化减少了用于表示模型权重和(可选)激活值的比特数,这
Keras 提供了头等舱的训练后量化 (PTQ) 工作流程,支持预训练模型,并在模型和层级别公开统一的 API。
总的来说,Keras 支持
int4、int8 和 float8 中的联合权重+激活 PTQ。x 映射到整数 q。对称方案仅使用比例因子。Keras 目前专注于以下数值格式。每种模式都可以通过相同的 API 选择性地应用于层或整个模型。
int8 (8 位整数):联合权重+激活 PTQ。
float8 (FP8: E4M3 / E5M2 变体):低精度浮点数,可用于 FP8 兼容硬件上的训练和推理。
int4:超低比特权重,用于激进压缩;激活值保持更高精度(int8)。
GPTQ (仅权重 2/3/4/8 位):二阶、训练后方法,可最小化层输出误差。
int4、int8 PTQ 路径中,激活比例因子在运行时(每个张量和每个批次)通过 AbsMax 估计器动态计算。这避免了维护来自校准传递的单独、固定的激活比例因子集,并适应变化的输入范围。int4,Keras 打包有符号 4 位值(范围 = [-8, 7])并存储每通道比例因子,例如 kernel_scale。反量化是实时进行的,matmul 使用 8 位(解包后)内核。int4 / int8 / float8 的激活缩放默认使用AbsMax 校准(范围由观察到的最大绝对值确定)。将来的版本可能会添加替代校准方法(例如,百分位数)。量化在层或模型构建后显式应用。API 的设计是可预测的:您调用 quantize,图被重写,权重被替换,然后您可以立即运行推理或保存模型。
典型工作流程
build() 或一次前向传递已使权重具体化。model.quantize("<mode>") 或 layer.quantize("<mode>"),模式为 "int8"、"int4"、"float8" 或 "gptq"(仅权重)。model.save(...)。量化状态(打包权重、比例因子、元数据)在保存/加载时得以保留。import keras
import numpy as np
# Create a random number generator.
rng = np.random.default_rng()
# Sample training data.
x_train = rng.random((100, 10)).astype("float32")
y_train = rng.random((100, 1)).astype("float32")
# Build the model.
model = keras.Sequential(
[
keras.Input(shape=(10,)),
keras.layers.Dense(32, activation="relu"),
keras.layers.Dense(1),
]
)
# Compile and fit the model.
model.compile(optimizer="adam", loss="mean_squared_error")
model.fit(x_train, y_train, epochs=1, verbose=0)
# Quantize the model.
model.quantize("int8")
作用: 量化支持层的权重,并重新连接其前向路径以兼容量化内核和量化比例因子。
注意: 吞吐量增益取决于后端/硬件内核;在内核回退到反量化 matmul 的情况下,您仍然可以获得内存节省,但速度提升会较小。
Keras 量化框架允许您单独量化每个层,而无需使用相同的统一 API 来量化整个模型。
from keras import layers
input_shape = (10,)
layer = layers.Dense(32, activation="relu")
layer.build(input_shape)
layer.quantize("int4") # Or "int8", "float8", etc.
Keras 在其量化框架中支持以下核心层
DenseEinsumDenseEmbeddingReversibleEmbedding (可在 KerasHub 中找到)由上述层构建的任何复合层(例如,Transformer 中的 MultiHeadAttention、GroupQueryAttention、前馈网络块)通过构造继承了量化支持。这涵盖了大多数现代仅编码器和仅解码器的 Transformer 架构。
由于所有 KerasHub 模型都继承自 keras.Model,它们自动支持 model.quantize(...) API。实际上,这意味着您可以采用一个流行的 LLM 预设,调用一个函数来获得 int8/int4/GPTQ 量化版本,然后保存或部署它——而无需更改您的训练代码。