———————————————————
已经2017年了,从90年代初的品牌机流行,90年代末的组装机流行,2000-2010桌面级逐渐被移动PC/Mac取代,一直到现在移动终端大行其道,攒机似乎已经走过一个完整的生命周期。而因为2008年老黄开始攒GPGPU的大招,一直到2014年开始深度学习的逐渐兴起,台式家用机开始扮演起另外的角色:家用作坊小钢炮。
一直在掉坑的我在此拿出一些心得,与大家分享。
———————————————————-
1 显卡篇
首先要说明一点,在家搞深度学习不是在云端部署用于深度学习的卡那样,所以NVidia的Tesla系列主打单精度的计算显卡、Quadro系列双精度计算卡固然好,但是性价比实际不堪一击,具体可以参考:
深度学习是一种概率推断工具,常见于人工智能应用(图像视频识别、语音识别、文本处理、自动对话等),这跟发射火箭需要高精度计算以及纠错(ECC)不一样,一个深度神经网络对单个参数精度的依赖其实很低,不需要双精度计算能力,因此能看到Tesla系列的显卡和此处的10x0系列游戏卡一样,都是设计成为极高的单精度计算能力和极低的双精度计算能力的。所以在生产设计之初这些卡就注定是为了深度学习而生的。
实际上,如果你主要跑的是LSTM这种结构的应用(比如文本、语音、OCR),参数比较少的时候,1060的6GB显存已经足够,当然它的算力有些乏善可陈了(3.8T/睿频4.4T)。如果你只跑CV的训练,如大规模残差网络(在公司一个152层的ResNet,数据并行,直接每张卡吃了7G显存,可以8卡并行获得一个可观的加速比),如果你的公司不提供算力,你也不喜欢直接在云平台上花钱训练的化,那么可能一个大显存的Titan X Pascal (12GB)更适合你。1070和1080就比较中庸,这个根据个人的兴趣和钱包综合选择即可。
有人想要问了,我有钱,还是想买个人用的M系列(M40,M60)、P系列(P100)等显卡,而且想多卡并行,该怎么办?这个已经脱离个人家用作坊的定义了,价格从几十万到一百万不等,建议还是直接找NVidia原厂、华硕等能提供质保的大厂提供销售服务。
还有人问,我很有钱,还是想买双卡GPU做训练,这个问题已经牵涉到主板的选择,我们放到后面再讨论,但可以先说结论:强行上双卡,会极大的拉低整机性价比,而且最终训练效果的提升未必如你想象的那么好。如果你还要说『我不听我不听』,那请看完本篇。
2 内存/存储篇
很多人会觉得,存储跟深度学习有个毛关系?我们先来看一下一个优化得不好的深度学习训练任务数据pipeline长什么样子:
准备阶段:
定义Symbol和图结构
数据训练阶段:
for i in num_of_epoch:
for k in num_of_iter:
for j in num_of_batch_size:
数据生成/爬取(网络I/O, CPU速度, L3 Cache/内存)
数据清洗(CPU速度,内存)
数据缓存/保存(内存大小,存储I/O)
数据加载进图(内存大小,存储I/O,PCI-E带宽,GPU显存)
根据图Backward一轮(GPU速度)
Forward一轮给出当前iter预测(GPU速度)
根据预测给出当前iter训练集精度(CPU速度,BLAS指令集优化)
Forward一轮给出当前epoch在测试集预测(GPU速度)
根据预测给出当前epoch在测试集的精度(CPU速度,BLAS指令集优化)
保存模型中间点(存储I/O)
除了更多的把走网络I/O的步骤移动到准备阶段是一个很明显的优化点以外,你会发现,一旦作为数据缓存的内存容量不够大,你的物理存储I/O马上就会成为下一个瓶颈。尤其图片一般来说还都是小文件,而固态硬盘(SSD)对小文件的优化比机械硬盘8~9ms随机寻道一次的速度不知道超越了几个数量级,如果你真的优化不了数据训练阶段的数据结构,无法把它做成缓存,或者保证它能够连续读取,那你为什么不花多一点的钱提高这个物理存储IOPS的随机寻道性能呢?
我的方案是Samsung 960 Pro M.2 256G 作为系统盘
【找图】
Intel 750 PCI-E 1.2T作为副盘
【找图】
WD紫色监控盘2T作为数据盘,主打监控(大数据流,大文件读写)功能
【找图】
。因为M.2接口和PCI-E接口都占用PCI-E通道,稍后在主板阶段我会介绍一下这里面的坑。
3 内存篇
内存应该是一个题外话,真要买的话,闭着眼睛买个16GB*2的套装可以适应大部分主流的主板,(小主板只有2个内存槽,而大主板的话你可以把内存插到同色槽位,)所以我们就开一个小差聊聊内存的DDR标准。
现在新装机的平台,以X99,Z170为例,用的普遍都是DDR4的内存,老一些的机器老树开新花用的有DDR3的内存。假设你的数据较小,数据都能加载到内存种,那究竟什么是影响内存存取速度的关键因素呢?
一个就是DDR内存的工作频率,而另一个和工作频率此消彼长的是DDR内存的时序(DDR Timing),这是一个内存存取的延迟指标。工作频率的倒数,就是一个内存工作时钟周期的时间长度。
可以看到,图中的这个『8-8-8-24』分别代表
CL:CAS Latency,Column Access Strobe (CAS) latency,从系统发送命令到内存开始到读写特定列所消耗的时钟周期数。时间。也就是说,如果我们已经指定了我们要从某一行读内存,但我们要从这一行里取多个数值,每次读写数值的时候这个CL是无可避免要消耗掉的。
tRCD:RAS to CAS Delay,激活内存中的一行后(激活动作)到读写动作(READ/WRITE)所需要消耗的时间。如果我们是在同一行进行读写的话,不需要重新激活行的情况下,tRCD的时间只需要消耗一次。
tRP:Row Precharge Time。有的时候我们需要取消一行的激活,再去激活另一行以读取数据,这一部分需要对内存行进行充电,这个时间的损耗就是tRP。
tRAS:Row Active Time。在激活一行的命令到预充电命令前的准备时间。可以看到这个时钟周期就比较大了。
假设我们有一个很大的1维的数组和一堆很小的1维数组,如果前者安排在了连续空间里,那么tRCD、tRP、tRAS的损耗就小,否则tRCD/tRP/tRAS的时间损耗就比较大,这些都是overhead。一个好的BLAS不仅能够利用好的指令集高速计算出我们需要的结果,同时对于底层C代码对内存的管理应该也有一个较清楚的认识。
最后还是告诫大家,不要迷信高主频的内存,如果你工作在1600MHz的内存CL=8,每次取出一个数据的时间和工作在2000MHz@CL=10,2400MHz@CL=12的内存就是一个速度,根本起不到超频提速的作用。对于给内存超频的狂热玩家经常能发现,超频之后为了保证内存工作稳定只能调高CL,这不是跟没超频一样吗?又能超频,又能保证低CL的内存一般都是大厂某一批次品质特别好的产品,而如果品质比较均匀的话,人家自己不会标一个更高的参数来卖吗?只有品质不均匀的产品你才有机会通过超频或者降低CL来发现自己买到了超值的内存。要说我的经验的话,我对超频已经不感冒了,一般只会看DDR4(不能插在只支持DDR3的主板上,反之亦然)的频率和CL,买回来直接默认使用。
4 FPGA篇
【找一个Xilinx的广告图】
【找一个Altera的广告图】
【找一个Intel的广告图】
在Intel收购FPGA两大巨头之一的Altera之后,现在我们在FPGA市场上就有个新的双雄:Xilinx和Intel。前一阵子我还在婊Xilinx长期做视频采集产品,对深度学习嗅觉太差,听说百度用的是Xilinx的方案,我们就来看一下国内拿FPGA做深度学习的厂子,有的自己做基础设施,有的卖产品,有的搭载云服务,各有侧重,今天就不赘述了,因为有人会问了,
『你说的这个FPGA,我怎么没听说过啊。』
是的,就像你5年前不知道NVidia做GPGPU卡已经如火如荼一样自然,因为它已经改变了行业生态,却还没有改变人类的生活,不做技术也不做技术公司投资的你,嗅觉不够灵敏是很自然的事情。
【找一个FPGA板卡的图】
如果说我们的CPU、GPU是依靠着定长流水线+接受高级指令+转化低级指令+计算实现『通用计算的话』,FPGA(Field-Programmable Gate Array)就是一个灵活性不算高,但是用可编程门阵列实现指令、算力也不低的这样一种方案,它的灵活性介于CPU/GPU和ASIC之间。好吧,又是一个新名词,ASIC?Application-specific integrated circuit,专用集成电路,常见于只做SHA256一个任务的比特币矿机。
因为每次改变计算任务或者网络结构都要重新『烧』一次FPGA,我们还不如用FPGA来充当『训练好的模型对外提供深度学习预测』这样一个角色。GPU训练,FPGA预测。All good.
小钢炮的FPGA板卡采用了杭州加速云的FPGA解决方案,使用了Intel Atera Arria 10,算力9.2T,单价2万左右,和搜狗、讯飞、腾讯都有合作的这么一家初创公司。
5 平台篇:CPU/主板芯片组/主板板型
因为对CPU的需求不高,这次的小钢炮我买了廉价的Z170MX(3PCI-E插口版本)+i5作为方案。如果你觉得对CPU矩阵计算的要求也比较高(比如一些单次矩阵计算的任务,不适合拿进GPU算了一次再拿出来),建议使用X99+E5-2679v4(ES,QS等非盒装产品)这样的组合,经某些土豪实测,E5不仅跟Intel MKL 这个BLAS更搭配,而且2679也拥有牛逼的L3 Cache和性价比。
现在要聊聊坑爹的主板芯片组了,自从Intel在05年把NVidia的芯片组排挤出市场之后,就开始了它的邪恶计划:拼命的把一些增强功能压到最底。比如,Z170芯片组全系列最大PCI-E通道只有20,这说明什么?
如果我要同时用1080显卡,M.2 SSD 以及PCI-E SSD,PCI-E FPGA,那么全部在工作的它们一定不会满速度I/O,何其可恶。如果你要用更好的显卡,你的钞票就开始熊熊燃烧了。购买一个合理的搭配真是太难了。
板型我挑选的是半大不小的M-ATX板型。ATX>M-ATX>ITX,主板的大小基本就这三种,购买的时候注意和机箱搭配即可。一般ITX板型很难有3个以上的PCI-E插槽和2个以上的内存插槽,这也是它的局限性之一,你要它小巧,就不能指望它功能强大。
再说说双显卡方案,我刚才已经说了,如果你想用双卡的方案,一定还是要挑选PCI-E通道数较多的主板,比如X99芯片组的微星X99 SLI。它拥有28Lane,尽管这个仍然不能满足我的需求,但是至少,如果我只用1个PCI-E SSD的话,那么我的显存I/O还能工作在一个16x,一个8x的速度上。如果我一直在处理PCI-E I/O密集型的计算任务,这种提升也算是聊胜于无吧。一般双显卡会要求更大的机箱、更大的主板板型、更好的散热,这些可能不会带来成本的提升,但是你不要忘了最重要的一点:你很可能需要一个功率更大的、转化效率更高的电源。对于Pascal这一代显卡来说,多插一块1080带来额外的200W功率的需求,也不是特别难选,但电源的成本可能会上升三四百。
6 组装篇
呸,应该叫配置环境篇啦。组装这种事情还有大大小小的坑,可以使用京东装机服务、门店的装机服务,女生的话可以考虑计算机系和电子系好人男同学的服务。(泥垢)
CentOS 7 + GCC 4.8.5 + OpenCV 2.4.9.1 + CUDA 7.5 + CUDNN 5
Ubuntu16.04.1 + GCC 5.4.1 + OpenCV 3.2 + CUDA 8.0 + CUDNN 5.1
这两个版本工作的还是比较稳定的,如果非要说不稳定,那么我要甩锅给OpenCV好了。
(我用OpenCV生成样例数据的时候遇到Core Dump的几率极高,只能写一个防止卡死、防止Core Dump的wrapper脚本来重启生成数据的脚本。)
最后
还是要建议大家,量力而为、量力而行、量力而买买买。
转载请注明出处。
网友评论