观察器概述
llm-compressor 中的 Observer 是一个实用类,负责分析张量(例如,权重、激活值),并生成量化参数,如 scale 和 zero_point。量化修改器使用这些观察器来计算将张量转换为低精度格式所需的统计数据。
观察器的设计灵活,支持多种量化策略,包括每张量、每组、每通道和每 token 量化。
基类
Observer
所有观察器的基类。子类必须实现 calculate_qparams 方法来定义量化参数的计算方式。
基类处理: - 按组计算 scale/zero_point - 按 token 和按通道的量化逻辑 - 对 g_idx(组索引映射)的可选支持 - 记录观察到的 token 以进行日志记录和分析 - 在生命周期过渡期间重置内部状态
此类不直接使用,但为所有自定义观察器提供了框架。
已实现的观察器
MinMax
通过跟踪观察张量的最小值和最大值来计算 scale 和 zero_point。这是最简单、最常见的观察器。适用于对称和非对称量化。
最适用于: - Int8 或 Int4 对称量化 - 按通道或按组的策略
MSE
通过最小化原始张量和量化张量之间的均方误差 (MSE) 来计算量化参数。可选地维护 min/max 值的移动平均值以获得更平滑的收敛。
最适用于: - 校准精度至关重要 - 需要严格控制量化误差
量化策略
观察器通过 QuantizationArgs.strategy 字段支持多种量化策略
TENSOR:整个张量的全局 scale 和 zero_point。GROUP,TENSOR_GROUP:沿列将张量切分成大小相等的组。CHANNEL:每通道量化(例如,跨输出维度)。TOKEN:沿 token 或序列维度量化激活值。BLOCK:(尚未实现) 块状量化的占位符。
观察器配置参数
可以通过可选的关键字参数来配置观察器,这些参数控制其行为。这些参数通过 QuantizationArgs.observer_kwargs 字典传递,并在初始化观察器时在内部解析。
以下是支持的配置参数及其含义
| 参数 | 默认值 |
|---|---|
maxshrink | 0.20 |
patience | 5 |
averaging_constant | 0.01 |
grid | 100.0 |
norm | 2.0 |
使用示例
from llmcompressor.observers import Observer
from compressed_tensors.quantization.quant_args import QuantizationArgs
args = QuantizationArgs(num_bits=4, strategy="group", group_size=128)
observer = Observer.load_from_registry(
"minmax",
base_name="weight",
quantization_args=args,
)
x = torch.randn(64, 512)
scale, zero_point = observer(x)