llmcompressor.modifiers.awq.base
类
-
AWQModifier–实现了 AWQ (Activation-Weighted Quantization) 算法,
AWQModifier
基类: Modifier, QuantizationMixin
实现了 AWQ (Activation-Weighted Quantization) 算法,如 https://arxiv.org/pdf/2306.00978 所述。该算法通过仅保护 1% 最显著的权重通道来显著减少量化误差。
AWQ 不依赖原始权重值,而是通过分析激活模式来识别重要通道,专注于权重张量中最能响应输入的通道。为了减少量化误差,它以一种保留模型原始行为的方式对这些通道进行缩放,使用从激活统计数据中离线计算的缩放因子。
由于此修改器会操作模型的权重,因此它只能用于一次性运行,而不能在训练期间使用。激活范围通过对少量校准数据运行模型来确定。
示例配方
AWQModifier:
mappings:
- smooth_layer: "re:.*self_attn_layer_norm"
balance_layers: ["re:.*q_proj", "re:.*k_proj", "re:.*v_proj"]
- smooth_layer: "re:.*final_layer_norm"
balance_layers: ["re:.*fc1"]
ignore: ["lm_head"]
config_groups:
group_0:
targets:
- "Linear"
input_activations: null
output_activations: null
weights:
num_bits: 4
type: int
symmetric: false
strategy: group
group_size: 128
生命周期
- on_initialize
- 解析映射
- 将前向传播所需的 kwargs 捕获到模块中
- on_start
- 设置激活缓存钩子以捕获输入激活以平衡层
- 在序列 epoch 结束时
- 对每个平滑层应用平滑
- 消耗所有批次中的缓存激活
- 在使用时清除缓存激活
- 为每个平滑层查找最佳平滑尺度
- 应用于模型权重
- 如果存在任何未使用的激活,则引发错误
- 消耗所有批次中的缓存激活
- 对每个平滑层应用平滑
- on_end
- 重新运行顺序 epoch 结束的逻辑(以防是基本管道)
- 设置尺度和零点
- 移除激活钩子
- on_finalize
- 清除已解析的映射和捕获的激活
参数
-
–sequential_targets在同一校准过程中要压缩的模块名称列表
-
–mappings列出要平滑的激活层,以及要缩放输出以实现激活平滑的层。映射列表的每个条目本身都应该是一个列表,其中第一个条目是共享相同输入激活(要平滑的激活)的层列表,第二个条目是输出被缩放以实现平滑的层。如果使用正则表达式,它将匹配模块名称中重叠最大的层。
-
–ignore要忽略的层列表,即使它们匹配映射中的正则表达式。它应该匹配其输出被缩放以实现平滑的层的名称(映射列表的第二个条目)。
-
–offload_device将缓存的 args 卸载到此设备,这会减少内存需求,但需要更多时间在 CPU 和执行设备之间移动数据。默认为 None,因此不会卸载缓存的 args。如果遇到 OOM 错误,请考虑将其设置为 torch.device("cpu")
-
–duo_scaling是否使用 duo scaling,它同时使用输入激活和权重来确定缩放因子。默认为 True。如果为 True,则同时使用激活和权重。如果为 False,则仅使用激活。如果为 "both",则一半的网格搜索使用 duo_scaling=False 进行,另一半使用 duo_scaling=True 进行。
-
–n_grid在为每个映射执行最佳尺度网格搜索时,此参数指定应使用的网格点数。为了减少运行时间,可能以牺牲稍差的尺度为代价,可以减小此值。默认为 20
方法
-
on_end–通过设置尺度和零点来完成校准,
-
on_finalize–通过清除激活和映射数据来清理
-
on_initialize–在给定状态下初始化 AWQ
-
validate_duo_scaling–验证 duo_scaling 是否为 True、False 或 'both'(小写)
on_end
通过设置尺度和零点、移除观察者和校准钩子来完成校准
源代码在 llmcompressor/modifiers/awq/base.py
on_finalize
通过清除激活和映射数据来清理
参数
-
(stateState) –未使用
返回
-
bool–True
源代码在 llmcompressor/modifiers/awq/base.py
on_initialize
在给定状态下初始化 AWQ 初始化量化、解析映射、缓存模块 kwargs
参数
-
(stateState) –用于运行 AWQ 的状态
返回
-
bool–成功运行为 True,否则为 False
源代码在 llmcompressor/modifiers/awq/base.py
validate_duo_scaling classmethod
验证 duo_scaling 是否为 True、False 或 'both'(小写)
源代码在 llmcompressor/modifiers/awq/base.py
get_lowest_common_ancestor_with_avoid
get_lowest_common_ancestor_with_avoid(
balance_names: Iterator[str],
model: Module,
avoid=torch.nn.ModuleList,
)
获取最低的非避免类/类型的祖先。有关大小写处理的详细信息,请参阅 compressed_tensors.utils.get_lowest_common_ancestor_name。
注意:主要用于排除 ModuleList 类型的父级,因为它们与钩子不兼容,因为它们的 forward 方法不会直接为 MoE 模型调用。例如,请参阅 Qwen3MoeSparseMoeBlock,专家根据路由器的输出进行选择,并调用其 forward 方法。 https://github.com/huggingface/transformers/blob/v4.52.4/src/transformers/models/qwen3_moe/modeling_qwen3_moe.py#L233