admin 管理员组文章数量: 1086019
关于GPU(二)
深度学习硬件环境的搭建和配置选择
在硬件环境的选择上,并不是一定选择最贵的就会有最好的效果,很多时候可能付出了2倍的成本,但是性能的提升却只有10%。深度学习的计算环境对不同部件的要求不同,因此这里先简要讨论一下硬件的合理搭配。
另外,虽然目前有一些云服务供应商提供GPU计算能力,并且一键部署,听起来不错,但是基于云计算的GPU实例受到两个限制:
首先,普通的廉价GPU实例内存稍小,比如AWS的G2实例目前只支持单GPU 4GB的显存;
其次,支持较大显存的实例费用比较高,性价比不高。比如AWS的P2实例使用支持每GPU12GB内存的K80 GPU,每小时费用高达0.9美元。但是K80 GPU属于Kepler架构,是两代前的技术。
另外,在实际使用中需要开启其他服务以使用GPU实例,各种成本加起来每月的开支还是很可观的,很可能6个月的总开支够买一台配置较新GPU的全新电脑了。在搭配深度学习机器而选择硬件的时候,通常要考虑以下几个因素。
(1)预算。 这个非常重要。如果预算足够,当然可以秉承最贵的就是最好的理念来选
择。但是当预算有一定限制的时候,如何搭配部件来最大化性能,尽量减少瓶颈就是很重要的考
量了。
(2)空间。 这里特指机箱的空间。大部分新的GPU都是双风扇的,因此对机箱尺寸要求很高。如果你已经有一个机箱了,那么选择合适尺寸的GPU就成为最优先的考虑;如果新配机箱,那么全尺寸的大机箱是最好的选择。这是因为大机箱通风好,同时可以为以后添加多个GPU进行升级留有余地;另外,大机箱通常有多个PCIe的背板插槽可以放置多个PCIe设备。一般现在的GPU卡都会占据两个PCIe的插槽空间,因此背板插槽越多越好。
(3)能耗。 性能越好的GPU对能源的要求越高,而且很可能是整个系统里能耗最高的部件。如果已经有一台机器了,只是要添加一个GPU来做学习用,那么选择性能一般但是能耗低的GPU卡是比较明智的;如果需要高密度计算,搭配多个GPU并行处理,那么对电源的要求非常高,一般来说,搭配4GPU卡的系统至少需要1600W的电源。
(4)主板。 对主板的选择非常重要,因为涉及跟GPU的接口选择。一般来说,至少需要一块支持PCIe3.0接口的主板。如果以后要升级系统到多个GPU,那么还需要支持8+16芯PCIe电源接口的主板,这样可以连接最多4个GPU进行SLI并联。对于4个GPU这个限制,是因为目前最好的主板也只支持最多40条PCIe通道(16x,8x,8x,8x的配置)。多个GPU并行加速比并不能达到完美,毕竟还是有些额外开销的。比如系统需要决定在哪个GPU上进行这个数据块对应的计算任务。我们后面会提到,CNTK计算引擎的并行加速性很好,在使用多个GPU时值得考虑。
(5)CPU。 CPU在深度学习计算中的作用不是非常显著的,除非使用CPU进行深度学习算法的计算。因此如果你已经有一台电脑的话,就不用太纠结是否要升级CPU了;但是如果要新搭建系统,那么CPU的选择上还是有些考量的,这样可以使系统利用GPU的能力最大化。首先要选择一个支持40条PCIe通道的CPU。不是所有的CPU都支持这么多的PCIe通道,比如haswell核心的i5系列CPU就支持最多32条通道。其次要选择一个高频率的CPU。虽然系统使用GPU做具体的计算,但是在准备模型阶段CPU还是有重要作用的,因此选择使用在预算内主频高、速度快的CPU还是比较重要的。CPU的核心数量不是一个很重要的指标,一般来说,一个CPU核心可以支持一块GPU卡。按照这个标准,大部分现代的CPU都是合格的。
(6)内存。 内存容量还是越大越好,以减少数据提取的时间,加快和GPU的交换。一般原则是按照GPU内存容量的至少两倍来配置主机内存。
(7)存储系统。 对于存储系统的能力,除要容量大以外,主要体现在计算时不停地提取数据供应GPU进行计算方面。如果做图像方面的深度学习,数据量通常都非常大,因此可能需要多次提取数据才能完成一轮计算,这个时候存储系统读取数据的能力就成为整个计算的瓶颈。因此,大容量的SSD是最好的选择。 现在的SSD读取速度已经超过GPU从PCIe通道装载数据的速度。 如果使用传统的机械硬盘,组成RAID5也是一个不错的选择。如果数据量不是很大,那么这个考虑就不那么重要了。
(8)GPU。 GPU显然是最重要的选择,对整个深度学习系统的影响最大。相对于使用CPU进行计算,GPU对于提高深度学习的速度是众所周知的事情,通常我们能见到5倍左右的加速比,而在大数据集上这个优势甚至达到了10倍。尽管好处明显,但是如何在控制性价比的条件下选择一个合适的GPU却不是一件简单的事情。因此,我们在下面的章节中将详细讨论如何选择GPU。
1. 通用图形处理单元
通用图形处理单元(GPGPU)一般只用在图形计算上(以前这些计算是由CPU完成的)。从本质上讲,GPGPU管道就是一个或者多个GPU和CPU之间的并行处理,它们对数据像图像或者其他图形格式一样进行分析处理。虽然GPU工作频率比CPU低,但是它们有更多的核心,所以可以更快地对图片和图形数据进行操作。把需要分析的数据转换成图形格式后再分析,可以有很可观的加速效果。
GPGPU管道最初被开发用于更好地进行一般的图形处理,后来这些管道被发现更符合科学计算的需求,之后就朝着科学计算的方向开发出来了。
2.你需要什么样的GPU加速卡
现在独立的GPU加速卡从品牌来说有3种选择。首先是显卡的两个阵营,即NVIDIA和AMD;其次是Intel的Xeon Phi。如果选择显卡的话,推荐NVIDIA。
首先,使用NVIDIA的标准库可以非常容易地在CUDA上建立一个深度学习包,而AMD的OpenGL却没有那么强悍的标准库。对于非底层算法开发人员来说,现在AMD的GPU还没有好的深度学习包,只有NVIDIA有。即使将来有些OpenCL库发布了,但是从成熟度上讲,NVIDIA也还是会好很多,CUDA的GPU社区和GPGPU社区很大,而OpenGL的社区相对小。因此,在CUDA社区,已经有好的开源方案和指导意见供大家使用了。其次,现在NVIDIA在深度学习领域发展得非常好。早在2010年,NVIDIA就预言深度学习在未来10年内会越来越流行,因此投入大量资源进行这方面的研究和开发。AMD在这方面的投入相对于NVIDIA稍微落后了一点。
如果选择使用Xeon Phi,则只能用标准C语言,然后把C语言代码转化成加速的Xeon Phi代码。这个功能看起来挺有意思的,因为可以使用现在普遍存在的C语言源代码。然而,理想很丰满,现实很骨感。真正能被支持的C代码只有很少一部分,所以这个功能没有什么大用,而且大部分C代码运行很慢。Xeon Phi在社区支持方面也不是很好,比如Xeon Phi的MKL数值库和Numpy不兼容;在功能方面也不尽完善,比如Intel XeonPhi编译器不能优化模板,也不支持GCC的向量化功能,Intel的ICC编译器并不支持全部的C++11的功能。另外,写完代码还没法进行单元测试。这些问题说明Xeon Phi还不是一个成熟、可靠的工具,不适合用来帮助一般程序员或者数据科学家进行深度学习的工作。
因此,当前最适合的选择是NVIDIA旗下的各种GPU加速卡。
3.你的GPU需要多少内存
锁定品牌以后,还需要选择正确的GPU型号,这时候你需要了解用多少内存跑深度学习。接下来我们讨论卷积网络的内存需求,这是因为卷积神经网络在计算的时候对内存的需求非常大,一般一块能满足训练卷积神经网络任务的GPU加速卡也能满足大部分其他计算任务。这样可以确保买到容量合适的GPU卡,而不会花冤枉钱去买高端的加速卡,但是又发挥不出全部效能。
卷积神经网络对内存的要求和简单神经网络非常不一样。如果只是存储卷积神经网络,那么所需的内存会稍小一些,因为参数少;但是如果要训练一个卷积神经网络,那么所需的内存则非常大。这是因为每个卷积层的激活函数量和误差量相比于简单神经网络非常大,这些是内存消耗的主要来源。把激活函数量和误差量加起来可以决定大致的内存需求。 然而,在这个网络里通过某一种状态确定激活函数和误差的数量是很难的。一般来说,最开始的几层会吃掉很多内存,因此主要内存需求取决于输入数据的大小。所以首先应考虑输入数据大小。
举例说明。假如需要训练一个图像识别模型,在数据中每个图片宽度为512像素,高度也为512像素,每个像素3个颜色通道的图像,即每个图片可以存为一个512×512×3的多维矩阵。再假如设定一个3×3的滤子,表1.1给出了一个7层的卷积神经网络所需的神经元个数,以及每个神经元对应的权重数。
表1.1 卷积神经网络参数计算表
表1.1显示卷积神经网络对内存的需求是巨大的。对于一个115×115×3的图像,如果所有参数都以8位的浮点数来存储的话,那么最终所需的内存则高达1GB。
当然,在实际应用中,可以根据硬件的GPU内存限制来缩小计算的规模。比如在常见的ImageNet数据集中,通常使用224×224×3的多维矩阵存储图像。假如训练这样的一个数据集可能需要12GB的内存,如果将图像缩小为115×115×3的维度,那么只需要四分之一的内存容量就够训练模型了。
此外,GPU的内存需求也取决于数据集的样本量。比如只用了ImageNet数据集的10%,那么一个非常深的模型就会很快地过度拟合,因为没有足够的样本泛化。但是较小的神经网络通常会表现比较好,同时所需的内存也较少,这样4GB或者更少的内存就足够用了。这表明用较少的图片来训练模型时,因为模型复杂度降低了,所以对内存的需求就会少些。
第三个决定内存需求的因素是分类类别的数目。相比训练一个1000种类别图像的模型,如果只是训练一个二分类图像的问题,那么所需的内存会小很多。这是因为如果有更少的类需要互相区别的话,则过度拟合发生更快,或者换句话说,比起区分1000个类,只需要更少的参数来区分两类。
对于卷积神经网络而言,可以使用两种方法来降低GPU的内存需求。第一种是采用较大的递进步数作为卷积内核,这时不是为每一个像素,而是为两个或四个像素(2或4步幅)来应用卷积内核,这样将产生更少的输出数据。这个技巧通常用于输入层中,因为这一层最消耗内存。第二种是引入一个1×1的卷积内核层,从而降低所需的深度。例如,64×64×256的输入可以通过96个1×1颗粒减少到64×64×96的输入。
最后,总是可以降低训练批量的大小。训练批量的大小对内存需求的影响非常显著。比如对于同一个模型,使用64个而不是128个训练批量,可以降低一半的内存消耗。但是,模型训练也可能需要更长的时间,特别是在训练的最后阶段。最常见的卷积操作一般是对64个或更大的训练批量大小进行优化,这就使得从32个训练批量这个大小开始,模型训练速度会大大降低。所以收缩训练批量的大小,甚至减少到32个以下只应作为最后手段的一个选项。
另一个经常被忽视的选择是改变卷积网络所采用的数据类型。通过从32位切换到16位,可以很容易地将内存消耗降低50%,同时又不会显著降低模型的性能。这种方法在GPU上通常会得到非常明显的加速比。
所以,这些内存减少技术在面对真实数据时会是什么样的情况呢?
如果把128个批量大小、250像素×250像素3种颜色(250×250×3)图像作为输入,使用3×3内核,按照32,64,96步骤递增的话,那么只是为了进行误差计算和激活函数所需的内存大小为:92MB→1906MB→3720MB→5444MB。
在一块普通的GPU卡上,内存很快就会出现不足。如果用16位代替32位,这个数字会减半;对于训练批量个数为64的同理。如果同时使用64个训练批量和16位精度,内存消耗就会降为原来的四分之一。不过,如果要用多层训练深度网络,内存仍然会非常吃紧。如果在第一层添加步长2,接着使用2×2的最大池化技术,那么内存消耗的变动则为:92MB(input)→952MB(conv)→238MB(pool)→240MB(conv)→340MB(conv)。
这就大幅降低了内存消耗。但是如果数据够大、模型够复杂,还是会有内存问题的。如果用了2~3层,那么可以用另外一层做最大池化或者应用其他技术。比如32个1×1的内核会把最后一层的内存消耗从340MB降低到113MB,这样我们就可以简单地把神经网络扩展到很多层,而且不用担心性能问题。
如果使用了最大池化、跨越式和1×1的内核等技术,虽然这些技术可以很有效地降低内存消耗,但是也相应地扔掉了这些层的很多信息,这会对模型的预测性能不利。其实训练卷积网络的本质就是把混合的不同技术用到一个网络上,用尽量低的内存消耗得到尽量好的结果。
事实证明,最重要的实际GPU性能指标应该是内存带宽,即以GB/s衡量内存每秒读取和写入的吞吐量。内存带宽非常重要,因为目前几乎所有的数学运算如矩阵乘法、点积、求和等都受到带宽的约束,瓶颈在于多少数据可以从内存中提取出来以供运算,而不是有多少运算力可用。笔者在实际应用中使用GTX 1060显卡做GPU,通常只能达到40%的饱和计算能力,这就是由于内存带宽的限制造成的。表1.2列出了在Kepler、Maxwell和Pascal架构下不同GPU的内存带宽。
表1.2 不同GPU的带宽比较(GB/s)
在同一个架构下,带宽可以直接比较。例如同为Pascal架构的GTX 1080和GTX 1070高性能显卡,可以直接通过查看内存带宽相比较。然而,在不同的体系结构中,由于不同的架构如何利用给定的内存带宽不同,就不能直接通过比较内存带宽来比较性能了。例如Pascal架构的GTX 1080和Maxwell的GTX Titan X就不能直接通过比较带宽来考察其性能的差异。这使得一切都有点棘手,因为总体带宽仅会提供一个GPU速度的大致概念。一般在预算确定的情况下,可以选择能够买到的架构最新、内存带宽最大的显卡。显卡价格下降得非常快,因此买一块二手显卡应该是预算紧张时的最佳选择。现在GTX 10系列新一代显卡大行其道,因此9系列,特别是960系列显卡的价格下降较快,不失为一个入门选择。如果添加一点预算,则可以选择1060系列的入门显卡,价格和980系列差不多,但是架构更新、能耗更
低、内存更大,只是带宽稍微小了点。
另一个需要考虑的重要因素是,并非所有的架构都与cuDNN兼容。比如Kepler架构的GPU就不行,不过它已经非常老了,估计市面上不多见了。GTX 9系列或者10系列都能很好地利用cuDNN的计算能力,所以现在在选购时基本没有什么问题。
基于上面的带宽论述,表1.3粗略地比较了不同GPU执行深度学习任务时的相对性能。注意,这只是大概的比较,实际的速度对比会有一些不同。在表1.3中,Pascal架构的Titan X作为目前最强的主流GPU之一,被设定为比较对象,标为其他主流的几种GPU的一个倍率,从而让读者对不同GPU的选择有一个比较直观的概念。例如Pascal架构的Titan X=1,而GTX 1080=1.43,就表示Pascal架构的Titan X在执行深度学习任务时其速度是GTX 1080的1.43倍左右,换句话说,就是Pascal架构的Titan X比GTX 1080快43%。
表1.3 主流GPU的相对计算能力
一般来说,如果预算比较充裕,GTX 1080或GTX 1070是不错的选择。如果预算不是问题,显然GTX 1080Ti 11GB版本是非常好的选择;如果预算稍微紧张些,那么GTX 1070 8GB版本应该是性价比最高的GPU。普通的GTX Titan X卡因为使用8GB内存,比只有6GB内存的GTX 980Ti更适合深度学习。GTX 1060是最好的入门GPU。价格便宜,内存也高达6GB,对于大多数的学习项目够用了。
其主要问题是带宽接口较小,只有192 bit,整个内存的吞吐量相对于GTX 1080和1070低了很多。不过,虽然GTX 1060与1080、1070和Titan X这类相对高端的GPU相比性能还是有所欠缺的,但是跟GTX 980的性能几乎持平,内存还大2GB,因此性价比非常之高,是个人练习深度学习非常好的选择。6GB和8GB内存对于大多数中等规模的深度学习任务是够用的,但是遇到ImageNet这种规模的数据或者视频数据就明显不够用了。这时候12GB内存的GTX 1080Ti就派上用场了。
4.是否应该用多个GPU
通过SLI,GPU的互联速度达到了40Gb/s,并且在游戏里搭建SLI并联显卡能显著提升性能。那么能不能通过搭建多个GPU来提升工作站的深度学习计算能力呢?如果能,是不是越多越好呢?图1.5展示了这样一类配置。
图1.5 三块GXT Titan卡和一块InfiniBan卡(这是为深度学习配置的)
跟游戏里的表现相反,在多个并联的GPU上并行计算神经网络是很难的,而且在高密度的神经网络上获得的提升优势非常有限。对于小的神经网络,数据并行更有效;而对于大的神经网络,由于数据传输上的瓶颈,简单并联多个GPU有时并不能获得理想的速度提升比。另外,在某些特定问题上GPU的并行效果不错。例如,卷积层可以很容易并行化,而且可以很好地进行伸缩。许多现成的框架,比TensorFlow、Caffe、Theano和Torch,都支持这种并行性,如果使用4个GPU,则会看到2.5 ~ 3倍的速度提升;而微软的CNTK提供了最佳的并行性能,在很多情况下加速比能提高3.6~3.8倍。CNTK使用自己专门的BrainScript来描述神经网络,对于初学者而言,学习曲线稍陡,不过现在也提供了基于Python以及其他语言的API,方便了使用者。TensorFlow和Theano都使用函数形式的API来描述神经网络。
目前CNTK和TensorFlow、Theano一样,也纳入了Keras的后端平台,用户只需了解Keras的高度抽象的构造方法即可,而不需要考虑很多CNTK与其他软件包不同的地方,可以大大提高生产效率。这也是我们写作本书的目的。
我们相信随着软件和硬件性能的提高,使用多个GPU并行计算神经网络来大幅提高计算性能的情况会越来越普遍,最终会让普通用户实现快速训练许多不同深度学习模型的能力。
当然,从另一个角度而言,使用多个GPU还有一个优点,就是可以在每个GPU上各自运行自己的算法或实验。虽然性能没有提升,但是同时调试不同的算法或参数,可以尽快地获得所需的理想模型。无论是对于研究人员还是数据科学家,这都是非常重要的,因为在实际工作中大部分时间其实都投入到调参中了。
另外,从心理上有助于读者保持学习的兴趣。一般来说,执行任务的时间和接收反馈的时间间隔越短,人们越能更好地将相关的印象和学习经验集成总结到一起,也不会因为长时间反复等待所需的计算结果而灰心丧气。如果读者用两个GPU训练两个卷积网络的小数据集,则能更快地了解什么参数对模型的效果影响大,也会更容易检测交叉验证错误的规律。这些经验的有效总结可以帮助分析师正确地理解到底需要调整哪些参数或删减哪些层来提高模型的效能。
所以,总的来说,一个GPU应该满足几乎所有任务,但使用多个GPU正变得越来越重要,有助于加快深度学习模型的建模过程。所以,如果读者想快速地训练深度学习模型,使用多个廉价的GPU会表现不错。
【参考文献】
【1】Keras快速上手:基于Python的深度学习实战 谢梁 鲁颖 劳虹岚
本文标签: 关于GPU(二)
版权声明:本文标题:关于GPU(二) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1693407057a220126.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论