社区供稿 | 通义千问开源模型在阿里云PAI灵骏的最佳实践

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 通义千问再次宣布重磅开源

引言


12月1日,通义千问再次宣布重磅开源,目前通义千问已推出1.8B、7B、14B、72B 四款不同尺寸的开源大语言模型。阿里云PAI灵骏智算服务,是面向大规模深度学习场景的智算产品,一站式提供异构算力底座及AI工程平台。本实践将展示如何基于阿里云PAI灵骏智算服务,进行通义千问的高效分布式预训练、指令微调、模型离线推理验证以及在线服务部署。


本文将以Qwen-7B为例展示基于Megatron-LM的训练流程,在保证模型效果和Huggingface对齐的前提下,支持了数据并行、算子拆分、流水并行、序列并行、选择性激活重算、Zero显存优化、BF16混合精度、梯度检查点、Flashattention等技术,可以大幅提升大模型分布式训练效率。该流程也适用于Qwen-14B和Qwen-72B模型。


资源开通和运行环境配置


阿里云PAI灵骏智算服务资源开通和管理请参考官网文档

https://help.aliyun.com/zh/pai/user-guide/create-and-manage-intelligent-computing-lingjun-resources


资源和配置推荐

模型参数量

全参数训练资源

推理资源(最低)

Megatron训练模型切片

7B

8*gu7xf、gu7ef

1*V100-32G、1*A10-22G

TP1、PP1

14B

8*gu7xf、gu7ef

2*V100-32G、2*A10-22G

TP2、PP1

72B

(4*8)*gu7xf、gu7ef

6*V100-32G、2*gu7xf

TP8、PP2


LLM统一镜像

请在用户自定义镜像栏填写统一镜像地址:

pai-image-manage-registry.cn-wulanchabu.cr.aliyuncs.com/pai/pytorch-training:1.12-ubuntu20.04-py3.10-cuda11.3-megatron-patch-llm


PAI-DSW单机交互式多人协同开发

DSW单机环境可以用来处理数据并测试单机多卡分布式程序。DSW是灵骏自带的交互式代码开发环境,集成了Jupyter,WebIDE,Terminal等开发工具。在LLM的训练过程中,DSW通常用于训练数据的处理,实际的大模型训练(预训练,微调等)在下一步阐述。点击“交互式建模(DSW)”进入DSW概览页,然后点击“创建实例”创建自己的DSW实例,进入DSW后,打开terminal,在/mnt/workspace/下面处理后续流程所需要的数据集。同时也可以在/mnt/workspace/下面存放训练代码。同时下载PAI-Megatron-Patch代码(注:PAI-Megatron-Patch是基于Nvidia原生Megatron-LM框架开发的开源大模型实现示例库,提供了主流开源大模型的Megatron-LM实现和训练/推理/评估脚本,下载链接见本文末尾的相关资料部分)到工作目录/mnt/workspace/下创建DSW实例,填写实例名称,选择资源组,填写统一镜像URL的实例,如下图所示。有几点需要额外注意:


  • 内存至少需要1024GB
  • CPU核数最大可用是96
  • 共享内存需与内存保持一致
  • GPU卡数至少为8





创建好DSW实例后,点击进入DSW工作空间准备开发



DLC运行分布式任务配置

DLC环境可以用来运行多机多卡分布式程序。在LLM的训练过程中,DLC通常用于大模型训练。点击“容器训练”进入dlc概览页,然后创建自己的dlc实例,填写任务名称,选择资源组,填写统一镜像URL的实例,如下图所示:



执行命令里填写运行分布式任务所需的信息(具体命令可见下文),如下图所示:



配置任务资源,然后提交job,注意CPU核数不能大于96。

同时,共享内存应与内存保持一致。



模型准备

下面分别给出从ModelScope社区,huggingface社区以及OSS对象存储下载Qwen-7b模型的指引:


  1. 从ModelScope社区下载模型

进入dsw工作空间,安装ModelScope:

# pip设置全局镜像与相关modelscope包安装
# pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip install modelscope



Qwen-7b系列模型可通过ModelScope社区下载:

https://modelscope.cn/organization/qwen


进入python环境,根据上述列表中的模型名称、版本信息,通过如下代码实现模型下载,以及加载模型、tokenizer:

  • 以下给出了7B模型的下载代码,14B和72B请参考上述表格中网页上的代码
# ### Loading Model and Tokenizer
from modelscope.hub.snapshot_download import snapshot_download
model_dir = snapshot_download('qwen/Qwen-7B', 'v1.1.4')
# model_dir = snapshot_download('qwen/Qwen-14B', 'v1.1.4')
# 获取下载路径
print(model_dir)
# /root/.cache/modelscope/hub/qwen/Qwen-7B



退出python环境,将下载的ckpt移动到对应文件夹

mkdir -p /mnt/workspace/qwen-ckpts/${后缀为hf的ckpt文件夹}
# mkdir -p /mnt/workspace/qwen-ckpts/qwen-7b-hf
cp -r ${在此处填写获取的模型路径}/* /mnt/workspace/qwen-ckpts/${后缀为hf的ckpt文件夹}
# cp -r /root/.cache/modelscope/hub/qwen/Qwen-7B/* /mnt/workspace/qwen-ckpts/qwen-7b-hf


  1. 用户还可以通过Huggingface来下载Qwen的模型(需要VPN),命令如下所示:
mkdir /mnt/workspace/qwen-ckpts
cd /mnt/workspace/qwen-ckpts
git clone https://huggingface.co/Qwen/Qwen-7B
git clone https://huggingface.co/Qwen/Qwen-7B-Chat
git clone https://huggingface.co/Qwen/Qwen-14B
git clone https://huggingface.co/Qwen/Qwen-14B-Chat
git clone https://huggingface.co/Qwen/Qwen-72B
git clone https://huggingface.co/Qwen/Qwen-72B-Chat



  1. 用户还可以通过wget方式直接下载我们预先放置在oss对象存储系统上的qwen的模型,命令如下所示:
mkdir /mnt/workspace/qwen-ckpts
cd /mnt/workspace/qwen-ckpts
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/qwen-ckpts/qwen-7b-hf-to-mg-tp1-pp1.tgz
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/qwen-ckpts/qwen-7b-hf.tgz


数据准备

建议在灵骏智算平台中的DSW实例中准备预训练数据,以下以中文wudao2.0数据集的准备流程为例,给出数据预处理指引:


下载WuDaoCorpora2.0开源数据集到/mnt/workspace/qwen-datasets工作目录下,我们提供了部分样例数据作为示例,用户可通过以下命令下载和解压:

wget https://atp-modelzoo.oss-cn-hangzhou.aliyuncs.com/release/datasets/WuDaoCorpus2.0_base_sample.tgz
tar zxvf WuDaoCorpus2.0_base_sample.tgz



假设解压后的文件夹命名为wudao_200g,该文件夹中的原始wudao数据集的格式和大小如下截图所示:



我们为MegatronLM训练准备了数据预处理流程,您可以根据自己的需要选择不同的处理方式。


MegatronLM训练数据准备

mmap数据是一种预先执行tokenize处理的数据格式,可以极大减少训练微调过程中等待数据读入的时间,当数据量极大时,优势显著。

  1. 对Wudao数据执行数据集清洗并进行文件格式转换,具体流程可参考如下的bash脚本,最终生成汇总的merged_wudao_cleaned.json。
#! /bin/bash
set -ex
# 请在此处设置原始数据所在路径
data_dir=/mnt/workspace/qwen-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


脚本执行完成后,qwen-datasets内部文件结构如下,新增一个wudao文件夹:

qwen-datasets
├── wudao_200g 
└── wudao
    └── merged_wudao_cleaned.json



  1. 利用第一节生成的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


脚本执行完成后,qwen-datasets内部文件结构如下,新增一个cleaned_zst文件夹,每个子文件夹里有10个压缩文件:

qwen-datasets
├── wudao_200g
├── wudao
└── cleaned_zst
    ├── 00.jsonl.zst
    │   ...
    └── 09.jsonl.zst



  1. 制作MMAP格式预训练数据集。

前往Pai-Megatron-Patch开源网站获取Megatron模型训练工具Pai-Megatron-Patch源代码并拷贝到工作目录/mnt/workspace/下。

# 开源网站获取训练代码
git clone --recurse-submodules https://github.com/alibaba/Pai-Megatron-Patch.git
# wget获取训练代码
https://atp-modelzoo.oss-cn-hangzhou.aliyuncs.com/release/models/Pai-Megatron-Patch.tgz



在DSW的Terminal中进入代码目录:/mnt/workspace/Pai-Megatron-Patch/toolkits/pretrain_data_preprocessing。查看run_make_pretraining_dataset.sh脚本内容。里面有6个启动参数需要在运行时输入,具体参数列表如下:

MEGATRON_PATH=$1                   # 设置开源Megatron的代码路径
MEGATRON_PATCH_PATH=$2             # 设置Megatron Patch的代码路径
input_data_dir=$3                  # 打包后的wudao数据集的文件夹路径
tokenizer=$4                       # qwenbpe
output_data_dir=$5                 # 输出到bin和idx文件目录  
load_dir=$6                        # tokenizer_config.json文件路径



运行示例如下所示:

# 安装qwen依赖的tokenizer库包
pip install tiktoken
# 请在此处设置数据集路径和工作路径
export dataset_dir=/mnt/workspace/qwen-datasets
export WORK_DIR=/mnt/workspace
# 分别为训练集、验证集生成mmap格式预训练数据集
cd ${WORK_DIR}/Pai-Megatron-Patch/toolkits/pretrain_data_preprocessing
bash run_make_pretraining_dataset.sh \
../../Megatron-LM-23.04 \
${WORK_DIR}/Pai-Megatron-Patch/ \
${dataset_dir}/cleaned_zst/ \
qwenbpe \
${dataset_dir}/wudao/ \
${WORK_DIR}/qwen-ckpts/qwen-7b-hf
rm -rf ${dataset_dir}/cleaned_zst



脚本执行完成后,qwen-datasets内部文件结构如下,wudao文件夹里有2个名字相同后缀不同的mmap文件:

qwen-datasets
├── wudao_200g
└── wudao
   ├── wudao_qwenbpe_content_document.bin
   └── wudao_qwenbpe_content_document.idx



小规模预处理数据下载试用

为方便用户试用,我们也提供了已经处理好的小规模数据,可直接下载使用

cd /mnt/workspace/qwen-datasets
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama2-datasets/wudao_train.json
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama2-datasets/wudao_valid.json
mkdir -p /mnt/workspace/qwen-datasets/wudao
cd /mnt/workspace/qwen-datasets/wudao
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/qwen-datasets/wudao_qwenbpe_text_document.bin
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/qwen-datasets/wudao_qwenbpe_text_document.idx



Megatron训练流程


前往Pai-Megatron-Patch开源网站获取Megatron模型训练工具Pai-Megatron-Patch源代码并拷贝到工作目录/mnt/workspace/下。

# 开源网站获取训练代码
git clone --recurse-submodules https://github.com/alibaba/Pai-Megatron-Patch.git
# wget获取训练代码
https://atp-modelzoo.oss-cn-hangzhou.aliyuncs.com/release/models/Pai-Megatron-Patch.tgz


模型格式转换

使用我们提供的模型转换脚本,将huggingface格式的模型文件转换为megatron格式:

MEGATRON_PATH=$1                     # Megatron路径
SOURCE_CKPT_PATH=$2                  # Megatron格式模型路径,具体到iter_*
TARGET_CKPT_PATH=$3                  # 转换为Huggingface格式模型后保存的路径
TP=$4                                # 张量切片数量,与训练保持一致
PP=$5                                # 流水切片数量,与训练保持一致
MN=$6                                # 模型名称:qwen-7b,qwen-14b,qwen-72b
EXTRA_VOCAB_SIZE=$7                  # 额外词表大小
mg2hf=$8                            # 是否为Megatron转Huggingface



以下是不同参数量下模型切片的推荐使用组合,在转换模型时需进行针对性修改:

模型参数量

Megatron训练模型切片

qwen-7b

TP1、PP1

qwen-14b

TP2、PP1

qwen-72b

TP8、PP2


# 获取模型
cd /mnt/workspace/qwen-ckpts
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/qwen-ckpts/qwen-7b-hf.tgz
tar -zxf qwen-7b-hf.tgz
# 转换模型
cd /mnt/workspace/Pai-Megatron-Patch/toolkits/model_checkpoints_convertor/qwen
sh model_convertor.sh \
../../../Megatron-LM-main        \
/mnt/workspace/qwen-ckpts/qwen-7b-hf         \
/mnt/workspace/qwen-ckpts/qwen-7b-hf-to-megatron-tp1-pp1  \
1  \
1  \
qwen-7b \
0 \
false



为方便用户试用,我们也提供了转好格式的模型,可直接下载使用:

cd /mnt/workspace/
mkdir qwen-ckpts
cd qwen-ckpts
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/qwen-ckpts/qwen-7b-hf-to-mg-tp1-pp1.tgz
tar -zxf qwen-7b-hf-to-mg-tp1-pp1.tgz



继续预训练

DSW调试继续预训练脚本

DSW的Terminal中运行run_pretrain_megatron_qwen.sh脚本,需要传入的参数列表如下

ENV=$1                          # 运行环境: dlc, dsw
MEGATRON_PATCH_PATH=$2          # 设置Megatron Patch的代码路径
MODEL_SIZE=$3                   # 模型结构参数量级:7B, 14B, 72B
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长度:100
EXTRA_VOCAB_SIZE=${10}          # 词表扩充大小
PR=${11}                        # 训练精度: fp16, bf16
TP=${12}                        # 模型并行度
PP=${13}                        # 流水并行度
AC=${14}                        # 激活检查点模式: sel, full
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}             # 保存ckpt的间隔
DATASET_PATH=${20}              # 训练数据集路径
PRETRAIN_CHECKPOINT_PATH=${21}  # 预训练模型路径
TRAIN_TOKENS=${22}              # 训练token数
WARMUP_TOKENS=${23}             # 预热token数
OUTPUT_BASEPATH=${24}           # 训练输出文件路径



DSW单机运行示例如下:

注意:EXTRA_VOCAB_SIZE,7B使用85,14B和72B模型使用213

export WORK_DIR=/mnt/workspace
cd ${WORK_DIR}/Pai-Megatron-Patch/examples/qwen
sh run_pretrain_megatron_qwen.sh  \
dsw  \
${WORK_DIR}/Pai-Megatron-Patch  \
7B   \
1    \
8 \
1e-5   \
1e-6   \
2048  \
2048  \
85   \ # 14B和72B模型填213
fp16  \
1   \
1  \
sel  \
true   \
false  \
false   \
false  \
100000  \
${WORK_DIR}/qwen-datasets/wudao/wudao_qwenbpe_content_document   \
${WORK_DIR}/qwen-ckpts/qwen-7b-hf-to-megatron-tp1-pp1   \
100000000   \
10000   \
${WORK_DIR}/output_megatron_qwen/



DLC启动分布式继续预训练任务

单机开发调试完成后,就可以在DLC环境中配置多机多卡分布式任务。注意设置正确的数据集挂载路径WORK_DIR以及运行环境ENV,使用和DSW相同的训练脚本run_pretrain_megatron_qwen.sh来运行

export WORK_DIR=/mnt/workspace
cd ${WORK_DIR}/Pai-Megatron-Patch/examples/qwen
sh run_pretrain_megatron_qwen.sh  \
dlc  \
${WORK_DIR}/PAI-Megatron-Patch  \
7B   \
1    \
8 \
1e-5   \
1e-6   \
2048  \
2048  \
85   \  # 14B和72B模型填213
fp16  \
1   \
1  \
sel  \
true   \
false  \
false   \
false \
100000  \
${WORK_DIR}/qwen-datasets/wudao/wudao_qwenbpe_content_document   \
${WORK_DIR}/qwen-ckpts/qwen-7b-hf-to-megatron-tp1-pp1   \
100000000   \
10000   \
${WORK_DIR}/output_megatron_qwen/



有监督微调

在微调开始之前,请跳转到“小规模预处理数据下载试用”章节获取json文件。


DSW调试微调脚本

DSW的Terminal中运行run_finetune_megatron_qwen_withGA.sh脚本,需要传入的参数列表如下

ENV=$1                          # 运行环境: dlc, dsw
MEGATRON_PATCH_PATH=$2          # 设置Megatron Patch的代码路径
MODEL_SIZE=$3                   # 模型结构参数量级: 7B, 14B, 72B
BATCH_SIZE=$4                   # 每卡训练一次迭代样本数: 1, 2, 4, 8
GLOBAL_BATCH_SIZE=$5            # 微调总迭代样本:64, 96, 128
LR=$6                           # 学习率: 1e-5, 5e-5
MIN_LR=$7                       # 最小学习率: 1e-6, 5e-6
SEQ_LEN=$8                      # 序列长度
PAD_LEN=$9                      # Padding长度:100
EXTRA_VOCAB_SIZE=${10}          # 词表扩充大小
PR=${11}                        # 训练精度: fp16, bf16
TP=${12}                        # 模型并行度
PP=${13}                        # 流水并行度
AC=${14}                        # 激活检查点模式: sel, full
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}            # 学习率增加值最大的步数
OUTPUT_BASEPATH=${25}           # 训练输出文件路径



DSW单机运行示例如下:

注意:EXTRA_VOCAB_SIZE,7B使用85,14B和72B模型使用213

export WORK_DIR=/mnt/workspace
cd ${WORK_DIR}/Pai-Megatron-Patch/examples/qwen
sh run_finetune_megatron_qwen_withGA.sh  \
dsw  \
${WORK_DIR}/Pai-Megatron-Patch  \
7B     \
1      \
96 \
1e-5   \
1e-6   \
2048   \
2048     \
85      \ # 14B和72B模型填213
bf16   \
1      \
1      \
sel    \
true   \
false  \
false  \
false \
1000
${WORK_DIR}/qwen-datasets/wudao_train.json   \
${WORK_DIR}/qwen-datasets/wudao_valid.json   \
${WORK_DIR}/qwen-ckpts/qwen-7b-hf-to-megatron-tp1-pp1   \
2000   \
10 \
${WORK_DIR}/output_megatron_qwen/


PAI-DLC启动分布式微调任务

单机开发调试完成后,就可以在DLC环境中配置多机多卡分布式任务。注意设置正确的数据集挂载路径WORK_DIR以及运行环境ENV,使用和dsw相同的训练脚本run_finetune_megatron_qwen.sh来运行

export WORK_DIR=/mnt/workspace
cd ${WORK_DIR}/Pai-Megatron-Patch/examples/qwen
sh run_finetune_megatron_qwen_withGA.sh  \
dlc  \
${WORK_DIR}/Pai-Megatron-Patch  \
7B     \
1      \
96 \
1e-5   \
1e-6   \
2048   \
2048     \
85      \  # 14B和72B模型填213
bf16   \
1      \
1      \
sel    \
true   \
false  \
false  \
false \
1000
${WORK_DIR}/qwen-datasets/wudao_train.json   \
${WORK_DIR}/qwen-datasets/wudao_valid.json   \
${WORK_DIR}/qwen-ckpts/qwen-7b-hf-to-megatron-tp1-pp1   \
2000   \
10 \
${WORK_DIR}/output_megatron_qwen/


模型格式转换

训练完成的Megatron格式模型可以通过一下脚本转换为huggingface格式模型,方便使用huggingface和VLLM分别进行离线和在线推理。


注意:

  • 路径”为“{路径}”为“{WORK_DIR}/output_megatron_qwen/checkpoint/”目录下文件夹名称(训练时自动创建),如“dlc-pretrain-megatron-gpt3-34B-lr-1e-6-bs-1-seqlen-2048-pr-bf16-tp-8-pp-1-ac-sel-do-true-sp-true-tt--wt-/”


  • 如果使用预训练模型进行转换,需要删除模型路径下所有distrib_optim.pt文件


参数介绍

MEGATRON_PATH=$1                     # Megatron路径
SOURCE_CKPT_PATH=$2                  # Megatron格式模型路径,具体到iter_*
TARGET_CKPT_PATH=$3                  # 转换为Huggingface格式模型后保存的路径
TP=$4                                # 张量切片数量,与训练保持一致
PP=$5                                # 流水切片数量,与训练保持一致
MN=$6                                # 模型名称:qwen-7b, qwen-14b, qwen-72b
EXTRA_VOCAB_SIZE=$7                  # 额外词表大小
mg2hf=$8                            # 是否为Megatron转Huggingface



运行命令

export WORK_DIR=/mnt/workspace
cd /mnt/workspace/Pai-Megatron-Patch/toolkits/model_checkpoints_convertor/qwen
sh model_convertor.sh \
../../../Megatron-LM-main        \
${WORK_DIR}/output_megatron_qwen/checkpoint/${路径}/iter_0001000         \
/mnt/workspace/qwen-ckpts/qwen-7b-mg-to-hf-tp1-pp1  \
1  \
1  \
qwen-7b \
0 \
true



模型和tokenizer文件

  • 将开源Huggingface模型文件夹路径下的.json、.py和.tiktoken文件拷贝至“/mnt/workspace/qwen-ckpts/qwen-7b-mg-to-hf-tp1-pp1”目录下,以保证模型可以正常使用。


模型离线推理


模型训练完成后,可以进行离线推理,评估模型效果。不同参数格式的模型可以使用HuggingFace和MegatronLM两种格式的推理链路。


HuggingFace推理

Huggingface离线推理。可以参考如下一些链接:

以下给出推理参考代码(代码来自Qwen:https://huggingface.co/Qwen/Qwen-14B-Chat):

#!/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/latest/qianwen/qwen-7b-hf'
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(p, return_tensors="pt").to(model.device)
outputs = model.generate(inputs,max_new_tokens=512)
print(tokenizer.decode(outputs[0]))


MegatronLM离线推理

对于MegatronLM训练的模型,可以直接用MegatronLM框架进行推理。

调试推理脚本

ENV=$1                          # 运行环境: dlc, dsw
MEGATRON_PATCH_PATH=$2          # 设置Megatron Patch的代码路径
CHECKPOINT_PATH=$3              # 模型微调阶段的模型保存路径
MODEL_SIZE=$4                   # 模型结构参数量级: 7B, 14B, 72B
TP=$5                           # 模型并行度
BS=$6                           # 每卡推理一次迭代样本数: 1, 4, 8
SEQ_LEN=$7                      # 序列长度: 256, 512, 1024
PAD_LEN=$8                      # PAD长度:需要将文本拼接到的长度
EXTRA_VOCAB_SIZE=${9}          # 模型转换时增加的token数量
PR=${10}                        # 推理采用的精度: fp16, bf16
TOP_K=${11}                     # 采样策略中选择排在前面的候选词数量(0-n): 0, 5, 10, 20
INPUT_SEQ_LEN=${12}             # 输入序列长度: 512
OUTPUT_SEQ_LEN=${13}            # 输出序列长度: 256
INPUT_FILE=${14}                # 需要推理的文本文件: input.txt, 每行为一个样本
OUTPUT_FILE=${15}               # 推理输出的文件: output.txt
# TOP_K和TOP_P必须有一个为0
TOP_P=${16}                     # 采样策略中选择排在前面的候选词百分比(0-1): 0, 0.85, 0.95
TEMPERATURE=${17}               # 采样策略中温度惩罚: 1-n
REPETITION_PENALTY=${18}        # 避免生成是产生大量重复,可以设置为(1-2)默认为1.2



  • 此处提供一个离线推理输出的文件,推理的数据组织形式需要与微调时的保持一致。


  • 注意:
  • 模型保存的路径下缺少tokenizer依赖的文件,需要将微调前模型路径下所有json和tiktoken文件拷贝至保存模型的路径下(位于{OUTPUT_BASEPATH }/checkpoint),与latest_checkpointed_iteration.txt同级。


  1. 以下有监督微调过程保存模型的推理代码,需要将run_text_generation_megatron_qwen.sh脚本中CUDA_VISIBLE_DEVICES参数设置为0;GPUS_PER_NODE参数设置为1;同时使用下列代码进行推理。此时使用单卡进行推理。注意:此处模型tp为1,可使用单卡推理;如果tp>1,则需使用相应卡数进行推理。
export WORK_DIR=/mnt/workspace
cd ${WORK_DIR}/Pai-Megatron-Patch/examples/qwen
bash run_text_generation_megatron_qwen.sh \
dsw \
${WORK_DIR}/PAI-Megatron-Patch \
../../../llama2-train \
7B \
1 \
1 \
1024 \
1024 \
85 \  # 14B和72B模型使用213
fp16 \
10 \
512 \
512 \
${WORK_DIR}/pred_input.jsonl \
${WORK_DIR}/qwen_pred.txt \
0 \
1.0 \
1.2



在线服务部署


完成离线推理并评估完模型效果以后,可以用PAI-EAS产品将模拟部署成在线服务。


准备工作

  • 开通阿里云PAI服务,了解PAI-EAS基本概念;
  • 相同region开通阿里云OSS服务,并创建用于存储模型文件的OSS bucket,将模型文件上传到相应目录;


部署步骤

准备PAI-EAS资源组

在PAI控制台->模型在线服务(EAS)->资源组,新建资源组,并购买合适规格的实例。 以7B参数规模的模型为例,使用fp16数值精度推理情况下,可以使用A10(24GB显存)或者V100(32GB显存)规格的单卡GPU实例进行部署。


部署方式一:使用PAI控制台页面

在PAI控制台->模型在线服务(EAS)->推理服务,选择“部署服务”,在新建服务界面配置如下信息:

  • 服务名称:根据实际需求填写
  • 部署方式:镜像部署服务
  • 镜像选择:镜像地址,例如:
pai-image-manage-registry.cn-wulanchabu.cr.aliyuncs.com/pai/llm-inference:vllm-0.2.1-v4


注:目前镜像只支持乌兰察布

  • 模型配置:选择保持模型文件的OSS路径(例如oss://my_bucket/qwen-7b),并指定挂载后的路径(例如/qwen-7b)
  • 运行命令:


nohup python -m fastchat.serve.controller > tmp1.log 2>&1 & python -m fastchat.serve.gradio_web_server_pai --model-list-mode reload > tmp2.log 2>&1 & python -m fastchat.serve.vllm_worker --model-path /mnt/model/qwen_7b --tensor-parallel-size 1 --trust-remote-code

注1: --tensor-parallel-size指的是模型张量切分的数量,需要根据GPU的卡数调整,7b模型在单卡就可以放下设置1,如72b模型需要4卡A800才可运行需要设置4

注2:运行命令的端口号应与服务配置的端口号一致

  • 资源组种类:选择之前准备的资源组
  • 实例数:根据模型和资源组情况填写(以7b模型为例,可以使用CPU:16,内存:64000MB,GPU:1)

确认信息正确后,点击“部署”。


部署方式二:使用命令行工具eascmd

参考 eascmd使用说明,安装并配置后,使用类似如下命令创建服务:

eascmd64 create ./service.json



配置文件service.json示例:

{
    "name": "qwen_server",  // 服务名称
    "containers": [
        {
            // 镜像和命令
            "image": "pai-image-manage-registry.cn-wulanchabu.cr.aliyuncs.com/pai/llm-inference:vllm-0.2.1-v4",
            "command": "nohup python -m fastchat.serve.controller > tmp1.log 2>&1 & python -m fastchat.serve.gradio_web_server_pai --model-list-mode reload > tmp2.log 2>&1 & python -m fastchat.serve.vllm_worker --model-path /qwen-14b-chat --tensor-parallel-size 1 --trust-remote-code",
            "port": 7860
        }
    ],
    "storage": [
        {
            // 模型地址
            "mount_path": "/qwen-7b",
            "oss": {
                "path": "oss://my-bucket/qwen-7b"
            }
        }
    ],
    "metadata": {
        "instance": 1,
        "memory": 64000, // 内存,单位是 MiB
        "cpu": 16,
        "gpu": 1,
        "enable_webservice": true,
        "resource": "eas-r-xxxxxx" // 资源组ID
    }
}



管理服务

创建服务后,可以通过PAI控制台页面、或者eascmd命令行工具,查看服务状态。 注意:服务启动过程会进行下载镜像、加载模型等操作,需要等待一段时间。 在服务日志中可以看到详细的启动过程记录。


调用服务

点击查看webui应用,即可使用模型服务




相关资料


  1. 通义千问系列模型:https://modelscope.cn/organization/qwen
  2. 阿里云PAI灵骏智算服务:https://www.aliyun.com/product/bigdata/learn/pailingjun
  3. 阿里云PAI灵骏智算服务资源开通和管理文档:https://help.aliyun.com/zh/pai/user-guide/create-and-manage-intelligent-computing-lingjun-resources
  4. PAI-Megatron-Patch 项目开源地址:https://github.com/alibaba/Pai-Megatron-Patch
  5. 阿里云PAI-EAS模型在线服务:https://www.aliyun.com/product/bigdata/learn/eas
  6. eascmd使用文档:https://help.aliyun.com/zh/pai/user-guide/eascmd-client/


原文链接:https://help.aliyun.com/zh/pai/use-cases/train-fine-tune-and-deploy-qwen-by-using-intelligent-computing-lingjun?spm=a2c4g.11186623.0.i1

相关文章
|
16天前
|
JSON 自然语言处理 Serverless
基于阿里云通义千问开发智能写作助手
现代办公中,撰写邮件、会议记录、报告等任务耗费大量时间。一个智能写作助手能显著提升效率,帮助用户快速生成高质量的文本内容。阿里云通义千问作为阿里巴巴推出的强大大语言模型(LLM),具备出色的自然语言理解与生成能力,非常适合用于开发智能写作工具。本博客将介绍如何基于通义千问构建一个智能写作助手,实现高效的内容生成和编辑功能。
48 2
|
21天前
|
人工智能 JSON 算法
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
阿里云的人工智能平台 PAI,作为一站式、 AI Native 的大模型与 AIGC 工程平台,为开发者和企业客户提供了 Qwen2.5-Coder 系列模型的全链路最佳实践。本文以Qwen2.5-Coder-32B为例,详细介绍在 PAI-QuickStart 完成 Qwen2.5-Coder 的训练、评测和快速部署。
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
|
5天前
|
编解码 机器人 测试技术
技术实践 | 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型快速搭建专业领域知识问答机器人
Qwen2-VL是一款具备高级图像和视频理解能力的多模态模型,支持多种语言,适用于多模态应用开发。通过PAI和LLaMA Factory框架,用户可以轻松微调Qwen2-VL模型,快速构建文旅领域的知识问答机器人。本教程详细介绍了从模型部署、微调到对话测试的全过程,帮助开发者高效实现定制化多模态应用。
|
25天前
|
机器学习/深度学习 PyTorch API
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
Transformer架构自2017年被Vaswani等人提出以来,凭借其核心的注意力机制,已成为AI领域的重大突破。该机制允许模型根据任务需求灵活聚焦于输入的不同部分,极大地增强了对复杂语言和结构的理解能力。起初主要应用于自然语言处理,Transformer迅速扩展至语音识别、计算机视觉等多领域,展现出强大的跨学科应用潜力。然而,随着模型规模的增长,注意力层的高计算复杂度成为发展瓶颈。为此,本文探讨了在PyTorch生态系统中优化注意力层的各种技术,
49 6
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
|
14天前
|
机器学习/深度学习 人工智能 算法
人工智能浪潮下的编程实践:构建你的第一个机器学习模型
在人工智能的巨浪中,每个人都有机会成为弄潮儿。本文将带你一探究竟,从零基础开始,用最易懂的语言和步骤,教你如何构建属于自己的第一个机器学习模型。不需要复杂的数学公式,也不必担心编程难题,只需跟随我们的步伐,一起探索这个充满魔力的AI世界。
33 12
|
16天前
|
存储 自然语言处理 关系型数据库
基于阿里云通义千问开发智能客服与问答系统
在企业的数字化转型过程中,智能客服系统已成为提高客户满意度和降低运营成本的重要手段。阿里云的通义千问作为一款强大的大语言模型,具有自然语言理解、对话生成、知识检索等能力,非常适合用来开发智能客服与问答系统。 通过本博客,我们将演示如何基于阿里云的通义千问模型,结合阿里云相关产品如函数计算(FC)、API网关、RDS等,搭建一个功能齐全的智能客服系统。
61 5
|
21天前
|
机器学习/深度学习 Python
机器学习中评估模型性能的重要工具——混淆矩阵和ROC曲线。混淆矩阵通过真正例、假正例等指标展示模型预测情况
本文介绍了机器学习中评估模型性能的重要工具——混淆矩阵和ROC曲线。混淆矩阵通过真正例、假正例等指标展示模型预测情况,而ROC曲线则通过假正率和真正率评估二分类模型性能。文章还提供了Python中的具体实现示例,展示了如何计算和使用这两种工具来评估模型。
41 8
|
16天前
|
自然语言处理 前端开发 Serverless
基于阿里云通义千问开发编程辅助与代码生成工具
随着软件开发需求的增加,编程辅助与代码生成工具成为开发者提高效率的利器。这类工具能够根据用户描述生成代码片段、协助调试、生成自动化脚本等,大大减少重复性劳动。阿里云通义千问作为一款先进的大语言模型,具备强大的自然语言处理和代码生成能力,非常适合用于开发这样的工具。
47 3
|
21天前
|
机器学习/深度学习 Python
机器学习中模型选择和优化的关键技术——交叉验证与网格搜索
本文深入探讨了机器学习中模型选择和优化的关键技术——交叉验证与网格搜索。介绍了K折交叉验证、留一交叉验证等方法,以及网格搜索的原理和步骤,展示了如何结合两者在Python中实现模型参数的优化,并强调了使用时需注意的计算成本、过拟合风险等问题。
41 6
|
24天前
|
机器学习/深度学习 数据采集 算法
从零到一:构建高效机器学习模型的旅程####
在探索技术深度与广度的征途中,我深刻体会到技术创新既在于理论的飞跃,更在于实践的积累。本文将通过一个具体案例,分享我在构建高效机器学习模型过程中的实战经验,包括数据预处理、特征工程、模型选择与优化等关键环节,旨在为读者提供一个从零开始构建并优化机器学习模型的实用指南。 ####

热门文章

最新文章

相关产品

  • 人工智能平台 PAI