天天看點

從 0 到 1!得物如何打造通用大模型訓練和推理平台

作者:得物技術

1.背景

近期,GPT 大模型的釋出給自然語言處理(NLP)領域帶來了令人震撼的體驗。随着這一事件的發生,一系列開源大模型也迅速崛起。依據一些評估機構的評估,這些開源模型大模型的表現也相當不錯。一些大模型的評測情況可以去這裡查詢:Huggingface 的 Open LLM 排行榜,UC 伯克利釋出大語言模型排行榜等。

随着大模型的發展,大模型的訓練與部署技術變的非常重要了。我們調研了 LORA 與 QLORA 等微調訓練技術,以及 GPTQ 量化部署技術。在跑通最小 Demo 并驗證效果後,把這些技術內建到 KubeAI 平台(得物 AI 平台),提供給大家去快速上手。

本篇主要分為技術理論與技術實戰兩個部分去講解。

技術理論主要講解微調訓練與量化推理的理論部分,微調訓練包括 LoRA,QLoRA, 部署包括 GPTQ 量化推理等,并針對關鍵代碼進行走讀,針對部署進行性能測試。

技術實戰部分我們把這些技術內建到 KubeAI 平台上,供大家可以快速上手實戰。依據前面同學的回報情況,大約一天内可以完成大模型訓練并部署推理上線。

2.LoRA 與 QLoRA 訓練技術

2.1 LoRA 技術介紹

LoRA,英文全稱 Low-Rank Adaptation of Large Language Models(中文為大語言模型的低階适應)。

這是微軟的研究人員為了解決大語言模型微調而開發的一項技術,

其 github 位址為 https://github.com/microsoft/LoRA ,

目前已經得到 HuggingFace 的 PEFT 庫 https://github.com/huggingface/peft 的支援。

對于大語音模型來說,其參數量非常多。GPT3 有 1750 億參數,而且 LLAMA 系列模型包括 7B,13B,33B,65B,而其中最小的 7B 都有 70 億參數。要讓這些模型去适應特定的業務場景,需要對他們進行微調。如果直接對這些模型進行微調,由于參數量巨大,需要的 GPU 成本就會非常高。LoRA 就是用來解決對這些大語言模型進行低成本微調的技術。

LoRA 的做法是對這些預訓練好的大模型參數進行當機,也就是在微調訓練的時候,這些模型的參數設定為不可訓練。然後往模型中加入額外的網絡層,并隻訓練這些新增的網絡層參數。這樣可訓練的參數就會變的非常少,可以以低成本的 GPU 微調大語言模型。

參照 https://arxiv.org/abs/2106.09685

LoRA 在 Transformer 架構的每一層注入可訓練的秩分解矩陣,與使用 Adam 微調的 GPT-3 175B 相比,LoRA 可以将可訓練參數數量減少 10000 倍,GPU 記憶體需求減少 3 倍,并且在效果上相比于傳統微調技術表現的相當或更好。

下面以 Transformer 的線性層為例,講解下 LoRA 具體是如何操作的。

從 0 到 1!得物如何打造通用大模型訓練和推理平台

在 Transformer 模型中的線性層,通常進行矩陣乘法操作,如 Y = XW,其中 X 是輸入矩陣,W 是權重矩陣,也是模型訓練求解的參數。

對于 LoRA 方法在 Transformer 的線性層中的操作步驟:

  • 在每個線性層旁邊增加一個"旁路",由降維矩陣 A 和升維矩陣 B 構成。低秩分解在這裡發揮作用,例如我們有一個 100x100 的矩陣 C,我們可以通過低秩分解将其分解為 A 和 B(假設秩設定為 1),其中 A 是 100x1 的矩陣,B 是 1x100 的矩陣。這樣,原本 10000 個參數的矩陣 C 被分解為總共 200 個參數的矩陣 A 和 B。
  • 訓練過程中,原線性層的權重矩陣 W 保持不變,隻訓練降維矩陣 A 和升維矩陣 B。
  • 在推理時,将矩陣 B 和 A 的乘積加到原始線性層的權重矩陣 W 上。因為 A 和 B 的秩較低,這個操作不會增加額外的推理延遲。
  • 對于一般的任務,秩選取 1,2,4,8,16 足矣。

2.2 LoRA 關鍵代碼走讀

上面講解了 LoRA 的關鍵,接下來我們針對最新的版本 PEFT 中的 LoRA 實作,進行關鍵代碼走讀。LoRA 的核心代碼邏輯在:https://github.com/huggingface/peft/blob/main/src/peft/tuners/lora.py

其中有兩個核心的類,一個是 LoraConfig,另一個是 LoraModel。

從 0 到 1!得物如何打造通用大模型訓練和推理平台

LoraConfig 是 LoRA 的核心配置類,它是用于配置 LoRAModel 的類,其中包含了一些用于控制模型行為的參數。

這個類的主要參數有:

  • r:LoRa(低秩逼近)注意力次元,就是前面所說的秩。預設值是 8。
  • target_modules:要應用 LoRa 的子產品名清單。
  • lora_alpha:LoRa 的 alpha 參數。預設值是 8。
  • lora_dropout:LoRa 層的 dropout 機率。預設值是 0.0。
  • bias:LoRa 的偏置類型。可以是'none'、'all'或'lora_only'。

LoraModel 是 LoRA 子產品的核心類,當機 base model 的參數,旁路低秩矩陣的建立,替換,合并等邏輯都在這個類中。下面我們把他的關鍵邏輯結合上面的介紹走讀一下。

2.2.1 初始化函數

從 0 到 1!得物如何打造通用大模型訓練和推理平台

從初始化函數中我們看到 LoraModel 也是繼承 torch.nn.Module,相當于 pytorch 的一個網絡子產品。傳入參數中 base_model 相當于被用來微調的基礎大模型,config 包含 LoraConfig。在初始化中 LoraModel 把自己的前向傳播函數 forword 設定為大模型的 forward 方法。

2.2.2 初始化:使用新的 LoraLayer 替換 target_modules 中配置的 Layer,實作上面所說的添加旁路低秩矩陣的功能。

從 0 到 1!得物如何打造通用大模型訓練和推理平台

上述代碼的主要功能:

  • 依據 LoraConfig 中配置的 tagetModules,在 base_model(大模型)中找到這些 Module
  • 建立新的 LoraLayer,新的 LorayLayer 中會包含原來 target_module 的 layer,并在其旁邊并行旁路,旁路主要是低秩矩陣 Lora_A 與 Lora_B 組成的低秩兩個低秩矩陣的加法
  • 使用新建立的 LoraLayer 替換原來的 target_module 的 layer。

通過這一步實作了在大模型的 target_modules 的 layer 中增加旁路低秩矩陣。

2.2.3 初始化:當機大模型的參數

從 0 到 1!得物如何打造通用大模型訓練和推理平台

可見除了新增的 LoraLayer 的子產品外,其他所有參數都被當機。

2.2.4 前向傳播:添加了旁路低秩矩陣後的運算邏輯(以 LineLayer 為例)

從 0 到 1!得物如何打造通用大模型訓練和推理平台

在上述代碼中:

  • 使用大模型 target_module 中線性層進行計算,得出結果 result。
  • 使用 lora_A 與 lora_B 的低秩矩陣進行計算 并把計算結果加到 result 上。

以上是主要邏輯,其他邏輯可以深入代碼去了解。PEFT 庫中 Lora 的實作與論文中所述一緻。

2.3 QLORA 技術介紹

LoRA 技術雖然可以在一定程度上節省顯存,提升訓練速度,但是把大模型以 float16 的方式運作,還是會占用很多顯存。比如:在 batch size 開到極小的情況下,單卡 A100(80G 顯存)隻能微調 7B 系列的模型,13B 模型在正常情況下需要 120G 顯存,微調 65B 模型需要超過 780G 的顯存。

為此華盛頓大學的研究者提出了 QLoRA 技術,極端情況下單個 24GB GPU 上實作 33B 的微調,可以在單個 48Gi 顯存微調 65B 模型。當然這種情況下微調會變得比較慢。

論文參考 https://arxiv.org/abs/2305.14314。

從 0 到 1!得物如何打造通用大模型訓練和推理平台

上圖中描述了 LoRA 與 QLoRA 在微調訓練的時候的差別,從 QLoRA 的名字可以看出,QLoRA 實際上是 Quantize+LoRA 技術,簡單的說就是把大模型(Base Model)在訓練的時候從 16bit 壓縮到 4bit。進而降低訓練的顯存。

  • 4 位 NormalFloat,QLoRA 使用 NF4(Normal Float 4)bit 來量化壓縮預訓練模型。這是一種優化的 4 位量化方法,它針對神經網絡權重通常遵循零中心正态分布的特性進行優化。使用标準正态分布函數将權重縮放到[-1, 1]的範圍内。相比傳統的 4 位量化,它的權重資訊損失少,進而提高了模型量化的整體精度。
  • 雙重量化,雙重量化是一種記憶體優化政策,它對量化所使用的常數進行二次量化,進一步減小記憶體占用。這意味着我們可以在保持精度的同時,降低了記憶體需求。
  • Page Optimizer,這是一種記憶體管理技術,利用了 NVIDIA 的統一記憶體特性,在 CPU 和 GPU 之間進行自動 page 對 page 傳輸,它在 GPU 記憶體不足時,可以将一部分資料暫時移到 CPU 記憶體,需要時再移回。這降低了在大型模型訓練時由于記憶體不足而造成的問題。

在我們的平台經過實測,訓練 33B 的模型最低需要 26G 顯存。但是需要把 batch-szie 設定為 1,這樣訓練速度會比較慢。在實際操作中可以再适當加大 batch size 的值,配合 4bit 量化,就可以在少量 GPU 資源情況下訓練 33B 大模型了,當然 13B 的大模型使用 QLORA 同樣效果不錯。

目前最新版本的 PEFT 庫也添加了對 QLoRA 的支援,喜歡代碼的同學可以去深入了解下。

3.量化推理介紹

3.1 GPTQ 量化介紹

GPTQ(Generative Pretrained Transformer Quantization)是一種新的後訓練量化方法,可以有效地執行對有數百億參數的模型的量化,并且能夠将這些模型壓縮到每個參數 3 或 4 位,而不會有顯著的精度損失,論文參考https://arxiv.org/abs/2210.17323。

所謂後訓練量化是指在模型訓練完成之後進行量化,模型的權重會從 32 位浮點數(或其他較高精度格式)轉換為較低精度格式,例如 4 位整數。這種轉換大大減小了模型的大小,并減少了運作模型所需的計算量。但是,這也可能會導緻一定程度的精度損失。

3.2 GPTQ 量化資料對比

目前業界有幾種量化方法,包括 GGML,GPTQ 等,經過實測,我們發現 GPTQ 量化部署精度損失少,性能也不錯。

我們通過對 13B 的模型進行 4bit 量化測試,發現經過 GPTQ 量化後的對比如下:

從 0 到 1!得物如何打造通用大模型訓練和推理平台

4.實戰:kubeai 平台大模型訓練與推理

前面我們介紹了大模型的訓練技術:LoRA 與 QLoRA 的工作原理,介紹了通過 GPTQ 量化部署的步驟。我們把這些步驟內建在 KubeAI 的訓練推理平台中,供大家研究,并同時提供 7B,13B,33B 大模型備選。KubeAI 中選擇 GPT 服務/定制版(Finetune)即可體驗。

4.1 kubeAI 平台的訓練與推理工作流程

從 0 到 1!得物如何打造通用大模型訓練和推理平台
  • 大模型選型支援,kubeAI 平台提供(7B,13B,33B)三種類型,後續逐漸增加更多支援。
  • 大模型微調訓練,現在支援 LoRA,QLoRA 兩種方式,後續會增加其他方式。
  • 訓練後,會産生兩個大模型,一個是 16Bit 的原始模型,一個是 GPTQ4bit 量化後的模型(配合 QLoRA)。
  • 我們提供一鍵部署的功能,使用者選擇對應的模型後,可以一鍵部署成服務,并提供頁面與 API 接口供使用者體驗效果。

4.2 使用者在 kubeAI 進行訓練與推理部署大模型的步驟

從 0 到 1!得物如何打造通用大模型訓練和推理平台
  • 選擇大模型,目前提供(7B,13B,33B)三個版本。
  • 上傳訓練資料,目前支援 alpaca 資料格式。
  • 配置訓練參數,隻需要依據 GPU 情況配置 batch size 與訓練步驟,大部分使用預設參數即可。
  • 點選開始訓練。
  • 訓練結束後選擇模型,點選部署,即可一鍵部署成服務。
  • 部署服務後,點選通路連結,會有一個通路頁面,頁面上會提供相應的 API 調用接口。

4.3 kubeAI 平台基于知識庫的推理功能

從 0 到 1!得物如何打造通用大模型訓練和推理平台
  • 推理大模型實作,可離線部署,可以針對專業場景做訓練優化。
  • 文本向量模型,可離線部署,還可以針對局部場景做訓練優化。
  • 可快速實作接入多種資料源,支援 pdf、txt、md、docx、csv 等檔案類型接入。
  • 在分句、文檔讀取等方面,針對中文使用場景優化。

5.總結

我們調研了大模型的微調訓練方法 LoRA 與 QLoRA,以及大模型的推理部署 GPTQ 量化部署。把上面的微調訓練到推理部署的整個鍊路內建到 kubeAI 平台上,提供給大家快速實驗。此外還內建了以文檔形式上傳到知識庫,配合知識庫進行推理的場景。

大模型的訓練與推理方法除了以上所提 LORA、QLORA、GPTQ 外,還有其他技術。因為大模型社群比較火爆,後面肯定會有更優的微調訓練與量化部署技術。後續我們會持續跟蹤,如果在效果與性能上優于目前支援的方法,平台也将及時基于目前的架構繼續內建這些新的方法。

*文/linggong

本文屬得物技術原創,更多精彩文章請看:得物技術官網

未經得物技術許可嚴禁轉載,否則依法追究法律責任!