引言:PEFT LoRA適配器與基礎(chǔ)模型合併的必要性
在使用參數(shù)高效微調(diào)(PEFT)技術(shù),特別是LoRA(Low-Rank Adaptation)對(duì)大型語言模型進(jìn)行微調(diào)後,我們通常會(huì)得到一個(gè)輕量級(jí)的適配器模型。這個(gè)適配器模型只包含微調(diào)過程中修改的少量權(quán)重,它需要與原始的基礎(chǔ)模型結(jié)合才能進(jìn)行推理。在部署或分享模型時(shí),將適配器與基礎(chǔ)模型合併成一個(gè)完整的、獨(dú)立的模型是一個(gè)常見的需求,這樣可以簡(jiǎn)化模型的加載和使用,無需同時(shí)管理兩個(gè)模型組件。
然而,許多初學(xué)者在嘗試合併時(shí)可能會(huì)遇到困難,例如嘗試直接使用transformers庫的AutoModel.from_pretrained加載PEFT適配器,或者嘗試手動(dòng)對(duì)模型權(quán)重進(jìn)行加權(quán)平均。這些方法通常會(huì)導(dǎo)致錯(cuò)誤,因?yàn)镻EFT適配器有其特定的結(jié)構(gòu)和加載機(jī)制。
錯(cuò)誤的合併嘗試及原因分析
一個(gè)常見的錯(cuò)誤嘗試是使用transformers.AutoModel.from_pretrained來加載PEFT適配器,並試圖通過手動(dòng)加權(quán)的方式合併權(quán)重,如下所示:
from transformers import AutoModel # 錯(cuò)誤示範(fàn):嘗試直接加載PEFT適配器# pretrained_model = AutoModel.from_pretrained("TinyLlama/TinyLlama-1.1B-Chat-v0.6") # lora_adapter = AutoModel.from_pretrained("ArcturusAI/Crystalline-1.1B-v23.12-tagger") # 此處會(huì)報(bào)錯(cuò)# ... 後續(xù)的權(quán)重合併邏輯也是不正確的...
當(dāng)執(zhí)行l(wèi)ora_adapter = AutoModel.from_pretrained("ArcturusAI/Crystalline-1.1B-v23.12-tagger") 時(shí),通常會(huì)遇到OSError,提示模型路徑下缺少pytorch_model.bin、tf_model.h5 等標(biāo)準(zhǔn)模型權(quán)重文件。這是因?yàn)镻EFT適配器通常只包含適配器層的權(quán)重,而非完整的模型權(quán)重文件,transformers.AutoModel無法識(shí)別這種格式。此外,PEFT模型的工作原理並非簡(jiǎn)單地將基礎(chǔ)模型和適配器模型的權(quán)重進(jìn)行加權(quán)平均,而是通過將適配器層注入到基礎(chǔ)模型的特定層中來修改其行為。因此,手動(dòng)合併權(quán)重的方法在邏輯上也是不正確的。
正確的合併策略:使用PEFT庫的merge_and_unload方法
PEFT庫本身提供了將適配器與基礎(chǔ)模型合併的官方且高效的方法:merge_and_unload()。這個(gè)方法能夠正確地將適配器權(quán)重融合到基礎(chǔ)模型的對(duì)應(yīng)層中,並返回一個(gè)標(biāo)準(zhǔn)的transformers模型實(shí)例。
1. 加載PEFT適配器模型
首先,我們需要使用peft庫中專門用於加載PEFT模型的類,例如AutoPeftModelForCausalLM,來加載已訓(xùn)練的PEFT適配器。這個(gè)類會(huì)自動(dòng)識(shí)別並加載PEFT適配器以及其關(guān)聯(lián)的基礎(chǔ)模型配置。
from peft import AutoPeftModelForCausalLM import torch # 定義PEFT適配器模型的本地路徑或Hugging Face模型ID # 假設(shè)您已將適配器模型下載到本地,或者可以直接從Hugging Face Hub加載model_id = "./ArcturusAI/Crystalline-1.1B-v23.12-tagger" # 示例路徑# 加載PEFT適配器模型# 注意:這裡會(huì)同時(shí)加載基礎(chǔ)模型和適配器權(quán)重peft_model = AutoPeftModelForCausalLM.from_pretrained( model_id, torch_dtype=torch.bfloat16 # 根據(jù)您的硬件和模型大小選擇合適的dtype ) print(f"加載後的模型類型: {type(peft_model)}") # 預(yù)期輸出: <class></class>
2. 執(zhí)行模型合併
加載完成後,peft_model是一個(gè)PeftModelForCausalLM實(shí)例。通過調(diào)用其merge_and_unload()方法,PEFT庫會(huì)自動(dòng)將適配器權(quán)重合併到基礎(chǔ)模型中,並返回一個(gè)標(biāo)準(zhǔn)的transformers模型實(shí)例。
# 執(zhí)行合併操作merged_model = peft_model.merge_and_unload() print(f"合併後的模型類型: {type(merged_model)}") # 預(yù)期輸出: <class> (或?qū)?yīng)基礎(chǔ)模型的類型)</class>
此時(shí),merged_model已經(jīng)是一個(gè)包含所有必要權(quán)重的完整模型,可以像任何其他transformers模型一樣進(jìn)行使用和保存。
3. 保存合併後的模型
合併後的模型可以直接使用transformers庫的save_pretrained方法保存到本地,以便後續(xù)加載和部署。
# 定義保存路徑save_directory = "./ArcturusAI/Crystalline-1.1B-v23.12-tagger-fullmodel" # 保存合併後的模型merged_model.save_pretrained(save_directory) print(f"合併後的模型已保存至: {save_directory}")
處理分詞器(Tokenizer)
需要注意的是,merge_and_unload()方法只處理模型的權(quán)重,而不會(huì)處理分詞器。分詞器(Tokenizer)是獨(dú)立於模型權(quán)重的組件,它負(fù)責(zé)將文本轉(zhuǎn)換為模型可以理解的數(shù)字序列。因此,您需要單獨(dú)加載基礎(chǔ)模型的分詞器,並將其保存到與合併模型相同的目錄中,以確保模型的完整性。
from transformers import AutoTokenizer # 加載基礎(chǔ)模型的分詞器base_model_name = "TinyLlama/TinyLlama-1.1B-Chat-v0.6" tokenizer = AutoTokenizer.from_pretrained(base_model_name) # 將分詞器保存到與合併模型相同的目錄tokenizer.save_pretrained(save_directory) print(f"分詞器已保存至: {save_directory}")
完成上述步驟後,./ArcturusAI/Crystalline-1.1B-v23.12-tagger-fullmodel 目錄下將包含一個(gè)完整的、可直接加載和使用的模型(包括權(quán)重和分詞器)。
注意事項(xiàng):PEFT版本兼容性
在處理PEFT模型時(shí),可能會(huì)遇到不同版本peft庫訓(xùn)練的模型之間兼容性問題。例如,較新版本的peft可能在adapter_config.json文件中引入了新的配置鍵(如loftq_config, megatron_config, megatron_core),而舊版本的peft在加載時(shí)可能無法識(shí)別這些鍵,導(dǎo)致加載失敗。
如果遇到此類問題,一種解決方案是手動(dòng)編輯adapter_config.json文件,移除那些不兼容的配置鍵。這通常在您嘗試使用一個(gè)較舊的peft版本加載由較新版本訓(xùn)練的適配器時(shí)發(fā)生。
示例(假設(shè)您已將模型下載到本地並需要修改):
- 下載模型:確保PEFT適配器模型已下載到本地路徑。
- 定位adapter_config.json:在模型路徑下找到adapter_config.json 文件。
- 編輯文件:使用文本編輯器打開adapter_config.json。
- 移除不兼容的鍵:查找並刪除如"loftq_config": null、"megatron_config": {}、"megatron_core": {} 等鍵值對(duì)。
- 保存文件:保存修改後的adapter_config.json。
重要提示:這種手動(dòng)修改配置文件的做法應(yīng)作為臨時(shí)解決方案,並僅在您明確知道哪些鍵是問題根源時(shí)才使用。最佳實(shí)踐是盡量保持peft庫版本的一致性,或者在訓(xùn)練時(shí)就考慮到部署環(huán)境的peft版本。
總結(jié)
將PEFT LoRA適配器與基礎(chǔ)模型合併是一個(gè)相對(duì)直接的過程,關(guān)鍵在於使用peft庫提供的正確工具。通過AutoPeftModelForCausalLM加載適配器,然後調(diào)用merge_and_unload()方法,即可高效地完成模型合併。同時(shí),不要忘記單獨(dú)處理分詞器,並將其與合併後的模型一同保存,以確保模型部署的完整性和便捷性。在處理不同版本peft訓(xùn)練的模型時(shí),注意潛在的兼容性問題,並採取適當(dāng)?shù)拇胧┻M(jìn)行解決。
以上是PEFT LoRA適配器與基礎(chǔ)模型的高效合併策略的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Stock Market GPT
人工智慧支援投資研究,做出更明智的決策

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

本教程詳細(xì)介紹瞭如何將PEFT LoRA適配器與基礎(chǔ)模型高效合併,生成一個(gè)完全獨(dú)立的模型。文章指出直接使用transformers.AutoModel加載適配器並手動(dòng)合併權(quán)重是錯(cuò)誤的,並提供了使用peft庫中merge_and_unload方法的正確流程。此外,教程還強(qiáng)調(diào)了處理分詞器的重要性,並討論了PEFT版本兼容性問題及解決方案。

運(yùn)行pipinstall-rrequirements.txt可安裝依賴包,建議先創(chuàng)建並激活虛擬環(huán)境以避免衝突,確保文件路徑正確且pip已更新,必要時(shí)使用--no-deps或--user等選項(xiàng)調(diào)整安裝行為。

Pytest是Python中簡(jiǎn)單強(qiáng)大的測(cè)試工具,安裝後按命名規(guī)則自動(dòng)發(fā)現(xiàn)測(cè)試文件。編寫以test_開頭的函數(shù)進(jìn)行斷言測(cè)試,使用@pytest.fixture創(chuàng)建可複用的測(cè)試數(shù)據(jù),通過pytest.raises驗(yàn)證異常,支持運(yùn)行指定測(cè)試和多種命令行選項(xiàng),提升測(cè)試效率。

theargparsemodulestherecommondedwaywaytohandlecommand-lineargumentsInpython,提供式刺激,typeValidation,helpmessages anderrornhandling; useSudys.argvforsimplecasesRequeRequeRingminimalSetup。

本文旨在探討Python及NumPy中浮點(diǎn)數(shù)計(jì)算精度不足的常見問題,解釋其根源在於標(biāo)準(zhǔn)64位浮點(diǎn)數(shù)的表示限制。針對(duì)需要更高精度的計(jì)算場(chǎng)景,文章將詳細(xì)介紹並對(duì)比mpmath、SymPy和gmpy等高精度數(shù)學(xué)庫的使用方法、特點(diǎn)及適用場(chǎng)景,幫助讀者選擇合適的工具來解決複雜的精度需求。

本文詳細(xì)介紹瞭如何利用PEFT庫的merge_and_unload功能,將LoRA適配器高效、準(zhǔn)確地合併到基礎(chǔ)大語言模型中,從而創(chuàng)建一個(gè)全新的、集成了微調(diào)知識(shí)的模型。文章糾正了直接通過transformers.AutoModel加載適配器和手動(dòng)合併模型權(quán)重的常見??誤區(qū),並提供了完整的代碼示例,包括模型合併、分詞器處理以及解決潛在版本兼容性問題的專業(yè)指導(dǎo),確保合併過程順暢無誤。

Import@contextmanagerfromcontextlibanddefineageneratorfunctionthatyieldsexactlyonce,wherecodebeforeyieldactsasenterandcodeafteryield(preferablyinfinally)actsas__exit__.2.Usethefunctioninawithstatement,wheretheyieldedvalueisaccessibleviaas,andthesetup

PyPDF2、pdfplumber和FPDF是Python處理PDF的核心庫。使用PyPDF2可進(jìn)行文本提取、合併、拆分及加密,如通過PdfReader讀取頁面並調(diào)用extract_text()獲取內(nèi)容;pdfplumber更適合保留佈局的文本提取和表格識(shí)別,支持extract_tables()精準(zhǔn)抓取表格數(shù)據(jù);FPDF(推薦fpdf2)用於生成PDF,通過add_page()、set_font()和cell()構(gòu)建文檔並輸出。合併PDF時(shí),PdfWriter的append()方法可集成多個(gè)文件
