深度学习与CPU、GPU和TPU

本文已首发在大连理工大学创新创业中心公众号

简介:

近些年,深度学习已经广泛应用在各行各业,但是对于深度学习的应用底层并没有太多的了解,比如说经常会有人问:CPU,GPU和TPU有什么区别?为什么使用GPU训练比CPU训练会快很多呢?本文就来从这几个硬件的结构来回答这些问题。 ## 神经网路是什么? 这里我们使用单层神经网络和识别手写数字图像来举例,如下图所示:

MNIST数据集的每一个数据是28 x 28灰度像素的网格,可以将其转换为具有784个值的向量(784个像素点的灰度值)。每一条线上对应一个权重值,那么要识别数字“ 8”只需将向量值乘上线上的权重值。求和后得出的值表示图像和形状“ 8”之间的相似性。

假如我们需要识别一个输入究竟属于哪个类,那么我们就需要将输入的数据(左侧的黑色点)乘上每个类的模型(中间红点),相加得出相似度(右侧),最终按照相似度排序,取最高结果即是最可能的答案。
那么总结一下,在神经网络计算中需要在数据和参数之间进行大量的乘法和加法运算,需要区分的类数量越多,神经网路越深越宽那么所需的计算量就越大。

全能的CPU

当前的CPU大都是基于冯·诺依曼(Von Neumann)架构的通用处理器。这种架构的处理器具有极大的灵活性,但与此同时,它在执行每种任务时效率都不是最高的。
为了实现多种多样的任务,CPU需要在每一次计算前从缓存中取出指令和数据,并按照取出的指令选择计算方式进行计算,最后将计算结果存储到缓存中。这种执行方式使CPU可以满足几乎所有任务的计算需求,但与此同时CPU工作的大部分时间都浪费在存取操作中,从而大幅降低了效率。
在神经网络计算中,CPU需要依次计算每条边的权重和,在最后将结果求和,这显然是很慢的一个过程。下图展示了CPU进行神经网络推断的计算过程。

并行的GPU

在介绍GPU之前,我们首先来想一下GPU是用来完成什么任务的?
我们的电脑现在的分辨率大都为1920*1080 60Hz,那么一秒钟GPU需要计算1920*1080*24bit(RGB各1字节)*60Hz = 2.78Gbit数据,这无疑需要巨大的计算。但是显示的计算有一个特点,同一帧的图像像素之间几乎没有计算的先后依赖。于是GPU就使用了一个简单的策略:在一个处理器中包含大量的算术逻辑单元(ALU),例如RTX2080就包含了2944个可编程算术逻辑单元。这些算术单元在接受到调度后进行并行计算,将一个巨大计算分成一个个小计算,大大提高了计算速度并降低了等待时延。
在神经网络计算中也是如此,每条边的相似度、多条输入数据都可以进行并行处理,下图展示了单层神经网络中多个输入并行推断的过程。

由于大量算数逻辑单元的并行工作,GPU在神经网络计算时常常可以比CPU快几个数量级,因此当前大多使用GPU作为神经网络的驱动硬件。
但是,由于GPU的原有用途是进行显示输出,而显示输出中的微小的错误很难引起人们的察觉,因此GPU在检错和纠错方面并没有太多严格的设计,但神经网络在学习使用的随机梯度下降算法对精度的要求较高的。计算产生的错误可能会导致训练精度的损失。与之相对的,也有另一种声音认为随机的错误会提高模型的性能,例如谷歌的Dropout算法就通过随机制造失效边来提高模型性能。
由于GPU仍然是通用处理器,它仅仅是将计算的单元变多,依然没有脱离使用缓存来读取和存储中间结果的计算方式。这意味着GPU依然没有摆脱冯诺依曼瓶颈(von Neumann bottleneck),不能成为神经网络计算的最佳驱动硬件。

专为神经网络射界的TPU

由于当前的神经网络专用处理器并没有统一的标准,因此这里使用谷歌的张量处理器(TPU)进行举例。
在介绍TPU之前,需要先介绍一下谷歌TensorFlow,TensorFlow不是一个严格的“神经网络”库。它的思路是将计算表示为一个数据流图,然后将数据引入,让数据(张量)在计算图中流动和计算并最终获得输出。如下图所示:

在计算图中,每个节点负责单一的计算步骤,各计算图之间互相并行。这也是谷歌TPU的设计思路:将每一个计算专有化,一个计算单元在初始化时加载模型的参数,使其成为一个专有的计算节点,大量的计算节点组成计算网络,单个计算的结果并不会存入内存,而是直接传入到下一个计算单元中,直至最后得出计算结果。如下图所示。

无内存读写的设计避免的大量存取带来的时间浪费和能量消耗,从而使神经网络的计算速度大大提升。

结语

当前国内许多厂商也发布了各种神经网络的专用处理器,如阿里巴巴的“含光”,独角兽企业“寒武纪”等,这些芯片的设计思路也不尽相同。这里使用谷歌的TPU做介绍仅仅是由于其有较为完整的实现资料。有兴趣的同学也可以深入研究这些厂商的产品。

参考

  • Gal, Yarin, and Zoubin Ghahramani. "Dropout as a bayesian approximation: Representing model uncertainty in deep learning." international conference on machine learning. 2016.
  • Schmidhuber, Jürgen. "Deep learning in neural networks: An overview." Neural networks 61 (2015): 85-117.
  • https://cloud.google.com/blog/products/ai-machine-learning/what-makes-tpus-fine-tuned-for-deep-learning
  • https://www.nvidia.cn/geforce/graphics-cards/rtx-2080/
  • https://tensorflow.google.cn/
  • http://www.cambricon.com/
  • https://developer.aliyun.com/article/720435
  • https://tpudemo.com
  • https://zh.wikipedia.org/wiki/%E5%86%AF%C2%B7%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%BB%93%E6%9E%84
  • https://en.wikipedia.org/wiki/Von_Neumann_architecture#Von_Neumann_bottleneck
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2017-2022 Ink East
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信