export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
conda create -n Test01 python=3.10 anaconda
conda activate Test01

# 將conda環境加入PATH和LD_LIBRARY_PATH中,從而可以優先利用conda安裝的程序
export LD_LIBRARY_PATH=~/anaconda3/envs/Test01/lib/:$LD_LIBRARY_PATH
export PATH=~/anaconda3/envs/Test01/bin:$PATH
conda install git
git clone https://github.com/microsoft/DeepSpeedExamples.git
cd DeepSpeedExamples/applications/DeepSpeed-Chat/

# 安裝依賴
pip install -r requirements.txt

最近這個開發庫更新得非常頻繁,所以你下載的最新版本可能與我在視頻中介紹的內容不一致。以下是視頻中所使用的版本:
https://github.com/TechDIYLife/DeepSpeedExamples20230415.git

conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia

常見問題:

python
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.device_count()
1
>>> torch.cuda.current_device()
0
>>> torch.cuda.device(0)
<torch.cuda.device at 0x7efce0b03be0>
>>> torch.cuda.get_device_name(0)
'GeForce GTX 950M'

參考網頁說明:https://www.deepspeed.ai/getting-started/

3、ChatGPT模型訓練基本流程

ChatGPT 的訓練過程共分為四個步驟:

其中,階段(a)的 GPT-3.5 或 GPT-4 預訓練部分是計算量最大的階段。這不僅需要大量的 GPU(幾十到數百個),而且訓練時間非常長(數月),因此通常只有大型企業才能進行訓練。在本實例中,我們使用了 Facebook 公開的 opt 系列預訓練模型,并主要針對 b、c、d 三個步驟進行訓練。這三個步驟分別對應案例中的 Step 1、2、3。

4、代碼與訓練過程介紹

DS-chat代碼位于 applications/DeepSpeed-Chat 目錄下,下面是主要程序的結構,詳細解釋請觀看視頻中的解說:

- train.py  # 入口程序
- training # 訓練腳本
- step1_supervised_finetuning # 第一步訓練
- evaluation_scripts # 第一步訓練完成后評價用
- training_scripts # 模型訓練腳本
- README.md # 說明文檔
- main.py # 主程序,訓練過程的實現細節
- prompt_eval.py # 評價主程序
- step2_reward_model_finetuning # 第二步訓練
- 省略
- step3_rlhf_finetuning # 第三步訓練
- 省略
- utils 模型訓練,評價的相關函數庫
- inference # 測試,評價代碼

模型訓練調用過程(以1.3b模型為例)

Facebook opt系列模型
本實例中使用的預訓練模型是 facebook opt系列模型,根據OPT論文介紹,OPT-175B模型與GPT-3有類似的性能。
OPT:Open Pre-trained Transformer Language Models
論文地址:https://arxiv.org/abs/2205.01068

模型在Huggingface上的地址:
https://huggingface.co/facebook/opt-125m
https://huggingface.co/facebook/opt-350m
https://huggingface.co/facebook/opt-1.3b
https://huggingface.co/facebook/opt-6.7b
https://huggingface.co/facebook/opt-13b
https://huggingface.co/facebook/opt-30b
https://huggingface.co/facebook/opt-66b

如果要使用最大的175B的模型,需要申請,獲得授權后才能使用。
申請地址:https://forms.gle/dag8g7nKiR4o4VZq5

5、實戰Step1:監督微調

任務說明: 使用標定的數據對預訓練模型進行微調。

啟動訓練:
通過執行下面的命令,就可以開啟模型的訓練。 在執行以下命令以開始模型訓練之前,請確保設置了 CUDA 并激活了 conda 運行環境(請參考【2 開發環境安裝】)。

python3 train.py --step 1 --deployment-type single_gpu  #單GPU訓練
python3 train.py --step 1 --deployment-type single_node #多GPU訓練
python3 train.py --step 1 --deployment-type multi_node #多Node訓練

在上述三種方式中,single_gpu 只適合訓練較小的模型,而 single_node 和 multi_node 更適合訓練較大的模型。第一次運行時,建議使用 single_gpu,因為在這種模式下,輸出的錯誤信息會更詳細。如果遇到 GPU 內存不足的問題,可以嘗試使用 single_node 和 multi_node 來訓練。如果問題仍然存在,需要手動調整 batch-size。

此步驟主要進行:

~/.cache/huggingface/hub/models--facebook--opt-1.3b
Dahoas/rm-static    # 對話(prompt,response,chosen,rejected) 
Dahoas/full-hh-rlhf # 對話(prompt,response,chosen,rejected)
Dahoas/synthetic-instruct-gptj-pairwise #對話(prompt,chosen,rejected)
yitingxie/rlhf-reward-datasets # 對話(prompt,chosen,rejected)
openai/webgpt_comparisons # 帶人工打分的數據,comparisons with human feedback,19,578 comparisons)
stanfordnlp/SHP # 18個領域的385k 人類標注數據

評價與測試:
打開文件 run_prompt.sh 添加 baseline 模型,和 finetune 后的模型:

export CUDA_VISIBLE_DEVICES=0
python prompt_eval.py \
--model_name_or_path_baseline facebook/opt-1.3b \
--model_name_or_path_finetune ../../output/actor-models/1.3b

評價程序會調用 prompt_eval.py 來分別輸出 baseline 和 finetune 后模型的結果。

要執行此代碼,需要切換到 step1_supervised_finetuning 目錄下。

cd training/step1_supervised_finetuning
bash evaluation_scripts/run_prompt.sh

常見問題:

export CUDA_VISIBLE_DEVICES=0,1 # 2塊GPU
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 # 8塊GPU
export MASTER_ADDR=127.0.0.1 # 多node時,需要設置為主node的IP或者機器名
export MASTER_PORT=29701

以上設置,也可以在 run1.3b.sh 文件中進行設置,例如:

CUDA_VISIBLE_DEVICES=0,1 deepspeed --master_addr=127.0.0.1 --master_port=29701 main.py

原因是由于模型被finetune以后,Token對應的詞典數量發生了變化,導致輸入數據維度變化了(這應該是個bug,在輸入端應盡量保持與預訓練模型一致)。應對方法,打開文件 prompt_eval.py,增加新的 config 讀取腳本,并把來源模型從 baseline 模型中修改為finerune后的模型:

config = AutoConfig.from_pretrained(args.model_name_or_path_finetune) # 新增
model_fintuned = get_model(config, args.model_name_or_path_finetune, tokenizer)
python chat.py --path output/actor-models/1.3b

6、實戰Step2:Reward模型微調

任務介紹: 在第三步(Step3)中,強化學習階段需要使用獎勵模型。獎勵模型會對模型生成的答案進行打分,Step3 的強化訓練會根據這些分數對模型進行優化,從而使最終模型生成更高分的答案。獎勵模型同樣基于預訓練模型進行訓練,在這里我們使用了 350M 的 opt 模型。

啟動訓練:
啟動訓練方法與前面類似:

python3 train.py --step 2 --deployment-type single_gpu  #單GPU訓練
python3 train.py --step 2 --deployment-type single_node #多GPU訓練
python3 train.py --step 2 --deployment-type multi_node #多Node訓練

訓練數據:

Dahoas/rm-static
Dahoas/full-hh-rlhf
Dahoas/synthetic-instruct-gptj-pairwise
yitingxie/rlhf-reward-datasets
openai/webgpt_comparisons
stanfordnlp/SHP

評價與測試:

步驟如下:

常見錯誤:

7、實戰Step3:RLHF訓練

任務介紹:
RLHF 是基于人類反饋的強化學習的縮寫。根據官方介紹,此步訓練面臨兩個主要挑戰:

在此實例中,通過將 DeepSpeed 訓練和推理功能整合為一個統一的混合引擎(Hybrid Engine)來應對這些挑戰。更多詳細信息可以參考官方說明。

在此步驟首次運行時,會安裝并編譯新的工具(transformer_inference)。如果編輯過程出現問題,建議升級 PyTorch 和 CUDA 版本。在我的環境下,使用 PyTorch 2.0 和 CUDA 11.7 下可以成功編譯。

啟動訓練:

python3 train.py --step 3 --deployment-type single_gpu  #單GPU訓練
python3 train.py --step 3 --deployment-type single_node #多GPU訓練
python3 train.py --step 3 --deployment-type multi_node #多Node訓練

此步訓練后的模型被存儲在 output/step3-models/1.3b/ 下。

常見問題:

--per_device_train_batch_size 8 --per_device_mini_train_batch_size=8

8、評價與測試

使用 chat.py 命令(需要移動到 DeepSpeed-Chat 目錄下)進行評價與測試。 執行方式如下:

python chat.py --path output/step3-models/1.3b/actor

上面的程序可以啟動13b的模型,但是66b的模型無法成功運行。

備注:
這套工具剛剛發布不久,最近作者和貢獻者們還在頻繁的更新中。
更多的信息,請關注其github倉庫中的動態。

參考文獻

文章轉載自: 專題:大模型訓練入門實戰

上一篇:

手把手教你使用盤古API

下一篇:

探索海洋數據的寶庫:Amentum海洋數據探測API的潛力
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費