|
研究深度学习和神经网络大都离不开GPU,在GPU的加持下,我们可以更快的获得模型训练的成果。使用GPU和使用CPU的分歧在哪里?为什么需要GPU?
一个关于使用Pytorch的教程中对这个问题进行了一个很好的解释,本文内容主要转载自(访谒需要科学上网): https://deeplizard.com/learn/video/6stDhEA0wFQ
为了更好地切题,本文对其内容做了一些删改,并增加了GPU与CPU道理布局的部门,此部门是从CPU 和 GPU 的区别是什么? - 虫子君的回答 - 知乎转载看到的,下面是原链接: CPU和GPU的设计区别
全文较长可以直接拉到末尾看一句话总结
CPU和GPU是什么
GPU(Graphics processing unit),中文全称图形措置器,我们风闻的更多的CPU全称是central processing unit,中央措置器。 CPU是电子计算机的主要设备之一,电脑中的核心配件。其功能主要是解释计算机指令以及措置计算机软件中的数据。CPU是计算机中负责读取指令,对指令译码并执行指令的核心部件。
GPU(图形措置器)是图形系统布局的重要元件,是连接计算机和显示终端的纽带。一个光栅显示系统离不开图形措置器(GPU)。 应该说有显示系统就有图形措置器,但是早期的显卡只包含简单的存储器和帧缓冲区,它们实际上只起了一个图形的存储和传递感化,一切操作都必需由CPU来控制。这对于文本和一些简单的图形来说是足够的,但是当要措置复杂场景出格是一些真实感的三维场景,单靠这种系统是无法完成任务的。所以后来成长的显卡都有图形措置的功能。它不单单存储图形,而且能完成大部门图形功能,这样就大大减轻了CPU的承担,提高了显示能力和显示速度。
图形措置器可单独与专用电路板以及从属组件组成显卡,或单独一片芯片直接内嵌入到主板上,或者内置于主板的北桥芯片中,此刻也有内置于CPU上组成SoC的。个人电脑范围中,在2007年,90%以上的新型台式机和笔记本电脑拥有嵌入式绘图芯片,但是在性能上往往低于不少独立显卡。
GPU的计算速度比CPU快得多。然而,情况并不总是如此。GPU相对于CPU的速度取决于执行的计算类型。最适合GPU的计算类型是可以并行完成的计算。
并行计算
并行计算是一种将特定计算分化成可以同时进行的独立的较小计算的计算方式。然后从头组合或同步计算成果,形成本来较大计算的成果。
更大的任务可以分化成的任务数量取决于特定硬件上包含的内核数量。核心是在给定措置器中实际执行计算的单元,CPU凡是有4个、8个或16个核心,而GPU可能有数千个。还有其他重要的技术规范,但是这个描述是用来驱动总体思想的。(此处涉及的道理在CPU和GPU的设计区别)
有了这些工作常识,我们可以得出结论,并行计算是使用GPU完成的,我们还可以得出结论,最适合使用GPU解决的任务是可以并行完成的任务。如果计算可以并行完成,我们可以使用并行编程方式和GPU加速计算。
神经网络是高度并行的(embarrassingly parallel)
此刻让我们把注意力转向神经网络,看看为什么GPU在深度学习中被如此频繁地使用。我们方才看到,GPU非常适合并行计算,而关于GPU的这个事实就是为什么深度学习要使用它们。神经网络是高度并行的(embarrassingly parallel)。
在并行计算中,高度并行任务是指将整个任务分割成一组较小的任务以并行计算的任务。 高度并行任务是那些很容易看到一组小任务彼此独立的任务。
神经网络布局
由于这个原因,神经网络高度并行。我们用神经网络做的许多计算都可以很容易地分化成更小的计算,这样小的计算集就不会彼此依赖。一个这样的例子就是卷积。
卷积示例
来看一个卷积运算的例子:
卷积运算示例
这个动画展示了没有数字的卷积过程。我们在底部有一个蓝色的输入通道。在输入通道上滑动的底部有一个暗影的卷积滤波器,还有一个绿色的输出通道。 - 蓝色(底部)- 输入通道 - 暗影(覆盖在蓝色上)- 3*3的卷积过滤器 - 绿色(顶部)- 输出通道
对于蓝色输入通道上的每个位置,3x3过滤器进行计算,将蓝色输入通道的暗影部门映射到绿色输出通道的相应暗影部门。
在动画中,这些计算一个接一个地依次进行。但是,每个计算都是独立于其他计算的,这意味着任何计算都不依赖于任何其他计算的成果。
因此,所有这些独立的计算都可以在GPU上并行进行,从而发生整个输出通道。
这让我们看到,卷积运算可以通过使用并行编程方式和GPU来加速。
英伟达Nvidia硬件(GPU)和软件(CUDA)
这就是CUDA的用武之地。Nvidia是一家设计GPU的技术公司,他们把CUDA作为一个软件平台,与他们的GPU硬件配对,让开发者更容易构建软件,操作Nvidia GPU的并行措置能力加速计算。
Nvidia GPU是撑持并行计算的硬件,而CUDA是为开发者提供API的软件层。
因此,你可能已经猜到Nvidia的GPU需要使用CUDA,而CUDA可以从Nvidia的网站上免费下载和安装。
开发人员通过下载CUDA东西包来使用CUDA。随东西包而来的是专门的库,如cuDNN, CUDA深度神经网络库。
4层深度神经网络
GPU可以比CPU慢
我们说过我们可以选择在GPU或CPU上运行我们的计算,但为什么不直接在GPU上运行所有的计算呢?
答案是GPU只对特定的(专门的)任务更快。我们可能遇到的一个问题是瓶颈,这会降低我们的性能。例如,将数据从CPU移动到GPU是昂贵的,所以在这种情况下,如果计算任务是简单的,那么整体性能可能会变慢。
将相对较小的计算任务转移到GPU不会使我们的速度提高很多,甚至可能降低我们的速度。记住,对于可以分化成许多小任务的任务,GPU工作得很好,如果一个计算任务已经很小了,我们将不会通过将任务转移到GPU来获得很多。
由于这个原因,在刚开始的时候简单地使用CPU凡是是可以接受的,当我们措置更大更复杂的问题时,开始更多地使用GPU。
GPGPU计算
一开始,使用gpu加速的主要任务是计算机图形。因此得名图形措置单元,但近年来,呈现了更多种类的并行任务。我们所看到的任务之一就是深度学习。
深度学习和许多其他使用并行编程技术的科学计算任务一起,正在导致一种新的编程模型,称为GPGPU或通用GPU计算。 GPGPU计算凡是被称为GPU计算或加速计算,此刻在GPU上预置各种任务变得越来越遍及。
英伟达是这一范围的先驱。Nvidia将通用GPU计算简称为GPU计算。英伟达首席执行官黄延森(Jensen Huang)很早就预见到了GPU计算,这也是CUDA在近10年前诞生的原因。
虽然CUDA已经存在了很长一段时间,但它此刻才方才开始真正的飞翔,而Nvidia在CUDA上的工作到目前为止是Nvidia在GPU计算深度学习方面领先的原因。
当我们听到Jensen谈到GPU计算仓库时,他指的是底层的GPU是硬件,底层的CUDA是软件架构,最后是CUDA之上的cuDNN库。
这个GPU计算栈撑持通用的计算能力,而通用的计算能力在其他方面长短常专业的。我们经常在计算机科学中看到这样的栈,因为技术是分层构建的,就像神经网络一样。
在CUDA和cuDNN之上的是PyTorch,这是很多人正在使用的最终撑持应用法式的框架。
补充 - CPU和GPU的设计区别
CPU和GPU之所以大不不异,是由于其设计方针的分歧,它们分袂针对了两种分歧的应用场景。CPU需要很强的通用性来措置各种分歧的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的措置。这些都使得CPU的内部布局异常复杂。而GPU面对的则是类型高度统一的、彼此无依赖的大规模数据和不需要被打断的纯净的计算环境。
于是CPU和GPU就呈现出非常分歧的架构(示意图):
CPUI与GPU架构
图片来自nVidia CUDA文档。此中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。
GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间,而且还有有复杂的控制逻辑和诸多优化电路,对比之下计算能力只是CPU很小的一部门。
从上图可以看出: Cache, local memory: CPU > GPU
Threads(线程数): GPU > CPU
Registers: GPU > CPU
多寄存器可以撑持非常多的Thread,thread需要用到register,thread数目大,register也必需得跟着很大才行。
SIMD Unit(单指令大都据流,以同步方式,在同一时间内执行同一条指令): GPU > CPU。
CPU 基于低延时的设计:
CPU有强大的ALU(算术运算单元),它可以在很少的时钟周期内完成算术计算。
当今的CPU可以达到64bit 双精度。执行双精度浮点源算的加法和乘法只需要1~3个时钟周期。
CPU的时钟周期的频率长短常高的,达到1.532~3gigahertz(千兆HZ, 10的9次方)。
大的缓存也可以降低延时。保留很多的数据放在缓存里面,当需要访谒的这些数据,只要在之前访谒过的,如今直接在缓存里面取即可。
复杂的逻辑控制单元。当法式含有多个分支的时候,它通过提供分支预测的能力来降低延时。
数据转发。 当一些指令依赖前面的指令成果时,数据转发的逻辑控制单元决定这些指令在pipeline中的位置而且尽可能快的转发一个指令的成果给后续的指令。这些动作需要很多的对比电路单元和转发电路单元。
GPU是基于大的吞吐量设计。
GPU的特点是有很多的ALU和很少的cache. 缓存的目的不是保留后面需要访谒的数据的,这点和CPU分歧,而是为thread提高处事的。如果有很多线程需要访谒同一个不异的数据,缓存会合并这些访谒,然后再去访谒dram(因为需要访谒的数据保留在dram中而不是cache里面),获取数据后cache会转发这个数据给对应的线程,这个时候是数据转发的角色。但是由于需要访谒dram,自然会带来延时的问题。
GPU的控制单元(左边黄色区域块)可以把多个的访谒合并成少的访谒。
GPU的虽然有dram延时,却有非常多的ALU和非常多的thread. 为啦平衡内存延时的问题,我们可以中充实操作多的ALU的特性达到一个非常大的吞吐量的效果。尽可能多的分配多的Threads.凡是来看GPU ALU会有非常重的pipeline就是因为这样。
所以CPU擅长逻辑控制,串行的运算。和通用类型数据运算分歧,GPU擅长的是大规模并行计算,这也正是暗码破解等所需要的。所以GPU除了图像措置,也越来越多的参与到计算傍边来。
GPU的工作大部门就是这样,计算量大,但没什么技术含量,而且要反复很多很多次。就像你有个工作需要算几亿次一百以内加减乘除一样,最好的法子就是雇上几十个小学生一起算,一人算一部门,反正这些计算也没什么技术含量,纯粹体力活而已。而CPU就像老传授,积分微分城市算,就是工资高,一个老传授资顶二十个小学生,你要是富士康你雇哪个?GPU就是这样,用很多简单的计算单元去完成大量的计算任务,纯粹的人海战术。这种策略基于一个前提,就是小学生A和小学生B的工作没有什么依赖性,是互相独立的。很多涉及到大量计算的问题基本都有这种特性,比如你说的破解暗码,挖矿和很多图形学的计算。这些计算可以分化为多个不异的简单小任务,每个任务就可以分给一个小学生去做。但还有一些任务涉及到“流”的问题。比如你去相亲,双方看着顺眼才能继续成长。总不能你这边还没见面呢,那边找人把证都给领了。这种斗劲复杂的问题都是CPU来做的。
总而言之,CPU和GPU因为最初用来措置的任务就分歧,所以设计上有不小的区别。而某些任务和GPU最初用来解决的问题斗劲相似,所以用GPU来算了。GPU的运算速度取决于雇了多少小学生,CPU的运算速度取决于请了多么厉害的传授。传授措置复杂任务的能力是碾压小学生的,但是对于没那么复杂的任务,还是顶不住人多。当然此刻的GPU也能做一些稍微复杂的工作了,相当于升级成初中生高中生的程度。但还需要CPU来把数据喂到嘴边才能开始干活,究竟还是靠CPU来管的。
什么类型的法式适合在GPU上运行?
(1)计算密集型的法式。所谓计算密集型(Compute-intensive)的法式,就是其大部门运行时间花在了寄存器运算上,寄存器的速度和措置器的速度相当,从寄存器读写数据几乎没有延时。可以做一下对比,读内存的延迟概略是几百个时钟周期;读硬盘的速度就不说了,即便是SSD, 也实在是太慢了。
(2)易于并行的法式。GPU其实是一种SIMD(Single Instruction Multiple Data)架构, 他有成百上千个核,每一个核在同一时间最好能做同样的事情。
一句话总结为什么深度学习和神经网络需要GPU
深度学习和神经网络的每个计算任务都是独立于其他计算的,任何计算都不依赖于任何其他计算的成果,可以采用高度并行的方式进行计算。而GPU对比于CPU拥有更多独立的大吞吐量计算通道,较少的控制单元使其不会受到计算以外的更多任务的干扰,拥有比CPU更纯粹的计算环境,所以深度学习和神经网络模型在GPU的加持下会更高效地完成计算任务。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|