作者 |?FelixCoder
前言
由于 ChatGPT 和 GPT4 興起,如何讓人人都用上這種大模型,是目前 AI 領(lǐng)域最活躍的事情。當(dāng)下開源的??LLM(Large language model)非常多,可謂是百模大戰(zhàn)。面對諸多開源本地模型,根據(jù)自己的需求,選擇適合自己的基座模型和參數(shù)量很重要。選擇完后需要對訓(xùn)練數(shù)據(jù)進行預(yù)處理,往往這一步就難住很多同學(xué),無從下手,更別說 training。
然后再對模型進行 finetuning 來更好滿足自己的下游任務(wù)。那么對于如果要訓(xùn)練一個專家模型。預(yù)訓(xùn)練也是必不可缺的工作。不管是預(yù)訓(xùn)練還是??finetuning(微調(diào)),無論選用何種方案,都避免不了訓(xùn)練中產(chǎn)生的災(zāi)難性遺忘問題,那么怎么減少和避免這種情況的發(fā)生,也是本文想講的一個重點。對于推理,在 GPU 資源不富裕的情況,如何最小化的利用內(nèi)存,提升推理效率,也是可以討論的內(nèi)容。
模型選擇
先看一下最好的模型有哪些,以下數(shù)據(jù)是最新 LLM 排行,來自?UC 伯克利?[1]
▲ FireShot Capture 015 - Chatbot Arena Leaderboard Week 8_ Introducing MT-Bench and Vicuna-33B_ - lmsys.org.png
當(dāng)然這里前 3 名都閉源模型,后面開源模型,大多數(shù)也都是英文的模型。如果 GPU 資源充足(至少 A100*8),這里也可以基于開源模型做中文的預(yù)訓(xùn)練,最后再 finetuning 。但我們沒有 GPU 資源, 我們可以選擇開源的中文模型直接做微調(diào)。?
具體有哪些中文模型可以選擇,可以參考這兩個地址?中文語言理解測評基準(zhǔn)(CLUE)[2] 和?SuperCLUE 瑯琊榜?[3]。開源領(lǐng)域 ChatGLM,LLAMA,RWKV 主要就是這 3 種模型, 中文好一點就是 ChatGLM,潛力最好的就是 LLAMA,RNN 架構(gòu)決定 RWKV 有很好的推理效率(隨輸入長度內(nèi)存占比線性自增,而 LLAMA 則是指數(shù)增加) 和? Length Extrapolation?(關(guān)于長度外推性,可以參考蘇神的文章?[4])。
當(dāng)然?MPT-7B-StoryWriter-65k+?[5] 模型也有較長的外推能力,主要在于,注意力這塊使用了?ALIBI?[6]。要擁有什么樣的長度,取決你的需求。對于對話模型,往往不需要那么長的外推能力。但對于想做知識庫領(lǐng)域相關(guān)的應(yīng)用, 需要模型能夠看更多的內(nèi)容,是有這個需求的。
這里不做推薦,一切來自你的具體需求和 GPU 資源,不知道怎么樣選擇,可以將您的需求和資源情況留言,我給你做一個選擇。
模型大小選擇
當(dāng)然對于模型參數(shù)的選擇,往往是參數(shù)越大效果越好。如果資源充足,當(dāng)然是推薦 30B 以上的模型。不管是 6B, 7B 和 13B 同樣的訓(xùn)練數(shù)據(jù),同樣訓(xùn)練參數(shù),模型參數(shù)量大效果則優(yōu)于低參數(shù)的模型。那么根據(jù)模型參數(shù),如何預(yù)估我們的訓(xùn)練所需的內(nèi)存開銷,這里有一個簡單的方法 比如 6B 模型,60 億規(guī)模參數(shù),根據(jù)以下公式計算:?
模型參數(shù) + 梯度參數(shù) + 優(yōu)化器參數(shù) = 6B * 1bytes + 6GB + 2*6GB = 24GB?
以上是全量預(yù)訓(xùn)練,當(dāng)然如果采用 lora 這種方法,則會有更低內(nèi)存占用。當(dāng)然我們還可以對模型進行量化,來提高內(nèi)存效率。?
注意:參數(shù)多量化低的模型要優(yōu)于參數(shù)低量化高的模型,舉例 :33B-fb4 模型要優(yōu)于 13b-fb16 模型.
數(shù)據(jù)處理
對于 LLM 訓(xùn)練,數(shù)據(jù)質(zhì)量很重要。預(yù)訓(xùn)練時,我們可以將數(shù)據(jù)先進行預(yù)處理,比如對數(shù)據(jù)進行一定規(guī)則的篩選,數(shù)據(jù)去重,去除一些低質(zhì)量的數(shù)據(jù)。同時,我們可能面臨各種類型的數(shù)據(jù),PDF,Word,HTML,代碼文件等等,對于這種不同類型的數(shù)據(jù)我們需要都處理成文本,同時還過濾掉一些干擾項或亂碼的數(shù)據(jù)。
當(dāng)然,我們也可以利用一些工具去處理,比如 justext?[7],trafilatura?[8],來提取文檔主要內(nèi)容,減少數(shù)據(jù)的噪音。對于空的文檔或文檔長度低于 100 進行過濾,進一步減少噪音。
對于一些機器生成的文本或 OCR?識別錯誤的文本,質(zhì)量不高,由沒有什么邏輯性,雖然比較難以檢測,但是還是會有一些工具能做這樣的事情,比如?ctrl-detector?[9]。當(dāng)然對于一些有毒的或帶有偏見的數(shù)據(jù),可以采用?PerspectiveAPI?[10] 或垃圾郵件檢測的辦法來過濾。
我們還不得不考慮數(shù)據(jù)的一些隱私風(fēng)險,也需要考慮,比如身份證號,銀行卡等信息,比如 presidio 和 pii-codex 等工具提供了檢測、分析和處理文本數(shù)據(jù)中的個人身份信息的能力。
指令微調(diào)數(shù)據(jù),我們可以使用?PromptSource?[11] 來創(chuàng)建微調(diào)數(shù)據(jù)。當(dāng)然我們還可以讓 GPT4 給我們標(biāo)注一些數(shù)據(jù),這樣蒸餾知識,可以讓數(shù)據(jù)質(zhì)量進一步提升。這里我分享一個我使用的 Prompt 工程:
first_prompt?=?""" 作為一位專業(yè)的xxxx,您的任務(wù)是從給定的上下文回答問題。 給定的上下文: """ last_prompt?=?""" 請綜合上述信息,你給出的回復(fù)需要包含以下三個字段: 1.questions:?基于上下文內(nèi)容,提出與這個內(nèi)容相關(guān)的問題,至少兩個以上。 2.answers:?然后根據(jù)問題,分別給出每個問題的答案,請用 markdown 格式。 3.instruction:?給出上下文內(nèi)容的總結(jié),盡量精簡,用 markdown 格式。 請按照以下JSON格式來回答: 前括號 ??????"questions":?[ ??????????"<內(nèi)容相關(guān)問題1>", ??????????"<內(nèi)容相關(guān)問題2>" ??????], ??????"answers":?[ ???????????"<內(nèi)容相關(guān)問題1的答案>", ???????????"<內(nèi)容相關(guān)問題2的答案>" ??????], ??????instruction:?"<總結(jié)性的內(nèi)容>" 后括號 注意:如果碰到上下文內(nèi)容信息不夠,無法回答問題的情況,answers和questions可以返回空。 最后強調(diào)一下:你的回復(fù)將直接用于javascript的JSON.parse解析,所以注意一定要以標(biāo)準(zhǔn)的JSON格式做回答,不要包含任何其他非JSON內(nèi)容,否則你將被扣分?。?! """
微調(diào)方案
目前對于 LLM 微調(diào)方案有很多,我將常用的一些方案和相關(guān)資料做一個列舉。?
Prefix-Tuning(P-Tuning v2)[12]
Prompt Tuning?[13]
Lora?/?QLora [14]
根據(jù)實際經(jīng)驗,這里推薦采用 Lora 或 QLora。簡單介紹一下 QLoRA,重點改進是將模型采用 4bit 量化后加載,訓(xùn)練時把數(shù)值反量化到 bf16 后進行訓(xùn)練,利用 LoRA 可以鎖定原模型參數(shù)不參與訓(xùn)練,只訓(xùn)練少量 LoRA 參數(shù)的特性使得訓(xùn)練所需的顯存大大減少。例如 33B 的 LLaMA 模型經(jīng)過這種方式可以在 24GB 的顯卡上訓(xùn)練,也就是說消費級單卡都可以實現(xiàn),大大降低了微調(diào)的門檻。
英文模型需要做詞表擴充嗎?
對于像 LLaMA 模型的詞表大小是 32K,其主要針對英語進行訓(xùn)練(具體詳見?LLaMA 論文 [15]),對多語種支持不是特別理想(可以對比一下多語言經(jīng)典模型 XLM-R 的詞表大小為 250K)。
通過初步統(tǒng)計發(fā)現(xiàn),LLaMA 詞表中僅包含很少的中文字符,所以在切詞時會把中文切地更碎,需要多個 byte token 才能拼成一個完整的漢字,進而導(dǎo)致信息密度降低。比如,在擴展詞表后的模型中,單個漢字傾向于被切成 1 個 token,而在 LLaMA 中可能就需要 2-3 個才能組合成一個漢字,顯著降低模型的推理效率。
如何避免災(zāi)難遺忘
通常我們有以下方式,可以減少或避免災(zāi)難性遺忘問題
將重要的權(quán)重凍結(jié) - 像 Lora 就是采用的這種方案,只學(xué)習(xí)部分網(wǎng)絡(luò)權(quán)重。但這里 Lora 的配置其實是要注意一下,如果你是用 Lora 做預(yù)訓(xùn)練,lora 訓(xùn)練模塊可以配上 q_proj,v_proj,k_proj,o_proj??如果是微調(diào)則只需要訓(xùn)練? q_proj,v_proj? lora_rank 的設(shè)置也有講究,初始設(shè) lora_ran 為 8,訓(xùn)練存在遺忘時,可以將 lora_rank 改為 64(原因是與原模型數(shù)據(jù)領(lǐng)域相差較大的話,需要更大的秩,原論文有說明)。
復(fù)習(xí) - 跟人一樣,在預(yù)訓(xùn)練或微調(diào)時,回看之前訓(xùn)練的數(shù)據(jù)。還可以專門把特征圖存起來,量化以后放在一個類似于記憶庫的地方,之后在新任務(wù)上訓(xùn)練的時候從這個記憶庫里重構(gòu)出記憶和新數(shù)據(jù)一起訓(xùn)練。感興趣可以看這篇論文?[16]。?
MoE - 稀疏門控制的專家混合層,最近爆出 GPT4 是由 8 個 220B 的模型組合。關(guān)于?Moe 相關(guān)資料?[17]?大家自行了解。?
推理加速
對于推理,一般我們采用量化方案,這里有兩個辦法。第一個則是采用 ggml 工具,比如?llama.cpp?[18] 針對 llama 模型,將模型量化運行在 cpu 或 gpu 上,也可以 cpu 和 gpu 一起跑,內(nèi)存則大大減少,推理速度有極大的提高。?
▲ image.png
這里如果將 llama.cpp 運行在 gpu 上, 編譯時一定要加?LLAMA_CUBLAS=1,同時推理的時候,指定? --gpu-layers|-ngl? 來分配運行在 gpu 上的層數(shù),當(dāng)然越大,占用 gpu 的內(nèi)存會越多。
如果是 RWKV 模型,則考慮采用?rwkv.cpp?[19],此方法與?llama.cpp?類似,使用方式也是類似的。
還有 Llama 模型還可以考慮使用?exllama?[20] 純 GPU 的加速,雖然還不夠完善,但也可以值得一試。
另一個,采用?LLM Accelerator?[21],LLM 存在大量的相似性推理,基于此,可以做一些優(yōu)化加速推理,具體請看論文。最后采用架構(gòu)上的調(diào)整,faster transformer?[22] 要優(yōu)于傳統(tǒng)的 transformer 架構(gòu)。
總結(jié)
最后總結(jié)幾條原則:?
參數(shù)多量化低的模型要優(yōu)于參數(shù)低量化高的模型?
模型質(zhì)量與訓(xùn)練數(shù)據(jù)質(zhì)量是存在相關(guān)性的?
擴充中文詞表有助于提高推理效率?
微調(diào)推薦采用 Lora QLora 方案?
模型加速必然需要對模型進行量化
編輯:黃飛
?
評論
查看更多