HQQ 项目介绍
什么是 HQQ?
HQQ(Half-Quadratic Quantization)是一种快速且准确的模型量化方法,它无需校准数据即可对大型模型进行量化,并且这一过程可以在短短几分钟内完成。HQQ 支持对不同位数(8、4、3、2、1 位)的模型进行量化,并兼容各种类型的模型,包括语言模型和视觉模型。同时,其反量化步骤是线性操作,这意味着 HQQ 可以与优化的 CUDA 或 Triton 内核兼容,与 peft 训练兼容,并且我们努力使 HQQ 完全兼容 torch.compile
,以实现更快的推理和训练。
HQQ 与其他量化方法的优势
- 速度快:HQQ 驱动的模型量化过程非常迅速。
- 兼容性强:可以在语言模型和视觉模型等各种模型上使用。
- 多样化支持:支持不同位数(8、4、3、2、1 位)的量化。
- 兼容性:与
torch.compile
、CUDA 和 Triton 内核等多种优化工具兼容。 - 无须校准数据:HQQ 的独特优势之一是在量化过程中无需校准数据。
使用指导
安装
要开始使用 HQQ,只需确保您的 CUDA 版本与 PyTorch 2 的某个版本相匹配。然后可以通过以下命令安装 HQQ:
pip install hqq
获取最新版本可通过安装核心库:
pip install git+https://github.com/mobiusml/hqq.git
或克隆仓库后运行:
pip install .
基本用法
执行 HQQ 的量化只需替换模型中的线性层(torch.nn.Linear
)。以下是示例代码:
from hqq.core.quantize import *
# 量化设置
quant_config = BaseQuantizeConfig(nbits=4, group_size=64)
# 替换线性层
hqq_layer = HQQLinear(your_linear_layer, # torch.nn.Linear 或 None
quant_config=quant_config, # 量化配置
compute_dtype=torch.float16, # 计算数据类型
device='cuda', # cuda 设备
initialize=True, # 使用 False 以便稍后进行量化
del_orig=True # 如果为真,删除原始层
)
后端支持
HQQ 支持多种后端,以加速推理和训练,包括原生后端(如 PyTorch 和 ATEN)以及外部后端(如 Torchao 的 tiny_gemm 和 Marlin)。用户可以根据需求选择合适的后端来获取更快的模型运算速度。
设置后端
您可以通过以下代码为 HQQ 模块设置后端:
HQQLinear.set_backend(HQQBackend.ATEN if axis==0 else HQQBackend.PYTORCH_COMPILE)
用于模型
HQQ 可以与 Hugging Face 的 Transformers 模型结合使用,使模型量化配置变得极为简便。用户只需指定量化配置,即可将预训练模型替换为使用 HQQ 的量化模型。
保存和加载
可以保存和加载 HQQ 量化后的模型,使用下面的代码段:
from hqq.models.hf.base import AutoHQQHFModel
# 保存模型
AutoHQQHFModel.save_quantized(model, save_dir)
# 加载模型
model = AutoHQQHFModel.from_quantized(save_dir)
Peft 训练
HQQ 还支持 Peft 训练,使模型在多 GPU 上的训练更加高效。用户可以利用 HQQ 提供的工具轻松进行 Peft 初始化、训练以及权重的保存和加载。
示例代码与文档
项目中提供了丰富的使用示例,示例目录中展现了不同后端下模型量化的用法,以及完整的 HQQ/LoRA 训练示例,帮助用户快速上手。
引用
@misc{badri2023hqq,
title = {Half-Quadratic Quantization of Large Machine Learning Models},
url = {https://mobiusml.github.io/hqq_blog/},
author = {Hicham Badri and Appu Shaji},
month = {November},
year = {2023}
HQQ 是一个功能强大且易于使用的模型量化工具,适合需要快速且高效地处理大型机器学习模型的用户。