libtorch-gpu推理时占用CPU 100%问题解决
可能很多童鞋在利用libtorch进行pytorch模型加速的时候并没有注意过CPU的占用问题,可甚至有时候觉得能调通模型都觉得很好了。然而事实是越精越好(或者CPU的占用其实也影响模型的推理性能),可能觉得我说法有些问题,因为本来用的是GPU进行计算。注意此处的解释根据个人理解而来:
首先先引入几个概念:
-
cpu个数是指物理上安装了几个cpu,一般的个人电脑是安装了1个cpu
-
cpu内核数是指物理上,一个cpu芯片上集成了几个内核单元,现代cpu都是多核的。
-
cpu线程数是指逻辑上处理单元,这个技术是Intel的超线程技术,它让操作系统识别到有多个处理单元
这里特别时候说一下:torch.get_num_threads()
返回的本机为6, C++返回为12(针对我的本机),我的理解是,python返回的是Returns the number of threads used for parallelizing CPU operations, 也就是指的是内核书,而C++返回的是线程数,及处理单元(处理器)个数;
在C++下,libtorch默认是开启全部线程数,若线程全开(可用cout << "当前使用线程数: "<< at::get_num_threads() << endl;
打印查看), 默认本身不需要那么多,可能出现超额订购(我的理解是跑车开山路),整体性能反而没那么好,表现的是推理时间反而增加。这是我线程全开的推理时间:
然后我设置:at::set_num_threads(1);
整体推理时间如下,推理性能反而增加(典型一个和尚挑水吃):
针对这个现象,我在官方了解到:
由此说来,的确和我猜想一直,并不是内核全开为好。
所以一旦自己libtorch 模型运行成果,下一步就应该考虑细优化,去看看线程数的影响:
只要加入如下两句话:
#include “ATen/Parallel.h”
at::set_num_threads(1);
这样就可以根据实际线程数去绘制线程与耗时曲线,选择最佳线程数去匹配自己的模型。
参考地址:https://pytorch.org/docs/master/notes/cpu_threading_torchscript_inference.html?highlight=get_num_threads
我叫谢琛,深度学习探索者一枚!(有意咨询xiec177)
tensorflow/pytorch交流群请加QQ:548368797
更多咨询咨询请关注!