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

wujianming-110117 wujianming-110117     2022-11-29     766

关键词:

基于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中还提供了单独的库和增强功能。

深入云原生ai:基于alluxio数据缓存的大规模深度学习训练性能优化(代码片段)

...杂度,进一步助力云上普惠AI模型训练。AI训练新趋势:基于Kubernetes的云上深度学习1.背景介绍近些年,以深度学习为代表的人工智能技术取得了飞速的发展,正落地应用于各行各业。随着深度学习的广泛应用,众多领域产生了... 查看详情

深入云原生ai:基于alluxio数据缓存的大规模深度学习训练性能优化(代码片段)

...杂度,进一步助力云上普惠AI模型训练。AI训练新趋势:基于Kubernetes的云上深度学习1.背景介绍近些年,以深度学习为代表的人工智能技术取得了飞速的发展,正落地应用于各行各业。随着深度学习的广泛应用,众多领域产生了... 查看详情

深入云原生ai:基于alluxio数据缓存的大规模深度学习训练性能优化(代码片段)

作者|车漾(阿里云高级技术专家)、顾荣(南京大学副研究员)导读:Alluxio项目诞生于UCBerkeleyAMP实验室,自开源以来经过7年的不断开发迭代,支撑大数据处理场景的数据统一管理和高效缓存功能日趋成熟。然而,随着云原生... 查看详情

深入云原生ai:基于alluxio数据缓存的大规模深度学习训练性能优化(代码片段)

作者|车漾(阿里云高级技术专家)、顾荣(南京大学副研究员)导读:Alluxio项目诞生于UCBerkeleyAMP实验室,自开源以来经过7年的不断开发迭代,支撑大数据处理场景的数据统一管理和高效缓存功能日趋成熟。然而,随着云原生... 查看详情

深度学习之无监督训练

...。3.逐层贪婪的无监督预训练有这几个特点:(1)贪婪:基于贪婪算法,独立优化问题解的各方面,但是每次只优化一个方面,而不是同时同步全局优化。(2)逐层:各个独立方面 查看详情

基于深度学习的图异常检测如何改进

您好,基于深度学习的图异常检测是一种有效的方法,但是仍然存在一些问题需要改进。以下是几种可能的改进方法:1.数据增强:在训练模型之前,可以使用数据增强技术来扩充训练数据集。这可以帮助模型更好地学习数据的... 查看详情

喜马拉雅基于hybridbackend的深度学习模型训练优化实践

喜马拉雅作者:李超、陶云、许晨昱、胡文俊、张争光、赵云鹏、张玉静喜马拉雅AI云借助阿里云提供的HybridBackend开源框架,实现了其推荐模型在GPU上的高效训练。业务介绍推荐场景是喜马拉雅app的重要应用之一,它广泛应用于... 查看详情

基于cnn卷积神经网络的tensorflow+keras深度学习的人脸识别(代码片段)

基于CNN卷积神经网络的TensorFlow+Keras深度学习的人脸识别前言项目实现效果补充模型数据嵌入模型CNN神经网络模型项目概述项目运行流程核心环境配置项目核心代码详解目录核心代码设置数据集目录收集人脸识别数据——UUID格... 查看详情

深度学习-数据加载优化-训练速度提升一倍(代码片段)

1,介绍数据加载深度学习的训练,简单的说就是将数据切分成batch,丢入模型中,并计算loss训练。其中比较重要的一环是数据打batch部分(数据加载部分)。训练时间优化:深度学习训练往往需要大量... 查看详情

针对新数据点更新预训练的深度学习模型

】针对新数据点更新预训练的深度学习模型【英文标题】:Updatingpre-trainedDeepLearningmodelwithrespecttonewdatapoints【发布时间】:2019-05-0613:51:54【问题描述】:以ImageNet上的图像分类为例,如何使用新数据点更新预训练模型。我已经加... 查看详情

tensorflow在美团外卖推荐场景的gpu训练优化实践

总第497篇2022年第014篇美团机器学习平台基于内部深度定制的TensorFlow研发了BoosterGPU训练架构。该架构在整体设计上充分考虑了算法、架构、新硬件的特性,从数据、计算、通信等多个角度进行了深度的优化,最终其性价比达到CPU... 查看详情

基于端到端可迁移深度强化学习的图优化

文/YanqiZhou和SudipRoy,研究员,GoogleResearch各式各样加速器上训练的大规模复杂神经网络驱动着越来越多的应用的发展。机器学习(ML)编译器为这一进程提供了便利,它将高级计算图映射到特定设备可执行的低级文件。为... 查看详情

dl:深度学习模型优化之模型训练技巧总结之适时自动调整学习率实现代码(代码片段)

DL:深度学习模型优化之模型训练技巧总结之适时自动调整学习率实现代码目录深度学习模型优化之模型训练技巧总结之适时自动调整学习率实现代码深度学习模型优化之模型训练技巧总结之适时自动调整学习率实现代码defsc... 查看详情

深度学习之tensorflow模型优化和调优实例(代码片段)

...(输入和输出一一对应);2.根据经验(基于paper或者基于直觉等均可)构建神经网络(TensorFlow,Keras等均可以&# 查看详情

深度学习中的dataaugmentation方法(转)基于keras

在深度学习中,当数据量不够大时候,常常采用下面4中方法:1.人工增加训练集的大小.通过平移,翻转,加噪声等方法从已有数据中创造出一批"新"的数据.也就是DataAugmentation2.Regularization.数据量比较小会导致模型过拟合,使得训练... 查看详情

深度学习基础-基于numpy的循环神经网络(rnn)实现和反向传播训练

本文是深度学习入门:基于Python的实现、神经网络与深度学习(NNDL)以及动手学深度学习的读书笔记。本文将介绍基于Numpy的循环神经网络的前向传播和反向传播实现,包括RNN、LSTM和GRU。一、概述1.1循环神经网络(RNN)循环神... 查看详情

xengine:深度学习模型推理优化

...;从显存优化,计算优化两个方面来分析一下如何进行深度学习模型推理优化。本文分享自华为云社区《XEngine-深度学习推理优化》,作者:ross.xw。前言深度学习模型的开发周期,包括训练阶段和部署阶段。训练阶... 查看详情

深度学习-数据加载优化-训练速度提升一倍(代码片段)

1,介绍数据加载深度学习的训练,简单的说就是将数据切分成batch,丢入模型中,并计算loss训练。其中比较重要的一环是数据打batch部分(数据加载部分)。训练时间优化:深度学习训练往往需要大量... 查看详情