“在硬件革命开始兴起前,神经网络的研究都只停留在理论阶段”
围绕着深度学习的广泛讨论经常会误导外行人,让他们以为这是一种新发明的技术,当他们知道早在1940-1950年代深度学习就奠定了基础时,会感到十分的震惊。但事实上,深度学习已经有了很长的历史,早在20世纪后半叶,深度学习中最流行的深层神经网络结构和理论就得到了发展。这时,可能有人会问,为什么深度学习的革命会在近几年发生,而不是在之前的几十年里。
简单来说,是因为在那些时期内,不存在有效训练大型神经网络所需的硬件和计算能力。因此所有的理论研究大部分都在纸上进行,没有实践的支持。在当时如果有人正在研究神经网络,那么机器学习研究学会并不会给予他过多的关注和支持。尽管有专门的研究人员继续在神经网络上开展工作,但直到2000年代下半叶硬件革命开始兴起之前,它都是些不切实际的理论研究。
01
深度学习中GPU应用的简史
图1 1999年NVIDIA的第一个GPU——Geoforce 256
NVIDIA于1999年推出了首款商用GPU——GeForce 256,并在2000年代开始将自己定位为GPU技术的领先创新者,以推动图像产业的发展。GPU由于其并行处理能力可以使游戏的图形帧比CPU快得多,从而提供了绝佳的游戏体验,因此开始获得游戏玩家的青睐。NVIDIA在2007年发布了面向软件程序员的框架CUDA(ComputeUnified Device Architecture,计算机统一设备架构),程序员们可以利用CUDA API在NVIDIA的GPU上进行GPU的通用计算(GPGPU)。
除了图形处理的传统用途外,CUDA还允许工程师和科学家在需要并行计算的其他领域中使用GPU,尤其是在那些仅需要并行计算的任务中。例如神经网络的数学原理的矩阵运算就属于令人尴尬的并行计算范畴。因此,对于神经网络运算来说,GPGPU是最为理想的选择。
图2 需要并行执行神经网络的矩阵计算
Kumar Chellapilla于2006年在GPU上实现CNN是已知的将GPU用于深度学习的最早尝试。斯坦福大学教授和Coursera创始人安德鲁·伍(Andrew NG)自2008年以来就是使用GPU进行深度神经网络的较早支持者之一,其他有少部分研究人员在CUDA的帮助下于2008-2009年开始积极地进行GPU实验。而2012年Imagenet Challenge中的图像分类模型的获胜者AlexNet被认为是具有里程碑意义的包含GPU加速功能的深度学习模型。这并不是在深度学习中首次使用GPU,但是在这一盛大的阶段它赢得了大家的青睐,并获得了主流媒体的关注,从而引发了深度学习的革命。
02
GPU和CPU架构
图3 CPU与GPU架构
让我们比较一下CPU和GPU的体系结构,以了解为什么GPU在神经网络上执行操作要比CPU更好。
第一个主要的明显区别是CPU仅具有几个内核来执行算术运算,而GPU可以具有成千上万个这样的内核。从一个角度来看,一个标准的性能良好的CPU有8个内核,而功能强大的CPU Intel Core i9-10980XE有18个内核。另一方面,出色的GeForce GTX TITAN Z NVIDIA GPU具有5760个CUDA内核。如此多的内核使得GPU可以非常高效地进行并行计算以产生高吞吐量。GPU还具有比CPU高的内存带宽,从而使GPU可以一次在存储单元之间移动大量数据。
由于拥有高内存带宽和并行化计算的能力,GPU可以立即加载神经网络矩阵的很大一部分,并进行并行计算以产生输出。另一方面,与CPU相比,GPU将以几乎可忽略的并行化顺序加载数字。这就是为什么对于具有大型矩阵运算的大型深度神经网络而言,GPU可以胜过CPU的原因。
应该注意的是,拥有如此多的内核并不能使GPU在所有操作上都优于CPU。由于低延迟,CPU可以更快地处理无法分解以进行并行化的任何操作。因此,CPU将比GPU更快地计算顺序浮点运算。
03
张量核心的奇迹
图4 Voltas Tensor核心性能
随着GPU在深度学习中的广泛应用,NVIDIA在2017年推出了GPU Tesla V100,它具有新型的Voltas架构,该架构具有称为Tensor Core的专用内核,以支持神经网络的特定张量操作。NVIDIA声称Volta Tensor Cores的吞吐率是常规CUDA的12倍。
其背后的基本原理是Tensor Core专门用于将两个4x4 FP16矩阵相乘,并在其中添加4x的FP16或FP32矩阵(FP代表浮点数)。这样的矩阵运算在神经网络中非常普遍,因此具有一个专用的Tensor Core进行优化的优势,使得GPU Tesla V100比传统的CUDA内核执行得更快。
图5 矩阵的计算操作支持张量核心
在第二代Turing Tensor Core架构中,添加了对FP32、INT4和INT8精度的支持。NVIDIA最近发布了基于Ampere架构的第三代A100 Tensor Core GPU,它支持FP64和类似于FP32的新型精确Tensor Float 32,并且可以在不更改代码的情况下提供20倍的速度。
图6 Turing Tensor核心性能
04CUDA和CuDNN用于深度学习
到目前为止,我们的讨论集中在GPU的硬件方面。现在让我们了解程序员如何利用NVIDIA GPU进行深度学习。前面我们讨论了CUDA,其中讨论了CUDA是供程序员在GPU上执行通用计算的API。CUDA具有对C / C ++和Fortran等编程语言的本机支持,以及对其他编程语言(如Python,R,Matlab,Java等)的第三方包装支持。
CUDA的发布是为了图形设计群体,尽管深度学习群体也开始使用CUDA,但对于他们而言,关注CUDA的低复杂性而不关注神经网络是一项艰巨的任务。因此,NVIDIA在2014年发布了CuDNN,这是一个基于CUDA的专用于深度学习的库,为神经网络的原始操作提供了例如反向传播,卷积,池化等功能。
很快,著名的深度学习库(如PyTorch,Tensorflow,Matlab,MXNet等)都开始将CuDNN纳入其框架,以向用户提供CUDA的无缝支持。
图7 支持CUDA的深度学习库
05
GPU加速方法
只有认真使用GPU,GPU才能加速深度学习通道,否则也会造成瓶颈。当用户尝试通过GPU推送所有代码而不考虑是否可以在GPU上并行执行所有这些操作时,通常会发生这种情况。
根据经验,只有可以并行执行的计算密集型代码才应推送到GPU,其余所有序列代码都应发送到CPU。如,用于数据清理,预处理的代码应在CPU上执行,而用于神经网络训练的代码应在GPU上运行,只有这样,才能看到性能的提升。
图8 GPU加速
06
深度学习基础
数据科学家Max Woolf进行了Tensorflow神经网络模型训练,该模型在Google Cloud是利用GPU和不同CPU在多个数据集上进行训练。他的结果表明,GPU和CPU的训练时间相比有显著的提升。
1. 在MNIST数据集上训练ANN
图 9
2. 在MNIST数据集上训练CNN
图 10
3. 在CIFAR-10图像数据集上训练深度CNN+ANN
图 11
07
结论
在本文中,我们了解了GPU如何在重新激发ML群体对神经网络的兴趣并将深度学习带入主流方面发挥重要的作用。以下是针对深度神经网络进行编程时要考虑的一些要点:
1. GPU用于大规模并行计算,因此应用于大量数据处理。
2. 仅当将可分解为并行计算的操作发送到GPU,而其他操作应在CPU上执行时,GPU的优点才得以体现。
3. 在使用大量数据进行模型训练时,GPU更为有利,您可以在其中对数据进行分块处理并利用并行计算。但推断可能并非如此。如果推断是是在一批数据上进行的,那么速度会很快,但是如果推断在一个数据点一个接一个地发生(实时推断),则在GPU上加载模型可能不会导致性能提高。
尽管GPU支持研究人员和大公司通过深度学习创造奇迹,但它们的成本很高,超出了大多数爱好者的能力范围。但是,在Google Colab和Kaggle上有免费的GPU免费层选项,可为初学者提供有限的可以利用的资源。