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è)量化庫(kù)。請(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)于量化的博文 - 本文簡(jiǎn)要介紹了量化以及 transformers 中原生支持的量化方法。
bitsandbytes 與 auto-gptq 之比較
本節(jié)我們將討論 bitsandbytes 和 gptq 量化各自的優(yōu)缺點(diǎn)。請(qǐng)注意,這些比較主要基于社區(qū)的反饋,它們具有一定的時(shí)效性,會(huì)隨著時(shí)間的推移而變化,比如說(shuō)其中一些功能缺失已被納入相應(yīng)庫(kù)的路線圖中了。
bitsandbytes 有什么好處?
簡(jiǎn)單: bitsandbytes 依舊是量化任何模型的最簡(jiǎn)單方法,因?yàn)樗恍枰炕?zhǔn)數(shù)據(jù)及校準(zhǔn)過(guò)程 (即零樣本量化)。任何模型只要含有 torch.nn.Linear 模塊,就可以對(duì)其進(jìn)行開箱即用的量化。每當(dāng)在 transformers 中添加新架構(gòu)時(shí),只要其可以用 accelerate 庫(kù)的 device_map="auto" 加載,用戶就可以直接受益于開箱即用的 bitsandbytes 量化,同時(shí)該方法對(duì)性能的影響也是最小的。量化是在模型加載時(shí)執(zhí)行的,無(wú)需運(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 比特模型無(wú)法序列化。社區(qū)用戶經(jīng)常提出這樣的請(qǐng)求,我們相信 bitsandbytes 維護(hù)者應(yīng)該很快就能解決這個(gè)問(wèn)題,因?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í))。
目前僅可用于語(yǔ)言模型: 截至目前,用 autoGPTQ 對(duì)模型進(jìn)行量化的 API 僅支持語(yǔ)言模型。使用 GPTQ 算法量化非文本 (或多模態(tài)) 模型應(yīng)該是可行的,但原始論文或 auto-gptq 代碼庫(kù)中尚未對(duì)此有詳細(xì)說(shuō)明。如果社區(qū)對(duì)這方面很有興趣,將來(lái)可能會(huì)考慮這一點(diǎn)。
深入研究速度基準(zhǔn)
我們決定在不同硬件上使用 bitsandbytes 和 auto-gptq 在推理和適配器微調(diào)這兩大場(chǎng)景上進(jìn)行一系列廣泛的基準(zhǔn)測(cè)試。推理基準(zhǔn)測(cè)試應(yīng)該讓用戶了解不同推理方法之間可能存在的速度差異,而適配器微調(diào)基準(zhǔn)測(cè)試應(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)測(cè)試僅測(cè)量預(yù)填充 (prefill) 步驟,該步驟對(duì)應(yīng)于訓(xùn)練期間的前向傳遞。測(cè)試基于單張英偉達(dá) A100-SXM4-80GB GPU,提示長(zhǎng)度為 512,模型為 meta-llama/Llama-2-13b-hf 。
batch size = 1 時(shí):
| 量化方法 | act_order | 比特?cái)?shù) | group_size | 加速核 | 加載時(shí)間 (秒) | 每詞元延遲 (毫秒) | 吞吐 (詞元/秒) | 峰值顯存 (MB) |
|---|---|---|---|---|---|---|---|---|
| fp16 | None | None | None | None | 26.0 | 36.958 | 27.058 | 29152.98 |
| gptq | False | 4 | 128 | exllama | 36.2 | 33.711 | 29.663 | 10484.34 |
| bitsandbytes | None | 4 | None | None | 37.64 | 52.00 | 19.23 | 11018.36 |
batch size = 16 時(shí):
| 量化方法 | act_order | 比特?cái)?shù) | group_size | 加速核 | 加載時(shí)間 (秒) | 每詞元延遲 (毫秒) | 吞吐 (詞元/秒) | 峰值顯存 (MB) |
|---|---|---|---|---|---|---|---|---|
| fp16 | None | None | None | None | 26.0 | 69.94 | 228.76 | 53986.51 |
| gptq | False | 4 | 128 | exllama | 36.2 | 95.41 | 167.68 | 34777.04 |
| bitsandbytes | None | 4 | None | None | 37.64 | 113.98 | 140.38 | 35532.37 |
我們可以看到,bitsandbyes 和 GPTQ 的預(yù)填充速度相當(dāng),batch size 比較大時(shí) GPTQ 稍快一些。欲了解有關(guān)該基準(zhǔn)測(cè)試的更多詳細(xì)信息,請(qǐng)參閱此 鏈接。
生成速度
下面測(cè)試推理過(guò)程中模型的生成速度,你可以在 此處 找到基準(zhǔn)測(cè)試腳本,用于重現(xiàn)我們的結(jié)果。
use_cache
我們先測(cè)試 use_cache 參數(shù)的影響,以更好地了解在生成過(guò)程中鍵值緩存對(duì)速度的影響。
該基準(zhǔn)測(cè)試在 A100 上運(yùn)行,提示長(zhǎng)度為 30,生成詞元數(shù)也為 30,模型為 meta-llama/Llama-2-7b-hf 。
use_cache=True 時(shí):
use_cache=False 時(shí):
通過(guò)這兩個(gè)基準(zhǔn)測(cè)試,可以得出結(jié)論,使用注意力緩存時(shí),生成速度會(huì)更快,該結(jié)論符合預(yù)期。此外,一般來(lái)說(shuō),GPTQ 比 bitsandbytes 更快。例如, batch_size=4 且 use_cache=True 時(shí),GPTQ 速度快了一倍!因此,我們下一個(gè)基準(zhǔn)測(cè)試中會(huì)直接使用 use_cache=True 。請(qǐng)注意, use_cache=True 會(huì)消耗更多顯存。
硬件
下面,我們看看量化模型在不同的硬件上的表現(xiàn)。我們使用的提示長(zhǎng)度為 30,生成 30 個(gè)詞元,使用的模型是 meta-llama/Llama-2-7b-hf 。
單張 A100:
單張 T4:
單張 Titan RTX:
從上面的基準(zhǔn)測(cè)試中,我們可以得出結(jié)論,對(duì)于這三款 GPU,GPTQ 都比 bitsandbytes 更快。
生成長(zhǎng)度
在下面的基準(zhǔn)測(cè)試中,我們將嘗試不同的生成長(zhǎng)度,看看它們對(duì)量化模型速度的影響。實(shí)驗(yàn)基于 A100,我們使用的提示長(zhǎng)度為 30,并改變生成詞元的長(zhǎng)度。使用的模型是 meta-llama/Llama-2-7b-hf 。
生成 30 個(gè)詞元:
生成 512 個(gè)詞元:
從以上基準(zhǔn)測(cè)試中,我們可以得出結(jié)論,無(wú)論生成長(zhǎng)度如何,GPTQ 都比 bitsandbytes 更快。
適配器微調(diào) (前向 + 后向)
對(duì)量化模型進(jìn)行全模型微調(diào)是不可能的。但是,你可以利用參數(shù)高效微調(diào) (PEFT) 來(lái)微調(diào)量化模型,在其之上訓(xùn)練新的適配器。我們使用一種名為“低秩適配器 (LoRA)”的微調(diào)方法: 無(wú)需微調(diào)整個(gè)模型,僅需微調(diào)這些適配器并將它們正確加載到模型中。我們來(lái)對(duì)比一下微調(diào)速度吧!
該基準(zhǔn)測(cè)試基于英偉達(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ì)帶來(lái)性能退化。我們使用 Open-LLM 排行榜 來(lái)比較性能!
對(duì)于 7B 模型:
| 模型 | 均值 | ARC | Hellaswag | MMLU | TruthfulQA |
|---|---|---|---|---|---|
| meta-llama/llama-2-7b-hf | 54.32 | 53.07 | 78.59 | 46.87 | 38.76 |
| meta-llama/llama-2-7b-hf-bnb-4bit | 53.4 | 53.07 | 77.74 | 43.8 | 38.98 |
| TheBloke/Llama-2-7B-GPTQ | 53.23 | 52.05 | 77.59 | 43.99 | 39.32 |
對(duì)于 13B 模型:
| 模型 | 均值 | ARC | Hellaswag | MMLU | TruthfulQA |
|---|---|---|---|---|---|
| meta-llama/llama-2-13b-hf | 58.66 | 59.39 | 82.13 | 55.74 | 37.38 |
| TheBloke/Llama-2-13B-GPTQ (revision = 'gptq-4bit-128g-actorder_True') | 58.03 | 59.13 | 81.48 | 54.45 | 37.07 |
| TheBloke/Llama-2-13B-GPTQ | 57.56 | 57.25 | 81.66 | 54.81 | 36.56 |
| meta-llama/llama-2-13b-hf-bnb-4bit | 56.9 | 58.11 | 80.97 | 54.34 | 34.17 |
從上面的結(jié)果中,我們可以得出結(jié)論,模型越大,退化越少。更有意思的是,所有的退化都很小!
總結(jié)與最后的話
通過(guò)本文,我們比較了多種設(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)用場(chǎng)景中,我們期待看到大家用它構(gòu)建自己的有趣應(yīng)用!
致謝
我們要感謝 Ilyas、Clémentine 和 Felix 在基準(zhǔn)測(cè)試上的幫助。
我們還要感謝 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 (阿東)
總結(jié)
以上是生活随笔為你收集整理的Transformers 中原生支持的量化方案概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Windows 开发环境配置】NVID
- 下一篇: rust程序设计(3)结构体相关概念和疑