本文翻译整理自:
https://llama.meta.com/docs/how-to-guides/quantization/
文章目录
-
- PyTorch中支持的量化模式
- [使用 TorchAO 进行 Pytorch量化](#使用 TorchAO 进行 Pytorch量化)
- HF支持的量化
量化是机器学习中使用的一种技术,用于减少模型的计算和内存需求,使它们在服务器和边缘设备上的部署更加高效。
它涉及表示模型权重和激活,通常是32位浮点数,使用精度较低的数据,如16位浮点数、大脑浮点数16位、8位整数,甚至4/3/2/1位整数。
量化的好处包括更小的模型大小、更快的微调和更快的推理------在resource-constrained环境中特别有益。然而,权衡是由于精度损失导致模型质量下降。
PyTorch中支持的量化模式
- 训练后动态量化:权重提前预量化,激活在推理期间转换为int8,就在计算之前。由于高效的int8矩阵乘法,这导致计算速度更快,并保持激活层的准确性。
- 训练后静态量化:该技术通过将网络转换为使用整数算术和整数8内存访问来提高性能。它涉及通过网络馈送批量数据并计算不同激活的结果分布。此信息用于确定不同激活在推理时应如何量化。
- 量化感知训练(QAT):在QAT中,所有权重和激活在向前和向后的训练过程中都被"假量化"。这意味着浮点值被四舍五入以模仿int8值,但所有计算仍然使用浮点数完成。这种方法通常比其他两种方法产生更高的准确性,因为训练期间的所有权重调整都是在"意识到"模型最终将被量化的事实的情况下进行的。
关于这些方法以及它们如何应用于不同类型的模型的更多细节可以在官方的PyTorch留档中找到。此外,社区已经对Meta Llama 3上常见量化方法的有效性进行了研究,要评估的结果和代码可以在这个GitHub存储库中找到。
我们接下来将关注Meta Llama 模型可用的量化工具。由于这是一个不断发展的空间,这里详述的库和方法是目前使用最广泛的,并且会随着空间的发展而发生变化。
使用 TorchAO 进行 Pytorch量化
在TorchAO库中提供了几种量化方法,每种方法都有不同的激活和权重量化方案。
对于仅权重量化,我们支持8位和4位量化。4位量化还具有GPTQ支持以提高精度,这需要校准,但具有相同的最终性能。
对于动态量化,我们支持8位激活量化和8位权重量化,我们还支持这种类型的 smoothquant,以提高精度,这需要校准,性能稍差。
此外,该库提供了一个简单的API来测试不同的方法,并自动检测给定模型的最佳量化,称为自动量化。
该API从8位动态和仅8位权重的量化中选择最快的量化形式。
它首先识别不同线性层看到的激活形状,然后在不同类型的量化和非量化层之间对这些形状进行基准测试,以选择最快的一个。此外,它与 torch.compile()
组合以生成快速内核。
有关 torch.compile
的更多信息,请参阅此一般教程。
注意:该库处于beta阶段并处于积极开发中;预计会发生API更改。
HF支持的量化
拥抱脸(HF)提供了多种方法来使用他们的变压器库进行LLM量化。除了这里介绍的简短摘要之外,有关如何使用其中每一个的更多指南和示例,请参阅他们的量化指南 和 transformers 量化配置留档。
llama-recipes 代码使用bitsandbytes 8位量化来加载模型,用于推理 和 微调。(有关在Llama中使用bitsandbytes库的更多信息,请参阅下文。)
Quanto
Quanto是一个使用线性量化的多功能PyTorch量化工具包,它提供了诸如权重量化、激活量化以及与各种设备和模式的兼容性等特性,支持量化感知训练,并且易于与特定设备的自定义内核集成,更多详细信息可以在公告博客、GitHub存储库和HF指南中找到。
AQLM
语言模型的加法量化(AQLM)是LLM的一种压缩方法。
它利用多个权重之间的相互依赖关系将多个权重一起量化。
AQLM将每个权重由8到16个权重组成的组表示为多个向量代码的总和。
该库还通过集成到HF的PEFT库中,支持使用Parameter-高效微调和LoRA对其量化模型进行微调。更多详细信息可以在GitHub 存储库中找到。
AWQ
激活感知权重量化(AWQ)保留了对LLM性能很重要的一小部分权重,从而减少了量化损失。
这允许模型以4位精度运行,而不会出现性能下降。变压器支持加载使用llm-awq和autoawq库量化的模型。有关如何使用变压器库加载它们的更多详细信息,请参阅HF指南。
AutoGPTQ
AutoGPTQ库实现了GPTQ算法,这是一种训练后量化技术,权重矩阵的每一行都被独立量化。
这些权重被量化为int4,但在推理过程中它们会动态恢复到fp16,节省4倍的内存使用量。
更多细节可以在GitHub 存储库中找到。
BitsAndBytes
BitsAndBytes是将模型量化为8位和4位的简单选项。该库支持任何模式的任何模型,只要它支持使用拥抱脸加载加速并包含torch. nn.线性层。
它还提供了在CPU和GPU之间卸载权重的功能,以支持将非常大的模型拟合到内存中,调整8位量化的异常值阈值,跳过某些模型的模块转换,以及使用8位和4位权重进行微调。
对于4位模型,它允许更改计算数据类型,对从正态分布初始化的权重使用正态浮点4(NF4)数据类型,并使用嵌套量化来节省额外的内存,而不会产生额外的性能成本。
更多详细信息可以在HF指南中找到。
2024-07-16(二)