有志于投身人工智能研究的青年,在关注计算机专业选择时,也不妨先了解一下影响深度学习训练速度的种种因素。
本文实验数据来源:知乎@Justin ho
工程师之于计算机就相当于赛车手对待跑车一样,必须十分熟悉它的每一个部件,明白各自的用途,然后在每一次调参当中充分发挥各部分的潜力,最终才能爆发出最大的性能。本次分享以图像任务训练为例,将从CPU、内存、硬盘、GPU这些方面对算法性能的影响进行逐一分析,配合相应的实验,给出相应的优化建议。
数据流动路径
假设我们现在有一批图片集放在硬盘当中,待读取进内存送入GPU运算,那么一般会经历以下流程:
-
CPU发出读取指令,从硬盘中找到图片数据,并存到内存中;
-
CPU从内存中取出一批数据,转化为numpy array,并作数据预处理/增强操作,如翻转、平移、颜色变换等。处理完毕后送回内存。
-
CPU内存(后面简称内存)和GPU内存(后面简称显存)各开辟一块缓冲区,内存中的一个batch的数据通过PCIe通道传输到显存当中。
-
GPU核心从显存中获取数据进行并行计算,计算结果返回至显存中。
-
计算好的结果将从显存经过PCIe通道返回到内存。
这5个步骤涉及到几个影响数据传输速度的环节:
-
硬盘读取速度;
-
PCIe传输速度;
-
内存读写速度;
-
cpu频率。
我们首先来说说硬盘。
硬盘
在深度学习模型进行训练前,往往需要从本地硬盘读取数据到内存,并做一些预处理,硬盘读取速度会极大影响训练的效率。如果读取速度快,送进GPU的数据多,GPU的利用率就越高。当然提高数据传送效率除了有硬件的部分也有软件的部分,我们先来讨论硬件方面的影响。而目前市售硬盘有机械硬盘和固态硬盘两种,固态硬盘根据接口分为sata、M.2 NVME、PCIe三种。我们使用Kaggle著名数据集dogs_cats_redux,从两个硬盘中分别测试数据读取的速度。
从代码里面可以看到,先用opencv读取图片,然后统一进行resize到(224, 224)的操作,固态硬盘的读取速度差不多是机械硬盘的7倍!
PCIe
内存中的数据通过PCIe总线传输到GPU显存当中,如果是单显卡的机器,大部分都能工作在PCIe 3.0 x16带宽下,此时的带宽为15.754GB/s。PCIe各代速率对比如下图,来自百度百科:
当一个batch的数据(假设tensor shape: (32, 224, 224, 3))通过PCIe (3.0 x16)传输至GPU时,理论上所需时间为:2.44ms。(float 32的tensor的size为32×224×224×3×8≈0.0385GB)。
但目前市售的桌面级cpu(以英特尔酷睿系列的i7 cpu为例),CPU直连的PCIe通道一般只有16条,如果插了双GPU,那么只能工作在PCIe 3.0 x8带宽上(如果你的主板支持的话),那么理论延迟时间加倍。因此一般多卡机器如4卡、8卡、10卡,均最低使用双路工作站或服务器级别的CPU,如英特尔至强系列,此系列单U最低都能提供40条PCIe总线。
但这些延迟时间相比起GPU计算、IO等这些时间来说,其实影响甚微,加上还有软件层面的速度优化,这个延迟可以忽略不计,因此装机时不必太多纠结于PCIe通道数上。
CPU频率
没错!CPU频率也会对数据读取速度有影响,这跟市面上大多装机分享所说的不同,但实验证明频率也对读取速度有比较大的影响。
测试条件:
CPU i7-8700k是可超频的u,因此通过Bios的超频设置,分别设置为2.5GHz、3.0GHz、3.5GHz、4.7GHz四个不同的频率,分别测试OpenCv读取12500张狗狗图的速度,结果对比如下:
实际上,由于所有数据预处理的操作都在CPU上执行,因此CPU频率越高,生成图片的速度就越快,这样的差距也在情理之中。当机器拥有多显卡时,CPU喂数据的速度可能会成为整个系统的瓶颈。
内存频率
我们来测试一下在不同内存频率下,OpenCv读图的速度。内存频率分别设为2133MHz、2400MHz、2666MHz、3000MHz。
可以看到,这几个内存频率下,读取速度几乎没差别,其实内存的带宽相对来说已经足够大,真正的短板在于硬盘。这里附上维基百科给出的内存频率-带宽对比表格:
从表中看出,即使内存频率低至1866MHz,带宽已经达到15GB/s,已经接近PCIe 3.0 x16的带宽(15.75GB/s),也就是说内存传输数据到显存的时候也能跑满PCIe 3.0 x16的带宽,因此内存带宽远远不是瓶颈。
GPU
有钱就买最贵的就对了(误)。目前市面上许多深度学习装机教程已经对显卡的选择作了非常细致的解释,这里就不作推荐什么价位买什么显卡的重复劳动了,这里聊聊显卡的几项指标(如非特别说明,本文提到的显卡一律指Nvidia的显卡,目前几乎没人用AMD显卡做深度学习,或许未来有)。
-
CUDA核心数
CUDA核心数基本确定了一张显卡的算力,当前服务器级别的Tesla V100显卡拥有高达5120个cuda核心;工作站级别最强的RTX 8000显卡以及TITAN系列最强的RTX TITAN,CUDA数为4608个;而当前桌面级别最强的RTX2080ti,拥有4352个CUDA核心。核心数越多意味着执行并行计算的量就更多。详细的显卡规格对比可以参考维基百科:List of Nvidia graphics processing units
-
内存颗粒
最新几代的显存颗粒类型分别有GDDR5X(1080ti)、GDDR6(2080ti)、HBM、HBM2(V100),对应的带宽如下表:
HBM2显存的带宽已经高达256GB/s,Nvidia目前把这种显存只用在最高端的显卡上,而AMD这边则已经应用到桌面级显卡。(英伟达官方宣传其V100的HBM2显存拥有900GB/s的带宽,应该是拥有多个channel的结果)
-
TensorCore
TensorCore最早出现在Nvidia的Volta架构,用于加速深度学习经常需要的矩阵运算。当使用TensorCore时,我们需要从以往的单精度运算(float32)转换成为混合精度(float16+float32)计算,而TensorCore正是能加速这些混合精度运算。所谓“混合精度-mix precision”,如下图,假设A和B是FP16精度的矩阵,矩阵相乘后再和一个FP16或者FP32精度的矩阵相加,会得到一个FP16或者FP32的矩阵(取决于你相加的矩阵是什么精度)。
由FP32转换成FP16计算,能够减少一半的显存使用量,运算时的吞吐量大大增加。实际上,拥有640个tensorcore的V100,吞吐量是P100的12倍(详见Nvidia的TensorCore介绍文档)。
-
Nvidia的TensorCore介绍文档 链接:
https://images.nvidia.com/content/volta-architecture/pdf/volta-architecture-whitepaper.pdf
我们来看看几款显卡的TensorCore数量:
在桌面级显卡中,2080ti拥有最多的544个TensorCore,而RTX Titan则有576个TensorCore。
-
浮点算力
浮点算力是最能反映显卡性能的指标,对于深度学习来说,单精度(float32)的运算最常见,因此最受关注的是float32的算力。而近来混合精度计算越来越受欢迎,float16的算力也越来越重要。至于int8一般用在要求极端速度的推理任务上。而float64一般在HPC应用中常用,所以基本可以忽略这一项。我们来看看几款Volta、Turing架构的显卡详细参数表:
数据来自英伟达官网和GPU-L
当前单精度和半精度浮点算力最高的是RTX Titan,而算力紧追其后的是Tesla V100和Titan V,但这两款的核心数和显存均是最高。更大的显存意味着每次输入数据的batch size可以更大,以及在GAN应用中可以生成更大分辨率的图片。如果用于高精度的科学计算,Tesla V100和Titan V是最佳选择。如果要考虑性价比,那无疑是2080ti最佳。
为什么服务器级别的Tesla卡在算力上与桌面级、工作站级的显卡相差无几,价格却差这么大呢?除了上面的双精度算力最高之外,笔者认为还有以下因素——Nvlink、Nvswitch。
-
Nvlink
Nvlink是英伟达在2014年推出的GPU互联技术,由于以往的多卡环境中,GPU与其它GPU通信的时候,必须先通过PCIe把数据传输到CPU,再由CPU传输到其它GPU,整体计算速度受限于PCIe的速度(要知道HBM2显存的带宽已经达到了900GB/s),PCIe 3.0 x 16双向带宽最多只有30GB/s。Nvlink的出现正是为了解决这个问题,看看下面Nvlink的说明图:
先看左图,有了Nvlink,GPU与GPU之间的通信不需要再通过CPU,直接通过Nvlink通信,双向带宽高达100GB/s(nvlink 2.0)。右图是单服务器双路CPU及8路GPU的架构,两个CPU分别对应4个GPU,当其中一组GPU需要向另一组GPU进行通信时,以往同样只能先通过PCIe传输到CPU,然后再通过QPI通道(带宽为25.6GB/s)传输到另一个CPU,最后再通过PCIe送进另一组GPU。而Nvlink支持跨CPU节点的直接通信,V100每个GPU有6条Nvlink通道,总带宽高达300GB/s。
但从上图可以看到,即使每个GPU拥有6条Nvlink通道,仍然无法做到“全连接”(即任意两个GPU之间存在双向通道)。这就引出了下一个更加疯狂的技术:Nvswitch。
-
Nvswitch
Nvidia官网介绍视频的这两张图很好地介绍了两者之间的区别。下图一个主板上的8块GPU通过6块Nvswitch芯片与另一块主板上的任意一块GPU进行通信,使得8对GPU能够同时以300GB/s的速度进行通信,实现16个GPU全连接。除此之外,Nvswitch还能使得整个服务器作为一块拥有0.5TB显存、2PetaFLOPS算力的“大显卡”使用。
PS:2080ti虽然也能使用Nvlink,但速度被砍了一刀。
选择困难,无从下手?专业深度学习解决方案,就在这!省心又高效
宽泛科技旗下Cloudhin®云轩支持Deep learning和高性能计算服务器定制,针对主要深度学习框架(如TensorFlow、Caffe 2、Theano或Torch)进行了优化和设置,在桌面上即可提供强大的深度学习功能。
WS4123深度学习工作站搭载9代8核16线程Intel Core i9处理器,核芯迭代,动力强劲。可选双路Nvidia Tesla GPU,基于Volta架构,增加与深度学习高度相关的Tensor单元,单个GPU即可提供高达100个CPU的性能。轻松应对如云计算、数据分析、后期制作、技术计算等多任务处理。
专业勤修,锐意进取。云轩技术工程师毕业于NVIDIA深度学习研究所,丰富经验,值得信赖。更多定制方案请联系客服,我们将实时响应您的定制需求。
联系我们
如果您有合作需求或宝贵建议,欢迎来信。
邮箱:hezuo@kuanfans.com
合作热线:400-610-1360转375899
关注宽泛科技公众号(ID:kuanfankeji),活动资讯、产品信息、客户服务,触手可及。