熊熊出没 发表于 2024-9-27 12:50:48

深度学习500问——Chapter15:异构计算,GPU和框架选型(1)

文章目录

   
异构计算,GPU和框架选型指南
15.1 什么是异构计算
15.2 什么是GPU
15.3 GPU架构简介
15.3.1 怎样通俗理解GPU的架构
15.3.2 CUDA的核心是什么
15.3.3 为什么要利用GPU
异构计算,GPU和框架选型指南

深度学习训练和推理的过程中,会涉及到大量的向量(vector),矩阵(matrix)和张量(tensor)操作,通常必要大量的浮点计算,包括高精度(在训练的时候)和低精度(在推理和部署的时候)。
GPU,作为一种通用可编程的加速器,最初计划是用来进行图形处置惩罚和渲染功能,但是从2007年开始,英伟达(NVIDIA)公司提出了第一个可编程通用计算平台(GPU),同时提出了CUDA框架,从此开启了GPU用于通用计算的新纪元。今后,不计其数的科研人员和开发者,对各种差别范例的算法用CUDA进行(部分)改写,从而达到几倍到数百倍的加速效果。尤其是在机器学习,特别是深度学习的浪潮来临后,GPU加速已经是各类工具实现的根本底层架构之一。
本章里,会简朴介绍GPU的根本架构,性能指标,框架选择等等和深度学习干系的内容。
15.1 什么是异构计算

异构计算是基于一个更加朴素的概念,“异构现象”,也就是差别计算平台之间,由于硬件结构(包括计算核心和内存),指令集和底层软件实现等方面的差别而有着差别的特性。异构计算就是利用联合了两个或者多个差别的计算平台,并进行协同运算。
好比,比力常见的,在深度学习和机器学习中已经比力成熟的架构:CPU和GPU的异构计算;别的还有比力新的Google推出的协处置惩罚器(TPU),根据目标而定制的ASIC,可编程的FPGA等也都是现在在异构计算中利用比力多的协处置惩罚器。而本章会着重介绍和深度学习共同繁荣的图形加算算器,也就是常说的GPU。
15.2 什么是GPU

GPU,就如名字所包含的内容,本来开发的目标是为了进行计算机图形渲染,而淘汰对于CPU的负载。由于图像的原始特性,也就是像素间的独立性,以是GPU在计划的时候就遵从了从“单指令流多数据流(SIMD)”架构,使得同一个指令(好比图像的某种变更),可以同时在多一个像素点上进行计算,从而得到比力大的吞吐量,才能使得计算机可以实时渲染比力复杂的2D/3D场景。
在最初的应用场景里,GPU并不是作为一种通用计算平台实现的,直到2007年左右,一家巨大的公司将GPU带到通用计算的天下里,使得其可以在相对比力友好的编程情况(CUDA/OpenCL)里加速通用程序成了可能。从此之后,GPU通用计算,也就是GPU就成了学界和工业界都频繁利用的技术,在深度学习爆发的年代里,GPU成了推动这股浪潮非常重要的力量。
15.3 GPU架构简介

GPU,图形显示芯片作为差别于CPU的计划逻辑和应用场景,有着非常差别的架构,本部分将简朴介绍GPU毕竟是怎样架构,其中的计算核心有哪些特性。
15.3.1 怎样通俗理解GPU的架构

首先,下图简朴地展示了几个GPU差别于CPU的特性:


[*]计算核心:图中的CPU,i7-5960,Intel的第五代Broadwell架构,其中包括了8个CPU核心(支持16线程),也就是理论上可以有16个差别的运算同时进行。除了8个核心计算单位,大部分的芯片面积是被3级缓存,内存和控制电路占据了。同样的,来自Nvidia的GTX980GPU,在差不多的芯片面积上,大部分是计算单位,16个SM,也就是流处置惩罚单位,每个流处置惩罚单位中包含着128个CUDA计算核心,以是统共来说,有2048个GPU运算单位,相应地这颗GPU理论上可以在一个时钟周期内可以进行2048次单精度运算。
https://i-blog.csdnimg.cn/direct/c6bbc02136c441b9b3ce89f6ce3f1292.png


[*]计算核心频率:时钟频率,代表每一秒中内能进行同步脉冲次数,也是从一个侧面反映一个计算元件的工作速度。下图中对比了个别早期产物,好比Intel 的 x5650 和几款 Nvidia的GPU。可以看出核心频率而言,CPU要远高于GPU。对于CPU而言,在不考虑能源消耗和制成工艺限制的情况下,追求更高的主频。但,在GPU的计划中,采用了多核心计划,纵然是提高一些频率,实在对于总体性能影响不会特别大。当然,其中还有能耗方面的考虑,避免发热过高,也进行了衡量。还有一个可能的缘故起因是,在一个流处置惩罚器中的每个核心(CUDA核心)的运行共享非常有限的缓存和寄存器,由于共享内存也是有性能极限的,以是纵然每个GPU核心频率提高,如果被缓存等拖累也是无法展现出高性能的。
https://i-blog.csdnimg.cn/direct/05f3cda87e6a46b7b585c21a4e38c96a.png
https://i-blog.csdnimg.cn/direct/f2c8d0436d6447b3bfe7ee3196320e9a.png


[*]内存架构:GPU的多层内存架构包括全局内存(也就是通常意义上大部分比力关注的内存,在若干到16GB之间,截止到当前最新),2级缓存,和芯片上的存储(包括寄存器,和1级缓存共用的共享内存,只读/纹理缓存和常量缓存)。通常来说,最高速的共享内存/缓存和寄存器都是非常有限的,好比在Tesla的K20中,只有48K的缓存可以作为共享内存或者1级缓存利用,以是在很多用GPU加速算法实现的过程中,有效地利用这些高速缓存是使得性能提拔的非常重要的方面。
https://i-blog.csdnimg.cn/direct/084ff234e1ad4012a5601c53a90fe030.png
https://i-blog.csdnimg.cn/direct/63353ffa3cf046478b66b8085b661d42.png
15.3.2 CUDA的核心是什么

上面提到在一个GPU芯片里,会有几千个CUDA核心,被分布在多个流处置惩罚单位(SM)中,好比上面提到早期的GTX980中的16个SM中各包含了128个CUDA核心。
如下图所示,作为GPU架构中的最小单位,实在它的计划和CPU有着非常类似的结构,其中包括了一个浮点运算单位和整型运算单位,和控制单位。同一个流处置惩罚器中,全部的CUDA核心将同步执行同一个指令,但是作用于差别的数据点上。
https://i-blog.csdnimg.cn/direct/da5da5bb78b542388559511020b907c6.png
一般来说,更加多的CUDA核心意味着有更多的并行执行单位,以是也就可以片面地以为是有更加高的性能。但是,实在这个也是取决于很多方面,最重要的是算法在并行实现的时候有没有高效地调度和内存的利用优化。
在现在我们利用的大部分GPU加速的深度学习框架里,包括Tensorflow、PyTorch等都是依赖于底层的GPU的矩阵加速代码的实现。为此Nvidia公司也是制定和实现了统一的接口,好比CUDNN,方便上层框架更好的利用GPU的性能。
15.3.3 为什么要利用GPU

对于并行计算来说,可以非常粗略地分为:


[*]并行指令:也就是多个指令可以同时分配到差别的计算核心上同时进行,而他们的操作是差别的,并且他们之间相互独立,不必要额外的同步和信息共享。
[*]并行数据流:如果数据本身存在的自然的独立性,好比图像中的每一个像素,那么在对这个图像做处置惩罚的过程中,同一个指令可以同时作用于每一个像素。在这种情况下,这个对于完整图像的操作可以并行化。理论上,如果内存不是题目,并且计算单位的数目大于整个图形中总像素点的话,这个操作可以在一个时钟周期内完成。
GPU整体的架构而言,某种意义上是同时支持以上两种并行模式。在同一个流处置惩罚器中,采用了“单一指令并行数据流的模式”,而在多个流处置惩罚器中,同一时间可以派发差别的指令。从这一点出发,GPU芯片算是一个非常灵活的架构。一个芯片中,流处置惩罚器的个数和其中包含的CUDA核心的数目也是一种面向应用计划时候找到的一个均衡点。
基于深度学习中大部分的操作的自然并行性(大量的矩阵操作),GPU在当下还是一种非常适合的计算平台。一个非常范例的例子就是常见的矩阵相乘(如下图),要计算https://latex.csdn.net/eq?Z%3DX%20%5Ctimes%20Y,通过并行计算,X和Y中的行向量和列向量的逐元素相乘就可以同时进行,只要得到效果后再进行累加,并且累计的过程中也是可以进行并行化,使得效率有非常大的提高。
Nvidia也是制定和开发了一套底层类库,CUBlas方便开发者。我们熟悉的几大框架(eg. Tensorflow、Pytorch等)也是遵循和利用了这些并行类库,以是才使得训练和部署性能有了非常多的提高。
https://i-blog.csdnimg.cn/direct/cc730ce623dd42dfb54ce9ebb3b0b484.png


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 深度学习500问——Chapter15:异构计算,GPU和框架选型(1)