Z-yq / TensorflowASR

一个执着于让CPU\端侧-Model逼近GPU-Model性能的项目,CPU上的实时率(RTF)小于0.1
Apache License 2.0
461 stars 111 forks source link

transducer解码时lstm存在大量重复计算 #33

Closed CharlesSL closed 3 years ago

CharlesSL commented 3 years ago

在Transducer类中的perform_greedy方法里,循环中的pred_net用到了lstm进行解码,每次都会对所有decoded的完整序列走一遍lstm,实际只需要解码最后一步来判断是否输出0或者blank即可,在长序列预测下能节省大量时间image

Z-yq commented 3 years ago

感谢指出,能看出这里有重复计算都是高手,给你点个赞!

这个地方这么写是为了配合 TF C 2.3.0版本的模型加载,因为不这样写C版本的推理会有问题,详见问题issue:

https://github.com/tensorflow/tensorflow/issues/44428 至于issue中回复的方法有没有work我没有尝试过,好像是有的work有的不work

transducer_wrap_python.py中有正确的推理方法 XD

CharlesSL commented 3 years ago

感谢解惑,这个问题我暂时还没遇到,不过用tensorflow处理控制流变量的处理上倒是踩过很多坑,我采样了一些transducer的帧级别输出,以及辅助训练的ctc_dense网络的帧级输出,发现它们对齐后的误差并不大,我在考虑工程化方案中,分离encoder和decoder,将输出结果根据精度要求,采用transducer或ctc_dense+ctc_decode做infer,后者速度会提高很多。同时encoder在分离后可以并行处理,与不能并行的transducer分开处理,更适合生产环境

Z-yq commented 3 years ago

感谢分享嗷

今日更新的streaming结构是encoder和decoder分开了,其infer的速度还是非常可观的。

CharlesSL commented 3 years ago

好的,后面再去研究一下,从项目里学到很多,感谢