亚马逊AWS官方博客
玩转GPU实例之系统工具 – NVIDIA 篇
前言
在这个系列的前面三篇中,我们逐次的介绍了对于一个EC2实例,特别是针对Ubuntu 18.04这个版本的操作系统下的实例从创建到系统优化的一些方法。这些方法不仅对于GPU实例有效,对于其它类型的实例也同样有效。而在本篇,我们将针对GPU实例来介绍适用于GPU实例的一些系统工具与开发框架。这些工具可以帮助我们更好的挖掘GPU实例的强大实力。这些工具与框架 包括了:
- NVIDIA的编程接口与工具CUDA(Compute Unified Device Architecture)
这是一个并行计算平台和应用程序编程接口,应用于Nvidia 的GPU - GPU加速的深度神经网络库cuDNN
利用GPU加速的用于深度神经网络的程序库。 cuDNN提供了高度优化的诸如卷积、池化、规范化和激活层等的实现 - 高速互联的NCCL(Collective 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。
安装完成以后,EC2实例需要重新启动。之后,我们通过nvidia-smi 命令就可以看到当前的GPU状况。例如在一台P3 8Xlarge 的实例上我们就可以看到这样的结果
cuDNN 与TensorRT的安装
NCCL 的安装
容器化的GPU工具与资源
深度学习的需要通过GPU来满足对于计算的需求。除了直接将程序运行在GPU实例上,可能有很多人希望能够通过容器来满足GPU资源的共享、以及更灵活的部署方式。我们遇到的第一个问题就是Docker 能支持GPU吗?解决这个问题的答案就是naidia-docker。这个工具的主要目的就是利用NVIDIA GPU构建和运行Docker容器。安装的脚本如下:
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 的脚本如下:
安装nclcli 工具的脚本在这里:
到目前为止,关于NVIDIA 的GPU的主要的工具库都已经安装完毕。接下来我们要要一起来了解一下注入MKL、OpenCV以及OpenMPI这一样一些系统工具和框架的安装配置,敬请期待。