在Training方面比较重要的库是cuDNN。cuDNN是深度学习基础模块加速库,可以支持所有主流的深度学习框架,比如Caffe、Tensorflow、CNTK、Theano、PyTorch等,这些基础模块指的是深度学习框架中常用的一些layer(神经网络层)操作,比如卷积、LSTM、全连接、Pooling(池化层)等。那么cuDNN的优势有什么呢?首先它将layer专门针对GPU进行了性能调优;第二是cuDNN以调用库函数的方式进行神经网络设计,能够大大节省开发者的时间,让大家可以将时间和精力集中在神经网络的设计和实现,而不是去进行GPU代码的开发和性能调优。
在这个benchmark中大家都可以看到,分别使用了八颗不同架构的GPU服务器对GoogLeNet网络进行训练的性能对比,大家可以只看最后两个绿色的柱状图,分别代表的是八颗P100的DGX-1服务器以及八颗Tesla V100的DGX-1V服务器。大家可以看到二者的性能差异大概是在2.5倍左右,也就是我们在Tesla V100上进行Deep Learning 训练时的性能提升水平。
接下来介绍的SDK是NCCL。
深度学习中常常需要多GPU并行训练,而Nvidia的NCCL库NVIDIA/nccl(https://github.com/NVIDIA/nccl)在各大深度学习框架(Caffe/Tensorflow/Torch/Theano)的多卡并行中经常被使用。
NCCL是Nvidia Collective multi-GPU Communication Library的简称,它是一个实现多GPU的collective communication通信(all-gather, reduce, broadcast)库,Nvidia做了很多优化,以在PCIe、Nvlink、InfiniBand上实现较高的通信速度。比方说all-reduce、all-gather以及broadcast等等,它能够自动检测GPU之间的拓扑连接关系,再结合通信采用最佳的路径实现数据IO。
在最新的NCCL 2.0版本里面,增加了对多服务器节点的支持,在NCCL 1.0版本里面我们只是支持单节点内的多GPU,但目前NCCL 2.0可以支持多节点的,并且可以同时支持PCle和NVLink连接方式。大家从上面的benchmark可以看到,从单节点一颗GPU到单节点八颗GPU,再到两个节点16颗GPU,以及四个节点32颗GPU,使用NCCL实现的Deep Learning 训练的吞吐性能几乎是线性增长的,其实这是非常难达到的一个性能。而目前NCCL 2.0最多可以支持八个服务器节点的并行。