如何運行具備奇點的NGC深度學習容器node
How to Run NGC Deep Learning Containers with Singularitypython
高性能計算機和人工智能的融合使新的科學突破成爲可能。如今須要在同一個系統上同時部署HPC和AI工做負載。 docker
支持HPC和AI工做負載所需的軟件環境的複雜性是巨大的。應用軟件依賴於許多相互依賴的軟件包。僅僅得到一個成功的構建是一個挑戰,更不用說確保構建獲得優化,以利用最新的硬件和軟件功能。 數據庫
容器是一種普遍採用的下降HPC和AI軟件部署複雜性的方法。整個軟件環境,從深度學習框架自己,到性能所必需的數學和通訊庫,都打包成一個包。因爲容器中的工做負載老是使用相同的環境,所以性能是可複製和可移植的。 bash
NGC是一個GPU優化軟件的註冊中心,經過提供按期更新和驗證的HPC和AI應用程序容器,使科學家和研究人員受益不淺。NGC最近宣佈從19.11版開始,支持在Singularity容器運行時使用deep learning容器。這大大簡化了使用奇點的HPC站點採用人工智能方法的過程。 網絡
這文說明了NGC和Singularity是如何極大地簡化在HPC系統上部署深度學習工做負載的。框架
ResNet首次用於贏得2015年ImageNet比賽,至今還是一種流行的圖像分類模型,被普遍用做深度學習訓練的基準。在幾個簡單的步驟中,將演示如何使用TensorFlow和ImageNet數據庫中的圖像訓練ResNet-50v1.5模型。儘管目前ResNet模型的訓練幾乎是微不足道的,但這裏所示的相同方法能夠用於擴展更大模型的訓練,也能夠用於其深度學習框架。分佈式
Figure 1: ResNet-50 architecture (source)ide
除了做爲一個容器註冊表,NGC還提供完整的人工智能工做流,包括預先訓練的模型和腳本。一個例子是TensorFlow的ResNet-50v1.5模型;對於這個例子,嚴格遵循快速入門指南。 該示例使用Singularity版本3,並假設已經從集羣資源管理器中得到了交互式節點分配。 性能
1. 下載並提取ImageNet數據集,如《快速入門指南》的步驟2「下載數據」所述。請注意,ResNet-50的整體性能對用於存儲映像的文件系統的性能敏感,所以整體性能將有所不一樣。在運行中,使用了一個本地SSD。
2.NGC TensorFlow 19.11容器映像已經包含ResNet-50模型腳本,位於/workspace/nvidia examples/resnet50v1.5中,因此使用了。或者,能夠從NGC模型腳本頁面下載模型腳本。 3. 使用奇點拉動NGC TensorFlow容器。這是一個簡單的命令,能夠做爲非特權用戶運行。(注意:若是IT管理員已經設置了NGC容器複製器,則TensorFlow容器可能已經位於系統中。)
$ singularity pull tensorflow-19.11-tf1-py3.sif docker://nvcr.io/nvidia/tensorflow:19.11-tf1-py3
4. 容器下載完成後,第四步也是最後一步是訓練模型。讓從使用一個GPU和FP16開始。NGC模型腳本頁的Performance選項卡上的相應Python命令行須要包裝在命令中,以啓動在上一步中下載的Singularity容器圖像。
$ singularity run --nv -B /local/imagenet:/data/imagenet pytorch-19.11-tf1-py3.sif python /workspace/nvidia-examples/resnet50v1.5/main.py --mode=training_benchmark --use_tf_amp --warmup_steps=200 --batch_size=256 --data_dir=/data/imagenet --results_dir=/tmp/resnet
使用了兩個具備奇點的選項,-nv和-B。第一個選項,-nv在奇點中啓用NVIDIA GPU支持。第二個,-B,bind將/local/imagenet目錄掛載到提取imagenet數據庫的主機上,掛載到容器中的/data/imagenet位置。修改此項以使用提取ImageNet數據庫的位置。python命令取自1gpu/FP16案例的NGC模型腳本頁面,只需稍做修改便可使用NGC容器中包含的模型腳本。
在運行中,使用Singularity得到了大約每秒980張圖像,Docker的結果幾乎相同,都使用了一個NVIDIA V100 GPU和19.11 TensorFlow NGC容器圖像。
分佈式計算是高性能計算的重要組成部分。像Horovod這樣的框架支持分佈式深度學習。TensorFlow NGC容器包括Horovod,以實現多節點的開箱即用訓練。在本節中,將展現Singularity做爲HPC容器運行時的起源如何使執行多節點訓練變得容易。在這裏,從集羣資源管理器中分配了兩個集羣節點,每一個節點都有4xV100 gpu。
使用Singularity擴展MPI工做負載的一般方法是使用容器外部的MPI運行時在容器實例內部啓動分佈式任務(也稱爲「outside in」或「hybrid」)。與運行本機MPI工做負載相比,此方法所需的更改最少,但確實須要主機上的MPI運行時與容器中的MPI庫兼容。19.11 NGC TensorFlow映像捆綁了OpenMPI版本3.1.4,所以任何大於3.0的主機OpenMPI版本都應該能夠工做,可是版本越接近匹配越好。
啓動一個兩節點的訓練運行,每一個節點使用4xgpu的奇點和NGC容器是很簡單的。像往常同樣使用mpirun並使用命令從上面啓動Singularity容器。實際上,與上一個示例中的單個GPU命令行相比,惟一的區別是使用mpirun啓動。
$ mpirun singularity run --nv -B /local/imagenet:/data/imagenet tensorflow-19.11-tf1-py3.sif python /workspace/nvidia-examples/resnet50v1.5/main.py --mode=training_benchmark --use_tf_amp --warmup_steps=200 --batch_size=256 --data_dir=/data/imagenet --results_dir=/tmp/resnet
注意:在這種狀況下,主機上的MPI運行時能夠識別資源管理器,所以不須要手動指定要啓動多少MPI列組或如何放置。MPI運行時可以從交互式SLURM做業分配(srun--nodes 2--ntasks 8--pty--time=15:00bash-i)中推斷出此信息。若是MPI運行時不是這樣設置的,或者集羣使用不一樣的資源管理器,則須要手動告訴MPI運行時使用兩個節點,每一個節點具備4個列組/GPU,例如mpirun-n 8--n per node 4--hostfile hostfile其中hostfile包含已分配的節點的名稱,每行一個,或者mpirun-n 8-H node1:4,node2:4,用分配給節點的名稱替換node1和node2。
應該注意到,在兩個節點上已使用總共8個GPU(每一個節點4個GPU)啓動了8個訓練任務。在使用的特定系統上,分佈式訓練性能大約爲每秒6800個圖像,相對於單個GPU,大約加速6.9倍。使用XLA(-use-XLA)和/或DALI(-use-DALI)能夠進一步提升性能,這兩個都包含在NGC容器圖像中。
使用Singularity擴展MPI工做負載的另外一種方法是在容器中使用MPI運行時(也稱爲「inside out」或「self-contained」)。這消除了對兼容主機MPI運行時的依賴,但須要額外的配置來手動指定做業的大小和形狀,以及在容器中啓動全部任務。這兩種方法,以及優缺點,在網絡研討會「用奇點擴展NGC工做負載」中有更詳細的描述。
前面的示例假設有一個交互式會話,可是也能夠經過一個能夠提交給資源管理器的做業腳本(例如,使用SLURM的sbatch)來部署訓練。
#!/bin/bash
#SBATCH -J resnet50
#SBATCH -t 15:00
#SBATCH -N 2
#SBATCH -n 8
# site specific
module load singularity openmpi/3.1.0
# dataset staging, if necessary
# ...
mpirun singularity run --nv -B /local/imagenet:/data/imagenet tensorflow-19.11-tf1-py3.sif python /workspace/nvidia-examples/resnet50v1.5/main.py --mode=training_benchmark --use_tf_amp --warmup_steps=200 --batch_size=256 --data_dir=/data/imagenet --results_dir=/tmp/resnet
當即快速部署人工智能工做負載
NGC提供的容器圖像通過驗證、優化,並按期更新爲全部流行的深度學習框架的最新版本。隨着奇點支持的增長,NGC容器如今能夠更普遍地部署,包括HPC中心,我的GPU支持的工做站,以及喜歡的雲。
下載一個NGC容器並運行