Tensor Core技术解析(下)
Tensor Core技术解析(下)
让FP16适用于深度学习
Volta的深度学习能力是建立在利用半精度浮点(IEEE-754 FP16)而非单精度浮点(FP32)进行深度学习训练的基础之上。
该能力首先由cuDNN 3支持并在Tegra X1的Maxwell架构中实现,随后原生半精度计算被引入Pascal架构并被称为“伪FP16”,即使用FP32 ALUs处理成对的FP16指令,理论上可以使每个时钟的FP16吞吐量增加一倍。这一特性实际上已经在Tensor Core处理寄存器中矩阵片段的过程中得到体现,其两个FP16输入矩阵被收集在8个FP16*2或16个FP16元素中。
就FP32与FP16而言,由于单精度浮点所包含的数据多于半精度浮点,因此计算量更大,需要更多的内存容量和带宽来容纳和传输数据,并带来更大的功耗。因此,在计算中成功使用低精度数据一直是穷人的圣杯,而目标则是那些不需要高精度数据的应用程序。

除了API/编译器/框架的支持之外,深度学习一直都有在使用FP16数据类型时损失精度的问题,这会让训练过程不够准确,模型无法收敛。
据雷锋网了解,NVIDIA以前也曾在类似的情况下推出过“混合精度”这一概念,在Pascal的快速FP16(针对GP100)和DP4A/DP2A的整数点积操作(针对GP102、GP104和GP106 GPU)中,就曾提出过类似的说法。

当时人们关注的是推理能力,就像Titan V的“深度学习TFLOPS”一样,Titan X(Pascal)推出了“44 TOPS(新型深度学习推断指令)”。新的指令对4元8位向量或2元8位/16位向量执行整数点积,从而得到一个32位整数积,可以与其他32位整数一起累积。

对于Volta的混合精度而言,重要的精度敏感数据(如主权重)仍然会存储为FP32;而Tensor Core的混合精度训练则会将两个半精度输入矩阵相乘得到一个精度乘积,然后累积成一个精度和。NVIDIA表示,在将结果写入内存之前,Tensor Core会将结果转换回半精度,这样当使用半精度格式时,寄存器和存储器中需要的数据更少,这有助于处理超大矩阵中的数据。

FP16与FP32所包含的数据空间并不相同,归一化方法可以解决FP32格式数据超出FP16可表示范围的问题。举个例子,许多激活梯度的值都落在FP16的范围之外,但由于这些值聚集在一起,因此将损耗乘以缩放因子便可以移动FP16范围内的大部分值。在完成最终的权重更新之前,将梯度重新缩放到原始范围,便可以维持其原始的精度。

不过,并非所有的数学、神经网络和层都适用于FP16,通常FP16和Tensor Core的混合精度最适合卷积和RNN重图像处理等,而对于不适合的神经网络框架或类型,FP16将默认禁用或不推荐使用。
内存改进,SM变化
使用Tensor Core处理混合精度数据似乎可以减轻内存带宽问题,但事实证明,尽管Volta在几乎所有方面都得到了内存子系统的增强,但幅度并不明显。
首先,Volta有一个12 KB的L0指令缓存,虽然Pascal及其他之前的GPU核心也有指令缓存,但Volta更高效的L0是子核心SM分区私有的,因此它对warp调度器来说也是私有的,这对Volta架构更大的指令大小是一种补偿,并有可能为支持Tensor Core通道的框架做出贡献。同时Volta指令延迟也要低于Pascal,特别是核心FMAs从6个周期减少到了4个周期。

随着每个SM中调度器比例的增加,砍掉第二个调度端口似乎是对具有独立数据路径和数学调度单元的子核心的权衡。而具备FP32/INT32执行能力,也为其他低精度/混合精度模型打开了大门。这些子核方面的增强,都是为了优化Tensor Core阵列。
另一个重大变化是合并L1缓存和共享内存。在同一个块中,共享内存可配置为每SM 最高96 KB。HBM2控制器也进行了更新,其效率提高了10~15%。

深度学习基准测试
深度学习从框架到模型,再到API和库,AI硬件的许多部分都是高度定制化的,这样的新领域有时会让人非常难以理解。
俗话说“光说不练假把式”,实践永远是检验真理的唯一标准。对计算机来说,介绍的再详细也不如真刀真枪跑一下测试,没有什么比benchmark更能提现硬件的实际表现了。
随着ImageNet和一些衍生模型(AlexNet、VGGNet、Inception、Resnet等)的影响,ILSVRC2012(ImageNet大规模视觉识别挑战)中的图像数据集训练逐渐被行业所认可。现在基本上所有深度学习框架都支持CUDA和cuDNN,对于Volta而言,支持FP16存储的框架也都支持Tensor Core加速,启用FP16存储后Tensor Core加速会自动启用。
Tensor Core技术解析(下)的更多相关文章
- Tensor Core技术解析(上)
Tensor Core技术解析(上) NVIDIA在SIGGRAPH 2018上正式发布了新一代GPU架构--Turing(图灵),黄仁勋称Turing架构是自2006年CUDA GPU发明以来最大的 ...
- NVIDIA深度学习Tensor Core性能解析(下)
NVIDIA深度学习Tensor Core性能解析(下) DeepBench推理测试之RNN和Sparse GEMM DeepBench的最后一项推理测试是RNN和Sparse GEMM,虽然测试中可 ...
- NVIDIA深度学习Tensor Core性能解析(上)
NVIDIA深度学习Tensor Core性能解析(上) 本篇将通过多项测试来考验Volta架构,利用各种深度学习框架来了解Tensor Core的性能. 很多时候,深度学习这样的新领域会让人难以理解 ...
- dom技术解析xml下jaxp解析器详细代码
1.使用jaxp实现查询操作 person.xml <?xml version="1.0" encoding="UTF-8" standalone=&qu ...
- 知识全聚集 .Net Core 技术突破 | 简单说说工作单元
知识全聚集 .Net Core 技术突破 | 简单说说工作单元 教程 01 | 模块化方案一 02 | 模块化方案二 其他教程预览 分库分表项目实战教程 Git地址: https://github.c ...
- ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现
很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地 ...
- 干货|爱奇艺CDN巡检系统技术解析
小结: 1. 中心处理系统 /1/将定制后的巡检任务拆分,通过配置与任务分发系统.CMDB*( configuration management database)将派发到边缘拨测系统/2/处理边缘拨 ...
- 现代前端技术解析:Web前端技术基础
最近几年,越来越多的人投入到前端大军中:时至至今,前端工程师的数量仍然不能满足企业的发展需求:与此同时,互联网应用场景的复杂化提高了对前端工程师能力的要求,一部分初期前端工程师并不能胜任企业的工作 ...
- NET Core Web API下事件驱动型架构CQRS架构中聚合与聚合根的实现
NET Core Web API下事件驱动型架构在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件 ...
随机推荐
- 【aws-系统】简单的SNS到电报通知机器人
动机 我已经使用此设置几个月了,这是我的用例: 预定的提醒.我有一些安排好的CloudWatch Events,以提醒我有关各种日常活动以及我从文章和书籍中保存的想法数据库中的随机推销的信息. 应用程 ...
- hdu4450 不错的贪心
题意: 卡片游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total S ...
- UVA10970大块巧克力
题意: 题意,给你一块n*m的巧克力,最终是要把他切成n*m快小蛋糕,问最小切多少刀?每一刀只能把一个整体切成两个整体,不可以把两个整体分成四个整体,就是说只能切一个地方. 思路: ...
- html个人笔记
HTML 1.1常用编辑器 dreamweaver.sublime.webstorm.Hbuilder.vscode 1.2 浏览器内核 分为渲染引擎和JS引擎 渲染引擎:它负责取得网页的内容(HTM ...
- 【python】Leetcode每日一题-笨阶乘
[python]Leetcode每日一题-笨阶乘 [题目描述] 通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积.例如,factorial(10) = 10 * 9 * 8 * 7 * 6 ...
- GUI基础知识点
简介 GUI的核心技术:AWT(是Swing 的前身) Swing 不流行的原因 界面不美观 运行需要jre环境(可能一个项目的大小比jre还要大) 为什么我们需要学习 了解MVC架构和监听 AWT ...
- 基于queue的python多进程日志管理
在我们的异常检测应用中,需要对每组IoT设备分别训练一个模型,每个模型对一组设备的指标数据进行实时异常检测.方案采用master-worker+消息队列的方式实现模型对外服务,但是每个worker的日 ...
- python工业互联网应用实战15-前后端分离模式1
我们在13章节里通过监控界面讲了如何使用jquery的动态加载数据写法,通过简单案例来说明了如何实现动态的刷新监控界面的数据,本章我们将演示如何从Django模板加载数据逐步演化到前后端分离的异步数据 ...
- [并发编程 - 多线程:信号量、死锁与递归锁、时间Event、定时器Timer、线程队列、GIL锁]
[并发编程 - 多线程:信号量.死锁与递归锁.时间Event.定时器Timer.线程队列.GIL锁] 信号量 信号量Semaphore:管理一个内置的计数器 每当调用acquire()时内置计数器-1 ...
- Jmeter(四十五) - 从入门到精通高级篇 - Jmeter之网页爬虫-上篇(详解教程)
1.简介 上大学的时候,第一次听同学说网页爬虫,当时比较幼稚和懵懂,觉得就是几只电子虫子爬在网页上在抓取东西.后来又听说写代码可以实现网页爬虫,宏哥感觉高大上,后来工作又听说,有的公司做爬虫被抓的新闻 ...