快捷搜索: 王者荣耀 脱发

部署wenet预训练语音识别模型到服务器端

背景

实习的时候要求将预训练模型部署到服务器端,测试模型推理的性能和效率。本来简单的直接用wenet的服务器框架就可以,但要求使用gpu以及支持多个batchsize并且支持多并发,可是wenet的服务器框架并不支持这个而且它是基于C++开发的,想通过修改原C++代码难度非常大,不管是代码推理部分的理解与修改、C++的websocket通信以及修改后的debug和编译,都是巨大的难关。在徘徊的过程中组长给我发了一个小米开源的服务器部署项目sherpa,sherpa的主体部分即模型部署和通信协议是基于python的,而且支持使用gpu以及支持多个batchsize并且支持多并发,完全满足需求,可是sherpa的基于C++开发的模型加载与推理代码仅仅支持RNNT模型而不支持wenet的预训练模型,这就尬住我了。 在这种情况下,我一直在犹豫怎么把sherpa和wenet的代码结合一下,一边理解两边的代码,一边犹豫,最后放弃。 放弃后觉得实现不太可能实现后与组长开了一次会,再次开会确定目标,使用onnx模型来进行加载推理和部署,因为wenet有现成的onnx的python加载和推理代码,而sherpa有现成的python的服务端客户端交互代码,因此这样实现可以简单的得到实现。然鹅也并不简单,花了一天时间调通,实现onnx模型部署,使用gpu以及支持多个batchsize并且支持多并发。

实现

本次实现是基于sherpa目录下的./sherpa/bin/pruned_transducer_statelessX/ 的offline_server.py、offline_client.py、decoder_manifest.py以及wenet目录下面的./examples/aishell/s0/wenet/bin/的recognize_onnx.py总共四个文件。 说一下总体思路:sherpa的offline_server.py包含对它自己RNNT模型的加载推理过程,但是我们把它换成wenet的recognize_onnx.py中对onnx模型的加载和推理即可,另外虽然两者都有自己的fbank特征提取方法,需要注意的是需要使用wenet的特征提取方法(这个方法在./examples/aishell/s0/wenet/dataset/process.py里面),这样会使得修改代码更简单一些

修改结果

反思

1.技术不过关

就拿到这个任务属于啥都没接触过,啥都不会那种,想想作为一个刚毕业大学生,真就纯种废物了,以后多接触各种技术,扩大知识面,不求甚解,但求能听过。

2.提前给坑做标记

记得sherpa有个warmup函数,目的是随机生成一串序列给模型推理,这样能节省后续推理的预热时间,在完成这个warmup后就完成了模型的部署,而当时我急着完成模型的部署,所以在模型推理部分完全依着warmup生成的随机序列的格式进行了格式修改(当时知道这个地方应该依着实际的数据格式,但图方便然后后面忘记了这个地方的问题),从而导致模型部署后,我以为成功了,但进行实际客户端推理后就出现问题了,而报错延又没有明确指出什么地方,我一个个地方排除才找到这个地方,所以在以后明确知道又坑的情况下需要提前标注,因为自己容易忘记

经验分享 程序员 微信小程序 职场和发展