摘要:本文介紹大模型低參微調套件——MindSpore PET。
本文分享自華為雲社群《大模型高效開發的秘密武器——大模型低參微調套件MindSpore PET篇》,作者:yd_280874276 。
人工智慧進入“大模型時代”。大模型具備更強泛化能力,在各垂直領域落地時,只需要進行引數微調,就可以適配多個場景。因此,發展大模型已成為產學研各界共識。
在大模型開發方面,昇騰推出了大模型開發使能平臺,基於昇思MindSpore構建了支撐大模型開發的全流程大模型使能套件,包括TransFormers大模型套件MindSpore TransFormers、以文生圖大模型套件MindSpore Diffusion、人類反饋強化學習套件MindSpore RLHF、大模型低參微調套件MindSpore PET,支撐大模型從預訓練、微調、壓縮、推理及服務化部署。
本期,我們將開啟“大模型高效開發的秘密武器”系列之首篇,為大家介紹大模型低參微調套件——MindSpore PET。
一、MindSpore PET介紹
MindSpore PET(MindSpore Parameter-Efficient Tuning)是基於昇思MindSpore AI融合框架開發的大模型低參微調套件。當前該套件提供6種演算法,包含5種經典的低參微調演算法LoRA、Prefix-Tuning、Adapter、LowRankAdapter、BitFit,以及1種用於下游任務精度提升的微調演算法R_Drop。低參微調演算法只需微調極少量的引數,即可在保持全參微調精度的情況下,大大節約計算和儲存記憶體,減少微調訓練的時間;精度提升的微調演算法在幾乎不增加計算記憶體及時間情況下,增加模型隨機性,防止模型過擬合從而提高模型的正確率。
套件為所有演算法提供了API呼叫介面及使用案例,實現開箱即用,併為低參微調演算法提供了只儲存極少的可學習引數的介面,使得生成的ckpt檔案非常小。
開源倉地址:https://github.com/mindspore-lab/MindPet
二、MindSpore PET - LoRA
2.1 演算法原理
LoRA: Low-Rank Adaptation of Large Language Models,是微軟提出的一種針對大語言模型的低參微調演算法。LoRA假設在適配下游任務時,大模型的全連線層存在一個低內在秩(low intrinsic rank),即包含大量冗餘資訊。因此提出將可訓練的秩分解矩陣注入Transformer架構的全連線層,並凍結原始預訓練模型的權重,從而可大大減少參與訓練的引數量。
2.2 應用效果——以悟空畫畫為例
悟空畫畫模型是基於擴散模型的中文文生圖大模型。雖然有強大的能力,但模型網路規模巨大,約9億引數量,適配下游任務時訓練時間長,計算和儲存記憶體開銷大。
經分析,悟空畫畫中使用CLIP模型將人類語言轉換成機器能理解的數學向量,並透過 U-Net 模型預測噪聲。這兩種模型的Attention結構都包含全連線層,適配下游任務時可能含有大量冗餘資訊。
因此,我們分別在 U-Net的交叉注意力層q、k、v、output四個模組上,注入了LoRA模組,發現效果異常好。
如下圖所示,適配LoRA後即使僅訓練0.07%引數,也可以生成高質量的影像!
同時,相比全參微調,應用LoRA演算法,訓練效能也得到大幅提升:
- 原本端到端全參微調需17小時,適配後僅需9小時,節約近50%時間;
- 計算記憶體節約40%,可繼續增大一倍batch_size,速度更快;
- 最終儲存的ckpt大小才3.06MB,不再需要用4個GB儲存所有引數。
這說明當有n個下游任務時,僅需儲存n x 3.06MB,避免了n x 4GB的“龐然大物”。而且,我們還做了令人振奮的實驗。如果使用者訓練了多種風格的模型,只需0.5s就可以切換風格,真正的無縫切換“畢加索”和“新海誠”!
原因在於MindSpore框架的靜態圖特性,只需要在第一次正向訓練時編圖,後續即使載入其它LoRA-ckpt更新引數,也無需重新編圖。
2.3 使用方式
為大模型減輕負擔的LoRA演算法本身用起來也很輕鬆,端到端僅需簡單五步就可以完成適配。
第一步:
將模型CrossAttention結構中qkvo的Dense層替換成LoRADense:
from tk.delta import LoRADense # original Dense Layer # self.to_q = nn.Dense(query_dim, inner_dim, has_bias=False).to_float(dtype) # replace Dense Layer with LoRADense self.to_q = LoRADense(query_dim, inner_dim, has_bias=False, lora_rank=4, lora_alpha=4).to_float(dtype)
第二步:
在訓練指令碼中呼叫凍結方法,僅訓練新增的lora模組:
from tk.graph import freeze_delta # freeze all cells except LoRA and head freeze_delta(LatentDiffusionWithLoss, 'lora’)
第三步:
在訓練指令碼中將儲存ckpt的ModelCheckpoint替換為TrainableParamsCheckPoint,僅儲存需要更新的引數:
from tk.graph import TrainableParamsCheckPoint # original callback # ckpt_callback = ModelCheckpoint(...) # replace ModelCheckpoint with TrainableParamsCheckPoint ckpt_callback = TrainableParamsCheckPoint(...)
第四步:
根據訓練目標調整學習率、batch_size等引數:
epochs: 15 start_learning_rate: 1e-4 end_learning_rate: 1e-6 train_batch_size: 3 warmup_steps: 0 lora_rank: 4 lora_alpha: 4
第五步:
訓練完成後,在評估指令碼中分別載入預訓練ckpt和微調後生成的ckpt:
# 載入預訓練ckpt pre_trained_pramas = load_checkpoint(pre_trained_ckpt_path) load_param_into_net(net, pre_trained_pramas) # 載入微調後生成的ckpt trainable_pramas = load_checkpoint(trainable_ckpt_path) load_param_into_net(net, trainable_pramas) # 開始評估 model.eval()
我們已經開源所有程式碼,並給出了詳細的介面和用例介紹:
https://github.com/mindspore-lab/MindPet/blob/master/doc/TK_DeltaAlgorithm_README.md
需要注意的是相比全參微調,適配LoRA後一般要設定更大的學習率。如適配悟空畫畫時,我們就將學習率從1e-5增大到1e-4。
三、MindSpore PET - Prefix-Tuning
Prefix-Tuning: Optimizing Continuous Prompts for Generation,也是一種針對大語言模型的低參微調演算法。研究人員提出,使用連續的向量而不是離散的詞彙來構建字首模板,即在輸入前加入連續的token embedding,可以增加query和key的相關性。因此,Prefix-Tuning透過在每個multi-head attention的 key 矩陣和 value 矩陣前注入可訓練的prefix向量k,v,並凍結原始網路引數,來大幅提升生成類任務的效能。
Prefix-Tuning在GPT-2和盤古Alpha大模型上都有很好的效果。與全參微調相比,在保持原有精度的前提下,使用Prefix-Tuning訓練盤古Alpha僅需5.5%的引數量,節約了65%以上的計算記憶體,並將一個迭代的耗時縮短到一半。
四、MindSpore PET - Rdrop
R-Drop: Regularized Dropout for Neural Networks,是一種用於提升精度的微調演算法,主要透過簡單的“兩次Dropout”來構造正樣本進行對比學習,增加模型隨機性。具體是在模型載入完一個batch的資料集之後,複製一份該資料,並同時輸入到模型中,然後分別計算損失函式,並將結果相加得到最終的loss值。儘管邏輯非常簡單,卻能很好的防止模型過擬合,進一步提高模型的正確率。經在Bert上多個下游任務上驗證,幾乎保持同樣的記憶體和時間開銷,就能提升2.6個點的精度。
大模型開發到部署是一個高門檻、複雜的過程,大模型使能套件將幫助開發者,讓大模型更易開發、易適配、易部署。
想了解更多關於TransFormers大模型套件MindSpore TransFormers、以文生圖大模型套件MindSpore Diffusion、人類反饋強化學習套件MindSpore RLHF的相關資訊,請關注昇思MindSpore公眾號,我們將持續為大家帶來人工智慧領域技術乾貨和活動訊息。