ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發(fā)70億參數(shù)開(kāi)源模型
自從Meta發(fā)布「開(kāi)源版ChatGPT」LLaMA之后,學(xué)界可謂是一片狂歡。
先是斯坦福提出了70億參數(shù)Alpaca,緊接著又是UC伯克利聯(lián)手CMU、斯坦福、UCSD和MBZUAI發(fā)布的130億參數(shù)Vicuna,在超過(guò)90%的情況下實(shí)現(xiàn)了與ChatGPT和Bard相匹敵的能力。
今天,「卷王」UC伯克利LMSys org又發(fā)布了70億參數(shù)的Vicuna——
不僅體積小、效率高、能力強(qiáng),而且只需兩行命令就能在M1/M2芯片的Mac上運(yùn)行,還能開(kāi)啟GPU加速!

項(xiàng)目地址:https://github.com/lm-sys/FastChat/#fine-tuning
恰在今天,Hugging Face的研究人員也發(fā)布了一個(gè)70億參數(shù)的模型——StackLLaMA。這是一個(gè)通過(guò)人類反饋強(qiáng)化學(xué)習(xí)在LLaMA-7B微調(diào)而來(lái)的模型。
Vicuna-7B:真·單GPU,Mac就能跑
距離模型的發(fā)布不到一周,UC伯克利LMSys org便公布了Vicuna-13B的權(quán)重。
其中,單GPU運(yùn)行需要大約28GB的顯存,而在僅用CPU的情況下需要大約60GB的內(nèi)存。
而這次發(fā)布的70億參數(shù)版本,則要小巧得多——需求直接砍半。
也就是說(shuō),用單個(gè)GPU運(yùn)行Vicuna-7B,只需14GB+顯存;而純CPU運(yùn)行的話,則只需30GB+內(nèi)存。
不僅如此,我們還可以通過(guò)Metal后端,在配備了蘋(píng)果自研芯片或者AMD GPU的Mac上啟用GPU加速。

之前在13B模型發(fā)布時(shí),有不少網(wǎng)友吐槽道:
我以為的單個(gè)GPU:4090
實(shí)際上的單個(gè)GPU:28GB顯存及以上


現(xiàn)在,這個(gè)問(wèn)題也有了新的解決方案——利用8位壓縮直接減少一半左右的內(nèi)存用量,只不過(guò)模型的質(zhì)量會(huì)略有下降。
13B模型28GB顯存瞬間變14GB;7B模型14GB顯存瞬間變7GB,有沒(méi)有?。ǖ捎赼ctivation的緣故,實(shí)際占用會(huì)比這個(gè)高)
對(duì)此,LMSys org的研究人員表示,如果遇到內(nèi)存或顯存不夠用的情況,可以通過(guò)在上述命令中加入--load-8bit來(lái)啟用8位壓縮。
而且,無(wú)論是CPU、GPU還是Metal,是7B模型還是13B模型,通通適用。
StackLLaMA:超全RLHF訓(xùn)練教程
今天,Hugging Face研究人員發(fā)布了一篇博客StackLLaMA:用RLHF訓(xùn)練LLaMA的實(shí)踐指南。

當(dāng)前大型語(yǔ)言模型ChatGPT、GPT-4和Claude都使用了人類反饋強(qiáng)化學(xué)習(xí)(RLHF)來(lái)微調(diào)模型的行為,以產(chǎn)生更符合用戶意圖的響應(yīng)。
在此,HF研究者通過(guò)以下方式組合使用,訓(xùn)練了LlaMa模型使用RLHF回答Stack Exchange上的所有步驟:
· 監(jiān)督微調(diào) (SFT)
· 獎(jiǎng)勵(lì)/偏好建模(RM)
· 人類反饋強(qiáng)化學(xué)習(xí) (RLHF)
要注意了!
訓(xùn)練StackLLaMA的主要目標(biāo)是提供一個(gè)教程和指南,介紹如何使用RLHF來(lái)訓(xùn)練模型,而不是主要關(guān)注模型的性能表現(xiàn)。

換句話說(shuō),該模型在生成答案方面非常滑稽,比如問(wèn)它「我的花園里有一只駱駝,怎樣才能把它趕走?」
StackLLaMA最后給出的一個(gè)總括「如果以上方法都不奏效,就要召集增援了。如果有不止一個(gè)人想抓住這個(gè)奇特的小家伙,為什么不召集一個(gè)團(tuán)隊(duì)呢?齊心協(xié)力,集中力量,這個(gè)問(wèn)題應(yīng)該很快就解決了」。
在進(jìn)行RLHF時(shí),最重要的是從一個(gè)強(qiáng)有力的模型開(kāi)始。因?yàn)镽LHF只是一個(gè)微調(diào)步驟,以便讓模型與我們期望的互動(dòng)方式和響應(yīng)方式相一致。
當(dāng)前,Meta開(kāi)源的LLaMA模型參數(shù)大小從7B到65B不等,并且在1T到1.4T的token上進(jìn)行了訓(xùn)練,是目前開(kāi)源比較強(qiáng)大的模型。
因此,研究人員使用7B模型作為后續(xù)微調(diào)的基礎(chǔ)。
在數(shù)據(jù)集選用上,研究人員使用了StackExchange數(shù)據(jù)集,包括所有的問(wèn)題和答案(還有StackOverflow和其他主題)。
選用該數(shù)據(jù)集的好處是,答案伴隨著點(diǎn)贊數(shù)和接受答案的標(biāo)簽一起給出。
研究人員根據(jù)A General Language Assistant as a Laboratory for Alignment論文中描述的方法,給每個(gè)答案打分:
對(duì)于獎(jiǎng)勵(lì)模型,始終需要每個(gè)問(wèn)題兩個(gè)答案來(lái)進(jìn)行比較。
而有些問(wèn)題有幾十個(gè)答案,導(dǎo)致可能存在許多的可選對(duì)。因此,研究者對(duì)每個(gè)問(wèn)題最多采樣十個(gè)答案對(duì),以限制每個(gè)問(wèn)題的數(shù)據(jù)點(diǎn)數(shù)。
最后,通過(guò)將HTML轉(zhuǎn)換為Markdown來(lái)清除格式,使模型輸出更可讀。
訓(xùn)練策略
即使訓(xùn)練最小的LLaMA模型也需要大量的內(nèi)存。通過(guò)計(jì)算7B 參數(shù)模型將使用(2+8)*7B=70GB 內(nèi)存空間。當(dāng)計(jì)算注意力分?jǐn)?shù)等中間值時(shí),可能需要更多。因此,即使在單個(gè)80GB的A100上也無(wú)法訓(xùn)練該模型。
一種方法是使用更高效的優(yōu)化器和半精度訓(xùn)練,將更多信息壓縮到內(nèi)存中,但內(nèi)存仍舊不夠用。
另一種選擇是使用參數(shù)高效微調(diào)(PEFT)技術(shù),例如PEFT庫(kù),它可以在8位模型上執(zhí)行低秩適應(yīng)(LoRA)。
線性層的低秩適應(yīng): 在凍結(jié)層(藍(lán)色)旁邊添加額外參數(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)存(取決于批次大小和序列長(zhǎng)度),以適應(yīng)整個(gè)微調(diào)設(shè)置。
這可以以較低成本微調(diào)更大的模型(在NVIDIA A100 80GB上訓(xùn)練高達(dá)50-60B規(guī)模的模型)。這些技術(shù)已經(jīng)能夠在消費(fèi)級(jí)設(shè)備,比如樹(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)
在開(kāi)始訓(xùn)練獎(jiǎng)勵(lì)模型并使用RL調(diào)整模型之前,若要模型在任何情況下遵循指令,便需要指令調(diào)優(yōu)。
實(shí)現(xiàn)這一點(diǎn)最簡(jiǎn)單的方法是,使用來(lái)自領(lǐng)域或任務(wù)的文本繼續(xù)訓(xùn)練語(yǔ)言模型。
為了有效地使用數(shù)據(jù),研究者使用一種稱為「packing」的技術(shù):在文本之間使用一個(gè)EOS標(biāo)記連接許多文本,并切割上下文大小的塊以填充批次,而無(wú)需任何填充。
通過(guò)這種方法,訓(xùn)練效率更高,因?yàn)橥ㄟ^(guò)模型的每個(gè)token也進(jìn)行了訓(xùn)練。
獎(jiǎng)勵(lì)建模和人類偏好
原則上,研究人員可以使用RLHF直接通過(guò)人工標(biāo)注對(duì)模型進(jìn)行微調(diào)。然而,這需要在每次優(yōu)化迭代之后將一些樣本發(fā)送給人類進(jìn)行評(píng)級(jí)。
由于需要大量的訓(xùn)練樣本來(lái)實(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à)更高。
通過(guò)StackExchange 數(shù)據(jù)集,研究人員根據(jù)分?jǐn)?shù)推斷出用戶更喜歡這兩個(gè)答案中的哪一個(gè)。有了這些信息和上面定義的損失,就可以修改transformers.Trainer 。通過(guò)添加一個(gè)自定義的損失函數(shù)進(jìn)行訓(xùn)練。
研究人員利用100,000對(duì)候選子集,并在50,000對(duì)候選的支持集上進(jìn)行評(píng)估。
訓(xùn)練通過(guò)Weights & Biases進(jìn)行記錄,在8-A100 GPU上花費(fèi)了幾個(gè)小時(shí),模型最終的準(zhǔn)確率為67%。
雖然這聽(tīng)起來(lái)分?jǐn)?shù)不高,但是這個(gè)任務(wù)對(duì)于人類標(biāo)注員來(lái)說(shuō)也非常困難。
人類反饋強(qiáng)化學(xué)習(xí)
有了經(jīng)過(guò)微調(diào)的語(yǔ)言模型和獎(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階段。
使用RL訓(xùn)練語(yǔ)言模型的一個(gè)常見(jiàn)問(wèn)題是,模型可以通過(guò)生成完全胡言亂語(yǔ)來(lái)學(xué)習(xí)利用獎(jiǎng)勵(lì)模型,從而導(dǎo)致獎(jiǎng)勵(lì)模型得到不合實(shí)際的獎(jiǎng)勵(lì)。
為了平衡這一點(diǎn),研究人員在獎(jiǎng)勵(lì)中增加了一個(gè)懲罰:保留一個(gè)沒(méi)有訓(xùn)練的模型進(jìn)行參考,并通過(guò)計(jì)算 KL散度將新模型的生成與參考模型的生成進(jìn)行比較。
在訓(xùn)練期間對(duì)每個(gè)步驟進(jìn)行批次獎(jiǎng)勵(lì),模型的性能在大約1000個(gè)步驟后趨于穩(wěn)定。






































