java web项目部署pytorch模型方案探索

一、背景

        使用pytorch做模型训练,训练完成后想集成到java web项目中。同时整体项目后续也会做离线环境的前场化部署。因此,想寻求一种部署简单的方案。

二、方案探索

1. 使用java部署推理模型

1.1 资料:

onnx支持使用java api:https://github.com/microsoft/onnxruntime/tree/master/java

pytorch模型转成onnx格式:https://github.com/microsoft/onnxruntime/blob/008065aab16e46d37b3847a4759ff0e6d5963b18/onnxruntime/python/tools/transformers/notebooks/PyTorch_Bert-Squad_OnnxRuntime_CPU.ipynb

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 资料:

  • docker教程:https://www.runoob.com/docker/docker-tutorial.html

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

你可能感兴趣的:(问题总结,自然语言处理)