PyTorch - 03 - CUDA之解释:为什么深度学习使用GPU?

2022-10-03 10:57:58

为什么深度学习和神经网络使用GPU

这篇文章的目的是帮助初学者了解CUDA是什么以及它如何与PyTorch配合使用,更重要的是,为什么我们仍然在神经网络编程中甚至使用GPU。


Graphics Processing Unit (GPU)

要了解CUDA,我们需要对图形处理单元(GPU)有一定的了解。 GPU是一种擅长处理专门计算的处理器。

这与中央处理器(CPU)相反,后者是擅长处理一般计算的处理器。 CPU是支持我们电子设备上大多数典型计算的处理器。

GPU的计算速度可能比CPU快得多。 然而,这并非总是如此。 GPU相对于CPU的速度取决于所执行的计算类型。 最适合GPU的计算类型是可以并行完成的计算。

Parallel Computing

并行计算是一种计算类型,其中通过特定的计算将其分解为可以同时执行的独立的较小计算。 然后将所得的计算重新组合或同步,以形成原始较大计算的结果。

较大任务可以分解的任务数量取决于特定硬件上包含的内核数量。 内核是在给定处理器中实际执行计算的单元,CPU通常具有四个,八个或十六个内核,而GPU可能具有数千个。

还有其他重要的技术规范,但是此描述旨在推动总体思路。

有了这些工作知识,我们可以得出结论,并行计算是使用GPU完成的,我们还可以得出结论,最适合使用GPU解决的任务是可以并行完成的任务。 如果可以并行执行计算,我们可以使用并行编程方法和GPU加快计算速度。

神经网络:并行计算

现在让我们将注意力转向神经网络,看看为什么GPU在深度学习中被大量使用。 我们刚刚看到GPU非常适合并行计算,而关于GPU的事实就是深度学习使用GPU的原因。

在并行计算中,并行任务是需要很少或不需要任何努力就可以将整个任务分成一组要并行计算的较小任务的任务。并行执行的任务是很容易看到一组较小的任务彼此独立的任务。

在这里插入图片描述

因此,神经网络令人尴尬地并行。 我们使用神经网络进行的许多计算可以很容易地分解为较小的计算,从而使一组较小的计算彼此不依赖。 卷积就是这样一个例子。

卷积示例

让我们来看一个例子,卷积运算:

在这里插入图片描述

此动画展示了没有数字的卷积过程。 我们在底部有一个蓝色的输入通道。 卷积滤镜底部阴影,在输入通道和绿色输出通道之间滑动:

  1. 蓝色(底部)-输入通道 阴影
  2. 蓝色上方-3 x 3卷积滤镜 绿色
  3. 顶部-输出通道

对于蓝色输入通道上的每个位置,3 x 3过滤器都会进行计算,将蓝色输入通道的阴影部分映射到绿色输出通道的相应阴影部分。

在动画中,这些计算是一个接一个地顺序进行的。 但是,每个计算都独立于其他计算,这意味着任何计算都不依赖于任何其他计算的结果。

结果,所有这些独立的计算都可以在GPU上并行发生,并且可以产生整个输出通道。这使我们看到通过使用并行编程方法和GPU可以加快卷积操作。

Nvidia硬件(GPU)和软件(CUDA)

这就是CUDA出现的地方。 Nvidia是一家设计GPU的技术公司,他们已经创建了CUDA作为与GPU硬件配对的软件平台,使开发人员更容易构建使用Nvidia GPU的并行处理能力来加速计算的软件。

在这里插入图片描述
Nvidia GPU是支持并行计算的硬件,而CUDA是为开发人员提供API的软件层。

结果,您可能已经猜到要使用CUDA需要Nvidia GPU,并且可以从Nvidia网站免费下载和安装CUDA。

开发人员通过下载CUDA工具包来使用CUDA。 该工具包附带专门的库,例如cuDNN,CUDA深度神经网络库。

在这里插入图片描述

PyTorch随附CUDA

使用PyTorch或任何其他神经网络API的好处之一是将并行性引入了API中。 这意味着作为神经网络程序员,我们可以将更多精力放在构建神经网络上,而将精力放在性能问题上。

有了PyTorch,CUDA就从一开始就诞生了。 无需其他下载。 我们需要的是拥有受支持的Nvidia GPU,并且我们可以使用PyTorch利用CUDA。 我们不需要直接使用CUDA API。

现在,如果我们想与PyTorch核心开发团队合作或编写PyTorch扩展,了解如何直接使用CUDA可能会很有用。

毕竟,PyTorch是用以下所有代码编写的:

  1. Python
  2. C++
  3. CUDA

在PyTorch中使用CUDA

在PyTorch中,利用CUDA非常容易。 如果我们希望在GPU上执行特定的计算,则可以通过在数据结构(张量)上调用cuda()来指示PyTorch这样做。

假设我们有以下代码:

> t= torch.tensor([1,2,3])> ttensor([1,2,3])

默认情况下,以这种方式创建的张量对象在CPU上。 结果,我们使用此张量对象进行的任何操作都将在CPU上执行。

现在,要将张量移动到GPU上,我们只需编写:

> t= t.cuda()> ttensor([1,2,3], device='cuda:0')

由于可以在CPU或GPU上有选择地进行计算,因此PyTorch的用途非常广泛。

GPU可能比CPU慢

我们说过,我们可以有选择地在GPU或CPU上运行我们的计算,但是为什么不只在GPU上运行每个计算呢?

GPU不是比CPU快吗?

答案是,GPU仅对于特定(专用)任务更快。 我们可能遇到的一个问题是瓶颈,这会降低我们的性能。 例如,将数据从CPU转移到GPU的成本很高,因此在这种情况下,如果计算任务很简单,则总体性能可能会变慢。


将相对较小的计算任务移至GPU并不会加快我们的步伐,甚至可能会使我们的步伐减慢。 请记住,GPU可以很好地处理可以分解为许多较小任务的任务,并且如果计算任务已经很小,那么将任务移至GPU不会带来太多收益。

因此,刚开始使用CPU通常是可以接受的,并且随着我们处理更大,更复杂的问题,请开始大量使用GPU。

GPGPU计算

最初,使用GPU加速的主要任务是计算机图形学。 因此,将其命名为“图形处理单元”,但是近年来,出现了更多种类的并行任务。 我们已经看到的一项任务就是深度学习。

深度学习与使用并行编程技术的许多其他科学计算任务一起,导致了一种称为GPGPU或通用GPU计算的新型编程模型。

现在,在GPU上执行各种任务已变得越来越普遍,GPGPU计算通常被称为GPU计算或加速计算。

英伟达一直是该领域的先驱。 Nvidia将通用GPU计算简称为GPU计算。 Nvidia的首席执行官黄仁勋(Jensen Huang)早就想到了GPU计算,这就是CUDA成立于近十年前的原因。

尽管CUDA已经存在很长时间了,但它才刚刚开始真正普及,而Nvidia在CUDA上的工作直到现在都是Nvidia引领深度学习GPU计算领域的原因。

当我们听到詹森(Jensen)谈论GPU计算堆栈时,他指的是GPU是底层的硬件,CUDA是GPU之上的软件体系结构,最后是像cuDNN这样的库。

此GPU计算堆栈在其他方面非常专业的芯片上支持通用计算功能。 在计算机科学中,我们经常看到这样的堆栈,因为技术是分层构建的,就像神经网络一样。

PyTorch位于CUDA和cuDNN的顶部,这是我们将努力最终支持顶部应用程序的框架。

本文深入探讨了GPU计算和CUDA,但它超出了我们的需要。 我们将使用PyTorch在堆栈顶部附近进行工作。

在这里插入图片描述

Tensors Are Up Next

我们现在准备跳入该神经网络编程系列的第二部分,该部分全部涉及张量。
在这里插入图片描述

我们现在准备跳入该神经网络编程系列的第二部分,该部分全部涉及张量。 我希望您发现这篇文章有用。 现在我们应该对为什么使用GPU进行神经网络编程有一个很好的了解。 在本系列的第一部分中,我们将使用CPU。 我们现在准备开始使用Torch.Tensors并构建我们的第一个神经网络。

  • 作者:许喜远
  • 原文链接:https://blog.csdn.net/weixin_48367136/article/details/111195615
    更新时间:2022-10-03 10:57:58