在人工智能体系结构这条道路上,并不是只有百度一家在努力。中科院计算所研究员陈云霁及其团队也做出了非常好的成绩,发表了很多顶级会议论文,给同行带来了新的思路。百度是在2012年开始这一领域研究的。那时,深度学习算法正处于快速迭代发展时期,虽然已在百度语音识别应用中具有了一定规模,但在其他应用上还处于起步阶段。期间,为了提高深度学习算法的计算速度,百度对图形处理单元和CPU做了很多优化工作,也发表了一些深度学习算法图形处理器加速的论文,并得到了外界的认可。通过这些工作,百度深刻意识到GPU/CPU在深度学习应用中的成本和能耗效率离目标还有较大差距。于是,百度产生了一些大胆的想法:自己设计深度学习专有的体系结构和芯片。
1. 需求定义
当时,有很多具体方向可以做。例如离线训练,很多产品线都需要从传统的机器学习模型逐步迁移到深度学习算法,看起来机会很多;在线服务,很多产品的深度学习模型逐步上线,所以需求也不少;人工智能硬件、无人驾驶等,这些新产品与新技术都被炒得热火朝天。对于这些方向,要如何进行选择,是百度面临的一大难题。在工业界,如果方向选错,很有可能会浪费几年的资金和团队投入,而且还会错失良机当时,百度比较冷静,坚持问题导向的路线,经过深入分析,发现离线训练图形处理单元可以阶段性地满足要求;智能设备虽然炒得火,但时机尚未成熟;在线服务的需求则是客观存在。虽然2012年上线的服务还很少,模型规模也不大,但百度预估其模型肯定会越来越大,业务也会越来越多,而且图形处理器因为功耗、成本等问题,不适合线上大规模部署。正是在这样一个十分具体的问题驱动下,提出了针对这个细分领域来定制百度的人工智能计算机。这个项目取名为“仙童”,寓意是希望百度能像50年前的仙童公司那样,在人工智能体系结构及硬件芯片这个崭新领域做些开拓性的工作,开辟一片新天地,甚至做出影响以后几十年的成果。
2. 系统定义
深度学习算法的核心算子都比较容易被抽象,例如深层神经网络的主要算子是矩阵乘法和激活函数,递归神经网络/长短时神经网络的算子是向量乘矩阵和激活函数,卷积神经网络的算子是卷积。这三种算法的核心计算都可以抽象成向量的内积及激活函数。为了保证系统的灵活性,百度的系统采用了片上系统(System on a Chip,SoC)形式,并通过设计专用的硬件加速器来加速深度学习算法。在数据中心,片上系统中的处理器是x86的,深度学习协处理器通过PC-E总线和CPU互连。协处理器的控制调度由x86的CPU完成。如果以后要将这种架构扩展到嵌入式智能设备领域,则只需要把处理器换成ARM芯片即可,加速器部分可保持不变。
3. 架构设计
向量的内积硬件比较容易实现,只要有足够多的算术逻辑单元(Arithmetic Logic Unit,ALU),其性能就可线性提高,而且这个功能的流水线也容易实现。由于向量内积的瓶颈一般都出现在访问内存上,因此面临的主要挑战是如何利用缓存/片内缓冲区的局部性,提高访存效率。这需要根据算术逻辑单元的数量、运行频率和DDR(Double Data Rate,双倍数据速率)存储器的带宽,精确提供所需要的片内缓冲区的大小及访问模式,以便充分利用数据的局部性。加速器的硬件架构包括两级的存储器层次结构(memory hierarchy)、芯片外的DDR3和芯片内部的SRAM(Static Random Access Memory,静态随机存取存储器)缓冲区,高效的访存控制是该系统的关键。
向量算术逻辑单元部分的微架构主要由乘法器、加法树、累加器以及激活函数计算单元等几级流水线组成。为了保证硬件的可扩展性,算术逻辑单元做成阵列模式,每个数组实现长度为64的两个向量内积,按照不同的场景需求,堆放不同数量的数组。例如在数据中心的应用场景中,为了追求最大的性能,可以在一定的成本和功耗预算前提下,堆放尽可能多的数组;而在嵌入式领域,由于功耗和成本严格受限,可以堆放少一些的数组。
激活函数也是一个挑战。常用的激活函数比较多,大概有十几个,如果都用硬件实现,会浪费硬件资源。所以百度提出使用查表的方式实现激活函数:对于不同的激活函数,只需要配置不同的表由于这张表可以被CPU访问,所以可通过CPU来实时更新,从而实现不同的激活函数。
4. 硬件实现
要想达到最优的能耗效率,将流片做成专用集成电路(Application Specific Integrated Circuit,ASIC)是最好的选择。但是,由于流片需要大量的资金以及较长的时间周期和工程周期,而且深度学习算法也在快速选代发展,因此很难给出一个成熟的硬件方案。为此,百度采用了现场可编程门阵列(Field Programmable Gate Array,FPGA)实现。当时选择了最新的28nmFPGA,利用大量的数字信号处理(Digital Signal Processor,DSP)单元实现算术逻辑单元,利用双极随机存取存储器(Bipolar Random Access Memory,BRAM)单元实现片内的缓冲区。当然,实际的工程实现远比预估的要困难。为了追求极致的能耗效率,仅印制电路板(Printed Circuit Board,PCB)就迭代更新了几个大版本,FPGA在逻辑实现上迭代的版本更多。整个过程历时一年多,最终的版本比最初版本的功耗下降了约50%。
5. 上线部署
从2014年起,百度自主设计的人工智能芯片开始逐步在百度的产品中上线,其中“第一个吃螃蟹”的是百度的语音识别。经过这几年的发展,百度的语音识别使用的深度学习模型规模越来越庞大,对计算性能的需求也与日俱增。在此背景下,语音在线服务全部采用了百度自主设计的人工智能芯片,其计算性能相对CPU服务器提高了3~4倍。这一代芯片的性能和同时代的K20图形处理器相当,而功耗则只有K20 GPU的1/8,在能耗效率或者成本效率方面提升了一个数量级,达到了设计之初的目标。
领取专属 10元无门槛券
私享最新 技术干货