人工智能方兴未艾,无数初创公司和老牌公司都在积极开发以人工智能应用为卖点的智能硬件。目前,强大的云端人工智能服务(如谷歌的Alpha Go)已经初现端倪,同时,人们也希望能把人工智能也带到移动终端,尤其是能够结合未来的物联网应用。
传统实现移动终端人工智能的方法是通过网络把终端数据全部传送到云端,之后在云端计算后再把结果发回移动端,例如苹果的Siri服务。然而,这样的方式会遇到几个问题。第一,使用网络传输数据会产生延迟,很可能数据计算的结果会需要等待数秒甚至数十秒才能传送回终端(使用过Prisma app处理过照片的朋友们应该深有体会)。这样一来,那些需要立刻得到计算结果的应用就不能用这种方式。例如无人机上使用的深度学习躲避障碍物算法,如果它全部在云端执行恐怕计算结果还没送回来无人机已经掉下来了。第二,一旦使用网络传送数据,那么数据就有被劫持的风险。因此,那些要求低计算延迟以及对于数据安全性非常敏感的应用就需要把人工智能算法全部在终端实现,或者至少在终端完成一些预处理运算然后再把少量运算结果(而不是大量的原始数据)传送到云端完成最终计算,这就需要移动终端硬件能够快速完成这些运算。另一方面,移动端硬件完成这些运算需要的能量又不能太多,否则电池一下就没电了(想在手机上配功耗200W+的Nvidia Pascal显卡肯定不行!)。
目前,许多公司正在积极开发能实现移动端人工智能的硬件。对于移动端人工智能硬件的实现方法,有两大流派,即FPGA派和ASIC派。FPGA流派的代表公司如Xilinx主推的Zynq平台,而ASIC流派的代表公司有Movidius。两大流派各有长短,下面让我来细细分说。
首先讲讲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为主。
说到这里,不少读者可能有疑问:现在深度学习的网络结构日新月异,但是ASIC上市速度那么慢而且一旦制作完成(流片)就无法更改,如何能跟上深度学习的发展速度呢?针对这个问题,我想首先需要厘清一个概念,即用于深度学习加速的ASIC到底要做什么?有人认为神经网络ASIC就是真的实现一个神经网络结构在芯片上,因此网络结构一改(例如从12层变成15层,或者权重参数变一下)该ASIC就不能用了。其实这样的理解是不对的:ASIC加速器做的是帮助CPU快速完成深度学习中的运算(例如卷积),当CPU在执行人工智能算法时只要遇到这种运算就交给加速器去做。因此只要神经网络的主要运算不变,则ASIC加速器完全可以使用。网络结构会影响ASIC加速器的性能,一种ASIC加速器可能是针对GoogleNet优化过的所以执行GoogleNet会特别快;当你换到VGG Net的时候这款ASIC还是可以用的,只是执行效率相比执行GoogleNet时要打个折扣,不过无论如何都要比CPU快得多。
至于ASIC上市时间慢的问题,目前也是有办法可以解决的,就是使用SoC+IP的方法。既然设计ASIC一家公司做太花时间,那能不能外包甚至众筹呢?完全可以!许多SoC芯片就是这样做出来的。这里首先要向大家介绍SoC的概念。SoC全称是“片上系统(System-on-chip)”,亦即集成了许多不同模块的芯片。就拿多媒体应用的芯片举例,早些年每一个多媒体应用的模块(音频编解码,MPEG播放编解码,3D加速等等)自己都是一块ASIC。后来电子业界发现每个模块都做ASIC成本太高,而且最后电子产品的体积也很难做小,不如把所有的模块都集成到同一块芯片上。这块芯片集成了多个模块,并由一个中央控制单元通过总线控制每个模块的运作,就是SoC。例如,现在高通公司的Snapdragon就是一块典型的SoC,上面集成了GPU,视频/音频编解码,相机图像信号处理单元(ISP),GPS以及有线/无线连接单元等等。SoC上面的每一个模块都可以称为IP,这些IP既可以是自己公司设计的(如Snapdragon上面的调制解调器就是高通自己设计的),也可以是购买其他公司的设计并整合到自己的芯片上,例如苹果A系列处理器里用的GPU就使用了Imagination的PowerVR IP。SoC+IP提供了一种灵活而快速的模式,可以想象如果苹果不是购买IP而是自己组建团队慢慢做GPU,其A系列处理器芯片上市的时间至少要被延迟一年。
高通的Snapdragon SoC,芯片上集成了众多IP
对于深度学习加速器而言,做成IP也是一个加速上市速度的模式。当深度加速器成为IP时,它就不再自己做成ASIC,而是成为SoC的一部分,当SoC需要做深度学习相关运算时就交给加速器去做。而且做成IP对于加速器来说能够更灵活地满足客户的需求。例如,某加速器IP设计可以实现100GFlops的运算速度并消耗功耗150 mW,这时A客户说我们需要算得快一点的加速器(150 Gflops),而且不在乎功耗(300 mW也可以)和芯片面积,那么IP公司可以根据客户的需求快速微调自己的设计并在一两个月内交付(由于并不需要真正生产芯片,只需要交付设计)。但是如果加速器已经做成ASIC,那要改动设计就必须重新做一块芯片,这个过程牵扯到耗时巨大的物理设计和验证,改动完的芯片上市时间可能是一年之后了。在SoC+IP的模式下,IP公司可以专注于加速器的前端设计并且根据客户的需求量体裁衣,大公司则做自己擅长的后端以及芯片/封装级验证,可以说是大公司和小公司都可以扬长避短,各取所需,最终实现快速加速器设计迭代(如半年甚至一个季度一次)并跟上深度学习发展的步伐。从性能角度来说,深度学习加速器如果做成IP则和同一芯片上的CPU进行数据通讯时可以使用高带宽的片上互联,但是如果做成ASIC则必须走带宽比较低功耗也比较大的芯片外互联,因此深度学习加速器作为IP成为SoC的一部分对于系统的整体性能也有所提升。
目前,做深度学习加速器IP的老牌公司有Ceva,Cadence等等。这些公司的设计大多是基于已有的DSP架构,设计比较保守。当然,也有一些初创公司看到了深度学习加速器IP这块市场并试图用全新的加速器架构设计来满足应用的需求,如Kneron。对于做IP的初创公司我个人持乐观态度,因为首先深度学习相关加速器IP确实有市场需求,例如微软在用于AR设备HoloLens的处理器HPU中,主要运算单元都是使用买来的加速器IP。其次,做IP并不和大的芯片公司(如NVidia, Intel)构成竞争关系,所以压力比较小。最后,由于做IP需要的资源较少,产品上市时间较快,因此维持运营对资本的压力比较小,风险也比直接做芯片要小,可以说是一个比较稳妥的方案。
深度加速器IP市场既有沿用传统架构的老牌厂商(Ceva, Cadence)也有使用创新架构的初创公司(Kneron)
FPGA和ASIC在实现深度学习加速器方面各有所长,FPGA的可配置性更适合企业、军工等应用,而ASIC的高性能和低成本则适合消费电子领域(包括移动终端)。为了实现快速迭代,ASIC可以采用SoC+IP的模式,而这种模式也使得没有资源量产芯片的中小公司可以专注于深度学习加速器IP的架构和前端设计,并在人工智能市场上占有一席之地。