图片来自《视觉中国》近日,谷歌在ISCA2017上公开了TPU(张量处理单元)的细节。在HaswellCPU和TeslaK80GPU之后,又增加了一个专用于机器学习和神经网络的高性能。武器。数据分析与GPUGPU不仅可以实现数据库的诸多功能,还可以凭借其强大的计算能力实现实时分析。MapD和Kinetica是这方面的两家知名公司。MapD使用NVIDIATeslaK40/K80实现基于SQL和列式存储的数据库,无需索引,擅长条件查询(Where)、聚合(Groupby)等任意组合,实现传统关系型的BI功能数据库,方便用户多条件自由查询。性能优势也很明显(尤其是响应时间)。例如MapD将1987年到2008年美国进出港航班数据扩容10倍后,执行全表扫描的报表任务,如“SELECT...GROUPBY...”。具有8个TeslaK40显卡(8核/384GRAM/SSD)的服务器比由3个服务器(32核/244GRAM/SSD)组成的内存数据库集群快50-100倍。GPU数据库的另一大特色是可视化渲染和绘图。OpenGL等的buffer在GPUCUDA中直接映射到显存空间,就地渲染,无需将结果从内存拷贝到GPU,可以实现高帧率动画。也可以就地绘制为PNG或视频流,然后发送给客户端,大大减少了网络传输的数据量。这些优势吸引了众多开发者。实时分析领域最著名的公司之一是Kinetica。他们首先为美国情报机构实时分析250个数据流。现在可以使用10个节点,基于200,000个传感器,为美国邮政服务(USPS)提供15,000个并行实时分析、物流路由计算和调度。国内使用GPU进行分析挖掘的用户越来越多,想要深入学习的朋友也越来越多。最快的入门方法是重复以前的实验。弗吉尼亚大学AcceleratingSQLDatabaseOperationsonaGPUwithCUDA的开发环境和实验值得借鉴。他们在低配服务器(XeonX5550(2.66GHz/4核),5GRAM)上使用了一块4G显存的NVIDIATeslaC1060,使用一张500万行的表进行查询和汇总,响应时间为30-60毫秒。我们测试过最好的配置是NVidiaGTX780,一千多块,适合尝试查询和聚合。先用SQLite把SQL解析成多个OpCode步骤,然后在CUDA上实现一个虚拟机,逐个步骤执行,直到一行一行遍历整个表。其中一些步骤可以并行化,因此在CUDA中可以使用数万个线程,每个线程可以处理一行。深度学习和GPU深度需要很高的计算能力,所以GPU的选择会极大地影响用户体验。在GPU出现之前,一个实验可能要等几个月,或者跑一天才发现某个实验的参数不好。一个好的GPU可以在深度学习网络上快速迭代,在几天内运行几个月的实验,或者用小时代替天,用分钟代替小时。快速的GPU可以帮助刚开始学习的朋友快速积累实践经验,利用深度学习解决实际问题。如果不能快速出成果,不能迅速从错误中吸取教训,学习起来会更加挫败。TimDettmers在一系列Kaggle比赛中使用GPU应用深度学习,并在PartlySunny中获得亚军并获得Hashtags比赛的机会。他用了两个更大的两层深度神经网络,用了ReLU激活函数,用Dropout实现了正则化。这个网络几乎不适合6GB的GPU内存。是否需要多个GPU?Tim曾经用40Gbit/sInfiniBand搭建过一个小型GPU集群,但他发现很难在多个GPU上实现并行神经网络,而且在密集神经网络上速度提升并不明显。小型网络可以通过数据并行更有效地并行化,但对于比赛中使用的大型网络,几乎没有加速。后来开发了一种8位压缩方法,可以说,它可以比32位更有效地并行化密集或完全互连的网络层。但结果也不理想。即使你优化了并行算法,自己写代码在多个GPU上并行执行,效果还是得不偿失。有必要很好地了解深度学习算法和硬件如何交互,以便判断它们是否真的可以从并行性中获益。对GPU的并行支持正变得越来越普遍,但它远非普遍且不一定非常有效。只有CNTK这个深度学习库可以通过微软特有的1-bit量化并行算法(效率更高)和块动量算法(效率更高)在多GPU和多台计算机上高效执行算法。在96个GPU的集群上使用CNTK可以实现90-95倍的速度提升。下一个可以高效并行化多台机器的库可能是Pytorch,但它还没有完全准备好。如果你想在单机上并行化,你可以使用CNTK、Torch或Pytorch。速度可提高3.6-3.8倍。这些库包含可以在具有4个GPU的单台机器上并行执行的算法。其他支持并行性的库要么很慢,要么两者兼而有之。多个GPU,非并行使用多个GPU的另一个好处是多个算法或实验可以在每个GPU上单独运行,即使这些算法不是并行执行的。虽然不能提速,但可以一次性了解多个算法或参数的表现。当研究人员需要尽快积累深度学习经验,尝试不同版本的算法时,这很有用。这也有利于深度学习的过程。任务执行得越快,得到反馈的速度就越快,大脑就能从这些记忆碎片中得出完整的结论。在不同的GPU上用小数据集训练两个ConvNets可以更快地找出如何更好地执行。也更容易在交叉验证错误中找到模式并正确解释它们。您还可以发现模式以查找需要添加、删除或调整的参数或图层。通常,单个GPU足以完成几乎所有任务,但使用多个GPU加速深度学习模型变得越来越重要。多个便宜的GPU也可以用来更快地学习深度学习。因此,建议使用多个小GPU而不是一个大GPU。选择哪一个?NVIDIAGPU、AMDGPU或IntelXeonPhi可以很容易地用NVIDIA的标准库构建一个CUDA深度学习库,而AMD的OpenCL标准库就没那么强大了。CUDA有一个很大的GPU计算或通用GPU社区,而OpenCL有一个较小的社区。从CUDA社区更容易找到好的开源方法和可靠的编程建议。而且,NVIDIA从一开始就对深度学习进行了投资,回报也很可观。虽然现在其他公司也在深度学习上投入资金和精力,但起步较晚,落后。如果你使用NVIDIA-CUDA以外的其他软硬件进行深度学习,就会少走弯路。据说Intel的XeonPhi支持标准的C代码,修改这些代码很容易在XeonPhi上加速。这个功能听起来很有趣。但实际上只支持一小部分C代码,不实用。即使支持,执行起来也很慢。Tim曾经用过500个XeonPhi的集群,接连遇到坑。例如,XeonPhiMKL与PythonNumpy不兼容,因此无法进行单元测试。因为英特尔至强融核编译器无法正确简化模板的代码,比如switch语句,所以很大一部分代码需要重构。由于XeonPhi编译器不支持部分C++11特性,需要修改程序的C接口。这是繁琐、耗时且令人抓狂的。执行也很慢。当tensorsize不断变化的时候,不知道是bug还是线程调度影响了性能。例如,如果全连接层(FC)或丢弃层(Dropout)的大小不一样,XeonPhi就比CPU慢。预算内最快的GPU用于深度学习的GPU的高速取决于什么?是CUDA核心吗?时钟速度?还是内存大小?都不是。影响深度学习性能的最重要因素是内存带宽。GPU内存带宽以访问时间(延迟)为代价进行了优化。CPU正好相反。内存小计算速度快,比如几个数的乘法(3*6*9);如果内存很大,计算会很慢,比如矩阵乘法(A*B*C)。凭借其内存带宽,GPU擅长解决需要大量内存的问题。当然,GPU和CPU之间还有更复杂的区别,参见Tim在Quora上的回答。因此,在购买快速GPU时,首先要看带宽。比较CPU和GPU的带宽发展当芯片架构相同时,可以直接比较带宽。比如帕斯卡显卡GTX1080和1070的性能对比,只需要看显存带宽就可以了。GTX1080(320GB/s)比GTX1070(256GB/s)快25%。但如果芯片架构不同,则不能直接比较。例如,Pascal和Maxwell(GTX1080和TitanX),不同的生产过程使用不同的相同带宽。但是,带宽仍然可以大致反映GPU的速度。此外,它还需要看它的架构是否与cnDNN兼容。大多数深度学习库使用cuDNN进行卷积,因此需要Kepler或更好的GPU,即GTX600系列或以上。一般来说,Kepler比较慢,所以从性能的角度考虑,应该考虑900或1000系列。为了比较不同显卡在深度学习任务上的表现,Tim做了一张图。例如,GTX980与0.35TitanXPascal一样快,或者说TitanXPascal几乎是GTX的3倍。这些结果并非来自每张卡的深度学习基准测试,而是来自显卡参数和计算基准(在计算方面,一些加密货币挖矿任务与深度学习类似)。所以这只是一个粗略的估计。实际数字会略有不同,但差别不大,显卡排名应该是正确的。同时,使用一个没有用完GPU的小网络会让大GPU看起来不够好。例如,具有128个隐藏单元(批处理>64)的LSTM在GTX1080Ti上的运行速度并不比GTX1070快多少。要获得性能差异,需要具有1024个隐藏单元(批处理>64)的LSTM。GPU运行大规模深度学习网络的性能对比一般来说,Tim推荐GTX1080Ti或者GTX1070,都不错。如果预算允许,可以使用GTX1080Ti。GTX1070比普通的GTXTitanX(Maxwell)更便宜也更快。两者都比GTX980Ti更适合,因为内存更大——11GB和8GB而不是6GB。8GB有点小,但是对于很多任务来说已经足够了,比如Kaggle比赛中大部分图像数据集的自然语言理解(NLP)任务。GTX1060是入门深度学习的不二之选,偶尔也可以用来Kaggle比赛。3GB太少了,有时候6GB也不够用,但是可以应付很多应用。GTX1060比普通的TitanX慢,但性能和使用价格与GTX980差不多。从性价比的角度来看,10系列的设计非常好。GTX1060、1070和1080Ti更好。GTX1060适合初学者,GTX1070用途广泛,适合创业公司和一些科研和工业应用,GTX1080Ti是全能的高端产品。Tim不推荐NVIDIATitanX(Pascal),因为性价比不是很好。比较适合计算机视觉的大数据集,或者视频数据的科学研究。VRAM大小在这些方面起着重要作用,而TitanX比GTX1080Ti大1GB,因此更适合。但是,从eBay购买GTXTitanX(Maxwell)更划算——速度稍慢,但12GB内存充足。GTX1080Ti对于大多数研究人员来说已经足够了。多出1GB的显存对于很多科研和应用来说用处不大。科研方面,Tim个人选择了多块GTX1070。他宁愿做更多的实验,跑得慢一点,也不愿做一个实验,跑得更快。NLP的内存要求不像计算机视觉那么严格,因此GTX1070就足够了。现在的任务和他的处理方式决定了最合适的选择——GTX1070。选择GPU时可以使用类似的想法。先把要做的任务和实验方法想清楚,再找一个符合要求的GPU。现在AWS上的GPU实例既昂贵又缓慢。GTX970比较慢,用过的比较贵,而且显卡在启动时有内存问题。您可以多花一点钱买GTX1060,它速度更快,内存更大,而且没有内存问题。如果GTX1060太贵,可以用4G显存的GTX1050Ti。4GB有点小,但是对于深度学习的入门来说已经足够了。如果在某些机型上进行调整,可以获得更好的性能。GTX1050Ti适用于大部分Kaggle比赛,但在部分比赛中可能无法发挥选手优势。
