之前已经写好了多线程的程序,得到了前所未有的加速比,因此就有了刷速度的想法,想看看到底能加速到什么程度,这里做一个记录

基础加速

img

多线程在线程数增加的同时,加速比的增加速度并不能赶上理论加速的的增长。这主要是线程之间的处理并非完全独立,具体到python,则是GIL锁作用的结果,虽然如此,也不能说多线程完全是没有用的。

tu

线程数的增加,伴随着单个线程处理数据耗时的增加。最显著的是神经网络的推理部分,几乎是随着线程数的增加线性增长。这说明神经网络的推理过程几乎是不可通过多线程加速的,可能是GIL锁作用的结果。相比之下,IO任务收到的的影响要小的多

调换预处理数据

既有的预处理步骤是先重采样到512再进行后续的处理,这在原本的道数大于512时是一个正确的选择,但是本次的道数只有一百多,因此可以通过调换预处理的顺序来减少需要预处理的部分。在20线程情况下,这能够将加速比提升到435倍,这意味这24h的数据可以在3.31分钟内完成。

t

取消画图处理

为了避免漏检测,我将所有检测的结果都画图展示出来了,这样的好处是我可以随时查看输出的结果,但是其实很多时候这是不必要的,我可以用专门的程序画需要的图,避免占用检测时间。在20线程情况下,这能够将加速比提升到584倍,这意味这24h的数据可以在148秒内完成。

增加线程

虽然在20个线程以上增加线程的收益很低,但是总归是有的,提升到30个线程时,能够将加速比提升到623倍,这意味这24h的数据可以在138秒内完成。

降低overlap

原流程会在检测边框设定overlap避免检测信号出现在检测窗口的边缘,之前的设定为0.5,实际操作并不需要这么密集,可以通过增加网络的泛化性来降低这一要求。将overlap调整为0.2时,能够将加速比提升到800倍,这意味这24h的数据可以在108秒内完成。

最终加速

overlap=0.2 线程数=40,能够将加速比提升到834倍,这意味这24h的数据可以在103.6秒内完成。

其实在多线程操作后,速度已经是非常快,进行再加速实际意义不如理论意义那么大,更多的是思考程序中可以加速的部分。这里实际上并不是最快的加速方法,值得加速的地方还是比较多,但是需要重构代码。我起初认为神经网络的预测时间很长,多线程没有起到加速的效果,但是实际上测试的结果是,20个线程起到了至少十倍的加速效果,这也是相当有意义的加速结果。如果换成单线程,会大大降低加速效果。目前来看的问题是:

预处理部分有一些操作没有使用数组运算,因此会拖累计算结果。

增加线程数的同时,加速比增量增长缓慢

python自身的GIL可能引发了一定的性能瓶颈

因此以后如果想要进一步的加速,可以考虑的方向是,创建数据池,用五个线程进行io,15个线程进行预处理,15个线程进行检测,15个备用。这样可能可以避免线程优化能力撞墙,但是可能还是会遇到GIL锁的问题。另一个优化的方向是吧预处理换成不那么费时间的操作,但是这可能涉及到重构网络。第三个办法就是换一种语言,但是需要重构的函数太多,暂时不想这么做。