llmcompressor.modifiers.quantization
模块
-
calibration– -
gptq– -
quantization–
类
-
GPTQModifier–实现 https://arxiv.org/abs/2210.17323 中的 GPTQ 算法。此修饰符
-
QuantizationMixin–Mixin,使 Modifier 能够充当量化配置,附加观察者,
-
QuantizationModifier–为给定模块或其子模块启用训练后量化(PTQ)和量化感知训练(QAT)
GPTQModifier
基类:Modifier, QuantizationMixin
实现了来自 https://arxiv.org/abs/2210.17323 的 GPTQ 算法。此 Modifier 使用激活来校准 Hessian 矩阵,然后该矩阵用于确定模型权重的最佳量化值和顺序。
示例 yaml
test_stage:
obcq_modifiers:
GPTQModifier:
block_size: 128
dampening_frac: 0.001
offload_hessians: False
actorder: static
config_groups:
group_0:
targets:
- "Linear"
input_activations: null
output_activations: null
weights:
num_bits: 8
type: "int"
symmetric: true
strategy: group
group_size: 128
生命周期
- on_initialize
- 将配置应用于模型
- on_start
- 添加激活校准钩子
- 添加 gptq 权重校准钩子
- on_sequential_epoch_end
- quantize_weight
- on_finalize
- remove_hooks()
- model.apply(freeze_module_quantization)
参数
-
–sequential_targetsGPTQ 期间要压缩的层名称列表,或 'ALL' 以压缩模型中的每一层
-
–块大小用于确定一次通过中要压缩的列数
-
–阻尼分数施加到 H 的阻尼量,作为对角范数的百分比
-
–actorder权重列的量化顺序。默认为“静态”激活顺序,可实现最佳精度恢复,且无运行时开销。更多信息请参见 https://github.com/vllm-project/vllm/pull/8135
-
–卸载Hessian矩阵设置为 True 可减少内存使用但增加运行时。
-
–config_groups字典,指定要应用于目标模块的量化方案。不符合方案目标的模块将不被量化。
-
–targets如果提供了方案,则为要量化的层名称列表。默认为线性层。
-
–ignore可选的模块类名或子模块名列表,即使它们与 config_groups 中的目标匹配,也不进行量化。默认为空列表。
-
–scheme应用于模型的单个量化方案。这是一个字典,支持 QuantizationScheme 的所有键,除了 targets,它将被设置为修饰符级别设置的 targets 参数。也可以设置为
preset_scheme_name: targets格式的字典,例如:W8A8: ['Linear']用于权重和激活的 8 位量化。 -
–kv_cache_scheme可选的 QuantizationArgs,用于指定 kv 缓存的量化。如果为 None,则不量化 kv 缓存。当将 kv 缓存量化应用于 transformer AutoModelForCausalLM 时,kv_cache_scheme 会被转换为一个 QuantizationScheme,该 Scheme: - 目标模型中的
q_proj和k_proj模块。这些模块的输出是可能被缓存的键和值 - 对上述层的输出进行量化,以便在将键和值存储到缓存之前对其进行压缩。有一个明确的假设是模型包含名称中带有k_proj和v_proj的模块。如果不是这种情况,并且 kv_cache_scheme != None,则 kv 缓存的量化将失败。
方法
-
calibrate_module–校准钩子,用于累积模块输入的 Hessian 矩阵
-
compress_modules–量化已校准的模块
-
on_end–通过移除观察者和校准钩子来完成校准
-
on_finalize–禁用 OBCQ 算法使用的量化观察器
-
on_initialize–在当前状态下初始化并运行 GPTQ 算法
calibrate_module
校准钩子,用于累积模块输入的 Hessian 矩阵
参数
-
(moduleModule) –正在校准的模块
-
(argsTuple[Tensor, ...]) –模块的输入,其中第一个元素是规范输入
-
(_输出Tensor) –未压缩的模块输出,未使用
源代码位于 llmcompressor/modifiers/quantization/gptq/base.py
compress_modules
量化已校准的模块
源代码位于 llmcompressor/modifiers/quantization/gptq/base.py
on_end
通过移除观察者和校准钩子来完成校准
源代码位于 llmcompressor/modifiers/quantization/gptq/base.py
on_finalize
禁用 OBCQ 算法使用的量化观察器
参数
-
(stateState) –存储输入模型和校准数据的会话状态
源代码位于 llmcompressor/modifiers/quantization/gptq/base.py
on_initialize
在当前状态下初始化并运行 GPTQ 算法
参数
-
(stateState) –存储输入模型和校准数据的会话状态
源代码位于 llmcompressor/modifiers/quantization/gptq/base.py
QuantizationMixin
基类:HooksMixin
Mixin,使 Modifier 能够充当量化配置,为 modifier 附加观察者、校准钩子和压缩包装器。
生命周期
- on_initialize: QuantizationMixin.initialize_quantization
- 将 scheme 附加到模块
- 将观察者附加到模块
- 禁用量化,直到校准开始/完成
- on_start: QuantizationMixin.start_calibration
- 附加校准钩子
- 应用校准状态
- 在校准期间启用量化
- on_end: QuantizationMixin.end_calibration
- 移除校准钩子
- 应用冻结状态
- 保持量化启用以供将来步骤使用
注意:QuantizationMixin 不会自动更新 scale 和 zero-point,因为并非所有继承自它的 Modifier 都需要这样做。Modifier 必须显式调用 update_weight_zp_scale。请参阅 QuantizationModifier.on_start 方法作为示例。
参数
-
–config_groups字典,指定要应用于目标模块的量化方案。不符合方案目标的模块将不被量化。
-
–targets如果提供了方案,则是要量化的层名称列表。如果未设置,将包含 config_groups 中列出的所有目标。如果 config_groups 也未设置,则默认为 ["Linear"](即所有 Linear 层都将被作为目标)。此字段不是在模型中查找所有匹配目标层的真实来源。额外信息可以存储在
config_groups中。请改用 self.resolved_targets。 -
–ignore可选的模块类名或子模块名列表,即使它们与 config_groups 中的目标匹配,也不进行量化。默认为空列表。
-
–scheme应用于模型的单个量化方案。这是一个字典,支持 QuantizationScheme 的所有键,除了 targets,它将被设置为修饰符级别设置的 targets 参数。也可以设置为
preset_scheme_name: targets格式的字典,例如:W8A8: ['Linear']用于权重和激活的 8 位量化。 -
–kv_cache_scheme可选的 QuantizationArgs,用于指定 kv 缓存的量化。如果为 None,则不量化 kv 缓存。当将 kv 缓存量化应用于 transformer AutoModelForCausalLM 时,kv_cache_scheme 会被转换为一个 QuantizationScheme,该 Scheme: - 目标模型中的
q_proj和k_proj模块。这些模块的输出是可能被缓存的键和值 - 对上述层的输出进行量化,以便在将键和值存储到缓存之前对其进行压缩。有一个明确的假设是模型包含名称中带有k_proj和v_proj的模块。如果不是这种情况,并且 kv_cache_scheme != None,则 kv 缓存的量化将失败。 -
–weight_observer权重量化的可选观察者名称。覆盖 scheme 中指定的默认观察者。有效值包括 "minmax", "mse", "static_minmax", "memoryless_minmax", "memoryless_mse"。
-
–input_observer输入激活量化的可选观察者名称。覆盖 scheme 中指定的默认观察者。有效值包括 "minmax", "mse", "static_minmax", "memoryless_minmax", "memoryless_mse"。
-
–output_observer输出激活量化的可选观察者名称。覆盖 scheme 中指定的默认观察者。有效值包括 "minmax", "mse", "static_minmax", "memoryless_minmax", "memoryless_mse"。
-
–observer可选字典,用于一次指定多种量化类型的观察者。键可以是 "weights", "input" 或 "output"。值是观察者名称。示例:{"weights": "MSE", "input": "MSE"}。如果同时提供了单个观察者参数 (weight_observer, input_observer, output_observer) 和 observer 字典,则 observer 字典优先。
方法
-
end_calibration–移除校准钩子和观察器,并将模型状态设置为冻结。
-
has_config–确定用户是否在此修饰符上指定了量化配置
-
initialize_quantization–根据模型将量化方案附加到模块
-
resolve_quantization_config–返回此修饰符指定的量化配置
-
start_calibration–附加观察器,注册激活校准钩子(包括
-
validate_observer–验证 observer 字典格式。接受的键:'weights', 'input', 'output'
属性
-
resolved_config(QuantizationConfig) –量化配置需要根据
-
resolved_targets(Set[str]) –所有已解析目标的集合,即列出的所有唯一目标
resolved_targets property
所有已解析目标的集合,即已解析量化配置中列出的所有唯一目标。请使用此属性而不是 targets 字段,因为 targets 也可以根据配方配置方式来自 config_groups。
end_calibration
移除校准钩子和观察器,并将模型状态设置为冻结。保持量化启用以进行未来的操作
参数
-
(modelModule) –模型结束校准
源代码在 llmcompressor/modifiers/quantization/quantization/mixin.py 中
has_config
确定用户是否在此修饰符上指定了量化配置
源代码在 llmcompressor/modifiers/quantization/quantization/mixin.py 中
initialize_quantization
根据此修饰符上指定的量化配置将量化方案附加到模型中的模块
参数
-
(modelModule) –要附加方案和观察器的模型
源代码在 llmcompressor/modifiers/quantization/quantization/mixin.py 中
resolve_quantization_config
返回此修饰符指定的量化配置
源代码在 llmcompressor/modifiers/quantization/quantization/mixin.py 中
start_calibration
附加观察器,注册激活校准钩子(包括 kv_cache 量化),并在校准时启用量化
参数
-
(modelModule) –准备用于校准的模型
源代码在 llmcompressor/modifiers/quantization/quantization/mixin.py 中
validate_observer
验证 observer 字典格式。接受的键:'weights', 'input', 'output'
源代码在 llmcompressor/modifiers/quantization/quantization/mixin.py 中
QuantizationModifier
基类:Modifier, QuantizationMixin
为给定模块或其子模块启用训练后量化(PTQ)和量化感知训练(QAT)。在校准(PTQ)或起始 epoch(QAT)之后,指定模块的前向传播将模拟量化执行,并且修饰符将一直启用,直到训练完成。
参数
-
–config_groups字典,指定要应用于目标模块的量化方案。不符合方案目标的模块将不被量化。
-
–targets如果提供了方案,则为要量化的层名称列表。默认为线性层。
-
–ignore可选的模块类名或子模块名列表,即使它们与 config_groups 中的目标匹配,也不进行量化。默认为空列表。
-
–scheme应用于模型的单个量化方案。这是一个字典,支持 QuantizationScheme 的所有键,除了 targets,它将被设置为修饰符级别设置的 targets 参数。也可以设置为
preset_scheme_name: targets格式的字典,例如:W8A8: ['Linear']用于权重和激活的 8 位量化。 -
–kv_cache_scheme可选的 QuantizationArgs,用于指定 kv 缓存的量化。如果为 None,则不量化 kv 缓存。当将 kv 缓存量化应用于 transformer AutoModelForCausalLM 时,kv_cache_scheme 会被转换为一个 QuantizationScheme,该 Scheme: - 目标模型中的
q_proj和k_proj模块。这些模块的输出是可能被缓存的键和值 - 对上述层的输出进行量化,以便在将键和值存储到缓存之前对其进行压缩。有一个明确的假设是模型包含名称中带有k_proj和v_proj的模块。如果不是这种情况,并且 kv_cache_scheme != None,则 kv 缓存的量化将失败。
方法
-
on_end–通过移除观察者和校准钩子来完成校准
-
on_initialize–准备校准激活和权重
-
on_start–开始校准激活和权重。在开始时只校准权重一次
on_end
通过移除观察者和校准钩子来完成校准
源代码在 llmcompressor/modifiers/quantization/quantization/base.py
on_initialize
准备校准激活和权重
根据量化配置,量化方案被附加到每个目标模块。模块的前向调用也被重写,以对输入、权重和输出执行量化。
然后,根据模块的量化方案,添加观察者和校准钩子。这些钩子在修饰符启动之前是禁用的。
源代码在 llmcompressor/modifiers/quantization/quantization/base.py
on_start
开始校准激活和权重。在开始时只校准权重一次