背景
目前深度学习的发展如火如荼,不少人在深度学习模型结构与设计都有些研究学习,并且在实验环境获得了不错的实验结果,想要在实际生产中部署模型实际使用。而目前Go语言在云计算领域发展非常迅猛,Go语言被称为是非常适合云原生时代的编程语言,因此在云计算公司内,产生了用Go语言部署深度学习模型服务的需求。本文介绍了一些常见的部署方案,简单说明了一下这些方案的优缺点。
方案
采用python自带的web框架:
你可以将深度学习模型部署为一个独立的服务,例如使用Python中的Flask、FastAPI或Django
优点:可以迅速部署一个简单的服务
缺点:python性能较低,并行能力弱;不支持本文的go语言部署要求
采用pytorch推出的torchServer:
torchServer是完美兼容pytorch模型,并且提供了模型部署和服务化、多模型支持、RESTful API、模型版本管理、自动加载和热加载、模型健康检查、GPU 支持、负载均衡和并发处理、容器化支持、模型解释性、安全性、日志和监控
优点:torchServer是一个用java写好的服务框架,直接设置即可启用一个服务
缺点:不满足用go语言开发的要求;torchServer代码质量较低,官方推广软件但是前身是个人开发应用的,后续维护困难
采用nvidia推出的TritonServer:
TritonServer类似torchServer,但是支持众多深度学习框架,与GPU的各种显卡兼容更好
优点:torchServer是一个用C++写好的服务框架,直接设置即可启用一个服务,与nvidia生态结合密切
缺点:不满足用go语言开发的要求;在没有nvidia生态的环境下,性能一般
使用ONNX格式:
可以将模型转换为ONNX(Open Neural Network Exchange)格式,这是一个跨平台的深度学习模型交换格式。然后,你可以使用Go语言中的ONNX运行时来加载和运行模型。在Python中,可以使用torch.onnx.export
函数将PyTorch模型导出为ONNX格式。然后,将导出的ONNX模型文件加载到Go中,并使用ONNX运行时来进行推理。
优点:go语言直接加载模型文件运行,性能高效,核心代码全程自主可控
问题:onnx格式不支持先进的数学计算,例如傅立叶变换等,会导致模型无法导出,只能使用传统旧模型
Go语言调用Python脚本:
使用cmd.CombinedOutput()
来执行Python脚本,并捕获其标准输出和标准错误输出。
优点:没有什么优点,强行符合Go语言调用的要求
缺点:每次调用都要重新加载模型初始化,性能很差
使用gotch,直接调用torch模型:
torch本身提供了C的API,gotch包装了C的API,变成了用go调用
优点:go语言调用c语言程序,性能高效
问题:gotch是第三方开发的,目前只支持libtorch1.11,pytorch已经发展至2.0.1,目前两个版本之间导出的模型文件版本差距较大无法读取。pytorch如果降版本,那么先进的数学函数则无法使用,例如傅立叶变换等。
用tf重构模型:
tensorflow本身自带go接口,如果重构模型代码为tf,可以实现模型被go直接调用
优点:官方提供go的接口,性能高效
问题:tensorflow的go语言API已经被官方放弃维护,目前也是由第三方维护,面临与gotch一样的问题
用Cgo调用C代码,进而实现操作libtorch调用模型:
Cgo是官方推出的go语言调用C语言代码的方案,torch官方有C语言的API支持(libtorch),可以通过在go语言里面写c语言代码实现模型调用
优点:go语言调用c语言程序,性能高效;所有代码自主可控
缺点:相当于重构gotch,开发量偏多