尝试过的童鞋都晓得,要想玩转深度学习,尤其是模型的训练,可得筹备好性能足够强的电脑。CPU倒是无所谓,但GPU,越多越好,越快越好。可就算你不差钱,配备了最高端的AI专用GPU计算卡,面对简单的模型,训练起来仍然要花大量工夫等等等等……

老板和客户都等着你快点出后果,怎么进步训练速度?多找几台电脑,进行分布式训练吧,成果杠杠滴!

多GPU分布式训练该怎么玩?

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过程的配置,涵盖反向传递和连通一个200MB大小、通过调优的存储桶。

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性能:

l PyTorch框架 ——PyTorch是一款Python软件包,可能提供两项高级性能:具备弱小GPU减速性能的张量计算(如NumPy),以及在基于带式的主动求导零碎上构建的深度神经网络。本文示例中应用的PyTorch分支与标签为1.2版本。要激活PyTorch环境,请运行source activate pytorch_p36。

l 英伟达栈 —— 英伟达驱动程序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实例领有100Gbps网络带宽,且新的EFA网络接口容许高度可扩大的节点间通信。EFA实用于Amazon Linux与Ubuntu操作系统,而且与LibFabric集成。通过与英伟达的单干,AWS的EFA反对NCCL,该NCCL针对多GPU与多节点通信原语进行优化,并帮忙实现NVLink互连之上的高吞吐量。借助这些加强性能,咱们能够将机器学习训练作业扩大至数千个GPU上,从而更快提供训练后果。EFA操作系统会绕过网络机制,且其底层可扩大可靠性协定将被内置于Nitro控制器当中。这些Nitro控制器可能为实例之间的通信提供低提早、低抖动通道。下表所示,为本文示例中应用的P3dn.24xlarge实例的个性:

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 OutputEFA 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 itsudo /usr/bin/modprobe ib_uverbs

设置无明码SSH。要使应用程序可能在集群内的所有实例上运行,须要启用从主节点到各成员节点的无明码SSH拜访性能。主节点即咱们在其中运行应用程序的实例。在设置无明码SSH后,请禁用SSH的密钥验证性能。关上SSH配置文件/etc/ssh/sshd_config,搜寻以下指令并做出如下批改:

PasswordAuthentication noChallengeResponseAuthentication noUsePAM no

批改实现之后,保留文件并重新启动SSH服务。在Ubuntu或者Debian服务器上,运行以下命令:

sudo systemctl restart ssh

设置FSx for Lustre;Ubuntu 18.04须要带有反对FSx的补丁的特定2.10 Lustre分支。

要在Ubuntu 18上装置FSx for Lustre 客户端,请输出以下代码:

Install dependenciessudo apt-get updatesudo apt-get install -y build-essential debhelper pkg-config libsystemd-devsudo 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 installedsudo apt-get install -y linux-awssudo reboot#If using specific kernel package:mkdir -p /home/ubuntu/lustreCopy 2 lustre files from to Luster directorycd lustresudo apt-get updatesudo 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.debsudo reboot#To verifysudo modprobe -v lustresudo lctl get_param versionsudo lnetctl net show

要挂载FSx for Lustre文件系统,请输出以下代码:

sudo mkdir -p /home/ubuntu/ps-fsxsudo mount -t lustre fs-005ecf75685cba987.fsx.us-east-1.amazonaws.com@tcp:/fsx /home/ubuntu/ps-fsxsudo 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.0Python version >= 3.5For training new models, you'll also need an NVIDIA GPU and NCCLFor faster training install NVIDIA's apex library with the --cuda_ext option

要通过源代码装置fqirseq以进行本地开发,请输出以下代码:

git clone https://github.com/pytorch/fairseqcd fairseqpip 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 –userpcluster 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/bashsource activate pytorch_p36# remove existing checkpoint#rm -rf /home/ubuntu/fairseq/checkpoints /home/ubuntu/checkpoints#rm -rf /home/ubuntu/ps-fsx/checkpoints/*WORLD_SIZE=$1RANK=$2DIST_PORT=12234DDP_BACKEND=c10dBUCKET_CAP_MB=200TOTAL_UPDATE=500MAX_SENTENCES=8UPDATE_FREQ=1DATABIN=/home/ubuntu/ps-fsx/data/wikitext-103OUTDIR=/home/ubuntu/ps-fsx/outSAVEDIR=/home/ubuntu/ps-fsx/checkpoints# setup NCCL to use EFAexport FI_PROVIDER=efaexport FI_OFI_RXR_RX_COPY_UNEXP=1export FI_OFI_RXR_RX_COPY_OOO=1export NCCL_DEBUG=INFOexport NCCL_TREE_THRESHOLD=0export NCCL_SOCKET_IFNAME=ens5export LD_LIBRARY_PATH=$LD_LIBRARY_PATHexportfairseq-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曾经为所有支流机器学习框架事后构建了必要的深度学习库与软件包,让咱们可能专一于模型的训练、调优与推理。