Meta Llama3.1模型在PAI-Megatron-Patch的最佳实践

阿里云PAI灵骏智算服务是面向大规模深度学习场景的智算产品,提供一站式的异构计算资源和AI工程化平台。本方案将为您介绍如何使用阿里云PAI灵骏智算服务,以及基于Meta-Llama-3.1-8B的开源模型和Megatron的训练流程,进行模型微调、离线推理验证,并实现在线服务部署。

前提条件

本方案以Meta-Llama-3.1-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/pai-megatron-patch:24.07

  • 如果使用RAM用户完成以下相关操作,需要为RAM用户授予DSW、DLCEAS的操作权限。具体操作,请参见云产品依赖与授权:DSW云产品依赖与授权:DLC云产品依赖与授权:EAS

使用限制

仅支持在华北6(乌兰察布)和新加坡地域使用该最佳实践。

步骤一:下载模型训练工具源代码

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

    1. 登录PAI控制台

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

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

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

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

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

  3. Terminal中执行以下命令,下载Pai-Megatron-Patch,并安装训练环境所需依赖。

    cd /mnt/workspace/
    # 方式一:通过开源网站获取训练代码。
    git clone --recurse-submodules https://github.com/alibaba/Pai-Megatron-Patch.git
    cd Pai-Megatron-Patch
    
    # 目前LLama3.1已支持使用FlashAttention-3加速计算,但只能在Hopper架构的GPU卡上进行运算。如果需要在H卡上使用Flash Attention-3,请在DSW上的容器中安装上Flash Attention3并保存镜像。
    pip install "git+https://github.com/Dao-AILab/flash-attention.git#egg=flashattn-hopper&subdirectory=hopper"
    python_path=`python -c "import site; print(site.getsitepackages()[0])"`
    mkdir -p $python_path/flashattn_hopper
    wget -P $python_path/flashattn_hopper https://raw.githubusercontent.com/Dao-AILab/flash-attention/main/hopper/flash_attn_interface.py

步骤二:准备Meta-Llama-3.1-8B模型

DSWTerminal中执行以下命令,下载Meta-Llama-3.1-8B模型。

cd /mnt/workspace
mkdir llama3-ckpts
cd llama3-ckpts
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-ckpts/Meta-Llama-3.1-8B.tgz
tar -zxf Meta-Llama-3.1-8B.tgz

步骤三:准备数据集

DSWTerminal中,执行以下命令,下载PAI已准备好的数据集。

cd /mnt/workspace
mkdir llama3-datasets
cd llama3-datasets
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/mmap_llama3_datasets_text_document.bin
wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/llama3-datasets/mmap_llama3_datasets_text_document.idx

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

步骤四:Megatron-Core训练

您可以按照以下流程进行Megatron-Core训练。在Llama3.1中,PAI已将预训练和微调过程整合到run_mcore_llama3_1.sh脚本,对于不同的使用场景,二者各参数的意义有所不同。

Megatron-Core模型格式转换

Terminal中执行以下命令,使用PAI提供的模型转换工具,可将Checkpoint无损转换成Megatron-Core模型格式,并输出到启动参数(TARGET_CKPT_PATH=$3)配置的目标Checkpoint路径中。

cd /mnt/workspace/Pai-Megatron-Patch/toolkits/model_checkpoints_convertor/llama
bash hf2mcore_convertor_llama3_1.sh \
8B \
/mnt/workspace/llama3-ckpts/Meta-Llama-3.1-8B    \
/mnt/workspace/llama3-ckpts/Meta-Llama-3.1-8B/mcore-tp4-pp2  \
4  \
2  \
false \
true \
false \
bf16

其中运行hf2mcore_convertor_llama3_1.sh脚本需要传入的参数说明如下:

参数

描述

MODEL_SIZE=$1

设置模型参数,取值如下:

  • 8B

  • 70B

  • 405B

SOURCE_CKPT_PATH=$2

Checkpoint路径。

TARGET_CKPT_PATH=$3

目标Checkpoint路径。

TP=$4

模型并行度。

PP=$5

流水并行度。

mg2hf=$6

是否执行mcore2hf转换。

CHECK=$7

测试转换前后模型逐层输出是否一致。

CHECK_ONLY=$8

仅检测模型输出,不进行转换。

PR=$9

精度设置,取值如下:

  • fp16

  • bf16

  • fp32

HF_CKPT_PATH=$10

HFCheckpoint的路径。可选,当mg2hf=true时必须提供。

Megatron-Core预训练

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

DSW单机预训练模型

Terminal中使用以下命令对Meta-Llama-3.1-8B进行预训练,代码示例如下。

cd /mnt/workspace/Pai-Megatron-Patch/examples/llama3_1
sh run_mcore_llama3_1.sh  \
dsw  \
8B   \
1    \
8 \
1e-5   \
1e-6   \
128  \
128  \
bf16  \
4   \
2  \
1 \
true \
true   \
true \
false \
false   \
false \
100000  \
/mnt/workspace/llama3-datasets/mmap_llama3_datasets_text_document   \
/mnt/workspace/llama3-datasets/mmap_llama3_datasets_text_document   \
/mnt/workspace/llama3-ckpts/Meta-Llama-3.1-8B/mcore-tp4-pp2  \
10000  \
100   \
/mnt/workspace/output_mcore_llama3_1

其中运行run_mcore_llama3_1.sh脚本,需要传入的参数列表说明如下:

参数

描述

ENV=$1

配置运行环境:

  • dsw

  • dlc

MODEL_SIZE=$2

模型结构参数量级:8B、70B405B。

BATCH_SIZE=$3

一次迭代一个数据并行内的样本数。

GLOBAL_BATCH_SIZE=$4

一次迭代多个数据并行的总样本数。

LR=$5

学习率。

MIN_LR=$6

最小学习率。

SEQ_LEN=$7

序列长度。

PAD_LEN=$8

Padding长度。

PR=${9}

训练精度:fp16、bf16fp8。

TP=${10}

模型并行度。

PP=${11}

流水并行度。

CP=${12}

上下文并行度。

SP=${13}

是否使用序列并行,取值如下:

  • true

  • false

DO=${14}

是否使用MegatronZero-1降显存优化器,取值如下:

  • true

  • false

FL=${15}

是否优先使用Flash Attention,取值如下:

  • true

  • false

SFT=${16}

是否执行微调,取值如下:

  • true

  • false

AC=${17}

激活检查点模式,取值如下:

  • sel

  • full

  • offload

  • none

    说明

    当取值为offloadfull时,可通过设置MP_AC_LAYERS环境变量,来控制CheckpointingOffloadTransformerLayer层数(默认值:1)。

OPTIMIZER_OFFLOAD=${18}

是否启用Offload optimizer,取值如下:

  • false

  • static

  • auto

SAVE_INTERVAL=${19}

保存CheckPoint文件的间隔。

DATASET_PATH=${20}

训练数据集路径。

VALID_DATASET_PATH=${21}

验证数据集路径。

PRETRAIN_CHECKPOINT_PATH=${22}

预训练模型路径。

TRAIN_TOKENS=${23}

训练TOKEN或者Iter数。

WARMUP_TOKENS=${24}

预热TOKEN或者Iter数。

OUTPUT_BASEPATH=${25}

训练输出日志文件路径。

DLC分布式预训练模型

在单机开发调试完成后,您可以在DLC环境中配置多机多卡的分布式任务。具体操作步骤如下:

  1. 进入新建任务页面。

    1. 登录PAI控制台

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

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

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

    参数

    描述

    基本信息

    任务名称

    自定义任务名称。本方案配置为:test_llama3.1_dlc。

    环境信息

    节点镜像

    选中镜像地址并在文本框中输入dsw-registry.cn-wulanchabu.cr.aliyuncs.com/pai/pai-megatron-patch:24.07

    挂载配置

    单击添加按钮,挂载类型选择自定义数据集,并配置以下参数:

    • 数据集:选择已创建的NAS类型的数据集。

    • 挂载路径:配置为/mnt/workspace/

    启动命令

    配置以下命令,其中run_mcore_llama3_1.sh脚本输入的启动参数与DSW单机预训练模型一致。

    cd /mnt/workspace/Pai-Megatron-Patch/examples/llama3_1
    sh run_mcore_llama3_1.sh  \
    dlc  \
    8B   \
    1    \
    8 \
    1e-5   \
    1e-6   \
    128  \
    128  \
    bf16  \
    4   \
    2  \
    1 \
    true \
    true   \
    true \
    false \
    false   \
    false \
    100000  \
    /mnt/workspace/llama3-datasets/mmap_llama3_datasets_text_document   \
    /mnt/workspace/llama3-datasets/mmap_llama3_datasets_text_document   \
    /mnt/workspace/llama3-ckpts/Meta-Llama-3.1-8B/mcore-tp4-pp2  \
    10000  \
    100   \
    /mnt/workspace/output_mcore_llama3_1

    资源信息

    资源类型

    选择灵骏智算

    资源来源

    选择资源配额

    资源配额

    本方案选择已创建的灵骏智算资源的资源配额。

    框架

    选择PyTorch

    任务资源

    Worker节点配置以下参数:

    • 节点数量:2,如果需要多机训练,配置节点数量为需要的机器数即可。

    • GPU(卡数):8

    • CPU(核数):90,且不能大于96

    • 内存(GiB):1024

    • 共享内存(GiB):1024

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

Megatron-Core指令微调

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

  1. 创建用于微调的idxmap数据集,详情请参见sft_data_preprocessing

  2. 准备好微调数据集后,进行模型微调。

    DSW单机微调模型

    SFT开关设置为true即可进行指令微调。代码示例如下:

    cd /mnt/workspace/Pai-Megatron-Patch/examples/llama3_1
    sh run_mcore_llama3_1.sh  \
    dsw  \
    8B   \
    1    \
    8 \
    1e-5   \
    1e-6   \
    128  \
    128  \
    bf16  \
    4   \
    2  \
    1 \
    true \
    true   \
    true \
    true \
    false   \
    false \
    100000  \
    /mnt/workspace/llama3-datasets/path_to_your_dataset   \
    /mnt/workspace/llama3-datasets/path_to_your_dataset   \
    /path/to/pretraining/checkpoint  \
    10000  \
    100   \
    /workspace/output_mcore_llama3_1

    其中运行run_mcore_llama3_1.sh脚本,需要将启动参数DATASET_PATH=${20}、VALID_DATASET_PATH=${21}和PRETRAIN_CHECKPOINT_PATH=${22}配置的数据集和预训练模型路径替换为您的实际路径,更多参数配置说明,请参见Megatron-Core预训练

    DLC分布式微调模型

    DSW单机环境调试完成后,您可以在DLC环境中配置多机多卡分布式任务。提交DLC训练任务时,启动命令配置如下,其他参数配置详情,请参见Megatron-Core预训练

    cd /mnt/workspace/Pai-Megatron-Patch/examples/llama3_1
    sh run_mcore_llama3_1.sh  \
    dlc  \
    8B   \
    1    \
    8 \
    1e-5   \
    1e-6   \
    128  \
    128  \
    bf16  \
    4   \
    2  \
    1 \
    true \
    true   \
    true \
    true \
    false   \
    false \
    100000  \
    /mnt/workspace/llama3-datasets/path_to_your_dataset   \
    /mnt/workspace/llama3-datasets/path_to_your_dataset   \
    /path/to/pretraining/checkpoint  \
    10000  \
    100   \
    /workspace/output_mcore_llama3_1

    其中运行run_mcore_llama3_1.sh需要传入的参数与DSW单机微调模型相同。

您也可以通过设置MP_DATASET_TYPE环境变量,使用JSON格式的数据集进行指令微调。

DSW单机微调模型

代码示例如下:

export MP_DATASET_TYPE="raw"
cd /mnt/workspace/Pai-Megatron-Patch/examples/llama3_1
sh run_mcore_llama3_1.sh  \
dsw  \
8B   \
1    \
8 \
1e-5   \
1e-6   \
128  \
128  \
bf16  \
4   \
2  \
1 \
true \
true   \
true \
true \
false   \
false \
100000  \
/mnt/workspace/llama3-datasets/alpaca_zh-llama3-train.json   \
/mnt/workspace/llama3-datasets/alpaca_zh-llama3-valid.json   \
/path/to/pretraining/checkpoint  \
10000  \
100   \
/mnt/workspace/output_mcore_llama3_1

其中运行run_mcore_llama3_1.sh脚本,需要将启动参数PRETRAIN_CHECKPOINT_PATH=${22}配置的预训练模型路径替换为您的实际路径,更多参数配置说明,请参见Megatron-Core预训练

DLC分布式微调模型

DSW单机环境调试完成后,您可以在DLC环境中配置多机多卡分布式任务。提交DLC训练任务时,启动命令配置如下,其他参数配置详情,请参见Megatron-Core预训练

export MP_DATASET_TYPE="raw"
cd /mnt/workspace/Pai-Megatron-Patch/examples/llama3_1
sh run_mcore_llama3_1.sh  \
dlc  \
8B   \
1    \
8 \
1e-5   \
1e-6   \
128  \
128  \
bf16  \
4   \
2  \
1 \
true \
true   \
true \
true \
false   \
false \
100000  \
/mnt/workspace/llama3-datasets/alpaca_zh-llama3-train.json   \
/mnt/workspace/llama3-datasets/alpaca_zh-llama3-valid.json   \
/path/to/pretraining/checkpoint  \
10000  \
100   \
/mnt/workspace/output_mcore_llama3_1

其中运行run_mcore_llama3_1.sh需要传入的参数与DSW单机微调模型相同。

步骤五:下游任务评估

您需要将已训练好的Megatron-Core格式模型转换为HuggingFace格式。具体操作步骤如下:

  1. 请将模型路径/mnt/workspace/llama3-ckpts/Meta-Llama-3.1-8B/mcore-tp4-pp2中的JSON文件拷贝至mnt/workspace/output_mcore_llama3_1/checkpoint/pretrain-mcore-llama3-1-8B-****目录下,以保证模型可以正常使用。

    说明

    请替换为您的实际路径。

  2. Terminal中执行以下命令,将训练生成的模型转换成Huggingface格式的模型。

    cd /mnt/workspace/Pai-Megatron-Patch/toolkits/model_checkpoints_convertor/llama
    bash hf2mcore_convertor_llama3_1.sh \
    8B \
    /mnt/workspace/output_mcore_llama3_1/checkpoint/pretrain-mcore-llama3-1-8B-****    \
    /mnt/workspace/llama3-ckpts/Meta-Llama-3.1-8B/hf-from-mg  \
    4  \
    2  \
    true \
    true \
    false \
    bf16 \
    /mnt/workspace/llama3-ckpts/Meta-Llama-3.1-8B

    其中运行hf2mcore_convertor_llama3_1.sh脚本需要传入的参数说明,请参见Megatron-Core模型格式转换

  3. 评估模型效果。

    1. Terminal中执行以下命令,下载评估数据。

      # In container
      cd /workspace
      
      wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/evaluation-datasets/evaluate.tgz 
      wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/evaluation-datasets/cmmlu.tgz 
      wget https://atp-modelzoo-wlcb-pai.oss-cn-wulanchabu.aliyuncs.com/release/models/pai-megatron-patch/evaluation-datasets/ceval.tgz 
      
      tar -xvzf cmmlu.tgz 
      tar -xvzf ceval.tgz 
      tar -xvzf evaluate.tgz
    2. 运行以下命令,对转换后的模型进行评估。

      cd /mnt/workspace/Pai-Megatron-Patch/LM-Evaluation-Harness-240310
      accelerate launch --main_process_port 29051 -m lm_eval \
      --model hf \
      --model_args pretrained=/mnt/workspace/llama3-ckpts/Meta-Llama-3.1-8B/hf-from-mg,trust_remote_code=True \
      --tasks cmmlu,ceval-valid  \
      --batch_size 16

步骤六:部署及调用在线模型服务

完成离线推理并评估完成模型效果后,您可以将转换为Huggingface格式的模型部署为在线服务,并在实际的生产环境中调用,从而进行推理实践。具体操作步骤如下:

部署模型服务

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

    1. 登录PAI控制台

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

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

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

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

    参数

    描述

    模型服务信息

    服务名称

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

    部署方式

    选择镜像部署AI-Web应用

    镜像选择

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

    模型配置

    单击填写模型配置,配置模型地址。挂载类型选择NAS挂载,并配置以下参数:

    • NAS挂载点:选择创建数据集使用的NAS文件系统和挂载点。

    • NAS源路径:配置为存放在NAS中的转换后的Huggingface格式模型的路径。本方案配置为/llama3-ckpts/Meta-Llama-3.1-8B/hf-from-mg

    • 挂载路径:指定挂载后的路径,本方案配置为:/llama3.1-8b

    运行命令

    • 运行命令:配置为python webui/webui_server.py --port=7860 --model-path=/llama3.1-8b --model-type=llama3

      其中配置的--model-path需要与模型配置中的挂载路径一致。

    • 端口号:配置为7860。

    资源部署信息

    资源组种类

    选择公共资源组

    资源配置选择

    本方案以Llama3.1-8B模型为例,推荐使用实例规格ml.gu7i.c16m60.1-gu30,性价比高。

    说明

    如果当前地域的资源不足,您还可以选择A10(ecs.gn7i-c8g1.2xlarge)类型的资源规格。

    专有网络配置

    VPC

    配置好NAS挂载点后,系统将自动匹配与预设的NAS文件系统一致的VPC、交换机和安全组。

    交换机

    安全组名称

  4. 单击部署

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

调用服务

通过WebUI调用模型服务

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

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

  2. WebUI页面中,进行推理模型推理。161c3b229bab5c74f79e21ad2d113204

通过API调用模型服务

当您在WebUI页面调试好问答效果后,您可利用PAI所提供的API接口,将其集成到您的业务系统中。具体操作,请参见通过API调用EAS服务

相关文档

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