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

华为云开发者社区 华为云开发者社区     2023-03-03     476

关键词:

摘要:从显存优化,计算优化两个方面来分析一下如何进行深度学习模型推理优化。

本文分享自华为云社区《XEngine-深度学习推理优化》,作者: ross.xw。

前言

深度学习模型的开发周期,包括训练阶段和部署阶段。训练阶段,用户需要收集训练数据,定义自己的模型结构,在CPU或者GPU硬件上进行训练,这个过程反复优化,直到训练出满意精度的模型。有了模型之后,我们需要将模型服务部署运行,我们期望服务延迟越低越好,吞吐越高越好。这里会从显存优化计算优化两个方面来分析一下如何进行深度学习模型推理优化。

1. 显存优化

1.1 显存分布

模型推理需要占用一定量的显存空间(以GPU推理为例),其中主要包括如下4个部分:

  1. 不可控制空间
  2. 用户数据
  3. 模型参数
  4. 运行时空间
    1. op计算的激活值
    2. op计算需要的临时空间

其中“不可控制空间”指系统分配的空间,如每个进程CUDA Context所占用的显存空间,一般在100-300MB左右;“用户数据”指用户自行分配的显存空间,如模型输入输出Tensor占用的空间;“模型参数”指训练的深度学习模型的参数所占用的显存空间,我们需要将模型参数加载到显存中,才能进行计算;“运行时空间”是指模型的算子在计算的时候,需要的显存空间。

以ResNet-50模型为例,显存分配空间占比如下。我们可以看到随着Batch Size的增大,运行时空间会线性增长,运行时空间成为显存占用的瓶颈。

不同的模型显存分布也是不一样的。在NLP场景中,transformer类型的模型近几年涌现了许多超大参数量的模型,模型参数空间将成为显存的瓶颈。

接下来,会从激活优化和参数优化两个方面讲解如何进行显存空间优化,并最后扩展到多模型显存空间共享。

1.2 激活优化

激活值优化的中心思想就是显存复用。推理和训练不一样,推理计算只有forward过程,当一个op计算完后,它所占用的输入空间其实就可以被后面的op进行复用了。

1.3 参数优化

参数优化主要是为了解决超大模型的问题,如果模型太大,一个卡装不下就需要多张卡。参数空间和激活不一样,它是固定的值,提前训练好了,而激活值是临时计算出来的。这就使得我们不能用复用的方式。这些参数总要在一个地方保存。可以借鉴多级缓冲的思路,将训练好的参数可以缓存到磁盘和cpu内存中,在需要的时候提前读取上来,这样我们就不需要所有的参数都存储到显存中,将大模型单张卡加载成为可能。

为了减少数据拷贝对推理性能的影响,需要将数据预读取和计算并行起来。在GPU计算里面,我们可以通过cuda stream + event的方式将计算和拷贝并行起来,如下图所示:

1.4 多模型显存共享

除了单模型内部的激活优化和参数优化,在多并发多模型的服务场景,我们还可以进一步进行多模型显存共享。假设如下:

  • 模型:M1, M2, M3...
  • 激活空间:A1, A2, A3...
  • 参数空间:P1, P2, P3...

1.5 显存优化效果

这里选取了CV和NLP两个场景的模型,对比了一下XEngine推理引擎和其他运行时引擎的显存占用,可以看到有明显的优化。如果不考虑性能开启参数优化(ParamOpt),可以进一步的降低显存占用。

2. 计算优化

2.1 计算分析

下图取了ResNet-50模型的一个片段,并抽象到计算和访存的流水线过程。我们可以看到,每个OP计算对应一个CUDA Kernel计算,每个kernel计算会从显存(Global Memory)中读取数据,在片上CUDA Core进行计算。右图为CUDA的存储架构,也符合金字塔访存原则,即越靠近片上,访存速度越快。其中Global Memory是GPU的显存,访问速度最慢;而片上的Shared Memory次之;最快的是片上Register空间。当模型的算子OP比较多的时候,模型推理计算会反复读写显存,效率比较低,为了解决这个问题,常用的方法是图融合技术;当OP计算的速度越快,整个模型推理计算速度也会越快,因此我们需要高性能的算子实现。接下来会从这两个方面分析。

2.2 图融合

图融合技术指将一些OP进行融合计算,由多个OP的Kernel计算转化为一个融合后OP的Kernel计算。通过这个优化,可以减少显存的反复读写,可以通过一次读取数据,在片上进行尽可能多的计算后,再将数据存储到显存中。同时也可以减少Kernel Launch的开销。融合后的算子实现可以通过手写CUDA Kernel或者调用第三方库或者CodeGen方式进行生成。

下图中左边为resnet-50模型优化前和优化后的Graph结构。CV类型的模型常用的融合手段是将线性计算和激活进行融合,如Conv + BN + Relu进行融合计算。

下图为Bert模型的图融合前后的变化。

2.3 高性能算子

  • 高性能计算库
    • Cublas/cudnn/cutlass
  • 手写CUDA Kernel
    • Cuda programming guide
    • Cuda best practice guide
  • 低精度计算
    • FP16/INT8/TensorCore (half2, dp4a, wmma)
  • CodeGen
    • TVM/XLA/MLIR…

2.4 计算优化效果

XEngine针对Bert类型模型进行优化,测试环境为NVIDIA V100,FP32计算。如下是性能对比,相对于原始框架未优化版本,在sequence length比较小的时候,有明显的性能提升。同时也和NVIDIA的SOTA解决方案FasterTransformer进行了对比,有轻微优势。

  • XEngine和Pytorch推理性能对比:

  • XEngine和FasterTransformer推理性能对比:

3. 总结

本文主要从显存优化和计算优化两个角度分析了一下模型推理常用的优化思路和技巧,并展示了一下优化的结果。希望对大家做推理工程优化有帮助。

点击关注,第一时间了解华为云新鲜技术~

地址标准化服务ai深度学习模型推理优化实践

导读深度学习已在面向自然语言处理等领域的实际业务场景中广泛落地,对它的推理性能优化成为了部署环节中重要的一环。推理性能的提升:一方面,可以充分发挥部署硬件的能力,降低用户响应时间,同... 查看详情

ai性能优化之tensorrt(1tensorrt简介及安装)(代码片段)

...ps://developer.nvidia.com/zh-cn/tensorrtNVIDIATensorRT™是用于高性能深度学习推理的SDK。此SDK包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高吞吐量。在推理过程中,基于TensorRT的应用程序的执行速度... 查看详情

java程序员学深度学习djl上手6使用自己的模型

Java程序员学深度学习DJL上手6使用自己训练的模型一、加载手写体待推理图片二、加载模型三、创建Translator四、创建推理对象五、执行推理任务六、源代码1.pom.xml2.java3.执行结果本文使用前一节训练的模型执行图片推理任务。一... 查看详情

java程序员学深度学习djl上手6使用自己的模型(代码片段)

Java程序员学深度学习DJL上手6使用自己训练的模型一、加载手写体待推理图片二、加载模型三、创建Translator四、创建推理对象五、执行推理任务六、源代码1.pom.xml2.java3.执行结果本文使用前一节训练的模型执行图片推理任务。一... 查看详情

人工智能与深度学习基于能量的模型

【人工智能与深度学习】基于能量的模型概述能量基础模型(EBM)方法定义解决方案:基于梯度的推理有潜在变量的能量基础模型推理例子能量基础模型和机率模型的对比自由能(FreeEnergy)概述我们现在介绍一个新框架来定义模型。... 查看详情

mnn2.0发布——移动端推理引擎到通用深度学习引擎

....0版本啦!在整体定位方面,相比于1.0版本的端侧深度学习引擎,MNN2.0迈向了端云一体化的通用深度学习框架,一方面大幅优化了在服务端CPU和GPU上的性能;另一方面新增了类似OpenCV、Numpy的通用计算模块,... 查看详情

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

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

tensorrt模型加速1-输入输出部署流程

...的作用。然后介绍TensorRT模型导入流程,针对不同的深度学习框架,使用不同的方法导入模型。一、TensorRT简介TensorRT是NVIDIA公司发布的一个高性能的深度学习推理加速框架,下面先看一下使用TensorRT的背景:训练... 查看详情

深度学习之模型优化模型剪枝模型量化知识蒸馏概述

...优化有哪些方式呢?显而易见答案就在标题之中。【深度学习之模型优化】模型剪枝、模型量化、知识蒸馏概述模型剪枝技术概述1.什么是模型剪枝2.模型剪枝的必要性模型量化技术概述1.什么是模型量化2.模型量化的优势模... 查看详情

一文带你读懂非结构化稀疏模型压缩和推理优化技术

背景近些年,深度学习正在经历从学术研究领域到工业落地方面的快速转变。一个完备的深度学习落地流程包括:模型设计、模型训练与调优、模型压缩、推理部署,最终成为在各种设备上快速、精准运行的人工智能... 查看详情

一文带你读懂非结构化稀疏模型压缩和推理优化技术

背景近些年,深度学习正在经历从学术研究领域到工业落地方面的快速转变。一个完备的深度学习落地流程包括:模型设计、模型训练与调优、模型压缩、推理部署,最终成为在各种设备上快速、精准运行的人工智能... 查看详情

nvidiagpus上深度学习推荐模型的优化(代码片段)

NVIDIAGPUs上深度学习推荐模型的优化OptimizingtheDeepLearningRecommendationModelonNVIDIAGPUs推荐系统帮助人在成倍增长的选项中找到想要的东西。是在许多在线平台上推动用户参与的关键组件。          &nb... 查看详情

tx2之多线程读取视频及深度学习推理(代码片段)

背景一般在TX2上部署深度学习模型时,都是读取摄像头视频或传入视频文件进行推理,从视频中抽取帧进行目标检测等任务。对于大点的模型,推理的速度是赶不上摄像头或视频的帧率的,如果我们使用单线程进行处理,即读取... 查看详情

亮相百度wavesummit+2021,intelopenvino带来新气象

北京时间12月12日,百度WAVESUMMIT+2021深度学习开发者峰会在上海举办。这场属于AI的科技盛会之上,英特尔OpenVINO联手百度PaddlePaddle为开发者带来了一系列的技术内容,为开源生态构建持续合作,为产业进步提供... 查看详情

调参侠带你入门深度学习:lenet分类实战:训练与推理(代码片段)

...文章我们以CIFAR10这个数据集为例,来带大家体验一波深度学习的魅力!CIFAR10dataset介绍它有以下类别:‘airplane’,‘automobile’,‘bird’,‘cat’,‘deer’,‘dog’,‘frog’,‘horse’,‘ship’,‘truck’.并且是3X32X32的3通道图... 查看详情

djl快速入门(纯java跑深度学习模型)(代码片段)

...类参考资料1.本文介绍服务端大多都是用Java做的,而深度学习模型大多又是用Python写的,所以很多人都是用Java调Python的接口,这样效率低,而且也不优雅,最重要的是如果想使用Android做推理,那就必须要... 查看详情

tensorrt模型加速|网络结构优化|低精度推理

...度推理是一种较为常用的模型量化算法,通过将原始深度神经网络的高精度数据类型 转换为 低精度类型以达到显著减少网络运算时间的效果。低精度推理方式,通常有两种:采用半精度浮点数(Half-PrecisionFloatin... 查看详情

tensorrt模型加速|网络结构优化|低精度推理

...度推理是一种较为常用的模型量化算法,通过将原始深度神经网络的高精度数据类型 转换为 低精度类型以达到显著减少网络运算时间的效果。低精度推理方式,通常有两种:采用半精度浮点数(Half-PrecisionFloatin... 查看详情