【C++】【TensorRT】检测时间不稳定原因汇总(持续更新)

2023-11-17

本人使用C++版本的TensorRT框架做模型部署的开发工作,在实际上线具体的项目过程中碰到过检测时间不理想的情况,所以本人专门为此写一篇博客记录曾经遇到过的坑以及对应的解决方案。

一、相同型号的机器和显卡检测时间不同

1.问题描述

两台相同型号的机器、相同型号的显卡,在做分割项目时检测结果都一样,但是检测速度却不同。

2.问题查询

将每个模块的耗时打印出来,来观察哪一个模块耗时不相同,本人分成了以下5个部分:
a.前处理
vector< cv::Mat >—>float *
b.数据送内存到显存

cudaMemcpyAsync(mBinding[bindIndex], input, mBindingSize[bindIndex], cudaMemcpyHostToDevice, stream)

c.前向传播(调用 executeV2 (bindings))

mContext->enqueueV2(&mBinding[0], stream, nullptr);

d.数据从显存到内存

cudaMemcpyAsync(output.data(), mBinding[bindIndex], mBindingSize[bindIndex], cudaMemcpyDeviceToHost, stream);

e.后处理
vector< float > —>vector< cv::Mat >

3.实验结果

最终发现在数据从显存到内存传输的过程中,时间是不相同的。
(cudaMemcpyAsync in cudaMemcpyDeviceToHost mode)

4.可能原因

经过本人一番搜索后,了解到有个设置会干扰这部分时间,就是分页内存
长话短说就是设置无分页内存可以让速度达到最快,而设置虚拟内存会导致速度变慢

5.解决方案

对系统设置无分页内存
具体操作:
a.搜索栏搜索 高级系统设置
在这里插入图片描述

b.点击性能中的设置
在这里插入图片描述
c.点击高级中的更改
在这里插入图片描述
d.点击 无分页文件 再点击右边的设置
在这里插入图片描述
e.最后点确定然后重启计算机即可。

二、部分机器上检测时间波动较大

1.问题描述

部分机器上检测时间会非常不稳定,比如理论上应该是30ms一张图,但是隔几张之后就变成100ms以上,然后又变成30ms。但是同一套程序在部分的机器上又是稳定的,所以排除了代码问题。
而且除了TensorRT框架外,本人使用Libtorch框架做的检测项目也发生了类似的情况,所以或许问题点不在TensorRT本身。

2.问题查询

仍然按照上述问题一的思路。

3.实验结果

仍然是数据从显存到内存的时间不稳定所导致的。
(cudaMemcpyAsync in cudaMemcpyDeviceToHost mode is slow)
PS:到这里可以得出个大概规律,TensorRT的耗时有问题很有可能是数据从显存到内存这个地方导致的。

4.可能原因

经过了本人地毯式的搜索,并没有找到与本人相同的问题以及解决方案。
本人只能根据手上有的机器以及显卡来猜测究竟是哪个因素导致检测时间有较大波动。
本人猜测了显卡型号、精度模式(FP16 or FP32)、CPU型号、CPU核心数等等因素,都被否决了。
最后本人发现一个很神奇的点,那就是检测时间稳定的机器上显卡驱动版本都是500以下的,而检测时间不稳定的机器上显卡驱动版本都是500以上的,于是乎本人试了下将显卡驱动为512的一台机器显卡驱动降级到472.84版本,没想到检测时间变稳定了!
当时第一反应就觉得是这个版本问题。但是本人下载的这个驱动是通过驱动精灵下载的,不是DCH版本,而是标准版本。本人又猜想莫非是DCH和标准的区别而导致的?
于是本人又下载了个DCH版本的472.84的显卡驱动,安装完后发现时间仍然是稳定的。
到这里基本可以断言,数据从显存传到内存这一环节与显卡驱动版本是有关系的!至少本人这里400~500的版本是没问题,而512版本的驱动会导致速度不稳定!

5.解决方案

直接将512版本的显卡驱动降级,降到470左右的版本。
具体操作:(建议按照本人操作来,因为会有坑)
a.首先搜索栏搜索设备管理器

b.点击显示适配器,底下应该有个属于自己机器的显卡,右键点击它,然后点击卸载设备,再卸载驱动,接着重启电脑。
请添加图片描述

c.重启电脑之后先看下还有没有英伟达控制面板,有的话看看有没有降级到4XX的版本,如果有的话,就直接试试看应该可以稳定检测了。
如果连英伟达控制面板都没有的话,就下载驱动精灵,然后它会提示更新驱动,此时显示的是一个472.82的标准版驱动。点击它让它更新。(截图中箭头的地方一开始是升级驱动,点击它)
本人将这个版本的驱动放到了阿里云盘,也可以直接通过下面本人的阿里云盘链接直接下载
https://www.aliyundrive.com/s/CtTUuETiPfg
请添加图片描述

Tip:
如果这一步直接使用的是NVIDIA官网的DCH驱动的话,安装的时候会报错。

d.更新完驱动后再次打开程序,这个时候程序检测时间就变得稳定了。

6.展望

当然由于本人在编译TensorRT环境的时候,显卡驱动是472.88版本,所以与显卡驱动512版本会有不兼容的情况。
下一步本人打算在显卡驱动为512版本的机器上重新编译,然后再试一下能否稳定运行,后续会更新实验结果。

2022.09.26更新:
本人在512版本的显卡驱动上重新编译和测试,时间仍然是不稳定的。而且
所以基本可以得出结论:
显卡驱动版本在500以上的会导致TensorRT推理时间不稳定,建议换成500以下的。

本人在NVIDIA官网上提交此问题,目前正在等待NVIDIA官网的回复。
The time of cudaMemcpyAsync() in cudaMemcpyDeviceToHost mode is unstable after upgrading the graphics card driver to version 512

2022.09.28更新:
本人在类似的一篇帖子中发现推理时间变慢跟GPU时钟频率有关系,所以本人试着将GPU频率给锁死,结果是速度变稳定了,而且甚至比原来快了3ms左右
如果本人输入的是最高频率,那么就会很稳定,但是如果输入的不是最高频率,仍然会间隔10几张图之后有跳动。
将GPU时钟频率锁死的具体操作:
用管理员的方式打开cmd(不用管理员的方式后面可能会报错),然后输入nvidia-smi -q -d SUPPORTED_CLOCKS,看最大的时钟频率是多少,比如本人的结果如下图所示。请添加图片描述
接着输入nvidia-smi -lgc 7501,成功后会有如下的提示。
请添加图片描述
问题来了,如果本人输入的不是7501,比如输入7001的话,仍然会间隔十几张图后不太稳定,如下图所示:
请添加图片描述
参考资料:
深度学习显卡驱动设置?

2022.10.06更新:
NVIDIA官方给出了回复,如下图所示。
在这里插入图片描述
翻译过来就是
1.不用分页内存,使用固定内存
2.设置时钟频率为最高频率
两个做法我都有做过,但是并没有给出正面的回答(为什么跟显卡驱动版本有关)。

2023.02.08更新:
关于检测时间波动还有可能最直接的一点原因就是内存快占满了,本人在最近的一个6个模型并行推理的项目部署中发现两台机器,显卡型号一样,但是一个是内存8G,一个是内存16G,8G的机器推理速度就经常有波动(最慢的达到200ms一张图),而16G的机器推理速度就比较稳定(最慢的也只有60ms一张)。
仔细一检查,发现8G内存的机器的内存占用率已经达到快90%了,所以由此可以看出内存占得太满的话,会影响推理速度。

2023.05.17更新:
最近因为老板让我尝试下在不让驱动版本降级的情况下能否稳定推理速度,于是我尝试了下直接在500多的版本下锁死最大时钟频率,发现这样一步就能直接变稳定了!
但是如果这个时候显卡驱动版本自动更新了(比如说从516升级到531),那么这个锁死时钟最大频率的命令行就又得再来一次。
但是本人发现又一件奇怪的事,如果我用批处理文件(新建一个txt,输入你想要输入的命令行内容,关闭,修改后缀为bat)的方式锁死最大时钟频率的话,哪怕驱动自动更新也仍然是稳定的!如果读者发现自动更新后变得不稳定可以尝试试下这招,也欢迎评论区留言交流。

2023.06.02更新:
最近发现在显卡驱动版本500以上的显卡上还是会有速度不稳定或者速度稳定但是明显耗时变长的情况。
于是又重新做实验解决问题,最终发现按照如下方案能够解决问题:
首先锁死最大时钟频率,然后设置NVIDIA控制面板的管理3D设置中的低延时模式为超高,设置电源管理模式为最高性能优先,保存应用,最后需要重启电脑。
经过这完整的三步之后,就能让TensorRT模型稳定地运行下去了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】【TensorRT】检测时间不稳定原因汇总(持续更新) 的相关文章

随机推荐

  • zed双目摄像头 +yolo进行双目测距

    zed双目摄像头 yolo进行双目测距 首先根据你电脑或者jetson系列中的cuda版本下载对应的zed sdk 去安装zed api 安装过程可能会出现import pyzed sl as sl ImportError DLL load
  • b站黑马的Vue快速入门案例代码——计数器

    目录 目标效果 重点原理 1 创建Vue实例的时候 2 v on 为元素绑定事件 3 v text 解析文本用 设置标签的文本值 v text 简写 为 实现步骤 代码部分 1 计数器模板 html 全是重点 2 index css 辅助作
  • ubuntu下安装jdk

    ubuntu下的jdk 氛围open jdk和oracle jdk两种 前者是开源的 其实也行 不过大部分人使用的还是oracle jdk 有些博客推荐用ppa的方式安装 但这个安装的链接被墙了 所以经常会安装失败 现在介绍另一种 手动解压
  • 解决vscode远程安装插件不了、安装太慢问题

    一 问题描述 一直显示正在安装 几个小时也没动静 特别是那个c c 插件的安装 二 解决方法 1 采用手动安装插件的方式 步骤 先去这个网站找你要安装的插件 然后下载到本地电脑 All categories Extensions Visua
  • React 入门教程系列(三)——JSX 和 虚拟 DOM

    文章目录 1 JSX 2 虚拟 DOM 3 实例1 4 实例2 5 源码 1 JSX JSX的全称是 JacaScript XML 是 React 定义的第一种类似于 XML 的 JS 拓展语法 JSX 的语法大致遵循下面几条 标签名任意
  • C++中拷贝构造函数的四种调用方式

    代码 define CRT SECURE NO WARNINGS include
  • 分享一个iec104协议的资源,一个模拟iec104协议主站端的小工具

    最近编写的iec104协议的软件也基本稳定了 现在上传到资源上去留作备份 可实现功能 V1 005 2019 331 1 增加启动调用可执行文件目录下104 ini 调用遥信点表功能 增加显示SOE功能 2 增加显示SOE功能 根据读取的点
  • 数据库批量插入,存在则更新,不存在则插入

    INSERT ON DUPLICATE KEY UPDATE 语句 在并发量比较高的时候 可能两个线程都查询某个记录不存在 所以会执行两次插入 然后其中一条必然会因为主键 这里说的主键不是递增主键 冲突而失败 数据库层MySQL中INSER
  • Python中利用compileall将py项目打包成pyc项目

    在进行python项目开发的时候一定会涉及到项目打包这个环节 有时因为一些依赖的原因没法打包成一个大的可执行文件 但为了代码的安全性我们最起码需要打包成pyc的预编译格式 这样运行者 一般是测试和线上部署 在无法看到程序源码的同时也能顺利执
  • numpy.c_和numpy.r_的用法

    numpy c 将切片对象沿第二个轴 按列 连接 np c np array 1 2 3 np array 4 5 6 array 1 4 2 5 3 6 np c np array 1 2 3 0 0 np array 4 5 6 arr
  • UML类图几种关系的总结

    在UML类图中 常见的有以下几种关系 泛化 Generalization 实现 Realization 关联 Association 聚合 Aggregation 组合 Composition 依赖 Dependency 1 泛化 Gene
  • 子类加@Data后,IDEA调试时“出现”父类属性无值

    项目场景 自测一个功能的时候 IDEA调试同过对象的VIEW查看对象内容 发现加了 Data的返回子类型中父类的属性没有出现 问题描述 父类Response中的返回VO对象 Data public class PVO private Sti
  • 链式存储之:链表的引出及其简介

    上篇博客 笔者讲解了一下顺序表ArrayList 对于ArrayList有想法的各位老铁可以看一下 值得思索的 ArrayList和线性表 你确定错过这次机会 念君思宁的博客 CSDN博客值得思索的 ArrayList和线性表 你确定错过这
  • python格式化

    python格式化是python语法中很基础也是很重要的知识 本文介绍了python格式化的几种方法仅供参考 一 格式化方法1 格式为 输出内容 对应的变量1 对应的变量2 其中 d表示整数类型 s表示字符串类型 f表示浮点类型 例子 设以
  • 半实物仿真测试方法、装置及系统与流程

    机器人控制器的测试主要包括控制器核心软件的测试和外部接口的测试 同时为了保证机器人控制器在真实工况下进行测试 需要对其实际运行的各项功能和性能指标进行测试 半实物仿真测试平台是连接控制器和被控对象进行测试的测试平台 在基于半实物仿真的实验中
  • 数据清洗:让数据更纯净,Python实战 机器学习&深度学习

    目录 步骤1 导入必要的库 步骤2 加载数据 步骤3 处理缺失值 3 1 删除含有缺失值的行
  • 给应届生开出20K月薪,看到招聘要求后,我傻眼了......

    一到秋招季 就有 灵异 事件发生 应届生痛斥找不到工作 精心准备的简历投了几十家过不了网申 而企业控诉招不到人才 今年明明扩招了 应届生be like 这些岗位都挺适合我的 简直一个量身打造 用人单位be like 岗位要求门槛写得也不高
  • MySQL数据库迁移快速导出导入大量数据(外发)

    数据库迁移是我们经常可遇到的问题 对于少量的数据 迁移基本上不会有什么问题 生产环境中 有以下情况需要做迁移工作 磁盘空间不够 比如一些老项目 选用的机型并不一定适用于数据库 随着时间的推移 硬盘很有可能出现短缺 业务出现瓶颈 比如项目中采
  • vue-cli3打包项目

    vue cli3打包项目 使用vue cli3开发好项目后 就可以将它打包 这样就可以通过输出文件中的index html来访问该项目了 在打包项目之前需要先修改两个文件 分别是vue config js router index js 如
  • 【C++】【TensorRT】检测时间不稳定原因汇总(持续更新)

    本人使用C 版本的TensorRT框架做模型部署的开发工作 在实际上线具体的项目过程中碰到过检测时间不理想的情况 所以本人专门为此写一篇博客记录曾经遇到过的坑以及对应的解决方案 一 相同型号的机器和显卡检测时间不同 1 问题描述 两台相同型