Created 03/28/2020 at 08:50PM
tensorflow serving是tensorflow推出的一个用于模型部署的工具,它可以让你基于docker快速部署你的模型,方便地进行版本迭代和容器管理,此外tensorflow serving基于C++构建,摒弃了一些模型训练之中的冗余参数和设计,让你的模型可以高性能地运行在CPU/GPU服务器上。这几天在尝试将公司基于tensorflow 1.9.0的TTS模型跑在CPU服务器上,已经存在一个基于tornado构建的web服务,但由于直接使用了training时期保存的模型,性能损失比较大,于是我尝试着用tensorflow serving将模型部署起来,希望能提高性能。(这些都是导师让我练练手的,实际上公司的TTS服务是用C++代码写的超大的项目,性能很强)
由于是tensorflow 1.9.0,tf2.0的那套简便的方法就用不了了,我参考了知乎大神的文章,大体思路就是:
/models
上tensorflow 1.9.0作为一个“上古”版本的tensorflow,很多文档都是不全的或者说是难以找到,好不容易摸清楚了涉及到哪些API,我被一个报错给弄懵了,“Op type not registered ‘PyFunc’ in binary running on xxxxxx”,后来查了一下才知道,原来tensorflow-serving基于C++构建,将模型参数保存下来后,全部用C++来运行,所以不支持一些原生python的操作,比如tensorflow.py_func,然而需要部署的那一份代码里面有大量py_func,除非将全部的py_func用tensorflow原生方法代替,不然没办法用tensorflow-serving。
最终我还是成功用起来了tensorflow serving啦!把代码里面的用到了tensorflow.py_func的全部替换成tensorflow原生操作就可以了,这里不需要重新训练模型,只需要参数能和计算图匹配就行。不过经过测试,发现tensorflow-serving并没有加速多少(用的是RNN型模型),不过对于版本管理和加载模型方面确实优秀了很多。成功运行容器之后还遇到了一个坑,就是RESTful api的端口和gRPC的端口不一样,前者对应8501,后者需要另设8500,大家可以参考文章。