AutoAWQ量化推理#
AutoAWQ 是一个易于使用的 4-bit 权重量化模型的包。与 FP16 相比,AutoAWQ 能将模型速度提高 3 倍,并将内存需求减少 3 倍。AutoAWQ 实现了激活感知权重量化 (AWQ) 算法,用于对大型语言模型进行量化。
LLMC 支持导出 AutoAWQ 所需的量化格式,并兼容多种算法,不仅限于 AWQ。相比之下,AutoAWQ 仅支持 AWQ 算法,而 LLMC 可以通过 GPTQ、AWQ 和 Quarot 等算法导出真实量化模型,供 AutoAWQ 直接加载,并使用 AutoAWQ 的 GEMM 和 GEMV 内核实现推理加速。
1.1 环境准备#
要使用 AutoAWQ 进行量化推理,首先需要安装并配置 AutoAWQ 环境:
INSTALL_KERNELS=1 pip install git+https://github.com/casper-hansen/AutoAWQ.git
# NOTE: This installs https://github.com/casper-hansen/AutoAWQ_kernels
1.2 量化格式#
在 AutoAWQ 的定点整型量化中,支持以下几种常见格式:
W4A16:权重为 int4,激活为 float16;
权重 per-channel/group 量化:按通道或按组进行量化;
权重非对称量化:量化参数包括scale和zero point;
因此,在使用 LLMC 进行模型量化时,必须确保权重和激活的比特数设置为 AutoAWQ支持的格式。
1.3 使用LLMC量化模型#
1.3.1 校准数据#
在本章节中,我们使用Pileval和Wikitext两个学术数据集作为校准数据,有关于校准数据的下载和预处理请参考章节。
在实际使用中,建议应使用真实部署场景的数据进行离线量化校准。
1.3.2 量化算法的选择#
W4A16
在 W4A16 的量化设置下,我们建议使用 LLMC 中的 AWQ 算法。
具体实现可以参考 AWQ W4A16 的权重量化 配置文件
# configs/quantization/backend/autoawq/awq_w4a16.yml
quant:
method: Awq
weight:
bit: 4
symmetric: True
granularity: per_group
group_size: 128
pack_version: gemm_pack
special:
trans: True
trans_version: v2
weight_clip: True
quant_out: True
请注意,此步骤中需要将 pack_version 参数设置为 gemm_pack 或 gemv_pack,它们分别对应将 int4 数据打包成 torch.int32 的两种方式,适用于 AutoAWQ 中加载 GEMM 和 GEMV 内核时的不同需求。关于 GEMM 和 GEMV 的区别,请参阅此链接。
此外,如果 AWQ 无法满足精度需求,还可以尝试其他算法,例如 GPTQ。同时,我们建议使用此章节中介绍的 AWQ+OmniQuant 组合算法,以进一步提升精度。我们也提供了相应的配置文件供参考。
1.3.3 真实量化模型导出#
save:
save_autoawq: True
save_path: /path/to/save_for_autoawq_awq_w4/
请注意,务必将 save_autoawq 设置为 True。对于 W4A16 的量化设置,LLMC 会将权重打包为 torch.int32 形式导出,便于 AutoAWQ 直接加载,并且会同时导出量化参数。
1.3.4 运行LLMC#
修改运行脚本中的配置文件路径并运行:
# scripts/run_llmc.sh
llmc=llmc_path
export PYTHONPATH=$llmc:$PYTHONPATH
task_name=awq_for_autoawq
config=${llmc}/configs/quantization/backend/autoawq/awq_w4a16.yml
等LLMC运行结束后,真实量化的模型就会存储在save.save_path路径
1.4 使用AutoAWQ推理模型#
1.4.1 离线推理#
我们提供了一个使用 AutoAWQ 进行离线推理的示例。
首先,需要将 AutoAWQ 的仓库克隆到本地:
git clone https://github.com/casper-hansen/AutoAWQ.git
接着,将示例中的 autoawq_path 替换为你本地的 AutoAWQ 仓库路径,并将示例中的 model_path替换为save.save_path 中保存的模型路径。然后运行以下命令即可完成推理:
cd examples/backend/autoawq
CUDA_VISIBLE_DEVICES=0 python infer_with_autoawq.py