使用 AutoGPTQ 和 Transformers 讓 LLM 更輕量

釋出於 2023 年 8 月 23 日
在 GitHub 上更新

大型語言模型在理解和生成類人文字方面表現出卓越的能力,徹底改變了各個領域的應用。然而,它們對消費級硬體在訓練和部署方面提出的要求越來越難以滿足。

🤗 Hugging Face 的核心使命是“普及優秀的機器學習”,這包括讓所有人儘可能地使用大型模型。本著我們與 bitsandbytes 合作的精神,我們剛剛將 AutoGPTQ 庫整合到 Transformers 中,使使用者能夠使用 GPTQ 演算法(Frantar 等人,2023)將模型量化並以 8 位、4 位、3 位甚至 2 位精度執行。4 位量化對精度損失可忽略不計,且在小批次推理時速度與 fp16 基準相當。請注意,GPTQ 方法與 bitsandbytes 提出的訓練後量化方法略有不同,因為它需要傳入校準資料集。

此整合適用於 Nvidia GPU 和基於 RoCm 的 AMD GPU。

目錄

資源

這篇博文和釋出附帶了一些資源,幫助您開始 GPTQ 量化

GPTQ 論文簡要概述

量化方法通常屬於以下兩類之一:

  1. 訓練後量化 (PTQ):我們使用適度的資源(例如校準資料集和數小時的計算)對預訓練模型進行量化。
  2. 量化感知訓練 (QAT):在訓練或進一步微調之前執行量化。

GPTQ 屬於 PTQ 類別,這對於大型模型特別有意義,因為大型模型的完整模型訓練甚至微調都可能非常昂貴。

具體來說,GPTQ 採用混合 int4/fp16 量化方案,其中權重被量化為 int4,而啟用保持在 float16。在推理過程中,權重會被即時反量化,實際計算則在 float16 中執行。

此方案的好處有兩點

  • 對於 int4 量化,記憶體節省接近 x4,因為反量化發生在計算單元附近(在融合核中),而不是在 GPU 全域性記憶體中。
  • 由於權重使用較低位寬,節省了資料通訊時間,因此潛在的加速效果。

GPTQ 論文解決了逐層壓縮問題

給定一層 ll,其權重矩陣為 WlW_{l} 和層輸入 XlX_{l},我們希望找到權重的量化版本 W^l\hat{W}_{l} 以最小化均方誤差 (MSE)

W^l=argminWl^WlXW^lX22{\hat{W}_{l}}^{*} = argmin_{\hat{W_{l}}} \|W_{l}X-\hat{W}_{l}X\|^{2}_{2}

一旦逐層解決了這個問題,就可以透過結合逐層解決方案來獲得全域性問題的解決方案。

為了解決這個逐層壓縮問題,作者使用了最優腦量化框架(Frantar 等人 2022)。OBQ 方法從觀察開始,即上述方程可以寫成平方誤差的和,即 WlW_{l} 的每一行。

i=0drowWl[i,:]XW^l[i,:]X22 \sum_{i=0}^{d_{row}} \|W_{l[i,:]}X-\hat{W}_{l[i,:]}X\|^{2}_{2}

這意味著我們可以獨立地量化每一行。這稱為逐通道量化。對於每一行 Wl[i,:]W_{l[i,:]},OBQ 一次量化一個權重,同時始終更新所有尚未量化的權重,以補償量化單個權重所產生的誤差。對選定權重的更新有一個閉式公式,利用 Hessian 矩陣。

GPTQ 論文透過引入一系列最佳化來改進該框架,這些最佳化在保持模型準確性的同時降低了量化演算法的複雜性。

與 OBQ 相比,GPTQ 的量化步驟本身也更快:使用 OBQ 量化 BERT 模型 (336M) 需要 2 GPU 小時,而使用 GPTQ,Bloom 模型 (176B) 可以在不到 4 GPU 小時內完成量化。

要了解有關確切演算法以及困惑度和加速方面的不同基準的更多資訊,請檢視原始論文

AutoGPTQ 庫——高效利用 GPTQ 處理 LLM 的一站式庫

AutoGPTQ 庫使使用者能夠使用 GPTQ 方法量化 🤗 Transformers 模型。雖然像 GPTQ-for-LLaMaExllamallama.cpp 等並行社群工作嚴格針對 Llama 架構實現量化方法,但 AutoGPTQ 因其對各種 Transformer 架構的平穩覆蓋而廣受歡迎。

由於 AutoGPTQ 庫涵蓋了更廣泛的 Transformer 模型,我們決定提供一個整合的 🤗 Transformers API,以使 LLM 量化更易於所有人使用。目前,我們已經集成了最常見的最佳化選項,例如 CUDA 核心。對於 Triton 核心或融合注意力相容性等更高階的選項,請檢視 AutoGPTQ 庫。

🤗 Transformers 對 GPTQ 模型提供原生支援

安裝 AutoGPTQ 庫optimumpip install optimum)之後,現在在 Transformers 中執行 GPTQ 模型變得非常簡單:

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("TheBloke/Llama-2-7b-Chat-GPTQ", torch_dtype=torch.float16, device_map="auto")

檢視 Transformers 文件,瞭解所有功能的更多資訊。

我們的 AutoGPTQ 整合有許多優點

  • 量化模型可序列化,並可在 Hub 上共享。
  • GPTQ 大幅降低了執行 LLM 的記憶體需求,同時推理延遲與 FP16 推理相當。
  • AutoGPTQ 支援多種架構的 Exllama 核心。
  • 該整合原生支援 AMD GPU 的 RoCm。
  • 使用 PEFT 進行微調可用。

您可以在 Hub 上檢視您最喜歡的模型是否已被量化。TheBloke 是 Hugging Face 的頂級貢獻者之一,他使用 AutoGPTQ 量化了大量模型並將其共享到 Hugging Face Hub。我們共同努力確保這些倉庫能夠開箱即用地與我們的整合配合使用。

這是一個 batch size = 1 情況下的基準測試樣本。基準測試在單個 NVIDIA A100-SXM4-80GB GPU 上執行。我們使用了 512 的提示長度,並生成了恰好 512 個新 token。第一行是未量化的 fp16 基線,而其他行顯示了使用不同 AutoGPTQ 核心的記憶體消耗和效能。

gptq act_order bits group_size 核心 載入時間 (秒) 每 token 延遲 (毫秒) 吞吐量 (tokens/秒) 峰值記憶體 (MB)
否 (False) 26.0 36.958 27.058 29152.98
True 否 (False) 4 128 exllama 36.2 33.711 29.663 10484.34
True 否 (False) 4 128 autogptq-cuda-old 36.2 46.44 21.53 10344.62

更全面的可重現基準測試可在此處獲得。

使用 **Optimum 庫**量化模型

為了將 AutoGPTQ 無縫整合到 Transformers 中,我們使用了 AutoGPTQ API 的一個極簡版本,該版本在 Hugging Face 的訓練和推理最佳化工具包 Optimum 中可用。透過這種方法,我們實現了與 Transformers 的輕鬆整合,同時允許人們在需要量化自己的模型時使用 Optimum API!如果您想量化自己的 LLM,請檢視 Optimum 文件

使用 GPTQ 方法量化 🤗 Transformers 模型只需幾行程式碼

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset = "c4", tokenizer=tokenizer)

model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=quantization_config)

量化模型可能需要很長時間。請注意,對於 175B 模型,如果使用大型資料集(例如 `"c4"`),則至少需要 4 GPU 小時。如上所述,許多 GPTQ 模型已在 Hugging Face Hub 上可用,這在大多數用例中繞過了自行量化模型的需要。儘管如此,您也可以使用適合您正在處理的特定領域的自己的資料集來量化模型。

透過 *__Text-Generation-Inference__* 執行 GPTQ 模型

與 GPTQ 在 Transformers 中的整合同步,Text-Generation-Inference 庫 (TGI) 也添加了對 GPTQ 的支援,旨在在生產環境中服務大型語言模型。GPTQ 現在可以與動態批處理、分頁注意力(paged attention)和 Flash 注意力等功能一起用於廣泛的架構

例如,這種整合使得在單個 A100-80GB GPU 上服務 70B 模型成為可能!使用 fp16 檢查點則無法實現,因為它超出了可用的 GPU 記憶體。

您可以在文件中找到更多關於 TGI 中 GPTQ 用法的資訊。

請注意,TGI 中整合的核心在較大批處理量下擴充套件性不佳。儘管這種方法節省了記憶體,但在較大批處理量下預計會出現效能下降。

使用 PEFT 微調量化模型

您不能使用常規方法進一步訓練量化模型。但是,透過利用 PEFT 庫,您可以在其上訓練介面卡!為此,我們凍結了量化模型的所有層並添加了可訓練介面卡。以下是使用 PEFT 和 GPTQ 模型的一些示例:colab notebook微調指令碼。

改進空間

我們的 AutoGPTQ 整合已經帶來了令人印象深刻的優勢,而預測質量的損失很小。在量化技術和核心實現方面仍有改進空間。

首先,雖然 AutoGPTQ (據我們所知)集成了來自 exllama 實現的最優 W4A16 核心(權重為 int4,啟用為 fp16),但該核心仍有很大的改進空間。Kim 等人還有其他有前景的實現,以及 MIT Han Lab 的實現,似乎也很有前景。此外,根據內部基準測試,似乎還沒有用 Triton 編寫的開源高效能 W4A16 核心,這可能是一個值得探索的方向。

在量化方面,我們再次強調此方法僅量化權重。對於 LLM 量化,還有其他一些方法,可以在預測質量略有損失的情況下同時量化權重和啟用,例如 LLM-QAT,其中可以使用混合 int4/int8 方案,以及鍵值快取的量化。這種技術的一個主要優點是能夠使用實際的整數算術進行計算,例如 Nvidia Tensor Cores 支援 int8 計算。然而,據我們所知,目前還沒有開源的 W4A8 量化核心可用,但這可能是一個值得探索的有趣方向

在核心方面,為更大批處理量設計高效能 W4A16 核心仍然是一個開放的挑戰。

支援的模型

在最初的實現中,僅支援具有解碼器或編碼器架構的大型語言模型。這聽起來可能有點限制,但它涵蓋了大多數最先進的 LLM,例如 Llama、OPT、GPT-Neo、GPT-NeoX。

目前不支援超大型視覺、音訊和多模態模型。

總結和結束語

在這篇博文中,我們介紹了 AutoGPTQ 庫在 Transformers 中的整合,這使得使用 GPTQ 方法量化 LLM 成為可能,從而使社群中的每個人都能更輕鬆地使用它們,並使他們能夠使用 LLM 構建令人興奮的工具和應用程式。

此整合同時支援 Nvidia GPU 和基於 RoCm 的 AMD GPU,這是向更廣泛 GPU 架構普及量化模型的巨大進步。

與 AutoGPTQ 團隊的合作非常富有成效,我們非常感謝他們對該庫的支援和工作。

我們希望這種整合能讓每個人都更容易在他們的應用程式中使用 LLM,我們期待看到您將用它構建什麼!

請不要錯過上面分享的有用資源,以便更好地理解整合以及如何快速開始 GPTQ 量化。

致謝

我們要感謝 William 對出色的 AutoGPTQ 庫的支援和工作,以及他在整合方面的幫助。我們還要感謝 TheBloke 使用 AutoGPTQ 量化了許多模型並將其共享到 Hub,以及他在整合方面的幫助。我們還要感謝 qwopqwop200 對 AutoGPTQ 庫的持續貢獻,以及他在擴充套件該庫以支援 CPU 方面的工作,該工作將在 AutoGPTQ 的後續版本中釋出。

最後,我們要感謝 Pedro Cuenca 幫助撰寫了這篇博文。

社群

註冊登入發表評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.