亚马逊AWS官方博客

使用 Ubuntu18 DLAMI,P3dn 实例与 EFA,和 Amazon FSx for Lustre 实现大规模多 GPU 分布式深度学习训练

Original URL:https://thinkwithwp.com/cn/blogs/machine-learning/multi-gpu-distributed-deep-learning-training-at-scale-on-aws-with-ubuntu18-dlami-efa-on-p3dn-instances-and-amazon-fsx-for-lustre/

 

AWS Deep Learning AMI (Ubuntu 18.04)被优化用于EC2加速计算实例类型上的深度学习,允许您通过多节点水平扩展更高效、更轻松地处理分布式工作负载。它还拥有内置的Elastic Fabric Adapter(EFA)、英伟达GPU栈以及多种用于分布式深度学习训练的深度学习框架(TensorFlow、MXNet、PyTorch、Chainer、Keras)。您无需耗费时间安装深度学习软件与驱动程序,或者构建机器学习(ML)基础设施。相反,您可以集中精力在更短时间内进行大规模训练作业,并更快对机器学习模型进行迭代。

本文将展示如何轻松在AWS高性能计算(HPC)架构上运行大规模、高性能、网络敏感、低延迟、紧耦合的机器学习分布式训练作业,这个架构包括Ubuntu 18 DLAMI、 P3dn实例上的Elastic Fabric Adapter (EFA),和Amazon FSx for Lustre。本文将向您展示如何在多节点GPU集群上使用PyTorch框架,运行Transformer的双向编码器表示(Bidirectional Encoder Representations from Transformers,简称BERT)模型。此外,本文还将介绍如何通过AWS ParallelCluster自动实现深度学习集群的部署与管理操作。

BERT介绍

BERT是一种预训练语言表示的方法,能够在各类自然语言处理(NLP)任务中带来行业领先的处理结果。您可以在大型文本语料库(例如维基百科)上训练通用语言理解模型,并使用该模型支持多种下游NLP任务(例如回答问题)。BERT是全球首套用于预训练NLP的无监督深度双向系统。

无监督意味着BERT在训练过程中只需要使用纯文本语料库。这一点非常重要,因为大量的多语言纯文本数据在网上公开可用。下表总结了本文中使用的BERT过程的配置,涵盖反向传递和连通一个200 MB大小、经过调优的存储桶。

模型 隐藏层 隐藏单元大小 Attention标头 前馈过滤器大小 最大队列长度 参数
BERTLARGE 24 编码器 1024 16 4 x 1024 512 350 M

AWS上用于BERT训练的HPC概览

本示例中的BERT程序运行在AWS HPC 架构服务之上,其中包含Ubuntu18 DLAMI, P3dn实例上的EFA ,以及 FSx for Lustre for Ubuntu18。

AWS Deep Learning AMI (Ubuntu 18.04)

DLAMI使用同时支持Python 2与Python 3的Anaconda平台,轻松在不同框架之间切换。AWS Deep Learning AMI采用英伟达CUDA 9、9.2、10和10.1,外加多种深度学习框架(包括Apache MXNet, PyTorch以及TensorFlow)预构建而成。本文将使用以下DLAMI功能:

  • PyTorch框架——PyTorch是一款Python软件包,能够提供两项高级功能:具有强大GPU加速功能的张量计算(例如NumPy),以及在基于带式的自动求导系统上构建的深度神经网络。本文示例中使用的PyTorch分支与标签为1.2版本。要激活pytorch环境,请运行source activate pytorch_p36
  • 英伟达栈——英伟达驱动程序418.87.01,CUDA 10.1/cuDNN 7.6.2/NCCL 2.4.8。

主节点配置在c5n.18xlarge实例之上,工作/训练节点则配置在P3dn实例上。

Elastic Fabric Adapter

EFA是一种网络设备,您可以将其接入Amazon EC2实例,借此加速用于机器学习应用程序的HPC。与传统云HPC系统所常用的TCP传输机制相比,EFA能够提供更低且更一致的延迟,和更高的吞吐。EFA能够显著增强节点间通信的性能,这一点对于扩展用于机器学习应用的HPC至关重要。EFA还与Libfabric 1.8.1相集成,能够为HPC应用程序提供Open MPI 4.0.2与英特尔MPI 2019 Update 6的支持能力,同时为机器学习应用程序支持Nvidia Collective Communications Library(NCCL)。EFA的OS-bypass功能是一种访问模型,允许HPC与机器学习类应用程序直接与网络接口硬件通信,借此实现延迟更低、可靠性更高的传输功能。下图所示,为本用例中运行在P3dn实例上的EFA设备。

Amazon FSx for Lustre

Lustre是一套开源并行文件系统,专为各类高性能工作负载设计。这些工作负载包括HPC、机器学习、分析以及媒体处理等场景。这套并行文件系统能够为大规模数据处理提供高吞吐量支持,并以一致的低延迟执行操作。通过跨多个由并行交互的数以千计的计算实例组成的网络服务器存储数据而实现。Lustre文件系统还提供兼容POSIX的文件系统接口。Amazon FSx for Luster提供一套全托管高性能Lustre文件系统,使得基于文件的应用程序以每秒数百GB数据、数百万IOPS以及亚毫秒级的延迟访问数据。Amazon FSx还原生支持与Amazon Simple Storage Service (Amazon S3)相集成;您可以在Amazon FSx上以文件形式访问Amazon S3对象,并将结果写回Amazon S3。本文使用的Lustre为2.10.8版本。

P3dn实例

Amazon EC2 P3dn.24xlarge GPU实例专门针对分布式机器学习与HPC应用程序进行了优化。P3dn.24xlarge实例拥有100 Gbps网络带宽,且新的EFA网络接口允许高度可扩展的节点间通信。EFA适用于Amazon Linux与Ubuntu操作系统,而且与LibFabric集成。通过与英伟达的合作,AWS的EFA支持NCCL,该NCCL针对多GPU与多节点通信原语进行优化,并帮助实现NVLink互连之上的高吞吐量。借助这些增强功能,您可以将机器学习训练作业扩展至数千个GPU之上,从而更快提供训练结果。EFA操作系统会绕过网络机制,且其底层可扩展可靠性协议将被内置于Nitro控制器当中。这些Nitro控制器能够为实例之间的通信提供低延迟、低抖动通道。下表所示,为本文示例中使用的P3dn.24xlarge实例的特性:

特性
GPU 8x 32 GB 英伟达Tesla V100
GPU互连 NVLink – 300 GB/s
GPU 内存 256 GB
处理器 英特尔Skylake 8175 (w/ AVX 512)
vCPU 96
RAM 768 GB
网络带宽 100 Gbps + EFA

AWS ParallelCluster

您可以使用AWS支持的开源集群管理工具AWS ParallelCluster自动执行HPC集群的部署与管理操作。您能够以安全且可重复的方式准备资源,无需手动操作或者自定义脚本,即可轻松实现HPC基础设施的构建与重建。AWS ParallelCluster使用一个简单的文本文件,以一种自动安全的方式,建模和动态准备您的HPC应用程序所需要的所有资源。它支持可轻松完成作业提交的AWS Batch, SGE, Torque以及Slurm等作业调度程序。

设置您的分布式BERT训练环境

要设置分布式BERT训练环境,请完成以下操作步骤:

  • 创建一个VPC包含一个公共子网、一个私有子网,和一个集群置放群组。EFA还需要一个安全组,该安全组允许所有入站与出站流量到达和来自它自身。
  • 在安全组的Inbound 和Outbound选项卡中,完成以下操作:
    1. 选择Edit
    2. Type部分,选择All traffic
    3. Source部分,选择Custom
    4. 输入您复制的安全组ID到字段内的。
    5. 选择Save
  • 启动一个启用了EFA使用Ubuntu 18 DLAMI的P3dn.24xlarge实例。您可以通过Amazon管理控制台、AWS命令行界面(AWS CLI)或者SDK工具包启动这个P3dn实例。机器学习集群内的所有P3dn实例都应在同一可用区、同一子网和同一置放群组内,用以运行BERT训练。
    • 要检查当前所安装的EFA安装器的版本,请输入以下代码:
      cat /opt/amazon/efa_installed_packages
      #Expected Output
      EFA installer version: v1.5.0
    • 要验证您的实例能否正常访问EFA设备,请输入以下代码:
      /opt/amazon/efa/bin/fi_info -p efa

EFA设备有时会丢失,这是因为实例上的ib_uverbs驱动程序未加载。要验证这一点并重新尝试寻找EFA设备,请使用以下代码:

#Check if ib_uverbs is loaded
/usr/sbin/lsmod | grep ib_uverbs
#If not, load it
sudo /usr/bin/modprobe ib_uverbs
  • 设置无密码SSH。要使您的应用程序能够在集群内的所有实例上运行,您需要启用从主节点到各成员节点的无密码SSH访问功能。主节点即您在其中运行应用程序的实例。在设置无密码SSH之后,请禁用SSH的密钥验证功能。打开SSH配置文件/etc/ssh/sshd_config,搜索以下指令并做出如下修改:
    PasswordAuthentication no
    ChallengeResponseAuthentication no
    UsePAM no 修改完成之后,保存文件并重新启动SSH服务。在Ubuntu或者Debian服务器上,运行以下命令:
    sudo systemctl restart ssh
  • 设置FSx for Lustre;Ubuntu 18.04需要带有支持FSx的补丁的特定的2.10 Lustre分支。
    • 要在Ubuntu 18上安装FSx for Lustre客户端,请输入以下代码:
      Install dependencies
      sudo apt-get update
      sudo apt-get install -y build-essential debhelper pkg-config libsystemd-dev
      sudo apt-get install -y module-assistant libreadline-dev dpatch libyaml-dev \
          libselinux-dev libsnmp-dev mpi-default-dev quilt autoconf m4 libtool
      # Ensure latest kernel image is installed
      sudo apt-get install -y linux-aws
      sudo reboot
      #If using specific kernel package:
      mkdir -p /home/ubuntu/lustre
      Copy 2 lustre files from to Luster directory
      cd lustre 
      sudo apt-get update
      sudo apt-get install -y ./lustre-client-modules-4.15.0-1054-aws_2.10.8-1_amd64.deb ./lustre-utils_2.10.8-1_amd64.deb
      sudo reboot
      #To verify
      sudo modprobe -v lustre
      sudo lctl get_param version
      sudo lnetctl net show
    • 要挂载FSx for Lustre文件系统,请输入以下代码:
      sudo mkdir -p /home/ubuntu/ps-fsx
      sudo mount -t lustre fs-005ecf75685cba987.fsx.us-east-1.amazonaws.com@tcp:/fsx /home/ubuntu/ps-fsx
      sudo chown ubuntu /home/ubuntu/ps-fsx
    • 将BERT训练数据上传至Lustre文件系统。关于在EC2实例上生成BERT训练数据的更多操作说明,请参阅GitHub上的Getting the data部分。
    • 在Lustre文件系统上配置训练输出日志文件目录。
    • 在Lustre文件系统上配置检查点目录。
  • 安装FairSEQ。Fairseq(-py)是一款序列建模工具包,可用于训练定制化模型以执行翻译、摘要、语言建模以及其他文本生成任务。安装Fairsq的前提要在Ubuntu 18 DLAMI中配置。详见以下代码:
    PyTorch version >= 1.2.0
    Python version >= 3.5
    For training new models, you'll also need an NVIDIA GPU and NCCL
    For faster training install NVIDIA's apex library with the --cuda_ext option
    要通过源代码安装fqirseq以进行本地开发,请输入以下代码:
    git clone https://github.com/pytorch/fairseq
    cd fairseq
    pip install --editable .
  • 通过控制台为当前P3dn实例创建一个镜像,并记录其AMI ID。
  • 为BERT训练启动主节点(c5n实例)。
  • 使用BERT训练AMI启动8个P3dn.24xlarge实例。所有P3dn实例都应位于同一可用区、同一子网,同一置放群组内。
  • 测试所有P3dn实例都启用了EFA。
  • 安装并配置AWS ParrallelCluster。本文使用AWS ParallelCluster 2.6.0版本。关于更多详细信息,请参阅 GitHub repo。启动AWS ParrallelCluster的关键步骤如下所示:
    • 使用以下代码安装AWS ParallelCluster:
      pip3 install aws-parallelcluster --upgrade –user
      
      pcluster version
    • 使用以下代码配置AWS ParallelCluster:
      pcluster configure  -c  <path to configuration file>GitHub下载配置文件模板。在本用例中,选择Slurm Scheduler。
    • 使用以下代码启动HPC集群:
      pcluster create <mycluster>

如果您还不熟悉AWS ParallelCluter,请遵循步骤1至10以确保您的集群具有正确配置,能够顺利启动多节点深度学习训练作业。在成功完成多节点训练之后,您即可使用AWS ParallelCluster以自动化方式快速部署HPC集群。在使用AWS ParallelCluster时,各操作步骤无需手动执行,这些配置包含在AWS ParallelCluter配置文件当中。建议您创建一个BERT训练AMI,为了一致性性能来标准化您的软件栈。

运行BERT训练

您使用BERT与PyTorch库,快速高效地训练模型,在AWS HPC基础设施上获得接近一流水准的句子翻译性能。Fairseq提供多种用于模型训练及评估的命令行工具。本文使用的fairseq-train工具能够在单个或多个GPU和 Roberta_large架构之上训练新模型。RoBERTa迭代执行BERT的预训练过程,并执行以下操作:

  • 延长模型训练时间,在更多训练数据上使用更大批次
  • 删除下一句子预测目标
  • 在更长句子上进行训练
  • 动态变更应用到训练数据中的masking模式。

在完成BERT训练设置之后,从主节点启动BERT训练脚本,在全部GPU实例之上运行训练作业。在训练过程中,您可以运行nvidia-smi命令以检查BERT集群内各GPU的实际性能。本文将使用以下训练脚本,说明如何在NLP中实际应用迁移学习技术,借此创建出能够以极低成本完成一系列NLP任务的高性能模型:

#!/bin/bash

source activate pytorch_p36

# remove existing checkpoint
#rm -rf /home/ubuntu/fairseq/checkpoints /home/ubuntu/checkpoints
#rm -rf /home/ubuntu/ps-fsx/checkpoints/*

WORLD_SIZE=$1
RANK=$2
DIST_PORT=12234
DDP_BACKEND=c10d
BUCKET_CAP_MB=200
TOTAL_UPDATE=500
MAX_SENTENCES=8
UPDATE_FREQ=1

DATABIN=/home/ubuntu/ps-fsx/data/wikitext-103
OUTDIR=/home/ubuntu/ps-fsx/out
SAVEDIR=/home/ubuntu/ps-fsx/checkpoints

# setup NCCL to use EFA
export FI_PROVIDER=efa
export FI_OFI_RXR_RX_COPY_UNEXP=1
export FI_OFI_RXR_RX_COPY_OOO=1
export NCCL_DEBUG=INFO
export NCCL_TREE_THRESHOLD=0
export NCCL_SOCKET_IFNAME=ens5
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH
export

fairseq-train \
$DATABIN \
    --log-format json --log-interval 25 \
    --seed 1 \
    --fp16 --memory-efficient-fp16 \
    --criterion masked_lm \
    --optimizer adam \
    --lr-scheduler polynomial_decay \
    --task masked_lm \
    --num-workers 2 \
    --max-sentences $MAX_SENTENCES \
     --distributed-world-size $WORLD_SIZE \
     --distributed-init-method tcp://172.31.33.186:12234 \
     --distributed-rank $RANK \
     --ddp-backend $DDP_BACKEND \
     --bucket-cap-mb $BUCKET_CAP_MB \
     --fast-stat-sync \
     --arch roberta_large \
     --max-epoch 2 \
     --max-update $TOTAL_UPDATE \
     --clip-norm 1.0 \
     --update-freq $UPDATE_FREQ \
     --lr 0.0006 \
     --save-dir $SAVEDIR \
     --sample-break-mode complete \
     --tokens-per-sample 512 \
     --adam-betas '(0.9, 0.98)' --adam-eps 1e-06 \
     --warmup-updates 24000 \
     --total-num-update $TOTAL_UPDATE \
     --dropout 0.1 --attention-dropout 0.1 --weight-decay 0.01 | tee $OUTDIR/train.$RANK.$WORLD_SIZE.log

BERT训练结果被记录在FSx for Lustre文件系统当中。随着GPU数量的增加,训练性能也表现出线性提高。使用同样的数据集,训练过程中使用的GPU数量越多,每秒字数(wps)也开始呈线性增加。

资源清理

为了避免产生额外费用,请在训练完成之后关闭主节点、各工作节点以及FSx集群。另外,请删除保存在Amazon S3中的所有模型工件。

总结

为深度学习训练设置机器学习基础设施往往是一项艰巨的任务,您通常需要依赖基础设施团队构建起相应环境,这将极大浪费宝贵的生产时间。此外,深度学习技术库与软件包也一直在快速变化,您需要测试各软件包之间的互操作性。使用Ubuntu 18 DLAMI,您将无需担心于基础设施设置与软件安装工作。AWS DLAMI已经为所有主流机器学习框架预先构建了必要的深度学习库与软件包,让您能够专注于模型的训练、调优与推理。

 

本篇作者

Purna Sanyal

Purna Sanyal,是一名AWS Strategic Accounts资深解决方案架构师。他为客户提供技术思维领导、架构指导与概念验证支持,满足客户提出的战略需求并充分发挥各项AWS服务的强大功能。他目前的主要研究方向在于云迁移、HPC、分析以及机器学习领域。

本篇译者

申绍勇

申绍勇是AWS解决方案架构师,主要负责基于AWS的云计算解决方案进行架构咨询和设计,目前服务移动互联网(包含媒体、游戏、广告、电商、区块链等)、金融、制造业等各行业客户,提供有关云计算、AI、大数据、物联网、高性能计算等各类云计算解决方案的咨询和架构设计。