尝试过的童鞋都晓得,要想玩转深度学习,尤其是模型的训练,可得筹备好性能足够强的电脑。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 选项卡中,实现以下操作:
- 抉择 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 曾经为所有支流机器学习框架事后构建了必要的深度学习库与软件包,让咱们可能专一于模型的训练、调优与推理。