阿里达摩院:含光NPU的算法与架构
阿里巴巴达摩院高级研究员金榕以及含光800设计者、平头哥研究员焦阳在2019杭州云栖大会上,深入介绍了含光NPU的算法与架构。以下是金榕及焦阳的分享内容文字整理,经编辑。
金榕:首先,深度学习在所有领域都发生了质的变化,一个很明显的例子是语音识别从最初的需要依赖用户语音到今天基本上随便做一个语音输入都可以很成功,视觉是另外一个非常好的例子,今天深度学习可以从过去只能几百类或者上千类的识别到轻松几百万类甚至几千万类的识别,并且有很高的精度。
同时,今天看见在市面上有很多视觉识别公司,利用了深度学习技术,把视觉技术真正地应用在各种产品上,比如人脸识别就是非常成功的例子,非常值得一提的就是阿里城市大脑,利用视觉技术自动监控交通和安全的行为,使得视觉分析不再依靠原先的特殊设备,从而能够广泛地应用在城市的各个角落上。
自然语言和翻译严格意义上是深度学习较晚进入的领域,但是今天深度学习对这两个领域产生了质的变化。如果大家有幸用过以前的谷歌翻译和今天的谷歌翻译,可以看到非常本质的区别,其中最主要的原因就是由深度学习带来的。
简单的科普,要想把深度学习技术实用化,至少需要考虑三件重要的事情:首先要定义要学习的函数,这就是今天神经网络做的事情;第二是需要很多数据,也就是大数据;第三就是优化的问题,需要在定义的函数空间,利用数据找到一个最合适的解,从而最佳适配数据。
今天,深度学习真正实用要至少克服两大挑战(从计算的角度):第一是如何让复杂的模型更高效率和高效能运行;第二是模型需要吞吐大量数据,如何在大量数据量呑吐的情况下还能保持很好的实时性。例如,就深度语言模型而言,今天非常流行的BERT language model,几乎成为所有自然语言处理核心的模型,而今天实际上用的Bert模型还是平均的Bert模型,但它至少有几亿的参数,如果采用大型Bert的话,至少参数要翻一个数量级。
另外一个跟自然语言处理有关的就是机器翻译。今天机器翻译一般都是用Deep Transformer的结构,这是一个非常深的至少60多层的结构,它为了更好捕捉上下文信息,需要所谓的Multi-head Attention机制,这些都让模型极其复杂,使得运行模型的计算成本非常高。
而在语音识别中,最近几年一个大趋势叫做End2End语音识别模型,与过去的区别是什么呢?早期的语音识别模型都是先识别发音,形成声音模型(Acoustic Model),然后再把发音转变成句子(Language Model),但今天由于计算能力的大幅度增强而只需要一个流程即可,从语音输入直接到整个句子输出形成End2End模型。一般来讲,一个End2End的模型至少是几十个G大小。
说完了模型的大小,再提一下数据的问题。今天阿里有很多场景都需要用AI技术来支撑整个业务,而今天的数据量也是过去无法比拟的。以翻译为例,翻译在今天阿里很多跨界业务中都起着核心作用,包括阿里很多海外业务都需要翻译,就是把中国的商品翻译成相应国家的语言。每天大概需要翻译一亿+的商品,通常需要21种语言的翻译,每天翻译的调用量在10亿的级别,是非常大的使用量。
诸位也许有机会用到拍立淘,这是一个非常简单的产品,对任何有兴趣的物体拍一张照片,系统会自动识别这个商品并链接到商品页面,拍立淘大概每天有2000多万的用户、每天上传图片至少是4亿到5亿,需要一个极大的计算引擎去处理这么大量的图片,而且这还是在线的用量,离线处理量更大、约在百亿级别的水平。
另外一个值得一提的数据就是遥感影像数据,例如进行某地遥感数据分析,包括路网信息、建筑信息、地貌信息等等,浙江一个省可能就需要2个GPU、8天的时间才能把所有需要处理和识别的任务处理好,即使是一个小园区也需要好几分钟才能把其中的建筑、地貌以及地图识别出来。所以,可以想象如果扩展到整个地图,将是一个海量工程。
今天作为阿里的AI核心团队,面对这样的计算挑战,面对大数据的问题,我们做了不少工作,包括大量的推理加速工作,一个主要努力是模型压缩,例如对Fully Connected Network(FCN)可以试着去掉一些连接等,从而减少计算量,提高计算的吞吐能力。
我们还在做所谓的低功耗图像识别,这时候需要设计design神经网络架构的搜索方式,找到更合适的神经网络架构,从而更好的完成低功耗识别。所有这些都有一个问题,那就是所有的改变都发生在软件层和算法层,而如果没有底层硬件层的支持,这些改变也不会发挥最大效果,一个最突出的例子就是Sparse Connectivity,大家可以看到如果把神经网络算法从全连接Full Connected变成稀疏连接Sparse Connectivity的话,从理论上应该可以得到很大的加速,但是如果没有底层硬件的支持,这样一个加速将会受限。
由于这些原因,我们跟焦阳的团队合作,希望能够把上面最好的神经网络算法结构与底层最好的硬件支持结合起来,从而交付一个最强大的计算引擎。所以下面请焦阳介绍含光800芯片。
焦阳:我们团队在设计这款NPU的时候,能够在比较短的时间有比较大的进步,实际上在很大程度上是与阿里巴巴达摩院算法团队合作(金榕、华先胜、王刚等),团队在人工智能领域有多年的积累,如果没有这种积累就很难想象NPU会在很短的时间迅速找到方向,包括到底要怎样的设计、要解决什么样的问题、要设计什么样的架构才能突破传统的CPU和GPU优势,以及怎么样通过软硬件一体化的方法找到一条新的道路。
我刚加入阿里的时候,实际上一段时间比较苦恼,就是做什么样芯片以及怎么做的问题,在达摩院算法团队的帮助下,比较快地渡过学习曲线。
算法角度不仅是一种对人工智能算法的理论研究,也做了很多实践上的探索。入手的时候,要对神经网络本身以及业务算法有很深入的了解,这种了解如果没有阿里达摩院团队在之前的时间积累是不可能达到的。
当初在做这款NPU的时候几个重要的思考点:一是为什么要做一个云上的大芯片,云上大芯片的考虑是什么呢?阿里巴巴云计算是快速增长的业务,在国内是属于非常领先的位置,云计算是我们的强项。所以,通过硬件设计如果能帮助云快速地拓展业务、降低计算成本、提供海量计算能力,实际上是非常核心的一步。尤其在今天云计算业务的前提下,需要硬核往下走,否则很难在算力提升和成本下降方面有很大的突破,这是当时考虑的一个点。
大芯片考虑是这样的,我们希望在一个很高算力的水平上做一款NPU,而不是做一款中端或者低端的芯片,这个考虑是什么呢?最重要的目的是阿里巴巴的芯片不是短期的商业化或者销售片,更多是要赋能将来真正实现技术突破,把云计算的成本降下来。
而与算法团队的合作,让我们也意识到真正能把算法和软硬件一体进行设计,必须要解决算法中的一些痛点,这些痛点是什么呢?包括刚才金榕老师提到的像Bert这种大模型,在算力和存储等各方面的要求非常高,传统的计算平台很难满足这样的需求,所以必须要通过一个较大算力的芯片,才能真正能帮助业务往前走。
商业模式是非常重要的一个思考,我们不是单纯做技术,更多是商业模式的考虑。商业模式就是怎样通过技术带给业务一种新的能力,这个能力是什么呢?就是能够实现新的功能或别人没有做的功能或者以前因为硬件限制等种种原因没有做的功能,要通过芯片技术帮助到业务,这是我们的想法。
另外再就是第一颗芯片为什么要做一个推理(inference)芯片,而不是训练(training)芯片,我们当时跟算法团队一起讨论下来的结论是说无论从阿里巴巴还有整个业界来看,一个很强的趋势是当training到一定程度时,真正下一步实际上更多的是inference,尤其在云上的inference,我们认为是非常重要的一个开发领域。
第一款NPU的主要目标业务,像城市大脑这种业务,包括视觉、视频分析等,这些业务有一个重要的特点是在提供算力后能大幅提高计算效力,让业务量达到一个突破,从而给云计算增加更多的流量,无论是用户流量还是计算量的增长,这才是真正解决通过硬件设计来帮助业务发展的目标。
第三,我们当初考虑到底做什么样的加速,阿里巴巴与其它互联网公司不一样的地方,像传统的互联网公司都会做搜索、广告等业务,是比较传统的互联网模式,而阿里巴巴除了有搜索和广告业务之外还有更多丰富的其它视觉类的业务,比如淘宝图片搜索、智能城市、智能工厂等应用,是更多CNN类应用、视觉类的应用场景。
这些算法牵扯到CNN算法以及DNN加速,我们通过业务上的了解之后,决定了CNN的加速可能对NPU是一个重点方向,同时要保证比较好的通用性,能把芯片扩展到将来新模型的适配。
那么,这款芯片结合业务上的思索,主要的特点是什么呢?
针对CNN类的,我们加速所有的卷积类,包括各种各样的卷积、反卷积、孔洞卷积、3D卷积等,还包括插值和ROI等;这些无论在分类网络、分割网络还是检测网络,都是常用的算子,我们对这些算子做了特殊的优化。
同时我们观察CNN网络,从ResNet逐渐发展到一个更复杂的网络结构,包括后来出现的Mask-RCNN和DeepLab这样的分割网络,从整个网络架构做深入分析,提炼出来架构上的特定优化策略。
我们的架构里还提到了重要的一点就是低延时和高能效,这个通过什么实现的呢?通过数据结构进行了特定分析,让数据在存储和访问的时候有非常高的效率,减少对内存I/O的需求。这块尤其对CNN类的卷积操作进行了很深入的优化,对数据进行复用,存取后进行指令算子融合,这样保证在单位内存访问下可以大幅提升计算密度,这是主要的创新。
第二,结合与算法团队合作的模型压缩和量化处理,这部分基本上用一种比较创新的办法,就是对整个全神经网络做了量化处理,对神经网络中间的**函数等计算,在保持比较高精度的基础上,在存储上把精度降下来,这样可以减少内存带宽,这些都是我们在架构上的尝试。
第三,在通用可编程上做了尝试。当初设计架构的时候有一些新的网络算法还没有出现,包括后期看到的Mask-RCNN、DeepLab等,还是后来搜索用到的新型网络;我们在设计阶段经过算法上的尝试,保证了整个架构有一定的扩展性。
在高精度部分,混合精度也是一个主要的特色,混合精度8比特量化加速,主要处理CNN类的网络,对其它的非CNN神经网络需要比较高精度,我们增加了INT16的量化加速,同时有一个比较高精度的浮点向量处理器,包括**函数、向量处理等都是用比较高的浮点运算支持的,这样保证架构在设计完成之后,对非CNN网络的适配,精度都可以达到需求。
含光NPU的板卡散热设计,将来在阿里云的部署上会采用被动散热的板卡,这样可以减少板卡的体积,进一步降低成本。在服务器里面,展区有插着8卡NPU的服务器已经跑起来了。含光NPU的整个版图,可以看到是4个核的设计,整个面积接近170亿晶体管,是TSMC12纳米的工艺,采用PCle 4.0。
我们通过比较有效的片上压缩处理和流水线的处理,目前在PCle 3.0已经达到今天78000的ResNet成绩,说明带宽还没有用完,还有一倍的带宽可以用,目前已经用PCle 3跑到了峰值性能了。
大家看到含光800是4核设计,中间有命令处理器和高速互联的4核之间的网络,4核完全是同样的设计,这样设计的好处是可以在设计之后,由于良率提升的需求,可以任意四个核心有一个或者多个核心出现坏损的情况下,还不会影响整个芯片的工作,这也是我们在架构设计时特别处理的。
每个核的设计有什么呢?包括有本地内存local memory,非常接近Tensor计算核,也就是计算尽量位于存储边上,每次读出来的data可以被高度复用,再做融合算子的计算,这就是为什么含光NPU可以把功耗降到比较低的重要原因。
Tensor Array是非常有效的,我们是INT8和INT16实现的,所以它的功耗非常低,而且设计结构与Systolic Array不一样,用FLOP数量非常少,这样对功耗也有很大的帮助。
中间是向量处理器(Vector Engine),向量处理器实际上可以提供多到Floating 24bit的精度,是非常高的精度,中间的sequencer还带有各种各样的Special Function Unit(特殊函数单元),指各种各样的**函数,比如Sigmod、LogEXP等丰富的特殊函数,这实际上有点类似于GPU的特殊函数,所以有一定的扩展性,将来可以支持新的**函数。
这个sequencer讲一下,它是由一个高效的硬件决定,这个实际上在软件Schedule的基础上做了硬件的Scheduling,是一个多方式的机制,可以看到在做Tensor Core Operation的同时还会做Bias Normalization,以及Special Function**函数,这样可以用pipeline的方式并行处理。
看一下Resnet50的分数,强调一下我们有两种模式,一种叫高性能模式,一种叫高能效或者低功耗模式,图中是在高性能模式下跑出来的成绩,在这个模式下跑分数的功耗是276W,实际上比英伟达的还算低了,其它的两个是GPU、后面两个是比较新的AI芯片。
去年我们在设计的时候有一个小的故事,我们设立了多少倍的目标,那个目标就是最左边的那个,所以已经达到去年说的目标了。
我觉得更重要是单位功耗性能。一般来做高性能的芯片,往往能效比较差。这张图告诉我们,实际上架构的有效性非常好,单位功耗下产生的性能还是比其它的几家公司芯片有很大的优势,这个是在高性能模式下跑出的成绩。
我们应用的场景有数据中心,将来也希望覆盖边缘服务器,甚至一些大型端上的应用。我们设计芯片的特点跟其它芯片公司不太一样,我们不能有很多型号一次量产出来,所以只有一次流片的机会,尽量把同样的一块芯片用到多个不同的场景,这是我们当初设计的一个理念。
解释一下,四个核的跑在数据中心里,如果一个核、两个核、三个核的芯片怎么办呢?也可以用,就用到端上、边缘服务器的场景产品,实际上功耗可以降下来,如果没有那么多核或者不需要多核的话,可以并出来那种单核、双核的配置,这样可以实现很低的功耗,75W、50W甚至25W,但是算力还是相当好的,所以还是非常吸引人的。
大家看到276W可以跑到78000,但是通过降电压降频的话,100W多一点还可以跑到53000,这是非常有效的一个模式。所以,建议大部分的应用场景是用高能效的模式。
讲一下各种落地的业务。第一个最重要的就是城市大脑,目前在交通场景有很多交通摄像头,大家看到一个城市或者小区里面有上千甚至上万个摄像头,这样对处理视频的能力和算力要求非常高,含光NPU非常适用这种场景。这里主要的业务算法是什么呢?包括这么几个部分,第一部分先做目标识别,就是目标检测,这部分算法一般是基于SSD和Fast R-CNN、YOLO这些算法,主要是检测图像里的移动物体,比如机动车、非机动车等,从图中找出来。第二部分再做Tracking,Tracking是跟踪物体跑到哪里,运行轨迹是什么样的。目前这部分还是用CPU在做,我们现在与达摩院城市大脑团队合作,把这一部分转成CNN的网络,一旦成功的话就可以把算力充分地用起来,解决CPU的瓶颈。第三部分,找到对象之后做特征提取,这部分一般是用DenseNet或者比较深的ResNet网络,特征提取后去做ReID重新识别和分类,这部分业务算法流程基本上是这样的。
第二个也是重要的落地业务,拍立淘。拍立淘用户上传商品照片,照片经过AI的处理,首先做类目检测,判断出它大概属于哪一类产品,可能是鞋子帽子之类,根据类目推测的结果做主体识别,主体识别类似于刚才讲的目标检测算法,一般都是SSD或者是基于ResNet的算法。这部分做完主体检测之后,抠图产生出搜索目标,搜索目标处理后当做搜索的主体进行特征抽取,特征抽取之后形成特征向量进行检索,与数据库里的海量商品数据做比对,找到最接近的商品,然后把商品返回给用户,大概是这样的流程。这里涉及的算法,主要三步都是用CNN类神经网络实现的,这一部分在业务上完全可以适配了,目前大概有400M(4亿)的参数,现在完全可以在一个NPU板卡上跑起来了,这是拍立淘。
广告推荐和搜索是下一步想去做的业务,这是两个很典型的MLP网络,实际上不是我们主要的优化网络,但这一步可以验证精度各方面是否达到当初的设计要求,这是我们在积极尝试的两个业务。
智能服装设计是做潮流分析,通过海量数据分析出服装的流行趋势,可以做服装设计。这用到的是一种对抗生成式的网络GAN,GAN网络现在用得比较火的是换脸游戏,里面用到的也是相同的算法。我们当初在设计的时候也不知道有这样类型的神经网络,我们最近进行适配的时候发现基本上都没有什么问题,都可以跑起来,而且性能已经达到对应GPU的大概十几倍,我们原来设计的是ResNet这样类型,基本上在GAN网络上也可以达到类似的性能了。
其它几个包括盒马,这些都是智能店的应用,智能医疗也就是大量图片处理、进行医疗的分析,这些都是一些典型的图像处理应用。
最后一个就是弹性裸金属,把NPU放到云上去,通过云售卖NPU技术。
这个是我们的软件栈,目前的应用包括视觉类、自然语言处理、推荐、搜索这样的应用,主流神经网络框架都支持了;离线做编译、优化、量化处理;以及非常高效的驱动程序,对主流框架对接做执行。
总结一下Resnet的成绩,特别想提到一点是Mask R-CNN的demo(非常酷),可以跑4个video stream的Mask R-CNN,可以全速在跑,是非常不容易的,大家都知道其他GPU,要达到这个是很不容易的。
我们现在在落地,希望在今年年底的时候能开始量产,大概给大家介绍一下这个情况。谢谢大家!(文/宁川)