当前位置:   article > 正文

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

yolov5并行推理


前言

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.3 其它有用的参数设置

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/140405?site
推荐阅读
相关标签
  

闽ICP备14008679号