Transformers 中原生支持的量化方案概述

本文旨在對(duì) transformers 支持的各種量化方案及其優(yōu)缺點(diǎn)作一個(gè)清晰的概述,以助于讀者進(jìn)行方案選擇。
目前,量化模型有兩個(gè)主要的用途:
在較小的設(shè)備上進(jìn)行大模型推理
對(duì)量化模型進(jìn)行適配器微調(diào)
到目前為止,transformers 已經(jīng)集成并?原生?支持了?bitsandbytes?和?auto-gptq?這兩個(gè)量化庫。請(qǐng)注意,?? optimum 還支持更多的量化方案,但本文不會(huì)涉及這一塊內(nèi)容。
要詳細(xì)了解每種方案的更多信息,可查看下文列出的相關(guān)資源,或者閱讀相應(yīng)的?transformers
?文檔。
另請(qǐng)注意,下文內(nèi)容僅適用于?PyTorch
?模型,?Tensorflow
?和?Flax/JAX
?模型不在討論范圍之內(nèi)。
目錄
資源
bitsandbytes 與 auto-gptq 之比較
深入研究速度基準(zhǔn)
總結(jié)與最后的話
致謝
資源
GPTQ 博文?– 概述什么是 GPTQ 量化方法以及如何使用它。
bistandbytes 4 比特量化博文?- 本文介紹了 4 比特量化和 QLoRa,QLoRa 是一種高效的微調(diào)方法。
bistandbytes 8 比特量化博文?- 本文解釋了如何與 bitsandbytes 配合使用 8 比特量化。
有關(guān) GPTQ 基礎(chǔ)用法的 Google Colab 筆記本?- 本筆記本展示了如何使用 GPTQ 方法量化你自己的 transformer 模型,如何用量化模型進(jìn)行推理,以及如何對(duì)量化模型進(jìn)行微調(diào)。
有關(guān) bitsandbytes 基礎(chǔ)用法的 Google Colab 筆記本?- 該筆記本展示了如何在推理中使用 4 比特模型及其所有變體,以及如何在免費(fèi)的 Google Colab 實(shí)例上運(yùn)行 GPT-neo-X (20B 模型)。
Merve 撰寫的關(guān)于量化的博文?- 本文簡要介紹了量化以及 transformers 中原生支持的量化方法。
bitsandbytes 與 auto-gptq 之比較
本節(jié)我們將討論?bitsandbytes
?和?gptq
?量化各自的優(yōu)缺點(diǎn)。請(qǐng)注意,這些比較主要基于社區(qū)的反饋,它們具有一定的時(shí)效性,會(huì)隨著時(shí)間的推移而變化,比如說其中一些功能缺失已被納入相應(yīng)庫的路線圖中了。
bitsandbytes 有什么好處?
簡單: bitsandbytes 依舊是量化任何模型的最簡單方法,因?yàn)樗恍枰炕?zhǔn)數(shù)據(jù)及校準(zhǔn)過程 (即零樣本量化)。任何模型只要含有?torch.nn.Linear
?模塊,就可以對(duì)其進(jìn)行開箱即用的量化。每當(dāng)在?transformers
?中添加新架構(gòu)時(shí),只要其可以用?accelerate
?庫的?device_map="auto"
?加載,用戶就可以直接受益于開箱即用的 bitsandbytes 量化,同時(shí)該方法對(duì)性能的影響也是最小的。量化是在模型加載時(shí)執(zhí)行的,無需運(yùn)行任何后處理或準(zhǔn)備步驟。
跨模態(tài)互操作性: 由于量化模型的唯一條件是包含?torch.nn.Linear
?層,因此量化對(duì)于任何模態(tài)都可以實(shí)現(xiàn)開箱即用。用戶可以開箱即用地加載諸如 Whisper、ViT、Blip2 之類的 8 比特或 4 比特模型。
合并適配器 (adapter) 時(shí)性能下降為 0: (如果你對(duì)此不熟悉,請(qǐng)參閱?此文?以獲得有關(guān)適配器和 PEFT 的更多信息)。如果你在量化基礎(chǔ)模型之上訓(xùn)練適配器,則可以將適配器合并在基礎(chǔ)模型之上進(jìn)行部署,而不會(huì)降低推理性能。你甚至還可以在反量化模型之上?合并?適配器!GPTQ 不支持此功能。
autoGPTQ 有什么好處?
文本生成速度快: 對(duì)?文本生成?任務(wù)而言,GPTQ 量化模型的速度比 bitsandbytes 量化模型的速度更快,下文我們會(huì)詳細(xì)比較。
n 比特支持: GPTQ 算法可以將模型量化至 2 比特!但這可能會(huì)導(dǎo)致嚴(yán)重的質(zhì)量下降。我們建議使用 4 比特,這個(gè)值對(duì) GPTQ 而言是個(gè)很好的折衷。
易于序列化: GPTQ 模型支持任意比特的序列化。只要安裝了所需的軟件包,就支持開箱即用地從 TheBloke 空間?中加載后綴為?-GPTQ
?的模型。bitsandbytes 支持 8 比特序列化,但尚不支持 4 比特序列化。
AMD 支持: 開箱即用支持 AMD GPU!
bitsandbytes 還有哪些潛在的改進(jìn)空間?
文本生成速度比 GPTQ 慢: 使用?generate
?接口時(shí),bitsandbytes 4 比特模型比 GPTQ 慢。
4 比特權(quán)重不可序列化: 目前,4 比特模型無法序列化。社區(qū)用戶經(jīng)常提出這樣的請(qǐng)求,我們相信 bitsandbytes 維護(hù)者應(yīng)該很快就能解決這個(gè)問題,因?yàn)檫@已經(jīng)在其路線圖中了!
autoGPTQ 還有哪些潛在的改進(jìn)空間?
校準(zhǔn)數(shù)據(jù)集: 對(duì)校準(zhǔn)數(shù)據(jù)集的需求可能會(huì)讓一些用戶難以用上 GPTQ。此外,模型量化可能需要幾個(gè)小時(shí) (例如,根據(jù)?該論文第 2 節(jié),175B 的模型需要 4 個(gè) GPU 時(shí))。
目前僅可用于語言模型: 截至目前,用 autoGPTQ 對(duì)模型進(jìn)行量化的 API 僅支持語言模型。使用 GPTQ 算法量化非文本 (或多模態(tài)) 模型應(yīng)該是可行的,但原始論文或 auto-gptq 代碼庫中尚未對(duì)此有詳細(xì)說明。如果社區(qū)對(duì)這方面很有興趣,將來可能會(huì)考慮這一點(diǎn)。
深入研究速度基準(zhǔn)
我們決定在不同硬件上使用 bitsandbytes 和 auto-gptq 在推理和適配器微調(diào)這兩大場景上進(jìn)行一系列廣泛的基準(zhǔn)測試。推理基準(zhǔn)測試應(yīng)該讓用戶了解不同推理方法之間可能存在的速度差異,而適配器微調(diào)基準(zhǔn)測試應(yīng)該讓用戶在需要決定選擇 bitsandbytes 還是 GPTQ 基礎(chǔ)模型進(jìn)行適配器微調(diào)時(shí)有一個(gè)清晰的判斷。
基本設(shè)置如下:
bitsandbytes: 使用?
bnb_4bit_compute_dtype=torch.float16
?進(jìn)行 4 比特量化。確保使用?bitsandbytes>=0.41.1
?,以用上 4 比特加速核函數(shù)。auto-gptq: 確保?
auto-gptq>=0.4.0
?以用上?exllama
?加速核函數(shù)進(jìn)行 4 比特量化。
推理速度 (僅前向)
該基準(zhǔn)測試僅測量預(yù)填充 (prefill) 步驟,該步驟對(duì)應(yīng)于訓(xùn)練期間的前向傳遞。測試基于單張英偉達(dá) A100-SXM4-80GB GPU,提示長度為 512,模型為?meta-llama/Llama-2-13b-hf
?。
batch size = 1 時(shí):

batch size = 16 時(shí):

我們可以看到,bitsandbyes 和 GPTQ 的預(yù)填充速度相當(dāng),batch size 比較大時(shí) GPTQ 稍快一些。欲了解有關(guān)該基準(zhǔn)測試的更多詳細(xì)信息,請(qǐng)參閱此?鏈接。
生成速度
下面測試推理過程中模型的生成速度,你可以在?此處?找到基準(zhǔn)測試腳本,用于重現(xiàn)我們的結(jié)果。
use_cache
我們先測試?use_cache
?參數(shù)的影響,以更好地了解在生成過程中鍵值緩存對(duì)速度的影響。
該基準(zhǔn)測試在 A100 上運(yùn)行,提示長度為 30,生成詞元數(shù)也為 30,模型為?meta-llama/Llama-2-7b-hf
?。
use_cache=True
?時(shí):

use_cache=False
?時(shí):

通過這兩個(gè)基準(zhǔn)測試,可以得出結(jié)論,使用注意力緩存時(shí),生成速度會(huì)更快,該結(jié)論符合預(yù)期。此外,一般來說,GPTQ 比 bitsandbytes 更快。例如,?batch_size=4
?且?use_cache=True
?時(shí),GPTQ 速度快了一倍!因此,我們下一個(gè)基準(zhǔn)測試中會(huì)直接使用?use_cache=True
?。請(qǐng)注意,?use_cache=True
?會(huì)消耗更多顯存。
硬件
下面,我們看看量化模型在不同的硬件上的表現(xiàn)。我們使用的提示長度為 30,生成 30 個(gè)詞元,使用的模型是?meta-llama/Llama-2-7b-hf
?。
單張 A100:

單張 T4:

單張 Titan RTX:

從上面的基準(zhǔn)測試中,我們可以得出結(jié)論,對(duì)于這三款 GPU,GPTQ 都比 bitsandbytes 更快。
生成長度
在下面的基準(zhǔn)測試中,我們將嘗試不同的生成長度,看看它們對(duì)量化模型速度的影響。實(shí)驗(yàn)基于 A100,我們使用的提示長度為 30,并改變生成詞元的長度。使用的模型是?meta-llama/Llama-2-7b-hf
?。
生成 30 個(gè)詞元:

生成 512 個(gè)詞元:

從以上基準(zhǔn)測試中,我們可以得出結(jié)論,無論生成長度如何,GPTQ 都比 bitsandbytes 更快。
適配器微調(diào) (前向 + 后向)
對(duì)量化模型進(jìn)行全模型微調(diào)是不可能的。但是,你可以利用參數(shù)高效微調(diào) (PEFT) 來微調(diào)量化模型,在其之上訓(xùn)練新的適配器。我們使用一種名為“低秩適配器 (LoRA)”的微調(diào)方法: 無需微調(diào)整個(gè)模型,僅需微調(diào)這些適配器并將它們正確加載到模型中。我們來對(duì)比一下微調(diào)速度吧!
該基準(zhǔn)測試基于英偉達(dá) A100 GPU,我們使用 Hub 中的?meta-llama/Llama-2-7b-hf
?模型。請(qǐng)注意,對(duì)于 GPTQ 模型,我們必須禁用?exllama
?加速核,因?yàn)樗恢С治⒄{(diào)。

從結(jié)果中,我們可以得出結(jié)論,bitsandbytes 的微調(diào)速度比 GPTQ 更快。
性能退化
量化對(duì)于減少內(nèi)存消耗非常有用。然而,它也會(huì)帶來性能退化。我們使用 Open-LLM 排行榜?來比較性能!
對(duì)于 7B 模型:

對(duì)于 13B 模型:

從上面的結(jié)果中,我們可以得出結(jié)論,模型越大,退化越少。更有意思的是,所有的退化都很小!
總結(jié)與最后的話
通過本文,我們比較了多種設(shè)置下的 bitsandbytes 和 GPTQ 量化。我們發(fā)現(xiàn),bitsandbytes 更適合微調(diào),而 GPTQ 更適合生成。根據(jù)這一觀察,獲得最佳合并模型的一種方法是:
(1) 使用 bitsandbytes 量化基礎(chǔ)模型 (零樣本量化)
(2) 添加并微調(diào)適配器
(3) 將訓(xùn)練后的適配器合并到基礎(chǔ)模型或?反量化模型?之中!
(4) 使用 GPTQ 量化合并后的模型并將其用于部署
我們希望這個(gè)概述讓每個(gè)人都能更輕松地將 LLM 應(yīng)用至各自的應(yīng)用場景中,我們期待看到大家用它構(gòu)建自己的有趣應(yīng)用!
致謝
我們要感謝 Ilyas、Clémentine 和 Felix 在基準(zhǔn)測試上的幫助。
我們還要感謝 Pedro Cuenca 對(duì)本文撰寫的幫助。
英文原文:?https://hf.co/blog/overview-quantization-transformers
原文作者: Younes Belkada,Marc Sun,Ilyas Moutawwakil,Clémentine Fourrier,F(xiàn)élix Marty
譯者: Matrix Yao (姚偉峰),英特爾深度學(xué)習(xí)工程師,工作方向?yàn)?transformer-family 模型在各模態(tài)數(shù)據(jù)上的應(yīng)用及大規(guī)模模型的訓(xùn)練推理
審校/排版: zhongdongy (阿東)