利用多 Lora 節省大模型部署成本
如何把多個大模型合併部署以節省成本呢?本文將深入探討這一技術與應用場景,利用多 Lora 合併部署大模型。
背景
近期,我們在大模型集羣的部署過程中遇到了一些挑戰。公司有多個業務場景,每個場景都基於自身的數據進行微調,訓練出相應的大模型並上線。然而,這些場景的調用量並不高,同時大模型的部署成本較爲昂貴,這造成了資源的浪費。
本文將介紹我們如何利用多 Lora 技術,將多個場景合併部署,從而有效解決這一問題。同時,我們也將探討大模型訓練與推理過程中 Lora 技術的應用。
Lora 是什麼
Lora 的概念
如果你去網上搜索 "Lora" 這個關鍵字,你一定會搜到下面這篇論文。
這就是 Lora 這個詞出處。這一概念是由著名人工智能研究員 Edward J. Hu 於 2021 年提出的。Lora 完整名稱是低秩自適應(Low-Rank Adaptation)。雖然這個名稱比較複雜,但其核心概念卻相對容易理解。
以 GPT3 爲例,該模型擁有 1750 億個參數。爲了使大模型適應特定的業務場景,我們通常需要對其進行微調。如果對大模型進行全參數微調,因其參數數量龐大,成本將非常高。Lora 技術的解決方案是,僅對不到 2% 的參數進行微調,其他參數則保持不變。相較於全參微調 GPT-3(175B),Lora 最多能夠將訓練參數的數量減少約 10,000 倍,GPU 內存需求也減少三倍。
那麼,Lora 是如何凍結參數的呢?接下來,我們將展示 Lora 的經典原理圖。
上圖中,W 表示大模型的一個原始參數矩陣。Lora 的思路是將矩陣 W 拆分爲兩個低秩矩陣 A 和 B。在訓練過程中,僅對 A 和 B 的參數進行訓練,這與訓練整個 W 的參數相比,能顯著減少所需的訓練參數數量,從而降低訓練成本。
如何開啓大模型的 Lora 微調
雖然論文中 Lora 的原理較爲複雜,但實際上開啓大模型的 Lora 微調過程相對簡單。許多算法框架都支持快速上手微調。以 LLaMA-Factory 這個微調大模型的框架爲例,啓用 Lora 微調只需配置以下參數:
接下來,執行訓練命令即可啓動 Lora 微調:
llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml
通過這個命令,LLaMA-Factory 框架將讀取配置文件,並開始進行 Lora 微調。整個過程相對簡便,使得用戶能夠快速適應並利用 Lora 技術進行大模型微調。
Lora 微調完成後,將生成一個只包含部分參數(即 Lora 參數)的文件,稱爲 Lora Adapter。與整個大模型的所有參數相比,這個參數文件非常小。
如何基於 Lora 部署大模型
Lora 參數合併
經過微調後,會生成一個 Lora 文件,裏面僅包含部分參數。如何利用這個 Lora 文件來部署大模型呢?
我們之前提到,Lora 參數實際上是將大模型的其餘參數凍結後剩下的部分。Lora 參數本身也是大模型參數的一部分,通常佔比小於整體的 2%。將微調後的 Lora 參數與大模型的原始參數合併後,就可以生成一個新的微調大模型,之後只需直接部署這個新模型即可。
合併的操作步驟也比較簡單,以 LLaMA-Factory 這個大模型微調訓練框架爲例。
首先,完成如下配置:
接下來,執行命令
llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml
即可將參數合併成一個新的大模型。
如何部署合併後的大模型
合併後的大模型只有一些參數文件,若要進行部署,還需選擇合適的推理引擎。目前推薦使用 VLLM 這個開源推理引擎,它得到了衆多大廠模型的廣泛支持。無論從性能還是易用性來看,VLLM 都非常出色。
VLLM 最初由加州大學伯克利分校的一支三人博士團隊發起,創始人開創性地提出了 PageAttention 這一概念。這一創新顯著提高了大模型的吞吐量,提升幅度達到幾十倍。PageAttention 目前已成爲各大推理引擎的必備技能。
如果想用 VLLM 來部署一個大模型,其步驟非常簡單。首先,執行下面的命令安裝 VLLM:
pip install vllm
然後執行下面命令,即可啓動服務。
vllm serve {模型文件地址}
這樣的部署流程有什麼問題?
首先,讓我們回顧一下之前的訓練和部署流程。
對於每個業務場景,我們首先通過微調訓練生成一個 Lora 參數文件,然後將 Lora 參數文件與基礎大模型合併,最後進行大模型的部署。這是一個經典的流程。
然而,如果業務場景衆多且每個場景的流量較小,就需要部署多套大模型。以常見的 7B 大模型爲例,至少需要一塊 22G 顯存的顯卡才能運行,而 14B 模型需要兩塊 22G 顯存的顯卡,70B 的大模型則需要更高的成本。這種情況可能導致 GPU 資源的浪費。
多 Lora 部署大模型又是什麼
多 Lora 的技術原理是什麼
在上述部署流程中,微調大模型後會生成一個 Lora 文件,該文件需要與基礎大模型合併成一個新的大模型。然而,實際上,我們可以選擇不合並 Lora 文件,而是直接在顯存中加載原有的大模型參數和 Lora 參數,然後進行推理。這種方法同樣是可行的。
參考上面的 Lora 原理圖,W 表示大模型的一個原始參數矩陣。Lora 的思路是將矩陣 W 拆分爲兩個低秩矩陣 A 和 B,並對這兩個矩陣進行訓練。訓練結束後,我們可以選擇將 A 和 B 矩陣與 W 矩陣合併,也可以不合並,而是分別使用 W 和 A/B 進行計算,然後再將計算結果進行合併,最終效果是一樣的。
因此,我們的部署流程可以進行如下調整:業務方在進行 Lora 微調後生成一個 Lora 文件。接下來,我們在顯存中加載基礎大模型,同時也加載業務方的 Lora 文件,直接進行推理。如果有多個業務方參與,每個業務方都會產生一個 Lora 文件,於是這一部署流程可以推廣至如下圖所示。
每個業務場景都基於自己的業務數據訓練一個 Lora 文件。在部署時,我們只需選擇一個基礎大模型,並在顯存中同時加載多個 Lora 文件。這樣,便可以使用一塊顯卡同時滿足多個業務場景的需求。當用戶發出請求時,要在請求中指定需要調用的 Lora 模型是哪個。
多 Lora 適應於什麼場景
多 Lora 適用於以下場景:
-
業務場景多樣化:當你的業務場景較多,並且每個場景都需要根據其特定數據進行微調生成一份自己的大模型。
-
調用量較小:如果每個業務場景的調用量相對較少,那麼單獨爲每個場景部署一份大模型的成本將顯得很高。
採用多 Lora 的方式來部署大模型可以有效解決這些問題。通過只加載一份基礎大模型,同時在顯存中加載多個較小的 Lora 文件,我們能夠顯著減少因重複部署帶來的成本。這樣,便可以爲多個業務場景提供支持,同時保持資源的高效利用。
哪些推理框架支持多 Lora
目前,支持多 Lora 的推理框架中,VLLM 是一個推薦的選擇。我們對 VLLM 的多 Lora 性能進行了壓測,結果顯示它在性能和易用性方面表現都非常不錯。
如果你想使用 VLLM 來部署多 Lora,只需執行以下命令即可:
vllm serve {你的模型地址} --enable-lora --lora-modules {lora1 的地址} {lora2 的地址}
這樣,你就可以輕鬆地在 VLLM 中啓用多 Lora 的功能。
多 Lora 的性能怎麼樣,有哪些限制
爲了驗證多 Lora 的性能,我們特意用 Llama3-8b 模型,L20GPU 顯卡進行了壓測對比,數據如下:
可見,多 Lora 對推理的吞吐與速度的影響幾乎可以忽略。
那麼,多 Lora 在使用時有哪些限制呢?
-
共享基礎大模型:所有希望一起部署的多個業務場景必須使用相同的基礎大模型。這是因爲在多 Lora 部署時,基礎大模型只需加載一份,以支持多個 Lora 的推理。
-
Lora 秩的限制:如果使用 VLLM 進行多 Lora 部署,微調訓練時,Lora 的秩 R 的值不要超過 64。大多數情況下,這個條件都是可以滿足的,但在特定場景中需要注意這一點。
因此,在進行多 Lora 部署之前,需確保滿足上述要求,以保證系統的正常運行。
總結
本文從如何節省多業務場景部署大模型的成本入手,逐步介紹了 Lora 的概念、如何對大模型進行 Lora 微調,以及微調後如何合併 Lora 參數以部署大模型。接着,我們提出了一個問題:在多個業務場景的部署中,如何降低大模型的部署成本。爲此,我們介紹了利用多 Lora 的方式,以合併多個業務場景的部署。
文章最後,我們分享了對多 Lora 部署模式的壓測效果,結果顯示,多 Lora 與合併後部署的方式相比,性能幾乎可以忽略不計。我們還推薦了支持多 Lora 的推理引擎,幫助讀者更好地應用這一技術。
當然,在使用多 Lora 時也需注意一些限制條件,比如多個場景必須使用相同的基礎大模型。如果你有類似的場景或對大模型技術感興趣,歡迎與我們交流學習,共同進步。
文 / linggong
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/3qnyRTqH-Td8PdXTd71EzQ