利用 LoRA 進行微調的 LLM 推理現已進入公開測試階段
今天,我們很高興地宣布,您現在可以在 Workers AI 上執行利用 LoRA 進行微調的推理。此功能處於公開測試階段,可透過預先訓練的 LoRA 轉接器與 Mistral、Gemma 或 Llama 2 一起使用,但有一些限制。請查看我們的產品公告部落格文章,深入瞭解我們的自備 (BYO) LoRA 功能。
在這篇文章中,我們將深入探討什麼是微調和 LoRA,向您展示如何在我們的 Workers AI 平台上使用它,然後深入研究我們在平台上實作該功能的技術細節。
微調是透過繼續使用額外資料進行訓練來修改 AI 模型的一般術語。微調的目標是提高產生內容與您的資料集相似的機率。考慮到訓練的成本和耗時,從頭開始訓練模型對於許多用例來說是不切實際的。透過微調現有的預先訓練模型,您可以從其功能中受益,同時完成您想要的工作。低秩適應 (LoRA) 是一種特定的微調方法,可以套用至各種模型架構,而不僅僅是 LLM。在傳統的微調方法中,通常直接修改預先訓練的模型權重或與額外的微調權重融合。與此不同的是,LoRA 允許微調權重和預先訓練模型保持分離,並且預先訓練模型保持不變。最終結果是,您可以訓練模型,使其在特定工作上更加準確,例如產生程式碼、具有特定的個性或產生特定樣式的影像。您甚至可以微調現有的 LLM,使其瞭解有關特定主題的更多資訊。
維護原始基礎模型權重的方法意味著您可以使用相對較少的運算來建立新的微調權重。您可以利用現有的基礎模型(例如 Llama、Mistral 和 Gemma),並根據您的需求進行調整。
為了更好地理解微調以及 LoRA 為何如此有效,我們必須退後一步,先瞭解 AI 模型的運作方式。AI 模型(如 LLM)是透過深度學習技術訓練的神經網路。在神經網路中,有一組參數充當模型領域知識的數學表示,由權重和偏差組成——簡單來說就是數字。這些參數通常表示為大的數字矩陣。模型的參數越多,模型就越大,比如對於模型 llama-2-7b,從「7b」可以得出該模型有 70 億個參數。
模型的參數定義其行為。當您從頭開始訓練模型時,這些參數通常從隨機數開始。當您使用資料集訓練模型時,這些參數會依位元調整,直到模型反映資料集並表現出正確的行為。有些參數比其他參數更重要,因此我們套用權重並以此來顯示重要程度。權重對於模型捕捉其訓練資料中的模式和關係的能力起著至關重要的作用。
傳統微調將使用一組新的權重來調整訓練模型中的_所有_參數。因此,微調模型要求我們提供與原始模型相同數量的參數,這意味著可能需要大量時間和運算來訓練和執行完全微調模型的推理。最重要的是,新的最先進模型或現有模型的版本會定期發布,這意味著完全微調模型的訓練、維護和儲存成本可能會很高。
用最簡單的話來說,LoRA 避免了調整預先訓練模型中的參數,而是讓我們可以套用少量的額外參數。這些額外參數暫時套用至基礎模型,以有效控制模型行為。相對於傳統的微調方法,訓練這些額外參數所需的時間和運算量要少得多,這些參數稱為 LoRA 配接器。訓練後,我們將 LoRA 配接器封裝為單獨的模型檔案,然後可以將其插入訓練它的基礎模型中。完全微調模型大小可能達到數十 GB,而這些配接器通常只有幾 MB。這可以簡化散佈過程,並且使用 LoRA 提供微調推理只會在總推理時間中增加毫秒層級的延遲。
如果您想瞭解 LoRA 為何如此有效,請做好準備——我們首先必須學習線性代數的簡短課程。如果您自從大學畢業後就再沒有想起過線性代數這個詞,請不要擔心,我們會引導您完成學習過程。
使用傳統微調,我們可以取得模型的權重 (W0) 並調整它們以輸出一組新的權重,因此原始模型權重和新權重之間的差異是 ΔW,代表權重的變化_。_因此,調整後的模型將具有一組新的權重,可以表示為原始模型權重加上權重的變化 W0 + ΔW。
請記住,所有這些模型權重實際上都表示為大型數字矩陣。在數學中,每個矩陣都有一個稱為秩 (r) 的屬性,它描述矩陣中線性獨立的欄或列的數量。當矩陣是低秩時,它們只有少數「重要」的欄或列,因此我們實際上可以將它們分解或拆分為兩個具有最重要參數的較小矩陣(將其視為代數中的因式分解)。這種技術稱為秩分解,它允許我們大幅減少和簡化矩陣,同時保留最重要的位元。在微調的背景下,秩決定了從原始模型中變更了多少參數——秩越高,微調越強,為輸出提供更多粒度。
根據最初的 LoRA 論文,研究人員發現,當模型為低秩時,代表權重變化的矩陣也是低秩的。因此,我們可以對表示權重變化 ΔW 的矩陣套用秩分解,以建立兩個較小的矩陣 A、B,其中 ΔW = BA。現在,模型的變化可以用兩個較小的低秩矩陣來表示_。_這就是為什麼這種微調方法被稱為低秩適應。
當我們執行推理時,我們只需要較小的矩陣 A、B 來改變模型的行為。A、B 中的模型權重構成了我們的 LoRA 配接器(以及設定檔)。在執行階段,我們結合原始模型 (W0) 和 LoRA 配接器(A、B),將模型權重加在一起。加法和減法是簡單的數學運算,這意味著我們可以透過在 W0. 中加減 A、B 來快速更換不同的 LoRA 配接器。透過暫時調整原始模型的權重,我們修改了模型的行為和輸出,結果是,我們以最小的延遲增加獲得微調的推理。
根據最初的 LoRA 論文,「LoRA 能夠將可訓練參數數量減少 10,000 倍,GPU 記憶體需求減少 3 倍」。因此,LoRA 是最受歡迎的微調方法之一,因為它的計算成本比完全微調模型要低得多,不會增加任何材料推理時間,而且更小、更便攜。
如何將 LoRA 與 Workers AI 結合使用?
由於我們執行無伺服器推理的方式,Workers AI 非常適合用於執行 LoRA。我們目錄中的模型始終預先載入到我們的 GPU 上,這表示我們會對其進行保溫,以便您的請求永遠不會遇到冷啟動。這意味著基礎模型始終可用,我們可以根據需要動態載入和更換 LoRA 配接器。實際上,我們可以將多個 LoRA 配接器插入一個基礎模型,這樣我們就可以同時滿足多個不同的微調推理請求。
當您使用 LoRA 進行微調時,您的輸出將是兩個檔案:您的自訂模型權重(safetensors 格式)和配接器設定檔(json 格式)。要自行建立這些權重,您可以結合使用 Hugging Face PEFT(參數高效微調)庫和 Hugging Face AutoTrain LLM 庫,利用自己的資料來訓練 LoRA。您也可以在 Auto Train 和 Google Colab 等服務上執行訓練工作。另外,現在 Hugging Face 上提供了許多開放原始碼 LoRA 配接器,涵蓋了各種使用案例。
最終,我們希望在我們的平台上支援 LoRA 訓練工作負載,但在目前,我們需要您將經過訓練的 LoRA 配接器帶到 Workers AI,這就是為什麼我們將此功能稱為「自備 (BYO) LoRA」。
在最初的公開測試版中,我們允許人們將 LoRA 與我們的 Mistral、Llama 和 Gemma 模型一起使用。我們已經預留了接受 LoRA 的模型版本,您可以透過在模型名稱末尾附加 `-lora
` 來存取它們。您的配接器必須是根據下面所列受支援基礎模型之一進行微調的:
@cf/meta-llama/llama-2-7b-chat-hf-lora
@cf/mistral/mistral-7b-instruct-v0.2-lora
@cf/google/gemma-2b-it-lora
@cf/google/gemma-7b-it-lora
隨著我們在公開測試版中推出此功能,有一些需要注意的限制:尚不支援量化 LoRA 模型;LoRA 配接器必須小於 100MB,且最大秩為 8;在我們最初的公開測試期間,每個帳戶最多可使用 30 個LoRA。若要開始在 Workers AI 上使用 LoRA,請閱讀開發人員文件。
一如既往,我們希望人們在使用 Workers AI 和新的 BYO LoRA 功能時牢記我們的服務條款,包括模型授權條款中包含的任何特定於模型的使用限制。
同時服務多個 LoRA 模型對 GPU 資源使用率提出了挑戰。雖然可以將推理請求批量發送到基礎模型,但由於服務獨特的 LoRA 配接器會增加複雜性,因此批量請求會更具挑戰性。為了解決這個問題,我們將 Punica CUDA 核心設計與全球快取最佳化相結合,以處理多租用戶 LoRA 服務的記憶體密集型工作負載,同時提供低推理延遲。
「Punica: Multi-Tenant LoRA Serving」(Punica:多租用戶 LoRA 服務)一文中介紹了 Punica CUDA 核心,它是一種為套用至同一基礎模型的多個顯著不同的 LoRA 模型提供服務的方法。與先前的推理技術相比,該方法顯著改進了輸送量和延遲。這種最佳化在一定程度上是透過啟用請求批次處理來實現的,甚至可以跨服務於不同 LoRA 配接器的請求進行批次處理。
Punica 核心系統的核心是一個名為分段聚集矩陣向量乘法 (SGMV) 的新 CUDA 核心。SGMV 允許 GPU 在服務不同的 LoRA 模型時僅儲存預先訓練模型的單一副本。Punica 核心設計系統整合了獨特 LoRA 模型的請求批次處理,透過平行處理批次中不同請求的特徵權重乘法來提高效能。然後將相同 LoRA 模型的請求進行分組,以增加操作強度。最初,GPU 載入基礎模型,同時為 KV 快取保留大部分 GPU 記憶體。然後,當傳入請求需要時,LoRA 元件(A 和 B 矩陣)將從遠端儲存(Cloudflare 的快取或 R2)按需載入。這種按需載入僅帶來幾毫秒的延遲,意味著可以無縫擷取和服務多個 LoRA 配接器,同時對推理效能的影響最小。可以快取經常要求的 LoRA 配接器,以實現最快的推理。
當請求的 LoRA 在本機快取後,其可用於推理的速度僅受 PCIe 頻寬的限制。無論如何,考慮到每個請求可能都需要自己的 LoRA,因此非同步執行 LoRA 下載和記憶體複製操作就變得至關重要。Punica 排程器解決了這一具體挑戰,僅對當前在 GPU 記憶體中具有所需 LoRA 權重的請求進行批次處理,並對不具有所需權重的請求進行排隊,直到所需權重可用並且請求可以有效地加入批次處理。
透過有效管理 KV 快取並對這些請求進行批次處理,可以處理大量的多租用戶 LoRA 服務工作負載。另一個重要的最佳化是使用連續批次處理。常見的批次處理方法要求對相同配接器的所有請求在釋放之前達到其停止條件。連續批次處理允許提前釋放批次中的請求,這樣就不需要等待執行時間最長的請求。
考慮到部署到 Cloudflare 網路的 LLM 在全球範圍內可用,LoRA 配接器模型也很重要。很快,我們將實作在 Cloudflare 邊緣快取的遠端模型檔案,以進一步減少推理延遲。
推出對 LoRA 轉接器的支援是我們平台上實現微調的重要一步。除了目前可用的 LLM 微調之外,我們還期待支援更多模型和各種工作類型,包括影像產生。
我們對 Workers AI 的願景是成為開發人員執行 AI 工作負載的最佳場所,這包括微調本身的過程。最終,我們希望能夠直接在 Workers AI 上執行微調訓練作業以及完全微調模型。這為 AI 解鎖了許多使用案例,賦予模型更多的粒度和細節來處理特定的工作,從而使 AI 在組織中更加有意義。
藉助 AI Gateway,我們將能夠幫助開發人員記錄他們的提示和回應,然後他們可以使用這些提示和回應來根據生產資料微調模型。我們的願景是提供一鍵微調服務,來自 AI Gateway 的記錄資料可用於重新訓練模型(在 Cloudflare 上),然後可以將微調後的模型重新部署到 Workers AI 上進行推理。這將允許開發人員個人化他們的 AI 模型以適應他們的應用程式,允許粒度低至每個使用者層級。經過微調的模型可以更小、更最佳化,幫助使用者節省 AI 推理的時間和金錢——神奇的是,所有這一切都可以在我們自己的開發人員平台內進行。
我們很期待您能夠嘗試 BYO LoRA 的公開測試版!請閱讀我們的開發人員文件以瞭解更多詳細資料,並在 Discord 告訴我們您的看法。