一、PEFT介紹
PEFT(Parameter-Efficient Fine-Tuning,參數(shù)高效微調(diào)),是一個用于在不微調(diào)所有模型參數(shù)的情況下,高效地將預(yù)訓(xùn)練語言模型(PLM)適應(yīng)到各種下游應(yīng)用的庫。
PEFT方法僅微調(diào)少量(額外的)模型參數(shù),顯著降低了計算和存儲成本,因為對大規(guī)模PLM進(jìn)行完整微調(diào)的代價過高。最近的最先進(jìn)的PEFT技術(shù)實現(xiàn)了與完整微調(diào)相當(dāng)?shù)男阅堋?/strong>
代碼:
https://github.com/huggingface/peft
文檔:
https://huggingface.co/docs/peft/index
二、PEFT 使用
接下來將展示 PEFT 的主要特點,并幫助在消費設(shè)備上通常無法訪問的情況下訓(xùn)練大型預(yù)訓(xùn)練模型。您將了解如何使用LoRA來訓(xùn)練1.2B參數(shù)的bigscience/mt0-large模型,以生成分類標(biāo)簽并進(jìn)行推理。
2.1 PeftConfig
每個 PEFT 方法由一個PeftConfig類來定義,該類存儲了用于構(gòu)建PeftModel的所有重要參數(shù)。
由于您將使用LoRA,您需要加載并創(chuàng)建一個LoraConfig類。在LoraConfig中,指定以下參數(shù):
- task_type,在本例中為序列到序列語言建模
- inference_mode,是否將模型用于推理
- r,低秩矩陣的維度
- lora_alpha,低秩矩陣的縮放因子
- lora_dropout,LoRA層的dropout概率
from peft import LoraConfig, TaskType
peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)
有關(guān)您可以調(diào)整的其他參數(shù)的更多詳細(xì)信息,請參閱LoraConfig參考。
2.2 PeftModel
使用 get_peft_model() 函數(shù)可以創(chuàng)建PeftModel。它需要一個基礎(chǔ)模型 - 您可以從 Transformers 庫加載 - 以及包含配置特定 PEFT 方法的PeftConfig。
首先加載您要微調(diào)的基礎(chǔ)模型。
from transformers import AutoModelForSeq2SeqLM
model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"
model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
使用get_peft_model函數(shù)將基礎(chǔ)模型和peft_config包裝起來,以創(chuàng)建PeftModel。要了解您模型中可訓(xùn)練參數(shù)的數(shù)量,可以使用print_trainable_parameters方法。在這種情況下,您只訓(xùn)練了模型參數(shù)的0.19%!
from peft import get_peft_model
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
# 輸出示例: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282
至此,我們已經(jīng)完成了!現(xiàn)在您可以使用Transformers的Trainer、 Accelerate,或任何自定義的PyTorch訓(xùn)練循環(huán)來訓(xùn)練模型。
2.3 保存和加載模型
在模型訓(xùn)練完成后,您可以使用save_pretrained函數(shù)將模型保存到目錄中。您還可以使用push_to_hub函數(shù)將模型保存到Hub(請確保首先登錄您的Hugging Face帳戶)。
model.save_pretrained("output_dir")
# 如果要推送到Hub
from huggingface_hub import notebook_login
notebook_login()
model.push_to_hub("my_awesome_peft_model")
這只保存了已經(jīng)訓(xùn)練的增量PEFT權(quán)重,這意味著存儲、傳輸和加載都非常高效。例如,這個在RAFT數(shù)據(jù)集的twitter_complaints子集上使用LoRA訓(xùn)練的bigscience/T0_3B模型只包含兩個文件:adapter_config.json和adapter_model.bin,后者僅有19MB!
使用from_pretrained函數(shù)輕松加載模型進(jìn)行推理:
from transformers import AutoModelForSeq2SeqLM
from peft import PeftModel, PeftConfig
peft_model_id = "smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM"
config = PeftConfig.from_pretrained(peft_model_id)
model = AutoModelForSeq2SeqLM.from_pretrained(config.base_model_name_or_path)
model = PeftModel.from_pretrained(model, peft_model_id)
三、PEFT支持任務(wù)
3.1 Models support matrix
3.1.1 Causal Language Modeling
3.1.2 Conditional Generation
3.1.3 Sequence Classification
3.1.4 Token Classification
3.1.5 Text-to-Image Generation
3.1.6 Image Classification
3.1.7 Image to text (Multi-modal models)
四、PEFT原理
4.1 LoRA
LoRA(Low-Rank Adaptation)是一種技術(shù),通過低秩分解將權(quán)重更新表示為兩個較小的矩陣(稱為更新矩陣),從而加速大型模型的微調(diào),并減少內(nèi)存消耗。
為了使微調(diào)更加高效,LoRA的方法是通過低秩分解,使用兩個較小的矩陣(稱為更新矩陣)來表示權(quán)重更新。這些新矩陣可以通過訓(xùn)練適應(yīng)新數(shù)據(jù),同時保持整體變化的數(shù)量較少。原始的權(quán)重矩陣保持凍結(jié),不再接收任何進(jìn)一步的調(diào)整。為了產(chǎn)生最終結(jié)果,同時使用原始和適應(yīng)后的權(quán)重進(jìn)行合并。
4.2 Prompt tuning
訓(xùn)練大型預(yù)訓(xùn)練語言模型是非常耗時且計算密集的。隨著模型尺寸的增長,越來越多的人對更高效的訓(xùn)練方法產(chǎn)生了興趣,例如提示(Prompting)。提示通過包括描述任務(wù)的文本提示或甚至演示任務(wù)示例的文本提示來為特定的下游任務(wù)準(zhǔn)備一個凍結(jié)的預(yù)訓(xùn)練模型。通過使用提示,您可以避免為每個下游任務(wù)完全訓(xùn)練單獨的模型,而是使用相同的凍結(jié)預(yù)訓(xùn)練模型。這更加方便,因為您可以將同一模型用于多個不同的任務(wù),而訓(xùn)練和存儲一小組提示參數(shù)要比訓(xùn)練所有模型參數(shù)要高效得多。
提示方法可以分為兩類:
- 硬提示(Hard Prompts):手工制作的具有離散輸入標(biāo)記的文本提示;缺點是需要花費很多精力來創(chuàng)建一個好的提示。
- 軟提示(Soft Prompts):可與輸入嵌入連接并進(jìn)行優(yōu)化以適應(yīng)數(shù)據(jù)集的可學(xué)習(xí)張量;缺點是它們不太易讀,因為您不是將這些“虛擬標(biāo)記”與實際單詞的嵌入進(jìn)行匹配。
4.3 IA3
為了使微調(diào)更加高效,IA3(通過抑制和放大內(nèi)部激活來注入適配器)使用學(xué)習(xí)向量對內(nèi)部激活進(jìn)行重新縮放。這些學(xué)習(xí)向量被注入到典型的基于Transformer架構(gòu)中的注意力和前饋模塊中。這些學(xué)習(xí)向量是微調(diào)過程中唯一可訓(xùn)練的參數(shù),因此原始權(quán)重保持凍結(jié)。處理學(xué)習(xí)向量(而不是像LoRA一樣對權(quán)重矩陣進(jìn)行學(xué)習(xí)的低秩更新)可以大大減少可訓(xùn)練參數(shù)的數(shù)量。文章來源:http://www.zghlxwxcb.cn/news/detail-636621.html
與LoRA類似,IA3具有許多相同的優(yōu)點:文章來源地址http://www.zghlxwxcb.cn/news/detail-636621.html
- IA3通過大大減少可訓(xùn)練參數(shù)的數(shù)量使微調(diào)更加高效(對于T0模型,IA3模型僅具有約0.01%的可訓(xùn)練參數(shù),而即使是LoRA也有超過0.1%)。
- 原始的預(yù)訓(xùn)練權(quán)重保持凍結(jié),這意味著您可以在其之上構(gòu)建多個輕量級和便攜的IA3模型,用于各種下游任務(wù)。
- 使用IA3進(jìn)行微調(diào)的模型性能與完全微調(diào)的模型性能相當(dāng)。
- IA3不會增加任何推理延遲,因為適配器權(quán)重可以與基礎(chǔ)模型合并。
到了這里,關(guān)于【自然語言處理】大模型高效微調(diào):PEFT 使用案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!