ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

來源:新智元
編輯:桃子 好睏

130億參數模型權重公布不久,UC伯克利LMSys org再次發布了70億參數「小羊駝」。同在今天,Hugging Face也發布了70億參數模型StackLLaMA。

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

自從Meta發布「開源版ChatGPT」LLaMA之後,學界可謂是一片狂歡。

先是斯坦福提出了70億參數Alpaca,緊接着又是UC伯克利聯手CMU、斯坦福、UCSD和MBZUAI發布的130億參數Vicuna,在超過90%的情況下實現了與ChatGPT和Bard相匹敵的能力。

今天,「卷王」UC伯克利LMSys org又發布了70億參數的Vicuna——

不僅體積小、效率高、能力強,而且只需兩行命令就能在M1/M2芯片的Mac上運行,還能開啟GPU加速!

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

項目地址:https://github.com/lm-sys/FastChat/#fine-tuning

恰在今天,Hugging Face的研究人員也發布了一個70億參數的模型——StackLLaMA。這是一個通過人類反饋強化學習在LLaMA-7B微調而來的模型。

Vicuna-7B:真·單GPU,Mac就能跑

距離模型的發布不到一周,UC伯克利LMSys org便公布了Vicuna-13B的權重。

其中,單GPU運行需要大約28GB的顯存,而在僅用CPU的情況下需要大約60GB的內存。

而這次發布的70億參數版本,則要小巧得多——需求直接砍半。

也就是說,用單個GPU運行Vicuna-7B,只需14GB+顯存;而純CPU運行的話,則只需30GB+內存。

不僅如此,我們還可以通過Metal後端,在配備了蘋果自研芯片或者AMD GPU的Mac上啟用GPU加速。

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

之前在13B模型發布時,有不少網友吐槽道:

我以為的單個GPU:4090
實際上的單個GPU:28GB顯存及以上

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型
ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

現在,這個問題也有了新的解決方案——利用8位壓縮直接減少一半左右的內存用量,只不過模型的質量會略有下降。

13B模型28GB顯存瞬間變14GB;7B模型14GB顯存瞬間變7GB,有沒有!(但由於activation的緣故,實際佔用會比這個高)

對此,LMSys org的研究人員表示,如果遇到內存或顯存不夠用的情況,可以通過在上述命令中加入–load-8bit來啟用8位壓縮。

而且,無論是CPU、GPU還是Metal,是7B模型還是13B模型,通通適用。

python3 -m fastchat.serve.cli --model-name /path/to/vicuna/weights --load-8bit

StackLLaMA:超全RLHF訓練教程

今天,Hugging Face研究人員發布了一篇博客StackLLaMA:用RLHF訓練LLaMA的實踐指南。

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

當前大型語言模型ChatGPT、GPT-4和Claude都使用了人類反饋強化學習(RLHF)來微調模型的行為,以產生更符合用戶意圖的響應。

在此,HF研究者通過以下方式組合使用,訓練了LlaMa模型使用RLHF回答Stack Exchange上的所有步驟:

· 監督微調 (SFT)

· 獎勵/偏好建模(RM)

· 人類反饋強化學習 (RLHF)

要注意了!

訓練StackLLaMA的主要目標是提供一個教程和指南,介紹如何使用RLHF來訓練模型,而不是主要關注模型的性能表現。

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

換句話說,該模型在生成答案方面非常滑稽,比如問它「我的花園裡有一隻駱駝,怎樣才能把它趕走?」

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

StackLLaMA最後給出的一個總括「如果以上方法都不奏效,就要召集增援了。如果有不止一個人想抓住這個奇特的小傢伙,為什麼不召集一個團隊呢?齊心協力,集中力量,這個問題應該很快就解決了」。

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

在進行RLHF時,最重要的是從一個強有力的模型開始。因為RLHF只是一個微調步驟,以便讓模型與我們期望的互動方式和響應方式相一致。

當前,Meta開源的LLaMA模型參數大小從7B到65B不等,並且在1T到1.4T的token上進行了訓練,是目前開源比較強大的模型。

因此,研究人員使用7B模型作為後續微調的基礎。

在數據集選用上,研究人員使用了StackExchange數據集,包括所有的問題和答案(還有StackOverflow和其他主題)。

選用該數據集的好處是,答案伴隨着點贊數和接受答案的標籤一起給出。

研究人員根據A General Language Assistant as a Laboratory for Alignment論文中描述的方法,給每個答案打分:

score = log2 (1 + upvotes) rounded to the nearest integer, plus 1 if the questioner accepted the answer (we assign a score of −1 if the number of upvotes is negative).

對於獎勵模型,始終需要每個問題兩個答案來進行比較。

而有些問題有幾十個答案,導致可能存在許多的可選對。因此,研究者對每個問題最多採樣十個答案對,以限制每個問題的數據點數。

最後,通過將HTML轉換為Markdown來清除格式,使模型輸出更可讀。

訓練策略

即使訓練最小的LLaMA模型也需要大量的內存。通過計算7B 參數模型將使用(2+8)*7B=70GB 內存空間。當計算注意力分數等中間值時,可能需要更多。因此,即使在單個80GB的A100上也無法訓練該模型。

一種方法是使用更高效的優化器和半精度訓練,將更多信息壓縮到內存中,但內存仍舊不夠用。

另一種選擇是使用參數高效微調(PEFT)技術,例如PEFT庫,它可以在8位模型上執行低秩適應(LoRA)。

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

線性層的低秩適應: 在凍結層(藍色)旁邊添加額外參數(橙色),並將結果編碼的隱藏狀態與凍結層的隱藏狀態相加。

以8位加載模型大大減少了內存佔用,因為每個參數只需要一個字節的權重。比如,7B LLaMA在內存中是7 GB。

LoRA不直接訓練原始權重,而是在一些特定的層 (通常是注意力層) 上添加小的適配器層,因此可訓練參數的數量大大減少。

在這種情況下,一個經驗法則是為每十億參數分配約1.2-1.4GB的內存(取決於批次大小和序列長度),以適應整個微調設置。

這可以以較低成本微調更大的模型(在NVIDIA A100 80GB上訓練高達50-60B規模的模型)。這些技術已經能夠在消費級設備,比如樹莓派、手機,和GoogleColab上對大型模型進行微調。

研究人員發現儘管現在可以把非常大的模型放入當個GPU中,但是訓練可能仍然非常緩慢。

在此,研究人員使用了數據并行策略:將相同的訓練設置複製到單個GPU中,並將不同的批次傳遞給每個GPU。

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

監督微調

在開始訓練獎勵模型並使用RL調整模型之前,若要模型在任何情況下遵循指令,便需要指令調優。

實現這一點最簡單的方法是,使用來自領域或任務的文本繼續訓練語言模型。

為了有效地使用數據,研究者使用一種稱為「packing」的技術:在文本之間使用一個EOS標記連接許多文本,並切割上下文大小的塊以填充批次,而無需任何填充。

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

通過這種方法,訓練效率更高,因為通過模型的每個token也進行了訓練。

獎勵建模和人類偏好

原則上,研究人員可以使用RLHF直接通過人工標註對模型進行微調。然而,這需要在每次優化迭代之後將一些樣本發送給人類進行評級。

由於需要大量的訓練樣本來實現收斂,人類閱讀和標註速度固有的延遲,不僅昂貴,還非常緩慢。

因此,研究人員在RL調整模型之前,在收集的人工標註上訓練一個獎勵模型。獎勵建模的目的是模仿人類對文本的評價,這一方法比直接反饋更有效。

在實踐中,最好的方法是預測兩個示例的排名,獎勵模型會根據提示X提供兩個候選項

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

並且必須預測哪一個會被人類標註員評價更高。

通過StackExchange 數據集,研究人員根據分數推斷出用戶更喜歡這兩個答案中的哪一個。有了這些信息和上面定義的損失,就可以修改transformers.Trainer 。通過添加一個自定義的損失函數進行訓練。

class RewardTrainer(Trainer):def compute_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()        if return_outputs:            return loss, {"rewards_j": rewards_j, "rewards_k": rewards_k}        return loss

研究人員利用100,000對候選子集,並在50,000對候選的支持集上進行評估。

訓練通過Weights & Biases進行記錄,在8-A100 GPU上花費了幾個小時,模型最終的準確率為67%。

雖然這聽起來分數不高,但是這個任務對於人類標註員來說也非常困難。

人類反饋強化學習

有了經過微調的語言模型和獎勵模型,現在可以運行RL循環,大致分為以下三個步驟:

· 根據提示生成響應

· 根據獎勵模型對回答進行評分

· 對評級進行強化學習策略優化

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

在對查詢和響應提示進行標記並傳遞給模型之前,模板如下。同樣的模版也適用於SFT,RM 和RLHF階段。


Question: Answer:

使用RL訓練語言模型的一個常見問題是,模型可以通過生成完全胡言亂語來學習利用獎勵模型,從而導致獎勵模型得到不合實際的獎勵。

為了平衡這一點,研究人員在獎勵中增加了一個懲罰:保留一個沒有訓練的模型進行參考,並通過計算 KL散度將新模型的生成與參考模型的生成進行比較。

在訓練期間對每個步驟進行批次獎勵,模型的性能在大約1000個步驟后趨於穩定。

ChatGPT平替「小羊駝」Mac可跑!2行代碼單GPU,UC伯克利再發70億參數開源模型

參考資料:

https://huggingface.co/blog/stackllama

本文鏈接:https://www.8btc.com/article/6812646

轉載請註明文章出處

(0)
上一篇 2023-04-21 15:25
下一篇 2023-04-21 15:25

相关推荐