收藏本页 | 设成首页 | 联系我们
   欢迎光临北京百格威视网站!

深度 | 英伟达深度学习Tensor Core全面解析


AI科技评论消息,不久前,NVIDIA在SIGGRAPH 2018上正式发布了新一代GPU架构——Turing(图灵),黄仁勋称Turing架构是自2006年CUDA GPU发明以来最大的飞跃。Turing架构的两大重要特性便是集成了用于光线追踪的RT Core以及用于AI计算的Tensor Core,使其成为了全球首款支持实时光线追踪的GPU。

说到AI计算,NVIDIA GPU成为最好的加速器早已是公认的事实,但将Tensor Core印上GPU名片的并不是这次的Turing,而是他的上任前辈——Volta。


基于Volta架构的Titan V是NVIDIA在计算领域成就的集大成者。深度学习和神经网络已成为NVIDIA GPU的背后驱动力,作为最先进的计算加速器,它集成了用于机器学习操作的内置硬件和软件加速,深度学习能力完全可以被当做Titan V和Volta的名片。



Titan V与初代基于开普勒的GeForce GTX Titan已经相去甚远,初代Titan的定位是一款万能显卡,既可作为游戏发烧友的旗舰游戏显卡,也为专业消费者提供全双精度浮点(FP64)计算能力。在Titan V诞生之前,Titan产品线几乎都是基于这种设计方法,一颗巨大的GPU核心是NVIDIA“高大全”设计思路的最好代表。



与Pascal及更早期的产品均使用面向PC设计的GPU以及常规GDDR5(x)显存不同,NVIDIA这次选择了一颗规模巨大、产量和良品率都不高的服务器级芯片,有大量的晶体管被花费在了非图形功能上(即Tensor Core),这是NVIDIA在计算领域押下的赌注,NVIDIA已经不满足于只在传统图形计算卡和通用计算方面处于领先地位。



由于是首次分析GPU的深度学习性能,所以目前市面上还没有确定一套标准的基准测试,特别是对于Volta独特的张量内核和混合精度功能。对于Titan V,我们将使用百度DeepBench、NVIDIA的Caffe2 Docker、Stanford DAWNBench和HPE深度学习基准套件(DLBS)来测试。



但是在深入研究这些测试数据之前,我们首先会对深度学习、GPU、Volta微架构以及深度学习性能基准进行一些背景介绍。

GPU与深度学习

首先要说明的是,虽然“机器学习”或更通用的“AI”有时可互换用于“深度学习”,但从技术上讲,它们各自指的是不同的东西,机器学习是AI的子集,深度学习则是机器学习的子集。



深度学习是因“深度神经网络”(Deep Neural Networks)而得名,其最终被设计为识别数据中的模式,产生相关预测,接收关于预测准确度的反馈,然后基于反馈进行自我调整。计算发生在“节点”上,“节点”被组织成“层”:原始输入数据首先由“输入层”处理,“输出层”推出代表模型预测的数据。两者之间的任何一层都被称为“隐藏层”,而“deep”则代表着深度神经网络有许多隐藏层。


这些隐藏层可以在不断增加的抽象层次上运行,使得它们甚至可以从复杂的输入数据中提取和区分非线性特征。一个标准的例子是图像识别,其中初始层寻找某些边缘或形状,这通知后面的层寻找鼻子和眼睛,之后的层可能寻找面部。最后的图层组合了所有这些数据以进行分类。


随着输入数据在模型中向前推进,计算包括特殊的内部参数(权重),最后会产生一个表示模型预测与正确值之间误差的损失函数。然后使用此错误信息反向运行模型以计算将改善模型预测的权重调整,该前向和后向传递(或反向传播)序列包括单个训练迭代。


对于推断来说,这个过程自然地排除了反向传递,最终需要的计算强度比训练模型更小。从这个意义上说,推断也不太需要像FP32这样高的精度,并且可以对模型进行适当的修剪和优化,以便在特定的设备上部署。然而推断设备对延迟、成本和功耗变得更加敏感,尤其是在边缘计算的场景下。

卷积神经网络(CNN)和递归神经网络(RNN)是深度神经网络的两个重要子类型。卷积本身是一种操作,将输入数据和卷积核结合起来形成某种特征映射,转换或过滤原始数据以提取特征。


CNN通常是“前馈”的,因为数据在没有循环的情况下流过各层。而对于RNN(以及像LSTM和GRU这样的变体)来讲,每次计算后都会有一个单独的权重循环回自身,给网络一种“记忆”感,这让网络能够做出有时间意识的预测,在文本分析等场景中很有用。


由于深度学习数学可以归结为线性代数,因此某些操作可以重写为对GPU更友好的矩阵乘法。当NVIDIA首次开发并公布cuDNN时,其中一个重要实现就是将算法降级为矩阵乘法以加速卷积。多年来cuDNN的发展包括“预先计算的隐式GEMM”卷积算法,它恰好是触发Tensor Core卷积加速的唯一算法。


剖析Tensor Core


在关于Volta混合精度Tensor Core的几个谜团中,一个比较烦人的问题是4×4矩阵乘法的能力。Tensor Core是一种新型处理核心,它执行一种专门的矩阵数学运算,适用于深度学习和某些类型的HPC。Tensor Core执行融合乘法加法,其中两个4*4 FP16矩阵相乘,然后将结果添加到4*4 FP16或FP32矩阵中,最终输出新的4*4 FP16或FP32矩阵。

NVIDIA将Tensor Core进行的这种运算称为混合精度数学,因为输入矩阵的精度为半精度,但乘积可以达到完全精度。碰巧的是,Tensor Core所做的这种运算在深度学习训练和推理中很常见。

Tensor Core虽然在GPU里是全新的运算单元,但其实它与标准的ALU(算术逻辑单元)流水线并没有太大差别,只不过Tensor Core处理的是大型矩阵运算,而不是简单地单指令流多数据流标量运算。Tensor Core是灵活性和吞吐量权衡的选择,它在执行标量运算时的表现很糟糕,但它可以将更多的操作打包到同一个芯片区域。


Tensor Core虽然有一定的可编程性,但仍然停留在4*4矩阵乘法累加层面上,并且不清楚累积步骤是如何以及何时发生的。尽管被描述为进行4*4矩阵数学运算,但实际上Tensor Core运算似乎总是使用16*16矩阵,并且操作一次跨两个Tensor Core进行处理。这似乎与Volta架构中的其他变化有关,更具体地说,与这些Tensor Core是如何集成进SM中有关。

对于Volta架构,SM被划分为四个处理块或子核。对于每个子核,调度器每个时钟向本地分支单元(BRU)、Tensor Core阵列、数学分派单元或共享MIO单元发出一个warp指令,这就首先阻止了Tensor运算和其他数学运算同时进行。在利用两个Tensor Core时,warp调度器直接发出矩阵乘法运算,并且在从寄存器接收输入矩阵之后,执行4*4*4矩阵乘法。待完成矩阵乘法后,Tensor Core再将得到的矩阵写回寄存器。

在Tensor Core执行实际指令时,即使在使用NVVM IR(LLVM)的编译器级别上,也仅存在用于warp级矩阵操作的本征,对于CUDA++和PTX ISA,warp级别仍然是唯一级别。加载输入矩阵的形式是每个扭曲线程持有一个片段,其分布和身份均未指定。从广义上讲,它遵循标准CUDA核心的基于线程级别拼接的GEMM计算的相同模式。

版权所有: 北京百格威视科技有限公司所有

联系电话: 010-82569760 传真: 010-82569761

地址: 北京市海淀区苏州街3号大河庄苑6号楼508室

京ICP备19005879号-1