+-
多征用几台电脑,今天我们一起玩玩多GPU分布式训练的深度学习

image

尝试过的童鞋都知道,要想玩转深度学习,尤其是模型的训练,可得准备好性能足够强的电脑。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大小、经过调优的存储桶。
image

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设备。

image

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实例的特性:

image

AWS ParallelCluster

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

设置分布式BERT训练环境

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

· 创建一个VPC包含一个公共子网、一个私有子网,和一个集群置放群组。EFA还需要一个安全组,该安全组允许所有入站与出站流量到达和来自它自身。

· 在安全组的Inbound和Outbound选项卡中,完成以下操作:

选择Edit。 在Type部分,选择All traffic。 在Source部分,选择Custom。 输入复制的安全组ID到字段内的。 选择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已经为所有主流机器学习框架预先构建了必要的深度学习库与软件包,让我们能够专注于模型的训练、调优与推理。

image