模型推理batch inference速度无明显提升、耗时线性增长问题排查
模型推理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持续工作直到计算完成,减少了等待时间,所以性能越高可以并行计算的量也就越大,加速越明显。
可以尝试的优化方向:
遇到上述情况,想要加快推理速度,除了最直接的-换更高性能的设备,暂时想到如下两个方向优化:
减少计算量:
- 降低模型输入尺寸
- 优化网络结构(中间计算量非常大的某些层),思想就是大的矩阵分解计算;想简单省事的就看是否有开源的成果,如yolov5升级yolov8之类的
- 模型导trt,模型量化(fp16, int8)、剪枝等
- 升级trt版本说不定有惊喜,NVIDIA的工程师们可能对某些算子做了优化
减少cuda核等待时间:
- 异步模式(多线程等),就是不让gpu闲着,一直去计算
如有其它后续补充......
Reference
- https://docs.google.com/spreadsheets/d/1Nm3jofjdgKja0AZHV8Jk_m8TgcF7jenCSA06DuEG2C0/edit?usp=sharing
- https://github.com/NVIDIA/TensorRT/issues/1046
模型推理batch inference速度无明显提升、耗时线性增长问题排查的更多相关文章
- 【翻译】借助 NeoCPU 在 CPU 上进行 CNN 模型推理优化
本文翻译自 Yizhi Liu, Yao Wang, Ruofei Yu.. 的 "Optimizing CNN Model Inference on CPUs" 原文链接: h ...
- 移动端 CPU 的深度学习模型推理性能优化——NCHW44 和 Record 原理方法详解
用户实践系列,将收录 MegEngine 用户在框架实践过程中的心得体会文章,希望能够帮助有同样使用场景的小伙伴,更好地了解和使用 MegEngine ~ 作者:王雷 | 旷视科技 研发工程师 背景 ...
- 优化故事: BLOOM 模型推理
经过"九九八十一难",大模型终于炼成.下一步就是架设服务,准备开门营业了.真这么简单?恐怕未必!行百里者半九十,推理优化又是新的雄关漫道.如何进行延迟优化?如何进行成本优化 (别忘 ...
- Hugging Face - 推理(Inference)解决方案
每天,开发人员和组织都在使用 Hugging Face 平台上托管的模型,将想法变成概念验证(proof-of-concept)的 demo,再将 demo 变成生产级的应用. Transformer ...
- 天猫精灵业务如何使用机器学习PAI进行模型推理优化
引言 天猫精灵(TmallGenie)是阿里巴巴人工智能实验室(Alibaba A.I.Labs)于2017年7月5日发布的AI智能语音终端设备.天猫精灵目前是全球销量第三.中国销量第一的智能音箱品牌 ...
- MindSpore模型推理
MindSpore模型推理 如果想在应用中使用自定义的MindSpore Lite模型,需要告知推理器模型所在的位置.推理器加载模型的方式有以下三种: 加载本地模型. 加载远程模型. 混合加载本地和远 ...
- CANN训练:模型推理时数据预处理方法及归一化参数计算
摘要:在做基于Ascend CL模型推理时,通常使用的有OpenCV.AIPP.DVPP这三种方式,或者是它们的混合方式,本文比较了这三种方式的特点,并以Resnet50的pytorch模型为例,结合 ...
- 【模型推理】Tengine 模型转换及量化
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 本文介绍一下 Tengine 模型转换 ...
- 【模型推理】量化实现分享一:详解 min-max 对称量化算法实现
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 大家好,我是极智视界,本文剖析一下 m ...
- 【模型推理】量化实现分享二:详解 KL 对称量化算法实现
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 大家好,我是极智视界,本文剖析一下 K ...
随机推荐
- lazyload图片懒加载
安装 npm i -S vue-lazyload 在src/main.js文件中添加如下内容 import VueLazyload from 'vue-lazyload' Vue.use(VueLaz ...
- 剑指Offer-53.表示数值的字符串(C++/Java)
题目: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.14 ...
- 使用优启通 制作 WIN PE U盘时报BOOT.WIM 有毒的解决方法
使用优启通 制作 WIN PE U盘时报BOOT.WIM 有毒的解决方法 1.打开"Windows Defender". 2.点击"病毒和威胁防护". 3.点击 ...
- css 让页面变灰色
html { -webkit-filter: grayscale(1); }-webkit-filter(滤镜)有十种效果,分别是: // grayscale 灰度 // sepia ...
- es6.6.1 java客户端 client基础操作
1.引入jar包 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId&g ...
- xshell和xftp远程SSH密钥连接腾讯云服务器
1.在腾讯云中创建密钥,关机,绑定. 2.xshell和xftp导入密钥,填写的用户名和密码验证是 腾讯云的主机的root和密码(关键,而不是创建密钥的用户名和密码),该密码可以重置.
- mysql 查询差集方法
第一种是通过not in的方式去处理: select id from table_a where id not in (select id from table_b); 第二种则是通过左连接(left ...
- Docker PHP启用各种扩展笔记
注意 如果apt-get install命令无法安装依赖,请先执行apt update更新依赖信息 启用ZIP扩展 原作者地址:找不到了... # 安装依赖库 $ apt-get install -y ...
- Tarjan 求有向图的强连通分量
重温Tarjan, 网上看了许多博客感觉都讲的不清楚. 故传上来自己的笔记, 希望帮到大家. 提到的一些概念可以参考 oi wiki, 代码也是 oi wiki 的, 因为我不认为我能写出比大佬更好的 ...
- firewall-cmd设置NAT转换
配置ipv4转发 修改servera配置文件/etc/sysctl.conf ,修改参数为1 net.ipv4.ip_forward = 1 配置生效: sysctl -p 修改网卡的zone [ro ...