130 億參數(shù)模型權(quán)重公布不久,UC 伯克利 LMSys org 再次發(fā)布了 70 億參數(shù)「小羊駝」。同在今天,Hugging Face 也發(fā)布了 70 億參數(shù)模型 StackLLaMA。
自從 Meta 發(fā)布「開源版 ChatGPT」LLaMA 之后,學(xué)界可謂是一片狂歡。
先是斯坦福提出了 70 億參數(shù) Alpaca,緊接著又是 UC 伯克利聯(lián)手 CMU、斯坦福、UCSD 和 MBZUAI 發(fā)布的 130 億參數(shù) Vicuna,在超過 90% 的情況下實(shí)現(xiàn)了與 ChatGPT 和 Bard 相匹敵的能力。
今天,「卷王」UC 伯克利 LMSys org 又發(fā)布了 70 億參數(shù)的 Vicuna——
不僅體積小、效率高、能力強(qiáng),而且只需兩行命令就能在 M1 / M2 芯片的 Mac 上運(yùn)行,還能開啟 GPU 加速!
恰在今天,Hugging Face 的研究人員也發(fā)布了一個(gè) 70 億參數(shù)的模型 ——StackLLaMA。這是一個(gè)通過人類反饋強(qiáng)化學(xué)習(xí)在 LLaMA-7B 微調(diào)而來的模型。
Vicuna-7B:真?單 GPU,Mac 就能跑
距離模型的發(fā)布不到一周,UC 伯克利 LMSys org 便公布了 Vicuna-13B 的權(quán)重。
其中,單 GPU 運(yùn)行需要大約 28GB 的顯存,而在僅用 CPU 的情況下需要大約 60GB 的內(nèi)存。
而這次發(fā)布的 70 億參數(shù)版本,則要小巧得多 —— 需求直接砍半。
也就是說,用單個(gè) GPU 運(yùn)行 Vicuna-7B,只需 14GB + 顯存;而純 CPU 運(yùn)行的話,則只需 30GB + 內(nèi)存。
不僅如此,我們還可以通過 Metal 后端,在配備了蘋果自研芯片或者 AMD GPU 的 Mac 上啟用 GPU 加速。
之前在 13B 模型發(fā)布時(shí),有不少網(wǎng)友吐槽道:
我以為的單個(gè) GPU:4090
實(shí)際上的單個(gè) GPU:28GB 顯存及以上
現(xiàn)在,這個(gè)問題也有了新的解決方案 —— 利用 8 位壓縮直接減少一半左右的內(nèi)存用量,只不過模型的質(zhì)量會(huì)略有下降。
13B 模型 28GB 顯存瞬間變 14GB;7B 模型 14GB 顯存瞬間變 7GB,有沒有!
對(duì)此,LMSys org 的研究人員表示,如果遇到內(nèi)存或顯存不夠用的情況,可以通過在上述命令中加入--load-8bit 來啟用 8 位壓縮。
而且,無論是 CPU、GPU 還是 Metal,是 7B 模型還是 13B 模型,通通適用。
python3-mfastchat.serve.cli--model-name/path/to/vicuna/weights--load-8bitStackLLaMA:超全 RLHF 訓(xùn)練教程
今天,Hugging Face 研究人員發(fā)布了一篇博客 StackLLaMA:用 RLHF 訓(xùn)練 LLaMA 的實(shí)踐指南。
當(dāng)前大型語言模型 ChatGPT、GPT-4 和 Claude 都使用了人類反饋強(qiáng)化學(xué)習(xí)來微調(diào)模型的行為,以產(chǎn)生更符合用戶意圖的響應(yīng)。
在此,HF 研究者通過以下方式組合使用,訓(xùn)練了 LlaMa 模型使用 RLHF 回答 Stack Exchange 上的所有步驟:
?監(jiān)督微調(diào)
?獎(jiǎng)勵(lì) / 偏好建模
?人類反饋強(qiáng)化學(xué)習(xí)
要注意了!
訓(xùn)練 StackLLaMA 的主要目標(biāo)是提供一個(gè)教程和指南,介紹如何使用 RLHF 來訓(xùn)練模型,而不是主要關(guān)注模型的性能表現(xiàn)。
換句話說,該模型在生成答案方面非?;热鐔査肝业幕▓@里有一只駱駝,怎樣才能把它趕走?」
StackLLaMA 最后給出的一個(gè)總括「如果以上方法都不奏效,就要召集增援了。如果有不止一個(gè)人想抓住這個(gè)奇特的小家伙,為什么不召集一個(gè)團(tuán)隊(duì)呢?齊心協(xié)力,集中力量,這個(gè)問題應(yīng)該很快就解決了」。
在進(jìn)行 RLHF 時(shí),最重要的是從一個(gè)強(qiáng)有力的模型開始。因?yàn)?RLHF 只是一個(gè)微調(diào)步驟,以便讓模型與我們期望的互動(dòng)方式和響應(yīng)方式相一致。
當(dāng)前,Meta 開源的 LLaMA 模型參數(shù)大小從 7B 到 65B 不等,并且在 1T 到 1.4T 的 token 上進(jìn)行了訓(xùn)練,是目前開源比較強(qiáng)大的模型。
因此,研究人員使用 7B 模型作為后續(xù)微調(diào)的基礎(chǔ)。
在數(shù)據(jù)集選用上,研究人員使用了 StackExchange 數(shù)據(jù)集,包括所有的問題和答案。
選用該數(shù)據(jù)集的好處是,答案伴隨著點(diǎn)贊數(shù)和接受答案的標(biāo)簽一起給出。
研究人員根據(jù) A General Language Assistant as a Laboratory for Alignment 論文中描述的方法,給每個(gè)答案打分:
score=log2roundedtothenearestinteger,plus1ifthequestioneracceptedtheanswer(weassignascoreof?1ifthenumberofupvotesisnegative).
對(duì)于獎(jiǎng)勵(lì)模型,始終需要每個(gè)問題兩個(gè)答案來進(jìn)行比較。
而有些問題有幾十個(gè)答案,導(dǎo)致可能存在許多的可選對(duì)。因此,研究者對(duì)每個(gè)問題最多采樣十個(gè)答案對(duì),以限制每個(gè)問題的數(shù)據(jù)點(diǎn)數(shù)。
最后,通過將 HTML 轉(zhuǎn)換為 Markdown 來清除格式,使模型輸出更可讀。
訓(xùn)練策略
即使訓(xùn)練最小的 LLaMA 模型也需要大量的內(nèi)存。通過計(jì)算 7B 參數(shù)模型將使用 *7B=70GB 內(nèi)存空間。當(dāng)計(jì)算注意力分?jǐn)?shù)等中間值時(shí),可能需要更多。因此,即使在單個(gè) 80GB 的 A100 上也無法訓(xùn)練該模型。
一種方法是使用更高效的優(yōu)化器和半精度訓(xùn)練,將更多信息壓縮到內(nèi)存中,但內(nèi)存仍舊不夠用。
另一種選擇是使用參數(shù)高效微調(diào) 技術(shù),例如 PEFT 庫,它可以在 8 位模型上執(zhí)行低秩適應(yīng) (LoRA)。
線性層的低秩適應(yīng): 在凍結(jié)層旁邊添加額外參數(shù)(橙色),并將結(jié)果編碼的隱藏狀態(tài)與凍結(jié)層的隱藏狀態(tài)相加。
以 8 位加載模型大大減少了內(nèi)存占用,因?yàn)槊總€(gè)參數(shù)只需要一個(gè)字節(jié)的權(quán)重。比如,7B LLaMA 在內(nèi)存中是 7 GB。
LoRA 不直接訓(xùn)練原始權(quán)重,而是在一些特定的層 上添加小的適配器層,因此可訓(xùn)練參數(shù)的數(shù)量大大減少。
在這種情況下,一個(gè)經(jīng)驗(yàn)法則是為每十億參數(shù)分配約 1.2-1.4GB 的內(nèi)存,以適應(yīng)整個(gè)微調(diào)設(shè)置。
這可以以較低成本微調(diào)更大的模型。這些技術(shù)已經(jīng)能夠在消費(fèi)級(jí)設(shè)備,比如樹莓派、手機(jī),和 GoogleColab 上對(duì)大型模型進(jìn)行微調(diào)。
研究人員發(fā)現(xiàn)盡管現(xiàn)在可以把非常大的模型放入當(dāng)個(gè) GPU 中,但是訓(xùn)練可能仍然非常緩慢。
在此,研究人員使用了數(shù)據(jù)并行策略:將相同的訓(xùn)練設(shè)置復(fù)制到單個(gè) GPU 中,并將不同的批次傳遞給每個(gè) GPU。
監(jiān)督微調(diào)
在開始訓(xùn)練獎(jiǎng)勵(lì)模型并使用 RL 調(diào)整模型之前,若要模型在任何情況下遵循指令,便需要指令調(diào)優(yōu)。
實(shí)現(xiàn)這一點(diǎn)最簡(jiǎn)單的方法是,使用來自領(lǐng)域或任務(wù)的文本繼續(xù)訓(xùn)練語言模型。
為了有效地使用數(shù)據(jù),研究者使用一種稱為「packing」的技術(shù):在文本之間使用一個(gè) EOS 標(biāo)記連接許多文本,并切割上下文大小的塊以填充批次,而無需任何填充。
通過這種方法,訓(xùn)練效率更高,因?yàn)橥ㄟ^模型的每個(gè) token 也進(jìn)行了訓(xùn)練。
獎(jiǎng)勵(lì)建模和人類偏好
原則上,研究人員可以使用 RLHF 直接通過人工標(biāo)注對(duì)模型進(jìn)行微調(diào)。然而,這需要在每次優(yōu)化迭代之后將一些樣本發(fā)送給人類進(jìn)行評(píng)級(jí)。
由于需要大量的訓(xùn)練樣本來實(shí)現(xiàn)收斂,人類閱讀和標(biāo)注速度固有的延遲,不僅昂貴,還非常緩慢。
因此,研究人員在 RL 調(diào)整模型之前,在收集的人工標(biāo)注上訓(xùn)練一個(gè)獎(jiǎng)勵(lì)模型。獎(jiǎng)勵(lì)建模的目的是模仿人類對(duì)文本的評(píng)價(jià),這一方法比直接反饋更有效。
在實(shí)踐中,最好的方法是預(yù)測(cè)兩個(gè)示例的排名,獎(jiǎng)勵(lì)模型會(huì)根據(jù)提示 X 提供兩個(gè)候選項(xiàng)
,并且必須預(yù)測(cè)哪一個(gè)會(huì)被人類標(biāo)注員評(píng)價(jià)更高。
通過 StackExchange 數(shù)據(jù)集,研究人員根據(jù)分?jǐn)?shù)推斷出用戶更喜歡這兩個(gè)答案中的哪一個(gè)。有了這些信息和上面定義的損失,就可以修改 transformers.Trainer 。通過添加一個(gè)自定義的損失函數(shù)進(jìn)行訓(xùn)練。
classRewardTrainer:defcompute_loss(self,model,inputs,return_outputs=False):rewards_j=model(input_ids=inputs("input_ids_j"),attention_mask=inputs("attention_mask_j"))(0)rewards_k=model(input_ids=inputs("input_ids_k"),attention_mask=inputs("attention_mask_k"))(0)loss=-nn.functional.logsigmoid(rewards_j-rewards_k).mean()ifreturn_outputs:returnloss,"rewards_j":rewards_j,"rewards_k":rewards_kreturnloss
研究人員利用 100,000 對(duì)候選子集,并在 50,000 對(duì)候選的支持集上進(jìn)行評(píng)估。
訓(xùn)練通過 Weights amp; Biases 進(jìn)行記錄,在 8-A100 GPU 上花費(fèi)了幾個(gè)小時(shí),模型最終的準(zhǔn)確率為 67%。
雖然這聽起來分?jǐn)?shù)不高,但是這個(gè)任務(wù)對(duì)于人類標(biāo)注員來說也非常困難。
人類反饋強(qiáng)化學(xué)習(xí)
有了經(jīng)過微調(diào)的語言模型和獎(jiǎng)勵(lì)模型,現(xiàn)在可以運(yùn)行 RL 循環(huán),大致分為以下三個(gè)步驟:
?根據(jù)提示生成響應(yīng)
?根據(jù)獎(jiǎng)勵(lì)模型對(duì)回答進(jìn)行評(píng)分
?對(duì)評(píng)級(jí)進(jìn)行強(qiáng)化學(xué)習(xí)策略優(yōu)化
在對(duì)查詢和響應(yīng)提示進(jìn)行標(biāo)記并傳遞給模型之前,模板如下。同樣的模版也適用于 SFT,RM 和 RLHF 階段。
Question:lt;Querygt;Answer:lt;Responsegt;
使用 RL 訓(xùn)練語言模型的一個(gè)常見問題是,模型可以通過生成完全胡言亂語來學(xué)習(xí)利用獎(jiǎng)勵(lì)模型,從而導(dǎo)致獎(jiǎng)勵(lì)模型得到不合實(shí)際的獎(jiǎng)勵(lì)。
為了平衡這一點(diǎn),研究人員在獎(jiǎng)勵(lì)中增加了一個(gè)懲罰:保留一個(gè)沒有訓(xùn)練的模型進(jìn)行參考,并通過計(jì)算 KL 散度將新模型的生成與參考模型的生成進(jìn)行比較。
在訓(xùn)練期間對(duì)每個(gè)步驟進(jìn)行批次獎(jiǎng)勵(lì),模型的性能在大約 1000 個(gè)步驟后趨于穩(wěn)定。
參考資料:
鄭重聲明:此文內(nèi)容為本網(wǎng)站轉(zhuǎn)載企業(yè)宣傳資訊,目的在于傳播更多信息,與本站立場(chǎng)無關(guān)。僅供讀者參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。