PAI-ChatLearn:Alignment on DLC最佳实践

本文为您介绍如何使用PAI-ChatLearnLlama2-7B模型进行Alignment的训练流程。

背景信息

PAI-ChatLearn是一个灵活、易用、高效的大规模Alignment训练框架。支持RLHF(Reinforcement Learning from Human Feedback)、DPO(Direct Preference Optimization)、OnlineDPO、GRPO(Group Relative Policy Optimization)等多种Alignment训练模式,同时也支持您自定义模型的执行流程。您也可以组合使用不同的后端来进行模型建模,例如使用Megatron-LM来进行加速训练,使用vLLM来加速推理。

前提条件

在开始执行操作前,请确认您已经完成以下准备工作:

  • 已创建工作空间,具体操作,请参见创建工作空间

  • 已准备灵骏智算资源的资源配额,本方案使用灵骏智算资源gu7xf机型(例如:资源规格选择ml.gu7xf.c96m1600.8-gu108),关于如何购买灵骏智算资源和创建资源配额,请参见新建资源组并购买灵骏智算资源灵骏智算资源配额

  • 已创建通用型NAS文件系统。具体操作,请参见创建文件系统

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

使用限制

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

  • 灵骏智算资源、NAS文件系统和分布式训练(DLC)任务需要在同一个地域内。

  • 创建灵骏智算资源的资源配额时使用的专有网络需要与通用型NAS文件系统一致。

准备工作

准备代码

  1. 在终端中,执行如下命令下载代码。

    • 下载ChatLearn框架代码:

      git clone https://github.com/alibaba/ChatLearn.git
    • 下载Megatron-LM代码。

      说明

      如果您需要运行基于Megatron-LM框架的Alignment训练程序,则需要下载该代码。

      git clone https://github.com/NVIDIA/Megatron-LM.git
      # 请替换为您的实际路径。
      cd /**/Megatron-LM
      git checkout 5161b1689
  2. 本方案采用以下方法将代码文件上传至NAS文件系统,以便后续进行模型训练。您也可选择您自己的方式上传代码文件至NAS文件系统。

    1. 在函数计算控制台,搭建NAS浏览器应用。具体操作,请参见使用函数计算快速搭建可视化NAS浏览器应用

    2. 将已下载的代码文件按照目录层级上传到通用型NAS文件系统的根目录(/)。具体操作,请参见使用函数计算快速搭建可视化NAS浏览器应用

准备训练数据

请参考数据准备文档,准备好以下ChatLearn训练需要的数据,并将训练数据上传到NAS文件系统中,具体操作,请参见使用函数计算快速搭建可视化NAS浏览器应用

  • 准备SFT训练数据,并上传到NAS/sft目录中。

  • 准备Reward训练数据,并上传到NAS/rm目录中。

  • 准备AignmentRLHF模式的训练数据,并上传到NAS/alignment目录中。

ChatLearn训练

步骤一:SFT微调训练

SFT是指使用有标注的对话数据来微调预训练语言模型的过程。在本方案中,您需要下载预训练的模型,然后开始一个简单的SFT训练示例。具体操作步骤如下:

1.下载和转化预训练模型

  1. 下载预训练Checkpoint。

    您可以使用来自HuggingFace transformers的模型,例如HuggingFace Hub中的Llama2模型meta-llama/Llama-2-7b-hf。您也可以使用本地保存好的SFT模型。本方案使用llama-2-7b-hf

  2. 将已下载的Llama2模型按照目录层级上传到通用型NAS文件系统的根目录/。具体操作,请参见使用函数计算快速搭建可视化NAS浏览器应用

  3. HuggingFace transformers模型转化为Megatron-LM模型格式。

    1. 进入新建任务页面。

      1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入DLC

      2. 在分布式训练(DLC)页面,单击新建任务

    2. 在新建任务页面,配置以下关键参数,其他参数配置详情,请参见创建训练任务

      参数

      描述

      环境信息

      节点镜像

      选中镜像地址,并在文本框中输入registry.cn-wulanchabu.aliyuncs.com/pai-dlc/pytorch-training:2.4.0-gpu-py3.10-cu12.5-ngc24.06-ubuntu22.04

      数据集

      单击自定义数据集,并配置以下参数:

      • 自定义数据集:选择已创建的通用型NAS数据集。

      • 挂载路径:取默认配置/mnt/data/

      启动命令

      配置以下命令:

      export MEGATRON=path-to-megatron-lm
      export CHATLEARN=path-to-chatlearn
      
      cd ${CHATLEARN}/examples/megatron/
      
      TP=$num_of_tp \
      PP=$num_of_pp \
      LOAD_PATH=path-to-hf-model \
      TOKENIZER_MODEL=$LOAD_PATH/tokenizer.model \
      SAVE_PATH=path-to-megatron-model \
      bash scripts/convert_hf_to_megatron.sh

      其中:

      • MEGATRON:是Megatron-LM代码仓库clone存放的位置。本方案配置为/mnt/data/Megatron-LM

      • CHATLEARN:是ChatLearn代码仓库clone存放的位置。本方案配置为/mnt/data/ChatLearn

      • LOAD_PATH:是Llama2模型的存放路径。本方案配置为/mnt/data/llama-2-7b-hf

      • SAVE_PATH:转换后的Megatron-LM格式模型的存储路径。本方案配置为/mnt/data/llama-2-7b-hf-to-megatron

      • TP(tensor_model_parallel_size)和PPpipeline_model_parallel_size)参数配置说明如下:

        • 对于Llama2-7B的模型,系统会将模型转换成 TP=4,PP=1Checkpoint。您需要配置参数为TP=4,PP=1。

        • 对于Llama2-13B的模型,系统会将模型转化成 TP=8,PP=1Checkpoint。您需要配置参数为TP=8,PP=1。

        • 对于Llama2-70B的模型,系统会将模型转化成 TP=8,PP=4Checkpoint。您需要配置参数为TP=8,PP=4。

      资源信息

      资源类型

      选择灵骏智算

      资源来源

      选择资源配额

      资源配额

      选择已创建的资源配额。

      框架

      选择PyTorch

      任务资源

      Worker节点配置以下参数:

      • 节点数量:配置为1。

      • CPU(核数):80。

      • 内存(GiB):800。

      • 共享内存(GiB):800。

      • GPU(卡数):1。

    3. 单击确定

      页面自动跳转到分布式训练(DLC)页面,当任务执行成功后,模型转换成功。

2.开启SFT训练

  1. 进入新建任务页面。

    1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入DLC

    2. 在分布式训练(DLC)页面,单击新建任务

  2. 新建任务页面,配置以下关键参数,其他参数配置详情,请参见创建训练任务

    参数

    描述

    环境信息

    节点镜像

    选中镜像地址,并在文本框中输入registry.cn-wulanchabu.aliyuncs.com/pai-dlc/pytorch-training:2.4.0-gpu-py3.10-cu12.5-ngc24.06-ubuntu22.04

    数据集

    单击自定义数据集,并配置以下参数:

    • 自定义数据集:选择已创建的通用型NAS数据集。

    • 挂载路径:取默认配置/mnt/data/

    启动命令

    配置以下命令:

    export CHATLEARN=path-to-chatlearn
    export MEGATRON=path-to-megatron-lm
    cd ${CHATLEARN}/examples/megatron/
    
    export model_size=llama2-7B
    
    LOAD_PATH=$MEGATRON_LLAMA2_CKPT_PATH \
    TOKENIZER_MODEL=$LLAMA2_TOKENIZER_MODEL \
    DATASET_PATH=$DATASET_ROOT/sft/ \
    bash scripts/train_sft_llama.sh

    其中关键配置说明如下:

    • MEGATRON:是Megatron-LM代码仓库clone存放的位置。本方案配置为/mnt/data/Megatron-LM

    • CHATLEARN:是ChatLearn代码仓库clone存放的位置。本方案配置为/mnt/data/ChatLearn

    • LOAD_PATH:是转换后的Megatron-LM格式模型的存储路径。本方案配置为/mnt/data/llama-2-7b-hf-to-megatron

    • TOKENIZER_MODEL:是Llama2Tokenizer所需文件tokenizer.model所在的文件夹路径。本方案配置为/mnt/data/llama-2-7b-hf/tokenizer.model

    • DATASET_PATH:是SFT训练数据集路径。本方案配置为/mnt/data/sft/

    训练过程生成的日志和训练完成的模型默认存放在${CHATLEARN}/output/sft中。您可以通过CHECKPOINT_PATH来指定模型保存路径,具体的定义详情,请参见${CHATLEARN}/examples/megatron/scripts/train_sft_llama.sh脚本。

    资源信息

    资源类型

    选择灵骏智算

    资源来源

    选择资源配额

    资源配额

    选择已创建的资源配额。

    框架

    选择PyTorch。

    任务资源

    Worker节点配置以下参数:

    • 节点数量:配置为1。

    • CPU(核数):80。

    • 内存(GiB):800。

    • 共享内存(GiB):800。

    • GPU(卡数):8。

    训练脚本中,资源需求如下,您可以根据实际情况修改配置参数:

    • llama2-7B RLHF:8GPU

    • llama2-13B RLHF: 2*8GPU

    • llama2-70B RLHF: 4*8GPU

  3. 单击确定

步骤二:Reward模型训练

Reward模型是指在RLHF中作为人类评价的代理,对模型产生的问题回复进行实时评价打分的模型。Reward模型输入问题以及模型回复,可以产生一个标量表示模型回复的质量。

说明

DPO训练模式不需要训练Reward模型。

  1. 进入新建任务页面。

    1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入DLC

    2. 在分布式训练(DLC)页面,单击新建任务

  2. 新建任务页面,配置以下关键参数,其他参数配置详情,请参见创建训练任务

    参数

    描述

    环境信息

    节点镜像

    选中镜像地址,并在文本框中输入registry.cn-wulanchabu.aliyuncs.com/pai-dlc/pytorch-training:2.4.0-gpu-py3.10-cu12.5-ngc24.06-ubuntu22.04

    数据集

    单击自定义数据集,并配置以下参数:

    • 自定义数据集:选择已创建的通用型NAS数据集。

    • 挂载路径:取默认配置/mnt/data/

    启动命令

    配置以下命令:

    export CHATLEARN=path-to-chatlearn
    export MEGATRON=path-to-megatron-lm
    cd ${CHATLEARN}/examples/megatron/
    
    LOAD_PATH=path-to-sft-ckpt \
    TOKENIZER_MODEL=$LLAMA2_TOKENIZER_MODEL \
    DATASET_PATH=$DATASET_ROOT/rm \
    bash scripts/train_reward_llama.sh

    其中关键配置说明如下:

    • MEGATRON:是Megatron-LM代码仓库clone存放的位置。本方案配置为/mnt/data/Megatron-LM

    • CHATLEARN:是ChatLearn代码仓库clone存放的位置。本方案配置为/mnt/data/ChatLearn

    • LOAD_PATH:是SFT产出的Checkpoint路径。本方案配置为${CHATLEARN}/output/sft/,您的路径以实际为准。

    • TOKENIZER_MODEL:是Llama2Tokenizer所需文件tokenizer.model所在的文件夹路径。本方案配置为/mnt/data/llama-2-7b-hf/tokenizer.model

    • DATASET_PATH:是Reward训练数据集路径。本方案配置为/mnt/data/rm

    训练过程生成的日志和训练完成的模型默认存放在${CHATLEARN}/output/reward中。您可以通过CHECKPOINT_PATH来指定模型保存路径,具体的定义详见${CHATLEARN}/examples/megatron/scripts/train_reward_llama.sh脚本。

    资源信息

    资源类型

    选择灵骏智算

    资源来源

    选择资源配额

    资源配额

    选择已创建的资源配额。

    框架

    选择PyTorch

    任务资源

    Worker节点配置以下参数:

    • 节点数量:配置为1。

    • CPU(核数):80。

    • 内存(GiB):800。

    • 共享内存(GiB):800。

    • GPU(卡数):8。

    训练脚本中,资源需求如下,您可以根据实际情况修改配置参数:

    • llama2-7B RLHF:8GPU

    • llama2-13B RLHF: 2*8GPU

    • llama2-70B RLHF: 4*8GPU

  3. 单击确定

步骤三:Alignment训练

RLHF训练模式

ChatLearn支持多种Alignment训练模式:RLHF、DPO、OnlineDPO、GRPO等。本方案以RLHF Llama2-7B模型为例,为您介绍如何进行Alignment训练。具体操作步骤如下:

  1. 进入新建任务页面。

    1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入DLC

    2. 在分布式训练(DLC)页面,单击新建任务

  2. 新建任务页面,配置以下关键参数,其他参数配置详情,请参见创建训练任务

    参数

    描述

    环境信息

    节点镜像

    选择镜像地址,并配置:registry.cn-wulanchabu.aliyuncs.com/pai-dlc/pytorch-training:2.4.0-gpu-py3.10-cu12.5-ngc24.06-ubuntu22.04

    数据集

    单击自定义数据集,并配置以下参数:

    • 自定义数据集:选择已创建的通用型NAS数据集。

    • 挂载路径:取默认配置/mnt/data/

    启动命令

    配置以下命令:

    export CHATLEARN=path-to-chatlearn
    export MEGATRON=path-to-megatron-lm
    export DATASET_PATH=$DATASET_ROOT/alignment/train.jsonl
    
    cd ${CHATLEARN}/examples/megatron/
    
    export model_size=llama2-7B
    
    POLICY_LOAD=path-to-sft-ckpt \
    REWARD_LOAD=path-to-rm-ckpt \
    REWARD_LOAD_ITERATION=1000 \
    TOKENIZER_MODEL=$LLAMA2_TOKENIZER_MODEL \
    tokenizer_load=${HF_MODEL_DIR}
    bash scripts/train_rlhf_llama.sh

    其中:

    • MEGATRON:是Megatron-LM代码仓库clone存放的位置。本方案配置为/mnt/data/Megatron-LM

    • CHATLEARN:是ChatLearn代码仓库clone存放的位置。本方案配置为/mnt/data/ChatLearn

    • DATASET_PATH:是Alignment训练数据集路径。本方案配置为/mnt/data/alignment/train.jsonl

    • POLICY_LOAD:是SFT微调训练产出的Checkpoint路径。Policy模型和Reference模型将以SFTCheckpoint进行初始化。本方案配置为${CHATLEARN}/output/sft/hh_sft***/,您的路径以实际为准。

    • REWARD_LOAD:是Reward训练产出Checkpoint路径。本方案配置为${CHATLEARN}/output/reward/reward_hh***,您的路径以实际为准。

    • REWARD_LOAD_ITERATION:用于指定加载Checkpoint对应的iteration数。Reward模型和Value模型将以Reward模型的权重进行初始化。

    • TOKENIZER_MODEL:是Llama2Tokenizer所需文件tokenizer.model所在的文件夹路径。本方案配置为/mnt/data/llama-2-7b-hf/tokenizer.model

    • tokenizer_load:您下载的HuggingFace模型的路径。本方案配置为/mnt/data/llama-2-7b-hf

    • model_size:本方案以Llama2-7B模型为例,如果您需要训练llama2-13Bllama2-70B的模型,您只需要将上述训练脚本中的export model_size=llama2-7B替换成export model_size=llama2-13Bexport model_size=llama2-70B

    系统会将训练完成的模型保存至${CHATLEARN}/output/**-rlhf路径。

    资源信息

    资源类型

    选择灵骏智算

    资源来源

    选择资源配额

    资源配额

    选择已创建的资源配额。

    框架

    选择PyTorch

    任务资源

    Worker节点配置以下参数:

    • 节点数量:配置为1。

    • CPU(核数):80。

    • 内存(GiB):800。

    • 共享内存(GiB):800。

    • GPU(卡数):8。

    训练脚本中,资源需求如下,您可以根据实际情况修改配置参数:

    • llama2-7B RLHF:8GPU

    • llama2-13B RLHF: 2*8GPU

    • llama2-70B RLHF: 4*8GPU

  3. 参数配置完成后,单击确定

    页面自动跳转到分布式训练(DLC)页面。在该页面,您可以单击任务名称进入任务详情页面,来观察任务执行状态。

其他训练模式

其他Alignment训练模式操作方法与RLHF相同,您只需在创建训练任务时,将启动命令更新为对应训练模式的命令即可。其他训练模式对应的启动命令如下:

  • OnlineDPO/GRPO

    OnlineDPO/GRPO训练流程和RLHF比较类似,只是不需要Value模型,以下是一个Llama2-7BPolicy模型和7BReward模型的训练脚本。

    export CHATLEARN=path-to-chatlearn
    export MEGATRON=path-to-megatron-lm
    export DATASET_PATH=$DATASET_ROOT/alignment/train.jsonl
    
    cd ${CHATLEARN}/examples/megatron/
    
    export model_size=llama2-7B
    
    POLICY_LOAD=path-to-sft-ckpt \
    REWARD_LOAD=path-to-rm-ckpt \
    REWARD_LOAD_ITERATION=1000 \
    TOKENIZER_MODEL=$LLAMA2_TOKENIZER_MODEL \
    tokenizer_load=${HF_MODEL_DIR}
    bash scripts/train_online_dpo_llama.sh

    其中DATASET_PATH需要配置为该训练模式支持的训练数据集所在路径。如何准备数据集,请参见数据准备。其他参数配置说明,请参见上述RLHF训练模式的参数配置说明。

  • DPO

    以下是一个Llama2-7BPolicy模型的训练脚本。

    export CHATLEARN=path-to-chatlearn
    export MEGATRON=path-to-megatron-lm
    export DATASET_PATH=$DATASET_ROOT/alignment/train.jsonl
    
    cd ${CHATLEARN}/examples/megatron/
    
    export model_size=llama2-7B
    
    POLICY_LOAD=path-to-sft-ckpt \
    TOKENIZER_MODEL=$LLAMA2_TOKENIZER_MODEL \
    bash scripts/train_dpo_llama.sh

    其中DATASET_PATH需要配置为该训练模式支持的训练数据集所在路径。如何准备数据集,请参见数据准备。其他参数配置说明,请参见上述RLHF训练模式的参数配置说明。

  • GRPO Math

    export CHATLEARN=path-to-chatlearn
    export MEGATRON=path-to-megatron-lm
    export DATASET_PATH=$DATASET_ROOT/math/train.jsonl
    
    cd ${CHATLEARN}/examples/megatron/
    
    export model_size=llama2-7B
    
    POLICY_LOAD=path-to-sft-ckpt \
    REWARD_LOAD=path-to-rm-ckpt \
    REWARD_LOAD_ITERATION=1000 \
    TOKENIZER_MODEL=$LLAMA2_TOKENIZER_MODEL \
    tokenizer_load=${HF_MODEL_DIR}
    bash scripts/train_grpo_math_llama.sh

    其中DATASET_PATH需要配置为该训练模式支持的训练数据集所在路径。如何准备数据集,请参见数据准备。其他参数配置说明,请参见上述RLHF训练模式的参数配置说明。