Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

多核CPU利用率与并发性能问题 #51

Open
acely opened this issue Feb 17, 2023 · 15 comments
Open

多核CPU利用率与并发性能问题 #51

acely opened this issue Feb 17, 2023 · 15 comments

Comments

@acely
Copy link

acely commented Feb 17, 2023

测试环境Rocky Linux 8

简述:

在两台配置不同的机器上分别编译并测试paraformer_cli,在fftw和openblas版本都相同的前提下,识别同一个30分钟的音频文件,结果发现CPU更强的电脑跑的反而更慢。

可以看到两台机器的CPU都吃满了,机器A识别耗时75秒,机器B耗时120秒。

机器A:

  • AMD R5 3500X (6核6线程)*1颗
  • RAM 16G
    WX20230217-154014

机器B:

  • Intel E5-2680V4 (14核28线程)*2颗
  • RAM 32G
    WX20230217-151208

思考:

有没有可能线程太多反而导致cpu疲于调度?我目前还不清楚这个多线程是主程序openblas还是管理的,能否通过传参指定线程数量?这样方便测试线程与性能的关系。

指定线程数量还有个好处,就是我可以每个进程分配若干CPU内核,同时处理不同的文件。

@chenkui164
Copy link
Owner

chenkui164 commented Feb 17, 2023

多线程完全是由openblas管理的可以通过环境变量指定
export OPENBLAS_NUM_THREADS=4

这个领域的问题太专业了,我回答不了。。。。

还有一个因素是内存的频率,机器B显然是台服务器,它每个核心的主频是在2.4G,所以我怀疑他的内存频率也不是很高。
30分钟的语音经过VAD大概有几十句话,或者100多句话,就说明需要将800M的模型从内存搬移到CPU几十次或者100多次,可能性能瓶颈在这里。可能性能是卡在IO上了。但我也是猜的,没有啥证据。。。。

@cgisky1980
Copy link

mark
所以默认是跑满cpu核心数的线程 还是默认比如4?

@acely
Copy link
Author

acely commented Feb 18, 2023

@cgisky1980 目前默认是跑满CPU核心,其他情况我在测试

@znsoftm
Copy link
Contributor

znsoftm commented Feb 23, 2023

是不是单核能效的原因? 至强核多,但是单核 不灵。在同样的线程数下速度有差异。也有可能是支持的指令集差异,比如虽然cpu较低,但是它支持新的指令,效率更高。

@znsoftm
Copy link
Contributor

znsoftm commented Feb 23, 2023

E5 2680V4 是 Q1'16 比较老的平台,单核性能确实不如R5

@znsoftm
Copy link
Contributor

znsoftm commented Feb 23, 2023

让它的多核 火力全开,估计能打得过

@acely
Copy link
Author

acely commented Feb 24, 2023

让它的多核 火力全开,估计能打得过

哈哈,rapidocr的大佬也来了666
你看我的机器B截图,他已经火力全开了,但速度并不能上来

@chenkui164
Copy link
Owner

fastasr代码里有部分是未进行多线程并行化的。
因为OpenBLAS有pthread版本和OpenMP两个版本。pthread版本性能会比OpenMP版本高一些。使用pthread版本的OpenBLAS,如果fastasr使用OpenMP优化,这两者会产生冲突,反而变的更慢了。

@acely
Copy link
Author

acely commented Feb 25, 2023

fastasr代码里有部分是未进行多线程并行化的。 因为OpenBLAS有pthread版本和OpenMP两个版本。pthread版本性能会比OpenMP版本高一些。使用pthread版本的OpenBLAS,如果fastasr使用OpenMP优化,这两者会产生冲突,反而变的更慢了。

我是通过源码编译安装的openblas(按照树莓派的流程),这样属于pthread版还是openmp版?

@acely
Copy link
Author

acely commented Feb 25, 2023

近期测试结果如下,共测了3台机器:
image
目前可以总结出大致规律:

  • 并非openblas线程数越多越好
  • 2线程比1线程提升较大,线程再多则提升较小
  • 线程数等于CPU物理核心数时效率最好

不足之处欢迎补充

@chenkui164
Copy link
Owner

感谢,默认OpenBLAS是pthread版本的

@znsoftm
Copy link
Contributor

znsoftm commented Feb 25, 2023

如果方便,也可以测试一下这个: https://github.com/RapidAI/RapidASR

可以编译一个cpp版本,在cpp_onnx目录中。大体这个就是fastASR的onnx引擎版本。

@znsoftm
Copy link
Contributor

znsoftm commented Feb 25, 2023

看了你上面的结果,感觉还是单核性能影响比较大。

@acely
Copy link
Author

acely commented Feb 28, 2023

如果方便,也可以测试一下这个: https://github.com/RapidAI/RapidASR

可以编译一个cpp版本,在cpp_onnx目录中。大体这个就是fastASR的onnx引擎版本。

OK,测试结果我po在你的仓库里

@cgisky1980
Copy link

image
线程也不是越多越好 我在RK3588 (四大四小8核)上跑 4 线程看来最快

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants