如何訓練自己的 ChatGPT

LLM 這兩週不斷帶給我們震撼與驚喜。GPT-4 的發佈讓大家對 LLM 的想象空間進一步擴大,而這些想象在本週眼花繚亂的 LLM 應用發佈中逐漸成爲現實,下面分享一位朋友訓練 ChatGPT 的完整方案,供大家參考~

LLM 相關的開源社區這兩週湧現了很多優秀的工作,吸引了很多人的關注。其中,我比較關注的是 Stanford 基於 LLaMA 的 Alpaca 和隨後出現的 LoRA 版本 Alpaca-LoRA。原因很簡單,便宜

Alpaca 宣稱只需要 600$ 不到的成本(包括創建數據集),便可以讓 LLaMA 7B 達到近似 text-davinci-003 的效果。而 Alpaca-LoRA 則在此基礎上,讓我們能夠以一塊消費級顯卡,在幾小時內完成 7B 模型的 fine-turning。

下面是開源社區成員分享的可以跑通的硬件規格及所需時間:

根據大家分享的信息,fine-tune 7B 模型僅需要 8-10 GB vram。因此我們很有可能可以在 Google Colab 上完成你所需要的 fine-tune!

那麼,說幹就幹!

爲什麼要訓練自己的 ChatGPT ?

我想到了以下的方面:


計劃

那麼,爲了訓練自己的 Chat 我們需要做那些事兒呢? 理論上需要如下步驟:

第一步:準備數據集

fine-tune 的目標通常有兩種:

以第一種目標爲例,假設我們的目標是讓模型講中文,那麼,我們可以通過其他 LLM (如 text-davinci-003)把一個現有數據集(如 Alpaca)翻譯爲中文來做 fine-tune。實際上這個想法已經在開源社區已經有人實現了。

第二步:訓練並 apply LoRA

在第一步準備的數據集上進行 fine-tune。

第三步:合併模型(可選)

合併 LoRA 與 base 可以加速推理,並幫助我們後續 Quantization 模型。

第四步:quantization(可選)

最後,Quantization 可以幫助我們加速模型推理,並減少推理所需內存。這方面也有開源的工具可以直接使用。

https://github.com/megvii-research/Sparsebit/blob/main/large_language_models/llama/quantization/README.md


實踐

柿子挑軟的捏,我們從簡單的目標開始:讓模型講中文。

爲了達成這個目標,我使用的數據集是 Luotuo 作者翻譯的 Alpaca 數據集,訓練代碼主要來自 Alpaca-LoRA。

準備

由於我打算直接使用 Alpaca-LoRA 的代碼,我們先 clone Alpaca-LoRA:

git clone git@github.com:tloen/alpaca-lora.git

下載數據集:

wget https://github.com/LC1332/Chinese-alpaca-lora/blob/main/data/trans_chinese_alpaca_data.json

創建虛擬環境並安裝依賴(需要根據不同環境的 cuda 版本調整):

conda create -n alpaca python=3.9
conda activate alpaca
cd alpaca-lora
pip install -r requirements.txt

訓練

單卡選手很簡單,可以直接執行:

python finetune.py \
    --base_model 'decapoda-research/llama-7b-hf' \
    --data_path '/path/to/trans_chinese_alpaca_data.json' \
    --output_dir './lora-alpaca-zh'

雙卡選手相對比較麻煩,需要執行:

WORLD_SIZE=CUDA_VISIBLE_DEVICES=0,1 torchrun \
--nproc_per_node=\
--master_port=1234 \
finetune.py \
--base_model 'decapoda-research/llama-7b-hf' \
--data_path '/path/to/trans_chinese_alpaca_data.json' \
--output_dir './lora-alpaca-zh'

在我的環境下(2 * RTX 3090 Ti 24GB),需要額外配置 micro_batch_size 避免 OOM。

--micro_batch_size 2

推薦的其他額外參數:

--num_epochs 2

訓練的過程比較穩定,我在訓練過程中一直在用 nvitop 查看顯存和顯卡的用量:

下面是我訓練時模型收斂的情況,可以看到差不多 2 epochs 模型就收斂的差不多了:

推理

單卡選手可以直接執行:

python generate.py --base_model "decapoda-research/llama-7b-hf" \
--lora_weights './lora-alpaca-zh' \
--load_8bit

雙卡選手還是會麻煩點,由於現在還不支持雙卡推理,我手動修改了 generate.py,添加了第 47 行:

而後,執行上面的命令即可。

如果你的推理運行在服務器上,想要通過其他終端訪問,可以給 launch 方法添加參數:

server_

此時打開瀏覽器,享受你的工作成果吧 :D

加速推理

Alpaca-LoRA 提供了一些腳本,如 export_hf_checkpoint.py 來合併模型。合併後的模型可以通過 llamap.cpp 等項目達到更好的推理性能。

測試

最後,讓我們對比下原生 Alpaca 與自己 fine-tune 的 Alpaca,看看 fine-tune 到底有沒有讓模型學會講中文吧!

Good Examples

Bad Examples

可以看出模型確實在講中文,也能依據中文的指令和輸入完成一些工作。但是由於 LLaMA 本身訓練數據大部分爲英文以及 Alpaca 數據集翻譯後的質量不足,我們的模型有些時候效果不如原生 Alpaca。此時不得不感嘆高質量數據對 LLM 的重要性


總結

作爲一個分佈式系統方向的工程師,fine-tune 一個 LLM 的過程遇到了不少問題,也有很多樂趣。雖然 LLaMA 7B 展現出的能力還比較有限,我還是很期待後面開源社區進一步的工作。

後續我也打算嘗試 fine-tune 特定目的的 LLM,比如讓 LLM 教我做飯,感興趣的朋友可以保持關注!

作者:Uranus

來源:zhuanlan.zhihu.com/p/616504594

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/iPTsaHE9GqKMBSXn3D-SiA