DefTruth / lite.ai.toolkit

🛠 A lite C++ toolkit of awesome AI models, support ONNXRuntime, MNN, TNN, NCNN and TensorRT.
https://github.com/DefTruth/lite.ai.toolkit
GNU General Public License v3.0
3.64k stars 696 forks source link

一个程序里面启用多个session耗时问题 #231

Closed xiaowenhe closed 2 years ago

xiaowenhe commented 2 years ago

你好,非常感谢你的工作,受益匪浅。嗯,有个小问题,想咨询下你。你有没有做个一个程序里面启用2个乃至3个session的问题。比如,我可以把scrfd和plfd同时调用,实现更好的人脸检测和人脸关键点检测。但是,在这种情况下,两个session运行时间会远大于每次启用一个session的运行时间(比如,我单独测试scrfd或者pfld的时候,它们的运行时间分别为10ms和1ms,但是一个程序里面同时运行scrfd和pfld的时候,运行时间可能超过20ms了,远大于10+1=11ms),也就是一个程序里面启动两个session的时候,内部cpu使用发生了竞争的情况。不知道你有没有做过这方面的实验,能不能给出一些改进的建议来尽可能的优化运行时间问题?或者直接在你的工程里面添加这种级联使用,但是耗时能得到改善的的例子最好了,感谢!

DefTruth commented 2 years ago

你好~ 我实现的时候采用的是默认的线程数为1的设置,可以看scrfd.h和ort_handler.h这两个简单的类实现。

所以你可以尝试修改不同的线程数,看看是否能提高性能。另外,onnxruntime里可以通过session_option设置intra和inter线程数,你可以尝试在ort_handler.cpp中添加修改,重新编译lite.ai.toolkit试一试。

  SessionOptions& SetIntraOpNumThreads(int intra_op_num_threads);
  SessionOptions& SetInterOpNumThreads(int inter_op_num_threads);

可以参考onnxruntime官方性能调优文档哈,因为时间有限,所以我这里采用的都是默认实现。

xiaowenhe commented 2 years ago

@DefTruth ,你好,我根据官方给的性能调优文档,尝试了下,并没有很直接的效果,或许是我使用的不对。您要有时间的话,如果可以的话,也请帮忙尝试下。谢谢!

DefTruth commented 2 years ago

这应该跟onnxruntime的session机制相关,讲真的,我没有很深入研究过。一是因为时间有限,二是因为我并不是搞推理引擎的,我主要做算法研究。所以这个开源项目主要关注还是具体细分算法层面的处理逻辑,比如目标检测、分割、抠图、人脸检测等,性能的相关的就直接交给推理引擎了。所以把lite.ai.toolkit当做一个推理引擎的应用资源,或常用算法的C++后处理的学习资料,会比较合适。性能这块,你可以考虑两个方式:

xiaowenhe commented 2 years ago

好的,谢谢! 我也是做算法,平时只关注算法层面的效果了,对这些了解不多。等我再研究研究onnx session。