https://www.zhihu.com/topic/19570427/top-answers 话题汇总
目前在机器学习领域异构计算得到重视,GPU占据主流位置,Fpga初现端倪,不知fpga在机器学习的前景如何?
=====================
本文原来发布在《矽说》专栏,欢迎关注:)
FPGA vs. ASIC,谁将引领移动端人工智能潮流? - 矽说 silicon talks - 知乎专栏
FPGA vs. ASIC
首先讲讲FPGA和ASIC的区别。FPGA全称“可编辑门阵列”(Field Programmable Gate Array),其基本原理是在FPGA芯片内集成大量的数字电路基本门电路以及存储器,而用户可以通过烧入FPGA配置文件来来定义这些门电路以及存储器之间的连线。这种烧入不是一次性的,即用户今天可以把FPGA配置成一个微控制器MCU,明天可以编辑配置文件把同一个FPGA配置成一个音频编解码器。ASIC则是专用集成电路(Application-Specific Integrated Circuit),一旦设计制造完成后电路就固定了,无法再改变。
用于深度学习加速器的FPGA(Xilinx Kintex 7 Ultrascle,左)和ASIC(Movidius Myriad 2,右)
比较FPGA和ASIC就像比较乐高积木和模型。举例来说,如果你发现最近星球大战里面Yoda大师很火,想要做一个Yoda大师的玩具卖,你要怎么办呢?有两种办法,一种是用乐高积木搭,还有一种是找工厂开模定制。用乐高积木搭的话,只要设计完玩具外形后去买一套乐高积木即可。而找工厂开模的话在设计完玩具外形外你还需要做很多事情,比如玩具的材质是否会散发气味,玩具在高温下是否会融化等等,所以用乐高积木来做玩具需要的前期工作比起找工厂开模制作来说要少得多,从设计完成到能够上市所需要的时间用乐高也要快很多。FPGA和ASIC也是一样,使用FPGA只要写完Verilog代码就可以用FPGA厂商提供的工具实现硬件加速器了,而要设计ASIC则还需要做很多验证和物理设计(ESD,Package等等),需要更多的时间。如果要针对特殊场合(如军事和工业等对于可靠性要求很高的应用),ASIC则需要更多时间进行特别设计以满足需求,但是用FPGA的话可以直接买军工级的高稳定性FPGA完全不影响开发时间。但是,虽然设计时间比较短,但是乐高积木做出来的玩具比起工厂定制的玩具要粗糙(性能差)许多(下图),毕竟工厂开模是量身定制。另外,如果出货量大的话,工厂大规模生产玩具的成本会比用乐高积木做便宜许多。FPGA和ASIC也是如此,在同一时间点上用最好的工艺实现的ASIC的加速器的速度会比用同样工艺FPGA做的加速器速度快5-10倍,而且一旦量产后ASIC的成本会远远低于FPGA方案(便宜10到100倍)。
FPGA vs ASIC :积木vs 手办
当然,FPGA还有另一大特点,就是可以随时重新配置,从而在不同的场合实现不同的功能。但是,当把FPGA实现的加速器当作一个商品卖给用户时,要让用户自己去重新配置却要花一番功夫。回到用乐高积木做玩具的例子,玩具厂商可以宣称这个Yoda大师由积木搭起来,所以玩家可以把这些积木重新组合成其他角色(比如天行者路克)。但是一般玩家根本不会拆装积木,怎么办?解决方案要么是把目标市场定为精通积木的专业核心玩家,要么是在玩具后面加一个开关,一般玩家只要按一下就可以让积木自动重新组装。很显然,第二个方案需要很高的技术门槛。对于FPGA加速器来说,如果要把可重配置作为卖点,要么是卖给有能力自己开发FPGA的企业用户(如百度,微软等公司确实有在开发基于FPGA的深度学习加速器并且在不同的应用场合将FPGA配置为不同的加速器),要么是开发一套方便易用能将用户的深度学习网络转化为FPGA配置文件的编译器(深鉴等公司正在尝试)。从目前来看,即使用高端的服务器来做FPGA编译都会需要数分钟的时间,如果编译在计算能力较弱的移动终端做需要的时间就更长了。对于移动终端用户来说,如何说服他们尝试重新配置FPGA并接受长达数十分钟的时间来编译网络并配置FPGA仍然是一个问题。
小结:
我把FPGA和ASIC的比较总结在下面表格里。FPGA上市速度快,但性能较低。ASIC上市速度慢,需要大量时间开发,而且一次性成本(光刻掩模制作成本)远高于FPGA,但是性能远高于FPGA且量产后平均成本远低于FPGA。FPGA可以完全重配置,但是ASIC也有一定的可配置能力,只要在设计的时候就把电路做成某些参数可调的即可。目标市场方面,FPGA成本太高,所以适合对价格不是很敏感的地方,比如企业应用,军事和工业电子等等(在这些领域可重配置可能真的需要)。而ASIC由于低成本则适合消费电子类应用,而且在消费电子中可配置是否是一个伪需求还有待商榷。我们看到的市场现状也是如此:使用FPGA做深度学习加速的多是企业用户,百度、微软、IBM等公司都有专门做FPGA的团队为服务器加速,而做FPGA方案的初创公司Teradeep的目标市场也是服务器。而ASIC则主要瞄准消费电子,如Movidius。由于移动终端属于消费电子领域,所以未来使用的方案应当是以ASIC为主。
=====================移动端与服务器端的分割线==========================
下面讨论服务器端GPU和FPGA的比较。
在Server端, 我想有几个指标可供对比:
*峰值性能
*灵活性
*平均性能
*功耗和能效比
其实这几个指标是会互相影响的,不过还是分开说。
从峰值性能来说,GPU(10Tflops)远远高于FPGA(<1TFlops)。GPU上面成千上万个core同时跑在GHz的频率上还是非常壮观的,最新的GPU峰值性能可达10TFlops以上。GPU的架构经过仔细设计(例如使用深度流水线,retiming等技巧),在电路实现上是基于标准单元库而在critical path上可以用手工定制电路,甚至在必要的情形下可以让半导体fab依据设计需求微调工艺制程,因此可以让许多core同时跑在非常高的频率。相对而言,FPGA首先设计资源受到很大的限制,例如GPU如果想多加几个core只要增加芯片面积就行,但FPGA一旦你型号选定了逻辑资源上限就确定了(浮点运算在FPGA里会占用很多资源),好汉也会被尿憋死。而且,FPGA里面的逻辑单元是基于SRAM-查找表,其性能会比GPU里面的标准逻辑单元差好多。最后,FPGA的布线资源也受限制(有些线必须要绕很远),不像GPU这样走ASIC flow可以随意布线,这也会限制性能。关于这一点,可以参考为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz? - 芯片(集成电路)下 @岑川的回答。
除了芯片性能外,GPU相对于FPGA还有一个优势就是 内存接口。GPU的内存接口(传统的GDDR,最近更是用上了HBM和HBM2)的带宽远好于FPGA的传统DDR接口,而众所周知服务器端机器学习算法需要频繁访问内存。
但是从 灵活性来说,FPGA远好于GPU。FPGA可以根据特定的应用去编程硬件(例如如果应用里面的加法运算非常多就可以把大量的逻辑资源去实现加法器),但是GPU一旦设计完那就没法改动了,没法根据应用去调整硬件资源。目前机器学习大多数适合使用SIMD架构(即只需一条指令可以平行处理大量数据),因此用GPU很适合。但是有些应用是MISD(即单一数据需要用许多条指令平行处理,微软在2014年ISCA paper里面就举了一个MISD用于并行提取feature的例子),这种情况下用FPGA做一个MISD的架构就会比GPU有优势。不过FPGA的编程对于程序员来说并不容易,所以为了能让机器学习程序员能方便地使用FPGA往往还需要在FPGA公司提供的编译器基础上进行二次开发,这些都是只有大公司才能做。
微软在2014年ISCA paper里面就MISD用于并行提取feature的例子
从上面两条我们可以看出,FPGA实现的机器学习加速器在架构上可以根据特定应用优化所以比GPU有优势,但是GPU的运行速度(>1GHz)相比FPGA有优势(~200MHz)。所以,对于 平均性能,看的就是FPGA加速器架构上的优势是否能弥补运行速度上的劣势。如果FPGA上的架构优化可以带来相比GPU架构两到三个数量级的优势,那么FPGA在平均性能上会好于GPU。例如,百度在HotChips上发布的paper显示,GPU的平均性能相比FPGA在矩阵运算等标准batch data SIMD bench上远好于FPGA;但是在处理服务器端的少量多次处理请求(即频繁请求但每次请求的数据量和计算量都不大)的场合下,平均性能会比GPU更好。
功耗方面,虽然GPU的功耗(200W)远大于FPGA的功耗(10W),但是如果要比较功耗应该比较在执行效率相同时需要的功耗。如果FPGA的架构优化能做到很好以致于一块FPGA的平均性能能接近一块GPU,那么FPGA方案的总功耗远小于GPU,散热问题可以大大减轻。反之,如果需要二十块FPGA才能实现一块GPU的平均性能,那么FPGA在功耗方面并没有优势。 能效比的比较也是类似,能效指的是完成程序执行消耗的能量,而能量消耗等于功耗乘以程序执行的时间。虽然GPU的功耗远大于FPGA的功耗,但是如果FPGA执行相同程序需要的时间比GPU长几十倍,那FPGA在能效比上就没有优势了;反之如果FPGA上实现的硬件架构优化得很适合特定的机器学习应用,执行算法所需的时间仅仅是GPU的几倍或甚至于接近GPU,那么FPGA的能效比就会比GPU强。