本文旨在对 transformers 支持的各种量化方案及其优缺点作一个清晰的概述,以助于读者进行方案选择。
目前,量化模型有两个主要的用途:
在较小的设备上进行大模型推理
对量化模型进行适配器微调
到目前为止,transformers 已经集成并 原生 支持了 bitsandbytes 和 auto-gptq 这两个量化库。请注意,🤗 optimum 还支持更多的量化方案,但本文不会涉及这一块内容。
要详细了解每种方案的更多信息,可查看下文列出的相关资源,或者阅读相应的 transformers
文档。
另请注意,下文内容仅适用于 PyTorch
模型, Tensorflow
和 Flax/JAX
模型不在讨论范围之内。
目录
资源
bitsandbytes 与 auto-gptq 之比较
深入研究速度基准
总结与最后的话
致谢
资源
GPTQ 博文 – 概述什么是 GPTQ 量化方法以及如何使用它。
bistandbytes 4 比特量化博文 - 本文介绍了 4 比特量化和 QLoRa,QLoRa 是一种高效的微调方法。
bistandbytes 8 比特量化博文 - 本文解释了如何与 bitsandbytes 配合使用 8 比特量化。
有关 GPTQ 基础用法的 Google Colab 笔记本 - 本笔记本展示了如何使用 GPTQ 方法量化你自己的 transformer 模型,如何用量化模型进行推理,以及如何对量化模型进行微调。
有关 bitsandbytes 基础用法的 Google Colab 笔记本 - 该笔记本展示了如何在推理中使用 4 比特模型及其所有变体,以及如何在免费的 Google Colab 实例上运行 GPT-neo-X (20B 模型)。
Merve 撰写的关于量化的博文 - 本文简要介绍了量化以及 transformers 中原生支持的量化方法。
bitsandbytes 与 auto-gptq 之比较
本节我们将讨论 bitsandbytes
和 gptq
量化各自的优缺点。请注意,这些比较主要基于社区的反馈,它们具有一定的时效性,会随着时间的推移而变化,比如说其中一些功能缺失已被纳入相应库的路线图中了。
bitsandbytes 有什么好处?
简单: bitsandbytes 依旧是量化任何模型的最简单方法,因为它不需要量化校准数据及校准过程 (即零样本量化)。任何模型只要含有 torch.nn.Linear
模块,就可以对其进行开箱即用的量化。每当在 transformers
中添加新架构时,只要其可以用 accelerate
库的 device_map="auto"
加载,用户就可以直接受益于开箱即用的 bitsandbytes 量化,同时该方法对性能的影响也是最小的。量化是在模型加载时执行的,无需运行任何后处理或准备步骤。
跨模态互操作性: 由于量化模型的唯一条件是包含 torch.nn.Linear
层,因此量化对于任何模态都可以实现开箱即用。用户可以开箱即用地加载诸如 Whisper、ViT、Blip2 之类的 8 比特或 4 比特模型。
合并适配器 (adapter) 时性能下降为 0: (如果你对此不熟悉,请参阅 此文 以获得有关适配器和 PEFT 的更多信息)。如果你在量化基础模型之上训练适配器,则可以将适配器合并在基础模型之上进行部署,而不会降低推理性能。你甚至还可以在反量化模型之上 合并 适配器!GPTQ 不支持此功