模型推理batch inference速度无明显提升、耗时线性增长问题排查

现象描述

当模型在推理阶段使用batch inference时,推理速度并无明显提升,相比单帧多次推理收益不大。如笔者在Xavier上测试某模型结果

batch size 推理时间ms 折算耗时 ms/img
1 11.23 11.23
2 20.39 10.20
4 38.73 9.68
8 74.11 9.26
32 287.30 8.98

类似情况在网上也很多见,如yolov5作者的测试结果【1】

按理来说,多张图放一个batch喂给模型,模型矩阵运算可以并行操作,推理的速度可以有batch size倍的提升,但实际观察到的现象确实提升不大,尤其是在一些算力较弱的设备上。

原因分析:

在网上搜索一番,大概定位原因,这里参考GitHub tensorrt 的 issues 1046解答【2】:

简单来说,问题在于gpu计算性能有瓶颈。如果单张图的计算量已经快占满计算核心(达到性能瓶颈),再增加batch size也无法多张图并行计算,尤其是在网络中间的一些层channel数特别大时,瞬时矩阵乘法运算量非常大,cuda核用满了就需要排队慢慢计算。

Generally, GPU computation is more efficient when the batch size is larger. This is because when you have a lot of ops, you can fully utilize the GPUs and hide some inefficiency or overhead between ops. However, if there are already a lot of ops at BS=1 and even BS=1 is able to fully utilize the GPUs, you may not see any increase in efficiency anymore.

For example, is your input size BSx3x1600x1000? This is a super large image which is expected to fully utilize even the largest GPU we have (like A100), so I don't think increasing BS gives benefit on GPU efficiency.

In terms of N/V/K, in your case the "N" is already 1600x1000 at BS=1, so N=1600x1000 vs N=2x1600x1000 do not make too much difference in turns of GPU efficiency, compared to N=1 vs N=2.

另外一个现象就是gpu性能越高,batch inference效果提升越明显。如笔者在xavier上测试单帧推理时,GPU利用率就接近60%,所以当batch size增加时基本无增益,而yolov5作者在A100(性能天花板更高)测试时,加速效果更明显。其实当batch size非常大时,相当于在让GPU持续工作直到计算完成,减少了等待时间,所以性能越高可以并行计算的量也就越大,加速越明显。

可以尝试的优化方向:

遇到上述情况,想要加快推理速度,除了最直接的-换更高性能的设备,暂时想到如下两个方向优化:

减少计算量:

  1. 降低模型输入尺寸
  2. 优化网络结构(中间计算量非常大的某些层),思想就是大的矩阵分解计算;想简单省事的就看是否有开源的成果,如yolov5升级yolov8之类的
  3. 模型导trt,模型量化(fp16, int8)、剪枝等
  4. 升级trt版本说不定有惊喜,NVIDIA的工程师们可能对某些算子做了优化

减少cuda核等待时间:

  1. 异步模式(多线程等),就是不让gpu闲着,一直去计算

如有其它后续补充......

Reference

  1. https://docs.google.com/spreadsheets/d/1Nm3jofjdgKja0AZHV8Jk_m8TgcF7jenCSA06DuEG2C0/edit?usp=sharing
  2. https://github.com/NVIDIA/TensorRT/issues/1046

模型推理batch inference速度无明显提升、耗时线性增长问题排查的更多相关文章

  1. 【翻译】借助 NeoCPU 在 CPU 上进行 CNN 模型推理优化

    本文翻译自 Yizhi Liu, Yao Wang, Ruofei Yu.. 的  "Optimizing CNN Model Inference on CPUs" 原文链接: h ...

  2. 移动端 CPU 的深度学习模型推理性能优化——NCHW44 和 Record 原理方法详解

    用户实践系列,将收录 MegEngine 用户在框架实践过程中的心得体会文章,希望能够帮助有同样使用场景的小伙伴,更好地了解和使用 MegEngine ~ 作者:王雷 | 旷视科技 研发工程师 背景 ...

  3. 优化故事: BLOOM 模型推理

    经过"九九八十一难",大模型终于炼成.下一步就是架设服务,准备开门营业了.真这么简单?恐怕未必!行百里者半九十,推理优化又是新的雄关漫道.如何进行延迟优化?如何进行成本优化 (别忘 ...

  4. Hugging Face - 推理(Inference)解决方案

    每天,开发人员和组织都在使用 Hugging Face 平台上托管的模型,将想法变成概念验证(proof-of-concept)的 demo,再将 demo 变成生产级的应用. Transformer ...

  5. 天猫精灵业务如何使用机器学习PAI进行模型推理优化

    引言 天猫精灵(TmallGenie)是阿里巴巴人工智能实验室(Alibaba A.I.Labs)于2017年7月5日发布的AI智能语音终端设备.天猫精灵目前是全球销量第三.中国销量第一的智能音箱品牌 ...

  6. MindSpore模型推理

    MindSpore模型推理 如果想在应用中使用自定义的MindSpore Lite模型,需要告知推理器模型所在的位置.推理器加载模型的方式有以下三种: 加载本地模型. 加载远程模型. 混合加载本地和远 ...

  7. CANN训练:模型推理时数据预处理方法及归一化参数计算

    摘要:在做基于Ascend CL模型推理时,通常使用的有OpenCV.AIPP.DVPP这三种方式,或者是它们的混合方式,本文比较了这三种方式的特点,并以Resnet50的pytorch模型为例,结合 ...

  8. 【模型推理】Tengine 模型转换及量化

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   本文介绍一下 Tengine 模型转换 ...

  9. 【模型推理】量化实现分享一:详解 min-max 对称量化算法实现

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文剖析一下 m ...

  10. 【模型推理】量化实现分享二:详解 KL 对称量化算法实现

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文剖析一下 K ...

随机推荐

  1. 7.19考试总结(NOIP模拟20)[玩具·y·z]

    与其被自己的本性牵着走而痛苦,倒不如试着改变自己. 前言 首先自我检讨一下,T1的部分分是原题,但是我这个 FW 居然没有看出来..(主要是我看错题了) 论语文素养如何限制 OI 水平 别人眼里是一棵 ...

  2. Qt内存回收机制

    参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=16 Qt中内存的回收是自己完成的,实验中,我们自定义一个按钮,通过重写析构函数来观察现象. 新建 ...

  3. bpmnjs

    在 bpmn.js 中,`bpmnModeler.get()` 方法用于获取不同的模块,你可以通过这些模块来访问和操作 BPMN 模型的不同部分.以下是一些常用的模块和对应的用途: 1. **Canv ...

  4. vue3 KeepAlive

    在Vue.js 3中,<keep-alive> 是一个抽象组件,用于保留其子组件状态,防止在切换组件时销毁它们.这对于在页面间切换时保留组件的状态或避免重复渲染特定组件非常有用.<k ...

  5. 视图结构 wxml 列表渲染 for

    WXML是框架设计的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. wxml是一个严格的标记性语言,有开始就必须有结束,单标签就一个有结束符 5.1.数据绑定 在js逻辑层中定义数据源, ...

  6. Linux扩展篇-shell编程(三)-shell运算符

    基本语法: 格式一 expr +. -. \*./. %(加.减.乘.除.求余) 格式二 "$((运算式))"或者"$[运算式]" 基本运算符 Shell 和其 ...

  7. HTML5 在泛在电力物联网的 10 大业务领域 2/3D 可视化应用

    过去的 2018 年,我们认为是国内工业互联网可视化的元年,图扑软件作为在工业可视化领域的重度参与者,一线见证了众多 HTML5/Web 化.2D/3D 化的项目在工业界应用落地. 2019 年可以定 ...

  8. feildconfig

    <template> <div style="float:left;width: 100%"> <el-row> <el-col :spa ...

  9. 如何在Zynq-7000上烧写PL Image

    由 技术编辑archive1 于 星期六, 06/28/2014 - 10:05 发表 作者:hqin, Xilinx处理器专家FAE 在Zynq-7000上编程PL大致有3种方法: 用FSBL,将b ...

  10. power bi权限控制笔记

    power bi权限控制:power bi权限控制角色目前只能在desktop 客户端进行创建.报表进行权限控制后,用于行级别安全,需注意:a.对数据集做行级别安全性的角色分配 b.需要进行报表的共享 ...