llmcompressor.modifiers.awq
模块
类
-
AWQMapping–存储待平滑的激活映射配置的数据类
-
AWQModifier–实现了 AWQ (Activation-Weighted Quantization) 算法,
函数
-
get_layer_mappings_from_architecture–:param architecture: str: 模型的架构
AWQMapping dataclass
存储待平滑的激活映射配置的数据类 `smooth_layer` 的输出激活是 `balance_layers` 的输入激活
AWQMappings 会被解析成 ResolvedMappings,它们在运行时保留了对实际 torch.nn.Modules 的指针和其他元数据
AWQModifier
Bases: 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_layer_mappings_from_architecture
参数
-
(architecturestr) –str: 模型的架构
返回
-
list[AWQMapping]–list: 给定架构的层映射