首页 > 代码库 > 解读神秘而又强大的百度人工智能计算机

解读神秘而又强大的百度人工智能计算机

  2014年8月,在硅谷Cupertino Flint Center召开的26届Hotchips 会议上,百度宣读了其发表的论文(据不完全统计,这应该也是国内第四篇Hotchips文章,前3篇均为龙芯团队所发)。一年之后,一个叫“仙童”的项目,获得了奖金为一百万美金的百度最高奖。

  这两个看起来无关的事件,背后都是一个工作,就是百度自主研究的人工智能计算机。虽然百度从事人工智能计算机的研究和探索已经长度4年,本文是第一次系统阐述这背后的故事和历程。

  百度人工智能应用百度是国内应用深度学习的先锋,早在2012年初,百度就在语音识别上规模应用深度学习算法并取得了非常好的效果。在2012年底,百度CEO 李彦宏宣布成立公司的第一个研究院——百度深度学习研究院。当时,世界上也就Google、微软等少数几个公司公开宣布在深度学习、人工智能领域进行战略投入。

  这4年下来,深度学习技术已经渗透到百度各个产品,如网页搜索、广告点击率预估模型、百度杀毒等。深度学习技术极大地提高了百度产品的用户体验。如百度的语音识别,经过这4年的不断磨练,其识别准确率也从当初80%左右提高到了今天的96%。

  除了率先在各个产品线引入前沿的深度学习算法,百度在人工智能应用方面还有更长远的布局:

  l 百度建立了百度研究院,下设硅谷人工智能实验室、北京深度学习实验室、北京大数据实验室等三大前沿实验室。

  l 2014年,人工智能领域最权威的学者之一——吴恩达加入百度。

  l 同年,在百度技术开放日上,百度发布大数据引擎,对外开放大数据及人工智能能力。

  l 在之后的百度技术节上,百度高级副总裁王劲勾画了“万物智能”的愿景,并展现了百度为迎接万物智能时代所做的技术布局。

  l 2015年百度世界大会上推出的“度秘”,就是万物皆智能的一个很好的体现。它将成为人们生活中的智能秘书。度秘可以通过语音对话或者图像很自然地和人进行交互,甚至都不需要交互,而是根据历史信息、传感器信息、周围环境变化来判断一个人的需求。如果你饿了可以帮你订餐,在你生病后可以告诉你吃什么药,如果明天下雨会提醒你带上伞,你需要出行会时会帮你订好酒店、机票等等——这些看起来很平常的“秘书”服务,如果真要达到非常可用的状态,其实背后就需要非常先进的人工智能技术做支撑。

  人工智能对计算机系统及体系结构的挑战人工智能的应用,包括云(数据中心)和端(智能设备)两部分。云端除了训练(离线训练),还有在线的服务。训练是指利用训练数据,选择合适的训练方法,训练出一个模型。在线服务是指利用训练出来的模型来响应在线响应用户的请求。端部分也是人工智能的一个强需求,按照“万物智能”的愿景,很多终端设备,也都能运行人工智能的算法,能智能地响应外部请求,如智能辅助驾驶、无人车、智能摄像头、工业IOT等等。

  深度学习的离线训练,是工业界和学术界研究最多、关注最多的领域。自深度学习热潮席卷而来,无论是学术界还是工业界,涌现了很多新的、面向深度学习算法和应用设计的系统,如Google提出来的parameter server,其他人也借鉴了parameter server的思想,根据不同的应用场景,设计了不同的各种系统。

  在体系结构方面,深度学习训练多是基于GPU及infiniband高速互联网络。使用GPU来做大规模的矩阵计算,然后使用infiniband高速网络进行分布式参数更新。这种架构在工业界里面非常普遍,很多专有的服务器里带有8个GPU,服务器之间通过infiniband互联。很多论文都在研究怎么利用服务器内8个GPU的局部性、利用infiniband的RDMA、利用GPU的计算能力来完成完整的分布式深度学习训练任务。

  GPU加infiniband的硬件架构,目前比较适合深度学习的训练,也比较适合工业界的规模应用,毕竟这两种硬件性能都不错,且供应商众多,比较很容易获得产品及技术支持。所以一开始,这种架构就得到了工业界和学术界的青睐。

  在线服务方面,无论是工业界还是学术界,公开的信息都比较少。因为有机会大规模部署人工智能服务的,只有像百度这样技术驱动的大型互联网公司,而这些公司,一般处于保密考虑,会延后发布自己的核心技术。

  至于人工智能的终端设备,虽然媒体一直在勾画这个领域的宏伟蓝图,但实际上的成功规模应用并不多,所以工业界和学术界对这部分内容公开得也比较少。

  其实,无论是离线训练、在线服务还是智能设备,里面运行的都是一些常用的深度学习算法,如DNN/RNN(LSTM)/CNN,这些算法的具体实现这里不具体论述。这些算法都有一些共性,如都是计算和访存密集型,主要的计算算子是矩阵操作、卷积、激活函数等。如果是离线训练,考虑到分布式实现,对节点间的通信带宽和延时要求也很高。

  从大规模部署应用的角度看,无论是哪种类型的应用,对体系结构最终的衡量标准是performance/dollar及performance/Watt,也就是效率,包括能耗效率和成本效率。只有这两个效率足够高,这种体系结构才有生命力。例如在嵌入式终端里面,往往需要考虑极致的能耗和成本效率,有时候甚至需要对算法做些剪枝和模型规模限制。在数据中心里面,成本和功耗也是规模部署要考虑的第一要素。

  如今,人们提到深度学习的硬件架构,会首先想到GPU。这主要是因为,在能方便采购到的硬件里,GPU确实能提供较好的数学计算能力和访存带宽。但对于能耗和成本效率,即使在数据中心应用,GPU离我们的目标仍有很大的改进空间。所以我们需要重新思考,面向人工智能的典型应用和算法,设计一种新的、通用的体系结构,这种体系结构能实现极致的能耗和成本效率,还能灵活延伸扩展,很容易支持离线训练、在线服务和智能终端三种场景。

  大胆探索,问题导向人们在面对热门研究领域的时候,都比较容易自然而然地“仰望星空”,觉得只要参与其中就一定能有大收获。但如果只是急功近利,缺少冷静的思考,就很难取得突破性的成果及持续性的产出。这就像早期用几个GPU随便搭个小集群,做一些模型训练,也能发一些不错的paper,能很快看到产出,外界也会给一些不错的评价。但实际上,这些工作并没有本质的突破,也没办法带来持续的影响力,因为这并没有解决人工智能体系结构最关键的成本和功耗效率问题,也没有给整个学术界和产业界带来新的观点和思路。

  大家也可以看得到,最近这几年类似的工作非常多,也都大同小异,产业界的竞争也趋于红海。短平快的工作,再加上喧闹的市场氛围,是比较容易出一些所谓的“成果”,如果当初我们只是沉迷于此,就不会有突破性的新技术产生。

  在面对人工智能这种火热的研究领域,在加上喧闹的市场环境,我个人还是非常认同李国杰院士在10月刊的CCCF上的观点:“大胆探索,问题导向”,也就是说既要仰望星空,也要脚踏实地。只有抓住了最核心的问题,然后大胆发挥想象力,朝着一个远景目标一点一点的迭代和探索,在实践过程中以问题为导向,聚焦目标,才能最终做出经得起考验的东西。

  百度的探索及实践在人工智能体系结构这条路上,并不是只有百度一家在努力。大家能看到,计算所的陈云霁老师及其团队做出了非常好的成绩,发表了很多顶级论文,也给这个领域的同行带来了不少新的思路。

  百度在这个领域,起步也非常的早,在2012年就开始这方面的研究。虽然那时候百度语音识别已经规模应用了深度学习算法,但其他应用还在起步阶段,深度学习算法也在快速发展迭代中。那时候我们为了提高深度学习算法的计算速度,已经在GPU和CPU上做了很多优化,也发了一些深度学习算法GPU加速的论文,得到了外界的认可。

  经过这些工作,我们更能深刻理解GPU/CPU在深度学习应用里面的成本和能耗效率离目标有较大差距。于是,我们产生了一些大胆的想法——自己设计深度学习专有的体系结构和芯片。

  需求定义

  在当时看来,有很多具体方向可以做:例如离线训练,很多产品线都需要从传统的机器学习模型逐步迁移到深度学习算法,离线训练看起来机会很多;在线服务,很多产品的深度学习模型也逐步上线,所以也有需求;人工智能硬件、无人驾驶等等很多新产品与新技术都炒得热火朝天。

  这些方向要怎么选,是一个很大的难题。在工业界,如果方向选错,很有可能几年的资金和团队投入都会浪费,而且还会错失机会。所以当时我们比较冷静,坚定问题导向。经过深入的思考,发现离线训练GPU可以阶段性地满足要求,智能设备虽然炒的火,但时机仍没成熟。而在线的服务,这个需求是客观存在的,虽然2012年那会能上线的服务还很少,模型也不大,但可以预估模型肯定会越来越大,业务也是越来越多,而且GPU因为功耗、成本等原因,不适合线上大规模部署。在这样一个非常具体的问题驱动下,我们提出先针对这个细分领域定制我们的人工智能计算机。项目取名“仙童”,寓意是希望我们能像50年前的仙童,在人工智能体系结构及硬件芯片这个崭新领域做些开拓性的工作,开辟一块新天地,甚至能做出影响以后几十年的成果。

  系统定义

  深度学习算法的核心算子都比较容易抽象,例如DNN主要算子是矩阵乘法和激活函数,RNN/LSTM是向量乘矩阵和激活函数,CNN是卷积。这三种算法,核心计算都可以抽象成向量的内积及激活函数。为了保证系统的灵活性,该系统设计成SOC形式,设计专有的硬件加速器来加速深度学习算法。在数据中心, SOC里面的处理器很自然就是X86的CPU,深度学习协处理器通过PCIE总线和CPU互联。协处理的控制调度,都是由X86 CPU完成。这种架构以后如果要延伸到嵌入式智能设备领域,只需要把处理器换成ARM即可,加速器部分仍可以保持不变。

  架构设计

  向量的内积硬件比较好实现,只要堆足够多的ALU,性能就能线性提高,而且这个功能的流水线也很规则,很容易实现。但向量内积的瓶颈一般都在访问内存,所以主要挑战在于怎么利用cache/片内buffer的局部性,提高访存效率。这里需要跟进ALU的数量、运行频率、DDR的带宽来精细计算所需要的片内buffer的大小,及片内buffer的访问模式,以充分利用数据的局部性。加速器的硬件的架构如下, 该架构有两级的memory hierarchy,芯片外的DDR3和芯片内部的SRAM buffer,高效的访存控制是该系统的关键。

解读神秘而又强大的百度人工智能计算机