深度学习模型部署的几种方法
由于模型训练完之后需要上线部署,这个过程中需要将模型集成到当前的软件架构中,因此要根据软件架构考虑模型的实际部署方法。目前来看主流的部署方法有以下几种方案:
1.python服务接口
在python服务器上部署模型文件,给出一个http服务,后台通过这个服务就可以调用模型进行输入输出了。
优点:算法与后端的工作界限明显,不需要特别多的沟通;在使用模型前还需要进行数据预处理,不需要额外再进行代码迁移。
缺点:需要服务器安装python环境,维护的成本增加,服务器之间接口的通信问题,获取模型输出所需时间可能更长。
2.java直接加载模型
目前工业界比较成熟的部署方案就是使用tensorflow的java包,然后加载训练的模型文件。
需要事先将模型文件保存成pb格式,然后在java的环境中添加依赖。最后再加载模型。
优点:不需要额外的接口,调用方便;不需要额外安装python环境
缺点:需要将数据预处理这部分代码迁移成java,并添加到后端项目代码中。另外google对这种方法重视不高,没有详细的文档,也很少更新维护代码。模型预测速度和调python接口差不多。
3.docker+tf-serving部署模型
这个是google比较推荐的部署方法,部署文档比较详细。也是广泛使用的方法。这种方法直接将模型部署在docker容器中,然后提供两种接口,分别是Grpc接口和http接口,前者据说是在读取批量数据上更有优势,例如图片数据;服务启动后只要可以连接,任何语言都可以调用。
优点:部署方便,不受服务器限制;可以同时部署多个模型,方便模型的管理和版本控制;模型推理的速度快,经过测试比前两种快2倍。
缺点:同样需要编写数据预处理代码,数据输入格式需要按文档的要求。
综上所述,目前几种部署方案都可以使用,需要根据实际情况灵活选择合适的方法。个人觉得如果是比较规范的平台化部署可以用tf-serving;如果只是比较小的功能,不需要太多的后续维护的模型1和2都可以。
从搜集的资料上看,由于对模型推理速度的性能要求越来越高,例如bert这种参数上亿的模型,目前使用gpu环境部署模型的场景越来越多,Nvidia的tensorRT也有越来越多人开始尝试,据说比tf-serving的推理速度更快。