本文來源地址:https://www.leiphone.com/news/201705/uo3MgYrFxgdyTRGR.html

与“传统” AI 算法相比,深度学习(DL)的计算性能要求,可以说完全在另一个量级上。

而 GPU 的选择,会在根本上决定你的深度学习体验。那么,对于一名 DL 开发者,应该怎么选择合适的 GPU 呢?这篇文章将深入讨论这个问题,聊聊有无必要入手英特尔协处理器 Xeon Phi,并将各主流显卡的性能、性价比制成一目了然的对比图,供大家参考。

先来谈谈选择 GPU 对研究深度学习的意义。更快的 GPU,能帮助新人更快地积累实践经验、更快地掌握技术要领,并把这些应用于新的任务。没有快速的反馈,从错误中学习要花费太高的时间成本,学习深度学习便很可能变成一个令人反胃、进而望而生畏的经历。

是否需要多卡?

出于最初的激动,我走上了多卡交火的不归路——用 40Gbit/s 的 InfiniBand 桥接器连接,我搭建了一个迷你 GPU “集群”,万分激动地试验多卡是否能有更好的表现。

但很快我就发现,让神经网络在多卡上高效地并行处理,其实是一件挺不容易的事。尤其是对于更密集的神经网络,性能的提升可以用一句“不过如此”来形容。通过数据并行化,小型神经网络倒可以很高效地并行处理,但大型的就不行了。比如 Kaggle 竞赛“Partly Sunny with a Chance of Hashtags”,我用深度学习方法拿下了第二名,多卡就基本没有加速效果。

这之后,我继续探索如何在多卡环境玩深度学习。

我开发了一个全新的 8 bit 压缩技术,其模型并行化比起 32 bit 方法要高效得多,尤其是密集或全连接层。但我同时发现,并行化可以让你极度失望——我幼稚地针对一系列问题优化了并行算法,结果发现,即便有优化的特制代码,多 GPU 的并行化仍然效果一般,尤其考虑到投入的大量精力。

在搞并行化之前,你必须要非常了解你的硬件,以及它与深度学习算法的相互支持程度,来估计是否能从并行化获益。

这是我的 PC。你看到的是三块泰坦以及 InfiniBand 桥接卡。但这个配置适合深度学习吗?

从那时起,对 GPU 并行的支持越来越常见,但离普及还差得远,更不要提高效地运行。到目前为止,唯一一个能在多卡、多机环境实现高效算法的深度学习框架,是 CNTK。它利用了微软特制的具有 1 bit 量化(高效)和 block momentum(非常高效)的并行化算法。

如果在 96 卡 GPU 集群上运行 CNTK,线性速度预计可达到 90 到 95 倍。PyTorch 或许会是另一个能高效地支持多机并行化的框架,但暂时还没到位。如果你在一台设备上搞并行化,你的选择基本就是 CNTK、Torch 或者 PyTorch。这些框架有不错的加速表现(3.6-3.8 倍),对于一机四卡(最多)有预定义的算法。其他支持并行化的库和框架也存在,但它们要么很慢(比如 TensorFlow,只有两到三倍的加速);要么对于在多卡环境很难用(比如 Theano);再要么两个缺点都有。

如果并行化对你很重要,我推荐你用 Pytorch 或 CNTK。

多卡,但不搞并行

多卡的另一个优势是,即便你不对算法做并行化,还可以同时跑多个算法、实验——每个算法在在一个 GPU 上单独运行。你不会获得任何加速,但同时使用不同算法或参数,你会得到更多关于效果表现的信息。如若你的主要目标是尽快积累深度学习经验,这是非常有用处的。对于需要对一个新算法的不同版本做实验的研究人员,这也相当有用。

这是多卡在心理上的价值。处理一个任务与获得结果反馈之间的时间越短,大脑把相关记忆碎片组织起来、建立起该任务知识图的效果就越好。如果数据集不大,你在两块 GPU 上用这些数据同时训练两个卷积网络,你会很快就会知道“一切顺利”的感觉有多好。你会更快地发现交叉验证误差,并做合理解释。你能发现一些线索,让你知道需要添加、移除或调整哪些参数或层。

总的来讲,你可以说对于几乎所有任务,一块 GPU 基本就够了。但用多卡来加速深度学习模型,正在变得越来越重要。如果你的目标是快速入门深度学习,多块便宜的显卡也是不错的。就我个人而言,我更倾向选择多块弱一点的 GPU,而不是一块核弹,对于研究实验也是如此。

应该选哪家的加速器——英伟达 GPU,AMD GPU,还是英特尔 Xeon Phi?

英伟达的标准算法库,使得在 CUDA 中建立第一批深度学习库非常简单。但对于 AMD OpenCL,这样的强大标准库并不存在。现实是,现在 A 卡并没有好用的深度学习库——所以一般人只能选 N 卡。即便将来有了 OpenCL 库,我仍会接着用 N 卡。原因很简单:GPU 通用计算,或者说 GPGPU 的社群基本上是围绕着 CUDA 转的,而没有多少人钻研 OpenCL。因此,在 CUDA 社区,你可以立刻获得好的开源方案和代码建议。

另外,对于深度学习,即便这项技术及其产业尚在襁褓之中,英伟达可谓是全面出击。老黄的投入并没有白费。那些现在才投入资金、精力,想要赶上深度学习风口的公司,由于起步晚,离英伟达的距离有老大一截。当前,使用任何除 NVIDIA-CUDA 之外的软硬件组合玩深度学习,简直是故意跟自己过不去。

至于英特尔 Xeon Phi,官方宣传是你能用标准的 C 语言代码,并轻松把代码转化为加速的 Xeon Phi 代码。该功能听着不错——你也许会想着可以借助海量的 C 语言资源。但实际情况是,只有非常少数的 C 语言代码有支持,而且大部分能用的 C 代码会非常非常的慢。因此,它其实比较鸡肋。

我曾在一个 Xeon Phi 集群工作站搞研究,这期间的经历不忍回想,一把辛酸泪:

我无法运行单位测试,因为 Xeon Phi MKL 和 Python Numpy 不兼容;我不得不重构大部分的代码,因为 Xeon Phi 编译器无法对模板做恰当的 reduction,比如说对 switch statement;我不得不修改 C 界面,因为 Xeon Phi 编译器不支持一些 C++11 功能。

所有这些迫使我在心酸沮丧中重写代码,并且没有单位测试。这过程极度漫长,堪称地狱般的经历。

直到我的代码终于成功执行,但所有东西速度都很慢。有一些问题,搞不清是 bug 还是线程调度程序的原因,总之如果张量大小接连发生改变,性能就会大幅降低。举个例子,如果你有大小不同的全连接层或 dropout 层,Xeon Phi 比 CPU 还要慢。我在独立矩阵乘法上重现了这个问题,并发给英特尔,但没有回音。

所以,如果你真想搞深度学习,离 Xeon Phi 越远越好。

预算有限,怎么挑 GPU?

想到为深度学习挑选 GPU,你脑子里冒出来的第一个问题大概是:最重要的性能参数是什么?Cuda 核心数目?频率?显存大小?

都不是。

对深度学习性能影响最大的参数是显存带宽。

简单来讲,GPU 为显存带宽而优化,为此牺牲了显存读取时间,即延迟。而 CPU 恰恰与此相反——如果只涉及少量内存,它能非常快速地做计算,比如个位数之间的乘法(3*6*9)。但是对于大量内存之上的运作,比如矩阵乘法(A*B*C),CPU 是非常慢的。由于高显存带宽,GPU 就很擅长处理这类问题。当然,CPU 与 GPU 之间有的是微妙细致的区别,这只是非常重要的一个。

因此,如果你想要买一个玩深度学习快的 GPU,首先要看显存带宽。

从显存带宽评估 GPU

近几年 CPU、GPU 的带宽对比

同一代架构内,GPU 的带宽可以直接比较。比如 Pascal GTX 1080 vs. GTX 1070。单独看显存带宽就可以直接判断它们在深度学习上的性能差距:GTX 1080 (320GB/s) 比 GTX 1070 (256 GB/s) 带宽快 25%,实际情况大约如是。

但不同架构之间,比如 Pascal GTX 1080 vs. Maxwell GTX Titan X,带宽并不能直接比较。这是由于不同的制造工艺对显存带宽的使用情况不同。这使得 GPU 之间的对比会稍嫌棘手。但即便如此,仅仅看带宽还是能大致估出 GPU 的深度学习速度。

另一个需要考虑的因素,是与 cuDNN 的兼容性。并不是所有 GPU 架构都提供支持。几乎所有的深度学习库都借助 cuDNN 进行卷积运算,这会把 GPU 的选项限制到 Kepler 开普勒或之后的架构,即 GTX 600 系列或更新。另外,Kepler GPU 大多很慢。因此,你应该选择 GTX 900 或 1000 系的 GPU 获得理想性能。

为了对每块显卡在深度学习上的性能差异,给大家一个大致估计,我创建了一个简单的条形图。读这张图的姿势很简单。比如说,一个 GTX 980 的速度大约是 0.35 个 Titan X Pascal;或者,一个 Titan X Pascal 几乎比 GTX 980 快三倍。

雷锋网提醒,我自己并没有所有这些显卡,我也并没有在每张显卡上做深度学习跑分评测。这些性能对比,是从显卡参数以及计算评测(与深度学习同一级别的计算任务,比如密码挖掘)中获得。因此,这些只是大略估计。真实数字会有一点变化,但误差应该是极小的,并不会影响排序。

另外需要注意的是,对 GPU 性能利用不足的小型神经网络,会让性能更强的 GPU 在对比中吃亏。比如说,在 GTX 1080 Ti 上跑一个小型 LSTM(128 隐层; batch size > 64),并不会比在 GTX 1070 上快很多。得到下图中的数字,你需要跑更大的神经网络,比如 1024 个隐层的 LSTM(batch size > 64)。

GPU 粗略性能对比

性价比分析

如果我们把上图中的显卡性能除以价格,就得到了每张卡的性价比指数,便是下图。它在一定程度上反映出我们的装机推荐。

性价比对比

新卡的价格来自美亚,旧卡来自 eBay。雷锋网(公众号:雷锋网)提醒,该图的数字在很多方面都有些些微偏颇。首先,它没有考虑显存大小。通常情况下,你需要比 GTX 1050 Ti 更大的显存来玩深度学习。因此,榜上靠前的部分显卡虽然性价比很高,但是并不实用。

同样的,用四个小 GPU 比用一个大 GPU 要困难得多,因此小 GPU 出于劣势。另外,买 16 个 GTX 1050 Ti 不可能得到四个 GTX 1080 Ti 的性能,你还需要另外买 3 个 PC。如果我们把这一点也考虑进去,上图看上去应该是这样的:

这幅修正过的 GPU 性价比条形图,把其他 PC 硬件的成本也纳入考虑——把可兼容 4 GPU 的高端 PC 平台的成本,定为 $1500。该情况下,如果你想要买许多 GPU,不出意料的,更高端的 GPU 会占优势,因为 PC 平台+ 显卡的整体性价比更高。

但其实,这还是有所偏颇的。不管四个 GTX 1080 Ti 性价比有多高,对普通人而言,这并没有意义——因为买不起。因此,开发者真正感兴趣的应是有限预算里的性价比。针对你的预算,最佳系统选项是什么?你还需要考虑一些其它问题:你计划让这个 GPU 服役多久?几年后,你是要升级 GPU 还是升级整机?将来是否希望出手旧 GPU,回收一些成本,再买个新的?

如果你能平衡多方面的考虑,最后的结论应该与下面的建议介意。

GPU 推荐

通常,我会推荐 GTX 1080 Ti, GTX 1080 或 GTX 1070。如果你的预算足够买 GTX 1080 Ti,就不用犹豫了。GTX 1070 便宜一点,但仍然比上代 GTX Titan X (Maxwell) 要快。相比 GTX 980 Ti,所有这些卡都应该优先考虑,因为更大的显存:11GB、8GB  而不是 6GB。8GB 显存听上去或许不多,但对许多任务是绰绰有余的。对于 Kaggle 竞赛里的大多数图像数据集、deep style 和自然语言理解任务,你基本不会遇到问题。

如果你是第一次尝试深度学习,只是偶尔参加 Kaggle 竞赛,GTX 1060 是最好的入门 GPU。但我不会推荐 3GB 显存的 GTX 1060。

在性价比方面,10 系显卡是相当不错的。GTX 1050 Ti, GTX 1060, GTX 1070, GTX 1080 和 GTX 1080 Ti 都排在前列。GTX 1060 和 GTX 1050 Ti 面向初学者,GTX 1070、GTX 1080 是适合初创公司的多面手,对部分学术研究和产业界也可。GTX 1080 Ti 则是全能高端选项。

我通常不推荐新推出的 Titan Xp,相比其性能,它定价过高,不如选 GTX 1080 Ti。但对于摆弄大型数据集或视频数据的计算机视觉研究人员,Titan Xp 仍然有市场。在这些领域,每一 GB 显存都有价值,而 Titan Xp 比 GTX 1080 Ti 多了 1GB。有了这两者,我不会推荐 Titan X (Pascal) 。

如果你已经有了 GTX Titan X (Maxwell),想要升级到 Titan Xp。我的建议是:把钱存着买下一代,不值。

如果你预算有限,偏偏又需要 12GB 的内存,可以考虑买个二手的 GTX Titan X (Maxwell) 。

但是,对于大多数研究人员,最好的选项仍然是 GTX 1080 Ti。泰坦的额外 1GB 在大多数情况下没什么影响。

对我个人而言,会选择多个 GTX 1070 或 GTX 1080 来做研究。我宁愿多运行几个慢一点的试验,而不仅仅是运行一个更快的。在 NLP,内存要求并没有计算机视觉那么高,单只 GTX 1070/GTX 1080 对我来说就够了。我需要处理的任务、如何进行试验,决定了对我而言的最佳选择,不管是 GTX 1070 还是 GTX 1080。

对于预算紧张的开发者而言,选择余地非常有限。租 AWS 上的 GPU 实体价格已经太高,还是买自己的 GPU 更划算。我不推荐 GTX 970,不仅慢,二手的价格也不够实惠,而且它还存在显存启动问题。我的建议是加点钱上 GTX 1060,更快、显存更大而且没有毛病。GTX 1060 超出你的预算的话,我建议 4GB 版 GTX 1050 Ti。4GB 显存确实限制比较大,但如果对模型做些修改,仍可以得到还可以的性能表现。对于大多数 Kaggle 竞赛而言,GTX 1050 Ti 是合适的,在少部分比赛可能会影响你的竞争力。

如果你只是私下玩玩深度学习,没打算认真钻研,GTX 1050 Ti 是一个合适的选择。

结论

有了本文中的所有信息,你大概已经能平衡显存大小、带宽、价格等多方面因素,来做出合理的购买决策。现在,我的建议是若预算充足,就上 GTX 1080 Ti, GTX 1080 或 GTX 1070。刚刚上手深度学习、预算有限的话,选 GTX 1060。预算实在有限,那么 GTX 1050 Ti。计算机视觉研究人员可能会需要 Titan Xp。

玩深度学习选哪块英伟达 GPU?有性价比排名还不够!的更多相关文章

  1. 英伟达GPU 嵌入式开发平台

    英伟达GPU  嵌入式开发平台 1.         JETSON TX1 开发者组件 JETSON TX1 开发者组件是视觉计算的全功能 开发平台,旨在让您能够快速地安装和运行. 该组件带有 Lin ...

  2. 英伟达GPU虚拟化---申请英伟达测试License

    此文基于全新的License 2.0系统,针对vGPU License的试用申请以及软件下载和License管理进行了详细的说明,方便今后我们申请测试License,快速验证GPU的功能. 试用步骤: ...

  3. Linux查看英伟达GPU信息

    命令: nvidia-smi 结果:

  4. 不用写代码就能实现深度学习?手把手教你用英伟达 DIGITS 解决图像分类问题

    2006年,机器学习界泰斗Hinton,在Science上发表了一篇使用深度神经网络进行维数约简的论文 ,自此,神经网络再次走进人们的视野,进而引发了一场深度学习革命.深度学习之所以如此受关注,是因为 ...

  5. NCCL(Nvidia Collective multi-GPU Communication Library) Nvidia英伟达的Multi-GPU多卡通信框架NCCL 学习;PCIe 速率调研;

    为了了解,上来先看几篇中文博客进行简单了解: 如何理解Nvidia英伟达的Multi-GPU多卡通信框架NCCL?(较为优秀的文章) 使用NCCL进行NVIDIA GPU卡之间的通信(GPU卡通信模式 ...

  6. 第一篇:CUDA 6.0 安装及配置( WIN7 64位 / 英伟达G卡 / VS2010 )

    前言 本文讲解如何在VS 2010开发平台中搭建CUDA开发环境. 当前配置: 系统:WIN7 64位 开发平台:VS 2010 显卡:英伟达G卡 CUDA版本:6.0 若配置不同,请谨慎参考本文. ...

  7. 基于英伟达Jetson TX1的GPU处理平台

    基于英伟达Jetson TX1 GPU的HDMI图像输入的深度学习套件 [309] 本平台基于英伟达的Jetson TX1视觉计算的全功能开发板,配合本公司研发的HDMI输入图像采集板:Jetson ...

  8. 英伟达TRTTorch

    英伟达TRTTorch PyTorch JIT的提前(AOT)编译Ahead of Time (AOT) compiling for PyTorch JIT TRTorch是PyTorch / Tor ...

  9. 【系统硬件】英伟达安培卡 vs 老推理卡硬件参数对比

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   本文分享一下英伟达安培卡 vs 老推理 ...

随机推荐

  1. Ext.jsTree 向子节点添加叶子节点

    // 定义搜索节点树结构Store const nodeStore = Ext.create('Ext.data.TreeStore', { autoLoad : true, id : 'nodeSt ...

  2. PHP反射API的使用、体会、说明

    最近开发支付宝相关功能的时候,由于支付宝的SDK比较落伍,不支持composer的方式加载,使用三方的composer SDK又觉得不放心 为了简化代码的调用方式,使用PHP的反射类针对支付宝官方SD ...

  3. electron node.js 在 vscode 设置 调试 Debug

    在当前工程下,添加一个 .vscode/launch.json 文件 { // Use IntelliSense to learn about possible attributes. // Hove ...

  4. OS填空题练习

    1.操作系统的基本特征:并发性:共享性:虚拟性:异步性. 2.操作系统的设计目标:方便性:有效性:可扩充性:开放性. 3.操作系统的主要功能:处理机管理:存储器管理:设备管理:文件管理:用户接口. 4 ...

  5. 【leetcode算法-中等】3. 无重复字符的最长字串

    [题目描述] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 " ...

  6. zabbix 批量添加web场景监控

    公司有大量测试环境的url需要监控是否能够访问,即url状态不为200即报警.状态为200即正常.因url比较多,且经常发生改变,如通过web场景配置(我没配过)会比较繁琐,工作量比较大.通过网上查找 ...

  7. Excel时间序列函数

    year 返回对应于某个日期的年份. month 返回对应于某个日期的月份. day 返回对应于某个日期的年份. weekday 返回对应于某个日期的天数. weeknum 返回对应日期在本年中是第几 ...

  8. VMware安装windows7系统

    1.进入VMware系统,选择创建新的虚拟机 2.进入安装页面,选择自定义安装 3.选择虚拟机硬件兼容性,选择与自己软件相匹配的硬件兼容性 4.选择下一步后,选择稍后安装操作系统 5.选择客户机操作系 ...

  9. set object is not JSON serializable 解决方式

    python return json的时候报错: set object is not JSON serializable 解决方式,增加一个将set转为list的函数: def set_default ...

  10. 1231: 删除字符串中指定的字符(Java)

    WUSTOJ 1231: 删除字符串中指定的字符 题目 原题链接 Description 明天就要英语考试了,小明明正在挑灯夜战背单词.小明明发现单词很难背,背一个忘一个.经过仔细研究,小明明发现单词 ...