searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Go语言部署深度学习模型方案

2023-09-26 07:43:04
460
0

背景

目前深度学习的发展如火如荼,不少人在深度学习模型结构与设计都有些研究学习,并且在实验环境获得了不错的实验结果,想要在实际生产中部署模型实际使用。而目前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,开发量偏多

0条评论
0 / 1000
z****n
3文章数
0粉丝数
z****n
3 文章 | 0 粉丝
z****n
3文章数
0粉丝数
z****n
3 文章 | 0 粉丝
原创

Go语言部署深度学习模型方案

2023-09-26 07:43:04
460
0

背景

目前深度学习的发展如火如荼,不少人在深度学习模型结构与设计都有些研究学习,并且在实验环境获得了不错的实验结果,想要在实际生产中部署模型实际使用。而目前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,开发量偏多

文章来自个人专栏
深度学习模型部署
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0