一、背景
使用pytorch做模型训练,训练完成后想集成到java web项目中。同时整体项目后续也会做离线环境的前场化部署。因此,想寻求一种部署简单的方案。
二、方案探索
1. 使用java部署推理模型
1.1 资料:
onnx支持使用java api:https://github.com/microsoft/onnxruntime/tree/master/java
1.2 实操:
- 将pytorch transformers模型顺利转成onnx格式
- 仍需要使用pytorch+transformers模型将文本转成onnx输入需要的tensor格式,最终还是要保留原模型以及onnx格式模型,两者差不多大。(我不确定原模型能不能用其他方法省略掉)
- 我自定义了将文本转成tensor的方法,改用java时需要用java重写一遍逻辑。(我没用java重写逻辑,这个方案就没继续做下去,我不想维护训练和推理两套代码,还是不同的语言)
- 转成onnx格式确实加速了推理过程,大概提升了3倍左右。
1.3 总结:
- 原本设想的是将模型及推理过程封装成一个jar,直接调用,但训练过程用的是python,两套语言维护起来比较复杂。
- 后续我会继续探索原模型能不能省略掉。
2.pyinstaller打包python项目
1.1 资料:
- pyinstaller官网:http://www.pyinstaller.org/documentation.html
1.2 实操:
- pyinstaller命令打包项目代码及其依赖
- 可以通过shell命令或直接运行main.py
- 发现只能通过接收控制台输出的方式,获取模型结果。而且不能提前初始化模型,每次运行都得从初始化模型开始。
- springboot对执行shell脚本的支持较差,且无法应用于多线程。(百度的,未验证过该说法)
1.3 总结:
- pyinstaller比较适合项目需要打包成exe的场景,不太适合我的需求
3.docker打包项目
1.1 资料:
1.2 实操:
- 添加flask接口调用模型,实现还是比较简单的
- 将整个项目以及依赖打包成docker镜像
1.3 总结:
- 还是回到最开始的想法,将模型推理过程打包成一个服务,对外开放API接口
- 但目前公司内部没有使用docker,前场部署时还得格外安装一个docker,还得继续优化这个方案。(我个人推荐这个方案,他们会后悔的。。。)
4.python打包项目
1.1 资料:
- pipreqs 类库:https://pypi.org/project/pipreqs/
1.2 实操:
- 用flask给项目安个接口
- 用pipreqs打包出项目的python依赖包
- 将依赖包连同代码一起打包到新机器,先安装python依赖,再运行python项目
1.3 总结:
- 总体类似于docker项目打包。但个人认为,如果项目多了之后不太好管理python依赖,还是推荐docker那种部署方式。
- pipreqs打包依赖包会多打包一些类库(可能是打包整个python环境的依赖库),需要人工check