从深度学习选择什么样的gpu来谈谈gpu的硬件架构

从深度学习gpu选择来谈谈gpu的硬件架构
我的图书馆
从深度学习gpu选择来谈谈gpu的硬件架构
from&/t/gpu-gpu/12326从深度学习在2012年大放异彩,gpu计算也走入了人们的视线之中,它使得大规模计算神经网络成为可能。人们可以通过07年推出的CUDA(Compute Unified Device Architecture)用代码来控制gpu进行并行计算。本文首先根据显卡一些参数来推荐何种情况下选择何种gpu显卡,然后谈谈跟cuda编程比较相关的硬件架构。
1.选择怎样的GPU型号
这几年主要有AMD和NVIDIA在做显卡,到目前为止,NVIDIA公司推出过的GeForce系列卡就有几百张[1],虽然不少都已经被淘汰了,但如何选择适合的卡来做算法也是一个值得思考的问题,Tim Dettmers[2]的文章给出了很多有用的建议,根据自己的理解和使用经历(其实只用过GTX 970…)我也给出一些建议。
上面并没有考虑笔记本的显卡,做算法加速的话还是选台式机的比较好。性价比最高的我觉得是GTX 980ti,从参数或者一些用户测评来看,性能并没有输给TITAN X多少,但价格却便宜不少。从图1可以看出,价位差不多的显卡都会有自己擅长的地方,根据自己的需求选择即可。要处理的数据量比较小就选择频率高的,要处理的数据量大就选显存大core数比较多的,有double的精度要求就最好选择kepler架构的。tesla的M40是专门为深度学习制作的,如果只有深度学习的训练,这张卡虽然贵,企业或者机构购买还是比较合适的(百度的深度学习研究院就用的这一款[3]),相对于K40单精度浮点运算性能是4.29Tflops,M40可以达到7Tflops。QUADRO系列比较少被人提起,它的M6000价格比K80还贵,性能参数上也并没有好多少。
在挑选的时候要注意的几个参数是处理器核心(core)、工作频率、显存位宽、单卡or双卡。有的人觉得位宽最重要,也有人觉得核心数量最重要,我觉得对深度学习计算而言处理器核心数和显存大小比较重要。这些参数越多越高是好,但是程序相应的也要写好,如果无法让所有的core都工作,资源就被浪费了。而且在购入显卡的时候,如果一台主机插多张显卡,要注意电源的选择。
2.一些常见的名称含义
上面聊过了选择什么样的gpu,这一部分介绍一些常见名词。随着一代一代的显卡性能的更新,从硬件设计上或者命名方式上有很多的变化与更新,其中比较常见的有以下一些内容。
gpu架构:Tesla、Fermi、Kepler、Maxwell、Pascal
芯片型号:GT200、GK210、GM104、GF104等
显卡系列:GeForce、Quadro、Tesla
GeForce显卡型号:G/GS、GT、GTS、GTX
gpu架构指的是硬件的设计方式,例如流处理器簇中有多少个core、是否有L1 or L2缓存、是否有双精度计算单元等等。每一代的架构是一种思想,如何去更好完成并行的思想,而芯片就是对上述思想的实现,芯片型号GT200中第二个字母代表是哪一代架构,有时会有100和200代的芯片,它们基本设计思路是跟这一代的架构一致,只是在细节上做了一些改变,例如GK210比GK110的寄存器就多一倍。有时候一张显卡里面可能有两张芯片,Tesla k80用了两块GK210芯片。这里第一代的gpu架构的命名也是Tesla,但现在基本已经没有这种设计的卡了,下文如果提到了会用Tesla架构和Tesla系列来进行区分。
而显卡系列在本质上并没有什么区别,只是NVIDIA希望区分成三种选择,GeFore用于家庭娱乐,Quadro用于工作站,而Tesla系列用于服务器。Tesla的k型号卡为了高性能科学计算而设计,比较突出的优点是双精度浮点运算能力高并且支持ECC内存,但是双精度能力好在深度学习训练上并没有什么卵用,所以Tesla系列又推出了M型号来做专门的训练深度学习网络的显卡。需要注意的是Tesla系列没有显示输出接口,它专注于数据计算而不是图形显示。
最后一个GeForce的显卡型号是不同的硬件定制,越往后性能越好,时钟频率越高显存越大,即G/GS&GT&GTS&GTX。
3.gpu的部分硬件
这一部分以下面的GM204硬件图做例子介绍一下GPU的几个主要硬件(图片可以点击查看大图,不想图片占太多篇幅)[4]。这块芯片它是随着GTX 980和970一起出现的。一般而言,gpu的架构的不同体现在流处理器簇的不同设计上(从Fermi架构开始加入了L1、L2缓存硬件),其他的结构大体上相似。主要包括主机接口(host interface)、复制引擎(copy engine)、流处理器簇(Streaming Multiprocessors)、图形处理簇GPC(graphics processing clusters)、内存等等。
主机接口,它连接了gpu卡和PCI Express,它主要的功能是读取程序指令并分配到对应的硬件单元,例如某块程序如果在进行内存复制,那么主机接口会将任务分配到复制引擎上。
复制引擎(图中没有表示出来),它完成gpu内存和cpu内存之间的复制传递。当gpu上有复制引擎时,复制的过程是可以与核函数的计算同步进行的。随着gpu卡的性能变得强劲,现在深度学习的瓶颈已经不在计算速度慢,而是数据的读入,如何合理的调用复制引擎是一个值得思考的问题。
流处理器簇SM是gpu最核心的部分,这个翻译参考的是GPU编程指南,SM由一系列硬件组成,包括warp调度器、寄存器、Core、共享内存等。它的设计和个数决定了gpu的计算能力,一个SM有多个core,每个core上执行线程,core是实现具体计算的处理器,如果core多同时能够执行的线程就多,但是并不是说core越多计算速度一定更快,最重要的是让core全部处于工作状态,而不是空闲。不同的架构可能对它命名不同,kepler叫SMX,maxwell叫SMM,实际上都是SM。而GPC只是将几个sm组合起来,在做图形显示时有调度,一般在写gpu程序不需要考虑这个东西,只要掌握SM的结构合理的分配SM的工作即可。
图中的内存控制器控制的是L2内存,每个大小为512KB。
4.流处理器簇的结构
上面介绍的是gpu的整个硬件结构,这一部分专门针对流处理器簇SM来分析它内部的构造是怎样的。首先要明白的是,gpu的设计是为了执行大量简单任务,不像cpu需要处理的是复杂的任务,gpu面对的问题能够分解成很多可同时独立解决的部分,在代码层面就是很多个线程同时执行相同的代码,所以它相应的设计了大量的简单处理器,也就是stream process,在这些处理器上进行整形、浮点型的运算。下图给出了GK110的SM结构图。它属于kepler架构,与之前的架构比较大的不同是加入了双精度浮点运算单元,即图中的DP Unit。所以用kepler架构的显卡进行双精度计算是比较好的。
上面提到过的一个SM有多个core或者叫流处理器,它是gpu的运算单元,做整形、浮点型计算。可以认为在一个core上一次执行一个线程,GK110的一个SM有192个core,因此一次可以同时执行192个线程。core的内部结构可以查看[5],实现算法一般不会深究到core的结构层面。SFU是特殊函数单元,用来计算log/exp/sin/cos等。DL/ST是指Load/Store,它在读写线程执行所需的全局内存、局部内存等。
一个SM有192个core,8个SM有1536个core,这么多的线程并行执行需要有统一的管理,假如gpu每次在1536个core上执行相同的指令,而需要计算这一指令的线程不足1536个,那么就有core空闲,这对资源就是浪费,因此不能对所有的core做统一的调度,从而设计了warp(线程束)调度器。32个线程一组称为线程束,32个线程一组执行相同的指令,其中的每个thread称为lane。一个线程束接受同一个指令,里面的32个线程同时执行,不同的线程束可执行不同指令,那么就不会出现大量线程空闲的问题了。但是在线程束调度上还是存在一些问题,假如某段代码中有if…else…,在调度一整个线程束32个线程的时候不可能做到给thread0~15分配分支1的指令,给thread16~31分配分支2的指令(实际上gpu对分支的控制是,所有该执行分支1的线程执行完再轮到该执行分支2的线程执行),它们获得的都是一样的指令,所以如果thread16~31是在分支2中它们就需要等待thread0~15一起完成分支1中的计算之后,再获得分支2的指令,而这个过程中,thread0~15又在等待thread16~31的工作完成,从而导致了线程空闲资源浪费。因此在真正的调度中,是半个warp执行相同指令,即16个线程执行相同指令,那么给thread0~15分配分支1的指令,给thread16~31分配分支2的指令,那么一个warp就能够同时执行两个分支。这就是图中Warp Scheduler下为什么会出现两个dispatch的原因。
另外一个比较重要的结构是共享内存shared memory。它存储的内容在一个block(暂时认为是比线程束32还要大的一些线程个数集合)中共享,一个block中的线程都可以访问这块内存,它的读写速度比全局内存要快,所以线程之间需要通信或者重复访问的数据往往都会放在这个地方。在kepler架构中,一共有64kb的空间大小,供共享内存和L1缓存分配,共享内存实际上也可看成是L1缓存,只是它能够被用户控制。假如共享内存占48kb那么L1缓存就占16kb等。在maxwell架构中共享内存和L1缓存分开了,共享内存大小是96kb。而寄存器的读写速度又比共享内存要快,数量也非常多,像GK110有65536个。
此外,每一个SM都设置了独立访问全局内存、常量内存的总线。常量内存并不是一块内存硬件,而是全局内存的一种虚拟形式,它跟全局内存不同的是能够高速缓存和在线程束中广播数据,因此在SM中有一块常量内存的缓存,用于缓存常量内存。
本文谈了谈gpu的一些重要的硬件组成,就深度学习而言,我觉得对内存的需求还是比较大的,core多也并不是能够全部用上,但现在开源的库实在完整,想做卷积运算有cudnn,想做卷积神经网络caffe、torch,想做rnn有mxnet、tensorflow等等,这些库内部对gpu的调用做的非常好并不需用户操心,但了解gpu的一些内部结构也是很有意思的。
另,一开始接触GPU并不知道是做图形渲染的…所以有些地方可能理解有误,主要基于计算来讨论GPU的构造。
原文:http://chenrudan.github.io/blog//introductionofgpuhardware.html
TA的最新馆藏[转]&
喜欢该文的人也喜欢中国领先的IT技术网站
51CTO旗下网站
如何为你的深度学习任务挑选最合适的GPU?
深度学习是一个计算密集型领域,而 GPU 的选择将从根本上决定你的深度学习实验。那么,如何选择一个适合你的 GPU 呢?这正是本篇博文探讨的问题,帮助你做出正确选择。
作者:微胖
黄小天 译来源:| 16:00
深度学习是一个计算密集型领域,而 GPU 的选择将从根本上决定你的深度学习实验。没有
GPU,一个实验也许花费数月才能完成,或者实验运行一天却只关闭了被选择的参数;而一个良好稳定的 GPU
可让你在深度学习网络中快速迭代,在数天、数小时、数分钟内完成实验,而不是数月、数天、数小时。所以,购买 GPU 时正确的选择很关键。那么,如何选择一个适合你的
GPU 呢?这正是本篇博文探讨的问题,帮助你做出正确选择。
对于深度学习初学者来说,拥有一个快速 GPU
非常重要,因为它可以使你迅速获得有助于构建专业知识的实践经验,这些专业知识可以帮助你将深度学习应用到新问题上。没有这种迅速反馈,从错误中汲取经验将会花费太多时间,在继续深度学习过程中也会感到受挫和沮丧。在
GPU 的帮助下,我很快就学会了如何在一系列 Kaggle 竞赛中应用深度学习,并且在 Partly Sunny with a Chance of
Hashtags Kaggle 竞赛上获得了第二名,竞赛内容是通过一个给定推文预测气象评分。比赛中,我使用了一个相当大的两层深度神经网络(带有两个修正线性单元和
dropout,用于正则化),差点就没办法把这个深度网络塞进我的 6G GPU 内存。
应该使用多个 GPU 吗?
在 GPU 的帮助下,深度学习可以完成很多事情,这让我感到兴奋。我投身到多 GPU 的领域之中,用 InfiniBand 40Gbit/s 互连组装了小型
GPU 集群。我疯狂地想要知道多个 GPU 能否获得更好的结果。我很快发现,不仅很难在多个 GPU
上并行神经网络。而且对普通的密集神经网络来说,加速效果也很一般。小型神经网络可以并行并且有效地利用数据并行性,但对于大一点的神经网络来说,例如我在 Partly
Sunny with a Chance of Hashtags Kaggle 比赛中使用的,几乎没有加速效果。
随后,我进一步试验,对比 32 位方法,我开发了带有模型并行性的新型 8 位压缩技术,该技术能更有效地并行处理密集或全连接神经网络层。
然而,我也发现,并行化也会让人沮丧得发狂。针对一系列问题,我天真地优化了并行算法,结果发现:考虑到你投入的精力,即使使用优化过的自定义代码,多个 GPU
上的并行注意的效果也并不好。你需要非常留意你的硬件及其与深度学习算法交互的方式,这样你一开始就能衡量你是否可以受益于并行化。
我的计算机主机设置:你可以看到 3 个 GXT Titan 和一个 InfiniBand 卡。对于深度学习来说,这是一个好的设置吗?
自那时起,GPU 的并行性支持越来越普遍,但距离全面可用和有效还差的很远。目前,在 GPU 和计算机中实现有效算法的唯一深度学习库是
CNTK,它使用微软的 1 比特量子化(有效)和 block momentum(很有效)的特殊并行化算法。通过 CNTK 和一个包含 96 块 GPU
的聚类,你可以拥有一个大约 90x-95x 的新线性速度。Pytorch
也许是跨机器支持有效并行化的库,但是,库目前还不存在。如果你想要在一台机器上做并行,那么,CNTK、Torch 和 Pytorch
是你的主要选择,这些库具备良好的加速(3.6x-3.8x),并在一台包含 4 至 8 块 GPU
的机器之中预定义了并行化算法。也有其他支持并行化的库,但它们不是慢(比如 2x-3x 的 TensorFlow)就是难于用于多 GPU
(Theano),或者兼而有之。
如果你重视并行,我建议你使用 Pytorch 或 CNTK。
使用多 GPU 而无并行
使用多 GPU 的另外一个好处是:即使没有并行算法,你也可以分别在每个 GPU
上运行多个算法或实验。速度没有变快,但是你能一次性通过使用不同算法或参数得到更多关于性能信息。如果你的主要目标是尽快获得深度学习经验,这是非常有用的,而且对于想同时尝试新算法不同版本的研究人员来说,这也非常有用。
如果你想要学习深度学习,这也具有心理上的重要性。执行任务的间隔以及得到反馈信息的时间越短,大脑越能将相关记忆片段整合成连贯画面。如果你在小数据集上使用独立的
训练两个卷积网络,你就能更快地知道什么对于性能优良来说是重要的;你将更容易地检测到交叉验证误差中的模式并正确地解释它们。你也会发现暗示需要添加、移除或调整哪些参数与层的模式。
所以总体而言,几乎对于所有任务来说,一个 GPU 已经足够了,但是加速深度学习模型,多个 GPU 会变得越来越重要。如果你想快速学习深度学习,多个廉价的
GPU 也很好。我个人宁愿使用多个小的 GPU,而不是一个大的 GPU,即使是出于研究实验的没目的。
那么,我该选择哪类加速器呢?英伟达 GPU、AMD GUP 还是英特尔的 Xeon Phi?
英伟达的标准库使得在 CUDA 中建立第一个深度学习库很容易,但没有适合 AMD 的 OpenCL 那样强大的标准库。目前还没有适合 AMD
显卡的深度学习库&&所以,只能选择英伟达了。即使未来一些 OpenCL 库可用,我仍会坚持使用英伟达:因为对于 CUDA 来说,GPU 计算或者 GPGPU
社区是很大的,对于 OpenCL 来说,则相对较小。因此,在 CUDA 社区,有现成的好的开源解决方案和为编程提供可靠建议。
此外,英伟达现在为深度学习赌上一切,即使深度学习还只是处于婴儿期。押注获得了回报。尽管现在其他公司也往深度学习投入了钱和精力,但由于开始的晚,目前依然很落后。目前,除了
NVIDIA-CUDA,其他任何用于深度学习的软硬结合的选择都会让你受挫。
至于英特尔的 Xeon Phi,广告宣称你能够使用标准 C 代码,还能将代码轻松转换成加速过的 Xeon Phi
代码。听起来很有趣,因为你可能认为可以依靠庞大的 C 代码资源。但事实上,其只支持非常一小部分 C 代码,因此,这一功能并不真正有用,大部分 C
运行起来会很慢。
我曾研究过 500 多个 Xeon Phi 集群,遭遇了无止尽的挫折。我不能运行我的单元测试(unit test),因为 Xeon Phi 的
MKL(数学核心函数库)并不兼容 NumPy;我不得不重写大部分代码,因为英特尔 Xeon Phi 编译器无法让模板做出适当约简。例如,switch
语句,我不得不改变我的 C 接口,因为英特尔 Xeon Phi 编译器不支持 C++ 11
的一些特性。这一切迫使你在没有单元测试的情况下来执行代码的重构,实在让人沮丧。这花了很长时间。真是地狱啊。
随后,执行我的代码时,一切都运行得很慢。是有 bug(?)或者仅仅是线程调度器(thread
scheduler)里的问题?如果作为运行基础的向量大小连续变化,哪个问题会影响性能表现?比如,如果你有大小不同的全连接层,或者 dropout 层,Xeon
Phi 会比 CPU 还慢。我在一个独立的矩阵乘法(matrix-matrix
multiplication)实例中复制了这一行为,并把它发给了英特尔,但从没收到回信。所以,如果你想做深度学习,远离 Xeon Phi!
给定预算下的最快 GPU
你的第一个问题也许是:用于深度学习的快速 GPU 性能的最重要特征是什么?是 cuda 内核、时钟速度还是 RAM 的大小?
以上都不是。最重要的特征是内存带宽。
简言之,GPU 通过牺牲内存访问时间(延迟)而优化了内存带宽; 而 CPU 的设计恰恰相反。如果只占用了少量内存,例如几个数相乘(3*6*9),CPU
可以做快速计算,但是,对于像矩阵相乘(A*B*C)这样占用大量内存的操作,CPU 运行很慢。由于其内存带宽,GPU 擅长处理占用大量内存的问题。当然 GPU 和
CPU 之间还存在其他更复杂的差异。
如果你想购买一个快速 GPU,第一等重要的就是看看它的带宽。
根据内存带宽评估 GPU
随着时间的推移,比较 CPU 以及 GPU 的带宽。为什么 GPU 计算速度会比 CPU 快?主要原因之一就是带宽。
带宽可直接在一个架构内进行比较,例如, 比较 Pascal 显卡 GTX 1080 与 GTX 1070
的性能;也可通过只查看其内存带宽而直接比较。例如,GTX GB/s) 大约比 GTX
GB/s) 快 25%。然而,
在多个架构之间,例如 Pascal 对于 Maxwell 就像 GTX 1080 对于 GTX Titan X
一样,不能进行直接比较,因为加工过程不同的架构使用了不同的给定内存带宽。这一切看起来有点狡猾,但是,只看总带宽就可对 GPU
的大致速度有一个很好的全局了解。在给定预算的情况下选择一块最快的 GPU,你可以使用这一维基百科页面(List of Nvidia graphics
processing units),查看 GB/s 中的带宽;对于更新的显卡(900 和 1000
系列)来说,列表中的价格相当精确,但是,老旧的显卡相比于列举的价格会便宜很多,尤其是在 eBay 上购买这些显卡时。例如,一个普通的 GTX Titan X 在
eBay 上的价格大约是 550 美元。
然而,另一个需要考虑的重要因素是,并非所有架构都与 cuDNN 兼容。由于几乎所有的深度学习库都使用 cuDNN 做卷积运算,这就限制了对于 Kepler
GPU 或更好 GPU 的选择,即 GTX 600 系列或以上版本。最主要的是 Kepler GPU 通常会很慢。因此这意味着你应该选择 900 或 1000
系列 GPU 来获得好的性能。
为了大致搞清楚深度学习任务中的显卡性能比较情况,我创建了一个简单的 GPU 等价表。如何阅读它呢?例如,GTX 980 的速度相当于 0.35 个
Titan X Pascal,或是 Titan X Pascal 的速度几乎三倍快于 GTX 980。
请注意我没有所有这些显卡,也没有在所有这些显卡上跑过深度学习基准。这些对比源于显卡规格以及计算基准(有些加密货币挖掘任务需要比肩深度学习的计算能力)的比较。因此只是粗略的比较。真实数字会有点区别,但是一般说来,误差会是最小的,显卡的排序也没问题。
也请注意,没有充分利用 GPU 的小型网络会让更大 GPU 看起来不那么帅。比如,一个 GTX 1080 Ti 上的小型 LSTM(128
个隐藏单元;batch 大小大于 64)不会比在 GTX 1070 上运行速度明显快很多。为了实现表格中的性能差异,你需要运行更大的网络,比如 带有 1024
个隐藏单元(而且 batch 大小大于 64)的 LSTM。当选择适合自己的 GPU 时,记住这一点很重要。
粗略的比较用于大型深度学习网络 的 GPU 性能。
总的来说,我会推荐 GTX 1080 Ti 或者 GTX 1070。它们都是优秀的显卡,如果你有钱买得起 GTX 1080 Ti 那么就入手吧。GTX
1070 更加便宜点,但是仍然比普通的 GTX Titan X (Maxwell) 要快一些。较之 GTX 980 Ti,这两者都是更佳选择,考虑到增加的 11
G 以及 8G 的内存(而不是 6G)。
8G 的内存看起来有点小,但是对于许多任务来说,绰绰有余。比如,Kaggle
比赛,很多图像数据集、深度风格以及自然语言理解任务上,你遇到的麻烦会少很多。
GTX 1060 是最好的入门 GPU,如果你是首次尝试深度学习或者有时想要使用它来参加 Kaggle 比赛。我不会推荐 GTX 1060 带有 3G
内存的变体产品,既然其他 6G 内存产品的能力已经十分有限了。不过,对于很多应用来说,6G 内存足够了。GTX 1060 要比普通版本的 Titan X
慢一些,但是,在性能和价格方面(eBay 上)都可比肩 GTX980。
如果要说物有所值呢,10 系列设计真的很赞。GTX 1060、GTX 1070 和 GTX 1080 Ti 上都很出色。GTX 1060
适合初学者,GTX 1070 是某些产业和研究部门以及创业公司的好选择,GTX 1080 Ti 通杀高端选择。
一般说来,我不会推荐英伟达 Titan X (Pascal),就其性能而言,价格死贵了。继续使用 GTX 1080 Ti 吧。不过,英伟达 Titan X
(Pascal) 在计算机视觉研究人员当中,还是有它的地位的,这些研究人员通常要研究大型数据集或者视频集。在这些领域里,每 1G 内存都不会浪费,英伟达
Titan X 比 GTX 1080 Ti 多 1G 的内存也会带来更多的处理优势。不过,就物有所值而言,这里推荐 eBay 上的 GTX Titan
X(Maxwell)&&有点慢,不过 12G 的内存哦。
不过,绝大多数研究人员使用 GTX 1080 Ti 就可以了。对于绝大多数研究和应用来说,额外 1G 内存其实是不必要的。
我个人会使用多个 GTX 1070
进行研究。我宁可多跑几个测试,哪怕速度比仅跑一个测试(这样速度会快些)慢一些。在自然语言处理任务中,内存限制并不像计算机视觉研究中那么明显。因此,GTX
1070 就够用了。我的研究任务以及运行实验的方式决定了最适合我的选择就是 GTX 1070。
当你挑选自己的 GPU 时,也应该如法炮制,进行甄选。考虑你的任务以及运行实验的方式,然后找个满足所有这些需求的 GPU。
现在,对于那些手头很紧又要买 GPU 的人来说,选择更少了。AWS 的 GPU 实例很贵而且现在也慢,不再是一个好的选择,如果你的预算很少的话。我不推荐
GTX 970,因为速度慢还死贵,即使在 eBay 上入二手(150 刀),而且还有存储及显卡启动问题。相反,多弄点钱买一个 GTX
1060,速度会快得多,存储也更大,还没有这方面的问题。如果你只是买不起 GTX 1060,我推荐 4GB RAM 的 GTX 1050 Ti。4GB
会有限,但是你可以玩转深度学习了,如果你调一下模型,就能获得良好的性能。GTX 1050 适合绝大多数 kaggle
竞赛,尽管可能会在一些比赛中限制你的竞争力。
亚马逊网络服务(AWS)中的 GPU 实例
在这篇博文的前一个版本中,我推荐了 AWS GPU 的现货实例,但现在我不会再推荐它了。目前 AWS 上的 GPU 相当慢(一个 GTX 1080
的速度是 AWS GPU 的 4 倍)并且其价格在过去的几个月里急剧上升。现在看起来购买自己的 GPU 又似乎更为明智了。
运用这篇文章里的所有信息,你应该能通过平衡内存大小的需要、带宽速度 GB/s 以及 GPU 的价格来找到合适的 GPU
了,这些推理在未来许多年中都会是可靠的。但是,现在我所推荐的是 GTX 1080 Ti 或 GTX
1070,只要价格可以接受就行;如果你刚开始涉足深度学习或者手头紧,那么 GTX 1060 或许适合你。如果你的钱不多,就买 GTX 1050 Ti
吧;如果你是一位计算机视觉研究人员,或许该入手 Titan X Pascal(或者就用现有的 GTX Titan Xs)。
总结性建议
总的说来最好的 GPU:Titan X Pascal 以及 GTX 1080 Ti
有成本效益但价格高的:GTX 1080 Ti, GTX 1070
有成本效益而且便宜:GTX 1060
用来处理大于 250G 数据集:常规 GTX Titan X 或者 Titan X Pascal
我钱不多:GTX 1060
我几乎没钱:GTX 1050 Ti
我参加 Kaggle 比赛: 用于任何常规比赛,GTX 1060 , 如果是深度学习比赛,GTX 1080Ti
我是一名有竞争力的计算机视觉研究人员: Titan X Pascal 或常规 GTX Titan X
我是一名研究人员:GTX 1080 Ti. 有些情况下,比如自然语言处理任务,GTX 1070 或许是可靠的选择&&看一下你当前模型的存储要求。
想建立一个 GPU
集群:这真的很复杂,你可以从这里得到一些思路://how-to-build-and-use-a-multi-gpu-system-for-deep-learning/
我刚开始进行深度学习,并且我是认真的:开始用 GTX 1060。根据你下一步的情况(创业?Kaggle 比赛?研究还是应用深度学习)卖掉你的 GTX
1060 然后买更适合使用目的的。
原文地址://which-gpu-for-deep-learning/
【本文是51CTO专栏机构机器之心的原创译文,微信公众号&机器之心( id: almosthuman2014)&】
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点头条热点头条原创
24H热文一周话题本月最赞
讲师:0人学习过
讲师:0人学习过
讲师:0人学习过
精选博文论坛热帖下载排行
本书采用“如何解决问题”的方式阐述Ruby编程,涵盖了以下内容:Ruby术语和基本原理;数字、字符串等低级数据类型的操作;正则表达式;国际...
订阅51CTO邮刊从深度学习gpu选择来谈谈gpu的硬件架构 - CSDN博客
从深度学习gpu选择来谈谈gpu的硬件架构
转自:/t/gpu-gpu/12326
从深度学习在2012年大放异彩,gpu计算也走入了人们的视线之中,它使得大规模计算神经网络成为可能。人们可以通过07年推出的CUDA(Compute Unified Device Architecture)用代码来控制gpu进行并行计算。本文首先根据显卡一些参数来推荐何种情况下选择何种gpu显卡,然后谈谈跟cuda编程比较相关的硬件架构。
1.选择怎样的GPU型号
这几年主要有AMD和NVIDIA在做显卡,到目前为止,NVIDIA公司推出过的GeForce系列卡就有几百张[1],虽然不少都已经被淘汰了,但如何选择适合的卡来做算法也是一个值得思考的问题,Tim Dettmers[2]的文章给出了很多有用的建议,根据自己的理解和使用经历(其实只用过GTX 970…)我也给出一些建议。
上面并没有考虑笔记本的显卡,做算法加速的话还是选台式机的比较好。性价比最高的我觉得是GTX 980ti,从参数或者一些用户测评来看,性能并没有输给TITAN X多少,但价格却便宜不少。从图1可以看出,价位差不多的显卡都会有自己擅长的地方,根据自己的需求选择即可。要处理的数据量比较小就选择频率高的,要处理的数据量大就选显存大core数比较多的,有double的精度要求就最好选择kepler架构的。tesla的M40是专门为深度学习制作的,如果只有深度学习的训练,这张卡虽然贵,企业或者机构购买还是比较合适的(百度的深度学习研究院就用的这一款[3]),相对于K40单精度浮点运算性能是4.29Tflops,M40可以达到7Tflops。QUADRO系列比较少被人提起,它的M6000价格比K80还贵,性能参数上也并没有好多少。
在挑选的时候要注意的几个参数是处理器核心(core)、工作频率、显存位宽、单卡or双卡。有的人觉得位宽最重要,也有人觉得核心数量最重要,我觉得对深度学习计算而言处理器核心数和显存大小比较重要。这些参数越多越高是好,但是程序相应的也要写好,如果无法让所有的core都工作,资源就被浪费了。而且在购入显卡的时候,如果一台主机插多张显卡,要注意电源的选择。
2.一些常见的名称含义
上面聊过了选择什么样的gpu,这一部分介绍一些常见名词。随着一代一代的显卡性能的更新,从硬件设计上或者命名方式上有很多的变化与更新,其中比较常见的有以下一些内容。
gpu架构:Tesla、Fermi、Kepler、Maxwell、Pascal芯片型号:GT200、GK210、GM104、GF104等显卡系列:GeForce、Quadro、TeslaGeForce显卡型号:G/GS、GT、GTS、GTX
gpu架构指的是硬件的设计方式,例如流处理器簇中有多少个core、是否有L1 or L2缓存、是否有双精度计算单元等等。每一代的架构是一种思想,如何去更好完成并行的思想,而芯片就是对上述思想的实现,芯片型号GT200中第二个字母代表是哪一代架构,有时会有100和200代的芯片,它们基本设计思路是跟这一代的架构一致,只是在细节上做了一些改变,例如GK210比GK110的寄存器就多一倍。有时候一张显卡里面可能有两张芯片,Tesla k80用了两块GK210芯片。这里第一代的gpu架构的命名也是Tesla,但现在基本已经没有这种设计的卡了,下文如果提到了会用Tesla架构和Tesla系列来进行区分。
而显卡系列在本质上并没有什么区别,只是NVIDIA希望区分成三种选择,GeFore用于家庭娱乐,Quadro用于工作站,而Tesla系列用于服务器。Tesla的k型号卡为了高性能科学计算而设计,比较突出的优点是双精度浮点运算能力高并且支持ECC内存,但是双精度能力好在深度学习训练上并没有什么卵用,所以Tesla系列又推出了M型号来做专门的训练深度学习网络的显卡。需要注意的是Tesla系列没有显示输出接口,它专注于数据计算而不是图形显示。
最后一个GeForce的显卡型号是不同的硬件定制,越往后性能越好,时钟频率越高显存越大,即G/GS&GT&GTS&GTX。
3.gpu的部分硬件
这一部分以下面的GM204硬件图做例子介绍一下GPU的几个主要硬件(图片可以点击查看大图,不想图片占太多篇幅)[4]。这块芯片它是随着GTX 980和970一起出现的。一般而言,gpu的架构的不同体现在流处理器簇的不同设计上(从Fermi架构开始加入了L1、L2缓存硬件),其他的结构大体上相似。主要包括主机接口(host interface)、复制引擎(copy engine)、流处理器簇(Streaming Multiprocessors)、图形处理簇GPC(graphics processing clusters)、内存等等。
主机接口,它连接了gpu卡和PCI Express,它主要的功能是读取程序指令并分配到对应的硬件单元,例如某块程序如果在进行内存复制,那么主机接口会将任务分配到复制引擎上。
复制引擎(图中没有表示出来),它完成gpu内存和cpu内存之间的复制传递。当gpu上有复制引擎时,复制的过程是可以与核函数的计算同步进行的。随着gpu卡的性能变得强劲,现在深度学习的瓶颈已经不在计算速度慢,而是数据的读入,如何合理的调用复制引擎是一个值得思考的问题。
流处理器簇SM是gpu最核心的部分,这个翻译参考的是GPU编程指南,SM由一系列硬件组成,包括warp调度器、寄存器、Core、共享内存等。它的设计和个数决定了gpu的计算能力,一个SM有多个core,每个core上执行线程,core是实现具体计算的处理器,如果core多同时能够执行的线程就多,但是并不是说core越多计算速度一定更快,最重要的是让core全部处于工作状态,而不是空闲。不同的架构可能对它命名不同,kepler叫SMX,maxwell叫SMM,实际上都是SM。而GPC只是将几个sm组合起来,在做图形显示时有调度,一般在写gpu程序不需要考虑这个东西,只要掌握SM的结构合理的分配SM的工作即可。
图中的内存控制器控制的是L2内存,每个大小为512KB。
4.流处理器簇的结构
上面介绍的是gpu的整个硬件结构,这一部分专门针对流处理器簇SM来分析它内部的构造是怎样的。首先要明白的是,gpu的设计是为了执行大量简单任务,不像cpu需要处理的是复杂的任务,gpu面对的问题能够分解成很多可同时独立解决的部分,在代码层面就是很多个线程同时执行相同的代码,所以它相应的设计了大量的简单处理器,也就是stream process,在这些处理器上进行整形、浮点型的运算。下图给出了GK110的SM结构图。它属于kepler架构,与之前的架构比较大的不同是加入了双精度浮点运算单元,即图中的DP Unit。所以用kepler架构的显卡进行双精度计算是比较好的。
上面提到过的一个SM有多个core或者叫流处理器,它是gpu的运算单元,做整形、浮点型计算。可以认为在一个core上一次执行一个线程,GK110的一个SM有192个core,因此一次可以同时执行192个线程。core的内部结构可以查看[5],实现算法一般不会深究到core的结构层面。SFU是特殊函数单元,用来计算log/exp/sin/cos等。DL/ST是指Load/Store,它在读写线程执行所需的全局内存、局部内存等。
一个SM有192个core,8个SM有1536个core,这么多的线程并行执行需要有统一的管理,假如gpu每次在1536个core上执行相同的指令,而需要计算这一指令的线程不足1536个,那么就有core空闲,这对资源就是浪费,因此不能对所有的core做统一的调度,从而设计了warp(线程束)调度器。32个线程一组称为线程束,32个线程一组执行相同的指令,其中的每个thread称为lane。一个线程束接受同一个指令,里面的32个线程同时执行,不同的线程束可执行不同指令,那么就不会出现大量线程空闲的问题了。但是在线程束调度上还是存在一些问题,假如某段代码中有if…else…,在调度一整个线程束32个线程的时候不可能做到给thread0~15分配分支1的指令,给thread16~31分配分支2的指令(实际上gpu对分支的控制是,所有该执行分支1的线程执行完再轮到该执行分支2的线程执行),它们获得的都是一样的指令,所以如果thread16~31是在分支2中它们就需要等待thread0~15一起完成分支1中的计算之后,再获得分支2的指令,而这个过程中,thread0~15又在等待thread16~31的工作完成,从而导致了线程空闲资源浪费。因此在真正的调度中,是半个warp执行相同指令,即16个线程执行相同指令,那么给thread0~15分配分支1的指令,给thread16~31分配分支2的指令,那么一个warp就能够同时执行两个分支。这就是图中Warp
Scheduler下为什么会出现两个dispatch的原因。
另外一个比较重要的结构是共享内存shared memory。它存储的内容在一个block(暂时认为是比线程束32还要大的一些线程个数集合)中共享,一个block中的线程都可以访问这块内存,它的读写速度比全局内存要快,所以线程之间需要通信或者重复访问的数据往往都会放在这个地方。在kepler架构中,一共有64kb的空间大小,供共享内存和L1缓存分配,共享内存实际上也可看成是L1缓存,只是它能够被用户控制。假如共享内存占48kb那么L1缓存就占16kb等。在maxwell架构中共享内存和L1缓存分开了,共享内存大小是96kb。而寄存器的读写速度又比共享内存要快,数量也非常多,像GK110有65536个。
此外,每一个SM都设置了独立访问全局内存、常量内存的总线。常量内存并不是一块内存硬件,而是全局内存的一种虚拟形式,它跟全局内存不同的是能够高速缓存和在线程束中广播数据,因此在SM中有一块常量内存的缓存,用于缓存常量内存。
本文谈了谈gpu的一些重要的硬件组成,就深度学习而言,我觉得对内存的需求还是比较大的,core多也并不是能够全部用上,但现在开源的库实在完整,想做卷积运算有cudnn,想做卷积神经网络caffe、torch,想做rnn有mxnet、tensorflow等等,这些库内部对gpu的调用做的非常好并不需用户操心,但了解gpu的一些内部结构也是很有意思的。
另,一开始接触GPU并不知道是做图形渲染的…所以有些地方可能理解有误,主要基于计算来讨论GPU的构造。
原文:http://chenrudan.github.io/blog//introductionofgpuhardware.html
本文已收录于以下专栏:
相关文章推荐
转自:http://blog.csdn.net/claien/article/details/6965135
要说到设计的复杂程度,那还是CPU了!这个不用讨论,很简单的道理你看看显卡芯片的更新...
摘要:首先我们可能有疑问,既然OpenCL具有平台无关性,我们为什么还要去研究不同厂商的特殊硬件设备呢?
内容包括:
1.OpenCLspec和多核硬件的对应关系
又快过年了-----心情复杂今天是星期天,心情复杂,说不清只是第一次来,觉的无聊,进来看看。。。。。
互联网和FPGA的几个相似点:
1. 网络互联,相当于FPGA内的走线;
2. 存储服务,相当于Flash或其他非易失存储器;
3. 数据库,相当于
4. mem cache,就是FPGA内部寄存器;...
英文论文链接:http://cadlab.cs.ucla.edu/~cong/slides/fpga2015_chen.pdf
翻译:卜居
转载请注明出处:
CNN已经广泛用于图像识别,...
1. 前言Nvidia 在今年的 GTC( GPU Technology Conference ) 上高调宣布了 Pascal 架构——专门针对每瓦性能优化的新架构,采用 16nm 工艺。接着发布了该...
出于工作需求,申请了这两家的高级语言综合工具,对典型算法进行了实现和评估。
简要谈谈使用体验。
1. Altera OpenCL SDK
首先需要安装Quartus(13.1版本以上)和配套的So...
1、SP总数=TPC&GPC数量*每个TPC中SM数量*每个SM中的SP数量;
TPC和GPC是介于整个GPU和流处理器簇之间的硬件单元,用于执行CUDA计算。特斯拉架构硬件将SM组合成TPC(纹理处...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信