基于NVIDIA GPUs的深度学习训练新优化

New Optimizations To Accelerate Deep Learning Training on NVIDIA GPUs

不同行业采用人工智能的速度取决于最大化数据科学家的生产力。NVIDIA每月都会发布优化的NGC容器,为深度学习框架和库提高性能,帮助科学家最大限度地发挥潜力。英伟达持续投资于全数据科学堆栈,包括GPU架构、系统和软件堆栈。这一整体方法为深度学习模型训练提供了最佳性能,正如NVIDIA赢得了提交给MLPerf的所有六个基准,MLPerf是第一个全行业的人工智能基准所证明的那样。NVIDIA在最近几年引入了几代新的GPU架构,最终在Volta和Turing GPU上实现了Tensor核心架构,其中包括对混合精度计算的本地支持。NVIDIA在MXNet和PyTorch框架上完成了这些记录,展示了平台的多功能性。流行的深度学习框架中的自动混合精度通过向应用程序中添加一行或两行代码,在张量核心上提供3倍的更快的训练性能。在“自动混合精度”页上了解更多信息。

事实证明,NeurIPS 2018大会是深入学习科学家了解NVIDIA优化容器最近的一些重大性能改进的好时机,这些改进可以加速各种深度学习模型。让看看对NVIDIA GPU Cloud(NGC)deep learning framework容器和关键库的最新18.11版本的改进。新版本建立在早期的增强之上,可以在Volta Tensor Core GPU中阅读到,实现了新的AI性能里程碑。

Optimized Frameworks

MXNet

这一最新版本提高了大规模训练深度学习模型的性能,其中GPU训练性能在大批量范围内优化是至关重要的。如研究所示,在最终达到的训练精度开始下降之前,所有处理器的总训练批大小都存在限制。因此,当扩展到大量GPU时,一旦达到总的批大小限制,添加更多的GPU将减少每个GPU处理的批大小。因此,对18.11 NGC容器中的MXNet框架进行了一些改进,以优化各种训练批大小的性能,尤其是较小的,而不仅仅是较大的批大小:

随着批处理大小的减小,每次训练迭代与CPU同步的开销也随之增加。以前,MXNet框架在每次操作后都会将GPU与CPU同步。当使用每个GPU的小批量训练时,这种重复同步的开销会对性能产生不利影响。改进了MXNet,在与CPU同步之前将多个连续的GPU操作积极地组合在一起,减少了这一开销。

引入了新的融合运算符,如BatchNorm ReLU和BatchNorm Add ReLU,消除了不必要的GPU内存往返。这通过在执行批处理规范化的同一内核中执行简单的操作(例如elementwise Add或ReLU)来提高性能,而不需要额外的内存传输。这些特别适用于大多数现代卷积网络架构的图像任务。

以前,SGD优化器更新步骤是调用单独的内核来更新每个层的参数。新的18.11容器将多个层的SGD更新聚合到单个GPU内核中,以减少开销。当使用Horovod运行MXNet进行多GPU和多节点训练时,MXNet运行时会自动应用此优化。

NVIDIA通过对MXNet进行这些改进,实现了世界上最快的解决方案时间,ResNet50 v1.5的MLPerf为6.3分钟。

当使用18.11 MXNet容器在单个Tesla V100 GPU上使用Tensor Core混合精度训练批大小为32的ResNet-50时,这些优化使吞吐量达到1060个图像/秒,而使用18.09 MXNet容器时,吞吐量为660个图像/秒。

可以在这里找到最新的性能结果。

与Amazon和MXNet开发社区密切合作,集成了流行的Horovod通信库,以提高在大量gpu上运行时的性能。Horovod库使用NVIDIA集合通信库(NCCL),包含了处理分布式参数的allreduce方法。这就消除了本机MXNet分布式kvstore方法的性能瓶颈。

目前正在合并对上游MXNet和Horovod存储库的改进,以便用户社区能够从这些改进中受益。

TensorFlow

TensorFlow NGC容器包含最新版本的TensorFlow 1.12。这为实验性XLA编译器实现的GPU性能提供了重大改进。谷歌在最近的博客中概述了XLA,包括如何启用说明。XLA通过将多个操作融合到一个GPU内核中,消除了对多个内存传输的需要,显著提高了性能,从而显著提高了速度。XLA编译器在这个时候是实验性的,在Google博客文章中概述了一些注意事项。然而,谷歌的内部模型与gpu相比,性能有望提高3倍。

此外,18.11 NGC Tensorflow容器集成了最新的TensorRT 5.0.2,使数据科学家能够轻松地部署训练模型和优化的推理性能。TensorRT解决了推理性能的具体挑战。高效地执行具有低延迟的小批量,直到批量大小为1。TensorRT 5.0.2支持低精度数据类型,如16位浮点或8位整数。

另一方面,NVIDIA为分析器提供了对CUDA应用程序性能的强大洞察。然而,虽然这些概要文件提供了大量关于应用程序低级性能的数据,但是对于TensorFlow用户来说,往往很难解释。这是因为概要文件不会将其输出与TensorFlow用户构建的原始图关联起来。增强了TensorFlow的图形执行器(使用NVIDIA profiler NVTX扩展)以将标记发送到用CUDA profiler(如nvprof)收集的配置文件中,简化了性能分析。

这些标记显示了每个图操作符所花费的时间范围,并且可以被高级用户用来轻松地识别计算内核及其相关的TensorFlow层。以前,概要文件只显示内核启动和主机/设备内存操作(运行时API行)。现在,TensorFlow将标记添加到概要文件中,并使用与TensorFlow图相关的有意义的名称,如图1所示。这允许用户将GPU执行概要文件事件映射到其模型图中的特定节点。

Figure 1. Screenshot of profiler showing annotated ranges for GPU operations

PyTorch

英伟达与Pythorch开发社区密切合作,不断提高在Volta Tensor Core GPU上训练深度学习模型的性能。Apex是Pythorch的一组轻量扩展,由NVIDIA维护以加速训练。目前正在对这些扩展进行评估,以便直接合并到主PyTorch存储库中。然而,PyTorch NGC容器是由Apex实用程序预先构建的,因此数据科学家和研究人员可以很容易地开始使用。在这个博客中了解更多关于Apex功能的信息。除了Apex最初附带的自动混合精度实用程序和分布式训练包装器之外,最近还添加了一些面向性能的实用程序。

首先,添加了一个新的Adam优化器的融合实现。现有的默认PyTorch实现需要多个进出GPU设备内存的冗余通道。这些冗余的传递会产生很大的开销,特别是在以数据并行方式跨多个gpu扩展训练时。Apex中的融合Adam优化器消除了这些冗余通道,提高了性能。例如,使用fused Apex实现的NVIDIA优化版变压器网络比PyTorch中的现有实现提供了5%到7%之间的端到端训练加速。对于谷歌神经机器翻译(GNMT)的优化版本,所观察到的端到端加速比从6%到高达45%(对于小批量大小)。

接下来,添加了层规范化的优化实现。对于相同的转换网络,Apex的层规范化在训练性能上提供了4%的端到端加速。

最后,扩展了分布式数据并行包装器,用于多GPU和多节点训练。这包括显著的引擎盖下性能调整,以及新的面向用户的选项,以提高性能和准确性。一个例子是“delay_allreduce”选项。此选项缓冲所有要在GPU上累积的层的所有渐变,然后在完成反向传递后将链接在一起。

虽然此选项忽略了将已计算梯度的通信与其模型层的梯度计算重叠的机会,但可以在使用持久内核实现(包括批处理规范化和某些cuDNN rnn)的情况下提高性能。“delay_allreduce”选项以及其面向用户的选项的详细信息可以在Apex文档中找到。

这些PyTorch优化使NVIDIA能够在MLPerf上提供多个速度记录,可以在这里阅读。

Performance Libraries

cuDNN

cuDNN 7.4.1的最新版本包含了NHWC数据布局、持久RNN数据梯度计算、跨步卷积激活梯度计算的显著性能改进,以及在CUDNNGETConvertion<*>(一组API)中改进的启发式。              提高Volta张量核性能的一个关键是减少训练模型时所需的张量换位次数,如前一篇博文所述。与张量核卷积的自然张量数据布局是NHWC布局。在cuDNN的最后几个版本中,还添加了高度优化的内核,这些内核对NHWC数据布局执行一系列内存绑定操作,如add tensor、op tensor、activation、average pooling和batch normalization。这些都在最新的cuDNN 7.4.1版本中提供。

这些新的实现使得更有效的内存访问成为可能,并且在许多典型的用例中可以达到接近峰值的内存带宽。此外,新的扩展批处理规范化API还支持可选的fused-element-wise-add激活,节省了多次往返全局内存,显著提高了性能。这些融合操作将加快训练具有批量规范化和跳过连接的网络。这包括大多数现代图像网络,用于分类、检测、分割等任务。

例如,与使用NCHW数据布局和不使用融合批规范化的情况相比,使用cuDNN的新NHWC和融合批规范化支持在DGX-1V上使用8台Tesla V100 GPU训练固态硬盘网络(使用ResNet-34主干网)时,性能提高了20%以上。

正如本博客前面所讨论的,大规模训练深层神经网络需要处理比每个GPU所能处理的最大批量更小的数据。这为优化提供了一个新的机会,特别是使用递归神经网络(RNNs)的模型。当批处理大小很小时,cuDNN库可以使用RNN实现,在某些情况下使用持久算法。

(这篇文章解释了RNN实现中持久算法的性能优势)虽然cuDNN在多个版本中支持持久RNN,但最近针对Tensor核心对进行了大量优化。图2中的图显示了一个性能改进的示例,对在TeslaV100上运行批处理大小为32的GNMTLanguage翻译模型所用的持久RNN进行了改进。如图所示,许多RNN调用的性能都有了显著的提高。

Figure 2. Speedup of GNMT unique cuDNN RNN calls in v7.4.1 vs. v7.0.5 for batch=32 using persistent algorithm

最新的cuDNN 7.4.1显著提高了计算激活梯度的性能。以前,单元增量的情况是由高度专业化和快速的内核处理的,而非单元增量的情况则退回到更通用但速度较慢的内核实现。最新的cuDNN解决了这一差距,并在非单位步幅情况下有很大的改进性能。通过这种增强,在诸如Deep Speech 2和Inception v3等网络中的相关激活梯度计算操作被改进了高达25倍。

DALI

视觉任务(如分类、目标检测、分割等)模型的训练和推理需要一个重要的、涉及的数据输入和扩充管道,当使用优化的代码大规模运行时,当多个gpu必须等待CPU时,该管道会很快成为整体性能的瓶颈准备数据。即使在使用多个CPU内核进行此处理时,CPU也很难为gpu提供足够快的数据。这会导致在等待CPU完成其任务时花费空闲GPU时间。将这些数据管道从CPU移动到GPU是有利的。DALI是一个开源的、与框架无关的GPU加速数据输入和扩充管道库,已经开发出来解决这个问题,将工作从CPU迁移到GPU。

让以流行的单点探测器(SSD)模型为例。数据输入管道有多个阶段,如图3所示。

Figure 3. DALI Data pipeline for SSD model

除了SSD Random(IoU-Intersection over Union-based)裁剪是SSD特定的之外,所有这些流水线阶段在计算机视觉任务中看起来都相当标准。DALI中新添加的操作符通过提供对COCO数据集(COCOReader)、基于IoU的裁剪(SSDRandomCrop)和边界框翻转(BbFlip)的访问,为整个工作流提供了一个基于GPU的快速管道。

Conclusion

研究人员可以利用讨论的最新性能增强,以最小的努力加速深度学习训练。访问NVIDIA GPU Cloud(NGC)下载经过充分优化的深度学习框架容器、经过预先训练的人工智能模型和模型脚本,让可以访问世界上性能最高的深度学习解决方案,从而启动人工智能研究。此外,在cuDNN和dali中还提供了单独的库和增强功能。

基于NVIDIA GPUs的深度学习训练新优化的更多相关文章

  1. NVIDIA GPUs上深度学习推荐模型的优化

    NVIDIA GPUs上深度学习推荐模型的优化 Optimizing the Deep Learning Recommendation Model on NVIDIA GPUs 推荐系统帮助人在成倍增 ...

  2. [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程 V0.2

    之前的[笔记] 基于nvidia/cuda的深度学习基础镜像构建流程已经Out了,以这篇为准. 基于NVidia官方的nvidia/cuda image,构建适用于Deep Learning的基础im ...

  3. [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程

    基于NVidia开源的nvidia/cuda image,构建适用于DeepLearning的基础image. 思路就是先把常用的东西都塞进去,再装某个框架就省事儿了. 为了体验重装系统的乐趣,所以采 ...

  4. 中文译文:Minerva-一种可扩展的高效的深度学习训练平台(Minerva - A Scalable and Highly Efficient Training Platform for Deep Learning)

    Minerva:一个可扩展的高效的深度学习训练平台 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2015-12-1 声明 ...

  5. TensorRT深度学习训练和部署图示

    TensorRT深度学习训练和部署 NVIDIA TensorRT是用于生产环境的高性能深度学习推理库.功率效率和响应速度是部署的深度学习应用程序的两个关键指标,因为它们直接影响用户体验和所提供服务的 ...

  6. NVIDIA TensorRT高性能深度学习推理

    NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高 ...

  7. 基于TensorFlow Serving的深度学习在线预估

    一.前言 随着深度学习在图像.语言.广告点击率预估等各个领域不断发展,很多团队开始探索深度学习技术在业务层面的实践与应用.而在广告CTR预估方面,新模型也是层出不穷: Wide and Deep[1] ...

  8. 完全基于 Java 的开源深度学习平台,亚马逊的大佬带你上手

    本文适合有 Java 基础的人群 作者:DJL-Lanking HelloGitHub 推出的<讲解开源项目>系列.有幸邀请到了亚马逊 + Apache 的工程师:Lanking( htt ...

  9. MLPerf结果证实至强® 可有效助力深度学习训练

    MLPerf结果证实至强 可有效助力深度学习训练 核心与视觉计算事业部副总裁Wei Li通过博客回顾了英特尔这几年为提升深度学习性能所做的努力. 目前根据英特尔 至强 可扩展处理器的MLPerf结果显 ...

随机推荐

  1. 病毒木马查杀实战第012篇:QQ盗号木马之逆向分析

    前言 在本系列的文章中,对每一个病毒分析的最后一个部分,若无特殊情况,我都会采用逆向分析的手段来为读者彻底剖析目标病毒.但是之前的"熊猫烧香"病毒,我用了三篇文章的篇幅(每篇250 ...

  2. Sqlmap的使用详解

    目录 Sqlmap Sqlmap的简单用法 探测指定URL是否存在SQL注入漏洞 查看数据库的所有用户 查看数据库所有用户名的密码 查看数据库当前用户 判断当前用户是否有管理权限 列出数据库管理员角色 ...

  3. Win64 驱动内核编程-1.环境搭建

    驱动开发环境及其双机调试环境搭建 开发环境搭建 使用工具:vs2015,Windows 10 SDK_10.0.14393,WDK10.0.14393.0 (1)安装VS2015  随便一个版本吧,我 ...

  4. Win64 驱动内核编程-34.对抗与枚举MiniFilter

    对抗与枚举MiniFilter MiniFilter 是目前杀毒软件用来实现"文件系统自我保护"和"文件实时监控"的方法. 由于 MiniFilter 模型简单 ...

  5. ThinkPHP5中出现unserialize()报错

    简述 unserialize(): Error at offset 533 of 1857 bytes 发现问题 dump一下出错的位置的变量,可以发现是缓存出了问题,改了名字的文件的路径对不上 解决 ...

  6. 数据人必读!玩转数据可视化用这个就够了——高德LOCA API 2.0升级来袭!

    引言 "一图胜千言",大数据时代来临,数据与人们生活密切相关.复杂难懂且体量庞大的数据给人的感觉总是冷冰冰的,让人难以获取到重点信息,也找不出规律和特征,数据价值发挥不出来.空间数 ...

  7. hdu - 1716 排列2 (使用set对全排列结果去重)

    题意很简单,只是有几个细节要注意,首先就是一次只是输入四个数字.输出结果要从小到大(进行全排列之前要进行排序).题目要求千位数相同的在一行,中间使用空格隔开(第二次在输出的时候判断上一次记录的千位数是 ...

  8. 15.Git

    1.Git介绍 1.1版本控制(理解) 无论是代码编写,还是文档编写,我们都会遇到对文档内容反复修改的情况 1.2开发中存在的问题(理解) 程序员小明负责的模块就要完成了,就在即将提交发布之前的一瞬间 ...

  9. DataGear 变更部署数据库为SQL Server填坑指南(含转写后的SQL server代码及SQL server配置文件)

    1. 引言 2. 配置数据库链接 3. 引入数据库驱动 4. 手动初始化数据库 5. 改写SQL 6. 其他 7. 参考 1. 引言 DataGear默认使用Derby数据库作为系统的元数据库,至于待 ...

  10. ASP.NET Core文件压缩最佳实践

    前言 在微软官方文档中,未明确指出文件压缩功能的使用误区. 本文将对 ASP.NET Core 文件响应压缩的常见使用误区做出说明. 误区1:未使用 Brotil 压缩 几乎不需要任何额外的代价,Br ...