Tencent / ncnn

ncnn is a high-performance neural network inference framework optimized for the mobile platform
Other
20.13k stars 4.14k forks source link

ncnn多线程下工作性能下降 #773

Closed dengly closed 4 years ago

dengly commented 5 years ago

经测试发现,ncnn 通过设置 set_num_threads 设置多个线程时,设置到8个线程性能还不如2个线程的性能。而且在java层面上,创建多个线程同时做人脸检测时,性能也不如单个线程做人脸检测。

onexuan commented 5 years ago

同样遇到这个问题

nihui commented 5 years ago

小模型推荐单线程,跑起来会比较稳定 ...

dengly commented 5 years ago

修改jni 的代码后,发现在java层面上,多个线程同时做人脸检测有了提高,但是 ncnn 设置 set_num_threads 过多依然有问题。

GaussRieman commented 5 years ago

不知道楼主是否使用了绑定核心的接口?8线程不如2线程,是Android多线程非常常见的一种情况。Android需要考虑多核调度,大小核的算力差距很大,即便使用多核,也尽量只使用大核数的线程,比如4+4的核心配比,比较好的设置是4线程,而不是8线程,如果是2+2,则2线程往往比4线程快的多。

dengly commented 5 years ago

我使用4+4的核心手机,仅仅设置4线程也是不如2线程

Andrawzyf commented 5 years ago

也遇到了类似的,我是2线程加到4线程几乎没有速度上的改变。。。

liushuan commented 5 years ago

同样的问题,用大模型100M左右设置多线程还是比单线程慢

zhijiewangLUNAID commented 5 years ago

我在Raspberry Pi上测试SSD Mobilenet 目标检测的时候也有这个问题。总共有4个线程,但是3或4个线程和2个线程的速度几乎一样。希望Tecent ncnn能够解决一下这个问题,因为似乎是个普遍的问题。

helloearth012 commented 5 years ago

小模型推荐单线程,跑起来会比较稳定 ...

@nihui 您说的小模型,有没有一个大概量化的东西来说,多小最好用单线程,多大用多线程?这个大小您是讲model的size吗?

helloearth012 commented 5 years ago

我使用4+4的核心手机,仅仅设置4线程也是不如2线程 @dengly 请问您用2线程比单线程快多少? 您用线程的时候,如何选择线程跑在4个大核上还是4个小核上?多谢啦

zym1119 commented 5 years ago

可以试试把powersave改成2,我在845上测试powersave=2, num_threads=4的时候最快,这时候就是纯纯地用四个大核四个线程在跑

Pinnh commented 5 years ago

4+4的cpu 在主线程上跑,num_threads=4得到了最好的加速,主线程可以运行在4大核心上? 在子线程上跑,num_threads=1最快,其他设置则非常慢,子线程只能运行在1个大核心上,其余threads被分配到了小核?

Pinnh commented 5 years ago

solved,new version ncnn code

include "cpu.h"

ncnn::set_cpu_powersave(2);//only big cores ncnn::set_omp_dynamic(0); ncnn::set_omp_num_threads(num_threads);

zxj7b80 commented 4 years ago

solved,new version ncnn code

include "cpu.h"

ncnn::set_cpu_powersave(2);//only big cores ncnn::set_omp_dynamic(0); ncnn::set_omp_num_threads(num_threads);

请问,你最终是设置4线程吗?我的机器也是4+4,绑定big core后,还是1线程最快。

Pinnh commented 4 years ago

@zxj7b80 可以尝试将cpu.cpp中的g_powersave改为默认值2 static int g_powersave = 2;

其他需要注意:

  1. 确认开启了omp
  2. 一般在对象(模块)初始化时调用以上函数
  3. 多个模块时num_threads应保持一致,尤其是A模块 num_threads>1时,B模块也应 num_threads>1
zxj7b80 commented 4 years ago

@Pinnh 按照你的方法设置了,应该是设置成功了,因为不同线程数速度是不一样的;4+4的核,线程设置2是最快的;在其他3部手机,也是4+4的配置,但是不同的cpu,也是2线程最快;理论上是不是绑定4个大核是最快的,你测试的时候是几个线程最快呢?

Pinnh commented 4 years ago

@zxj7b80 你可能没有绑定成功, 我的也是4+4的核心,4线程最快,运行速率和线程数正相关 你的这种情况和我以前遇到的问题很像,也是2线程最快,感觉ncnn里面有bug,这个问题我是解决了,但是其他人在这个问题上不是很稳定

nihui commented 4 years ago

用最新的ncnn版本,应该就没有问题了,如果还有问题可以 reopen issue 继续讨论