PaddlePaddle / PaddleDetection

Object Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.
Apache License 2.0
12.82k stars 2.89k forks source link

picodet新旧版本推理速度问题 #5505

Open sp-ljw opened 2 years ago

sp-ljw commented 2 years ago

我在使用最新的2.4版本的picodet_xs_320_voc_lcnet模型(仅更换了成了voc数据集)和2.3版本的picodet_s_320_voc模型用c++ demo来推理相同数据集。

picodet_xs_320_coco_lcnet的处理结果如下: I0329 20:55:39.949678 40395 main.cc:59] ----------------------- Config info ----------------------- I0329 20:55:39.949775 40395 main.cc:60] runtime_device: CPU I0329 20:55:39.949779 40395 main.cc:61] ir_optim: True I0329 20:55:39.949784 40395 main.cc:62] enable_memory_optim: True I0329 20:55:39.949797 40395 main.cc:69] enable_tensorrt: False I0329 20:55:39.949800 40395 main.cc:70] precision: fp32 I0329 20:55:39.949803 40395 main.cc:72] enable_mkldnn: False I0329 20:55:39.949806 40395 main.cc:73] cpu_math_library_num_threads: 1 I0329 20:55:39.949810 40395 main.cc:74] ----------------------- Data info ----------------------- I0329 20:55:39.949813 40395 main.cc:75] batch_size: 1 I0329 20:55:39.949816 40395 main.cc:76] input_shape: dynamic shape I0329 20:55:39.949820 40395 main.cc:77] ----------------------- Model info ----------------------- I0329 20:55:39.949836 40395 main.cc:79] model_name: picodet_xs_320_voc_lcnet I0329 20:55:39.949841 40395 main.cc:80] ----------------------- Perf info ------------------------ I0329 20:55:39.949846 40395 main.cc:81] Total number of predicted data: 163 and total time spent(ms): 16101 I0329 20:55:39.949849 40395 main.cc:84] preproce_time(ms): 8.02807, inference_time(ms): 90.7461, postprocess_time(ms): 2.33119

picodet_s_320_voc的处理结果如下: I0329 21:00:47.205097 40713 main.cc:76] ----------------------- Config info ----------------------- I0329 21:00:47.205195 40713 main.cc:77] runtime_device: CPU I0329 21:00:47.205200 40713 main.cc:78] ir_optim: True I0329 21:00:47.205204 40713 main.cc:80] enable_memory_optim: True I0329 21:00:47.205219 40713 main.cc:89] enable_tensorrt: False I0329 21:00:47.205221 40713 main.cc:91] precision: fp32 I0329 21:00:47.205225 40713 main.cc:94] enable_mkldnn: False I0329 21:00:47.205229 40713 main.cc:95] cpu_math_library_num_threads: 1 I0329 21:00:47.205231 40713 main.cc:96] ----------------------- Data info ----------------------- I0329 21:00:47.205235 40713 main.cc:97] batch_size: 1 I0329 21:00:47.205238 40713 main.cc:98] input_shape: dynamic shape I0329 21:00:47.205241 40713 main.cc:100] ----------------------- Model info ----------------------- I0329 21:00:47.205260 40713 main.cc:102] model_name: picodet_s_320_voc I0329 21:00:47.205264 40713 main.cc:104] ----------------------- Perf info ------------------------ I0329 21:00:47.205268 40713 main.cc:105] Total number of predicted data: 163 and total time spent(ms): 9876 I0329 21:00:47.205272 40713 main.cc:108] preproce_time(ms): 7.82403, inference_time(ms): 52.6086, postprocess_time(ms): 0.16433

可以看到XS模型的耗时比S模型的耗时要接近多一倍。我XS模型是2.4release里导出的,使用2.2demo测试的;S模型是2.3release导出的,使用2.3demo测试的。

理论上benchmark下XS应该和S差不多速度的,是不是哪里处理得不太对

yghstill commented 2 years ago

@sp-ljw 看你的测试结果是不符预期的,xs模型比原s模型参数量和flops小很多,应该更快。

  1. 如果CPU预测,建议开启MKLDNN,同时cpu_threads设置到10。
  2. 最新2.4版本下PicoDet默认将后处理包含在网络中,如果测试benchmark,设置`-o export.benchmark=True再试下。
sp-ljw commented 2 years ago

@sp-ljw 看你的测试结果是不符预期的,xs模型比原s模型参数量和flops小很多,应该更快。

  1. 如果CPU预测,建议开启MKLDNN,同时cpu_threads设置到10。
  2. 最新2.4版本下PicoDet默认将后处理包含在网络中,如果测试benchmark,设置`-o export.benchmark=True再试下。

我理解CPU预测应该在同等条件下(一个线程,无mkldnn,速度应该也是新的xs快,旧的s慢)。 实际测试下来,都开了mkldnn时,xs预测时间为21ms, s预测时间为28ms,这个会受到加速库的明显影响,结果变得符合预期了。 1.我设置了benchmark=True,即关闭了NMS和后处理再export。然后放入有代码后处理的工程内,无mkldnn时,推理速度依然没有明显提升,仅90ms->89ms。我用了deploy里的python推理也是同样的现象 2.我尝试使用了官方提供的picodet_xs_320_coco_lcnet.pdparams, 这个推理速度与我上述的测试是一样的。

yghstill commented 2 years ago

@sp-ljw 你说的速度是指端到端的包含前后处理的速度吧?前处理有性能问题,这个我们高优看下,同时近期会推出openvino推理demo,实测速度有大幅提升,可以关注下。

sp-ljw commented 2 years ago

@sp-ljw 你说的速度是指端到端的包含前后处理的速度吧?前处理有性能问题,这个我们高优看下,同时近期会推出openvino推理demo,实测速度有大幅提升,可以关注下。

你好,不是的,按c++的demo来看,inference_time(ms)仅仅包含输入模型与模型输出(即纯infer)部分,目前看来的问题在于无mkldnn加速时,增强picodet处理确实比初版picodet要infer得慢一些且有接近一倍,不太符合预期。有mkldnn时却会符合预期。我不确定的是在端侧部署时,若没有对应的硬件加速的话,是否反而产生了负优化了。