gpu编程如何一步步学习_GPU是如何加速深度学习的

探索神经网络的并行性

67c80f3b4c07fff75ed740df5d053376.png

神经网络和深度学习并不是最新的方法。事实上,他们已经很老了。感知器,第一个神经网络,是在1958年由弗兰克·罗森布拉特创建的。即使是无所不在的深层学习建筑积木的发明也大多发生在20世纪末。例如,1989年Yann LeCun等人在landmark paper Backpropagation中引入卷积网络用于手写邮政编码识别。( http://yann.lecun.com/exdb/publis/pdf/lecun-89e.pdf)

为什么深度学习革命要等几十年?

一个主要原因是计算成本。即使是最小的体系结构也可以有几十层和数百万个参数,因此在过程中重复计算梯度是非常昂贵的。在足够大的数据集上,训练通常需要几天甚至几周的时间。现在,你可以在不到几个小时的时间里在笔记本上训练一个最先进的模型。

有三个主要的进步,使我们从一个研究工具深入学习的方法,目前在我们生活的几乎所有领域。这些是反向传播,随机梯度下降和GPU计算。在这篇文章中,我们将深入到后者,并看到神经网络实际上是令人难堪的并行算法,它可以用来提高计算成本的数量级。

一大堆线性代数

第一眼看上去,深层神经网络似乎很复杂。然而,如果我们放大它们,我们可以看到它的组件在大多数情况下都非常简单。正如一向聪明的xkcd所说,网络(主要)是一堆线性代数。

6cf8cb68c36dffa27be6ae796cee01e2.png

( https://xkcd.com/1838/)

在训练过程中,最常用的函数是基本的线性代数运算,如矩阵乘法和加法。这种情况很简单:如果你调用一个函数无数次,从函数调用中删去最少量的时间可能会导致一个严重的问题。

使用GPU-s不仅在这方面提供了一个小的改进,它们还可以加速整个过程。为了了解它是如何完成的,让我们考虑激活。

假设φ是一个激活函数,如ReLU或Sigmoid。应用于前一层的输出

ef970477e592585aec5f2e716c108eb0.png

结果是

7935cbccbce862a5dc7ecdb86cc8129e.png

[多维输入(如图像)也是如此]

这需要循环向量并计算每个元素的值。有两种方法可以加快计算速度。首先,我们可以更快地计算每个φ(xᵢ)。 其次,我们可以并行地同时计算值φ(x 1 ),φ(x 2 ),…,φ(xₙ)。 实际上,这令人尴尬地是并行的,这意味着可以并行化计算而无需付出任何额外的努力。

多年来,做事越快就越困难。处理器的时钟速度过去几乎每年翻一番,但最近已经趋于平稳。现代处理器设计已经到了这样一个地步:将更多的晶体管封装到单元中会产生量子力学屏障。

然而,并行计算这些值不需要更快的处理器,只需要更多的处理器。这就是gpu的工作原理,正如我们将要看到的。

GPU计算原理

4a9162cda03ee1668babf3d3682e3b8a.png

图形处理单元(简称GPU)是用来创建和处理图像的。由于每个像素的值都可以独立于其他像素进行计算,所以最好有很多较弱的处理器,而不是一个非常强大的处理器按顺序进行计算。

这与我们对深度学习模型的情况相同。大多数操作可以很容易地分解成可以独立完成的部分。

16d684a8a8a39880f7d396c0012d1f3b.png

英伟达费米架构。这方面有许多改进,但它很好地说明了这一点。

( https://www.nvidia.com/content/PDF/fermi_white_papers/NVIDIA_Fermi_Compute_Architecture_Whitepaper.pdf)

举个例子,让我们考虑一家餐厅,它必须大规模生产炸薯条。要做到这一点,工人必须削皮,切片和炸土豆。雇人削土豆皮的成本远高于购买更多能够完成这项任务的厨房机器人。即使机器人速度较慢,你也可以从预算中购买更多的机器人,因此整个过程会更快。

并行模式

当谈到并行编程时,人们可以将计算体系结构分为四类。这是由迈克尔弗林在1966年提出,并在使用至今。

  • 单指令,单数据(SISD)
  • 单指令、多数据(SIMD)
  • 多指令,单数据(MISD)
  • 多指令、多数据(MIMD)

多核处理器是MIMD,而gpu是SIMD。深度学习是SIMD非常适合的一个问题。计算激活时,需要执行相同的精确操作,每个调用使用不同的数据。

数据延迟与吞吐量

为了更详细地描述什么GPU比CPU好,我们需要研究延迟和吞吐量。延迟是完成单个任务所需的时间,而吞吐量是每单位时间完成的任务数。

简单地说,GPU可以以延迟为代价提供更好的吞吐量。对于令人尴尬的并行任务,如矩阵计算,这可以提供一个数量级的性能改进。但是,它不太适合于复杂的任务,例如运行操作系统。

另一方面,CPU是针对延迟而不是吞吐量进行优化的。它们能做的远不止浮点运算。

通用GPU编程

在实际应用中,通用GPU编程长期不可用。GPU-s只能做图形,如果你想利用它们的处理能力,你需要学习OpenGL等图形编程语言。这不太实际,进入的门槛很高。

直到2007年,nVidia推出了CUDA框架,这是C的一个扩展,它为GPU计算提供了一个API。这显著地拉平了用户的学习曲线。快进几年:现代的深度学习框架使用gpu,而我们并不清楚它。

面向深度学习的GPU计算

所以,我们已经讨论了如何利用GPU计算进行深度学习,但是我们还没有看到效果。下表显示了2017年制定的基准。虽然它是三年前制造的,但它仍然显示出速度的巨大改进。

38e6454ea740a1f7881ac8d8f80e104b.png

各种深度学习框架的CPU与GPU基准。(基准是从2017年开始的,因此它考虑了当时的技术水平。然而,问题仍然存在:GPU在深度学习方面优于CPU)( https://arxiv.org/abs/1608.07249)

现代深度学习框架如何使用GPU

直接用CUDA编程和自己编写内核并不是最简单的事情。谢天谢地,TensorFlow和Pythorch这样的现代深度学习框架并不需要你这么做。在幕后,深度密集的部分使用深度学习lib库CUDN编写在CUDA中。这些是从Python调用的,所以根本不需要直接使用它们。Python在这方面非常强大:它可以很容易地与C结合,这给了您强大的功能和易用性。

这类似于NumPy在幕后的工作方式:它的速度非常快,因为它的函数是直接用C编写的。

你需要建立一个深入的学习平台吗?

如果你想自己培养深度学习模式,你有几个选择。首先,你可以为自己建立一个GPU机器,然而,这可能是一个重大的投资。谢天谢地,你不需要这么做:ArkAI.net, 亚马逊和谷歌等云提供商提供远程GPU实例。如果你想免费访问资源,请查看ArkAI.net, Google Colab,它提供了对GPU实例的免费访问。

结论

深度学习在计算上是非常密集的。几十年来,训练神经网络受到硬件的限制。即使是相对较小的模型也要经过几天的训练,在庞大的数据集上训练大型架构是不可能的。

然而,随着通用计算GPU程序的出现,深度学习爆炸式地发展起来。GPU在并行编程方面表现突出,由于这些算法可以非常有效地并行化,它可以将训练和推理速度提高几个数量级。

这为快速增长开辟了道路。现在,即使是相对便宜的商用计算机也可以训练最先进的模型。结合TensorFlow和Pythorch等令人惊叹的开源工具,人们每天都在构建令人敬畏的东西。这是一个真正的伟大的时间在外地。

e2f295160641d4ff1cdc7b54866f1613.png

60369ee371a3f7be79b45f6f6500da73.png

https://qm.qq.com/cgi-bin/qm/qr?k=eRclDWFbXLBUDSkYCszTvnkuzhvj2aGW (二维码自动识别)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值