亚马逊AWS官方博客
使用 Ubuntu18 DLAMI,P3dn 实例与 EFA,和 Amazon FSx for Lustre 实现大规模多 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过程的配置,涵盖反向传递和连通一个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选项卡中,完成以下操作:
- 选择Edit。
- 在Type部分,选择All traffic。
- 在Source部分,选择Custom。
- 输入您复制的安全组ID到字段内的。
- 选择Save。
- 启动一个启用了EFA使用Ubuntu 18 DLAMI的P3dn.24xlarge实例。您可以通过Amazon管理控制台、AWS命令行界面(AWS CLI)或者SDK工具包启动这个P3dn实例。机器学习集群内的所有P3dn实例都应在同一可用区、同一子网和同一置放群组内,用以运行BERT训练。
- 要检查当前所安装的EFA安装器的版本,请输入以下代码:
-
- 要验证您的实例能否正常访问EFA设备,请输入以下代码:
EFA设备有时会丢失,这是因为实例上的ib_uverbs驱动程序未加载。要验证这一点并重新尝试寻找EFA设备,请使用以下代码:
- 设置无密码SSH。要使您的应用程序能够在集群内的所有实例上运行,您需要启用从主节点到各成员节点的无密码SSH访问功能。主节点即您在其中运行应用程序的实例。在设置无密码SSH之后,请禁用SSH的密钥验证功能。打开SSH配置文件
/etc/ssh/sshd_config
,搜索以下指令并做出如下修改: - 设置FSx for Lustre;Ubuntu 18.04需要带有支持FSx的补丁的特定的2.10 Lustre分支。
- 要在Ubuntu 18上安装FSx for Lustre客户端,请输入以下代码:
-
- 要挂载FSx for Lustre文件系统,请输入以下代码:
-
- 将BERT训练数据上传至Lustre文件系统。关于在EC2实例上生成BERT训练数据的更多操作说明,请参阅GitHub上的Getting the data部分。
- 在Lustre文件系统上配置训练输出日志文件目录。
- 在Lustre文件系统上配置检查点目录。
- 安装FairSEQ。Fairseq(-py)是一款序列建模工具包,可用于训练定制化模型以执行翻译、摘要、语言建模以及其他文本生成任务。安装Fairsq的前提要在Ubuntu 18 DLAMI中配置。详见以下代码:
- 通过控制台为当前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:
-
- 使用以下代码配置AWS ParallelCluster:
-
- 使用以下代码启动HPC集群:
如果您还不熟悉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任务的高性能模型:
BERT训练结果被记录在FSx for Lustre文件系统当中。随着GPU数量的增加,训练性能也表现出线性提高。使用同样的数据集,训练过程中使用的GPU数量越多,每秒字数(wps)也开始呈线性增加。
资源清理
为了避免产生额外费用,请在训练完成之后关闭主节点、各工作节点以及FSx集群。另外,请删除保存在Amazon S3中的所有模型工件。
总结
为深度学习训练设置机器学习基础设施往往是一项艰巨的任务,您通常需要依赖基础设施团队构建起相应环境,这将极大浪费宝贵的生产时间。此外,深度学习技术库与软件包也一直在快速变化,您需要测试各软件包之间的互操作性。使用Ubuntu 18 DLAMI,您将无需担心于基础设施设置与软件安装工作。AWS DLAMI已经为所有主流机器学习框架预先构建了必要的深度学习库与软件包,让您能够专注于模型的训练、调优与推理。