多徵用幾臺電腦,今天咱們一塊兒玩玩多GPU分佈式訓練的深度學習

image

嘗試過的童鞋都知道,要想玩轉深度學習,尤爲是模型的訓練,可得準備好性能足夠強的電腦。CPU卻是無所謂,但GPU,越多越好,越快越好。可就算你不差錢,裝備了最高端的AI專用GPU計算卡,面對複雜的模型,訓練起來依然要花大量時間等等等等……html

老闆和客戶都等着你快點出結果,怎麼提升訓練速度?多找幾臺電腦,進行分佈式訓練吧,效果槓槓滴!linux

多GPU分佈式訓練該怎麼玩?

AWS Deep Learning AMI(Ubuntu 18.04)經過優化,可用於EC2加速計算實例類型上的深度學習,藉此咱們就能夠經過多節點水平擴展更高效、更輕鬆地處理分佈式工做負載。它還擁有內置的Elastic Fabric Adapter(EFA)、英偉達GPU棧以及多種用於分佈式深度學習訓練的深度學習框架(TensorFlow、MXNet、PyTorch、Chainer、Keras)。所以咱們無需耗費時間安裝深度學習軟件與驅動程序,或者構建機器學習(ML)基礎設施,而是能夠集中精力在更短期內進行大規模訓練做業,並更快對機器學習模型進行迭代。git

本文將展現如何輕鬆在AWS高性能計算(HPC)架構上運行大規模、高性能、網絡敏感、低延遲、緊耦合的機器學習分佈式訓練做業,這個架構包括Ubuntu 18 DLAMI、P3dn實例上的Elastic Fabric Adapter(EFA),以及Amazon FSx for Lustre。github

下文將展現如何在多節點GPU集羣上使用PyTorch框架運行Transformer的雙向編碼器表示(Bidirectional Encoder Representations from Transformers,簡稱BERT)模型。此外,本文還將介紹如何經過AWS ParallelCluster自動實現深度學習集羣的部署與管理操做。json

BERT介紹

BERT是一種預訓練語言表示的方法,可以在各種天然語言處理(NLP)任務中帶來行業領先的處理結果。咱們能夠在大型文本語料庫(例如維基百科)上訓練通用語言理解模型,並使用該模型支持多種下游NLP任務(例如回答問題)。BERT是全球首套用於預訓練NLP的無監督深度雙向系統。ubuntu

無監督意味着BERT在訓練過程當中只須要使用純文本語料庫。這一點很是重要,由於大量的多語言純文本數據在網上公開可用。下表總結了本文中使用的BERT過程的配置,涵蓋反向傳遞和連通一個200MB大小、通過調優的存儲桶。
image安全

AWS上用於BERT訓練的HPC概覽

本示例中的BERT程序運行在AWS HPC架構服務上,其中包含Ubuntu18 DLAMI、P3dn實例上的EFA,以及FSx for Lustre for Ubuntu18。bash

AWS Deep Learning AMI (Ubuntu 18.04)

DLAMI使用同時支持Python 2與Python 3的Anaconda平臺,輕鬆在不一樣框架之間切換。AWS Deep Learning AMI採用英偉達CUDA 九、9.二、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選項卡中,完成如下操做:

  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已經爲全部主流機器學習框架預先構建了必要的深度學習庫與軟件包,讓咱們可以專一於模型的訓練、調優與推理。

image

相關文章
相關標籤/搜索