文档

LLM on DLC- Megatron on DLC最佳实践

更新时间:

预训练大语言模型面对来自于模型规模和数据规模的多重挑战,为了解决这些问题,PAI提供了在DLC上使用Megatron-LM进行大语言模型预训练的最佳实践。该实践通过准备镜像环境与训练数据、调整训练策略、提交与管理任务等流程,帮助您在DLC上轻松高效地预训练大语言模型。本文为您介绍该实践的使用流程。

背景信息

基本概念

  • 语言模型(LM)

    是一种利用自然文本来预测词(Token)顺序的机器学习方法。

  • 大语言模型(LLM)

    是指参数数量达到亿级别的神经网络语言模型,例如:GPT-3、GPT-4、PaLM、PaLM2等。

  • Megatron-LM

    是由NVIDIA的应用深度学习研究团队开发的Transformer模型训练框架,它可以高效利用算力、显存和通信带宽,大幅提升了大语言模型大规模预训练的效率。Megatron-LM已经成为许多大语言模型预训练任务的首选框架。

使用流程

  1. 准备镜像环境与训练数据

    首先准备训练任务所需的镜像环境和训练数据,并将训练数据创建为PAI数据集。

  2. 调整大规模训练策略

    配置一系列优化策略来优化大语言模型的训练过程,以提高模型的性能和准确度。

  3. 提交与管理任务

    提交大语言模型预训练任务,并对任务进行管理。

前提条件

使用限制

仅支持在华北6(乌兰察布)使用灵骏智算资源。如果您在其他地域提交训练任务,请选择使用通用训练资源专有资源组,关于如何创建通用训练资源,请参见新建及管理通用训练资源

准备镜像环境与训练数据

准备镜像环境

目前支持使用以下几种类型的镜像环境:

  • PyTorch镜像和自定义Megatron

    DLC提供的公共镜像中选择一PyTorch类型的镜像;下载Megatron并创建为代码集,具体操作,请参见代码配置

  • 集成了Megatron的镜像

    PAI提供了集成社区PyTorch和Megatron最新版本的镜像:

    registry.${region}.aliyuncs.com/pai-dlc/llmacc:23.05-gpu-py310-cu121-ubuntu22.04

    其中:${region}需要替换为当前地域ID,目前支持的地域为cn-beijing、cn-shanghai、cn-hangzhou、cn-shenzhen和cn-wulanchabu,您可以根据需要选择其中一个。

本案例使用位于华北6(乌兰察布)的灵骏智算资源,因此使用 registry-vpc.cn-wulanchabu.aliyuncs.com/pai-dlc/llmacc:23.05-gpu-py310-cu121-ubuntu22.04作为演示镜像。

准备训练数据

  1. 首先将词表文件和合并规则表文件下载到本地。

    本案例使用BPE 方式进行分词,使用GPT-2的词表和合并规则表:

  2. 对维基百科语料或自定义语料文件进行处理生成Megatron-LM支持的索引数据集文件。

    任意选择一种语料即可,本案例使用维基百科语料生成索引数据集文件。

    维基百科语料

    维基百科数据集是自然语言处理的常见语料,在词表文件所在目录使用WikiExtractor产生Megatron-LM支持的索引数据集文件:

    # 1. Install wikiextractor
    pip install wikiextractor
    
    # 2. Download & extract to loose json
    wget https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2
    python -m wikiextractor.WikiExtractor --json ./enwiki-latest-pages-articles.xml.bz2
    
    # 3. Use nltk/spacy/ftfy to clean the corpus
    
    # 4. Convert the corpus into indexed datasets
    find text/ -type d | sed 's|text|mkdir -p datasets/text|' | sh
    find text/ -type f -name "wiki_*" | xargs -P $(nproc) -I{} \
    bash -c "python env/megatron_lm/src/tools/preprocess_data.py --input {} \
    --output-prefix datasets/{} \
    --vocab-file gpt2-vocab.json \
    --dataset-impl mmap \
    --tokenizer-type GPT2BPETokenizer \
    --merge-file gpt2-merges.txt \
    --append-eod \
    --workers 1 --chunk-size 1024"
    
    # 5. Merge indexed datasets
    mkdir -p flatten_datasets
    find datasets/text/ -type f | sed 's|\(.*\)/wiki\(.*\)|cp \1/wiki\2 ../../flatten_datasets/\1_wiki\2|' | sh
    python env/megatron_lm/src/tools/merge_datasets.py --output-prefix ./enwiki-latest-pages-articles --input flatten_datasets/
    

    自定义语料

    使用loose JSON格式的语料,例如:

    {"text": "A platform that provides enterprise-level data modeling services based on machine learning algorithms to quickly meet your needs for data-driven operations.", "type": "Eng", "id": "0", "title": "Machine Learning Platform for AI", "src": "www.alibabacloud.com"}
    {"text": "This topic describes how to use the Deep Learning Containers (DLC) of Machine Learning Platform for AI (PAI) to train transfer learning models based on the PyTorch framework.", "type": "Eng", "id": "42", "title": "Submit a standalone training job that uses PyTorch", "src": "www.alibabacloud.com"}

    使用Megatron-LM中提供的数据预处理工具对语料文件进行处理,可以产生Megatron-LM支持的mmap格式的索引数据集文件(my-gpt2_text_document.bin和my-gpt2_text_document.idx):

    python /path/to/megatron-lm/tools/preprocess_data.py \
           --input my-corpus.json \
           --output-prefix my-gpt2 \
           --vocab-file gpt2-vocab.json \
           --dataset-impl mmap \
           --tokenizer-type GPT2BPETokenizer \
           --merge-file gpt2-merges.txt \
           --append-eod \
           --workers 2 \
           --chunk-size 1

    执行后会打印出类似如下的日志:

    Opening my-corpus.json
    > building GPT2BPETokenizer tokenizer ...
    > padded vocab (size: 50257) with 47 dummy tokens (new size: 50304)
    > building GPT2BPETokenizer tokenizer ...
    > building GPT2BPETokenizer tokenizer ...
    Vocab size: 50257
    Output prefix: my-gpt2
    Time to startup: 0.07754158973693848
    > padded vocab (size: 50257) with 47 dummy tokens (new size: 50304)
    Done! Now finalizing.
    > padded vocab (size: 50257) with 47 dummy tokens (new size: 50304)
  3. 创建数据集。

    1. 生成索引数据集文件后,您可以将词表文件、合并规则文件和索引数据集文件上传到OSS Bucket,具体操作,请参见控制台上传文件

    2. 将上传到OSS Bucket的数据创建为PAI数据集,具体操作,请参见创建及管理数据集

      说明

      如果OSS Bucket目录中已产生了npy文件,您可以开启数据集加速,提升数据访问效率,具体操作,请参见在PAI平台使用数据集加速器

调整大规模训练策略

参考附录:PTD-P并行技术原理介绍,来配置训练任务的优化策略,后续提交DLC容器训练任务时,配置到执行命令中。目前支持使用以下两种方式调整训练策略。

手动调整训练策略

在训练大语言模型时,DLC支持在执行命令中配置以下参数手动调整训练策略,来优化整体训练性能。

参数

描述

--fp16

在Megatron-LM中支持使用fp16方式训练模型。

--micro-batch-size

  • 对于单机无法训练的模型配置:

    通常将micro batch size配置为1。

  • 对于单机可以训练的模型配置:

    您可以尝试从1开始逐渐增加micro batch size的值,并查看每秒可以处理的Token数量是否继续增加,从而找到最优的micro batch size值。

--tensor-model-parallel-size

用来配置tensor parallel size参数值。

  • 对于单机无法训练的模型配置:

    通常将tensor parallel size配置为单机卡数。

  • 对于单机可以训练的模型配置:

    您可以尝试将tensor parallel size配置为单机卡数(例如:配置为8),然后逐渐成倍降低(例如:配置为4),并查看每秒可以处理的Token数量是否继续增加,从而找到最优的tensor parallel size值。

--pipeline-model-parallel-size

用来配置pipeline parallel size参数值。

您可以尝试从1开始逐渐增加pipeline parallel size值,直到模型可以正常开始训练,不出现OOM错误。

说明

pipeline parallel size参数值需要小于模型层数,且可以被模型层数整除。

--data-parallel-size

您可以根据尝试获得的tensor parallel sizepipeline parallel size的值,以及准备训练的总卡数,算出可行的data parallel size值:tensor_model_parallel_size * pipeline_model_parallel_size * data_parallel_size = num_gpus

--use-distributed-optimizer

将参数配置为true,分别用来打开优化器状态并行技术、序列并行技术、激活重算技术,来进一步优化显存占用。

--sequence-parallel

--recompute-activations

--use-flash-attn

将参数配置为true,用来打开flash attention,进一步提升计算效率。

--global batch size

在模型效果允许的前提下增加global batch size,从而降低流水并行时的层间等待开销。

自动调整训练策略

如果训练GPT-like模型,您可以使用准备镜像环境与训练数据章节中的集成了Megatron的镜像,并只需提供 global batch size或者最大允许的global batch size,就可以使用如下命令自动拉起Megatron预训练作业:

torchrun \
--nnodes $WORLD_SIZE \
--node_rank $RANK \
--nproc_per_node ${LOCAL_WORLD_SIZE:-4} \
--master_addr $MASTER_ADDR \
--master_port $MASTER_PORT \
-m llmacc.pretrain \
--task-type llmacc.megatron.GPT \
--max-global-batch-size 16 \
# megatron arguments

此外,也可以直接将llmacc作为工具算出可能的并行配置:

python \
-m llmacc.pretrain \
--task-type llmacc.megatron.GPT \
--world-size 64 # 64 GPUs in total \
--local-world-size 8 # 8 GPUs for each node \
--max-global-batch-size 16 \
# megatron arguments

对于非GU50或GU100机型,您可以通过配置DEVICE_MEMORY_GB环境变量来配置显存大小。

提交与管理任务

  1. 进入创建任务页面,具体操作,请参见创建训练任务

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

    本案例以训练GPT-22B模型为例:

    参数

    描述

    资源组

    选择已创建的灵骏智算资源。

    优先级

    配置为1。

    节点镜像

    选择镜像地址,并配置:registry-vpc.cn-wulanchabu.aliyuncs.com/pai-dlc/llmacc:23.05-gpu-py310-cu121-ubuntu22.04

    任务类型

    选择PyTorch

    数据集配置

    选择已创建的数据集。

    执行命令

    配置为以下命令,执行命令配置详情,请参见调整大规模训练策略

    torchrun \
    --nnodes $WORLD_SIZE \
    --node_rank $RANK \
    --nproc_per_node gpu \
    --master_addr $MASTER_ADDR \
    --master_port $MASTER_PORT \
    -m llmacc.pretrain \
    --task-type llmacc.megatron.GPT \
    --num-layers 48 \
    --num-attention-heads 64 \
    --hidden-size 6144  \
    --seq-length 2048 \
    --max-position-embeddings 2048 \
    --train-iters 100 \
    --lr 2.0e-4 \
    --min-lr 2.0e-4 \
    --vocab-file /mnt/data/gpt2-vocab.json \
    --merge-file /mnt/data/gpt2-merges.txt \
    --data-path /mnt/data/enwiki-20230526-pages-articles \
    --log-interval 10 \
    --max-global-batch-size 32

    任务资源配置

    • 节点数量:配置为2。

    • CPU(核数):80。

    • 内存(GB):800。

    • 共享内存(GB):800。

    • GPU(卡数):8。

  3. 单击提交

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

  4. 任务详情页面下方单击资源视图,查看任务中使用的资源。image..png

    更多管理训练任务的操作,请参见创建及管理容器训练任务

附录:PTD-P并行技术原理介绍

大规模并行训练的一个关键因素是并行训练策略的选择。在Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LMReducing Activation Recomputation in Large Transformer Models这两篇论文中介绍了Megatron-LM常见的大规模训练策略。

常见的大模型训练技术包括:数据并行技术、模型并行技术(包括张量并行技术和流水并行技术)、优化器状态并行技术、序列并行技术、激活重算技术等:

  • 数据并行技术(Data Parallel):在多个GPU组上有相同的模型参数副本,但读取不同的样本。在参数更新前使用allreduce来全局平均梯度,从而加速模型训练。

  • 优化器状态并行技术(Distributed Optimizer / ZERO-DP):在使用数据并行技术的同时,将模型参数对应的优化器状态切分到不同的GPU上,从而支持训练更大的模型。

  • 激活重算技术(Activation Recomputation):在反向传播时重新计算部分激活,避免占用显存存储这部分激活,从而支持训练更大的模型。

  • 序列并行技术(Sequence Parallel):一个Transformer层内的dropout和layer-norm等部分参数切分到不同GPU上,从而支持训练更大的模型。

  • 模型并行技术(Model Parallel):在多个GPU上存放一套模型参数的不同分片,从而支持训练更大的模型。

    • 流水并行技术(Pipeline Parallel):模型内不同Transformer层切分到不同的GPU上;

    • 张量并行技术(Tensor Parallel):一个Transformer层内的Attention和Linear部分参数切分到不同的GPU上;

    模型并行的示意图如下,来源:Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LMReducing Activation Recomputation in Large Transformer Models

image.png

imageimage

上述每种技术都有不同的权衡,如果互相结合需要仔细推敲才能获得良好的训练性能。Megatron-LM结合上述这些技术,提出了一种称为PTD-P并行的技术,从而支持在千卡规模上以较好的计算性能来训练大语言模型。

  • 本页导读 (1)
文档反馈