C++环境下部署深度学习模型方案
目录
一、问题背景
现在的深度学习框架一般都是基于 Python 来实现,构建、训练、保存和调用模型都可以很容易地在 Python 下完成。但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将总结在C++环境下如何部署Py训练好的模型。
二、解决方案
2.1 C++调用python
Python 提供了一套 C API库,使得开发者能很方便地从C/ C++ 程序中调用 Python 模块。
参考我另一篇博客
C++调用Python完成“表达式计算”功能并打包发布_俊俊的博客-CSDN博客
2.2 Python服务接口
使用flask后台框架创建一个http服务器
客户端POST一个请求上来(例如上传了一张图片的url),服务器检测到有请求,就会解析url的图片,接着调用深度学习模型,得到推理结果后以json的格式把结果返回给客户端
模型部署3/3-手把手实现利用flask深度学习模型部署 – 知乎
或者自己手写一个TCP通信,自定义通信数据格式,可采用yaml或者json格式
2.3 Python转c++(不推荐)
Pythran翻译
有些语法、函数不识别,不适合转复杂项目,只适合简单运算
比如:字符串格式化format
#pythran export eval_function(str)
def eval_function(a):
print("input:{}".format(a))
try:
val = eval(a)
return float(val)
except Exception as e:
print("err:{}".format(str(e)))
return 0
报错
demo.py:18:10 error: Attribute 'format' unknown
----
print("input:{}".format(a))
^~~~ (o_0)
----
又如 :不识别eval函数
#pythran export eval_function(str)
def eval_function(a):
try:
val = eval(a)
return float(val)
except Exception as e:
return 0
报错
pythran.analyses.aliases.UnboundIdentifierError
2.4 深度学习部署框架(推荐)
训练使用Python接口,部署使用部署框架的 C/C++ 接口来导入训练好的模型。目前主流的深度学习部署平台包含GPU、CPU、ARM等。模型部署框架则有英伟达推出的TensorRT,谷歌的Tensorflow和用于ARM平台的TF-Lite,开源的Caffe,百度的飞浆,腾讯的NCNN。
-
Nvidia GPU平台
框架 | 资料 |
---|---|
Caffe | |
TensorRT | TensorRT部署深度学习模型 – 知乎 深度学习模型部署(1)-Pytorch转TensorRT(C++版) – 知乎 |
TensorFlow | C++部署TensorFlow模型_蓬莱道人的博客-CSDN博客_c++ tensorflow |
PaddlePaddle |
-
Intel CPU平台
框架 | 资料 |
---|---|
Caffe | |
OpenVINO | YOLOv5在最新OpenVINO 2021R02版本的部署与代码演示详解 – 云+社区 – 腾讯云 YOLOX之OpenVINO部署:C++版 – 知乎 |
-
ARM平台
框架 | 资料 |
---|---|
NCNN | |
TF-Lite | |
Paddle-mobile |
-
FPGA平台
框架 | 资料 |
---|---|
xilinx |
三、总结
3.1 接口形式分类
Python接口封装
1、采用C++调用Python的方式
2、采用Python服务接口的方式
C++接口封装
1、采用python转c++
2、采用现有的C++深度学习部署框架
3.2 优缺点比较
方案 | 优点 | 缺点 |
---|---|---|
C++调用python | 直接交互 | 无法隐藏Py代码、Py运行库体积较大 |
Python服务接口 | 客户端与服务器分离,有利于维护,且可跨主机 | 间接交互,无法满足实时性强的场景 |
Python转C++ | 直接交互 | 并非所有python语法都能转换成功 |
深度学习部署框架 | 直接交互 |