随着高性能计算和游戏领域的发展,图形处理单元(GPU)的性能逐年提升,它们现在能够完成一些令人难以置信的任务。在过去几年中,由于深度学习的需求,GPU受到了更多的关注。深度学习模型在训练过程中需要大量的时间,即使是强大的CPU也无法同时高效处理如此多的计算任务,这就是GPU因其并行处理能力而超越CPU的领域。但在深入探讨之前,首先需要了解一些关于GPU的基本知识。
GPU,全称为图形处理单元,是一个专门用于特定任务的小型计算机。与同时执行多个任务的CPU不同,GPU拥有自己的处理器,嵌入在自己的主板上,配备有显存(VRAM)以及适当的散热设计。在“图形处理单元”这个术语中,“图形”指的是在2D或3D空间中指定坐标渲染图像。视口或视点是观察者对对象的视角,取决于所使用的投影类型。光栅化和光线追踪是渲染3D场景的几种方式,这两种概念都基于一种称为透视投影的投影类型。简而言之,透视投影是图像在视平面或画布上形成的方式,其中平行线汇聚到一个称为“投影中心”的点,随着对象远离视点,它看起来更小,这正是眼睛在现实世界中的表现方式,这有助于理解图像中的深度,因此它能够产生逼真的图像。
此外,GPU还处理复杂的几何形状、向量、光源或照明、纹理、形状等。现在已经对GPU有了基本的了解,让来理解为什么它在深度学习中被广泛使用。GPU最受赞赏的特性之一是能够并行计算处理。这就是并行计算概念的起点。CPU通常以顺序方式完成任务。CPU可以划分为核心,每个核心一次只能处理一个任务。假设CPU有2个核心,那么两个不同任务的处理可以在这两个核心上运行,从而实现多任务处理。但这并不意味着CPU不够好。事实上,CPU非常擅长处理与不同操作相关的不同任务,如同时处理操作系统、处理电子表格、播放高清视频、解压大压缩文件等。这些是GPU根本无法完成的任务。
差异何在?如前所述,CPU被划分为多个核心,以便它们可以同时处理多个任务,而GPU则拥有数百甚至数千个核心,所有这些核心都致力于单一任务。这些是更频繁执行的简单计算,并且彼此独立。两者都将经常需要的数据存储到它们各自的缓存内存中,从而遵循“局部引用”的原则。有许多软件和游戏可以利用GPU执行。这样做的目的是使任务或应用程序代码的某些部分并行化,而不是整个过程。这是因为大多数任务的处理必须以顺序方式执行。例如,登录系统或应用程序不需要并行化。当有部分执行可以并行处理时,它简单地转移到GPU进行处理,同时顺序任务在CPU中执行,然后任务的两部分再次合并在一起。
在GPU市场中,有两个主要的竞争者,即AMD和Nvidia。Nvidia GPU在深度学习中被广泛使用,因为它们在论坛软件、驱动程序、CUDA和cuDNN方面有广泛的支持。因此,在AI和深度学习方面,Nvidia长期以来一直是先锋。神经网络被称为“尴尬的并行”,这意味着神经网络中的计算可以轻松并行执行,并且它们彼此独立。一些计算,如每层权重和激活函数的计算、反向传播,可以并行进行。也有很多研究论文可供参考。
NvidiaGPU配备了专门的CUDA核心,有助于加速深度学习。CUDA代表“计算统一设备架构”,于2007年推出,这是一种实现并行计算并充分利用GPU性能以优化方式执行任务的方法,从而在执行任务时获得更好的性能。CUDA工具包是一个完整的软件包,包含用于构建利用GPU的应用程序的开发环境。这个工具包主要包括C/C++编译器、调试器和库。此外,CUDA运行时还有其驱动程序,以便与GPU通信。CUDA也是一种专门为指导GPU执行任务而设计的编程语言。它也被称为GPU编程。
下面是一个简单的“Hello World”程序,以了解CUDA代码的外观。
#include<stdio.h>
#include<stdlib.h>
#include<cuda.h>
__global__ void demo() {
printf("hello world!,my first cuda program");
}
int main() {
printf("From main!\n");
demo<<<1,1>>();
return 0;
}
什么是cuDNN?cuDNN是一个神经网络库,它是GPU优化的,可以充分利用Nvidia GPU。这个库包括卷积、前向和反向传播、激活函数和池化的实现。这是一个必须的库,没有它,就不能使用GPU来训练神经网络。
在2018年,Nvidia推出了他们的GPU新系列,即2000系列。也称为RTX,这些卡配备了专门用于深度学习的张量核心,基于Volta架构。张量核心是执行4x4 FP16矩阵乘法和4x4矩阵FP16或FP32加法的特殊核心,输出结果是一个4x4 FP16或FP32矩阵,具有完全精度。