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