Llama-3開源模型全托管靈駿最佳實(shí)踐
Meta已開源Llama-3,推出了8B和70B兩種參數(shù)量的大語言模型。阿里云PAI靈駿智算服務(wù)是面向大規(guī)模深度學(xué)習(xí)場景的智算產(chǎn)品,提供一站式的異構(gòu)計(jì)算資源和AI工程化平臺(tái)。本方案將為您介紹如何使用阿里云PAI靈駿智算服務(wù),以及基于Meta-Llama-3-8B的開源模型和Megatron的訓(xùn)練流程,進(jìn)行模型微調(diào)、離線推理驗(yàn)證,并實(shí)現(xiàn)在線服務(wù)部署。
前提條件
本方案以Meta-Llama-3-8B模型為例,在開始執(zhí)行操作前,請(qǐng)確認(rèn)您已經(jīng)完成以下準(zhǔn)備工作:
已開通PAI(DSW、DLC、EAS)并創(chuàng)建了默認(rèn)的工作空間。具體操作,請(qǐng)參見開通PAI并創(chuàng)建默認(rèn)工作空間。
已購買靈駿智算資源并創(chuàng)建資源配額。具體操作,請(qǐng)參見新建資源組并購買靈駿智算資源和靈駿智算資源配額。不同模型參數(shù)量支持的資源規(guī)格列表如下,請(qǐng)根據(jù)您實(shí)際使用的模型參數(shù)量選擇合適的資源,關(guān)于靈駿智算資源的節(jié)點(diǎn)規(guī)格詳情,請(qǐng)參見靈駿Serverless版機(jī)型定價(jià)詳情。
模型參數(shù)量
全參數(shù)訓(xùn)練資源
推理資源(最低)
Megatron訓(xùn)練模型切片
8B
8卡*gu7xf、8卡*gu7ef
1*V100(32 GB顯存)、1*A10(22 GB顯存)
TP1、PP1
70B
4*8卡*gu7xf、4*8卡*gu7ef
6*V100(32 GB顯存)、2卡*gu7xf
TP8、PP2
已創(chuàng)建阿里云文件存儲(chǔ)(通用型NAS)類型的數(shù)據(jù)集,用于存儲(chǔ)訓(xùn)練所需的文件和結(jié)果文件。默認(rèn)掛載路徑配置為
/mnt/data/nas
。具體操作,請(qǐng)參見創(chuàng)建及管理數(shù)據(jù)集。已創(chuàng)建DSW實(shí)例,其中關(guān)鍵參數(shù)配置如下。具體操作,請(qǐng)參見創(chuàng)建DSW實(shí)例。
資源配額:選擇已創(chuàng)建的靈駿智算資源的資源配額。
資源規(guī)格:配置以下資源規(guī)格。
CPU(核數(shù)):90。
內(nèi)存(GiB):1024。
共享內(nèi)存(GiB):1024。
GPU(卡數(shù)):至少為8。
數(shù)據(jù)集掛載:單擊自定義數(shù)據(jù)集,選擇已創(chuàng)建的數(shù)據(jù)集,并使用默認(rèn)掛載路徑。
鏡像:在鏡像地址頁簽,配置鏡像為
dsw-registry.cn-wulanchabu.cr.aliyuncs.com/pai/pytorch-training:23.12-gpu-py310-cu123-ubuntu22.04-megatron-patch-llm
。
如果使用RAM用戶完成以下相關(guān)操作,需要為RAM用戶授予DSW、DLC或EAS的操作權(quán)限。具體操作,請(qǐng)參見云產(chǎn)品依賴與授權(quán):DSW、云產(chǎn)品依賴與授權(quán):DLC或云產(chǎn)品依賴與授權(quán):EAS。
使用限制
僅支持在華北6(烏蘭察布)和新加坡地域使用該最佳實(shí)踐。
步驟一:準(zhǔn)備Llama-3-8B模型
本案例提供了以下三種下載模型的方式,您可以根據(jù)需要選擇其中一種。具體操作步驟如下:
進(jìn)入PAI-DSW開發(fā)環(huán)境。
登錄PAI控制臺(tái)。
在頁面左上方,選擇使用服務(wù)的地域:華北6(烏蘭察布)。
在左側(cè)導(dǎo)航欄單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進(jìn)入對(duì)應(yīng)工作空間內(nèi)。
在左側(cè)導(dǎo)航欄,選擇 。
單擊目標(biāo)實(shí)例操作列下的打開。
在頂部菜單欄單擊Terminal,在該頁簽中單擊創(chuàng)建terminal。
下載Meta-Llama-3-8B模型。
從ModelScope社區(qū)下載模型
在DSW的Terminal中執(zhí)行以下命令下載模型文件。
mkdir /mnt/workspace/llama3-ckpts cd /mnt/workspace/llama3-ckpts git clone https://www.modelscope.cn/LLM-Research/Meta-Llama-3-8B.git cd Meta-Llama-3-8B rm -rf .git
從Huggingface社區(qū)下載模型
在DSW的Terminal中執(zhí)行以下命令下載模型文件。
mkdir /mnt/workspace/llama3-ckpts cd /mnt/workspace/llama3-ckpts git clone https://huggingface.co/meta-llama/Meta-Llama-3-8B cd Meta-Llama-3-8B rm -rf .git
說明如果無法訪問,您可能需要設(shè)置代理后再嘗試重新訪問。
步驟二:準(zhǔn)備預(yù)訓(xùn)練數(shù)據(jù)
建議您在DSW實(shí)例中準(zhǔn)備預(yù)訓(xùn)練數(shù)據(jù)。本案例以WuDaoCorpora2.0數(shù)據(jù)集(該數(shù)據(jù)集僅供研究使用)為例,介紹Megatron-LM訓(xùn)練數(shù)據(jù)的預(yù)處理流程。您可以直接下載PAI已準(zhǔn)備好的小規(guī)模樣本數(shù)據(jù),也可以按照以下操作步驟自行準(zhǔn)備預(yù)訓(xùn)練數(shù)據(jù)。
使用PAI處理好的小規(guī)模樣本數(shù)據(jù)
為了方便您試用該案例,PAI提供了已經(jīng)處理好的小規(guī)模樣本數(shù)據(jù),您可以在DSW的Terminal中執(zhí)行以下命令下載樣本數(shù)據(jù)。
mkdir /mnt/workspace/llama3-datasets
cd /mnt/workspace/llama3-datasets
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/alpaca_zh-llama3-train.json
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/alpaca_zh-llama3-valid.json
mkdir -p /mnt/workspace/llama3-datasets/wudao
cd /mnt/workspace/llama3-datasets/wudao
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/wudao_llama3bpe_content_document.bin
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/wudao_llama3bpe_content_document.idx
自行處理數(shù)據(jù)
您也可以按照以下操作步驟,自行準(zhǔn)備預(yù)訓(xùn)練數(shù)據(jù):
下載WuDaoCorpora2.0開源數(shù)據(jù)集到
/mnt/workspace/llama3-datasets
工作目錄下。本案例將解壓后的文件夾命名為wudao_200g。PAI提供了部分樣例數(shù)據(jù)作為示例,您可以在DSW的Terminal中執(zhí)行以下命令下載并解壓數(shù)據(jù)集。
mkdir /mnt/workspace/llama3-datasets cd /mnt/workspace/llama3-datasets wget https://atp-modelzoo.oss-cn-hangzhou.aliyuncs.com/release/datasets/WuDaoCorpus2.0_base_sample.tgz tar zxvf WuDaoCorpus2.0_base_sample.tgz mv WuDaoCorpus2.0_base_sample wudao_200g
在Terminal中執(zhí)行以下命令,對(duì)Wudao數(shù)據(jù)執(zhí)行數(shù)據(jù)集清洗并進(jìn)行文件格式轉(zhuǎn)換,最終生成匯總的merged_wudao_cleaned.json文件。
#! /bin/bash set -ex # 請(qǐng)?jiān)诖颂幵O(shè)置原始數(shù)據(jù)所在路徑 data_dir=/mnt/workspace/llama3-datasets/wudao_200g #開始數(shù)據(jù)清洗流程 dataset_dir=$(dirname $data_dir) mkdir -p ${dataset_dir}/cleaned_wudao_dataset cd ${dataset_dir}/cleaned_wudao_dataset wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama2-codes/preprocess_wudao2.py # 此處與上一節(jié)不同,增加了key參數(shù)設(shè)為text python preprocess_wudao2.py -i ${data_dir} -o ${dataset_dir}/cleaned_wudao_dataset -k text -p 32 # 合并清洗后的數(shù)據(jù) mkdir ${dataset_dir}/wudao cd ${dataset_dir}/wudao find ${dataset_dir}/cleaned_wudao_dataset -name "*.json" -exec cat {} + > ${dataset_dir}/wudao/merged_wudao_cleaned.json rm -rf ${dataset_dir}/cleaned_wudao_dataset
命令執(zhí)行完成后,
llama3-datasets
目錄的文件結(jié)構(gòu)如下,新增了一個(gè)wudao文件夾。llama3-datasets ├── wudao_200g └── wudao └── merged_wudao_cleaned.json
在Terminal中執(zhí)行以下命令,利用生成的merged_wudao_cleaned.json文件將數(shù)據(jù)拆分成若干組并進(jìn)行壓縮,以便于后續(xù)實(shí)現(xiàn)多線程處理。
apt-get update apt-get install zstd # 此處設(shè)置分塊數(shù)為10,如數(shù)據(jù)處理慢可設(shè)置稍大 NUM_PIECE=10 # 對(duì)merged_wudao_cleaned.json文件進(jìn)行處理 mkdir -p ${dataset_dir}/cleaned_zst/ # 查詢數(shù)據(jù)總長度,對(duì)數(shù)據(jù)進(jìn)行拆分 NUM=$(sed -n '$=' ${dataset_dir}/wudao/merged_wudao_cleaned.json) echo "total line of dataset is $NUM, data will be split into $NUM_PIECE pieces for processing" NUM=`expr $NUM / $NUM_PIECE` echo "each group is processing $NUM sample" split_dir=${dataset_dir}/split mkdir $split_dir split -l $NUM --numeric-suffixes --additional-suffix=.jsonl ${dataset_dir}/wudao/merged_wudao_cleaned.json $split_dir/ # 數(shù)據(jù)壓縮 o_path=${dataset_dir}/cleaned_zst/ mkdir -p $o_path files=$(ls $split_dir/*.jsonl) for filename in $files do f=$(basename $filename) zstd -z $filename -o $o_path/$f.zst & done rm -rf $split_dir rm ${dataset_dir}/wudao/merged_wudao_cleaned.json
說明如果Terminal在執(zhí)行上述代碼后意外關(guān)閉,請(qǐng)重新啟動(dòng)Terminal并運(yùn)行以下命令來清理不必要的文件和目錄。
data_dir=/mnt/workspace/llama3-datasets/wudao_200g dataset_dir=$(dirname $data_dir) split_dir=${dataset_dir}/split rm -rf $split_dir rm ${dataset_dir}/wudao/merged_wudao_cleaned.json
命令執(zhí)行完成后,
llama3-datasets
目錄的文件結(jié)構(gòu)如下。新增了一個(gè)cleaned_zst
文件夾,每個(gè)子文件夾里有10個(gè)壓縮文件。llama3-datasets ├── wudao_200g ├── wudao └── cleaned_zst ├── 00.jsonl.zst │ ... └── 09.jsonl.zst
制作MMAP格式的預(yù)訓(xùn)練數(shù)據(jù)集。
MMAP數(shù)據(jù)是一種預(yù)先執(zhí)行tokenize的數(shù)據(jù)格式,可以減少訓(xùn)練微調(diào)過程中等待數(shù)據(jù)讀入的時(shí)間,尤其在處理大規(guī)模數(shù)據(jù)時(shí)優(yōu)勢更為突出。具體操作步驟如下:
在DSW的Terminal中執(zhí)行以下命令,將Megatron格式的模型訓(xùn)練工具源代碼PAI-Megatron-Patch拷貝至DSW的工作目錄
/mnt/workspace/
下。cd /mnt/workspace/ # 通過開源網(wǎng)站獲取訓(xùn)練代碼。 git clone --recurse-submodules https://github.com/alibaba/Pai-Megatron-Patch.git cd Pai-Megatron-Patch pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
在Terminal中執(zhí)行以下命令將數(shù)據(jù)轉(zhuǎn)換成MMAP格式。
命令執(zhí)行成功后,在
/mnt/workspace/llama3-datasets/wudao
目錄下生成.bin
和.idx
文件。# 請(qǐng)?jiān)诖颂幵O(shè)置數(shù)據(jù)集路徑和工作路徑。 export dataset_dir=/mnt/workspace/llama3-datasets export WORK_DIR=/mnt/workspace # 分別為訓(xùn)練集、驗(yàn)證集生成mmap格式預(yù)訓(xùn)練數(shù)據(jù)集。 cd ${WORK_DIR}/Pai-Megatron-Patch/toolkits/pretrain_data_preprocessing bash run_make_pretraining_dataset.sh \ ../.. \ ${dataset_dir}/cleaned_zst/ \ llamabpe \ ${dataset_dir}/wudao/ \ ${WORK_DIR}/llama3-ckpts/Meta-Llama-3-8B rm -rf ${dataset_dir}/cleaned_zst
其中運(yùn)行run_make_pretraining_dataset.sh輸入的六個(gè)啟動(dòng)參數(shù)說明如下:
參數(shù)
描述
MEGATRON_PATCH_PATH=$1
設(shè)置Megatron Patch的代碼路徑。
input_data_dir=$2
打包后的Wudao數(shù)據(jù)集的文件夾路徑。
tokenizer=$3
指定分詞器的類型為llamabpe。
output_data_dir=$4
指定輸出的
.bin
和.idx
文件的保存路徑。load_dir=$5
tokenizer_config.json文件的路徑。
腳本執(zhí)行完成后,
llama3-datasets
目錄的文件結(jié)構(gòu)如下,wudao文件夾里有2個(gè)名字相同后綴不同的mmap文件。llama3-datasets ├── wudao_200g └── wudao ├── wudao_llama3bpe_content_document.bin └── wudao_llama3bpe_content_document.idx
步驟三:Megatron訓(xùn)練
您可以按照以下流程進(jìn)行Megatron訓(xùn)練。
模型格式轉(zhuǎn)換
在DSW的Terminal中執(zhí)行以下命令,將Megatron格式的模型訓(xùn)練工具源代碼PAI-Megatron-Patch拷貝至DSW的工作目錄
/mnt/workspace/
下。說明如果您已在前述步驟中執(zhí)行過該操作,請(qǐng)?zhí)^該步驟。
cd /mnt/workspace/ # 方式一:通過開源網(wǎng)站獲取訓(xùn)練代碼。 git clone --recurse-submodules https://github.com/alibaba/Pai-Megatron-Patch.git cd Pai-Megatron-Patch pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
在Terminal中執(zhí)行以下命令,使用PAI提供的模型轉(zhuǎn)換工具,可將HuggingFace格式的模型文件轉(zhuǎn)換為Megatron格式。
# 轉(zhuǎn)換模型 cd /mnt/workspace/Pai-Megatron-Patch/toolkits/model_checkpoints_convertor/llama sh hf2megatron_convertor.sh \ ../../../ \ /mnt/workspace/llama3-ckpts/Meta-Llama-3-8B \ /mnt/workspace/llama3-ckpts/Meta-Llama-3-8B-to-megatron-tp4-pp1 \ 4 \ 1 \ llama3-8b \ 0 \ false
其中運(yùn)行hf2megatron_convertor.sh需要傳入的參數(shù)說明如下:
參數(shù)
描述
MEGATRON_PATH=$1
設(shè)置開源Megatron的代碼路徑。
SOURCE_CKPT_PATH=$2
HuggingFace格式的模型文件路徑。
TARGET_CKPT_PATH=$3
轉(zhuǎn)換為Megatron格式模型后保存的路徑。
TP=$4
張量切片數(shù)量,與訓(xùn)練保持一致。不同參數(shù)量下的切片數(shù)量不同,在轉(zhuǎn)換模型時(shí)需進(jìn)行針對(duì)性修改:
Llama-3-8B:TP1或PP1。
Llama-3-70B:TP8或PP2。
PP=$5
流水切片數(shù)量,與訓(xùn)練保持一致。不同參數(shù)量下的切片數(shù)量不同,在轉(zhuǎn)換模型時(shí)需進(jìn)行針對(duì)性修改:
Llama-3-8B:TP1或PP1。
Llama-3-70B:TP8或PP2。
MN=$6
模型名稱:llama-3-8b。
EXTRA_VOCAB_SIZE=$7
額外詞表大小。
mg2hf=$8
是否為Megatron格式轉(zhuǎn)Huggingface格式,取值如下:
false:不是。
true:是。
預(yù)訓(xùn)練模型
先在DSW單機(jī)環(huán)境中對(duì)訓(xùn)練腳本進(jìn)行調(diào)試,調(diào)試完成后,您便可以在DLC環(huán)境提交多機(jī)多卡的分布式訓(xùn)練任務(wù),訓(xùn)練時(shí)長取決于您設(shè)定的訓(xùn)練Tokens數(shù)量。任務(wù)執(zhí)行完成后,模型文件將被保存至/mnt/workspace/output_megatron_llama3/
目錄。
DSW單機(jī)預(yù)訓(xùn)練模型
在Terminal中,打開
/mnt/workspace/Pai-Megatron-Patch/Megatron-LM-240405/megatron/training/checkpointing.py
文件,手動(dòng)將718行代碼中的strict=strict
修改為strict=False
。在Terminal中預(yù)訓(xùn)練模型,代碼示例如下。
export WORK_DIR=/mnt/workspace cd ${WORK_DIR}/Pai-Megatron-Patch/examples/llama3 sh run_pretrain_megatron_llama.sh \ dsw \ ../../ \ 8B \ 1 \ 8 \ 1e-5 \ 1e-6 \ 128 \ 128 \ 256 \ bf16 \ 4 \ 1 \ sel \ true \ false \ false \ false \ 100000 \ ${WORK_DIR}/llama3-datasets/wudao/wudao_llama3bpe_content_document \ ${WORK_DIR}/llama3-ckpts/Meta-Llama-3-8B-to-megatron-tp4-pp1 \ 100000000 \ 10000 \ ${WORK_DIR}/output_megatron_llama3
其中運(yùn)行run_pretrain_megatron_llama.sh需要傳入的參數(shù)說明如下:
參數(shù)
描述
ENV=$1
配置運(yùn)行環(huán)境:
dsw
dlc
MEGATRON_PATCH_PATH=$2
設(shè)置開源Megatron的代碼路徑。
MODEL_SIZE=$3
模型結(jié)構(gòu)參數(shù)量級(jí):8B、70B。
BATCH_SIZE=$4
每卡訓(xùn)練一次迭代樣本數(shù):4或8。
GLOBAL_BATCH_SIZE=$5
全局Batch Size。
LR=$6
學(xué)習(xí)率:1e-5或5e-5。
MIN_LR=$7
最小學(xué)習(xí)率:1e-6或5e-6。
SEQ_LEN=$8
序列長度。
PAD_LEN=${9}
Padding長度。
EXTRA_VOCAB_SIZE=${10}
詞表擴(kuò)充大小。
PR=${11}
訓(xùn)練精度:fp16或bf16。
TP=${12}
模型并行度。
PP=${13}
流水并行度。
AC=${14}
激活檢查點(diǎn)模式:
full
sel
DO=${15}
是否使用Megatron版Zero-1降顯存優(yōu)化器:
true
false
FL=${16}
是否打開Flash Attention:
true
false
SP=${17}
是否使用序列并行:
true
false
TE=${18}
是否開啟Transformer-engine加速技術(shù):
true
false
SAVE_INTERVAL=${19}
保存CheckPoint文件的step間隔。
DATASET_PATH=${20}
訓(xùn)練數(shù)據(jù)集路徑。
PRETRAIN_CHECKPOINT_PATH=${21}
預(yù)訓(xùn)練模型路徑。
TRAIN_TOKENS=${22}
訓(xùn)練Tokens。
WARMUP_TOKENS=${23}
預(yù)熱Token數(shù)。
OUTPUT_BASEPATH=${24}
訓(xùn)練輸出模型文件的路徑。
DLC分布式預(yù)訓(xùn)練模型
在單機(jī)開發(fā)調(diào)試完成后,您可以在DLC環(huán)境中配置多機(jī)多卡的分布式任務(wù)。具體操作步驟如下:
進(jìn)入新建任務(wù)頁面。
登錄PAI控制臺(tái),在頁面上方選擇目標(biāo)地域,并在右側(cè)選擇目標(biāo)工作空間,然后單擊進(jìn)入DLC。
在分布式訓(xùn)練(DLC)頁面,單擊新建任務(wù)。
在新建任務(wù)頁面,配置以下關(guān)鍵參數(shù),其他參數(shù)取默認(rèn)配置即可。更多詳細(xì)內(nèi)容,請(qǐng)參見創(chuàng)建訓(xùn)練任務(wù)。
參數(shù)
描述
基本信息
任務(wù)名稱
自定義任務(wù)名稱。本方案配置為:test_llama3_dlc。
環(huán)境信息
節(jié)點(diǎn)鏡像
選中鏡像地址并在文本框中輸入
dsw-registry.cn-wulanchabu.cr.aliyuncs.com/pai/pytorch-training:23.12-gpu-py310-cu123-ubuntu22.04-megatron-patch-llm
。數(shù)據(jù)集
單擊自定義數(shù)據(jù)集,并配置以下參數(shù):
自定義數(shù)據(jù)集:選擇已創(chuàng)建的NAS類型的數(shù)據(jù)集。
掛載路徑:配置為
/mnt/workspace/
。
啟動(dòng)命令
配置以下命令,其中run_pretrain_megatron_llama.sh腳本輸入的啟動(dòng)參數(shù)與DSW單機(jī)預(yù)訓(xùn)練模型一致。
export WORK_DIR=/mnt/workspace cd ${WORK_DIR}/Pai-Megatron-Patch/examples/llama3 sh run_pretrain_megatron_llama.sh \ dlc \ ../../ \ 8B \ 1 \ 8 \ 1e-5 \ 1e-6 \ 128 \ 128 \ 256 \ bf16 \ 4 \ 1 \ sel \ true \ false \ false \ false \ 100000 \ ${WORK_DIR}/llama3-datasets/wudao/wudao_llama3bpe_content_document \ ${WORK_DIR}/llama3-ckpts/Meta-Llama-3-8B-to-megatron-tp4-pp1 \ 100000000 \ 10000 \ ${WORK_DIR}/output_megatron_llama3
資源信息
資源類型
選擇靈駿智算。
資源來源
選擇資源配額。
資源配額
本方案選擇已創(chuàng)建的靈駿智算資源的資源配額。
框架
選擇PyTorch。
任務(wù)資源
在Worker節(jié)點(diǎn)配置以下參數(shù):
節(jié)點(diǎn)數(shù)量:2,如果需要多機(jī)訓(xùn)練,配置節(jié)點(diǎn)數(shù)量為需要的機(jī)器數(shù)即可。
GPU(卡數(shù)):8
CPU(核數(shù)):90,且不能大于96
內(nèi)存(GiB):1024
共享內(nèi)存(GiB):1024
單擊確定,頁面自動(dòng)跳轉(zhuǎn)到分布式訓(xùn)練(DLC)頁面。當(dāng)狀態(tài)變?yōu)?b data-tag="uicontrol" id="9b21d79015jrz" class="uicontrol">已成功時(shí),表明訓(xùn)練任務(wù)執(zhí)行成功。
有監(jiān)督微調(diào)模型
先在DSW單機(jī)環(huán)境中對(duì)訓(xùn)練腳本進(jìn)行調(diào)試,調(diào)試完成后,您便可以在DLC環(huán)境提交多機(jī)多卡的分布式訓(xùn)練任務(wù),訓(xùn)練時(shí)長取決于您設(shè)定的訓(xùn)練迭代次數(shù)。任務(wù)執(zhí)行完成后,模型文件將被保至/mnt/workspace/output_megatron_llama3/
目錄。
微調(diào)模型前,在Terminal中執(zhí)行以下代碼下載JSON文件。
說明如果該JSON文件已在前述步驟中下載,可忽略該步驟。
cd /mnt/workspace/llama3-datasets wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/alpaca_zh-llama3-train.json wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/alpaca_zh-llama3-valid.json
微調(diào)模型。
DSW單機(jī)微調(diào)模型
在Terminal中運(yùn)行的代碼示例如下:
export WORK_DIR=/mnt/workspace cd ${WORK_DIR}/Pai-Megatron-Patch/examples/llama3 sh run_finetune_megatron_llama_withGA.sh \ dsw \ ../../ \ 8B \ 1 \ 32 \ 1e-5 \ 1e-6 \ 128 \ 128 \ 256 \ bf16 \ 4 \ 1 \ sel \ true \ false \ false \ false \ 100 \ ${WORK_DIR}/llama3-datasets/alpaca_zh-llama3-train.json \ ${WORK_DIR}/llama3-datasets/alpaca_zh-llama3-valid.json \ ${WORK_DIR}/llama3-ckpts/Meta-Llama-3-8B-to-megatron-tp4-pp1 \ 1000 \ 10 \ ${WORK_DIR}/output_megatron_llama3/
其中運(yùn)行run_finetune_megatron_llama_withGA.sh需要傳入的參數(shù)說明如下:
參數(shù)
描述
ENV=$1
運(yùn)行環(huán)境:
dlc
dsw
MEGATRON_PATCH_PATH=$2
設(shè)置開源Megatron的代碼路徑。
MODEL_SIZE=$3
模型結(jié)構(gòu)參數(shù)量級(jí):8B、70B。
BATCH_SIZE=$4
每卡訓(xùn)練一次迭代樣本數(shù):4、8。
GLOBAL_BATCH_SIZE=$5
全局Batch size。
LR=$6
學(xué)習(xí)率:1e-5、5e-5。
MIN_LR=$7
最小學(xué)習(xí)率:1e-6、5e-6。
SEQ_LEN=$8
序列長度。
PAD_LEN=$9
Padding序列長度。
EXTRA_VOCAB_SIZE=${10}
詞表擴(kuò)充大小。
PR=${11}
訓(xùn)練精度:fp16、bf16。
TP=${12}
模型并行度。
PP=${13}
流水并行度。
AC=${14}
激活檢查點(diǎn)模式:full或sel。
DO=${15}
是否使用Megatron版Zero-1降顯存優(yōu)化器:
true
false
FL=${16}
是否打開Flash Attention:
true
false
SP=${17}
是否使用序列并行:
true
false
TE=${18}
是否開啟Transformer-engine加速技術(shù),需H800顯卡。
SAVE_INTERVAL=${19}
保存模型的步數(shù)。
DATASET_PATH=${20}
訓(xùn)練數(shù)據(jù)集路徑。
VALID_DATASET_PATH=${21}
驗(yàn)證數(shù)據(jù)集路徑。
PRETRAIN_CHECKPOINT_PATH=${22}
預(yù)訓(xùn)練模型路徑。
TRAIN_ITERS=${23}
訓(xùn)練迭代輪次。
LR_WARMUP_ITERS=${24}
預(yù)熱Step數(shù)。
OUTPUT_BASEPATH=${25}
訓(xùn)練輸出模型文件的路徑。
DLC分布式微調(diào)模型
在DSW單機(jī)環(huán)境調(diào)試完成后,您可以在DLC環(huán)境中配置多機(jī)多卡分布式任務(wù)。提交DLC訓(xùn)練任務(wù)時(shí),啟動(dòng)命令配置如下,其他參數(shù)配置詳情,請(qǐng)參見預(yù)訓(xùn)練模型。
export WORK_DIR=/mnt/workspace cd ${WORK_DIR}/Pai-Megatron-Patch/examples/llama3 sh run_finetune_megatron_llama_withGA.sh \ dlc \ ../../ \ 8B \ 1 \ 32 \ 1e-5 \ 1e-6 \ 128 \ 128 \ 256 \ bf16 \ 4 \ 1 \ sel \ true \ false \ false \ false \ 100 \ ${WORK_DIR}/llama3-datasets/alpaca_zh-llama3-train.json \ ${WORK_DIR}/llama3-datasets/alpaca_zh-llama3-valid.json \ ${WORK_DIR}/llama3-ckpts/Meta-Llama-3-8B-to-megatron-tp4-pp1 \ 1000 \ 10 \ ${WORK_DIR}/output_megatron_llama3/
其中運(yùn)行run_finetune_megatron_qwen_withGA.sh需要傳入的參數(shù)與DSW單機(jī)微調(diào)模型相同。
步驟四:離線推理模型
為了方便使用HuggingFace或VLLM框架進(jìn)行離線和在線推理,您需要將已訓(xùn)練好的Megatron格式模型轉(zhuǎn)換為HuggingFace格式。具體操作步驟如下:
請(qǐng)將開源Huggingface模型路徑(
/mnt/workspace/llama3-ckpts/Meta-Llama-3-8B/
)中的JSON文件(除model.safetensors.index.json外)復(fù)制到訓(xùn)練生成的模型路徑(位于{OUTPUT_BASEPATH}/checkpoint
的下一級(jí)目錄下,與latest_checkpointed_iteration.txt同級(jí))。說明命令中的路徑需替換為您的實(shí)際路徑。
在Terminal中執(zhí)行以下命令,將訓(xùn)練生成的Megatron格式的模型轉(zhuǎn)換為Huggingface格式的模型。
export WORK_DIR=/mnt/workspace cd /mnt/workspace/Pai-Megatron-Patch/toolkits/model_checkpoints_convertor/llama sh hf2megatron_convertor.sh \ ../../.. \ ${WORK_DIR}/output_megatron_llama3/checkpoint/${路徑}/iter_0001000 \ /mnt/workspace/llama3-ckpts/llama3-8b-mg-to-hf-tp4-pp1/ \ 4 \ 1 \ llama3-8b \ 0 \ true
其中運(yùn)行hf2megatron_convertor.sh腳本需要傳入的參數(shù)說明如下:
參數(shù)
描述
MEGATRON_PATH=$1
設(shè)置開源Megatron的代碼路徑。
SOURCE_CKPT_PATH=$2
訓(xùn)練獲得的Megatron格式的模型路徑,具體到
iter_*
。例如:${WORK_DIR}/output_megatron_llama3/checkpoint/dsw******/iter_*******
。代碼中的${路徑}
為${WORK_DIR}/output_megatron_llama/checkpoint/
目錄下的文件夾名稱(訓(xùn)練時(shí)自動(dòng)創(chuàng)建)。重要請(qǐng)?zhí)鎿Q為您自己的模型路徑。
TARGET_CKPT_PATH=$3
轉(zhuǎn)換為Huggingface格式的模型后保存的路徑。
TP=$4
張量切片數(shù)量,與訓(xùn)練保持一致。
PP=$5
流水切片數(shù)量,與訓(xùn)練保持一致。
MN=$6
模型名稱:llama3-8b。
EXTRA_VOCAB_SIZE=$7
額外詞表大小。
mg2hf=$8
是否為Megatron格式轉(zhuǎn)Huggingface格式,取值如下:
true:是。
false:不是。
請(qǐng)將開源Huggingface模型目錄(/mnt/workspace/llama3-ckpts/Meta-Llama-3-8B/)里的config.json文件復(fù)制到
/mnt/workspace/llama3-ckpts/llama3-8b-mg-to-hf-tp4-pp1/
中,以替換同名文件。在Terminal中的任意目錄下創(chuàng)建
infer.py
文件,文件內(nèi)容如下。執(zhí)行infer.py文件進(jìn)行模型離線推理,根據(jù)推理結(jié)果來評(píng)估模型效果。#!/usr/bin/env python #encoding=utf-8 from transformers import AutoTokenizer, LlamaTokenizer from transformers import LlamaForCausalLM import torch from transformers import AutoModelForCausalLM, AutoTokenizer checkpoint = '/mnt/workspace/llama3-ckpts/Meta-Llama-3-8B' print(checkpoint) device = "cuda" tokenizer = AutoTokenizer.from_pretrained(checkpoint, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained(checkpoint,device_map="auto", trust_remote_code=True) prompt = f"Human:寫一個(gè)快速排序算法" print(prompt) inputs = tokenizer.encode(prompt, return_tensors="pt").to(model.device) outputs = model.generate(inputs,max_new_tokens=512) print(tokenizer.decode(outputs[0]))
示例結(jié)果如下:
/mnt/workspace/llama3-ckpts/llama3-8b-mg-to-hf-tp4-pp1 Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained. Loading checkpoint shards: 0%| Loading checkpoint shards: 50%|████████████████████████████████████████████████████████████████████████████████████████████████████████████ Loading checkpoint shards: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:15<00:00, 7.79s/it] Human:寫一個(gè)快速排序算法 The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results. Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation. Human:寫一個(gè)快速排序算法,用于對(duì)人類的年齡進(jìn)行排序。<|im_end|><|end_of_text|>
步驟五:部署及調(diào)用在線模型服務(wù)
完成離線推理并評(píng)估完成模型效果后,您可以將轉(zhuǎn)換為Huggingface格式的模型部署為在線服務(wù),并在實(shí)際的生產(chǎn)環(huán)境中調(diào)用,從而進(jìn)行推理實(shí)踐。具體操作步驟如下:
部署模型服務(wù)
登錄PAI控制臺(tái),在頁面上方選擇目標(biāo)地域,并在右側(cè)選擇目標(biāo)工作空間,然后單擊進(jìn)入EAS。
單擊部署服務(wù),然后在自定義模型部署區(qū)域,單擊自定義部署。
在自定義部署頁面配置以下關(guān)鍵參數(shù),其他參數(shù)取默認(rèn)配置即可。
參數(shù)
描述
基本信息
服務(wù)名稱
自定義模型服務(wù)名稱,同地域內(nèi)唯一。本方案配置為:test_llama3。
環(huán)境信息
部署方式
選擇鏡像部署,并選中開啟Web應(yīng)用。
鏡像配置
選擇鏡像地址,在本文框中配置鏡像地址
eas-registry-vpc.cn-wulanchabu.cr.aliyuncs.com/pai-eas/chat-llm-webui:3.0.2-llama3
。模型配置
選擇NAS類型的掛載方式,并配置以下參數(shù):
選擇文件系統(tǒng):選擇創(chuàng)建數(shù)據(jù)集使用的NAS文件系統(tǒng)。
文件系統(tǒng)掛載點(diǎn):選擇創(chuàng)建數(shù)據(jù)集使用的掛載點(diǎn)。
文件系統(tǒng)路徑:配置為存放在NAS中的轉(zhuǎn)換后的Huggingface格式模型的路徑。本方案配置為
/llama3-ckpts/llama3-8b-mg-to-hf-tp4-pp1
。掛載路徑:指定掛載后的路徑,本方案配置為:
/llama3-8b
。
運(yùn)行命令
配置為
python webui/webui_server.py --port=7860 --model-path=/llama3-8b --model-type=llama3
。其中配置的--model-path需要與模型配置中的掛載路徑一致。
端口號(hào)
配置為7860。
資源部署
資源類型
選擇公共資源。
部署資源
本方案以Llama3-8B模型為例,推薦使用實(shí)例規(guī)格ml.gu7i.c16m60.1-gu30,性價(jià)比高。
說明如果當(dāng)前地域的資源不足,您還可以選擇A10(ecs.gn7i-c8g1.2xlarge)類型的資源規(guī)格。
額外系統(tǒng)盤
配置為30 GB。
專有網(wǎng)絡(luò)
專有網(wǎng)絡(luò)(VPC)
配置好NAS掛載點(diǎn)后,系統(tǒng)將自動(dòng)匹配與預(yù)設(shè)的NAS文件系統(tǒng)一致的VPC、交換機(jī)和安全組。
交換機(jī)
安全組名稱
單擊部署。
當(dāng)服務(wù)狀態(tài)變?yōu)?b data-tag="uicontrol" id="8ac5c8301bdn3" class="uicontrol">運(yùn)行中時(shí),表明服務(wù)部署成功。
調(diào)用服務(wù)
通過WebUI調(diào)用模型服務(wù)
服務(wù)成功部署后,您可以使用WebUI對(duì)該服務(wù)進(jìn)行調(diào)試操作。具體操作步驟如下:
在服務(wù)列表中,單擊目標(biāo)服務(wù)的服務(wù)方式列下的查看Web應(yīng)用。
在WebUI頁面中,進(jìn)行推理模型推理。
通過API調(diào)用模型服務(wù)
當(dāng)您在WebUI頁面調(diào)試好問答效果后,您可利用PAI所提供的API接口,將其集成到您的業(yè)務(wù)系統(tǒng)中。具體操作,請(qǐng)參見如何使用API進(jìn)行模型推理。
相關(guān)文檔
您也可以通過PAI-快速開始(PAI-QuickStart)部署和微調(diào)Llama-3系列模型。詳情請(qǐng)參見部署及微調(diào)Llama-3系列模型。