chenkui164 / FastASR

这是一个用C++实现ASR推理的项目,它依赖很少,安装也很简单,推理速度很快,在树莓派4B等ARM平台也可以流畅的运行。 支持的模型是由Google的Transformer模型中优化而来,数据集是开源wenetspeech(10000+小时)或阿里私有数据集(60000+小时), 所以识别效果也很好,可以媲美许多商用的ASR软件。
Apache License 2.0
482 stars 74 forks source link

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

Open acely opened 1 year ago

acely commented 1 year ago

测试环境Rocky Linux 8

简述:

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

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

机器A:

机器B:

思考:

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

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

chenkui164 commented 1 year ago

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

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

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

cgisky1980 commented 1 year ago

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

acely commented 1 year ago

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

znsoftm commented 1 year ago

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

znsoftm commented 1 year ago

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

znsoftm commented 1 year ago

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

acely commented 1 year ago

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

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

chenkui164 commented 1 year ago

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

acely commented 1 year ago

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

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

acely commented 1 year ago

近期测试结果如下,共测了3台机器:

image

目前可以总结出大致规律:

不足之处欢迎补充

chenkui164 commented 1 year ago

感谢,默认OpenBLAS是pthread版本的

znsoftm commented 1 year ago

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

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

znsoftm commented 1 year ago

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

acely commented 1 year ago

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

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

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

cgisky1980 commented 1 year ago

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