LoRA微調LLM推理功能開啟公測
我們隆重宣布:您現(xiàn)在可在Workers AI上使用LoRA運行微調推理。該功能現(xiàn)已開啟公測,針對預訓練的LoRA適配器,與Mistral、Gemma或Llama 2一起使用,但有一些限制。請瀏覽我們本周的首篇文章,了解BYO LoRA功能的概述。
本文將深入探討什么是微調和LoRA,并向您展示如何在我們的Workers AI平臺上使用它,以及我們如何在平臺上實施這一功能的技術細節(jié)。
什么是微調?
微調(fine-tuning)是一個通用術語,指通過使用更多數據繼續(xù)訓練來修改AI模型。微調的目的是提高生成的模型與數據集相似的概率。從頭開始訓練一個模型對于許多用例來說并不現(xiàn)實,因為訓練模型既昂貴又耗時。通過對現(xiàn)有的預訓練模型進行微調,您可以從其能力中獲益,同時還能完成您想要完成的任務。低秩適應(Low-Rank Adaptation,LoRA)是一種特定的微調方法,可應用于各種模型架構,而不僅僅是LLM。在傳統(tǒng)的微調方法中,通常會直接修改預訓練模型的權重或將其與額外的微調權重融合在一起。而LoRA允許微調權重和預訓練模型保持分離,預訓練模型保持不變。最終結果是,您可以訓練模型,使其在特定任務上更加準確,例如生成代碼、具有特定個性或生成特定風格的圖像。您甚至可以對現(xiàn)有的LLM進行微調,以了解有關特定主題的更多信息。
保持原始基礎模型權重的方法意味著你可以用相對較少的計算量創(chuàng)建新的微調權重。您可以利用現(xiàn)有的基礎模型(如Llama、Mistral和Gemma),并根據自己的需要對其進行調整。
微調如何運作?
為了更好地理解微調以及LoRA為何如此有效,我們必須退一步,了解AI模型的工作原理。AI模型(如LLM)是通過深度學習技術訓練出來的神經網絡。在神經網絡中,有一組參數作為模型領域知識的數學表示,由權重和偏差(簡單而言,就是數字)組成。這些參數通常用大型數字矩陣表示。模型的參數越多,模型就越大,所以當您看到llama-2-7b這樣的模型時,您可以讀出"7b",并知道該模型有70億個參數。
模型的參數決定了它的行為。當您從頭開始訓練一個模型時,這些參數通常一開始都是隨機數。在數據集上訓練模型時,這些參數會被一點一點地調整,直到模型反映出數據集并表現(xiàn)出正確的行為。有些參數會比其他參數更重要,因此我們會應用一個權重,用它來表示重要性的高低。權重對模型捕捉訓練數據中的模式和關系的能力起著至關重要的作用。
傳統(tǒng)的微調會用一組新的權重來調整訓練模型中的所有參數。因此,微調模型需要我們提供與原始模型相同數量的參數,這意味著訓練和運行一個完全微調模型的推理需要大量時間和計算。此外,新的先進模型或現(xiàn)有模型的版本會定期做發(fā)布,這意味著完全微調模型的訓練、維護和存儲成本會變得很高。
LoRA是一種有效的微調方法
最簡單地來說,LoRA避免了調整預訓練模型中的參數,從而允許我們應用少量附加參數。這些附加參數臨時應用于基礎模型,以有效控制模型行為。與傳統(tǒng)的微調方法相比,訓練這些附加參數(稱為LoRA適配器)所需的時間和計算量要少得多。訓練完成后,我們會將LoRA適配器打包成一個單獨的模型文件,然后將其插入基礎模型中進行訓練。一個完全微調的模型可能有幾十個千兆字節(jié)大小,而這些適配器通常只有幾兆字節(jié)。這使其更易于分發(fā),使用LoRA提供微調推理只需在總推理時間上增加毫秒程度的延遲。
如果您想了解LoRA為何如此有效,那么請準備好——我們首先得簡單學習一下線性代數。如果您從大學開始就沒有接觸過這個術語,別擔心,我們會詳細解釋。
數學原理
在傳統(tǒng)微調方法中,我們可以對模型的權重(W0)進行調整,輸出一組新的權重——因此,原始模型權重與新權重之間的差異為ΔW,代表權重的變化。因此,經過微調的模型將具有一組新的權重,可以表示為原始模型權重加上權重變化,即W0+ΔW。
請記住,所有這些模型權重實際都是表示為大型數字矩陣。在數學中,每個矩陣都有一個稱為秩(r)的屬性,描述矩陣中線性獨立的列或行的數量。當矩陣為低秩時,它們只有幾列或幾行是“重要”的,因此我們實際上可以將它們分解或拆分成兩個帶有最重要參數的較小矩陣(就像代數中的因式分解)。這種技術被稱為秩分解,它允許我們在保留最重要內容的同時,大大減少和簡化矩陣。在微調的背景下,秩決定了原始模型中有多少多少參數被改變——秩越高,微調越強,對輸出具備更精細的控制。
根據最初的LoRA論文,研究人員發(fā)現(xiàn),當一個模型是低秩時,代表權重變化的矩陣也是低秩的。因此,我們可以對代表權重變化的矩陣ΔW進行秩分解,創(chuàng)建兩個較小的矩陣A、B,其中ΔW=BA?,F(xiàn)在,模型的變化可以用兩個更小的低秩矩陣來表示。因此,這種微調方法被稱為低階適應。
當我們運行推理時,我們只需要較小的矩陣A、B來改變模型的行為。A和B中的模型權重構成了我們的LoRA適配器(以及配置文件)。運行時,我們將模型權重加在一起,將原始模型(W0)和LoRA適配器(A、B)合并起來。加法和減法都是簡單的數學運算,這意味著我們可以通過從W0中加減A、B來快速更換不同的LoRA適配器。通過臨時調整原始模型的權重,我們可以修改模型的行為和輸出,從而以最小的延遲增加獲得微調推理。
根據最初的LoRA論文,“LoRA可以將可訓練參數的數量減少10000倍,GPU內存需求減少3倍”。正因為如此,LoRA是最流行的微調方法之一,原因是它的計算成本遠低于完全微調模型,不會大幅增加推理時間,而且體積小得多,便于攜帶。
如何通過Workers AI使用LoRA?
因為我們運行無服務器推理的方式,Workers AI非常適合運行LoRA。我們目錄中的模型總是預先加載在我們的GPU上,這意味著它們保持隨時可用狀態(tài),讓您的請求不會遇到冷啟動延遲。這意味著基礎模型始終可用,我們可以根據需要動態(tài)加載和切換LoRA適配器。我們實際上可以在一個基礎模型中插入多個LoRA適配器,以便同時服務多個不同的微調推理請求。
使用LoRA進行微調時,輸出將是兩個文件:自定義模型權重(safetensors格式)和適配器配置文件(json格式)。如果要自己創(chuàng)建這些權重,可以使用Hugging Face PEFT(參數高效微調)庫結合Hugging Face AutoTrain LLM庫在自己的數據上訓練LoRA。您還可以在Auto Train和Google Colab等服務上運行訓練任務。此外,Hugging Face上還有許多開源LoRA適配器,可滿足各種用例。
最終,我們希望在我們的平臺上支持LoRA訓練工作負載,但目前我們需要您就將訓練好的LoRA適配器帶到Workers AI,這就是我們將此功能稱為BYO(自帶)LoRA的原因。
在最初的公開測試版本中,我們允許人們在Mistral、Llama和Gemma使用LoRA。我們?yōu)檫@些模型預留了可接受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適配器必須小于100 MB,最大秩為8,初始公測中每個賬戶可試用最多30個LoRA。要開始在Workers AI上使用LoRA,請閱讀開發(fā)人員文檔。
一如既往,我們希望用戶在使用Workers AI和我們全新推出的BYO LoRA功能時,能牢記我們的服務條款,包括模型許可條款中包含的任何模型特定限制。
我們是如何構建多租戶LoRA服務的?
同時為多個LoRA模型提供服務對GPU資源利用率提出了挑戰(zhàn)。雖然有可能將推理請求批量發(fā)送到一個基礎模型,但服務獨特的LoRA適配器帶來的額外復雜性導致批量處理請求要困難得多。為解決這一問題,我們利用Punica CUDA內核設計與全局緩存優(yōu)化相結合,以處理多租戶LoRA服務的內存密集型工作負載,同時提供較低的推理延遲。
論文《Punica:多租戶LoRA服務》一文中介紹了Punica CUDA內核,作為在同一個基礎模型上服務多個、明顯不同的LoRA模型的方法。與以前的推理技術相比,這種方法大幅優(yōu)化了吞吐量和延遲。這種優(yōu)化部分是通過啟用請求批處理來實現(xiàn)的,即使在服務不同LoRA適配器時。
Punica內核系統(tǒng)的核心是一個新的CUDA內核,名為“分段收集矩陣-矢量乘法(SGMV)”。SGMV允許GPU在服務不同LoRA模型時,只存儲預訓練模型的一個副本。Punica內核設計系統(tǒng)整合了獨特LoRA模型的批處理請求,通過并行處理一批中不同請求的特征-權重乘法來提高性能。然后對同一LoRA模型的請求進行分組,以提高操作強度。最初,GPU會加載基本模型,同時為KV緩存保留大部分GPU內存。當收到請求時,LoRA組件(A和B矩陣)會按需從遠程存儲(Cloudflare緩存或R2)加載。這種按需加載只帶來幾毫秒的延遲,這意味著多個LoRA適配器可以無縫獲取和提供服務,對推理性能的影響微乎其微。頻繁請求的LoRA適配器會被緩存,以實現(xiàn)最快的推理速度。
一旦請求的LoRA被緩存在本地,它可用于推理的速度僅受PCIe帶寬的限制。無論如何,鑒于每個請求都可能需要自己的LoRA,因此異步執(zhí)行LoRA下載和內存復制操作變得至關重要。Punica調度器正是解決這一挑戰(zhàn),只對當前在GPU內存中有所需LoRA權重的請求進行批處理,并將沒有所需權重的請求排隊,直到所需權重可用且請求可以有效地加入批處理。
通過有效管理KV緩存和批處理這些請求,可以處理大量多租戶LoRA服務工作負載。另一項重要的優(yōu)化措施是使用連續(xù)批處理。常見的批處理方法要求對同一適配器的所有請求在達到停止條件后才能釋放。連續(xù)批處理允許提前釋放批處理中的一個請求,以便不必等待運行時間最長的請求。
鑒于部署到Cloudflare網絡的LLM在全球范圍內可用,因此LoRA適配器模型也必須在全球范圍內可用。很快,我們將在Cloudflare邊緣緩存遠程模型文件,以進一步減少推理延遲。
在Workers AI上運行微調的路線圖
推出對LoRA適配器的支持是在我們的平臺上實現(xiàn)微調的重要一步。除了目前可用的LLM微調功能外,我們還期待支持更多模型和各種任務類型,包括圖像生成。
我們對Workers AI的愿景是成為開發(fā)人員運行AI工作負載的最佳場所,這包括對其本身進行微調的過程。最終,我們希望能夠直接在Workers AI上運行微調訓練任務以及完全微調模型。這為AI解鎖了許多用例,通過賦予模型更多的顆粒度和細節(jié)以處理特定的任務,從而使AI在企業(yè)及組織中發(fā)揮更大的作用。
通過AI Gateway,我們就可以幫助開發(fā)人員記錄他們的提示詞和響應,然后他們就可以利用這些提示詞和響應來使用生產數據對模型進行微調。我們的愿景是提供一鍵式微調服務,AI Gateway上的日志數據可用于重新訓練模型(在Cloudflare上),經過微調的模型可重新部署到Workers AI上進行推理。這將使開發(fā)人員能夠個性化他們的AI模型,以適應他們的應用,允許低至每個用戶級別的粒度。經過微調的模型可體量更小、性能更為優(yōu)化,幫助用戶節(jié)省AI推理的時間和投入成本,而且神奇之處在于,所有這一切都可以在Cloudflare的開發(fā)人員平臺上實現(xiàn)。