赞
踩
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 |
请在用户自定义镜像栏填写统一镜像地址:
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的实例,如下图所示。有几点需要额外注意:
创建好DSW实例后,点击进入DSW工作空间准备开发
DLC环境可以用来运行多机多卡分布式程序。在LLM的训练过程中,DLC通常用于大模型训练。点击“容器训练”进入DLC概览页,然后创建自己的DLC实例,填写任务名称,选择资源组,填写统一镜像URL的实例,如下图所示:
执行命令里填写运行分布式任务所需的信息(具体命令可见下文),如下图所示:
配置任务资源,然后提交job,注意CPU核数不能大于96。
同时,共享内存应与内存保持一致。
下面分别给出从ModelScope社区,huggingface社区以及OSS对象存储下载Qwen-7B模型的指引:
进入DSW工作空间,安装ModelScope:
- # pip设置全局镜像与相关modelscope包安装
- # pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
- pip install modelscope
Qwen系列模型可通过ModelScope社区下载:https://modelscope.cn/organization/qwen
进入python环境,根据上述列表中的模型名称、版本信息,通过如下代码实现模型下载,以及加载模型、tokenizer:
- # ### 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.0.4')
- # model_dir = snapshot_download('qwen/Qwen-72B')
- # 获取下载路径
- 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
2.用户还可以通过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
3.用户还可以通过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
建议在PAI灵骏智算服务中的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数据集的格式和大小如下截图所示:
我们为Megatron-LM训练准备了数据预处理流程,您可以根据自己的需要选择不同的处理方式。
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
2.利用第一节生成的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
3.制作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/qwen-datasets/alpaca_zh-qwen-train.json
- wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/qwen-datasets/alpaca_zh-qwen-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
前往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} # 词表扩充大小:7B使用85,14B和72B模型填213
- 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 \
- 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环境中配置多机多卡分布式任务。注意设置正确的数据集挂载路径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 \
- 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} # 词表扩充大小:7B使用85,14B和72B模型填213
- 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 \
- 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/
单机开发调试完成后,就可以在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 \
- 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分别进行离线和在线推理。
注意:
参数介绍
- 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和Megatron-LM两种格式的推理链路。
huggingface离线推理,可以参考如下一些链接:
- #!/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]))
对于Megatron-LM训练的模型,可以直接用Megatron-LM框架进行推理。
调试推理脚本
- 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} # 词表扩充大小:7B使用85,14B和72B模型填213
- 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
以下有监督微调过程保存模型的推理代码,需要将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 \
- fp16 \
- 10 \
- 512 \
- 512 \
- ${WORK_DIR}/pred_input.jsonl \
- ${WORK_DIR}/qwen_pred.txt \
- 0 \
- 1.0 \
- 1.2
完成离线推理并评估完模型效果以后,可以用PAI-EAS产品将模拟部署成在线服务。
准备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
注:目前镜像只支持乌兰察布
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:运行命令的端口号应与服务配置的端口号一致
确认信息正确后,点击“部署”。
参考 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应用,即可使用模型服务
本文为阿里云原创内容,未经允许不得转载。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。