UNeedCryDear / yolov8-opencv-onnxruntime-cpp

yolov8 hub,cpp with onnxruntime and opencv
Apache License 2.0
337 stars 59 forks source link

这是一个性能请教的问题,无关代码bug #66

Open xk-dragonfly opened 2 hours ago

xk-dragonfly commented 2 hours ago

大佬们好,我是一个刚开始学习ort的新手,我有一个问题 在所有onnx的头文件中都有个_batchSize 属性,我发现这个初始化的_batch_size属性会极大的影响性能,下面以yolov8_pose_onnx为例 我在一次程序运行中测试了1,2,4,16,32,64,128不同批次下的推理性能,即我修改了OnnxBatchDetect函数,在进入OnnxBatchDetect函数后我主动修改_batchSize 为srcImgs的size,然后仅测试_OrtSession->Run的运行时间,我发现默认设置的_batchSize值总是性能最优的(平均下来单帧推理时间最短) 即如果我在yolov8_pose_onnx.h中设置_batchSize=1,那么测试后就发现批次为1的性能最好(远远好于其他批次); 如果我在yolov8_pose_onnx.h中设置_batchSize=64,那么测试后就发现批次为64的性能最好(也是远远好于其他批次);

这是为什么呢?

UNeedCryDear commented 2 hours ago
  1. 确认下你导出的onnx模型是否为dynamic的,使用https://netron.app 可以打开onnx文件,看下输出这边是具体的数字还是bs,3,h,w这种变量。该参数只对dynamic模型起作用,如果你本身导出的是静态的模型,这个参数不会起作用。
  2. 关于你说的这个batch size的问题,这个跟你的资源利用相关,牵扯到硬件相关,这个每个人都不一样。简单一句话概括就是木桶理论,在batch设置到木桶最短板的极限的时候,这个时候是性能利用最高的地方。另外,也不是说一定会最佳,假设来说一批次图片一共20张,你设置batch size为16,那个剩下的4张需要额外补齐12张到16才可以推理,这就意味着平白耗时,这种还不如batch 为4,然后跑5轮对资源的利用合算。其他的情况类似。