【深度学习】1. yolov5 推理速度和batchsize的增长关系,推理并行处理多张图片,显存如何手动释放

news2025/1/11 3:55:26

文章目录

  • 前言
  • 1. batchsize和推理速度的关系
  • 2. 修改batchsize尝试
    • 2.1 benifit(好处)
    • 2.1 编码batchsize下的推理
    • 2.2 发现问题
      • 2.2.1 推理结束后,占用显存不释放。
    • 2.3 其它有用的参数设置


前言

yolov5的detect.py 是默认batchsize=1的,而直接修改batchsize为更大的值,会使detect.py 不工作.
因此本篇文章想解决两个问题:
1.设置多大的bz合适
2.如何修改detect.py 使其满足自定义的bz


1. batchsize和推理速度的关系

ref:https://github.com/ultralytics/yolov5/discussions/6649
ref:https://docs.google.com/spreadsheets/d/1Nm3jofjdgKja0AZHV8Jk_m8TgcF7jenCSA06DuEG2C0
基于.pt的测试文档
基于.pt 格式的推理速度。
在这里插入图片描述
结论:较小的模型增大bz收益不明显,模型越大,增大bz收益越明显。
在这里插入图片描述
例如,
对s模型 bz = 1 推理用时为1.0 bz= 8 推理用时 7 32时 推理用时 11.7 128 15.2
对m模型 bz = 1 推理用时为1.0 bz= 8 推理用时 7 32时 推理用时 9.2 128 8.4
有一个大佬还做了如下测试:
在这里插入图片描述
同时大佬还提到,设备硬件不同,结果也不同。
在这里插入图片描述

2. 修改batchsize尝试

2.1 benifit(好处)

由1batchsize和推理速度的关系 我们可以看到,做batchsize的增大,即批量传入图片做推理对性能提升是有帮助的。

然后去github上找好的范例:
相关的有

  1. https://github.com/ultralytics/yolov5/issues/7565
    在这里插入图片描述
    疑问是不清楚它是并行推理还是串行推理,这个截图的入参方式,我猜测大概率是串行的,没用。
    但是这个issue给了一个很好的指引,它是想确认:
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/bd92717fe54949b485d6cc67194aa784.png
    对640360的最佳推理方法? 因为无法固定图片高度,但是看到yolov的官方库推荐的是640640, 所以train用640640而export为TensorRT的时候修改为640360是否可行,还是首先将640360转成640640在做推理呢?
    在这里插入图片描述
    作者的回复是:train 用640*640,然后export和deploy 用你需要的矩形。
    这也是回答了我长久以来心中的疑问。

2.https://github.com/ultralytics/yolov5/issues/10362
这个issue 提到在export的时候可以dynamic batchsize,这样可以不固定batchsize。

3.https://github.com/ultralytics/yolov5/issues/9511
这个issue和我想做的事情完全一样。
在这里插入图片描述
第一个红框说的是,detect.py run inference at batch-size 1, 但是 you can use PyTorch Hub models to run inference at any batchsize

这里和作者讨论的事,可以在detect.py 直接修改batch_size, 我的版本yolov5 tag 6.1, 它就没有batchsize这个参数。
在这里插入图片描述

2.1 编码batchsize下的推理

根据以上的回答,yolov5的作者把我们引向了这里:https://docs.ultralytics.com/yolov5/
重点看这里:https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading/

import torch
path_weight = '/home/jianming_ge/workplace/yolov5_template/yolov5_template/weights/yolov5m6.pt'
model = torch.hub.load('/home/jianming_ge/workplace/yolov5_template/yolov5_template', 'custom', path=path_weight, source='local',autoshape = True) 
img_path1 = "/home/jianming_ge/workplace/yolov5_template/yolov5_template/data/images11/bus.jpg"
# 循环32次执行
imgs = [Image.open(img_path1)] 
%timeit [model(imgs) for _ in range(32)]  # batch-size 1 
# batch_size = 32 执行
%timeit model(imgs * 32)  # batch-size 32

在这里插入图片描述

32张单图片 耗时 739ms
batch_size = 32 耗时 291ms

%timeit 是python的语法糖,可以用来测试耗时,默认运行7次,求其平均的耗时。

ref:https://github.com/ultralytics/yolov5/issues/9987, 这个ref 作者明确说了,你的batch_size就是传过来的list的长度。也就是说可以自定义了。
在这里插入图片描述

2.2 发现问题

2.2.1 推理结束后,占用显存不释放。

推理过程中
在这里插入图片描述
推理结束后,它依然会占用最大的显存10000Mb不释放。应该如何破?? 权重加载的时候才2000Mb。

解决方案:
orch.cuda.empty_cache() 加上这句话,它在推理结束后就只保留原始的2000MB的显存使用情况了。
ref:https://blog.csdn.net/weixin_44826203/article/details/130401177

import torch
from PIL import Image
import time
path_weight = '/home/jianming_ge/workplace/yolov5_template/yolov5_template/weights/yolov5m6.pt'
model = torch.hub.load('/home/jianming_ge/workplace/yolov5_template/yolov5_template', 'custom', path=path_weight, source='local',autoshape = True) 
img_path1 = "/home/jianming_ge/workplace/yolov5_template/yolov5_template/data/images11/bus.jpg"
imgs = [Image.open(img_path1)] 
for _ in range(10):
    results = model(imgs * 128)
    results.print()
    torch.cuda.empty_cache()
    time.sleep(2)
time.sleep(1000)

2.3 其它有用的参数设置

ref:https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading/#detailed-example
在这里插入图片描述
后面还有分显卡推理啥的,yolov给封装的很好
pytorch的显存知识总结:https://zhuanlan.zhihu.com/p/424512257 这个娃是研究并行计算的猛人!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts 进度条 样式图表

示例图 代码 <!-- *flat-bar-chart *author yuge *date 2023/6/26 16:21 --> <template><div class"flat-bar-chart-main" ref"chartDiv"></div> </template><script> import * as echarts from echartsexport defau…

阿里云国际站:云原生数据库2.0时代,阿里云如何将云原生进行到底?

【猎云网上海】11月3日报道&#xff08;文/孙媛&#xff09; “PolarDB将云原生进行到底&#xff01;” 在2021年云栖大会上&#xff0c;阿里巴巴集团副总裁、阿里云智能数据库事业部总负责人李飞飞宣布了PolarDB实现三层解耦的重磅升级以及引领云原生数据库技术持续创新的态…

Java性能权威指南-总结25

Java性能权威指南-总结25 数据库性能的最佳实践随机数Java原生接口字符串的性能 数据库性能的最佳实践 随机数 Java7提供了3个标准的随机数生成器类&#xff1a;java.util.Random、java.util.concurrent.ThreadLocalRandom以及java.security.SecureRandom。这三个类在性能方面…

SpringBoot教学资料1-SpringBoot基础

SpringBoot简介 Spring Boot 优点 •可快速构建独立的Spring应用 •直接嵌入Tomcat(无需部署WAR文件) •提供依赖启动器简化构建配置 •极大程度的自动化配置Spring和第三方库 •提供生产就绪功能 •极少的代码生成和XML配置 •Spring Boot是基于Spring框架开发的全新框架&…

jenkins使用ftp工具,上传文件至服务器报错“Could not write file”

一、错误说明 使用ftp上传文件 ERROR: Exception when publishing, exception message [Could not write file. Server message: [553 Could not create file.]]11:12:45 FTP: Connecting from host [test-xxx-java-user-service-3-932ft-hsb69-t5wmf] 11:12:45 FTP: Conne…

『DotNetBrowser』.Net的浏览器嵌入组件,该选择DotNetBrowser 还是 CefSharp?

&#x1f4e3;读完这篇文章里你能收获到 全方位对比DotNetBrowser 和 CefSharp的优缺点 文章目录 一、引言二、引擎三、架构1. CefSharp架构2. DotNetBrowser架构 四、对比1. 稳定性和内存使用2. 应用程序域3. AnyCPU4. H.264, AAC5. 安全6. Visual Studio设计器7. 嵌入应用程…

通过DAPLink和STLink使用RTT输出日志

前提 阅读此文章的前提是已经移植好SEGGER RTT&#xff0c;如未移植请参考我的另一篇博客 《基于J-Link RTT Viewer输出日志(适用于JLink DAPLink STLink)》 由于SEGGER RTT 自带的 JLinkRTTViewer.exe 只支持自家的J-Link&#xff0c;所以使用DAPLink和STLink我们得另辟蹊径…

【设计模式】第二十一章:命令模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

shiro系列vulhub所有漏洞复现CVE-2020-1957、CVE-2016-4437、CVE-2010-3863、shiro-721 代码执行

文章目录 Apache Shiro 认证绕过漏洞&#xff08;CVE-2020-1957&#xff09;漏洞详情&#xff1a;复现&#xff1a; Apache Shiro 1.2.4反序列化漏洞&#xff08;CVE-2016-4437&#xff09;漏洞详情&#xff1a;复现: Apache Shiro 认证绕过漏洞&#xff08;CVE-2010-3863&…

实验二(OSPF+PPP+hub-spoke)7 5

1.合理划分IP地址&#xff1a; R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a; 2.启用OSPF单区域&#xff1a; R1及路由表&#xff1a; [r1]display ip routing-table protocol ospf R2及路由表&#xff1a; R3及路由表&#…

Atlassian Jira Software 9.9.1 特别版

敏捷团队首选的软件开发工具&#xff0c;Atlassian Jira Software 专为软件团队中的每位成员构建&#xff0c;可用于规划、跟踪和发布卓越的软件。 Scrum 板 利用可自定义的 Scrum 板&#xff0c;敏捷团队可集中精力尽可能迅速地交付迭代和增量价值。 看板 借助灵活的看板图&am…

【MySQL】在Linux下删除和安装MySQL

文章目录 一、前言二、检查、卸载内置环境三、获取mysql官方yum源四、正式安装MySQL服务五、登录MySQL配置my.cnf设置开机启动 一、前言 大家好久不见&#xff0c;今天开始分享关系型数据库Mysql的一些知识。 二、检查、卸载内置环境 2.1 首先使用命令查询当前mysql的运行状…

解决dbeaver查询结果乱码问题

问题描述&#xff1a; 通过dbeaver查询informinx 查询结果数据集是乱码 解决方案 &#xff1a; 右键编辑连接 在驱动属性里面新增 用户属性 NEWCODESET 值为 GBK,8859-1,819 解决数据库本身就是GBK编码&#xff0c;但是查询结果集编码不一致难题

Python+CNN 手写公式识别计算系统

系统&#xff1a;Win10 环境&#xff1a;Pycharm/Vscode Python3.7 效果图&#xff1a; 部分代码如下&#xff1a; import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torchvision import datasets,transforms#定义…

5.8.9 TCP拥塞控制

5.8.9 TCP拥塞控制 我们先来说一个生活中的例子&#xff0c;在节假日到来的时候&#xff0c;由于高速公路免费通行&#xff0c;大量汽车涌上高速公路&#xff0c;最终造成交通拥堵&#xff0c;类似的情况也有可能出现在网络中&#xff0c;由于核心的交换设备在存储、带宽、速率…

ReentrantReadWriteLock读写锁

1、锁的分类 2、读写锁 读锁&#xff1a;共享锁 写锁&#xff1a;独占锁 3、代码01 class MyCache{private volatile Map<String,Object> map new HashMap<>();private ReadWriteLock rwLock new ReentrantReadWriteLock();public void put(String key,Obje…

Windows 如何打开和编辑.lnk文件

文章目录 一、背景二、查看/修改.lnk文件内容方案1&#xff1a;用type命令查看方案2&#xff1a;更改.lnk文件后缀为.txt再查看方案3&#xff1a;用记事本或NodePad打开方案4&#xff1a;使用HxD hex editor十六进制编辑器方案5&#xff1a;使用第三方库查看或编辑1. Matmaus/L…

GO语言中Protocol buffer简介

Protocol buffer 一、Protobuf简介 1.1、RPC 通信 对于单独部署&#xff0c;独立运行的微服务实例而言&#xff0c;在业务需要时&#xff0c;需要与其他服务进行通信&#xff0c;这种通信方式是进程之间的通讯方式&#xff08;inter-process communication&#xff0c;简称I…

机器学习 day23(激活函数的作用,线性激活函数的不足)

线性激活函数的局限性 如果我们将神经网络模型中的所有激活函数都设为线性激活函数&#xff0c;那整个神经网络模型就跟线性回归模型极其相似&#xff0c;且它无法拟合比线性回归模型更复杂的关系 激活函数全设为线性回归激活函数的例子 若把a带入a&#xff0c;则a可简化为…

Unity包体积优化实践

目录 简述优化前优化中assets目录资源ab包动态下发资源大小优化dll大小优化场景模型动态下载和加载优化assets目录后大小 lib目录优化目标架构裁剪代码优化代码和引用 其他优化项Shader优化Release模式编译选项 优化后 简述 在移动端App混合Unity开发的项目中&#xff0c;Unit…