通过GPU云服务器训练GPT-2

更新时间:
复制为 MD 格式

本实验介绍如何使用GPU云服务器,使用Megatron-Deepspeed框架训练GPT-2模型并生成文本。

场景简介

重要
  • 阿里云不对第三方模型的合法性、安全性、准确性进行任何保证,阿里云不对由此引发的任何损害承担责任。

  • 您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。

本实验介绍如何使用GPU云服务器,使用Megatron-Deepspeed框架训练GPT-2模型并生成文本。

背景知识

  • GPT-2模型

    GPT-2模型是OpenAI2018年在GPT模型的基础上发布的新的无监督NLP模型,当时被称为“史上最强通用NLP模型”。该模型可以生成连贯的文本段落,并且能在未经预训练的情况下,完成阅读理解、问答、机器翻译等多项不同的语言建模任务。GPT-2模型尤其在文本生成上有着惊艳的表现,其生成的文本在上下文连贯性和情感表达上都超过了人们的预期。

    GPT-2模型由多层单向Transformer的解码器部分构成,根据模型层次规模,GPT-2模型有以下几个规格:

    image

    Megatron-Deepspeed框架结合了两种主要技术:

    • Megatron-LM是由NVIDIA开源的Transformer模型框架。

    • DeepSpeed是由Microsoft开源的一个深度学习优化库。

    DeepSpeed团队通过将DeepSpeed库中的ZeRO分片(ZeRO sharding)数据并行(Data Parallelism)和管道并行(Pipeline Parallelism)与Megatron-LM中的张量并行(Tensor Parallelism)相结合,开发了一种基于3D并行的实现,这就是Megatron-Deepspeed,它使得千亿级参数量以上的大规模语言模型(LLM)的分布式训练变得更简单、高效和有效。

    image

  • GPU云服务器

    GPU云服务器(GPU Cloud Computing,GPU)是提供 GPU 算力的弹性计算服务,具有超强的计算能力,服务于深度学习、科学计算、图形可视化、视频处理多种应用场景。阿里云作为亚太第一的云服务提供商,随时为您提供触手可得的算力,有效缓解计算压力,提升您的业务效率,助您提高企业竞争力。

了解更多信息,详情请参见使用Megatron-Deepspeed训练GPT-2并生成文本

前提条件

云起实验室将在您的账号下开通本次实操资源,资源按量付费,需要您自行承担本次实操的云资源费用。

重要

本实验预计两个小时产生费用20元,其中0.8元/G公网流量。如果您调整了资源规格、使用时长,或执行了本方案以外的操作,可能导致费用发生变化,请以控制台显示的实际价格和最终账单为准。

进入实操前,请确保阿里云账号满足以下条件:

  • 已通过实名认证并且账户余额大于100。

  • 云资源产生的费用需您自行承担,云起实验室不会向您征收额外费用。

  • 所有实验操作将保留至您的账号,请谨慎操作。

  • 实操结束后,您可以选择继续付费保留资源,或参考手册自动/手动释放资源。

创建专有网络VPC和交换机

  1. 在实验室页面右侧的操作区中,我已阅读并同意《阿里云云起实践平台服务协议》,单击开始实操

  2. 前往专有网络管理控制台

  3. 在左侧导航栏中,单击专有网络

    image

  4. 专有网络页⾯,单击创建专有网络

    image

  5. 创建专有网络页⾯,根据下方参数说明配置1个专有网络(VPC)和1台交换机,然后单击确定。更多关于创建专有网络和交换机信息,详情请参见创建和管理专有网络

    配置项

    说明

    专有网络

    地域

    本实验以华东1(杭州)为例。

    名称

    自定义名称。

    IPv4网段

    选择手动输入IPv4地址段

    输入IPv4网段

    输入IPv4网段,建议您使用RFC私网地址作为专有网络的网段如10.0.0.0/8172.16.0.0/12192.168.0.0/16

    交换机

    名称

    自定义名称。

    可用区

    选择杭州可用区J。

    IPv4网段

    使用默认的IPv4网段即可。

    Image 21.png

    Image 23.png

  6. 创建专有网络页面,您可查看到创建的专有网络VPC和交换机的ID实例名称等信息。

    Image 24.png

创建ECS实例

  1. 前往实例创建页

  2. 在云服务器购买页面,参考如下说明配置参数,未提及的配置保持默认或按需修改,然后选中右侧的我已阅读并同意云服务器(按量付费)专属条款、镜像商品使用条款,单击确认下单

    参数

    示例

    付费类型

    选择按量付费

    地域

    本实验以华东1(杭州)为例。

    网络及可用区

    选择您创建的专有网络和交换机。

    实例

    选择ecs.gn7i-c8g1.2xlarge(单卡NVIDIA A10)。

    镜像

    使用云市场镜像,名称为aiacc-train-solution,您可以直接通过名称搜索该镜像,选择最新版本即可。

    公网IP

    开启分配公网IPv4地址

    带宽计费模式

    选择按使用流量

    本教程以按使用流量为例,您可根据实际情况选择按固定带宽或按使用流量。

    带宽峰值

    带宽峰值设置为100 Mbps。以加快模型下载速度。

    安全组

    选择新建安全组

    安全组类型

    选择普通安全组

    开通IPv4端口/协议

    保持默认即可。

    登录凭证

    为当前ECS实例设置登录密码,选择自定义密码

    登录密码

    自定义设置登录密码。

    确认密码

    再次输入登录密码。

    image

    image

    image

    image

  3. ECS实例创建页面,选中服务协议,单击确认下单。

    image

  4. 创建成功对话框中,单击管理控制台

  5. 实例页面,等待状态变为运行中后,即可使用该云服务器ECS。

    image

安装Megatron-Deepspeed框架

  1. 前往云服务器ECS控制台

  2. 在左侧导航栏中,选择实例与镜像 > 实例

    image

  3. 实例页面,找到目标ECS实例,单击其右侧操作列下的远程连接

    image

  4. 远程连接对话框中,单击通过Workbench远程连接区域下的立即登录

    image

  5. 登录实例对话框中,输入用户自定义密码,单击确定

    image

  6. 执行以下命令,启动容器。

    docker run -d -t --network=host --gpus all --privileged --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --name megatron-deepspeed -v /etc/localtime:/etc/localtime -v /root/.ssh:/root/.ssh nvcr.io/nvidia/pytorch:21.10-py3
  7. 执行以下命令,进入容器终端。

    docker exec -it megatron-deepspeed bash
  8. 执行以下命令,下载Megatron-DeepSpeed框架。

    说明

    由于网络原因,执行命令后可能会失败,建议您多次尝试。

    git clone https://github.com/bigscience-workshop/Megatron-DeepSpeed
  9. 执行以下命令,安装Megatron-DeepSpeed框架。

    cd Megatron-DeepSpeed
    pip install -r requirements.txt

处理数据

本实验使用1GB 79K-recordJSON格式的OSCAR数据集。

  1. 执行以下命令,下载数据集。

    wget https://huggingface.co/bigscience/misc-test-data/resolve/main/stas/oscar-1GB.jsonl.xz
    wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.json
    wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txt
  2. 执行以下命令,解压数据集。

    xz -d oscar-1GB.jsonl.xz
  3. 执行以下命令,预处理数据。

    python3 tools/preprocess_data.py \
        --input oscar-1GB.jsonl \
        --output-prefix meg-gpt2 \
        --vocab gpt2-vocab.json \
        --dataset-impl mmap \
        --tokenizer-type GPT2BPETokenizer \
        --merge-file gpt2-merges.txt \
        --append-eod \
        --workers 8

    如果回显信息类似如下所示,表示预处理数据完成。

  4. 执行以下命令,新建data目录。

    mkdir data
  5. 执行以下命令,将处理好的数据移动到data目录下。

    mv meg-gpt2* ./data
    mv gpt2* ./data

预训练

本实验使用单机单卡的GPU实例完成GPT-2 MEDIUM模型的预训练。

  1. 创建预训练脚本文件。

    1. 执行以下命令,创建预训练脚本文件。

      vim pretrain_gpt2.sh
    2. i键,进入编辑模式,在文件中添加以下信息。

      #! /bin/bash
      
      # Runs the "345M" parameter model
      
      GPUS_PER_NODE=1
      # Change for multinode config
      MASTER_ADDR=localhost
      MASTER_PORT=6000
      NNODES=1
      NODE_RANK=0
      WORLD_SIZE=$(($GPUS_PER_NODE*$NNODES))
      
      DATA_PATH=data/meg-gpt2_text_document
      CHECKPOINT_PATH=checkpoints/gpt2
      
      DISTRIBUTED_ARGS="--nproc_per_node $GPUS_PER_NODE --nnodes $NNODES --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT"
      
      python -m torch.distributed.launch $DISTRIBUTED_ARGS \
             pretrain_gpt.py \
             --tensor-model-parallel-size 1 \
             --pipeline-model-parallel-size 1 \
             --num-layers 24 \
             --hidden-size 1024 \
             --num-attention-heads 16 \
             --micro-batch-size 4 \
             --global-batch-size 8 \
             --seq-length 1024 \
             --max-position-embeddings 1024 \
             --train-iters 5000 \
             --lr-decay-iters 320000 \
             --save $CHECKPOINT_PATH \
             --load $CHECKPOINT_PATH \
             --data-path $DATA_PATH \
             --vocab-file data/gpt2-vocab.json \
             --merge-file data/gpt2-merges.txt \
             --data-impl mmap \
             --split 949,50,1 \
             --distributed-backend nccl \
             --lr 0.00015 \
             --lr-decay-style cosine \
             --min-lr 1.0e-5 \
             --weight-decay 1e-2 \
             --clip-grad 1.0 \
             --lr-warmup-fraction .01 \
             --checkpoint-activations \
             --log-interval 10 \
             --save-interval 500 \
             --eval-interval 100 \
             --eval-iters 10 \
             --fp16
    3. Esc键,退出编辑模式,然后输入:wq并按Enter键,保存并退出文件。

  2. 修改测试代码。

    Megatron源码有一个断言需要注释掉,以保证代码正常运行。

    1. 执行以下命令,打开测试代码文件。

      vim /workspace/Megatron-DeepSpeed/megatron/model/fused_softmax.py +191
    2. i键,进入编辑模式,在assert mask is None, "Mask is silently ignored due to the use of a custom kernel"前加#

    3. Esc键,退出编辑模式,然后输入:wq并按Enter键,保存并退出文件。

  3. 预训练。

    1. 执行以下命令,开始预训练。

      nohup sh ./pretrain_gpt2.sh &

    2. 执行如下命令,可以持续的查看nohup.out的输出,达到监控程序的效果。

      tail -f nohup.out

      如果回显信息类似如下所示,表示预训练完成。

      说明

      预训练完成大概需要1小时30分钟,如果超时断开了ECS连接,重新远程登录ECS实例后,执行以下命令,继续查看预训练进度。预训练完成后,可以执行Ctrl+Z命令退出。

      docker exec -it megatron-deepspeed bash
      cd Megatron-DeepSpeed
      tail -f nohup.out
  4. (可选)执行以下命令,查看生成的模型checkpoint路径。

    本示例生成的模型checkpoint路径设置在/workspace/Megatron-DeepSpeed/checkpoints/gpt2

    ll ./checkpoints/gpt2

使用GPT-2模型生成文本

  1. 执行以下命令,安装相关依赖。

    说明

    由于网络原因,执行命令后可能会失败,建议您多次尝试。

    pip install mpi4py

    如果回显信息类似如下所示,表示依赖安装完成。

  2. 创建文本生成脚本。

    1. 执行以下命令,创建文本生成脚本。

      vim generate_text.sh

    2. i键,进入编辑模式,在文件中增加以下内容。

      #!/bin/bash
      
      CHECKPOINT_PATH=checkpoints/gpt2
      VOCAB_FILE=data/gpt2-vocab.json
      MERGE_FILE=data/gpt2-merges.txt
      
      python tools/generate_samples_gpt.py \
             --tensor-model-parallel-size 1 \
             --num-layers 24 \
             --hidden-size 1024 \
             --load $CHECKPOINT_PATH \
             --num-attention-heads 16 \
             --max-position-embeddings 1024 \
             --tokenizer-type GPT2BPETokenizer \
             --fp16 \
             --micro-batch-size 2 \
             --seq-length 1024 \
             --out-seq-length 1024 \
             --temperature 1.0 \
             --vocab-file $VOCAB_FILE \
             --merge-file $MERGE_FILE \
             --genfile unconditional_samples.json \
             --num-samples 2 \
             --top_p 0.9 \
             --recompute
    3. Esc键,退出编辑模式,然后输入:wq并按Enter键,保存并退出文件。

  3. 执行以下命令,生成文本。

    sh ./generate_text.sh

    如果回显信息类似如下所示,表示生成文本完成。

  4. 执行以下命令,查看生成的JSON格式的文本文件。

    vim unconditional_samples.json

    回显信息类似如下所示。

清理及后续

  • 在完成实验后,如果无需继续使用资源,请根据以下步骤,先删除相关资源后,再结束实操。

    • 删除云服务器ECS。

      1. 进入云服务器ECS控制台

      2. 在左侧导航栏中,选择实例与镜像 > 实例

        image

      3. 实例页面,找到目标ECS实例,选择其右侧操作列下的image图标 > 实例状态 > 释放

        image

      4. 释放对话框中,选择立即释放,单击下一步

        image

      5. 释放对话框中,勾选我已知晓即将释放的资源与关联资源,并了解相关数据风险,单击确认image

    • 删除安全组。

      1. 前往云服务器ECS控制台

      2. 在左侧导航栏中,选择网络与安全 > 安全组

        image

      3. 安全组页面,找到目标安全组,单击其右侧操作列下的删除

        image

      4. 删除安全组对话框中,单击确定

        image

    • 删除VPC和交换机。

      1. 前往专有网络管理控制台

      2. 在左侧导航栏中,单击交换机

        image

      3. 在单击交换机右侧的删除按钮。

        image

      4. 在弹出的删除交换机对话框中,单击确定

        image

      5. 在左侧导航栏中,单击专有网络

        image

      6. 单击VPC右侧删除按钮。

        image

      7. 在删除专有网络对话框中,单击确定

        image

    • 删除相关资源后,选择不保留资源,单击结束实操。在结束实操对话框中,单击确定

      image

  • 在完成实验后,如果需要继续使用资源,选择付费保留资源,单击结束实操。在结束实操对话框中,单击确定。请随时关注账户扣费情况,避免发生欠费。

    image