AWQ#

1.1 仅权重量化#

AWQ 在仅权重量化(weight-only quantization)的大多数情况下表现出色,但在低比特(尤其是 2-bit)量化时效果较差。这是因为 AWQ 无论是对称量化还是非对称量化,都采用了 对称策略 来截断权重。

在 LLMC 中,我们对 AWQ 方法进行了改进,将其权重截断的策略修改为了和量化策略保持一致,例如非对称量化使用非对称截断对称量化使用对称截断, 获得了更优的结果,尤其是在低比特量化。

1.1.1 算法配置#

具体实现可以参考 AWQ 的权重量化 配置文件

# configs/quantization/methods/Awq/awq_w_only.yml
quant:
    method: Awq
    weight:
        bit: 4
        symmetric: False
        granularity: per_group
        group_size: 128
    special:
        trans: True
        # The options for "trans_version" include "v1" and "v2". 
        # But their results don't differ significantly.
        trans_version: v2
        weight_clip: True 

1.1.2 算法运行#

只需修改 运行脚本 中的配置文件路径,然后执行即可:

运行脚本:

# scripts/run_llmc.sh
llmc=llmc_path
export PYTHONPATH=$llmc:$PYTHONPATH

task_name=awq_w4a16
config=${llmc}/configs/quantization/methods/Awq/awq_w_only.yml

通过这一改进,AWQ-LLMC 可以取得比于 原始方法 更好的精度表现,尤其在2-bit量化,表现出显著的改善。

如果在 config.quant.special 中未指定 clip_sym,那么它的取值将与 config.quant.weight.symmetric 保持一致。如果想复现学术精度,可以将 clip_sym 写到config里并设置为 True

quant:
   special:
        clip_sym: True

1.2 权重-激活量化#

此外,与原始方法不同,LLMC 中的 AWQ 还支持权重-激活量化。相比于 OS+ 和 SmoothQuant 仅支持对 lnfc 层进行缩放变换,AWQ 提供了更多等价变换的位置选择。

同时,AWQ 通过网格搜索(Grid Search)寻找权重变换的最优缩放因子,因此在权重-激活量化方面通常能够取得更优异的效果。

1.2.1 算法配置#

具体可以参考 AWQ 的权重-激活量化 配置文件

# configs/quantization/methods/Awq/awq_w_a.yml
quant:
    method: Awq
    weight:
        bit: 8
        symmetric: True
        granularity: per_channel
        group_size: -1
    act:
        bit: 8
        symmetric: True
        granularity: per_token
    special:
        trans: True
        # The options for "trans_version" include "v1" and "v2".
        trans_version: v2
        weight_clip: True 

只需修改 运行脚本 中的配置文件路径,然后执行即可:

1.2.2 算法运行#

运行脚本:

# scripts/run_llmc.sh
llmc=llmc_path
export PYTHONPATH=$llmc:$PYTHONPATH

task_name=awq_w8a8
config=${llmc}/configs/quantization/methods/Awq/awq_w_a.yml

在权重-激活量化中,AWQ-LLMC 可以取得比SmoothQuant等算法更好的结果