文章主题:通义千问, 开源模型, PAI灵骏, 最佳实践

666AI工具大全,助力做AI时代先行者!

通义千问开源模型在PAI灵骏的最佳实践

引言

在12月1日的新闻发布会上,通义千问公司再度发布重大开源消息,至此,该公司已经成功推出了四种不同规模的开源大语言模型,分别是1.8B、7B、14B和72B。此外,阿里云PAI灵骏智算服务也同步亮相,这是一款专为大规模深度学习场景设计的智能计算产品,能够提供一站式异构算力底座和AI工程平台。本次实践将向大家展示如何利用阿里云PAI灵骏智算服务,在通义千问开源模型的基础上,实现高效的分布式预训练、指令微调、模型离线推理验证,以及在線服务部署。

这篇文章将以Qwen-7B作为案例,详细阐述运用Megatron-LM进行训练的过程。在确保模型性能与Hugging Face保持一致的基础上,通过实现数据并行、算子拆分、流水并行、序列并行、选择性激活重算、Zero显存优化、BF16混合精度、梯度检查点、Flashattention等技术的应用,我们可以大幅度提升大模型的分布式训练效能。这些技术同样适用于Qwen-14B和Qwen-72B模型。

资源开通和运行环境配置

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

作为一个人工智能助手,我可以向您推荐阿里云的“帮助”平台,其中包含了关于“智能计算琳琅柱资源”创建和管理的相关指南。通过这些指南,您可以更好地了解如何利用阿里云的智能计算服务,包括创建、配置和管理您的资源,以确保获得最佳的使用体验。

资源和配置推荐

LLM统一镜像

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

在阿里云的注册表中,有一个名为“pai-image-manage-registry”的仓库,其中包含了PyTorch训练的相关依赖。具体而言,这个仓库中有一个名为“pytorch-training”的分支,其版本为1.12-ubuntu20.04-py3.10-cuda11.3-megatron-patch-llm。这个版本的训练框架支持在Ubuntu 20.04上运行,并使用了CUDA 11.3进行加速,同时还包含了一些特定的补丁和LLM(大型语言模型)优化。

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

DSW单机环境是一个强大的工具,能够处理数据并测试单机多卡分布式程序。DSW是灵骏公司自家的交互式代码开发环境,它集成了诸如Jupyter、WebIDE、Terminal等一系列的开发工具,功能强大。在LLM的训练过程中,DSW常被用于处理训练数据,而在接下来的步骤中,我们将详细介绍实际的大模型训练过程(包括预训练、微调等)。首先,点击“交互式建模(DSW)”按钮,进入DSW的概览页面。接着,点击“创建实例”,输入自己的DSW实例名称,并选择相应的资源组。在填写统一镜像URL的实例时,请注意选择合适的实例类型。完成上述操作后,你就可以进入DSW环境,并在其中处理所需的数据集,同时也可以将训练代码保存在同一目录下。此外,为了更好地利用DSW,我们建议你下载Pai-Megatron-Patch代码。这是一款基于Nvidia原生Megatron-LM框架开发的开源大模型实现示例库,提供了主流开源大模型的Megatron-LM实现和训练/推理/评估脚本。具体下载方法可参考本文末尾的相关资料部分。最后,创建DSW实例时,还需要注意以下几点:

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

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

PAI-DLC运行分布式任务配置

DLC环境是一个理想的解决方案,用于运行多机多卡分布式程序。在LLM的训练过程中,DLC经常被用于大型模型的训练。要进入DLC概览页面,您可以点击“容器训练”,接着创建自定义的DLC实例。在创建的过程中,您需要指定任务名称、选择资源组,并输入统一镜像URL的实例。具体操作流程可参考下图所示:

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

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

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

模型准备

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

从ModelScope社区下载模型

进入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:

以下给出了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.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训练准备了数据预处理流程,您可以根据自己的需要选择不同的处理方式。

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

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

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

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/

PAI-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 \ 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/

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 \ 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 (pytorch_model.bin.index.json除外)、.py和.tiktoken文件拷贝至“/mnt/workspace/qwen-ckpts/qwen-7b-mg-to-hf-tp1-pp1”目录下,以保证模型可以正常使用。

模型离线推理

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

HuggingFace推理

huggingface离线推理,可以参考如下一些链接:

Huggingface通用文本生成教学:https://huggingface.co/blog/how-to-generate Belle文本生成示例:https://huggingface.co/BelleGroup/BELLE-7B-2M Qwen文本生成示例:https://huggingface.co/Qwen/Qwen-14B-Chat 以下给出推理参考代码(代码来自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]))

Megatron-LM离线推理

对于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 此处提供一个离线推理输出的文件,推理的数据组织形式需要与微调时的保持一致。 测试样本:

https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama2-datasets/pred_input.jsonl

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

以下有监督微调过程保存模型的推理代码,需要将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服务,了解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使用说明 ,安装并配置后,使用类似如下命令创建服务:

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应用,即可使用模型服务

相关资料

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

原文链接:https://developer.aliyun.com/article/1390677?utm_content=g_1000385835

本文为阿里云原创内容,未经允许不得转载。返回搜狐,查看更多

责任编辑:

AI时代,拥有个人微信机器人AI助手!AI时代不落人后!

免费ChatGPT问答,办公、写作、生活好得力助手!

搜索微信号aigc666aigc999或上边扫码,即可拥有个人AI助手!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注