文档

Llama-3开源模型全托管灵骏最佳实践

更新时间:

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、gu7ef

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

    TP1、PP1

    70B

    (4*8)*gu7xf、gu7ef

    6*V100-32G、2*gu7xf

    TP8、PP2

  • 已创建阿里云文件存储(通用型NAS)类型的数据集,用于存储训练所需的文件和结果文件。默认挂载路径配置为/mnt/data/nas。具体操作,请参见创建及管理数据集

  • 已创建DSW实例,其中关键参数配置如下。具体操作,请参见创建DSW实例

    • 资源配额:选择已创建的灵骏智算资源的资源配额,并配置以下参数:

      • CPU(核数):90。

      • 内存(GB):1024。

      • 共享内存(GB):1024。

      • GPU(卡数):至少为8。

    • 存储配置:单击共享数据集,选择已创建的数据集。挂载路径配置为/mnt/data/nas/

    • 选择镜像:在镜像URL页签,配置镜像为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模型

本案例提供了以下三种下载模型的方式,您可以根据需要选择其中一种。具体操作步骤如下:

  1. 进入PAI-DSW开发环境。

    1. 登录PAI控制台

    2. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。

    3. 在页面左上方,选择使用服务的地域:华北6(乌兰察布)。

    4. 在左侧导航栏,选择模型开发与训练 > 交互式建模(DSW)

    5. 单击目标实例操作列下的打开

  2. 在顶部菜单栏单击Terminal,在该页签中单击创建terminal

  3. 下载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

自行处理数据

您也可以按照以下操作步骤,自行准备预训练数据:

  1. 下载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
  2. 在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
  3. 在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
  4. 制作MMAP格式的预训练数据集。

    MMAP数据是一种预先执行tokenize的数据格式,可以减少训练微调过程中等待数据读入的时间,尤其在处理大规模数据时优势更为突出。具体操作步骤如下:

    1. 在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/
    2. 在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训练。

模型格式转换

  1. 在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/
  2. 在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单机预训练模型

  1. 在Terminal中,打开/mnt/workspace/Pai-Megatron-Patch/Megatron-LM-240405/megatron/training/checkpointing.py文件,手动将718行代码中的strict=strict修改为strict=Falseimage

  2. 在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环境中配置多机多卡的分布式任务。具体操作步骤如下:

  1. 进入新建任务页面。

    1. 登录PAI控制台

    2. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。

    3. 在工作空间页面的左侧导航栏选择模型开发与训练 > 分布式训练(DLC),在分布式训练(DLC)页面中单击新建任务,进入新建任务页面。

  2. 新建任务页面,配置以下关键参数,其他参数取默认配置即可。更多详细内容,请参见创建训练任务

    参数

    描述

    基本信息

    任务名称

    自定义任务名称。本方案配置为: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

  3. 单击确定,页面自动跳转到分布式训练(DLC)页面。当状态变为已成功时,表明训练任务执行成功。

有监督微调模型

先在DSW单机环境中对训练脚本进行调试,调试完成后,您便可以在DLC环境提交多机多卡的分布式训练任务,训练时长取决于您设定的训练迭代次数。任务执行完成后,模型文件将被保至/mnt/workspace/output_megatron_llama3/目录。

  1. 微调模型前,在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
  2. 微调模型。

    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格式。具体操作步骤如下:

  1. 请将开源Huggingface模型路径(/mnt/workspace/llama3-ckpts/Meta-Llama-3-8B/)中的JSON文件(除model.safetensors.index.json外)复制到训练生成的模型路径(位于{OUTPUT_BASEPATH}/checkpoint的下一级目录下,与latest_checkpointed_iteration.txt同级)。

    说明

    命令中的路径需替换为您的实际路径。

  2. 在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:不是。

  3. 请将开源Huggingface模型目录(/mnt/workspace/llama3-ckpts/Meta-Llama-3-8B/)里的config.json文件复制到/mnt/workspace/llama3-ckpts/llama3-8b-mg-to-hf-tp4-pp1/中,以替换同名文件。

  4. 在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格式的模型部署为在线服务,并在实际的生产环境中调用,从而进行推理实践。具体操作步骤如下:

部署模型服务

  1. 进入模型在线服务(EAS)页面。

    1. 登录PAI控制台

    2. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。

    3. 在工作空间页面的左侧导航栏选择模型部署>模型在线服务(EAS),进入模型在线服务(EAS)页面。image

  2. 模型在线服务页面,单击部署服务,在自定义模型部署区域单击自定义部署

  3. 新建服务页面配置以下关键参数,其他参数取默认配置即可。

    参数

    描述

    模型服务信息

    服务名称

    自定义模型服务名称,同地域内唯一。本方案配置为:test_llama3。

    部署方式

    选择镜像部署AI-Web应用

    镜像选择

    选择镜像地址,在本文框中配置镜像地址eas-registry-vpc.cn-wulanchabu.cr.aliyuncs.com/pai-eas/chat-llm-webui:3.0.2-llama3,并选中阅读并同意PAI服务专用协议

    模型配置

    单击填写模型配置,配置模型地址。

    • 选择NAS挂载,并配置以下参数:

      • NAS挂载点:选择创建数据集使用的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、交换机和安全组。

    交换机

    安全组名称

  4. 单击部署

    服务状态变为运行中时,表明服务部署成功。

调用服务

通过WebUI调用模型服务

服务成功部署后,您可以使用WebUI对该服务进行调试操作。具体操作步骤如下:

  1. 在服务列表中,单击目标服务的服务方式列下的查看Web应用image

  2. 在WebUI页面中,进行推理模型推理。image

通过API调用模型服务

当您在WebUI页面调试好问答效果后,您可利用PAI所提供的API接口,将其集成到您的业务系统中。具体操作,请参见如何使用API进行模型推理

相关文档

您也可以通过PAI-快速开始(PAI-QuickStart)部署和微调Llama-3系列模型。详情请参见部署及微调Llama-3系列模型