百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

数据平台上的计算能力哪些GPU更适合深度学习和数据库

toyiye 2024-06-21 11:55 8 浏览 0 评论

图片来自“视觉中国”

最近Google在ISCA2017上披露了TPU(Tensor Processing Unit)的细节,继Haswell CPU,Tesla K80GPU之后,又增加了一种专门用于机器学习和神经网络的高性能武器。

数据分析和GPU

GPU不仅能实现数据库的许多功能,而且其强大的计算能力,能实现实时分析。MapD和Kinetica是这方面比较有名的两家公司。MapD用NVIDIA Tesla K40/K80实现了基于SQL和列式存储的数据库,无需索引,擅长任意多组合的条件查询(Where)、聚合(Groupby)等,实现传统关系型数据库的BI功能,方便用户自由地进行多条件查询。性能优势也很明显(尤其是响应时间)。

比如,MapD将1987-2008年全美国进出港航班的数据扩大10倍后,执行全表扫描的报表任务,如"SELECT...GROUP BY...”。一台带有8张Tesla K40显卡的服务器(8核/384G RAM/SSD)比3台服务器(32核/244G RAM/SSD)组成的内存数据库集群快50-100倍。

GPU数据库的另一大特色是可视化渲染和绘制。将OpenGL等的缓冲区直接映射成GPU CUDA里的显存空间,原地渲染,无需将结果从内存拷到GPU,可以实现高帧频的动画。也可以原地绘制成PNG或视频stream,再发给客户端,大大减少网络传输的数据量。这些优势吸引了很多开发者。

在实时分析上比较有名的一家公司是Kinetica。他们开始时为美国情报机构实时分析250个数据流。现在能用10个节点,基于20万个传感器,为美国邮政服务(USPS)提供15000个并行的实时分析、物流路由计算和调度等。

我国用GPU进行分析和挖掘的用户也越来越多,想深入学习的朋友也不少。最快速的入门办法是重复前人的实验。弗吉尼亚大学的Accelerating SQL Database Operations on a GPU with CUDA里的开发环境和实验,值得借鉴。他们用一张4G显存的NVIDIA Tesla C1060,在一台低配的服务器上(Xeon X5550(2.66GHz/4核),5G RAM),用5百万行的表做查询和汇总,响应时间30-60毫秒。

我们测过的最低配置是NVidia GTX 780,一千多块,适合用来尝试查询和聚合。先用SQLite将SQL解析成多个OpCode步骤,然后在CUDA上实现一个虚机,来逐一实现每个步骤,直至将整个表逐行遍历完。其中一些步骤可以并行,因此可用CUDA起几万个线程,每个线程处理一行。

深度需要较高的计算能力,所以对GPU的选择会极大地影响使用者体验。在GPU出现之前,一个实验可能需要等几个月,或者跑了一天才发现某个试验的参数不好。好的GPU可以在深度学习网络上快速迭代,几天跑完几个月的试验,或者几小时代替几天,几分钟代替几小时。

快速的GPU可以帮助刚开始学习的朋友快速地积累实践经验,并用深度学习解决实际问题。如果不能快速得到结果,不能快速地从失误中汲取教训,学起来会比较让人灰心。Tim Dettmers利用GPU,在一系列Kaggle比赛里应用了deep learning,并在Partly Sunny with a chance of Hashtags比赛中获了亚军。他用了两个较大的两层深度神经网络,采用了ReLU激活函数,用Dropout来实现正则化。这个网络勉强能加载到6GB的GPU显存里。

是否需要多个GPU?

Tim曾用40Gbit/s的InfiniBand搭建了一个小GPU集群,但他发现很难在多个GPU上实现并行的神经网络,而且在密集的神经网络上,速度提升也不明显。小网络可以通过数据并行更有效地并行,但对比赛里所用的这个大网络,几乎没有提速。

后来又开发了一个8-bit压缩方法,按理说,能比32-bit更有效地并行处理密集或全互联的网络层。但是结果也不理想。即使对并行算法进行优化,自己专门写代码在多颗GPU上并行执行,效果和付出的努力相比仍然得不偿失。要非常了解深度学习算法和硬件之间具体如何互动,才能判断是否能从并行里真的得到好处。

对GPU的并行支持越来越常见,但还远未普及,效果也未必很好。仅有CNTK这一种深度学习库通过Microsoft特殊的1-bit量化并行算法(效率较高)和块动量算法(效率很高),能在多个GPU和多台计算机上高效地执行算法。

在96颗GPU的集群上用CNTK,可以获得90-95倍的速度提升。下一个能高效地多机并行的库可能是Pytorch,但还没完全做好。如果想在单机上并行,可以用CNTK,Torch或Pytorch。速度可提升3.6-3.8倍。这些库包含了一些算法,能在4颗GPU的单机上并行执行。其他支持并行的库,要么慢,要么这两个问题都有。

多GPU,非并行

用多个GPU的另一个好处是,即使不并行执行算法,也可以在每个GPU上分别运行多个算法或实验。虽然不能提速,但可以一次性了解多个算法或参数的性能。当科研人员需要尽快地积累深度学习经验,尝试一个算法的不同版本时,这很有用。

这对深度学习的过程也很有好处。任务执行得越快,越能更快地得到反馈,脑子就从这些记忆片段里总结出完整的结论。在不同的GPU上用小数据集训练两个卷积网络,可以更快地摸索到如何能执行得更好。也能更顺地找到交叉验证误差(Cross validation error)的规律,并正确地解读它们。还能发现某种规律,来找到需要增加、移除或调整的参数或层。

总的来说,单GPU几乎对所有的任务都够了,不过用多个GPU来加速深度学习模型变得越来越重要。多颗便宜的GPU也能用来更快地学习深度学习。因此,建议用多个小GPU,而不是一个大的。

选哪种?

NVIDIA GPU,AMD GPU还是Intel Xeon Phi

用NVIDIA的标准库很容易搭建起CUDA的深度学习库,而AMD的OpenCL的标准库没这么强大。而且CUDA的GPU计算或通用GPU社区很大,而OpenCL的社区较小。从CUDA社区找到好的开源办法和可靠的编程建议更方便。

而且,NVIDIA从深度学习的起步时就开始投入,回报颇丰。虽然别的公司现在也对深度学习投入资金和精力,但起步较晚,落后较多。如果在深度学习上采用NVIDIA-CUDA之外的其他软硬件,会走弯路。

据称,Intel的Xeon Phi上支持标准C代码,而且要在Xeon Phi上加速,也很容易修改这些代码。这个功能听起来有意思。但实际上只支持很少一部分C代码,并不实用。即使支持,执行起来也很慢。Tim曾用过500颗Xeon Phi的集群,遇到一个接一个的坑,比如Xeon Phi MKL和Python Numpy不兼容,所以没法做单元测试。因为Intel Xeon Phi编译器无法正确地对模板进行代码精简,比如对switch语句,很大一部分代码需要重构。因为Xeon Phi编译器不支持一些C++11功能,所以要修改程序的C接口。既麻烦,又花时间,让人抓狂。

执行也很慢。当tensor大小连续变化时,不知道是bug,还是线程调度影响了性能。举个例子,如果全连接层(FC)或剔除层(Dropout)的大小不一样,Xeon Phi比CPU慢。

预算内的最快GPU

用于深度学习的GPU的高速取决于什么?是CUDA核?时钟速度?还是RAM大小?这些都不是。影响深度学习性能的最重要的因素是显存带宽。

GPU的显存带宽经过优化,而牺牲了访问时间(延迟)。CPU恰恰相反,所用内存较小的计算速度快,比如几个数的乘法(3*6*9);所用内存较大的计算慢,比如矩阵乘法(A*B*C)。GPU凭借其显存带宽,擅长解决需要大内存的问题。当然,GPU和CPU之间还有更复杂的区别,可以参见Tim在Quora上的回答。

所以,购买快速GPU的时候,先看看带宽。

对比CPU和GPU的带宽发展

芯片架构相同时,带宽可以直接对比。比如,Pascal显卡GTX 1080和1070的性能对比,只需看显存带宽。GTX 1080(320GB/s)比GTX 1070(256GB/s)快25%。不过如果芯片架构不同,不能直接对比。比如Pascal和Maxwell(GTX 1080和Titan X),不同的生产工艺对同样带宽的使用不一样。不过带宽还是可以大概体现GPU有多快。另外,需要看其架构是否兼容cnDNN。绝大多数深度学习库要用cuDNN来做卷积,因此要用Kepler或更好的GPU,即GTX 600系列或以上。一般来说,Kepler比较慢,所以从性能角度,应考虑900或1000系列。为了比较不同显卡在深度学习任务上的性能,Tim做了个图。比如GTX 980和0.35个Titan X Pascal一样快,或者说Titan X Pascal比GTX快了差不多3倍。

这些结果并不来自于每张卡的深度学习benchmark测试,而是从显卡参数和计算型benchmark(在计算方面,一些加密货币挖掘任务和深度学习差不多)。所以这只是粗略估计。真实数字会有些不同,不过差距不大,显卡排名应该是对的。同时,采用没有用足GPU的小网络会让大GPU看上去不够好。比如128个隐藏单元的LSTM(批处理>64)在GTX 1080 Ti上跑的速度不比GTX 1070快多少。要得到性能区别,需要用1024个隐藏单元的LSTM(批处理>64)。

GPU跑大型深度学习网络的性能比较

一般来说,Tim建议用GTX 1080 Ti或GTX 1070。这两者都不错。如果预算够的话,可以用GTX 1080 Ti。GTX 1070便宜一点,比普通GTX Titan X(Maxwell)更快。两者都比GTX 980 Ti更适合,因为显存更大——11GB和8GB,而不是6GB。

8GB有点小,但对很多任务都足够了,比如足够应付Kaggle比赛里大多数图像数据集合自然语言理解(NLP)的任务。

刚开始接触深度学习时,GTX 1060是最好的选择,也可以偶尔用于Kaggle比赛。3GB太少,6GB有时不太够,不过能应付很多应用了。GTX 1060比普通Titan X慢,但性能和二手价格都和GTX 980差不多。

从性价比来看,10系列设计很好。GTX 1060,1070和1080 Ti更好。GTX 1060适合初学者,GTX 1070的用途多,适合初创公司和某些科研和工业应用,GTX 1080 Ti是不折不扣的全能高端产品。

Tim不太建议NVIDIA Titan X(Pascal),因为性价比不太好。它更适合计算机视觉的大数据集,或视频数据的科研。显存大小对这些领域的影响非常大,而Titan X比GTX 1080 Ti大1GB,因此更适合。不过,从eBay上买GTX Titan X(Maxwell)更划算——慢一点,但12GB的显存够大。

GTX 1080Ti对大多数科研人员够用了。额外多1GB的显存对很多科研和应用的用处不大。

在科研上,Tim个人会选多张GTX 1070.他宁可多做几次实验,稍微慢一点,而不是跑一次实验,快一点。NLP对显存的要求不像计算机视觉那么紧,因此GTX 1070足够了。他现在处理的任务和方式决定了最合适的选择——GTX 1070。

选择GPU时可以用类似的思路。先想清楚所执行的任务和实验方法,再找满足要求的GPU。现在AWS上的GPU实例比较贵且慢。GTX 970比较慢,而且二手的也比较贵而且启动时显卡有内存问题。可以多花点钱买GTX 1060,速度更快,显存更大,而且没有显存问题。如果GTX 1060太贵,可以用4G显存的GTX 1050 Ti。4GB有点小,但也深度学习的起步也够了。如果在某些型号上做调整,可以得到较好性能。GTX 1050 Ti适合于大多数Kaggle比赛,不过可能在一些比赛里发挥不出选手优势。

52

58

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码