QuaRot + GPTQ#

1.1 权重-激活量化#

QuaRot 旨在通过引入 旋转矩阵(如 Hadamard 变换)来优化大型语言模型的量化性能,使得模型的所有部分(包括权重、激活值)能够实现高效的 权重-激活量化。这种技术通过平滑激活值的分布,消除其中的异常值(Outliers),从而简化量化过程。

然而,由于 QuaRot 所使用的旋转矩阵具有随机性,其结果往往波动较大。为了解决这一问题,在 LLMC 中,我们可以采用 QuaRot + GPTQ 的组合策略。在施加 QuaRot 旋转后的权重上使用 GPTQ 重建量化输出,通过微调权重使得量化结果更加稳定和优异。(详细的分析见我们的论文)

请注意,运行 QuaRot 需要 Hadamard 变换 kernel 的支持。此 kernel 的安装可以参考该 仓库

1.1.1 运行Quarot#

第一步,运行与 Quarot 相关的配置文件。请注意,在此步骤中需要将 save_trans 参数设置为 True 以保存经过变换的模型。

# configs/quantization/combination/quarot_comb_gptq/w8a8/step_1_quarot.yml

save:
    # Save the Quarot-transformed model.
    save_trans: True
    save_fake: False
    save_path: /path/to/save_quarot_trans_for_gptq/

运行脚本:

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

task_name=step_1_quarot
config=${llmc}/configs/quantization/combination/quarot_comb_gptq/w8a8/step_1_quarot.yml

1.1.2 运行GPTQ#

第二步,加载 Quarot 变换过的模型并运行与 GPTQ 相关的配置文件

# configs/quantization/combination/quarot_comb_gptq/w8a8/step_2_gptq.yml
model:
    type: Llama
    # Load Quarot-transformed model
    path: /path/to/save_quarot_trans_for_gptq/transformed_model
    torch_dtype: auto

运行脚本:

# scripts/run_llmc.sh

llmc=llmc_path
export PYTHONPATH=$llmc:$PYTHONPATH

task_name=step_2_gptq
config=${llmc}/configs/quantization/combination/quarot_comb_gptq/w8a8/step_2_gptq.yml

请注意,在 QuaRot 和 GPTQ 中都有 online_rotate 选项,务必确保两个配置文件中的该选项保持一致。该选项表示是否对激活进行在线旋转处理,这对提升精度有很大帮助,但不利于实际部署。有关在线旋转的详细说明,请参考原 QuaRot 论文

quant:
    special:
        online_rotate: True

通过上述两个步骤的运行,LLMC 在 权重-激活量化 设置下可以取得比单独使用 Quarot 算法更好的结果