深度学习推理框架

  • 作者介绍
  • 1.移动端深度学习推理框架调研
    • 1.1 小米的MACE(2017)
    • 1.2 阿里的MNN
    • 1.3 腾讯的TNN
    • 1.4 ARM的tengine
    • 1.5 百度的paddle-mobie
    • 1.6 Facebook的Caffe2(*)
    • 1.7 Google的TensorFlow Lite (*)
    • 1.8 Apple的Core ML(*)
    • 1.9 OpenVINO(Intel,cpu首选OpenVINO)
    • 1.10 TensorRT(Nvidia)
    • 1.11 Mediapipe(Google)---处理视频、音频等
  • 2. 重点对SNPE的介绍(高通芯片*)

作者介绍

张伟伟,男,西安工程大学电子信息学院,2019级硕士研究生,张宏伟人工智能课题组。
研究方向:机器视觉与人工智能
工作单位:三星电子研究所
记得关注和点赞收藏哈!
电子邮件:zhangweiweicpp@163.com

1.移动端深度学习推理框架调研

相关平台的介绍的链接

1.1 小米的MACE(2017)

比较:TensorFlow/Caffe
MACE最大的优势是对GPU和DSP等异构计算的支持,劣势则是知名度和生态有不小的差距。

小米AI推理框架MACE介绍
官方手册:https://buildmedia.readthedocs.org/media/pdf/mace/latest/mace.pdf
开源github地址:https://github.com/XiaoMi/mace.git
mace模型库地址:https://github.com/XiaoMi/mace-models.git

MACE 自定义了一种类似 Caffe2 的模型格式。Tensorflow 和 Caffe 训练得到的模型可以转换成 MACE 模型进行部署。MACE 采用 YAML 文件描述模型的部署细节。
小米则采用了半精度浮点和8比特整形量化的方法来进行压缩。

1.2 阿里的MNN


开源github地址:https://github.com/alibaba/MNN
支持 Tensorflow、Caffe、ONNX 等主流模型格式,支持 CNN、RNN、GAN 等常用网络;
支持 86 个 TensorflowOp、34 个 CaffeOp ;各计算设备支持的 MNN Op 数:CPU 71 个,Metal 55 个,OpenCL 40 个,Vulkan 35 个,Android 上提供了 OpenCL、Vulkan、OpenGL 三套方案,尽可能多地满足设备需求,针对主流 GPU(Adreno和Mali)做了深度调优。

1.3 腾讯的TNN


开源github地址:https://github.com/Tencent/TNN

1.4 ARM的tengine

它支持TensorFlow、Caffe、MXNet 、PyTorch、 MegEngine、 DarkNet、ONNX、 ncnn 等业内主流框架。
开源github地址:https://github.com/OAID/Tengine

1.5 百度的paddle-mobie

例程:在Android手机上使用PaddleMobile实现图像分类
开源github地址: https://github.com/PaddlePaddle/paddle-mobile

1.6 Facebook的Caffe2(*)

PyTorch在研究、实验和尝试新的神经网络方面做得很好;
caffe2正朝着支持更多工业强度的应用程序的方向发展,重点是移动应用程序。
pytorch转化到caffe2:
先将pytorch转化为caffe,然后再将caffe转化为caffe2:https://caffe2.ai/docs/caffe-migration.html
将caffe的model转化为caffe2model: https://caffe2.ai/docs/caffe-migration.html

1.7 Google的TensorFlow Lite (*)

TensorFlow Lite 指南csdn
TensorFlow Lite官网链接:https://tensorflow.google.cn/lite/guide
中文版部署教程

  • TensorFlow Lite 是一组工具,可帮助开发者在移动设备、嵌入式设备和 IoT 设备上运行 TensorFlow 模型。它支持设备端机器学习推断,延迟较低,并且二进制文件很小。
  • Android 和 Ios
  • 大多数 TensorFlow Lite 运算都针对的是浮点(float32)和量化(uint8、int8)推断,但许多算子尚不适用于其他类型(如 tf.float16 和字符串)。

1.8 Apple的Core ML(*)

一切可在用户设备端完成

1.9 OpenVINO(Intel,cpu首选OpenVINO)

英特尔的cpu,
开源github地址: https://github.com/openvinotoolkit/openvino

模型优化器(Model Optimizer)将给定的模型转化为标准的 Intermediate Representation (IR) ,并对模型优化。同时对传统的OpenCV图像处理库也进行了指令集优化,有显著的性能与速度提升。
ONNX
TensorFlow
Caffe
MXNet
Kaldi

1.10 TensorRT(Nvidia)

只能用在NIVDIA的GPU上的推理框架。NIVDIA自家的Jetson平台。

在保证准确率的情况下,通过将模型量化到INT8来更大限度地提高吞吐量,TensorRT包含两个阶段:编译build和部署deploy,

  • 编译阶段对网络配置进行优化,并生成一个plan文件,用于通过深度神经网络计算前向传递。plan文件是一个优化的目标代码,可以序列化并且可存储在内存和硬盘中。
  • TensorRT为所有支持平台提供了C++实现,以及在x86、aarch64和ppc64le平台上提供Python支持

编译阶段在图层中执行如下优化:
消除输出未被使用的层
消除等价于no-op的运算
卷积层,偏差和ReLu操作的融合
聚合具有足够相似参数和相同目标张量的操作(例如,Googlenet v5 inception 模型的1*1卷积)
通过直接将层输出定向到正确最终目的来合并concatenation 层

  • 部署阶段通常采用长时间运行的服务或者用户应用程序的形式。它们接收批量输入数据,通过执行plan文件在输入数据上进行推理,并且返回批量的输出数据(分类、目标检测等)

    使用TensorRT的流程:
    将一个训练好的模型部署到TensorRT上的流程为:

1.从模型创建一个TensorRT网络定义
2.调用TensorRT生成器从网络创建一个优化的运行引擎
3.序列化和反序列化,以便于运行时快速重新创建
4.向引擎提供数据以执行推断

# 导入TensorRT
import tensorrt as trt
# 日志接口,TensorRT通过该接口报告错误、警告和信息性消息
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
  1. 创建TensorRT builder 和 network
    为特定的格式创建TensorRT 解析器
    使用解析器解析导入的模型并填充模型
import tensorrt as trt# 以CaffeParse为例
datatype = trt.float32  # 定义数据类型
# 定义配置文件和参数模型路径
deploy_file = 'data/mnist/mnist.prototxt'
model_file = 'data/mnist/mnist.caffemodel'
# 创建builder, network 和 parser
with trt.Builder(TRT_LOGGER) as builder, builder.create_network() as network, trt.CaffeParser() as parser:model_tensors = parser.parse(deploy=deploy_file, model=model_file, network=network, dtype=datatype)

3.序列化和反序列化
序列化,意味着将engine转化为一种可以存储的格式并且在以后可以进行推理。用于推理使用时,只需要简单地反序列化engine

# 序列化模型到modelstream
serialized_engine = engine.serialize()
# 反序列化modelstream用于推理。反序列化需要创建runtime对象。
with trt.Runtime(TRT_LOGGER) as runtime:    engine = runtime.deserialize_cuda_engine(serialized_engine)# 序列化engine并且写入一个file中
with open(“sample.engine”, “wb”) as f:f.write(engine.serialize())# 从文件中读取engine并且反序列化
with open(“sample.engine”, “rb”) as f, trt.Runtime(TRT_LOGGER) as runtime:engine = runtime.deserialize_cuda_engine(f.read())

4.执行,分配内存,创建流,上下文,激活值,返回主机输出。

# engine有一个输入binding_index=0和一个输出binding_index=1
h_input = cuda.pagelocked_empty(trt.volume(context.get_binding_shape(0)), dtype=np.float32)
h_output = cuda.pagelocked_empty(trt.volume(context.get_binding_shape(1)), dtype=np.float32)
# 为输入和输出分配内存
d_input = cuda.mem_alloc(h_input.nbytes)
d_output = cuda.mem_alloc(h_output.nbytes)
# 创建一个流在其中复制输入/输出并且运行推理
stream = cuda.Stream()#创建一些空间来存储中间激活值。由于引擎包含网络定义和训练参数,因此需要额外的空间。它们被保存在执行上下文中。
with engine.create_execution_context() as context:# 将输入数据转换到GPU上cuda.memcpy_htod_async(d_input, h_input, stream)# 运行推理context.execute_async_v2(bindings=[int(d_input), int(d_output)], stream_handle=stream.handle)# 从GPU上传输预测值cuda.memcpy_dtoh_async(h_output, d_output, stream)# 同步流stream.synchronize()
# 返回主机输出
return h_output

1.11 Mediapipe(Google)—处理视频、音频等

MediaPipe是个基于图形的跨平台框架,用于构建多模式应用的机器学习管道。MediaPipe可在移动设备,工作站和服务器上跨平台运行,并支持移动GPU加速,服务端,移动端,嵌入式平台。
Mediapipe github链接:https://github.com/google/mediapipe

2. 重点对SNPE的介绍(高通芯片*)

最好的教程—官方文档:https://developer.qualcomm.com/sites/default/files/docs/snpe/setup.html
可供参考的SNPE学习:https://blog.csdn.net/qq_44635240?type=blog
其次csdn、知乎的博客内容结合来看,对比进行操作。

支持:TensorFlow, Caffe, Caffe2, ONNX, TensorFlow, PyTorch,转换成dlc文件
将训练好的模型用SNPE的工具转成DLC文件就可以在SNPE运行环境里跑了。装成DLC之后也可以用它自带的量化工具量化成8位整形。


基本的SNPE工作流程只包含几个步骤:

1.将网络模型转换为可由SNPE加载的DLC文件。
2.可选择量化DLC文件以在Hexagon DSP上运行。
3.准备模型的输入数据。
4.使用SNPE运行时加载并执行模型。

上手SNPE-推理inception_v3

SNPE的安装 snpe-tensorflow-to-dlc 模型转化工具的使用 snpe-net-run
在Ubuntu环境下的inceptionv3模型是推理。 如何在商用手机上使用SNPE 加速模型推理。

(1)TensorFlow和SNPE的环境:snpe高通官网下载,unzip snpe-1.52.0.zip 解压
python3-dev’, ‘wget’, ‘zip’,‘libc+±9-dev’

(2)NDK,路径配置(1.4 2.0以上的tensorflow版本)
SNPE_ROOT,TENSORFLOW_HOME,PATH, LD_LIBRARY_PATH, 和PYTHONPATH
(3)得到pb模型,将 pb模型转化为SNPE支持的DLC模型格式

root@3e28cb421090:/workspace/tutor/inceptionv3: snpe-tensorflow-to-dlc -i inception_v3.pb -d input 1,299,299,3 --out_node InceptionV3/Predictions/Reshape_1

(4)准备数据集和验证脚本
拷贝数据到\models\xxxx下面,在snpe环境下进行验证
snpe-net-run --version

(5)部署到手机端
手机上部署运行:https://blog.csdn.net/qq_44635240/article/details/127055258

1.将必要的lib,bin,模型,数据推送到手机端
2.设置环境变量
3.进行推理 snpe-net-run --container inception_v3.dlc --input_list target_raw_list.txt
推理的结果默认保存在output下,运行时,使用–output_dir参数,后面加上自己的输出路径
4.将运行结果pull到host上

NPE SDK 目前做的还不是非常完美,有些需要定制化的神经网络层可能在原生NPE中没有提供。但还好SDK提供了用户定义层(UDL)功能,通过回调函数可以自定义算子,并通过重编译C++代码将自定义文件编译到可执行文件中。如果开发就是使用的C++,那比较容易实现用户定义层,但如果是运行在Android上,开发者需要将上层Java代码通过JNI方式来调用NPE原生的C++编译好的.so文件

深度学习推理框架调研总结相关推荐

  1. 阿里 深度学习推理框架_如何通过Knative无服务器框架构建深度学习推理

    阿里 深度学习推理框架 在某些学术界和行业界,深度学习正在获得巨大的动力. 推理(基于预训练模型从现实世界数据中检索信息的能力)是深度学习应用程序的核心. 深度学习推理可用于在图像到达对象存储时对其进 ...

  2. 腾讯优图开源深度学习推理框架 TNN,助力 AI 开发降本增效

    从学界到工业界,"开源"已经成为AI领域的一个关键词.一方面,它以"授人以渔"的方式为AI构建了一个开放共进的生态环境,帮助行业加速AI应用落地:另一方面,在解 ...

  3. 自制深度学习推理框架-第七课-构建自己的计算图

    自制深度学习推理框架-第六课-构建自己的计算图 项目主页 https://github.com/zjhellofss/KuiperInfer 感谢大家点赞和PR, 这是对我最大的鼓励, 谢谢. 现在K ...

  4. 自制深度学习推理框架-第十一节-再探Tensor类并构建计算图的图关系

    自制深度学习推理框架-第十一节-再探Tensor类并准备算子的输入输出 本课程介绍 我写了一个<从零自制深度学习推理框架>的课程,课程语言是 C++,课程主要讲解包括算子实现和框架设计的思 ...

  5. 深度学习多框架多平台推理引擎工具

    一种深度学习推理引擎工具,支持多框架.支持多平台推理 项目下载地址:下载地址 支持的计算平台: - Windows 10 (Visual Studio 2019 x64) - Linux (x64, ...

  6. NVIDIA TensorRT高性能深度学习推理

    NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和 ...

  7. TensorRT是NVIDIA开发的深度学习推理工具,只支持推理,不支持训练 引

    . TensorRT是NVIDIA开发的深度学习推理工具,只支持推理,不支持训练:   目前TensorRT3已经支持Caffe.Caffe2.TensorFlow.MxNet.Pytorch等主流深 ...

  8. 飞桨深度学习开源框架2.0抢先看:成熟完备的动态图开发模式

    百度飞桨于近期宣布,深度学习开源框架2.0抢先版本正式发布,进入2.0时代.其中一项重大升级,就是推出更加成熟完备的命令式编程模式,即通常说的动态图模式.同时在该版本中将默认的开发模式定为动态图模式, ...

  9. 英伟达深度学习推理引擎TensorRT,现在开源了

    https://www.toutiao.com/a6703740623364555271/ 2019-06-18 13:37:53 机器之心报道 参与:李亚洲.李泽南.思 英伟达的深度学习推理引擎Te ...

最新文章

  1. 计算机网络基础常考面试题总结
  2. 八皇后算法python_Python学习二(生成器和八皇后算法)
  3. 嵌入式编程之模块化编程
  4. sql server agent会自动关闭_经常用微信支付,要关闭这个开关,不然每个月都会自动扣钱...
  5. hypermesh安装包百度云_新闻突然!全新百度网盘发布
  6. python 词云_python词云-数据产品岗位描述的词云
  7. fopen 參数具体解释
  8. 数据库、数据库系统、数据库管理系统
  9. 涉及金钱使用double的已经被公司开除了,要使用BigDecimal
  10. duilib加载xml以及资源文件的路径问题
  11. 绿盟安全扫描--检测到目标站点存在javascript框架库漏洞
  12. QGIS教程—缓冲区buffer
  13. 有了这四个网站 再也不用花钱啦
  14. 包子笔记 - 关于沉没成本
  15. 4和2大于号小于号箭头那边_大于号小于号顺口溜
  16. Python 猴子偷桃
  17. 北京开始整治互联网加班了!附 955 不加班公司名单(2022版)
  18. HDU 5514 Frogs 容斥
  19. 华为2012机试题目及解答程序(仅供参考,版权归华为所有)
  20. 数据库课程设计 大学生综合管理系统

热门文章

  1. Duplicate Finder for Mac 1.4.3 重复文件查找和删除 破解版下载
  2. GAN网络详解(从零入门)
  3. 《小狗钱钱》阅读笔记
  4. java输出中写html标签,java 输出html标签
  5. Docker fille实例讲解
  6. 堆、栈、队列的区别和联系
  7. 光滑性准则(Smoothness Rule) 递推方程(Recursive Equation)
  8. 计算机网络安全凭据,账户为用户或计算机提供安全凭证,以便用户和计算机能够登录到网络,并拥有响应访 - 百科题库网...
  9. i710750h和r74800h玩游戏哪个好 r7 4800h和i7 10750h哪个性能好
  10. 迭代瀑布不是Scrum