概述 Transformer 支持的每种量化方案的优缺点,以帮助您决定应该选择哪一种。
目前,量化模型主要用于两个目的:
- 在较小的设备上运行大型模型的推理
- 在量化模型之上微调适配器
资源
- GPTQ 博客文章– 概述什么是 GPTQ 量化方法以及如何使用它。
- bistandbytes 4 位量化博客文章- 这篇博客文章介绍了 4 位量化和 QLoRa,一种高效的微调方法。
- bistandbytes 8 位量化博客文章- 这篇博客文章解释了 8 位量化如何与 bitsandbytes 配合使用。
- 用于 GPTQ 的 Google Colab 笔记本的基本用法- 该笔记本展示了如何使用 GPTQ 方法量化 Transformer 模型、如何进行推理以及如何使用量化模型进行微调。
- 用于bitsandbytes的Google Colab笔记本的基本用法- 该笔记本展示了如何在推理中使用4位模型及其所有变体,以及如何在免费的Google Colab实例上运行GPT-neo-X(20B参数模型)。
- Merve 关于量化的博文- 这篇博文简要介绍了量化以及 Transformer 中原生支持的量化方法。
比较bitsandbytes和auto-gptq
在本节中,我们将讨论位和字节和 gptq 量化的优缺点。请注意,这些功能基于社区的反馈,并且会随着时间的推移而不断发展,因为其中一些功能已在相应库的路线图中。
bitsandbytes有什么好处?
- 容易:bitsandbytes 仍然是量化任何模型的最简单方法,因为它不需要使用输入数据校准量化模型(也称为零样本量化)。只要包含模块,就可以对任何开箱即用的torch.nn.Linear模型进行量化。每当变压器中添加新架构时,只要它们可以加载加速器device_map=”auto”,用户就可以直接从开箱即用的位和字节量化中受益,同时性能下降最小。量化是在模型加载时执行的,无需运行任何后处理或准备步骤。
- 跨模态互操作性:由于量化模型的唯一条件是包含一个torch.nn.Linear层,因此量化对于任何模态都是开箱即用的,使得可以以 8 位或 8 位加载模型,例如 Whisper、ViT、Blip2 等开箱即用的 4 位。
- 0 合并适配器时性能下降:(如果您不熟悉,请阅读本博文中有关适配器和 PEFT 的更多信息)。如果您在量化基础模型之上训练适配器,则可以将适配器合并在基础模型之上进行部署,而不会降低推理性能。您还可以将适配器合并到反量化模型之上!GPTQ 不支持此功能。
autoGPTQ 有哪些优势?
- 快速生成文本:在文本生成方面,GPTQ 量化模型比 bitandbytes 量化模型更快。我们将在适当的章节中讨论速度比较。
- 支持 n-bit:GPTQ 算法可以将模型量化到 2 位!然而,这可能会带来严重的质量下降。建议的比特数为 4,目前看来这对 GPTQ 来说是一个很好的权衡。
- 易于序列化:GPTQ 模型支持任意位数的序列化。从 TheBloke 命名空间加载模型:https://huggingface.co/TheBloke(查找那些以 -GPTQ 后缀结尾的模型),只要安装了所需的软件包,就可以立即加载模型。Bitsandbytes 支持 8 位序列化,但目前还不支持 4 位序列化。
- AMD 支持:对于 AMD GPU 来说,集成应该是开箱即用!
bitsandbytes 有哪些潜在的改进空间?
- 在文本生成方面比 GPTQ 慢:使用生成功能时,bitsandbytes 4 位模型比 GPTQ 慢。
- 4-bit权重不可序列化:目前,4 位模型无法序列化。这是社区经常提出的要求,我们认为 bitsandbytes 维护者应该尽快解决这个问题,因为这已经列入了他们的路线图!
autoGPTQ 有哪些潜在的改进空间?
- 校准数据集:校准数据集的需求可能会阻碍一些用户使用 GPTQ。此外,量化模型可能需要几个小时(例如,根据论文第 2 部分,175B 比例模型需要 4 GPU 小时)。
- 量化模型仅适用于语言模型(目前):到目前为止,使用自动 GPTQ 量化模型的 API 只支持语言模型。使用 GPTQ 算法量化非文本(或多模态)模型应该是可能的,但这一过程在原始论文或 auto-gptq 存储库中都没有详细说明。如果社区对这一主题感兴趣,未来可能会考虑这一问题。
深入了解速度基准
我们决定在不同硬件上使用 bitsandbytes 和 auto-gptq 为推理和微调适配器提供广泛的基准测试。推理基准应能让用户了解我们提出的不同推理方法之间可能存在的速度差异,而适配器微调基准应能让用户在决定使用哪种方法在 bitandbytes 和 GPTQ 基本模型的基础上对适配器进行微调时有一个清晰的思路。
我们将使用以下设置:
- bitsandbytes:4-bit量化,bnb_4bit_compute_dtype=torch.float16。确保使用 bitsandbytes>=0.41.1 快速 4 位内核。
- auto-gptq:使用 exllama 内核的 4-bit量化。使用 ex-llama 内核需要 auto-gptq>=0.4.0。
推理速度(仅前向传递)
该基准仅测量预填充步骤,相当于训练过程中的前向传递。它在单个英伟达 A100-SXM4-80GB GPU 上运行,提示长度为 512。我们使用的模型是 meta-llama/Llama-2-13b-hf。
更多点击标题
结论和结束语
在这篇博文中,我们比较了 bitsandbytes 和 GPTQ 在多种设置下的量化效果。我们发现,bitsandbytes 更适合微调,而 GPTQ 更适合生成。从这一观察结果来看,获得更好的合并模型的一种方法是: