这几年深度学习的发展给人工智能相关应用的落地带来了很大的促进。随着NLP、CV相关领域的算法的发展,算法层面的创新已经逐渐慢了下来,但是工程方面的研究依然非常火热。从底层的硬件的创新,到平台框架的发展,为支撑超大规模模型训练与移动端小规模算法推断而创造的软硬件体系也在飞速革新。本文将总结深度学习平台框架软件及下层的硬件支撑系统。

注意,人工智能不等同于深度学习,但是深度学习算法的发展极大程度地促进了人工智能的应用,本文有时候未明确区分二者关系,并不是认为二者等同,只是为了方便叙述。

  • 一、深度学习软硬件体系总览
  • 二、AI底层硬件——芯片系统
    • 2.1、CPU的AI能力进展
    • 2.2、GPU
    • 2.3、FPGA
    • 2.4、TPU
    • 2.5、NPU
  • 三、加速库(Kernel Library)
  • 四、深度学习编译器
  • 五、深度学习框架

随着深度学习算法的应用,在不同的地方需要不同的工程落地方式。对于搜索引擎或者智能助手这样大规模的系统,可以使用超大规模的NLP预训练模型。如下图所示是近几年超大NLP模型的参数规模:


在最新的2021年,华为发布的盘古中文预训练模型已经达到了2000亿参数的规模,这么大规模的模型训练需要特殊的软硬件支撑,需要强大的GPU、带宽、训练框架等支撑。现有的深度学习框架包括TensorFlow、PyTorch等是无法直接训练如此规模的模型的。需要解决多机多卡的训练等问题。

再比如移动端的AI能力,如下图是华为展示的去除人像的功能

这样的功能是需要移动端支持深度学习算法的推理的,移动端可使用的软硬件资源则相对而言少很多,那么就需要另一种软硬件体系支撑算法的训练与推理。

因此,在不同场景下,中下层软硬件的发展对AI的落地至关重要。本文的主要目的就是介绍中下层的深度学习软硬件支撑体系。

在本文中,我们将深度学习底层软硬件分成四层,如下图所示。我们逐一介绍。

这里主要关注芯片层面的硬件。其实为了支撑不同的AI应用的落地,很多底层硬件都在不断的发展。例如,在多卡多机的训练场景中,对于网络带宽的要求就很高,而对于超大规模的模型,芯片读取交换参数则需要更大的显存支持。此外,如果训练过程中CPU可以直接读取显存的数据,显然也会更好地加快训练过程。尽管这些硬件的设计和创新对于AI应用也很重要。但是更大更主要的创新还是来自于芯片系统,因此这里主要关注芯片系统。

目前,相较于以前单一的CPU的发展,GPU、FPGA、NPU、TPU等芯片的发展也很快。这里将逐一介绍。

尽管在AI时代,CPU的AI能力不像GPU等那么突出,但是依然是不可或缺的芯片系统。因为你也不可能只用GPU来支撑整个系统。

此外,并不是所有的算法都适合使用GPU,无法并行计算,或者是对于内存需要较大的算法(例如推荐系统中,有较大embedding的算法)等都适合使用CPU去训练。毕竟AI不只是深度学习,还有很多传统的机器学习方法也是非常好用,且适合使用CPU去训练推断的。

那么为了更好地支撑AI业务,CPU的芯片其实也一直在改进。例如因特尔服务器芯片Xeon提供多达40-64的PCIe通道数,配合2个GPU,可以达到更快的速度(大致原理是多个GPU的通道数越高,训练速度越快,但是GPU显存是从CPU内存中读取数据的,因此需要二者配合)。

同时,第三代Xeon的CPU也在一些方面做了改进以更好地支撑AI能力。例如,它是业界第一个内置bfloat16运算的CPU,可以更好地加快AI模型的训练。当然,为了让CPU也能分享AI发展的红利,因特尔和AMD除了硬件改进也在与各大上层框架合作以更好地实现CPU的AI能力。例如,Horovod就支持多CPU的并行训练。

还有一点不要忘了,CPU的价格更便宜,且目前大多数企业的基础设施中都已经包含了大量的CPU,你让他们再去买一套全新的硬件去支撑AI业务,怕是短时间也收不回成本,不太值得。

GPU的AI能力相信不用过多描述。与CPU相比,GPU对矩阵的计算或者说图的运算更加强大,它虽然不能像CPU那样高效地处理复杂的逻辑运算,但是对于并行计算的支撑却非常强大。GPU的多核设计可以一次性运算更大的图。同时,深度学习算法的底层算子也大多数是这样简单的批次处理,因此GPU因为深度学习的发展是地位水涨船高。

FPGA(Field Programmable Gate Array)全称现场可编程逻辑门阵列,是一种半定制的集成电路芯片,系统设计师可以根据需要,通过可编辑的连接,把FPGA内部的逻辑块连接起来。这就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者的需要而改变,所以FPGA可以完成所需要的逻辑功能。

尽管GPU在工作站的环境下训练深度学习等模型是很有效的,但是并不适合所有的情况。首先是它的成本高,并且对散热有较高的要求。对于一些端侧的模型使用来说有很多问题,例如摄像头检测的场景下,端侧设备可能暴露在阳光下,显然,这种情况使用GPU并不合适。此外,正常情况下GPU的寿命是2-5年,在很多应用场景下都太短了(例如自动驾驶中一辆车可能装有7-10个GPU,每隔4年换一次,你可以知道这个成本有多高)。

FPGA可以针对不同的场景做优化,例如可以针对卷积神经网络进行优化,使得它可以消耗更少的电量获取更高的速度,同时寿命也是GPU的2-5倍。

但是FPGA的编程非常困难,这是它难以大规模推广的重要原因之一。但是也有很多公司致力于推动FPGA的普及,降低使用门槛。例如Mipsology公司的Zebra平台。

总的来说,FPGA在端侧系统中有很好的优势。

TPU是谷歌发布的用于加速机器学习的硬件,与TensorFlow配合较好。在5月份已经发布了第四代产品。

今年的MLPerf结果表明,GoogleTPU v4的实力不容小觑,在使用ImageNet数据集的图像分类训练测试(准确度至少75.90%),256 个TPU v4在1.82分钟内完成了这一任务,这几乎与768个Nvidia A100图形卡、192个AMD Epyc 7742内核(1.06分钟)、512个华为AI优化的Ascend910芯片以及128个Intel Xeon Platinum 8168内核(1.56分钟)组合在一起的速度一样快。

谷歌的TPU是一种专用的芯片,与TensoFlow配合较好,可以提供很快的推理速度。与GPU不同的是,它不是一个通用的处理芯片,因此对于光栅之类的问题无法处理。它起初定位于内部使用。随着TPU版本的更新,能力越来越强,已经在Google Cloud上开放使用了。

NPU是华为发布的用于移动端推理的AI芯片。华为的芯片设计能力是国内第一,如果不是因为某些众所周知的原因,在AI发展浪潮中,他们的硬件设施应该是能够占有一席之地的。NPU就是华为芯片设计实力的一种展现。

NPU主要用于移动端算法的推理,因此对于功耗的要求很高。华为麒麟970芯片有8个CPU和12个GPU,有55亿个晶体管,NPU占其中3%不到。因此对于整体的SoC影响很小。在功耗消耗很低的情况下,加速推理速度。

在AI Benchmark测试中,华为系列的芯片的AI能力在移动SoC中一直是处于第一阵营的。其NPU的能力不容小觑。

加速库(Kernel)是与芯片紧密相关的一种底层的库。这一层其实并不是常见的软硬件体系结构中出现,也不是必须的。但是它对于AI运算的速度来说是很重要的。目前的加速库基本上是各家芯片厂商提供的,主要包括:

因特尔的Math Kernel Library(Intel® oneAPI Math Kernel Library)
因特尔提供的用于科学计算的优化库,适用于因特尔系列的CPU,主要功能:

  1. 增强的数学例程使开发人员和数据科学家能够创建高性能的科学、工程或金融应用程序
  2. 核心功能包括BLAS、LAPACK、稀疏求解器、快速傅立叶变换(FFT)、随机数发生器功能(RNG)、汇总统计、数据拟合和矢量数学。
  3. 为当前和未来几代英特尔® CPU、GPU和其他加速器优化应用程序
  4. 对英特尔®数学内核库(英特尔®MKL)的老用户来说是一个无缝升级。

MKL适合频繁的小矩阵的乘法,性能有很好的表现。使用MKL编译的TensorFlow也会有更好的性能。

NVIDIA的cuDNN
cuDNN是NVIDIA公司发布的用于深度神经网络的GPU加速库。cuDNN 可大幅优化标准例程(例如用于前向传播和反向传播的卷积层、池化层、归一化层和激活层)的实施。世界各地的深度学习研究人员和框架开发者都依赖 cuDNN 实现高性能 GPU 加速。借助 cuDNN,研究人员和开发者可以专注于训练神经网络及开发软件应用,而不必花时间进行低层级的 GPU 性能调整。cuDNN 可加速广泛应用的深度学习框架,包括 Caffe2、Chainer、Keras、MATLAB、MxNet、PyTorch 和 TensorFlow。

Facebook的NNPACK
NNPACK是一个用于神经网络计算的加速包。NNPACK旨在为多核CPU提供convnet层的高性能实现。

NNPACK并不打算被机器学习研究人员直接使用;相反,它提供了在领先的深度学习框架中利用的低级性能基元,如PyTorch、Caffe2、MXNet、tiny-dnn、Caffe、Torch和Darknet。

这些加速库相对而言都是比较底层的东西,一般是不能直接被上层开发研究人员直接使用,需要借助相应的框架和工具使用。

在不同的DL硬件上部署各种深度学习(DL)模型的困难,促进了社区内DL编译器的研究和开发。工业界和学术界都提出了一些DL编译器,如Tensorflow XLA和TVM。同样,DL编译器将不同DL框架中描述的DL模型作为输入,然后为不同的DL硬件生成优化代码作为输出。

DL一般与深度学习框架绑定,用于将深度学习框架中的内容转换成底层可执行的部分,用以更好的利用硬件性能。

目前DL的编译器还是比较多的,主要包括如下:

nGraph:nGraph Library是一个开源的C++库和运行时/编译器套件,用于深度学习生态系统。通过nGraph Library,数据科学家可以在任何数量的硬件架构上使用他们喜欢的深度学习框架,进行训练和推理。

Glow:Glow是一个机器学习编译器,可以加速不同硬件平台上的深度学习框架的性能。它使硬件开发商和研究人员的生态系统能够专注于建立下一代硬件加速器,这些加速器可以由PyTorch等深度学习框架支持。

MLIR:MLIR项目是一种建立可重复使用和可扩展的编译器基础设施的新方法(Multi-Level IR Compiler Framework)。MLIR旨在解决软件碎片化问题,改善异构硬件的编译,大幅降低构建特定领域编译器的成本,并帮助将现有编译器连接在一起。

MLIR旨在成为一种混合型IR,可以在一个统一的基础设施中支持多种不同的要求。

TVM:Apache TVM是一个开源的机器学习编译器框架,用于CPU、GPU和机器学习加速器。它的目的是使机器学习工程师能够在任何硬件后端有效地优化和运行计算。

XLA:XLA(加速线性代数)是一种针对特定领域的线性代数编译器,能够加快 TensorFlow 模型的运行速度,而且可能完全不需要更改源代码。

它可以提高运行速度并改进内存用量。例如在 BERT 中,如果 MLPerf 提交内容使用 8 伏打 V100 GPU 和 XLA,则性能可提升约 7 倍,并且批次大小可改进约 5 倍。

这些编译器大多被某种深度学习框架使用,用以加速深度学习模型的训练与推断。

这一次就是我们常见的TensorFlow、Torch、MindSpone了。也是被开发者经常使用的框架。这里有很多文章都有说明,不再细说,只强调一点,这个领域也有很多国产优秀的框架,例如OneFlow、MindSpone之类的。尽管国产的框架生态与国外的相比处于劣势,但是还是希望大家多多支持。毕竟谁也不知道下一个被禁止使用的是什么。

参考文献:
https://bdtechtalks.com/2020/11/09/fpga-vs-gpu-deep-learning/
https://semiengineering.com/using-fpgas-for-ai/

相关文章