亚马逊AWS官方博客

玩转GPU实例之系统工具 – NVIDIA 篇

前言

在这个系列的前面三篇中,我们逐次的介绍了对于一个EC2实例,特别是针对Ubuntu 18.04这个版本的操作系统下的实例从创建到系统优化的一些方法。这些方法不仅对于GPU实例有效,对于其它类型的实例也同样有效。而在本篇,我们将针对GPU实例来介绍适用于GPU实例的一些系统工具与开发框架。这些工具可以帮助我们更好的挖掘GPU实例的强大实力。这些工具与框架 包括了:

 

  • NVIDIA的编程接口与工具CUDACompute Unified Device Architecture
    这是一个并行计算平台和应用程序编程接口,应用于Nvidia 的GPU
  • GPU加速的深度神经网络库cuDNN
    利用GPU加速的用于深度神经网络的程序库。 cuDNN提供了高度优化的诸如卷积、池化、规范化和激活层等的实现
  • 高速互联的NCCLCollective Communications Library
    实现了针对NVIDIA GPU性能优化的多GPU和多节点集体通信原语。可通过PCIe和NVLink高速互连实现高带宽和低延迟
  • GPU容器的NVIDIA Container Toolkit
    构建和运行GPU加速的Docker容器
  • 容器化资源库NVIDIA GPU Cloud (NGC)
    用于深度学习,机器学习和高性能计算(HPC)的GPU优化软件的中心,提供了许多机器学习、深度学习领域的高质量容器映像于模型
  • 提供高性能推理的TensorRT
    NVIDIA 的TensorRT是用于高性能深度学习推理的SDK。 它包括深度学习推理优化器和运行时,可为深度学习推理应用程序提供低延迟和高吞吐量

 

从显卡开始的GPU并行计算

计算机的显卡可以说和PC一样古老。也就是说,1981 年IBM 的Monochrome 可以被看作是最初的显卡。到了1988年,ATI公司(已被AMD收购)提供了16位的2D VGA Wonder卡。到了1996年,我们可以购买一块3dfx的 3D图形加速卡,以便全速运行第一人称射击游戏Quake。到了1999年,NVIDIA成功推出了GeForce 256,这是第一款可以被称为GPU的显卡。最初,推出 GPU的主要原因就是游戏。直到后来我们才将GPU用于数学计算、科学、工程以及今天大热的深度学习。

2003年,由Ian Buck领导的一组研究人员揭开了Brook的神秘面纱,这是第一个被广泛采用以数据并行结构扩展的C语言的编程模型。Ian Buck随后加入了NVIDIA,并于2006年领导了CUDA的发布,这是业界第一个用于GPU的通用计算的商业解决方案。

作为CUDA的竞争对手的OpenCL则由Apple和Khronos Group于2009年推出。其设计目标为异构计算提供一个编程标准。这个雄心勃勃的标准不仅支持NVIDIA的GPU还包括了Intel 与 AMD 的CPU等。尽管OpenCL由于其通用性听起来很吸引人,但在实际中的表现却并不如人意。与此同时, CUDA却在不断改进和扩展了其适用的范围,而NVIDIA的GPU产品则保持了与其项一致的高速发展。以EC2 P3实例为例,该实例可支持高达 8 个 NVIDIA® V100 Tensor Core GPU,这些实例可以实现最高 1 petaflop 的混合精度性能,可以显著加快机器学习和高性能计算应用程序的速度。这张图就是配置在P3实例上的NVIDIA V100。

注:FLOPS(Floating-point operations per second),含义是每秒所运行的浮点运算次数。一个PFLOPS(petaFLOPS)等于每秒一千兆/一千万亿(1015)次的浮点运算能力。作为一个对比,著名的超级计算机“天河一号”的性能指标为2.566 petaflop。(来源:wikipedia.org)

与今天代表世界上性能最高的Toop 500 系统相比,例如IBM为美国能源部旗下橡树岭国家实验室开发建造的超级电脑Summit,其理论运算性能为200 petaflop 造价高达2亿美元。如此看来P3实例的性能/价格比可以让我们满意了。

来源:https://www.top500.org/list/2019/06/?page=1

CUDA工具包

在CUDA工具包包括软件库、调试和优化工具、编译器,文档和运行时库来部署应用程序。它具有支持深度学习、线性代数信号处理和并行算法的组件。通常,CUDA库支持所有Nvidia GPU系列,但在最新一代产品上表现更佳,例如V100。这款GPU对于深度学习培训工作负载,其速度可能比它的上一代产品P100快上3倍。

最初的CUDA SDK于2007年2月15日发布,适用于Microsoft Windows和Linux。CUDA可与G8x系列及以后的所有Nvidia GPU配合使用,包括GeForce,Quadro和Tesla系列。 今天我们看到的CUDA 工具包的主要组件包括了:

  • cuBLAS – CUDA基本线性代数子例程库
  • CUDART – CUDA运行时库
  • cuFFT – CUDA快速傅立叶变换库
  • cuRAND – CUDA随机数生成库
  • cuSOLVER –基于CUDA的密集和稀疏直接求解器集合
  • cuSPARSE – CUDA稀疏矩阵库
  • NPP – NVIDIA Performance Primitives库
  • nvGRAPH – NVIDIA Graph Analytics库
  • NVML – NVIDIA管理库
  • NVRTC –用于CUDA C ++的NVIDIA Runtime Compilation库
  • GameWorks PhysX –是一个多平台游戏物理引擎
  • CUTLASS 1.0 –自定义线性代数算法
  • nvJPEG –混合JPEG处理

CUDA深度学习库

在深度学习领域,NVIDIA推出了三个主要的GPU加速库:

  • cuDNN,这是大多数开源深度学习框架的最重要的GPU组件
  • NCCL,实现了多gpu和多节点的集体通信原语,这些原语针对GPU进行了性能优化。提供了诸如All-gather、All-reduce、Broadcast、Reduce、Reduce-scatter等例程,这些例程经过优化可以在PCIe和NVLink高速互连上实现高带宽和低延迟
    TensorRT是Nvidia的高性能深度学习推理优化器和运行时,用来帮助优化神经网络模型,以较低的精度进行高精度校准,并将经过训练的模型部署到云或者边缘/嵌入式系统之中。

CUDA 工具包的安装

我的安装脚本如下。需要注意的是,在安装CUDA 的同时,NVIDIA GPU 驱动会被自动安装。并且,CUDA工具包需要与GPU驱动相匹配,不要随意升级或者降级GPU驱动。当前CUDA的版本为10.2,GPU 驱动的版本为440.64.00-1。

#!/bin/bash

if [ ! -d "$HOME/Downloads" ]; then
  mkdir -p $HOME/Downloads
fi
cd $HOME/Downloads
sudo apt-get install -y software-properties-common

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin -q -o /dev/null
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600

sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"

sudo apt-get update
sudo apt-get -y install cuda

#NVIDIA CUDA provides advanced profiling support
sudo apt-get -y install libcupti-dev

cat <<EOT >> $HOME/.bashrc

#Nvidia cuda toolkit
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64
export PATH=\$PATH:/usr/local/cuda/bin
EOT
sudo ldconfig

echo "Reboot required."
echo "Done."

 

安装完成以后,EC2实例需要重新启动。之后,我们通过nvidia-smi 命令就可以看到当前的GPU状况。例如在一台P3 8Xlarge 的实例上我们就可以看到这样的结果

cuDNN 与TensorRT的安装

#!/bin/bash

if [ ! -d "$HOME/Downloads" ]; then
  mkdir -p $HOME/Downloads
fi
cd $HOME/Downloads

#remove libcudnn installed¬
sudo apt-get -y purge libcudnn7 libcudnn7-dev

wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb -q -o /dev/null
sudo apt install -y ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb

#cudnn
sudo apt-get update
sudo apt-get -y install libcudnn7 libcudnn7-dev

#TensorRT
#sudo apt install -y libnvinfer6 libnvinfer-dev python3-libnvinfer-dev libnvinfer-plugin6 libnvinfer-plugin-dev

sudo ldconfig
echo "Done."

NCCL 的安装

#!/bin/bash

#remove libnccl installed
sudo apt-get -y purge libnccl2 libnccl-dev

sudo apt-get update
sudo apt-get -y  install libnccl2 libnccl-dev

sudo ldconfig
echo "Done."

容器化的GPU工具与资源

深度学习的需要通过GPU来满足对于计算的需求。除了直接将程序运行在GPU实例上,可能有很多人希望能够通过容器来满足GPU资源的共享、以及更灵活的部署方式。我们遇到的第一个问题就是Docker 能支持GPU吗?解决这个问题的答案就是naidia-docker。这个工具的主要目的就是利用NVIDIA GPU构建和运行Docker容器。安装的脚本如下:

#!/bin/bash

# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
echo "Done."

NGC (Nvidia GPU Cloud)- 利用NGC的Docker容器进行深度学习

解决了Docker 对于GPU的支持,我们就会试图寻找更好的支持深度学习的Docker映像。有了这样的资源,我们就不再为安装深度学习环境而烦恼,不再遇到CUDA版本和GCC编译器冲突的情况。而我们所需要的,NGC已经为我们准备好了。

这些资源涵盖了我们常用的TensorFlow 、Pytorch、MXNet,但是也有使用这些框架训练好的模型等的Dockers映像。例如,通过这样一条命令就可以获得最新的TensorFlow Docker 映像。

docker pull nvcr.io/nvidia/tensorflow:20.03-tf2-py3

值得注意的是,这些Docker 映像包含的内容较多文件尺寸较大,下载是对于网络有较高的要求。例如上面提到的TensorFlow 映像的尺寸就为2.78 GB。

使用NGC需要在其网站上进行注册,网站的地址为https://ngc.nvidia.com/。使用的时候除了需要docker工具以外,还可以通过安装ngccli 来获得便利。

在Ubuntu 18.04 的环境中配置Docker 的脚本如下:

#!/bin/bash

# Uninstrall old versions
sudo apt-get remove -y docker docker-engine docker.io containerd runc

sudo apt update
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

#add the GPG key for the official Docker repository
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#Add the Docker repository to APT sources
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io

# Uninstall Docker Engine
#sudo apt-get purge docker-ce
#sudo rm -rf /var/lib/docker

#Executing the Docker Command Without Sudo
sudo usermod -aG docker ${USER}
docker --version
echo "Done."

安装nclcli 工具的脚本在这里:

#!/bin/bash
set -e

if ! [ -x "$(command -v unzip)" ]; then
  sudo apt install unzip -y
fi

if [ ! -d "${HOME}/Downloads" ]; then
        mkdir -p ${HOME}/Downloads
fi
cd ${HOME}/Downloads

wget -q https://ngc.nvidia.com/downloads/ngccli_cat_linux.zip
unzip ngccli_cat_linux.zip
chmod u+x ngc
md5sum -c ngc.md5
sudo mv ngc /usr/local/bin
/bin/rm ngc*
ngc config set

echo "Down."

 

到目前为止,关于NVIDIA 的GPU的主要的工具库都已经安装完毕。接下来我们要要一起来了解一下注入MKL、OpenCV以及OpenMPI这一样一些系统工具和框架的安装配置,敬请期待。

 

本篇作者

费良宏

费良宏,AWS Principal Developer Advocate。在过去的20多年一直从事软件架构、程序开发以及技术推广等领域的工作。他经常在各类技术会议上发表演讲进行分享,他还是多个技术社区的热心参与者。他擅长Web领域应用、移动应用以及机器学习等的开发,也从事过多个大型软件项目的设计、开发与项目管理。目前他专注与云计算以及互联网等技术领域,致力于帮助中国的 开发者构建基于云计算的新一代的互联网应用。