作者: 李鵬,王明,施晨,黃俊
導(dǎo)讀
隨著深度學(xué)習(xí)大語(yǔ)言模型的不斷發(fā)展,其模型結(jié)構(gòu)和量級(jí)在快速演化,依托大模型技術(shù)的應(yīng)用更是層出不窮。對(duì)于廣大開發(fā)者來(lái)說(shuō)不僅要考慮如何在復(fù)雜多變的場(chǎng)景下有效的將大模型消耗的算力發(fā)揮出來(lái),還要應(yīng)對(duì)大模型的持續(xù)迭代。開發(fā)簡(jiǎn)單易用的大模型訓(xùn)練工具就成了應(yīng)對(duì)以上問題廣受關(guān)注的技術(shù)方向,讓開發(fā)者專注于大模型解決方案的開發(fā),降低大模型訓(xùn)練加速性能優(yōu)化和訓(xùn)練/推理全流程搭建的人力開發(fā)成本。阿里云機(jī)器學(xué)習(xí)平臺(tái)PAI開源了業(yè)內(nèi)較早投入業(yè)務(wù)應(yīng)用的大模型訓(xùn)練工具Pai-Megatron-Patch,本文將詳解Pai-Megatron-Patch的設(shè)計(jì)原理和應(yīng)用。
Pai-Megatron-Patch是什么
Pai-Megatron-Patch工具是阿里云機(jī)器學(xué)習(xí)平臺(tái)PAI算法團(tuán)隊(duì)研發(fā),基于阿里云智算服務(wù)PAI-靈駿平臺(tái)的大模型最佳實(shí)踐解決方案配套工具,旨在幫助大模型開發(fā)者快速上手靈駿產(chǎn)品,完成大語(yǔ)言模型(LLM)的高效分布式訓(xùn)練,有監(jiān)督指令微調(diào),模型離線推理驗(yàn)證等完整大模型開發(fā)鏈路。該項(xiàng)目提供了業(yè)界主流開源大模型基于Megatron-LM的訓(xùn)練&離線推理驗(yàn)證流程,方便用戶快速上手大模型訓(xùn)練。
主要特性
豐富且簡(jiǎn)單易用的使用示例,支持大模型預(yù)訓(xùn)練,微調(diào),評(píng)估和推理,強(qiáng)化學(xué)習(xí)全流程最佳實(shí)踐
開源地址
https://github.com/alibaba/Pai-Megatron-Patch
技術(shù)架構(gòu)
關(guān)鍵技術(shù)
1. 模型權(quán)重轉(zhuǎn)換
下面我們以llama-2為例,詳解從huggingface到megatron的模型權(quán)重轉(zhuǎn)換技術(shù)。下表總結(jié)了兩者在不同module上的命名對(duì)應(yīng)關(guān)系。在patch實(shí)現(xiàn)過(guò)程中,我們首先將HF格式的ckpt轉(zhuǎn)換到一種內(nèi)部格式,然后再把這種內(nèi)部格式轉(zhuǎn)換成對(duì)應(yīng)的外部格式。這樣做可以最大程度復(fù)用已有的轉(zhuǎn)換邏輯來(lái)處理新模型。在轉(zhuǎn)換為內(nèi)部格式的過(guò)程中,q_proj, k_proj, v_proj需要沿著第0維拼接在一起后賦值給內(nèi)部變量query_key_value。
--swiglu
--use-rotary-position-embeddings
--no-position-embedding
--untie-embeddings-and-output-weights
--disable-bias-linear
--swiglu
--use-alibi-mask
--position-embedding-type none
--untie-embeddings-and-output-weights
--disable-bias-linear
從Huggingface到TE模型的權(quán)重轉(zhuǎn)換技術(shù)和之前是類似的,也需要事先找到兩者之間的映射關(guān)系。從下表可以看出,TE中多了_extra_state是用來(lái)存fp8訓(xùn)練的scale和history的,這些在加載的時(shí)候會(huì)出現(xiàn)沖突,這時(shí)只要將load_state_dict函數(shù)的strict設(shè)置成False就可以了,比如load_state_dict(state_dict_, strict=False)。
for i in range(tp_size):
params_dict = get_element_from_dict_by_path(output_state_dict[i],
"model.language_model.encoder")
dense_h_to_4h_1_name = 'mlp.dense_h_to_4h_1.weight'
dense_h_to_4h_1_layer_name = f"layers.{layer}.{dense_h_to_4h_1_name}"
dense_h_to_4h_1_weight = params_dict[dense_h_to_4h_1_layer_name]
dense_h_to_4h_2_name = 'mlp.dense_h_to_4h_2.weight'
dense_h_to_4h_2_layer_name = f"layers.{layer}.{dense_h_to_4h_2_name}"
dense_h_to_4h_2_weight = params_dict[dense_h_to_4h_2_layer_name]
dense_h_to_4h_name = 'mlp.dense_h_to_4h.weight'
dense_h_to_4h_layer_name = f"layers.{layer}.{dense_h_to_4h_name}"
params_dict[dense_h_to_4h_layer_name] = torch.cat(
[dense_h_to_4h_1_weight, dense_h_to_4h_2_weight], dim=0)
Step2: 獲取需要擴(kuò)充的詞表
if [ $PR = fp16 ]; then
pr_options="
--fp16"
elif [ $PR = bf16 ]; then
pr_options="
--bf16"
elif [ $PR = fp8 ]; then
pr_options="
--bf16
--fp8-hybrid
--fp8-amax-compute-algo max
--fp8-amax-history-len 1024
--transformer-impl transformer_engine"
fi
cd /mnt/workspace/
mkdir llama2-ckpts
cd llama2-ckpts
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/
models/pai-megatron-patch/llama2-ckpts/Llama-2-7b-hf.tgz
tar -zxf Llama-2-7b-hf.tgz
mv Llama-2-7b-hf llama2-7b-hf
cd /mnt/workspace/PAI-Megatron-Patch/toolkits/model_checkpoints_convertor/llama
sh model_convertor.sh
/root/Megatron-LM-23.04
/mnt/workspace/llama2-ckpts/llama2-7b-hf
/mnt/workspace/llama2-ckpts/llama2-7b-hf-to-megatron-tp1-pp1
1
1
llama-7b
0
false
Step3: 詞表擴(kuò)充
注意設(shè)置正確的數(shù)據(jù)集掛載路徑WORK_DIR以及運(yùn)行環(huán)境ENV,運(yùn)行示例如下所示:
3)有監(jiān)督微調(diào)
ENV=$1 # 運(yùn)行環(huán)境: dlc, dsw
MEGATRON_PATH=$2 # 設(shè)置開源Megatron的代碼路徑
MEGATRON_PATCH_PATH=$3 # 設(shè)置Megatron Patch的代碼路徑
MODEL_SIZE=$4 # 模型結(jié)構(gòu)參數(shù)量級(jí):7B, 13B
BATCH_SIZE=$5 # 每卡訓(xùn)練一次迭代樣本數(shù): 4, 8
GLOBAL_BATCH_SIZE=$6 # 全局batch size
LR=$7 # 學(xué)習(xí)率: 1e-5, 5e-5
MIN_LR=$8 # 最小學(xué)習(xí)率: 1e-6, 5e-6
SEQ_LEN=$9 # 序列長(zhǎng)度
PAD_LEN=${10} # Padding長(zhǎng)度:100
EXTRA_VOCAB_SIZE=${11} # 詞表擴(kuò)充大小
PR=${12} # 訓(xùn)練精度: fp16, bf16
TP=${13} # 模型并行度
PP=${14} # 流水并行度
AC=${15} # 激活檢查點(diǎn)模式: sel, full
DO=${16} # 是否使用Megatron版Zero-1降顯存優(yōu)化器: true, false
FL=${17} # 是否使用Flash Attention: true, false
SP=${18} # 是否使用序列并行: true, false
SAVE_INTERVAL=${19} # 保存ckpt的間隔
DATASET_PATH=${20} # 訓(xùn)練數(shù)據(jù)集路徑
PRETRAIN_CHECKPOINT_PATH=${21} # 預(yù)訓(xùn)練模型路徑
TRAIN_TOKENS=${22} # 訓(xùn)練token數(shù)
WARMUP_TOKENS=${23} # 預(yù)熱t(yī)oken數(shù)
OUTPUT_BASEPATH=${24} # 訓(xùn)練輸出文件路徑
export WORK_DIR=/mnt/workspace
cd ${WORK_DIR}/PAI-Megatron-Patch/examples/llama2
bash run_pretrain_megatron_llama.sh
dlc
/root/Megatron-LM-23.04
${WORK_DIR}/PAI-Megatron-Patch
7B
1
16
1e-5
1e-6
2048
80
0
fp16
1
1
sel
true
false
false
100000
${WORK_DIR}/llama2-datasets/wudao/wudao_llamabpe_text_document
${WORK_DIR}/llama2-ckpts/llama2-7b-hf-to-megatron-tp1-pp1
100000000
10000
${WORK_DIR}/output_megatron_llama2/
在微調(diào)開始之前,請(qǐng)先進(jìn)入
https://github.com/alibaba/Pai-Megatron-Patch/blob/main/toolkits/pretrain_data_preprocessing/README.md
獲取json文件。運(yùn)行run_finetune_megatron_llama.sh腳本,需要傳入的參數(shù)列表如下:
ENV=$1 # 運(yùn)行環(huán)境: dlc, dsw
MEGATRON_PATH=$2 # 設(shè)置開源Megatron的代碼路徑
MEGATRON_PATCH_PATH=$3 # 設(shè)置Megatron Patch的代碼路徑
MODEL_SIZE=$4 # 模型結(jié)構(gòu)參數(shù)量級(jí): 7B, 13B
BATCH_SIZE=$5 # 每卡訓(xùn)練一次迭代樣本數(shù): 4, 8
LR=$6 # 學(xué)習(xí)率: 1e-5, 5e-5
MIN_LR=$7 # 最小學(xué)習(xí)率: 1e-6, 5e-6
SEQ_LEN=$8 # 序列長(zhǎng)度
PAD_LEN=$9 # Padding長(zhǎng)度:100
EXTRA_VOCAB_SIZE=${10} # 詞表擴(kuò)充大小
PR=${11} # 訓(xùn)練精度: fp16, bf16
TP=${12} # 模型并行度
PP=${13} # 流水并行度
AC=${14} # 激活檢查點(diǎn)模式: sel, full
DO=${15} # 是否使用Megatron版Zero-1降顯存優(yōu)化器: true, false
FL=${16} # 是否使用Flash Attention: true, false
SP=${17} # 是否使用序列并行: true, false
TRAIN_DATASET_PATH=${18} # 訓(xùn)練數(shù)據(jù)集路徑
VALID_DATASET_PATH=${19} # 驗(yàn)證數(shù)據(jù)集路徑
PRETRAIN_CHECKPOINT_PATH=${20} # 預(yù)訓(xùn)練模型路徑
EPOCH=${21} # 訓(xùn)練迭代輪次
OUTPUT_BASEPATH=${22} # 訓(xùn)練輸出文件路徑
export WORK_DIR=/mnt/workspace
cd ${WORK_DIR}/PAI-Megatron-Patch/examples/llama2
sh run_finetune_megatron_llama.sh
dlc
/root/Megatron-LM-23.04
${WORK_DIR}/PAI-Megatron-Patch
7B
1
1e-5
1e-6
2048
80
0
fp16
1
1
sel
true
false
false
${WORK_DIR}/llama2-datasets/wudao_train.json
${WORK_DIR}/llama2-datasets/wudao_valid.json
${WORK_DIR}/llama2-ckpts/llama2-7b-hf-to-megatron-tp1-pp1
2
${WORK_DIR}/output_megatron_llama2/
ENV=$1 # 運(yùn)行環(huán)境: dlc, dsw
MEGATRON_PATH=$2 # 設(shè)置開源Megatron的代碼路徑
MEGATRON_PATCH_PATH=$3 # 設(shè)置Megatron Patch的代碼路徑
CHECKPOINT_PATH=$4 # 模型微調(diào)階段的模型保存路徑
MODEL_SIZE=$5 # 模型結(jié)構(gòu)參數(shù)量級(jí): 1.1B, 1.7B, 7.1B
TP=$6 # 模型并行度
BS=$7 # 每卡推理一次迭代樣本數(shù): 1, 4, 8
SEQ_LEN=$8 # 序列長(zhǎng)度: 256, 512, 1024
PAD_LEN=$9 # PAD長(zhǎng)度:需要將文本拼接到的長(zhǎng)度
EXTRA_VOCAB_SIZE=${10} # 模型轉(zhuǎn)換時(shí)增加的token數(shù)量
PR=${11} # 推理采用的精度: fp16, bf16
TOP_K=${12} # 采樣策略中選擇排在前面的候選詞數(shù)量(0-n): 0, 5, 10, 20
INPUT_SEQ_LEN=${13} # 輸入序列長(zhǎng)度: 512
OUTPUT_SEQ_LEN=${14} # 輸出序列長(zhǎng)度: 256
INPUT_FILE=${15} # 需要推理的文本文件: input.txt, 每行為一個(gè)樣本
OUTPUT_FILE=${16} # 推理輸出的文件: output.txt
# TOP_K和TOP_P必須有一個(gè)為0
TOP_P=${17} # 采樣策略中選擇排在前面的候選詞百分比(0-1): 0, 0.85, 0.95
TEMPERATURE=${18} # 采樣策略中溫度懲罰: 1-n
REPETITION_PENALTY=${19} # 避免生成是產(chǎn)生大量重復(fù),可以設(shè)置為(1-2)默認(rèn)為1.2
此處提供一個(gè)離線推理輸出的文件,推理的數(shù)據(jù)組織形式需要與微調(diào)時(shí)的保持一致。
https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/
pai-megatron-patch/llama2-datasets/pred_input.jsonl
以下有監(jiān)督微調(diào)過(guò)程保存模型的推理代碼,需要將run_text_generation_megatron_llama.sh腳本中CUDA_VISIBLE_DEVICES參數(shù)設(shè)置為0;GPUS_PER_NODE參數(shù)設(shè)置為1;同時(shí)使用下列代碼進(jìn)行推理。此時(shí)使用單卡進(jìn)行推理。注意:此處模型tp為1,可使用單卡推理;如果tp>1,則需使用相應(yīng)卡數(shù)進(jìn)行推理。
一般來(lái)說(shuō),SFT微調(diào)過(guò)的模型在對(duì)話場(chǎng)景已經(jīng)會(huì)有不錯(cuò)的表現(xiàn)了。如果想進(jìn)一步提升模型效果,可以再加上RLHF訓(xùn)練。包括獎(jiǎng)勵(lì)模型(Reward Model)的訓(xùn)練和強(qiáng)化學(xué)習(xí)(PPO)的訓(xùn)練。這里展示了如何使用當(dāng)前最常用的RLHF開源代碼框架,DeepSpeed-Chat和trlx,來(lái)進(jìn)行獎(jiǎng)勵(lì)函數(shù)訓(xùn)練(RM),以及強(qiáng)化學(xué)習(xí)優(yōu)化(PPO)。
export WORK_DIR=/mnt/workspace
cd ${WORK_DIR}/PAI-Megatron-Patch/examples/llama2
bash run_text_generation_megatron_llama.sh
dsw
/root/Megatron-LM-23.04
${WORK_DIR}/PAI-Megatron-Patch
../../../llama2-train
7B
1
1
1024
1024
0
fp16
10
512
512
${WORK_DIR}/pred_input.jsonl
${WORK_DIR}/llama2_pred.txt
0
1.0
1.2
cd PAI-Megatron-Patch/toolkits/model_checkpoints_convertor/gpt3_llama
bash model_convertor.sh
/path/to/Megatron-LM
/path/to/megatron_llama2_ckpt
/path/to/hf_llama2_ckpt
1
1
llama-7b
0
true
cd PAI-Megatron-Patch/toolkits/model_checkpoints_convertor/bloom
bash model_convertor_huggingface_megatron.sh
/path/to/Megatron-LM
/path/to/megatron_bloom_ckpt
/path/to/hf_bloom_ckpt
1
1
true
下載安裝開源社區(qū)DeepSpeed-Chat源代碼:
基于GPT-J模型訓(xùn)練獎(jiǎng)勵(lì)模型(RM):
開源生態(tài)——構(gòu)想和未來(lái)
在PAI-Megatron-Patch的開發(fā)過(guò)程中,我們圍繞中文大模型訓(xùn)練加速落地沉淀了以下幾個(gè)方面的內(nèi)容:
cd PAI-Megatron-Patch/rlhf/deepspeed-chat
git clone https://github.com/microsoft/DeepSpeedExamples.git
cp -f rm_main.py DeepSpeedExamples/applications/DeepSpeed-Chat/training/
step2_reward_model_finetuning/main.py
cp -f utils.py DeepSpeedExamples/applications/DeepSpeed-Chat/training/
utils/utils.py
cd DeepSpeedExamples/applications/DeepSpeed-Chat/
pip install -r requirements.txt
cd training/step2_reward_model_finetuning/ && bash training_scripts/
llama2/run_llama2_7b.sh
cd training/step3_rlhf_finetuning/ && bash training_scripts/llama2/run_llama2_7b_lora.sh
cd PAI-Megatron-Patch/rlhf/trlx
git clone https://github.com/CarperAI/trlx.git
cp trlx_bloom_rlhf.py trlx_bloom_rlhf_test.py trlx/examples/summarize_rlhf/
cp train_reward_model_bloom.py reward_model_bloom.py ds_config_bloom.json trlx/
examples/summarize_rlhf/reward_model/
cp -f ds_config_trlx_gptj_summarize.json trlx/examples/summarize_rlhf/configs/
cd trlx
pip install -e .
cd examples/summarize_rlhf/reward_model/ && deepspeed train_reward_model_bloom.py
cd examples/summarize_rlhf/reward_model/ && deepspeed train_reward_model_gptj.py
cd examples/summarize_rlhf/ && accelerate launch --config_file configs/
default_accelerate_config.yaml trlx_bloom_rlhf.py
cd examples/summarize_rlhf/ && accelerate launch --config_file configs/
default_accelerate_config.yaml trlx_gptj_text_summarization.py
cd examples/summarize_rlhf/ && accelerate launch --config_file configs/
default_accelerate_config.yaml trlx_bloom_rlhf_test.py
Huggingface的模型權(quán)重?zé)o損轉(zhuǎn)換成Megatron或者Transformer Engine可讀的模型權(quán)重。
H800集群開啟FP8混合精度訓(xùn)練確保收斂。
LLM大模型在PAI靈駿智算平臺(tái)上的最佳實(shí)踐。
強(qiáng)化學(xué)習(xí)技術(shù)在PAI靈駿智算平臺(tái)上的最佳實(shí)踐。
[1]. Attention Is All You Need
[7]. Llama 2: Open Foundation and Fine-Tuned Chat Models
[8]. Benchmarking Large Language Models on NVIDIA H100 GPUs with CoreWeave