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