去年,华为推出了业界首款集成NPU的移动芯片Kirin 970。作为新一代的旗舰,这个SoC上面的CPU集成了8个核心,其中 4 个为高性能的 ARM 公版 A73 架构,最高主频 2.4GHz(麒麟 960 是 2.36GHz),4 个为低功耗的 ARM 公版 A53 架构,最高主频 1.8GHz(麒麟 960 是 1.84GHz);GPU则是集成了ARM最新的Mali-G72 架构。
另外,除了传统移动手机SoC必备的通信基带、ISP、DSP、Codec和协处理器外,Kirin 970还首次集成了专门为深度学习而定制的NPU,FP16 性能达到了 1.92 TFLOP。具体来看, NPU 是 CPU 的 25 倍,GPU 的 6.25 倍(25/4),能效比上,NPU 更是达到了 CPU 的 50 倍,GPU 的 6.25 倍(50/8)。这是华为面向现在火热的人工智能市场扔出的一个杀手锏。
以上都是华为的一家之言,下面我们就来探讨一下华为这颗芯片NPU的真正实力。首先,我们先来了解一下NPU的概念。
什么是NPU?
准确来说,当我们谈到人工智能在计算领域的用途的时候,更多强调的是机器学习。
而当我们讨论人工智能在硬件层面的深入研究的时候,谈论的则更多是针对专门的硬件模块所进行的卷积神经网络的优化和执行工作。
在解释卷积神经网络如何工作的时候,我们从上世纪八十年代开始的工作已经远远超出了研究工作,其根本目的是试图模拟人脑神经元的行为。
注意,这里的一个关键词是“模拟”,虽然到目前为止并没有任何神经网络能够从硬件层面模仿人脑的结构。
不过在学术领域,尤其是在神经网络领域已经存在了很多理论。在过去的十年中,已经开发出了一套软件能够在GPU的硬件层面模拟整个过程。
比如说,研究人员通过不断的迭代和发展美国有线电视新闻网的模型,极大的提升了新闻的准确性和效率。
当然,GPU并不是最适合运行人工智能的硬件,也不是唯一一个能够进行高度的并行运算的处理器。
随着人工智能的不断发展,越来越多的公司希望在实际应用当中将人工智能实现商业化,这就要求硬件能够提供更高的性能,更高的效率。
因此,我们也看到了更加专业的处理器的出现,其架构就是针对机器学习等应用。
谷歌是第一家宣布推出此类硬件的公司,该公司在2016年推出了TPU。但是,虽然这类专业的硬件能够在处理人工智能等工作方面在硬件和功率方面获得更高的效率,但是也失去了灵活性。
谷歌TPU芯片和主板
在这类专门的人工智能处理器当中,影响其工作效率的主要有两个方面:要存在一个经过训练的模型,其中主要包括模型在今后的运行中可能涉及到的相关的数据。一般情况下,模型的训练是大密度的,需要经过大批量的训练才能实现更高的精度。也就是说,在实际运行中,有效的神经网络要比实际用到的神经网络要庞大的多。
因此,普遍存在这样一个思路,就是模型的主体训练工作由更加庞大的GPU服务器或者是TPU云服务器来完成。
其次,神经网络的运行需要一个执行模型,通过不断注入新的数据,完成模型的演算来实现整个过程。一般情况下,我们将输入数据,然后通过神经网络模型得到输出结果的模式称之为推理。
不过实际的推理过程与模型当中的训练过程对于计算的要求也存在着很大的不同。
虽然推理和训练都需要用到高密度的并行计算,但是推理能够以较低精度的计算来完成,同时执行模型部分所需要的计算性能也较低,这也就意味着推理过程能够在更加便宜的硬件上来进行。
这一功能反过来引导整个行业走向更加注重边缘设备(用户设备)的方向,因为这些设备能够提供更高的性能效率和需求更低的功耗。
也就是说,如果本地设备当中存在一个已经经过训练的模型,就可以使用该设备来进行推理过程,而不需要将数据上传到云端服务器当中来进行数据的处理。
这一过程将会减轻可能存在的延迟,功耗和带宽等问题,同时也避免了隐私问题,因为输出端数据永远不会离开用户设备。
随着神经网络推理功能在终端设备上运行的不断实现,对于不同处理器能够实现何种功能的研究以及选择工作也在不断深入。
CPU、GPU甚至DSP都能够在终端设备上实现推理功能,但是这些处理器之间存在着巨大的效率差距。通用处理器适合绝大多数的工作,但是他们天生就不是被设计用来进行大规模的并行计算的。GPU和DSP甚至表现的更好,也有巨大的提升空间。
但是,此外,我们也见到了一种新的处理加速器的出现,比如麒麟970里面使用的NPU。
由于这类处理加速器是新近出现的设备,所以到目前为止,业界并没有更出一个统一的命名方式。华为海思命名的是一种方式,而苹果则是以另外一个名字命名。
不过从普世意义上来看,我们能够将这些处理器统一称之为神经网络IP。
为麒麟970 NPU提供IP的是一家名为寒武纪的中国IP供应商,据了解,NPU采用的IP是经过优化之后的产物,而不是直接采用现有IP。同时,华为还要求Cambricon能够与之共同发展改进该IP,因为在实际的应用当中,实际情况与计算情况,有时候还是会存在着一些差距。
但是,我们需要明白的是,我们应当避免对神经网络的理论性能数据过多关注,因为这些数据并不一定与实际性能有关,同时由于对神经网络IP了解有限,最终结果如何也未可知。
当使用CPU以外的其他硬件设备来运行神经网络的时候,第一个障碍就是利用适当的API来访问模块。
传统的SOC和IP供应商已经能够提供专用的API和SDK来进行使用该类硬件的神经网络的应用开发。而海思提供的API不仅仅能够管理CPU,也能够用来管理GPU和NPU。虽然目前海思还没有对外公开该API,但是据了解,海思将会在今年晚些时候与开发商一起进行开发。
其他的厂商,诸如高通也提供了SDK来帮助程序开发人员在GPU和DSP等硬件的基础上进行神经网络的开发工作,当然还有其他一些IP供应商也有提供自己专门的软件开发工具来进行相关的开发。
但是,针对特定供应商的API同样存在着局限性,未来我们需要不同的供应商能够提供统一的API来进行更加快速,便捷的开发工作。
谷歌目前正在开展这项工作,该公司计划在安卓系统8.1当中引入相关的名为NN API的模块。
另外一个需要注意的问题是,目前很多的类似于NN API的只能够支持一部分功能,比如只能够支持NPU的一部分功能,如果开发人员想要在NPU的基础上,充分开发和利用硬件的性能,开发者就需要有专门的API来开发这类硬件。