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

news2024/9/24 9:24:52

深度学习推理框架

  • 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的介绍(高通芯片*)

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的介绍(高通芯片*)

支持: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,路径配置
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

南京晓庄操作系统期末复习【背诵部分】

操作系统期末复习背诵部分第一章1.操作系统的特征:2.操作系统的最基本特征是什么,为什么3.操作系统的目标4.操作系统的主要功能5.计算机资源6.多道程序设计时应解决什么问题7.三种操作系统及特点第二章1.进程的定义2.进程的特征3.进程的三种基本状态4.进…

Spark04: Transformation与Action开发

一、创建RDD的三种方式 RDD是Spark编程的核心,在进行Spark编程时,首要任务是创建一个初始的RDD这样就相当于设置了Spark应用程序的输入源数据然后在创建了初始的RDD之后,才可以通过Spark 提供的一些高阶函数,对这个RDD进行操作&a…

python学生管理系统(pyqt5 含界面)

学生管理系统项目流程 项目模块 账号登陆 人脸识别 增添学生信息 删除学生信息 改动学生信息 查询学生信息 项目主体框架 app.py为主代码,负责用于界面打开展示。img文件夹负责放置项目qrc的图像page文件夹为单独页面的类plugin文件夹为功能模块的类ui文件夹…

机器人中的数值优化|【一】数值优化基础

数值优化基础 凸集 Convex Sets 凸集的定义 令X是线性空间。如果对于X的子集S中的所有x和y,并且在区间 [0,1]中的所有t,点 (1−t)xty(1-t)x ty(1−t)xty也属于S,则S称为凸集。 不失一般性,对于所有的凸集,其线性组…

Zookeeper详解(二)——API 事件监听

Java API znode是zooKeeper集合的核心组件,zookeeper API提供了一小组方法使用zookeeper集合来操纵znode的所有细节。 客户端应该遵循以下步骤,与zookeeper服务器进行清晰和干净的交互。 连接到zookeeper服务器。zookeeper服务器为客户端分配会话ID。…

uniapp 之 接入小程序客服

目录 前言 小程序客服 代码只需要一步 配置也需要一步​​​​​​​ 前言 小程序客服 因老大 看到别人家有在线客服这个功能&#xff0c;就让我也做一个&#xff0c;这个功能很简单 效果图1 代码只需要一步 <button type"default" open-type"con…

MATLAB | 绘图复刻(六) | 分组环形热图

有粉丝问我Ecology Letters, (2021) 24: 1018–1028 Soil carbon persistence governed by plant input and mineral protection at regional and global scales 这篇文章中的Figure 2咋画&#xff0c;原图长这样&#xff1a; 复刻效果&#xff1a; 完整步骤 0 数据定义 按…

node.js创建网站实例1

1.node.js安装 我的电脑环境&#xff1a;win10 网址&#xff1a;https://nodejs.org/en/ 我下载了18.12.1版本 一路next默认安装&#xff0c;安装完成后&#xff0c;运行cmd&#xff0c;查看版本号 会同时安装npm&#xff0c;也可以同时查看版本号 2.创建第一个网站实例hell…

内卷对于2022是一种无奈,也是一种修行

其实我们谁也不知道2023年对于我们普通的开发人员来说会有什么样的试炼&#xff0c;因为2022年身边有太多的人&#xff0c;为了工作&#xff0c;为了生活&#xff0c;为了家庭&#xff0c;为了理想&#xff0c;不得不选择走向别人看似很卷的那条路。 对于我们周围的人来说&…

【Vim】基本操作及命令集详解

概述 Vim 是从 vi 发展出来的一个文本编辑器。vi 内置在Linux系统中&#xff0c;是vim的简化版编辑器&#xff0c;vim则需要进行安装使用。Vim代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;可以实现高效率移动和高效的输入&#xff0c;在程序员中被广泛使用。…

CPT203-Software Engineering(3)

文章目录9. Software Design9.1 Architecture Design9.1.1 Architectural patterns9.2 Component-level Design9.2.1 Component9.2.2 Views of component9.2.3 Component-level design process9.3 User Interface Design9.3.1 Interface Design Process9.3.2 Interface Design …

蓝桥杯Python练习题16-最大最小公倍数

资源限制   内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   已知一个正整数N&#xff0c;问从1~N中任选出三个数&#xff0c;他们的最小公倍数最大可以为多少。 输入格式   输入一…

三维数学(一)

视频教程&#xff1a;https://www.bilibili.com/video/BV12s411g7gU?p155 向量 一个数字列表&#xff0c;表示各个维度上的有向位移&#xff1b;同时也是一个有大小有方向的物理量&#xff0c;大小及向量的模长&#xff0c;而方向即空间中向量的指向&#xff0c;可以表示物体…

TikTok Shop 越南站点收入已达Lazada 的 80%

让我们一起来看看今日都有哪些新鲜事吧&#xff01;01 TikTok Shop 越南站点收入已达Lazada 的 80% 据越南电商平台数据分析软件Metric.vn 统计&#xff0c;Shopee、Lazada、Tiki 和 Sendo 仍然主导着越南电子商务市场&#xff0c;1-11 月&#xff0c;共销售了 13 亿件产品。其…

简化开发小技巧-Mybatis-Plus的使用和常用操作

目录 简介 快速使用 pom 代码 mapper service 使用 常用操作 简单或操作查询 多条件或查询 更新字段为null 方法一&#xff0c;如果要更新的字段是String类型&#xff0c; 方法二&#xff0c; 使用mybatis-plus的字段注入。 方法三&#xff0c;使用UpdateWrapper…

基于R的Bilibili视频数据建模及分析——预处理篇

基于R的Bilibili视频数据建模及分析——预处理篇 文章目录基于R的Bilibili视频数据建模及分析——预处理篇0、写在前面1、项目介绍1.1 项目背景1.2 数据来源1.3 数据集展示2、数据预处理2.1 删除空数据2.2 增加id字段2.3 处理数值字段3、参考资料0、写在前面 实验环境 Python版…

Stable Diffusion背后原理(Latent Diffusion Models)

前言 2023年第一篇博客&#xff0c;大家新年好呀~ 这次来关注一下Stable Diffusion背后的原理&#xff0c;即 High-Resolution Image Synthesis with Latent Diffusion Models 这篇论文。 之前关注的那些工作只能工作到 256256256 \times 256256256 像素(resize成这个后才输…

设计模式简介

一、设计模式简介 编写软件过程中&#xff0c;程序员面临着来自耦合性&#xff0c;内聚性 以及可维护性&#xff0c;可扩展性&#xff0c;重用性&#xff0c;灵活性等多方面的挑战&#xff0c;设计模式是为了让程序&#xff08;软件&#xff09;&#xff0c;具有更好的&#xf…

04SpringCloudAlibaba服务注册中心—Consul

目录 Consul简介 Consul是什么What is Consul? | Consul by HashiCorp Consul能做什么 Consul下载&#xff1a;Downloads | Consul by HashiCorp Consul使用&#xff1a;Spring Cloud Consul 中文文档 参考手册 中文版 安装并运行Consul 1、官网安装说明&#xff1a;In…

开发板测试手册——系统启动、文件传送操作步骤详解(1)

目 录 前 言 4 1 评估板快速测试 5 1.1 系统启动测试 5 1.2 文件传送测试 11 1.2.1 通过 Linux 系统启动卡 11 1.2.2 通过 OpenSSH 12 1.3 LED 测试 15 1.4 KEY 测试 15 1.5 DDR 读写测试 16 1.6 SD 卡读写测试 17 1.7 eMMC 读写测试 18 前 言 本指导文档适用开发…