主流的深度学习推理架构有哪些(NCNNN)

news2025/7/10 23:03:59

AI 技术在具体落地应用方面,和其他软件技术一样,也需要具体的部署和实施。部署对于不同的平台设备上的部署方法和不同的架构工具。目前在人工智能的落地部署方面,各大平台机构都退出了自家的部署平台。

目前市场上应用最广泛的部署工具主要有以下几种:

1.腾讯公司开发的移动端平台部署工具——NCNN;

2.Intel公司针对自家设备开开发的部署工具——OpenVino;

3.NVIDIA公司针对自家GPU开发的部署工具——TensorRT;

4.Google针对自家硬件设备和深度学习框架开发的部署工具——MediaPipe

5.由微软亚马逊 Facebook 和 IBM 等公司共同开发的开放神经网络交换格式——ONNX(Open Neural Network Exchange)

除此之外,还有一些深度学习框架有自己的专用部署服务:

     比如TensorFlow自己提供的部署服务:TensorFlow Serving、TensorFlow Lite,

       pytorch自己提供的部署服务:libtorch。

 1.首先讲一下NCNN

NCNN是腾讯优图实验室首个开源项目,是一个为手机端极致优化的高性能神经网络前向计算框架。并在2017年7月正式开源。NCNN做为腾讯优图最“火”的开源项目之一,是一个为手机端极致优化的高性能神经网络前向计算框架,在设计之初便将手机端的特殊场景融入核心理念,是业界首个为移动端优化的开源神经网络推断库。能实现无第三方依赖,跨平台操作,在手机端CPU运算速度在开源框架中处于领先水平。基于该平台,开发者能够轻松将深度学习算法移植到手机端,输出高效的执行,进而产出人工智能APP,将AI技术带到用户指尖。

NCNN从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 CPU的速度快于目前所有已知的开源框架。基于 NCNN,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。NCNN目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。

 下面是NCNN在各大系统平台的应用发展状态情况:

根据官方的功能描述,NCNN在各方面的性能都比较优良:

1. 支持卷积神经网络,支持多输入和多分支结构,可计算部分分支

2. 无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架

3.纯 C++ 实现,跨平台,支持 android ios 等

4. ARM NEON 汇编级良心优化,计算速度极快

5.精细的内存管理和数据结构设计,内存占用极低

6. 支持多核并行计算加速,ARM big.LITTLE cpu 调度优化

7. 支持基于全新低消耗的 vulkan api GPU 加速

8. 整体库体积小于 700K,并可轻松精简到小于 300K

9. 可扩展的模型设计,支持 8bit 量化 和半精度浮点存储,可导入 caffe/pytorch/mxnet/onnx/darknet/keras/tensorflow(mlir) 模型

10. 支持直接内存零拷贝引用加载网络模型

11. 可注册自定义层实现并扩展

除此之外,NCNN在对各种硬件设备的支持上也非常给力:

NCNN的官方代码地址:https://github.com/Tencent/ncnn

移动端的部署工具除了NCNN,还有华盛顿大学的TVM、阿里的MNN、小米的MACE、腾讯优图基于NCNN开发的TNN等推理部署工具。

OpenVINO

OpenVINO工具套件全称是Open Visual Inference & Neural Network Optimization,是Intel于2018年发布的,开源、商用免费、主要应用于计算机视觉、实现神经网络模型优化和推理计算(Inference)加速的软件工具套件。由于其商用免费,且可以把深度学习模型部署在英尔特CPU和集成GPU上,大大节约了显卡费用,所以越来越多的深度学习应用都使用OpenVINO工具套件做深度学习模型部署。

OpenVINO是一个Pipeline工具集,同时可以兼容各种开源框架训练好的模型,拥有算法模型上线部署的各种能力,只要掌握了该工具,你可以轻松的将预训练模型在Intel的CPU上快速部署起来。

对于AI工作负载来说,OpenVINO提供了深度学习推理套件(DLDT),该套件可以将各种开源框架训练好的模型进行线上部署,除此之外,还包含了图片处理工具包OpenCV,视频处理工具包Media SDK,用于处理图像视频解码,前处理和推理结果后处理等。

在做推理的时候,大多数情况需要前处理和后处理,前处理如通道变换,取均值,归一化,Resize等,后处理是推理后,需要将检测框等特征叠加至原图等,都可以使用OpenVINO工具套件里的API接口完成。

OpenVino目前支持Linux、Windows、macOS、Raspbian等系统平台。

 OpenVINO工具套件主要包括:Model Optimizer(模型优化器)——用于优化神经网络模型的工具,Inference Engine(推理引擎)——用于加速推理计算的软件包。

 

模型优化器是一个python脚本工具,用于将开源框架训练好的模型转化为推理引擎可以识别的中间表达,其实就是两个文件,xml和bin文件,前者是网络结构的描述,后者是权重文件。模型优化器的作用包括压缩模型和加速,比如,去掉推理无用的操作(Dropout),层的融合(Conv + BN + Relu),以及内存优化。

推理引擎是一个支持C\C++和python的一套API接口,需要开发人员自己实现推理过程的开发,开发流程其实非常的简单,核心流程如下:

1.装载处理器的插件库

2. 读取网络结构和权重

3. 配置输入和输出参数

4. 装载模型

5.创建推理请求

6. 准备输入Data

7.推理

8.结果处理

OpenVino工具套件的工作流程图

OpenVino的官方地址:https://docs.openvinotoolkit.org/latest/index.html

TensorRT

这个是英伟达推出的GPU加速器,TensorRT 基于 CUDA,NVIDIA 的并行编程模型,能够利用 CUDA-X AI 中的库、开发工具和技术,为人工智能、自动机器、高性能计算和图形优化所有深度学习框架的推理。

 (6条消息) 2022使用NVIDIA TensorRT 8.0加速深度学习推理(更新)_Vertira的博客-CSDN博客

MediaPipe

MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 YouTube、Google Lens、ARCore、Google Home 以及 Nest,都已深度整合了 MediaPipe。

MediaPipe 是一个基于图形的跨平台框架,用于构建多模式(视频,音频和传感器)应用的机器学习管道。MediaPipe 可在移动设备、工作站和服务器上跨平台运行,并支持移动 GPU 加速。使用 MediaPipe,可以将应用的机器学习管道构建为模块化组件的图形。MediaPipe 不仅可以被部署在服务器端,更可以在多个移动端 (安卓和苹果 iOS)和嵌入式平台(Google Coral 和树莓派)中作为设备端机器学习推理 (On-device Machine Learning Inference)框架。

 

一款多媒体机器学习应用的成败除了依赖于模型本身的好坏,还取决于设备资源的有效调配、多个输入流之间的高效同步、跨平台部署上的便捷程度、以及应用搭建的快速与否。

基于这些需求,谷歌开发并开源了 MediaPipe 项目。除了上述的特性,MediaPipe 还支持 TensorFlow 和 TF Lite 的推理引擎(Inference Engine),任何 TensorFlow 和 TF Lite 的模型都可以在 MediaPipe 上使用。同时,在移动端和嵌入式平台,MediaPipe 也支持设备本身的 GPU 加速。

MediaPipe 专为机器学习(ML)从业者而设计,包括研究人员,学生和软件开发人员,他们实施生产就绪的 ML 应用程序,发布伴随研究工作的代码,以及构建技术原型。MediaPipe 的主要用例是使用推理模型和其他可重用组件对应用机器学习管道进行快速原型设计。MediaPipe 还有助于将机器学习技术部署到各种不同硬件平台上的演示和应用程序中。

MediaPipe 的核心框架由 C++ 实现,并提供 Java 以及 Objective C 等语言的支持。MediaPipe 的主要概念包括数据包(Packet)、数据流(Stream)、计算单元(Calculator)、图(Graph)以及子图(Subgraph)。数据包是最基础的数据单位,一个数据包代表了在某一特定时间节点的数据,例如一帧图像或一小段音频信号;数据流是由按时间顺序升序排列的多个数据包组成,一个数据流的某一特定时间戳(Timestamp)只允许至多一个数据包的存在;而数据流则是在多个计算单元构成的图中流动。MediaPipe 的图是有向的——数据包从数据源(Source Calculator或者 Graph Input Stream)流入图直至在汇聚结点(Sink Calculator 或者 Graph Output Stream) 离开。

MediaPipe不支持除了tensorflow之外的其他深度学习框架,但是对各种系统平台和语言的支持非常友好:

MediaPipe的官方地址:https://google.github.io/mediapipe/

GitHub地址:https://github.com/google/mediapipe

ONNX

Open Neural Network Exchange(ONNX,开放神经网络交换)格式,是一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。ONNX是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存储模型数据并交互。ONNX的规范及代码主要由微软,亚马逊 ,Facebook 和 IBM 等公司共同开发,以开放源代码的方式托管在Github上。目前官方支持加载ONNX模型并进行推理的深度学习框架有:Caffe2, PyTorch, MXNet,ML.NET,TensorRT 和 Microsoft CNTK,并且 TensorFlow 也非官方的支持ONNX。

比方说现在某组织因为主要开发用TensorFlow为基础的框架,现在有一个深度算法,需要将其部署在移动设备上,以观测变现。传统地我们需要用caffe2重新将模型写好,然后再训练参数;试想下这将是一个多么耗时耗力的过程。

此时,ONNX便应运而生,Caffe2,PyTorch,Microsoft Cognitive Toolkit,Apache MXNet等主流框架都对ONNX有着不同程度的支持。这就便于了我们的算法及模型在不同的框架之间的迁移。无论你使用何种训练框架训练模型(比如TensorFlow/Pytorch/OneFlow/Paddle),在训练完毕后你都可以将这些框架的模型统一转换为ONNX这种统一的格式进行存储。

开放式神经网络交换(ONNX)是迈向开放式生态系统的第一步,它使AI开发人员能够随着项目的发展选择合适的工具。ONNX为AI模型提供开源格式。它定义了可扩展的计算图模型,以及内置运算符和标准数据类型的定义。最初的ONNX专注于推理(评估)所需的功能。ONNX解释计算图的可移植,它使用graph的序列化格式。它不一定是框架选择在内部使用和操作计算的形式。例如,如果在优化过程中操作更有效,则实现可以在存储器中以不同方式表示模型。

在获得ONNX模型之后,模型部署人员自然就可以将这个模型部署到兼容ONNX的运行环境中去。这里一般还会设计到额外的模型转换工作,典型的比如在Android端利用NCNN部署ONNX格式模型,那么就需要将ONNX利用NCNN的转换工具转换到NCNN所支持的bin和param格式。

ONNX作为一个文件格式,我们自然需要一定的规则去读取我们想要的信息或者是写入我们需要保存信息。ONNX使用的是Protobuf这个序列化数据结构去存储神经网络的权重信息。熟悉Caffe或者Caffe2的同学应该知道,它们的模型存储数据结构协议也是Protobuf。

Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API(摘自官方介绍)。

Protobuf协议是一个以*.proto后缀文件为基础的,这个文件描述了用户自定义的数据结构。如果需要了解更多细节请参考0x7节的资料3,这里只是想表达ONNX是基于Protobuf来做数据存储和传输,那么自然onnx.proto就是ONNX格式文件了。

ONNX作为框架共用的一种模型交换格式,使用 protobuf 二进制格式来序列化模型,可以提供更好的传输性能我们可能会在某一任务中将 Pytorch 或者 TensorFlow 模型转化为 ONNX 模型(ONNX 模型一般用于中间部署阶段),然后再拿转化后的 ONNX模型进而转化为我们使用不同框架部署需要的类型,ONNX 相当于一个翻译的作用。

 

ONNX将每一个网络的每一层或者说是每一个算子当作节点Node,再由这些Node去构建一个Graph,相当于是一个网络。最后将Graph和这个onnx模型的其他信息结合在一起,生成一个model,也就是最终的.onnx的模型。

构建一个简单的onnx模型,实质上,只要构建好每一个node,然后将它们和输入输出超参数一起塞到graph,最后转成model就可以了。

在计算方面,虽然更高级的表达不同,但不同框架产生的最终结果都是非常接近。因此实时跟踪某一个神经网络是如何在这些框架上生成的,接着使用这些信息创建一个通用的计算图,即符合ONNX标准的计算图。

ONNX为可扩展的计算图模型、内部运算器(Operator)以及标准数据类型提供了定义。在初始阶段,每个计算数据流图以节点列表的形式组织起来,构成一个非循环的图。节点有一个或多个的输入与输出。每个节点都是对一个运算器的调用。图还会包含协助记录其目的、作者等信息的元数据。运算器在图的外部实现,但那些内置的运算器可移植到不同的框架上,每个支持ONNX的框架将在匹配的数据类型上提供这些运算器的实现。

Microsoft 和合作伙伴社区创建了 ONNX 作为表示机器学习模型的开放标准。 许多框架(包括 TensorFlow、PyTorch、SciKit-Learn、Keras、Chainer、MXNet、MATLAB 和 SparkML)中的模型都可以导出或转换为标准 ONNX 格式。模型采用 ONNX 格式后,可在各种平台和设备上运行。

ONNX 运行时是一种用于将 ONNX 模型部署到生产环境的高性能推理引擎。它针对云和 Edge 进行了优化,适用于 Linux、Windows 和 Mac。它使用 C++ 编写,还包含 C、Python、C#、Java 和 Javascript (Node.js) API,可在各种环境中使用。ONNX 运行时同时支持 DNN 和传统 ML 模型,并与不同硬件上的加速器(例如,NVidia GPU 上的 TensorRT、Intel 处理器上的 OpenVINO、Windows 上的 DirectML 等)集成。通过使用 ONNX 运行时,可以从大量的生产级优化、测试和不断改进中受益。

ONNX 运行时用于大规模 Microsoft 服务,如必应、Office 和 Azure 认知服务。性能提升取决于许多因素,但这些 Microsoft 服务的 CPU 平均起来可实现 2 倍的性能提升。除了 Azure 机器学习服务外,ONNX 运行时还在支持机器学习工作负荷的其他产品中运行,包括:

l Windows:该运行时作为 Windows 机器学习的一部分内置于 Windows 中,在数亿台设备上运行。

l Azure SQL 产品系列:针对 Azure SQL Edge 和 Azure SQL 托管实例中的数据运行本机评分。

l ML.NET:在 ML.NET 中运行 ONNX 模型。

 

ONNX的官方网站:https://onnx.ai/

ONXX的GitHub地址:https://github.com/onnx/onnx

欢迎  点赞  收藏   加 关注

参考:

主流的深度学习推理架构有哪些呢? (baidu.com)

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

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

相关文章

用DIV+CSS技术设计的网上书城网页与实现制作(大一Web课程设计)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Java项目:JSP中华传统美食网站平台管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 作者主页:夜未央5788 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前台与后台&…

【网页设计】基于HTML+CSS+JavaScript学生网上报到系统响应式网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

计算机网络---万维网(WWW)

(一)WWW的概念与组成结构 万维网(World Wide Web,WWW)是一个分布式、联机式的信息存储空间,在这个空间中:一样有用的事物称为一样“资源”,并由一个全域“统一资源定位符”(URL)标识。这些资源通…

Scala的简单语法介绍

文章目录变量声明语句块if语句for循环while、do while数组Map映射tuple元组变量声明 //在Scala中val用于定义常量,var用于定义变量 var var_i 1 var_i 1val val_i 1 val_i 1 val_i 2运行结果如下: 可以看到,常量是初始复制就确定了&am…

Hello Erupt

前言 本系列将直接以Erupt的分布式方案为路线进行更新。本文的定位是Erupt的HelloWorld。目标,跑起来,让我们看看它是什么样的。 运行起来 准备一个数据库 第一步还是先运行起来。由于最近接触的公司项目都是在使用mysql的驱动,这里我也就…

python+人脸识别+opencv实现真实人脸驱动的阿凡达(上)

目录一、前言二、技术路线三、主要技术点分析(1) 人脸识别模块特征点的漂移(2) 柔性运动与刚性运动的处理setp1 基于人脸特征点的三角剖分setp2 基于三角映射的仿射变换(3) 正脸转侧脸的处理四、小结一、前言 我们在此前的名叫pythonopencv实现人脸微整形博文里已经简单地实现…

Java GUI图形编程 使用awt和swing 制作简易计算器的工具包含源码和讲解 / java练习项目

系列文章目录 提示:阅读本章之前,请先阅读目录 文章目录系列文章目录前言一、常规配置1. 设置窗口大小2. 获取当前屏幕的尺寸3. 窗口居中4. 设置窗口名称5. 添加监听器,关闭窗口6. 设置窗口可见性7. 设置文本框不可编辑8. 设置文本框提示9. 设…

OpenGL原理与实践——核心模式(六):光照贴图、光源分类以及多光源场景主要源码实现

本章主要以代码为主,理论理解即可。详细分析代码 目录 光照贴图 光源分类 平行光 点光源 shader——点光源 聚光灯 聚光灯边缘优化——光强递减 源码解析 main 全局变量、句柄 main函数主体逻辑 createModel() createTexture(const char* _filename) …

骨感传导蓝牙耳机怎么样,骨感传导耳机对于我们耳道是否有保护

在现在数码产品普及生活的时代,耳机也成为了我们每天的标准,以往佩戴的都是入耳式的耳机,但长时间佩戴下会出现耳朵疼痛,严重的更会导致听力障碍的问题发生,针对这一现象,一种新型的骨感传导耳机来到了我们…

后台默默付出的劳动者,四大组件之服务(Service)

后台默默付出的劳动者,四大组件之服务Service前言十、后台默默付出的劳动者,四大组件之服务(Service)10.1 服务是啥?10.2 Android异步消息处理机制10.2.1 Android异步消息处理机制介绍10.2.2 基于Android异步消息处理机…

Packet Tracer - 排除多区域 OSPFv2 故障

地址分配表 设备 接口 IP 地址 子网掩码 默认网关 ISP GigabitEthernet0/0 209.165.200.17 255.255.255.240 不适用 ASBR GigabitEthernet0/0 209.165.200.18 255.255.255.240 不适用 Serial0/0/0 10.1.1.2 255.255.255.252 不适用 Serial0/0/1 10.2.2…

制作一个企业网站——html华为官网购物商城项目的设计与实现

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

【Redis】使用 Java 客户端连接 Redis

一、三种客户端比较 Jedis : 学习成本低,以 Redis 命令作为方法名称,但是其线程不安全 lettuce:基于 Netty 实现,支持同步、异步、响应式编程(SpringBoot),并且线程安全。支持 Redis 的哨兵模…

【附源码】计算机毕业设计JAVA幼儿健康管理系统

【附源码】计算机毕业设计JAVA幼儿健康管理系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA my…

Nacos入门

文章目录一、安装nacos二、nacos项目环境配置一、安装nacos 压缩包下载地址: https://github.com/alibaba/nacos/releases 压缩包解压: nacos 中修改端口(8848 端口被占用需要修改): 进入 conf 进入 application.properties 端口位置 启…

【springboot进阶】摆脱 if/else 的高级应用 - 策略模式

目录 一、策略模式的介绍 二、策略模式的使用场景 三、策略模式的应用 1、入参和出参类 2、策略接口 3、策略具体实现 4、策略测试 三、一些使用技巧 四、总结 对于一个逻辑相对复杂的功能应用中,难免需要做很多的逻辑判断,需要写一堆的 if/els…

Flink常用Sink(elasticsearch(es)Sink、RedisSink、KafkaSink、MysqlSink、FileSink)

flink输出到es、redis、mysql、kafka、file 文章目录配置pom文件公共实体类KafkaSInkElasticsearchSink(EsSink)RedisSinkMysqlSink(JdbcSink)FileSink自己先准备一下相关环境 配置pom文件 <properties><maven.compiler.source>8</maven.compiler.source>&l…

【概率论与数理统计】第四章知识点复习与习题

思维导图 基础知识 数学期望 定义 数学期望其实很好理解&#xff0c;就是均值&#xff0c;当然这里并不是直接计算样本的均值&#xff0c;而是考虑到样本对应的概率。我们分离散和连续两类来讨论数学期望。 离散型 对随机变量X的分布律为 若级数 绝对收敛&#xff0c;则称该…

BaGet搭建Nuget私仓(window10docker)

文章目录一、搭建背景二、框架简介三、私仓搭建1、环境2、win10上部署2.1安装SDK2.2下载和解压BaGet包2.3运行项目2.4类库项目2.5将包发布到私有Nuget中2.6使用BaGetFirstLib2.7使用密码增加安全性3、Docker上部署3.1创建相关文件3.2拉取镜像3.3运行3.4访问四、结束一、搭建背景…