深度学习的专属武器 NVIDIA Volta GPU核心架构深层技术解析
- 来源:微型计算机 smarty:if $article.tag?>
- 关键字:NVIDIA,GPU,人工智能 smarty:/if?>
- 发布时间:2018-05-31 10:43
人工智能是目前产业发展的一个热点,其中深度学习又是热点中的热点。过去几年,随着深度学习技术的发展、算法和框架的优化,GPU一跃成为深度学习的计算核心,与之相匹配的则是NVIDIA(英伟达)GPU被广泛用在深度学习各个阶段,成为了事实上深度学习领域的核心产品。在这种情况下,NVIDIA再接再厉,推出了全新的专门为深度学习优化的Volta架构,凭借全新加入Tensor Core和大量的架构改进,希望进一步加强自己在深度学习领域的地位。Volta架构公布于2013年的GTC大会,NVIDIA当时计划Volta架构大约在2016年左右上市,接替Max well架构。不过实际情况是在Max well架构后Pascal架构横空出世,Volta架构则继续延后。直到2017年5月的GTC大会上,NVIDIA终于公布了数年前就开始筹划的Volta架构,具体的产品则是产品代号为GV100的芯片以及Tesla V100、TITAN V。GV100芯片核心面积超过800㎜2,深度学习性能更是超过100TFlops。究竟NVIDIA是如何达到如此高的性能,巨大无比的GV100核心有什么秘密,本文将带你一探究竟。
史上最大的GPU核心
在详细介绍GV100和Volt a架构相关架构设计之前,我们先来了解下GV100核心有关工艺、晶体管数量和规格方面的内容。
工艺和尺寸:台积电12nmFFN,815㎜2
根据官方资料,NVIDIA的GV100芯片采用的是台积电的12nmFFN工艺。对于新工艺,目前官方消息不多。考虑到台积电在之前10n m工艺的信息披露中宣称10n m才是全面更新的节点,因此有理由相信台积电在20nm、16nm、12nm的三种工艺上使用了基本相同的掩模,其主要进步在FinFET的引入和后期不断的优化上,包括鳍片尺寸、单元距离、栅极距离等更为微观的内容以及库文件的优化等。因此,业内普遍认为台积电的12nm FFN是台积电对16nm工艺的进一步深入优化版本,毕竟16nm已经从2015年用到了现在。另外,FF代表的是FinFET,“N”则指的是专门为英伟达优化的版本。
为什么要为NVIDIA专门推出一个版本呢?这是因为GV100核心实在是太大了,它的晶体管数量高达221亿,封装面积高达815㎜2,远超历史上几乎所有民用处理器,要知道之前已经被称作芯片之王的G P100核心面积也不过610㎜2。从历史来看,NVIDIA触碰600㎜2的机会非常稀少,早期的GT200面积约为580㎜2,Fermi面积也基本相当。从工艺和制造角度来说,芯片面积增大将带来巨大的风险和严重降低的良率,NVIDIA在早期基本上不触碰600㎜2的红线,就是因为超过这条线后良率可能无法控制。本次GV100带来了史上最大的221亿晶体管和超过800㎜2的巨大面积,意味着其产量不可能太大并且价格更是昂贵到惊人。
规模:5376个CUDA核心和新加入的672个张量单元
在半导体业界,巨大的核心面积、晶体管数量只意味着一个结果,那就是超大的规模。这一点在G V100上显示得淋漓尽致。首先来看计算模块,根据官方资料,GV100核心拥有6个GPC,每个GPC内部拥有7个TPC,每个TPC拥有2个SM模块,整个GV100拥有84个SM模块。进一步细分,每个SM模块中拥有64个FP32的单元、64个INT32单元、32个FP64单元以及新加入的8个张量(Tensor)单元,此外还有4个纹理单元。因此完整版本的GV100核心就拥有5376个FP32单元、5376个INT32单元、2688个FP64单元,672个张量单元以及336个纹理单元。
在内部存储模块方面,GV100设计了共享的128KB可配置L1数据缓存,L2缓存方面高达6MB,几乎可以赶上传统CPU的缓存了。在外部存储单元上,GV100设计了八个512bi t的内存控制器,配合HBM2显存,组成了4096bit的规模,搭配8颗每颗2GB共16GB、1.75G H z的H B M2颗粒时,带来了约900GB/s的显存带宽,也是目前带宽最大的GPU。
从架构上来看,GV100核心的主要晶体管耗费除了规模更大的FP32和F P64核心部分外,主要用于容量更大功能更丰富的缓存、新加入的INT32单元和张量单元等方面。在计算能力方面,GV100的实际产品Tesla V100双精度计算能力高达7.5TFlops,单精度则翻倍至15TFlops,半精度30TFlops,相比Pascal架构最强的Tesla P100提高了约41.5%,计算能力暴增。在深度学习计算能力方面,由于新加入的张量核心,Tesla V100的理论峰值张量计算能力高达125Tensor TFlops,远超目前市面所有产品。
功耗和实际产品
目前NVIDIA在Volta架构上推出了两款单卡产品,分别是T I TAN V和Tesla V100,其他还有DGX-1的Tesla V版本。只看单卡产品的话,TITAN V和Tesl a V100的功耗控制相当出色,最高不超过300W,其中Tesla V100还可以通过使用功率限制的方式来大幅度降低功耗的同时尽可能少的损失性能。Tesla V100提供了最高性能模式和最高能耗模式,前者将持续运行在300W的最大TDP功耗下,性能也是最出色的;后者则运行在50%~60%TDP模式下,但是能够提供75%~85%的性能。值得一提的是,目前NVIDIA发布的GV100的产品包括Tesla V100和TITAN V都并非完全版本的GV100芯片,都经过部分的屏蔽以提高早期良率。未来NVIDIA可能在良率表现改善后推出全规格的产品,不过价格很可能更为昂贵。
深入解读Volta架构
由于产品规模更大、计算能力更强,因此在设计如此大规模芯片时需要仔细平衡性能和功耗、效率等内容。对于这一点,Volta架构在SM核心上主要有下列优点:全新加入的张量核心,理论拥有125 Tensor TFlops计算能力(Tesla V100数据);在进行通用计算时高达50%的能效比提升;增强的高性能L1数据缓存;全新的SIMT线程模型架构,能够避免之前SIMT和SIMD架构设计的局限性。
在架构设计方面,Volta架构的每个SM被划分为4四个区块,每个区块包含16个FP32计算单元、8个FP64计算单元、16个INT32计算单元、2个新的混合精度张量单元和一个新的L0指令缓存、1个warp调度器、1个调度单元和1个64KB文件寄存器。相比之下,上代Pascal架构中,GP100核心的每个SM只有2个区块,每个区块包含了32个FP32计算单元、16个FP64计算单元、1个指令缓冲区、1个war p调度器、2个调度单元和一个128KB的文件寄存器。
对比Pascal架构的SM单元,Volta架构SM的每个区块更“小”,规模大约是Pascal架构的一半,这样有利于进行更细粒度的调用从而提高效率,同时全新的L0指令缓存的加入也会显著提高指令效率。另外,由于共享存储单元和L1的合并,使得每个S M拥有96K B的缓存可供调用,远大于Pascal架构的64KB,考虑到两代架构S M在F P能力上基本相当,这意味着Volta拥有更充裕的缓存资源。
全新加入的张量单元
在目前深度学习神经网络计算中,张量单元的计算主要采用了FMA也就是乘加的计算方法。比如D=A×B+C,D的格式为FP16或者FP32,A和B都是FP16,C是FP32。在拥有大量类似计算的情况下,NVIDIA加入的张量单元专门为乘加计算进行加速,带来了非常惊人的张量Flops。
以Tesla V100为例,其中包含了640个张量单元,每个SM中包含8个,总计有80个SM内核。每个张量单元每个时钟周期可以进行64位浮点的FM A操作,8个张量单元也就是一个SM一个时钟周期可执行512个FMA操作,或者1024个独立浮点操作,这个数据反映在Tesla V100上,就是每周期峰值计算能力为125Tensor TFlops。相比之下,传统的Pascal架构的Tesla P100采用标准的FP32对其进行计算,每周期峰值效能大约只有Tesla V100的1/12,也就是大约10.5TFlops(Tesla P100的单精度浮点计算能力,需要G PU全速运转),这样的性能是指在模型训练阶段。如果是推理阶段,由于FP16操作大量加入,Tesl a V100相对Tesla P100的峰值性能倍数会下降至6倍,依旧非常夸张。
当然,上述数据表明的都是理论峰值计算的能力,实际上在应用中并不会达到如此夸张的倍数增加,因为实际应用的计算要更复杂,张量单元并不会全程参与,还有其他的一些计算需要GPU甚至CPU加入,因此综合来看,在单精度矩阵乘法计算较多的应用中,支持张量单元的CUDA 9的Tesla V100在实际计算中性能大约是支持CUDA 8的Tesla P100的1.8倍;如果是训练和推理操作使用的是半精度矩阵乘法(比如FP16输入和FP32累加的矩阵计算),那么由于张量单元的加持,这个性能差距会提高到9倍以上。在更极端的情况下,比如计算4×4矩阵乘法计算,生成4×4输出矩阵,那么Volta架构将发挥最强大的加速能力,相比Pascal架构性能提高12倍左右。
全新加入的张量单元带来了强大的加速能力,那么功耗表现是不是很夸张呢?根据NVIDIA介绍,他们通过底层数学上的优化,使得张量单元非常省电。一般来说,这种大量承接某类计算的模块容易使用固定单元完成,效率极高但可编程能力比较弱,考虑到深度学习计算的需求,放置在GPU中可谓相得益彰。不仅如此,NVIDIA还为张量单元部分加入了时钟门控,在单元静默的时候可以通过时钟门控降低单元频率甚至关闭它来节约能耗。不过,张量单元对传统的图形计算来说是没有任何帮助的,很可能在面向图形的GeForce和Quadro产品中被彻底取消。
可同时执行FP和INT指令
之前的帕斯卡架构上,SM单元中只设计了FP单元,没有加入INT单元,因此不能同时执行FP和INT计算。但是在Volta架构上,每个SM单元中都有独立的FP单元和INT单元,允许用户以全吞吐量同时执行FP32和INT32操作,同时提高了指令发送的吞吐量。另外,在计算FMA时延迟也得到了降低,帕斯卡架构需要6个时钟周期,但是伏打架构只需要4个,降低了50%。借助于新加入的INT32单元,对一些包含有整数计算(指针计算或整数存储器地址计算)和浮点计算内部循环的应用程序而言,在一个迭代周期内可以同时计算新的地址、FP数据同时为下一次迭代计算加载数据,效率与性能大幅度提升。
增强的L1数据缓存、共享存储在NVIDIA之前的产品中,更快的共享存储和更方便的L1数据缓存是分开设计的,但是在Volta架构上,这两个缓存被合并为增强型L1数据缓存,总容量为每SM 128KB,是Pascal架构的SM L1缓存容量的7倍以上,并且整体使用方式也非常灵活,比如根据不同的应用场合可以将其调整为64KB L1数据缓存或者64KB共享缓存,或者在计算应用中全部将其设置为L1数据缓存,非常方便。
除了容量上的灵活操作外,对使用L1缓存的应用来说,缓存的延迟和带宽都得到了改善,高带宽访问和低延迟访问都能够更高效运行。另外,共享存储的带宽更高、延迟更低并且不存在缓存未命中情况,需要程序员对其进行手动配置,过程比较复杂。通过Volta架构全新的设计,缩小了使用共享内存的应用程序与直接访问设备内存数据的应用程序之间在性能上的差距,使其更为平衡,程序员可以更方面大胆的使用L1缓存而不用太担心性能的损失了。
在实际的性能测试中,当应用程序代码不访问共享内存转而使用L1数据缓存时,在Volta架构上的性能损失大约为7%,而Pascal架构则损失了30%。这意味着尽管共享内存可以实现更高性能,但新的Volta L1缓存可以在损失少部分性能的情况下大大降低程序工作的难度。总的来看,Volta架构增强的L1缓存设计,不但提高了性能,还简化了编程,同时降低了程序员在性能调优上的工作负荷,是一举多得的设计方案。
第二代NVLink总线
NVLink总线在Pascal架构上首次出现,这也是NVIDIA首次自定义系统级别高速总线。NVLink的主要作用是用于CPU和GPU之间、GPU和GPU之间的高带宽、高速度、低延迟连接。相比传统的PCI-E总线,NVLink有着更高的带宽和更强大的性能。
在Volta上,NVIDIA推出了第二代NVLink,可以提供更高的连接速度、更多的G P U连接和更出色的缓存一致性、可伸缩性等。
在带宽方面,第二代NVLink相比前代产品提升了25%,从之前的每链路单向带宽的20Gb/s提升至25Gb/s。最大支持链路数量从4个增加到6个,因此总计可以提供最多300Gb/s的双向带宽。更多的链路允许配置更多的GPU连接,比如8个GPU之间的高速连接,或者CPU和G PU之间更快速的通讯等。在功能方面,第二代NVLink允许CPU直接对每个GPU的HBM2显存直接读取或进行Atom操作,并支持内存一致性,也支持CPU将图形内存中的数据存储在CPU Cache中方便CPU快速处理。另外,新的NVLink还加入了对地址转换服务(ATS)的支持,允许G PU直接访问CPU的页表。在功耗方面,NVLink加入了低功耗模式,可以在没有工作的情况下进入休眠模式,节约能耗的同时提升性能功耗比。第二代NVLink总线在加强带宽的同时还加入了不少新功能,这能够显著降低多GPU的系统延迟并提升其性能,尤其是在计算密度较高的应用中将非常有效。
独立的线程调配设计
在硬件部分介绍完成后,Volta架构在软件方面的设计也非常值得一提。其中最重要的就是独立显存调配设计功能,这也是前文提到的“全新的SIMT线程模型架构,能够避免之前SIMT和SIMD架构设计的局限性”的详细解释。
在之前的Pascal架构或者更早的架构中,NVIDIA的GPU都是以SIMT方式执行一组32个线程的。以Pascal架构为例,Pascal架构的一个warp包含32个线程,共享一个程序计数器,使用一个活动掩码来确定线程是否正在运行。这意味着如果存在操作的分支,执行路径会呈现发散的状态,这样不同分支的线程就会缺乏并发性除非重新同步。缺乏并发性的线程可能存在无法交换数据、运行不一致以及线程分歧等,容易导致死锁问题的出现。这就意味着程序员需要尽量少的使用细粒度的同步,或者依靠无锁算法等来避免发生这样的问题。
在Volta架构架构上,这样的问题得到了改善。Volta架构通过在所有线程之间实现相等的并发性来防止这类问题的出现,每个线程都有自己的程序计数器和调用堆栈。在实际操作中,Volta架构的独立线程调度器允许GPU执行任何线程,也允许一个线程等待另一个线程产生数据。不仅如此,Volta架构还设计了进度优化器,这个优化器的作用是确定如何将来自同一个warp的活动线程一起分组到SMIT中再同时并发出去,这样既保留了SMIT的高吞吐量,又实现了比较高的灵活性。另外,如果需要的话,程序可以使用显式同步来重新令warp中的线程收敛,操作非常灵活方便。
独立线程设计的出现,使得Votla架构在面对分支操作时更游刃有余,这大大增强了GPU在面对不同类型计算时的灵活性,在很大程度上提高了G PU的整体效能,使得G PU在面向更多样化的通用计算时有更出色的表现。
面向计算,深度学习的专属武器
从NVIDIA最近数代产品发展来看,在进入Kepler架构后,NVIDIA在产品规划上越来越重视计算性能了,表现最明显的就是Volta架构,面向计算而生,特点就是大幅度提升了双精度性能、加入了张量单元、加强了深度学习神经网络计算的能力。毫不夸张地说,从其高昂的售价和特色的功能来看,图形功能只是Volta架构的功能的一部分,更重要的部分反而是深度学习和通用计算市场。这和之前GPU主要以Graphic为主,以General为辅的情况大相径庭。Vol ta架构是面向计算的产品,是深度学习的专属武器。
出现这种情况的原因一是目前NVIDIA在游戏市场上基本处于垄断地位,竞争对手的弱势无法给其带来更强大的压力,因此可以在掌控市场节奏的情况下,将资源转移至更富有利润的市场。二是目前深度学习和通用计算市场刚刚打开,庞大的利润和极高的增长空间让NVIDIA不得不重新权衡产品重心。毫不夸张的说,伴随着深度学习和通用计算市场的进一步成长,未来NVIDIA极有可能推出无图形处理能力的专用计算芯片,专门面向计算市场,图形市场则交给传统GPU部门完成,彻底变成“双头鹰”架构,互不干扰的完成市场的扩张和占领。届时,GPU一词的含义,也将包含Graphic Process Unit和General Process Unit,不再唯一。
对游戏玩家而言,Volt a架构目前的产品是几乎不存在选择意义的,Tesla V100纯粹是计算卡无法使用,新的TITAN V高昂的售价和目前的情况显然更偏向的是专业和企业用户。虽然各大测试都显示TITAN V的性能比目前TITAN Xp要高出20%~30%,但这显然不是一张815㎜2芯片的真正实力(壕用户请随意)。游戏玩家唯一的希望就是明年NV IDI A是否会推出Volta架构的GeForce产品,去掉了双精度单元和张量单元,保留了大部分伏打架构精髓的全新芯片,按照惯例,首发产品应该是GV104,性能如果能持平GTX 1080Ti那就再好不过了。
TIPS
什么是张量(Tensor)?张量和深度学习的关系是什么?
从GV100的规格和计算能力可以看出,包括单精度、双精度等计算能力统计都是基于传统的FP32、FP64核心的,而全新加入的张量核心性能则是单独计算的。那么,张量是什么?为什么要加入张量核心呢?
为了轻松理解张量的含义,不妨先看看什么是标量、矢量(向量)。标量我们都很熟悉了,就是一个单纯的数值,没有正负和方向之分,这意味标量可以在一维空间中直接定位表示。矢量就更好理解了,就是有方向的数量,矢量可以在二维空间中表示。相比之前的矢量中的“矢”,张量中的“张”存在了面和方向的概念,一个存在面积和方向的物体,最起码需要三维空间才可以表示,也就是说张量表示的是维度更多的量。平面的张量被称作二维张量,可以看做一个面,还存在体积概念的三维张量和计算更复杂的四维、五维张量,根据不同的计算需求有独特的计算方法。张量的优势简单来说就是能表达更复杂、更高阶的量,在物理学中张量被定义为一个可以在不同参考系下按照某种特定法则进行变换的量。既然张量可以用来表达更复杂、更高阶的量,那么它自然也可以简化,0维张量就是标量,1维张量是矢量,2维张量的常见用法是矩阵等。
那么,张量和深度学习的关系是什么呢?我们知道,深度学习的算法是通过不断地对目标进行分层、抽象并提取特征进行计算和模型搭建的。举例来说,一张图片对人类来说存在着显著的意义的原因是大脑可以识别图像的内容,比如一个苹果的照片,人们先看到物体外形,再通过感受颜色尺寸、特征等,大脑判断其为苹果,甚至可以提取人脑对苹果香味的记忆。对计算机来说,一张苹果图片仅仅只是一堆RGB数值的像素矩阵,为了让电脑认识苹果,就需要对这一堆RGB像素矩阵进行处理,在经过不断的拆分和特征化后,得到了依旧是数值组成了矩阵(二维张量)或者更高阶的张量。这些数据会被送入计算机神经网络进行处理,再通过成千上万的图片的学习,最终建立模型。在模型的应用中,也需要对未知内容进行拆分和处理,使之成为张量数据,再和模型进行匹配和拟合,返回数据值用于确定未知图片是否存在目标。可见,无论是训练还是应用,张量都是深度学习神经网络计算的核心。夸张一些来说,目前的深度学习的神经网络算法就是将现实生活中的图片、声音、语言等数据,用张量的方式表达后进行处理的一种计算方法。
作为数组,张量的计算特点也表明了它适合于超大规模的并行计算处理(回想一下大学的线性代数矩阵计算),在这方面最出色的产品自然是GPU,GPU架构被认为是大规模并行计算最适合的硬件,在此之前深度学习计算大部分都是由GPU加速完成。但是,由于深度学习中张量计算的固定形态较多,在很多情况下专门针对矩阵(也就是二阶张量)计算进行优化的张量单元在计算固定形态数据是相比传统的GPUCore能够发挥出更出色的效能和更高的能耗比,谷歌的TPU张量处理器就是类似的例子。为此,NVIDIA也加入了张量单元对深度学习计算进行加速,希望在目前已有的市场优势下更进一步。
文、图/张平
