深度学习整个 使用流程 

深度学习不仅包括 模型训练过程;

对训练好 的模型,通常需要进行一些 优化和加速,如 网络层合并、量化、剪枝 等,得到 精简的 推理引擎,然后部署上线;

通常我们把 模型优化和推理框架  合称为 推理引擎

 

模型部署平台

大致可分为两种:

云端:大模型,精度要求高,可接受一定延时

移动端:嵌入式,本地部署,小模型,实时预测,可损失一定精度

移动端部署 即在嵌入式设备写c或者java代码调用模型推断;

 

模型部署方式

常见以下几种方式

原始训练框架部署:如 用 tf 训练,就用 tf  部署

  // 工业上不采用

  // 需要安装整个框架,推理性能差,资源消耗大

训练框架的部署引擎:训练框架提供了对应的部署引擎,如  tf 提供了 tf-Lite,pytorch 提供了 pytorch-mobile,caffe 提供了 caffe2

  // 只支持本框架的模型

  // 支持的硬件有限

手动重构模型:难度高

专业的推理引擎:开源工具,如 腾讯的 NCNN,阿里的 MNN,Tengine,TensorRT,MACE

  // 工业应用

  // 易用,稳定,可移植性好,高性能,

  // 轻量级,只以来 c/c++  底层库

  // 支持各种语言及训练框架,如 python c 

  // 支持各种操作系统和硬件,如 CPU、GPU,Arm、NPU、FPGA

 

推理引擎对比

主流 移动端 推理框架 对比

这些框架也 一直在发展,变化,也有新的框架推出

 

NCNN

NCNN是由腾讯优图实验室推出的为手机端极致优化的高性能神经网络前向计算框架,支持主流的平台和常见的视觉任务。    【移动端首推

 

Tengine嵌入式平台部署

Tengine涵盖了模型的加载解析,格式转换,计算图的调度和优化,在多种架构的芯片上高效运行,具有通用,开放,高性能等特点,如在EDIDK嵌入式平台上的模型部署

 

TensorRT模型优化与部署

TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟、高吞吐率的部署推理。

 

 LibTorch                                          

对于能够导出为 ONNX格式 的backbone来说,可以直接用TensoRT进行parser、生成(导出)engine二进制流、部署,C++并不比Python难做。      【libtorch 后面会讲

难点是任务中backbone网络只是端到端部署任务中的一部分,整体还包含了许多其他子任务(例如检测任务中的图像读取、前处理、后处理等),甚至还包括对高维数据的数学计算、索引、切片等,这些都增加了使用C++部署的工作量,而如果需要使用GPU加速的话甚至要实现CUDA代码。

LibTorch的出现很大程度上缓解了这一问题,尤其是对高维数据的处理可以用类似于PyTorch对Tensor的操作来实现,而且也有CUDA版本,可以认为LibTorch就是PyTorch的C++版本(实际上Pytorch的C++后端基本上就是LibTorch)

X86系统在Pytorch官网就可以直接下载LibTorch库,而我用的是NVIDIA的Jetson,是aarch64架构,不能直接使用管网的库,所以需要在PyTorch for Jetson上下载相应版本的Pytorch安装文件进行安装,自带LibTorch的需要的库和链接文件,

安装成功之后,在~/.local/lib/python3.6/site-packages/torch/lib或者/usr/local/lib/python3.6/dist-packages/torch/lib文件夹下面可以看到libtorch.so等一系列.so文件,这些都是稍后编译需要链接的文件 ,

然后在CMakeLists里导入LibTorch库就可以了。如果在代码里要用到LibTorch,就在头文件中#include<torch/torch.h>和#include<torch/script.h>就ok了。

 

工具地址

腾讯 移动端推理框架 ncnn https://github.com/Tencent/ncnn

第三方工具 支持 pytorch 模型的转换,或者 pytorch > onnx > ncnn https://github.com/Tencent/ncnn/tree/master/tools/pytorch,内容如下      【onnx 后面会讲

You can find pytorch2ncnn tool here

https://github.com/starimeL/PytorchConverter
https://github.com/inisis/brocolli

For newer version, pytorch already supports exporting to onnx out of box
You can follow the practical guide here

https://github.com/Tencent/ncnn/wiki/use-ncnn-with-pytorch-or-onnx

 

阿里 开源框架 mnn https://github.com/alibaba/MNN 目前只支持tensorflow,caffe和onnx的转换,pytorch的话可以先转onnx,再转 mnn

百度也在做相关工作 https://github.com/PaddlePaddle/paddle-onnx

其他框架 https://github.com/csarron/awesome-emdl

 

工业部署案例

通用NCNN部署

Tengine在EAIDK嵌入式平台上的部署

TensorRT在服务器端的模型优化与部署

微信小程序的前后端完整部署

MNN在Android手机端部署

 

其他乱七八糟收集 以 帮助完善 整个知识架构 

CPU方案:Libtorch、OpenCV-DNN、OpenVINO、ONNX(有个runtime可以调)
GPU方案:TensorRT、OpenCV-DNN(需要重新编译,带上CUDA)
注:OpenCV、OpenVINO都是intel的开源框架库,OpenCV的DNN模块其实调用的也就是OpenVINO,另外OpenvVINO在硬件加速方面使用了intel自家CPU的集成显卡。

 

 

 

 

 

参考资料:

https://www.bilibili.com/video/BV1TY4y1q7XE?p=1&vd_source=f0fc90583fffcc40abb645ed9d20da32   深度学习之模型部署,有三AI

https://www.zhihu.com/question/329306693/answer/2405368293    知乎,有很好的推荐

https://blog.csdn.net/gzq0723/article/details/119223838  训练好的深度学习模型原来这样部署的!(干货满满,收藏慢慢看)