llmcompressor.observers
用于在压缩过程中监控和分析模型行为的框架。
提供了观察器,用于在压缩工作流程中跟踪张量统计信息、激活范围和模型行为。包括 min-max 观察器、MSE 观察器以及量化和其他压缩技术的辅助工具。
模块
-
base– -
helpers–用于观察器 token 计算和分析的辅助函数。
-
min_max– -
moving_base– -
mse–
类
-
MemorylessMinMaxObserver–通过观察值的 min/max 来计算量化参数
-
MinMaxObserver–通过所有 min/max 值的移动平均来计算量化参数
-
MovingAverageMSEObserver–通过找到最小化均方量化误差的最小/最大值来计算量化参数
-
MovingAverageObserverBase–通过 min/max 值的移动平均来计算量化参数
-
Observer–观察器基类,用于根据观察到的值计算量化参数
-
StaticMinMaxObserver–通过所有观察值的 min/max 来计算量化参数
函数
-
flatten_for_calibration–为了校准目的,根据量化策略重塑值
MemorylessMinMaxObserver
MemorylessMinMaxObserver(
base_name: str,
args: QuantizationArgs,
module: Optional[Module] = None,
**observer_kwargs,
)
Bases: Observer
通过观察值的 min/max 来计算量化参数
参数
-
(base_namestr) –用于命名观察器属性的字符串
-
(argsQuantizationArgs) –用于校准和量化观测值的量化参数
-
(moduleOptional[Module], 默认值:None) –可选模块,附带量化参数。此参数是利用现有 qparams(例如 global_scale 或 g_idx)所必需的
-
–**observer_kwargs观察器初始化关键字参数
源代码位于 llmcompressor/observers/base.py
MinMaxObserver
MinMaxObserver(
base_name: str,
args: QuantizationArgs,
module: Optional[Module] = None,
**observer_kwargs,
)
Bases: MovingAverageObserverBase
通过所有 min/max 值的移动平均来计算量化参数
参数
-
(base_namestr) –用于命名观察器属性的字符串
-
(argsQuantizationArgs) –用于校准和量化观测值的量化参数
-
(moduleOptional[Module], 默认值:None) –可选模块,附带量化参数。此参数是利用现有 qparams(例如 global_scale 或 g_idx)所必需的
-
–**observer_kwargs观察器初始化关键字参数
源代码位于 llmcompressor/observers/moving_base.py
MovingAverageMSEObserver
Bases: MovingAverageObserverBase
通过找到最小化均方量化误差的最小/最大值来计算量化参数。
mse_quant_error := mean((x - fake_quant(x))**2)
global_scale <- min[min_vals, max_vals, global_scale](mse_quant_error(x))
scale, zp <- min[min_vals, max_vals](mse_quant_error(x, global_scale))
参数
-
–base_name用于命名观察器属性的字符串
-
–args用于校准和量化观测值的量化参数
-
–module可选模块,附带量化参数。此参数是利用现有 qparams(例如 global_scale 或 g_idx)所必需的
-
–**observer_kwargs用于观察器初始化的关键字参数 maxshrink: 最大收缩量(以“网格步长”为单位)。搜索步数是 int(maxshrink * grid) patience: 连续搜索步数无改进则提前停止 grid: 收缩搜索的粒度。值越大,收缩因子的粒度越细 norm: 计算误差时使用的指数。norm = 2 近似 MSE global_scale: 用于量化的预计算全局尺度。如果
optimize_global_scale为 True,则忽略 optimize_global_scale: 如果为 True,则在搜索的每一步中从候选的 min/max 重新计算global_scale
Source code in llmcompressor/observers/mse.py
MovingAverageObserverBase
MovingAverageObserverBase(
base_name: str,
args: QuantizationArgs,
module: Optional[Module] = None,
**observer_kwargs,
)
Bases: Observer
通过 min/max 值的移动平均来计算量化参数
参数
-
(base_namestr) –用于命名观察器属性的字符串
-
(argsQuantizationArgs) –用于校准和量化观测值的量化参数
-
(moduleOptional[Module], 默认值:None) –可选模块,附带量化参数。此参数是利用现有 qparams(例如 global_scale 或 g_idx)所必需的
-
–**observer_kwargs观察器初始化关键字参数
方法
-
get_current_global_min_max–计算观察值的最小和最大值(不带移动平均)
-
get_current_min_max–计算观察值的最小和最大值(不带移动平均)
-
get_global_min_max–计算观察值 min 和 max 的移动平均
-
get_min_max–计算观察值 min 和 max 的移动平均
源代码位于 llmcompressor/observers/moving_base.py
get_current_global_min_max abstractmethod
为了全局尺度计算的目的,计算观察值的最小和最大值(不带移动平均)
源代码位于 llmcompressor/observers/moving_base.py
get_current_min_max abstractmethod
get_global_min_max
为了全局尺度计算的目的,计算观察值 min 和 max 的移动平均
参数
-
(observedTensor) –被观察的值,其形状为 (num_observations, 1, group_size)
返回
-
MinMaxTuple–最小值和最大值,其形状为 (1, )
源代码位于 llmcompressor/observers/moving_base.py
get_min_max
计算观察值 min 和 max 的移动平均
参数
-
(observedTensor) –被观察的值,其形状为 (num_observations, *qparam_shape, group_size)
返回
-
MinMaxTuple–最小值和最大值,其形状为 (*qparam_shape, )
源代码位于 llmcompressor/observers/moving_base.py
Observer
Observer(
base_name: str,
args: QuantizationArgs,
module: Optional[Module] = None,
**observer_kwargs,
)
Bases: InternalModule, RegistryMixin
观察器基类,用于根据权重、激活或注意力状态的观察值计算量化参数。
示例
module = ...
observer = Observer.load_from_registry(observer, base_name="weight", args=...)
module.global_scale = observer.get_global_scale(module.weight)
scales, zero_points = observer(module.weight)
参数
-
(base_namestr) –用于命名观察器属性的字符串
-
(argsQuantizationArgs) –用于校准和量化观测值的量化参数
-
(moduleOptional[Module], 默认值:None) –可选模块,附带量化参数。此参数是利用现有 qparams(例如 global_scale 或 g_idx)所必需的
-
–**observer_kwargs观察器初始化关键字参数
方法
-
forward–根据观察值计算更新的尺度和零点
-
get_global_min_max–为了
-
get_global_scale–根据观察值计算更新的全局尺度
-
get_min_max–根据观察值计算最小和最大值
源代码位于 llmcompressor/observers/base.py
forward
根据观察值(权重、激活或注意力状态)计算更新的尺度和零点。
参数
-
(observedTensor) –被观察的值
返回
-
ScaleZpTuple–校准的尺度和零点
源代码位于 llmcompressor/observers/base.py
get_global_min_max abstractmethod
为了全局尺度计算的目的,根据观察值计算最小和最大值
参数
-
(observedTensor) –形状为 (num_observations, 1, group_size) 的值
返回
-
MinMaxTuple–最小值和最大值,其形状为 (1, )
源代码位于 llmcompressor/observers/base.py
get_global_scale
根据观察值(权重、激活或注意力状态)计算更新的全局尺度。
参数
-
(observedTensor) –被观察的值
返回
-
Tensor–校准的全局参数
源代码位于 llmcompressor/observers/base.py
get_min_max abstractmethod
根据观察值计算最小和最大值
参数
-
(observedTensor) –形状为 (num_observations, *qparam_shape, group_size) 的值
返回
-
MinMaxTuple–最小值和最大值,其形状为 (*qparam_shape, )
源代码位于 llmcompressor/observers/base.py
StaticMinMaxObserver
Bases: Observer
通过所有观察值的 min/max 来计算量化参数
参数
-
–base_name用于命名观察器属性的字符串
-
–args用于校准和量化观测值的量化参数
-
–module可选模块,附带量化参数。此参数是利用现有 qparams(例如 global_scale 或 g_idx)所必需的
-
–**observer_kwargs观察器初始化关键字参数
Source code in llmcompressor/observers/min_max.py
flatten_for_calibration
flatten_for_calibration(
value: Tensor,
base_name: str,
args: QuantizationArgs,
g_idx: Optional[Tensor] = None,
) -> torch.Tensor
为了尺度/零点校准的目的,根据量化策略重塑值。展平后的值具有以下形状
(num_observations, *qparam_shape, group_size)
第一个维度是观察次数(通常是批次大小乘以 token 数),中间维度是尺度的大小,最后一个维度是每组量化的元素数。
参数
-
(值Tensor) –被展平的值
-
(base_namestr) –weight, input, output, q/k/v。用于表征该值是权重、激活还是注意力状态
-
(argsQuantizationArgs) –用于确定值如何展平的量化参数
-
(g_idxOptional[Tensor], 默认值:None) –用于权重激活排序的可选 gidx
返回
-
Tensor–已重塑用于校准的值