这段时间由于工作需要,研究了一下ASPLOS’14的Best Paper,”Dianao: A Small-Footprint High-Throughput Accelerator for Ubiquitous Machine-Learning.” 这是中国大陆的学者首次获得 CCF 推荐的体系结构领域 A 类会议的最佳论文奖。而此前,ASPLOS 最佳论文 奖一直被美国卡耐基梅隆大学、德州大学奥斯丁分校、微软等 8 个欧美著名研究机构所垄断。写两篇博文,纪录一下可以深度学习硬件协处理器的相关内容。本文先介绍从浅层学习到深度学习,以及由此引起的硬件瓶颈问题,以及各种搭建神经网络运算平台的解决方案的劣势。
机器学习,即通过算法,使得机器能从大量历史数据中学习规律,从而对新的样本做智能识别或对未来做预测。从1980年代末期以来,机器学习的发展大致经历了两次浪潮:浅层学习(Shallow Learning)和深度学习(Deep Learning)。
80年代末期,用于人工神经网络的反向传播算法(BP算法)的发明,掀起了基于统计模型的机器学习热潮。人们发现,利用BP算法可以让一个人工神经网络模型从大量训练样本中学习出统计规律,从而对未知事件做预测。这种基于统计的机器学习方法比起过去基于人工规则的系统,在很多方面显示出优越性。这个时候的人工神经网络,虽然也被称作多层感知机(MLP),但实际上是一种只含有一层隐层节点的浅层模型。
90年代,各种各样的浅层机器学习模型相继被提出,比如SVM、Boosting、最大熵方法(Logistic Regression)等。这些模型的结构基本上可以看成带有一层隐层节点(如SVM、Boosting),或没有隐层节点(如LR)。这些模型在无论是理论分析还是应用都获得了巨大的成功。相比较之下,由于理论分析的难度,加上训练方法需要很多经验和技巧,所以这个时期浅层人工神经网络反而相对较为沉寂。
2000年以来互联网的高速发展,对大数据的智能化分析和预测提出了巨大需求,浅层学习模型在互联网应用上获得了巨大成功。最成功的应用包括搜索广告系统(比如Google的AdWords、百度的凤巢系统)的广告点击率CTR预估、网页搜索排序(例如Yahoo!和微软的搜索引擎)、垃圾邮件过滤系统、基于内容的推荐系统等。
2006年,加拿大多伦多大学教授、机器学习领域泰斗——Geoffrey Hinton和他的学生Ruslan Salakhutdinov在顶尖学术刊物《科学》上发表了一篇文章,开启了深度学习在学术界和工业界的浪潮。这篇文章有两个主要的信息:1. 很多隐层的人工神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类;2. 深度神经网络在训练上的难度,可以通过“逐层初始化”(Layer-wise Pre-training)来有效克服,在这篇文章中,逐层初始化是通过无监督学习实现的。
浅层模型有一个重要特点,就是依靠人工经验来抽取样本的特征,而强调模型主要是负责分类或预测。在模型的运用不出差错的前提下,特征的好坏就成为整个系统性能的瓶颈。因此,通常一个开发团队中更多的人力是投入到发掘更好的特征上去的。要发现一个好的特征,就要求开发人员对待解决的问题要有很深入的理解。而达到这个程度,往往需要反复地摸索,甚至是数年磨一剑。因此,人工设计样本特征,不是一个可扩展的途径。
深度学习的实质,是通过构建具有很多隐层的机器学习模型和海量的训练数据,来学习更有用的特征,从而最终提升分类或预测的准确性。所以“深度模型”是手段,“特征学习”是目的。区别于传统的浅层学习,深度学习的不同在于:1. 强调了模型结构的深度,通常有5层、6层,甚至10多层的隐层节点;2. 明确突出了特征学习的重要性,也就是说,同过逐层特征变换,将样本在原空间的特征表示变换到一个新特征空间,使分类或预测更加容易。在大数据情况下,只有比较复杂的模型,或者说表达能力强的模型,才能充分发掘海量数据中蕴藏的丰富信息。
对于互联网公司而言,如何在工程上利用大规模的并行计算平台来实现海量数据训练,是各家公司从事深度学习技术研发首先要解决的问题。目前广泛采用的方法,都是搭建 CPU 集群,搭载大数据平台如Hadoop,或者通过GPU运行并行算法,进行处理。由于数据处理的延迟太高,显然不适合需要频繁迭代的深度学习。现有成熟的深度学习训练技术大都是采用随机梯度法(SGD)方法训练的。这种方法本身不可能在多个计算机之间并行。
即使是采用 GPU 进行传统的DNN 模型进行训练,其训练时间也是非常漫长的,一般训练几千小时的声学模型需要几个月的时间。而随着互联网服务的深入,海量数据训练越来越重要,DNN 这种缓慢的训练速度必然不能满足互联网服务应用的需要。Google搭建的DistBelief,是一个采用普通服务器的深度学习并行计算平台,采用异步算法,由很多计算单元独立地更新同一个参数服务器的模型参数,实现了随机梯度下降算法的并行化,加快了模型训练速度。但 Google 通过1.6万片 CPU 核处理器,10亿个内部节点构成的庞大系统,通过1000万帧图片,对其训练了 10 天,才实现了猫脸识别的无监督学习。
还有的公司,利用FPGA的高可配置性,使用FPGA集群来运行神经网络算法。然而,无论是 CPU, GPU, 还是FPGA, 对于大型深度神经网络来说,都价格太昂贵,而且受限于访存瓶颈,训练代价太大。这些方法,都无法满足深度神经网络发展的需要。
而自上世纪80/90年代,神经网络算法萌芽后,也一直有体系结构研究者,试图针对神经网络算法,研制专用协处理器。但从已有成果来看,或者是进行硬件神经元与软件神经元的一一映射,解决了访存的瓶颈,但这样的架构,满足不了深度神经网络随着网络复杂产生的参数爆炸性增长问题。进行网络在芯片上的全定制,对于浅层网络,还有应用的空间,但对于深度神经网络,不堪重负。
无论 GPU 还是 CPU 集群,都将神经网络从软件层面映射到运算逻辑单元,突触/神经元权值存储于主内存。而深度神经网络,层次多,层与层之间的连接权值较多,逐层运算,需要不断地进行突触/神经元权值的存取与更新。随着神经网络规模的增大,连接权值增多,访存速度成为了制约深度神经网络规模增大的瓶颈。而传统架构从主内存到运算部件的通路设计,中间经过多级Cache,突触与神经元连接权值需要分别从主内存取得,在带来访存速度瓶颈以及延时问题的同时,也会增加更多的功耗。而通用处理器为了满足其通用性,相对神经网络算法来说,会存在太多的冗余单元。这些都不利于使用CPU/GPU来搭建大规模的神经网络运算平台。
在此之前有的神经网络协处理器,针对浅层神经网络定制,同层网络中的软件神经元与硬件神经元多为一一映射的关系,每个神经元用一个逻辑电路表示,突触使用一个锁存器/RAM实现。这样的设计,对于浅层网络,可以带来很大的的加速比。然而,软件神经元无法复用硬件神经元,随着神经元的增长,面积,功耗,延时都会以平方倍的关系增长。这样的协处理器,难以处理深度学习这样的大规模神经网络。下图所示,为软件/硬件神经元一一映射的协处理器结构:
寒武纪1号单核神经网络协处理器, 将神经元/突触权值分布式存储于片上 RAM ,优化数据搬运,解决了访存瓶颈问题;并且通过硬件神经元分时复用,能够满足各种规模的深度神经网络。在台积电 65nm 工艺下,寒武纪 1 号主频可达 0.98GHz、性能 452 GOPS、功耗 0.485W、面积约为 3mm2。也就是说,它可以在通用处理器核 1/10 的面积和功耗开销下,达到通用处理器核 100 倍以上的人工神经网络处理速度。即便和最先进的 GPU 相比, 寒武纪 1 号的人工神经网络处理速度也不落下风,而其面积和功耗远低于 GPU 的 1/100。在下一篇文章中,我将就着论文内容,详细介绍寒武纪1号。
本文参考了 深度学习: 推进人工智能的梦想,在此表示感谢。