Meta已开源Llama-3,推出了8B和70B两种参数量的大语言模型。阿里云PAI灵骏智算服务是面向大规模深度学习场景的智算产品,提供一站式的异构计算资源和AI工程化平台。本方案将为您介绍如何使用阿里云PAI灵骏智算服务,以及基于Meta-Llama-3-8B的开源模型和Megatron的训练流程,进行模型微调、离线推理验证,并实现在线服务部署。
前提条件
本方案以Meta-Llama-3-8B模型为例,在开始执行操作前,请确认您已经完成以下准备工作:
已开通PAI(DSW、DLC、EAS)并创建了默认的工作空间。具体操作,请参见开通PAI并创建默认工作空间。
已购买灵骏智算资源并创建资源配额。具体操作,请参见新建资源组并购买灵骏智算资源和灵骏智算资源配额。不同模型参数量支持的资源规格列表如下,请根据您实际使用的模型参数量选择合适的资源,关于灵骏智算资源的节点规格详情,请参见灵骏Serverless版机型定价详情。
模型参数量
全参数训练资源
推理资源(最低)
Megatron训练模型切片
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
已创建阿里云文件存储(通用型NAS)类型的数据集,用于存储训练所需的文件和结果文件。默认挂载路径配置为
/mnt/data/nas
。具体操作,请参见创建及管理数据集。已创建DSW实例,其中关键参数配置如下。具体操作,请参见创建DSW实例。
资源配额:选择已创建的灵骏智算资源的资源配额。
资源规格:配置以下资源规格。
CPU(核数):90。
内存(GiB):1024。
共享内存(GiB):1024。
GPU(卡数):至少为8。
数据集挂载:单击自定义数据集,选择已创建的数据集,并使用默认挂载路径。
镜像:在镜像地址页签,配置镜像为
dsw-registry.cn-wulanchabu.cr.aliyuncs.com/pai/pytorch-training:23.12-gpu-py310-cu123-ubuntu22.04-megatron-patch-llm
。
如果使用RAM用户完成以下相关操作,需要为RAM用户授予DSW、DLC或EAS的操作权限。具体操作,请参见云产品依赖与授权:DSW、云产品依赖与授权:DLC或云产品依赖与授权:EAS。
使用限制
仅支持在华北6(乌兰察布)和新加坡地域使用该最佳实践。
步骤一:准备Llama-3-8B模型
本案例提供了以下三种下载模型的方式,您可以根据需要选择其中一种。具体操作步骤如下:
进入PAI-DSW开发环境。
登录PAI控制台。
在页面左上方,选择使用服务的地域:华北6(乌兰察布)。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。
在左侧导航栏,选择 。
单击目标实例操作列下的打开。
在顶部菜单栏单击Terminal,在该页签中单击创建terminal。
下载Meta-Llama-3-8B模型。
从ModelScope社区下载模型
在DSW的Terminal中执行以下命令下载模型文件。
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社区下载模型
在DSW的Terminal中执行以下命令下载模型文件。
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
说明如果无法访问,您可能需要设置代理后再尝试重新访问。
步骤二:准备预训练数据
建议您在DSW实例中准备预训练数据。本案例以WuDaoCorpora2.0数据集(该数据集仅供研究使用)为例,介绍Megatron-LM训练数据的预处理流程。您可以直接下载PAI已准备好的小规模样本数据,也可以按照以下操作步骤自行准备预训练数据。
使用PAI处理好的小规模样本数据
为了方便您试用该案例,PAI提供了已经处理好的小规模样本数据,您可以在DSW的Terminal中执行以下命令下载样本数据。
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
自行处理数据
您也可以按照以下操作步骤,自行准备预训练数据:
下载WuDaoCorpora2.0开源数据集到
/mnt/workspace/llama3-datasets
工作目录下。本案例将解压后的文件夹命名为wudao_200g。PAI提供了部分样例数据作为示例,您可以在DSW的Terminal中执行以下命令下载并解压数据集。
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中执行以下命令,对Wudao数据执行数据集清洗并进行文件格式转换,最终生成汇总的merged_wudao_cleaned.json文件。
#! /bin/bash set -ex # 请在此处设置原始数据所在路径 data_dir=/mnt/workspace/llama3-datasets/wudao_200g #开始数据清洗流程 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 # 此处与上一节不同,增加了key参数设为text python preprocess_wudao2.py -i ${data_dir} -o ${dataset_dir}/cleaned_wudao_dataset -k text -p 32 # 合并清洗后的数据 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
命令执行完成后,
llama3-datasets
目录的文件结构如下,新增了一个wudao文件夹。llama3-datasets ├── wudao_200g └── wudao └── merged_wudao_cleaned.json
在Terminal中执行以下命令,利用生成的merged_wudao_cleaned.json文件将数据拆分成若干组并进行压缩,以便于后续实现多线程处理。
apt-get update apt-get install zstd # 此处设置分块数为10,如数据处理慢可设置稍大 NUM_PIECE=10 # 对merged_wudao_cleaned.json文件进行处理 mkdir -p ${dataset_dir}/cleaned_zst/ # 查询数据总长度,对数据进行拆分 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/ # 数据压缩 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在执行上述代码后意外关闭,请重新启动Terminal并运行以下命令来清理不必要的文件和目录。
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
命令执行完成后,
llama3-datasets
目录的文件结构如下。新增了一个cleaned_zst
文件夹,每个子文件夹里有10个压缩文件。llama3-datasets ├── wudao_200g ├── wudao └── cleaned_zst ├── 00.jsonl.zst │ ... └── 09.jsonl.zst
制作MMAP格式的预训练数据集。
MMAP数据是一种预先执行tokenize的数据格式,可以减少训练微调过程中等待数据读入的时间,尤其在处理大规模数据时优势更为突出。具体操作步骤如下:
在DSW的Terminal中执行以下命令,将Megatron格式的模型训练工具源代码PAI-Megatron-Patch拷贝至DSW的工作目录
/mnt/workspace/
下。cd /mnt/workspace/ # 通过开源网站获取训练代码。 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中执行以下命令将数据转换成MMAP格式。
命令执行成功后,在
/mnt/workspace/llama3-datasets/wudao
目录下生成.bin
和.idx
文件。# 请在此处设置数据集路径和工作路径。 export dataset_dir=/mnt/workspace/llama3-datasets export WORK_DIR=/mnt/workspace # 分别为训练集、验证集生成mmap格式预训练数据集。 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
其中运行run_make_pretraining_dataset.sh输入的六个启动参数说明如下:
参数
描述
MEGATRON_PATCH_PATH=$1
设置Megatron Patch的代码路径。
input_data_dir=$2
打包后的Wudao数据集的文件夹路径。
tokenizer=$3
指定分词器的类型为llamabpe。
output_data_dir=$4
指定输出的
.bin
和.idx
文件的保存路径。load_dir=$5
tokenizer_config.json文件的路径。
脚本执行完成后,
llama3-datasets
目录的文件结构如下,wudao文件夹里有2个名字相同后缀不同的mmap文件。llama3-datasets ├── wudao_200g └── wudao ├── wudao_llama3bpe_content_document.bin └── wudao_llama3bpe_content_document.idx
步骤三:Megatron训练
您可以按照以下流程进行Megatron训练。
模型格式转换
在DSW的Terminal中执行以下命令,将Megatron格式的模型训练工具源代码PAI-Megatron-Patch拷贝至DSW的工作目录
/mnt/workspace/
下。说明如果您已在前述步骤中执行过该操作,请跳过该步骤。
cd /mnt/workspace/ # 方式一:通过开源网站获取训练代码。 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中执行以下命令,使用PAI提供的模型转换工具,可将HuggingFace格式的模型文件转换为Megatron格式。
# 转换模型 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
其中运行hf2megatron_convertor.sh需要传入的参数说明如下:
参数
描述
MEGATRON_PATH=$1
设置开源Megatron的代码路径。
SOURCE_CKPT_PATH=$2
HuggingFace格式的模型文件路径。
TARGET_CKPT_PATH=$3
转换为Megatron格式模型后保存的路径。
TP=$4
张量切片数量,与训练保持一致。不同参数量下的切片数量不同,在转换模型时需进行针对性修改:
Llama-3-8B:TP1或PP1。
Llama-3-70B:TP8或PP2。
PP=$5
流水切片数量,与训练保持一致。不同参数量下的切片数量不同,在转换模型时需进行针对性修改:
Llama-3-8B:TP1或PP1。
Llama-3-70B:TP8或PP2。
MN=$6
模型名称:llama-3-8b。
EXTRA_VOCAB_SIZE=$7
额外词表大小。
mg2hf=$8
是否为Megatron格式转Huggingface格式,取值如下:
false:不是。
true:是。
预训练模型
先在DSW单机环境中对训练脚本进行调试,调试完成后,您便可以在DLC环境提交多机多卡的分布式训练任务,训练时长取决于您设定的训练Tokens数量。任务执行完成后,模型文件将被保存至/mnt/workspace/output_megatron_llama3/
目录。
DSW单机预训练模型
在Terminal中,打开
/mnt/workspace/Pai-Megatron-Patch/Megatron-LM-240405/megatron/training/checkpointing.py
文件,手动将718行代码中的strict=strict
修改为strict=False
。在Terminal中预训练模型,代码示例如下。
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
其中运行run_pretrain_megatron_llama.sh需要传入的参数说明如下:
参数
描述
ENV=$1
配置运行环境:
dsw
dlc
MEGATRON_PATCH_PATH=$2
设置开源Megatron的代码路径。
MODEL_SIZE=$3
模型结构参数量级:8B、70B。
BATCH_SIZE=$4
每卡训练一次迭代样本数:4或8。
GLOBAL_BATCH_SIZE=$5
全局Batch Size。
LR=$6
学习率:1e-5或5e-5。
MIN_LR=$7
最小学习率:1e-6或5e-6。
SEQ_LEN=$8
序列长度。
PAD_LEN=${9}
Padding长度。
EXTRA_VOCAB_SIZE=${10}
词表扩充大小。
PR=${11}
训练精度:fp16或bf16。
TP=${12}
模型并行度。
PP=${13}
流水并行度。
AC=${14}
激活检查点模式:
full
sel
DO=${15}
是否使用Megatron版Zero-1降显存优化器:
true
false
FL=${16}
是否打开Flash Attention:
true
false
SP=${17}
是否使用序列并行:
true
false
TE=${18}
是否开启Transformer-engine加速技术:
true
false
SAVE_INTERVAL=${19}
保存CheckPoint文件的step间隔。
DATASET_PATH=${20}
训练数据集路径。
PRETRAIN_CHECKPOINT_PATH=${21}
预训练模型路径。
TRAIN_TOKENS=${22}
训练Tokens。
WARMUP_TOKENS=${23}
预热Token数。
OUTPUT_BASEPATH=${24}
训练输出模型文件的路径。
DLC分布式预训练模型
在单机开发调试完成后,您可以在DLC环境中配置多机多卡的分布式任务。具体操作步骤如下:
进入新建任务页面。
登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入DLC。
在分布式训练(DLC)页面,单击新建任务。
在新建任务页面,配置以下关键参数,其他参数取默认配置即可。更多详细内容,请参见创建训练任务。
参数
描述
基本信息
任务名称
自定义任务名称。本方案配置为:test_llama3_dlc。
环境信息
节点镜像
选中镜像地址并在文本框中输入
dsw-registry.cn-wulanchabu.cr.aliyuncs.com/pai/pytorch-training:23.12-gpu-py310-cu123-ubuntu22.04-megatron-patch-llm
。数据集
单击自定义数据集,并配置以下参数:
自定义数据集:选择已创建的NAS类型的数据集。
挂载路径:配置为
/mnt/workspace/
。
启动命令
配置以下命令,其中run_pretrain_megatron_llama.sh脚本输入的启动参数与DSW单机预训练模型一致。
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
资源信息
资源类型
选择灵骏智算。
资源来源
选择资源配额。
资源配额
本方案选择已创建的灵骏智算资源的资源配额。
框架
选择PyTorch。
任务资源
在Worker节点配置以下参数:
节点数量:2,如果需要多机训练,配置节点数量为需要的机器数即可。
GPU(卡数):8
CPU(核数):90,且不能大于96
内存(GiB):1024
共享内存(GiB):1024
单击确定,页面自动跳转到分布式训练(DLC)页面。当状态变为已成功时,表明训练任务执行成功。
有监督微调模型
先在DSW单机环境中对训练脚本进行调试,调试完成后,您便可以在DLC环境提交多机多卡的分布式训练任务,训练时长取决于您设定的训练迭代次数。任务执行完成后,模型文件将被保至/mnt/workspace/output_megatron_llama3/
目录。
微调模型前,在Terminal中执行以下代码下载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
微调模型。
DSW单机微调模型
在Terminal中运行的代码示例如下:
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/
其中运行run_finetune_megatron_llama_withGA.sh需要传入的参数说明如下:
参数
描述
ENV=$1
运行环境:
dlc
dsw
MEGATRON_PATCH_PATH=$2
设置开源Megatron的代码路径。
MODEL_SIZE=$3
模型结构参数量级:8B、70B。
BATCH_SIZE=$4
每卡训练一次迭代样本数:4、8。
GLOBAL_BATCH_SIZE=$5
全局Batch size。
LR=$6
学习率:1e-5、5e-5。
MIN_LR=$7
最小学习率:1e-6、5e-6。
SEQ_LEN=$8
序列长度。
PAD_LEN=$9
Padding序列长度。
EXTRA_VOCAB_SIZE=${10}
词表扩充大小。
PR=${11}
训练精度:fp16、bf16。
TP=${12}
模型并行度。
PP=${13}
流水并行度。
AC=${14}
激活检查点模式:full或sel。
DO=${15}
是否使用Megatron版Zero-1降显存优化器:
true
false
FL=${16}
是否打开Flash Attention:
true
false
SP=${17}
是否使用序列并行:
true
false
TE=${18}
是否开启Transformer-engine加速技术,需H800显卡。
SAVE_INTERVAL=${19}
保存模型的步数。
DATASET_PATH=${20}
训练数据集路径。
VALID_DATASET_PATH=${21}
验证数据集路径。
PRETRAIN_CHECKPOINT_PATH=${22}
预训练模型路径。
TRAIN_ITERS=${23}
训练迭代轮次。
LR_WARMUP_ITERS=${24}
预热Step数。
OUTPUT_BASEPATH=${25}
训练输出模型文件的路径。
DLC分布式微调模型
在DSW单机环境调试完成后,您可以在DLC环境中配置多机多卡分布式任务。提交DLC训练任务时,启动命令配置如下,其他参数配置详情,请参见预训练模型。
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/
其中运行run_finetune_megatron_qwen_withGA.sh需要传入的参数与DSW单机微调模型相同。
步骤四:离线推理模型
为了方便使用HuggingFace或VLLM框架进行离线和在线推理,您需要将已训练好的Megatron格式模型转换为HuggingFace格式。具体操作步骤如下:
请将开源Huggingface模型路径(
/mnt/workspace/llama3-ckpts/Meta-Llama-3-8B/
)中的JSON文件(除model.safetensors.index.json外)复制到训练生成的模型路径(位于{OUTPUT_BASEPATH}/checkpoint
的下一级目录下,与latest_checkpointed_iteration.txt同级)。说明命令中的路径需替换为您的实际路径。
在Terminal中执行以下命令,将训练生成的Megatron格式的模型转换为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
其中运行hf2megatron_convertor.sh脚本需要传入的参数说明如下:
参数
描述
MEGATRON_PATH=$1
设置开源Megatron的代码路径。
SOURCE_CKPT_PATH=$2
训练获得的Megatron格式的模型路径,具体到
iter_*
。例如:${WORK_DIR}/output_megatron_llama3/checkpoint/dsw******/iter_*******
。代码中的${路径}
为${WORK_DIR}/output_megatron_llama/checkpoint/
目录下的文件夹名称(训练时自动创建)。重要请替换为您自己的模型路径。
TARGET_CKPT_PATH=$3
转换为Huggingface格式的模型后保存的路径。
TP=$4
张量切片数量,与训练保持一致。
PP=$5
流水切片数量,与训练保持一致。
MN=$6
模型名称:llama3-8b。
EXTRA_VOCAB_SIZE=$7
额外词表大小。
mg2hf=$8
是否为Megatron格式转Huggingface格式,取值如下:
true:是。
false:不是。
请将开源Huggingface模型目录(/mnt/workspace/llama3-ckpts/Meta-Llama-3-8B/)里的config.json文件复制到
/mnt/workspace/llama3-ckpts/llama3-8b-mg-to-hf-tp4-pp1/
中,以替换同名文件。在Terminal中的任意目录下创建
infer.py
文件,文件内容如下。执行infer.py文件进行模型离线推理,根据推理结果来评估模型效果。#!/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:写一个快速排序算法" 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]))
示例结果如下:
/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:写一个快速排序算法 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:写一个快速排序算法,用于对人类的年龄进行排序。<|im_end|><|end_of_text|>
步骤五:部署及调用在线模型服务
完成离线推理并评估完成模型效果后,您可以将转换为Huggingface格式的模型部署为在线服务,并在实际的生产环境中调用,从而进行推理实践。具体操作步骤如下:
部署模型服务
登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS。
单击部署服务,然后在自定义模型部署区域,单击自定义部署。
在自定义部署页面配置以下关键参数,其他参数取默认配置即可。
参数
描述
基本信息
服务名称
自定义模型服务名称,同地域内唯一。本方案配置为:test_llama3。
环境信息
部署方式
选择镜像部署,并选中开启Web应用。
镜像配置
选择镜像地址,在本文框中配置镜像地址
eas-registry-vpc.cn-wulanchabu.cr.aliyuncs.com/pai-eas/chat-llm-webui:3.0.2-llama3
。模型配置
选择NAS类型的挂载方式,并配置以下参数:
选择文件系统:选择创建数据集使用的NAS文件系统。
文件系统挂载点:选择创建数据集使用的挂载点。
文件系统路径:配置为存放在NAS中的转换后的Huggingface格式模型的路径。本方案配置为
/llama3-ckpts/llama3-8b-mg-to-hf-tp4-pp1
。挂载路径:指定挂载后的路径,本方案配置为:
/llama3-8b
。
运行命令
配置为
python webui/webui_server.py --port=7860 --model-path=/llama3-8b --model-type=llama3
。其中配置的--model-path需要与模型配置中的挂载路径一致。
端口号
配置为7860。
资源部署
资源类型
选择公共资源。
部署资源
本方案以Llama3-8B模型为例,推荐使用实例规格ml.gu7i.c16m60.1-gu30,性价比高。
说明如果当前地域的资源不足,您还可以选择A10(ecs.gn7i-c8g1.2xlarge)类型的资源规格。
额外系统盘
配置为30 GB。
专有网络
专有网络(VPC)
配置好NAS挂载点后,系统将自动匹配与预设的NAS文件系统一致的VPC、交换机和安全组。
交换机
安全组名称
单击部署。
当服务状态变为运行中时,表明服务部署成功。
调用服务
通过WebUI调用模型服务
服务成功部署后,您可以使用WebUI对该服务进行调试操作。具体操作步骤如下:
在服务列表中,单击目标服务的服务方式列下的查看Web应用。
在WebUI页面中,进行推理模型推理。
通过API调用模型服务
当您在WebUI页面调试好问答效果后,您可利用PAI所提供的API接口,将其集成到您的业务系统中。具体操作,请参见如何使用API进行模型推理。
相关文档
您也可以通过PAI-快速开始(PAI-QuickStart)部署和微调Llama-3系列模型。详情请参见部署及微调Llama-3系列模型。