全栈式多终端模型部署框架 nndeploy 重磅开源!

2023-09-20 08:02:09

公众号致力于点云处理,SLAM,三维视觉,高精地图等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl@163.com。

推理框架现状和痛点

现在业界尚不存在各方面都远超其同类产品的推理框架,不同推理引擎在不同平台,硬件和模式下分别具有各自的优势,比如TensorRT有足够多的灵活性,在GPU执行时可以共享上下文,可以使用外部内存用于推理等,OpenVINO有高吞吐率模式,可以CPU与GPU异构设备同时推理,TNN提供给上层用户直接操作其内部分配的输入输出Blob的能力等,另外其他推理框架也都有其各自的特性,需要足够尊重以及了解这些推理框架,才能不丢失每一个推理框架的特性,并做到统一的使用的体验。但作为模型部署工程师,为了实现最优效率,如果针对不同环境都写一套代码去适配其最优推理框架,其耗费的学习成本和精力及代码量都将极其巨大。

随着AI技术的迅速发展,各种AI应用如雨后春笋般涌现。为了更好地满足多终端深度学习应用的需求,我们自豪地宣布,全栈式多终端模型部署框架 nndeploy 正式开源!这一框架的使命是简化和加速深度学习模型在不同设备上的运行,为包括智能手机、智能家居设备、自动驾驶汽车、工业设备、大模型推理等多样化应用场景提供更灵活、高效的解决方案。

a0d894ee04788876f51214ff30d549ca.jpeg

为什么选择 nndeploy?

  • 多种推理框架接入:我们引以为傲的特性之一是对多种业界知名推理框架的全面支持,包括 TensorRT、OpenVINO、ONNXRuntime、MNN、TNN、NCNN 等。未来,我们将继续扩展支持,包括 tf-lite、paddle-lite、coreML、TVM、AITemplate 等。在 nndeploy 框架下,您可以使用一套代码轻松切换不同的推理后端,而不必担心性能损失。

6f663532f88d2750d3791094c8e4f3f5.gif

  • 多终端适配:nndeploy 支持多种不同操作系统和硬件架构,包括 iOS、Android、Linux、Windows 等。这意味着您可以在各种终端设备上无缝运行您的深度学习模型。

  • 硬件加速支持:无论您使用的是 GPU、DSP 还是 NPU 等硬件加速器,nndeploy 都为您提供了全面支持,以充分利用终端设备的计算资源,确保推理性能卓越。

  • 多架构支持:nndeploy 能够在不同的硬件架构上运行,包括 x86 和 ARM 架构。这意味着开发人员可以轻松部署深度学习模型到不同种类的设备上,无需独立进行开发和优化。这不仅降低了开发成本,还提高了应用程序的可移植性。

b8ddc91b71e5b1f8d9e22a41221380da.gif

  • 基于有向无环图设计理念:我们深信有向无环图(DAG)的设计理念,将 AI 算法端到端部署抽象为有向无环图 Pipeline。前处理、推理和后处理都被抽象为任务,提供了高性能的前后处理模板和推理模板。这简化了端到端部署流程,同时高效地解决了多模型部署的挑战。

  • 高性能:nndeploy 提供了广泛的配置选项,以保证推理性能。您可以直接操作推理框架内部分配的输入和输出,实现零拷贝的前后处理,从而最大限度地利用终端设备的计算资源,保证低延迟和高吞吐量的推理。

  • 社区支持:nndeploy 是一个开源项目,开发人员和研究人员可以共同贡献代码、提出建议和解决问题。这使得框架得以不断演进和改进。

使用范例

以检测模型demo为例 - demo\detect\demo.cc

+ 创建检测模型有向无环图pipeline

// 检测模型的有向无环图pipeline名称,例如:
  // NNDEPLOY_YOLOV5/NNDEPLOY_YOLOV6/NNDEPLOY_YOLOV8
  std::string name = demo::getName();
  // 推理后端类型,例如:
  // kInferenceTypeOpenVino/kInferenceTypeTensorRt/kInferenceTypeOnnxRuntime/...
  base::InferenceType inference_type = demo::getInferenceType();
  // 推理设备类型,例如:
  // kDeviceTypeCodeX86:0/kDeviceTypeCodeCuda:0/...
  base::DeviceType device_type = demo::getDeviceType();
  // 模型类型,例如:
  // kModelTypeOnnx/kModelTypeMnn/...
  base::ModelType model_type = demo::getModelType();
  // 模型是否是路径
  bool is_path = demo::isPath();
  // 模型路径或者模型字符串
  std::vector<std::string> model_value = demo::getModelValue();
  // 有向无环图pipeline的输入边packert
  model::Packet input("detect_in");
  // 有向无环图pipeline的输出边packert
  model::Packet output("detect_out");
  // 创建检测模型有向无环图pipeline
  model::Pipeline *pipeline =
      model::createPipeline(name, inference_type, device_type, &input, &output,
                            model_type, is_path, model_value);
  if (pipeline == nullptr) {
    NNDEPLOY_LOGE("pipeline is nullptr");
    return -1;
  }

+ 初始化有向无环图pipeline

base::Status status = pipeline->init();
  if (status != base::kStatusCodeOk) {
    NNDEPLOY_LOGE("pipeline init failed");
    return -1;
  }
  ```
+ 给有向无环图pipeline写入输入边输出边
  ```c++
  // 有向无环图pipeline的输入图片路径
  std::string input_path = demo::getInputPath();
  // opencv读图
  cv::Mat input_mat = cv::imread(input_path);
  // 将图片写入有向无环图pipeline输入边
  input.set(input_mat);
  // 定义有向无环图pipeline的输出结果
  model::DetectResult result;
  // 将输出结果写入有向无环图pipeline输出边
  output.set(result);

+ 有向无环图pipeline运行

status = pipeline->run();
  if (status != base::kStatusCodeOk) {
    NNDEPLOY_LOGE("pipeline run failed");
    return -1;
  }

+ 有向无环图pipeline反初始化

status = pipeline->deinit();
  if (status != base::kStatusCodeOk) {
    NNDEPLOY_LOGE("pipeline deinit failed");
    return -1;
  }

+ 有向无环图pipeline销毁

delete pipeline;

未来计划

  • 线程池正在开发完善中,可实现有向无环图的流水线并行;

  • 内存池正在开发完善重,可实现高效的内存分配与释放;

  • 一组高性能的算子正在开发中,完成后将加速你模型前后处理速度;

  • 目前我们没有人力,后续我们估计也会去接入rknn,算能之类的推理软件栈。

a3ca34d7933158b3e880975e05741e46.jpeg

欢迎大家持续关注,一起助力技术的飞速发展,创造更多惊喜和创新!

开源地址:https://github.com/Alwaysssssss/nndeploy
社区文档: https://zhuanlan.zhihu.com/p/656359928

如何新增一个推理框架:https://blog.csdn.net/echoesssss/article/details/132674100

资源

自动驾驶及定位相关分享

【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法

自动驾驶中基于光流的运动物体检测

基于语义分割的相机外参标定

综述:用于自动驾驶的全景鱼眼相机的理论模型和感知介绍

高速场景下自动驾驶车辆定位方法综述

Patchwork++:基于点云的快速、稳健的地面分割方法

PaGO-LOAM:基于地面优化的激光雷达里程计

多模态路沿检测与滤波方法

多个激光雷达同时校准、定位和建图的框架

动态的城市环境中杆状物的提取建图与长期定位

非重复型扫描激光雷达的运动畸变矫正

快速紧耦合的稀疏直接雷达-惯性-视觉里程计

基于相机和低分辨率激光雷达的三维车辆检测

用于三维点云语义分割的标注工具和城市数据集

ROS2入门之基本介绍

固态激光雷达和相机系统的自动标定

激光雷达+GPS+IMU+轮速计的传感器融合定位方案

基于稀疏语义视觉特征的道路场景的建图与定位

自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)

用于三维点云语义分割的标注工具和城市数据集

更多文章可查看:点云学习历史文章大汇总

SLAM及AR相关分享

TOF相机原理介绍

TOF飞行时间深度相机介绍

结构化PLP-SLAM:单目、RGB-D和双目相机使用点线面的高效稀疏建图与定位方案

开源又优化的F-LOAM方案:基于优化的SC-F-LOAM

【开源方案共享】ORB-SLAM3开源啦!

【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM

【点云论文速读】StructSLAM:结构化线特征SLAM

SLAM和AR综述

常用的3D深度相机

AR设备单目视觉惯导SLAM算法综述与评价

SLAM综述(4)激光与视觉融合SLAM

Kimera实时重建的语义SLAM系统

SLAM综述(3)-视觉与惯导,视觉与深度学习SLAM

易扩展的SLAM框架-OpenVSLAM

高翔:非结构化道路激光SLAM中的挑战

基于鱼眼相机的SLAM方法介绍

以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除

19a7ebd9a6c413f6a03e26823d1a7310.png

扫描二维码

                   关注我们

让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入知识星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。

分享与合作方式:微信“cloudpoint9527”(备注:姓名+学校/公司+研究方向) 联系邮箱:dianyunpcl@163.com。

点一下“在看”你会更好看耶

2976b86a6d5ba83d19c6144f4c9a3de8.gif

更多推荐

MySQL索引,Explain,事务,锁与MVCC

MySQL的索引为什么不能为二叉树假如为二叉树,索引值插入顺序为1,2,3,4,5,6,那么形成的索引结构如图:搜索效率并不高。此时可以优化为红黑树(二叉平衡树),如图:但是红黑树也有问题,就是树的高度,如果数据过多,红黑树过高也会影响效率。为了控制高度,可以给每一个节点分配大一点的空间,例如上面的0002节点可以存储

css自学框架之图片懒加载

首先解释一下什么叫图片懒加载。图片懒加载是一种在页面加载时,延迟加载图片资源的技术,也就是说图片资源在需要的时候才会加载,就是在屏幕显示范围内加载图片,屏幕显示范围外图片不加载。一、关键函数用到的关键函数:globalThis.IntersectionObserver。varobserver=newIntersecti

亚马逊应该怎么快速提升排名,获取review?

跨境电商做久了,卖家都会陷入一个困境,到底是该坚持慢慢做好,还是要测评?现在跨境电商平台人人都在刷,不刷单想成功真的很难,不是没可能,但是选品要非常好,而且你的listing也要做好,推广要求又高你看那些大卖的评论长篇大论,图片视频样样都有,说是国外人写的,我估计都没人信,只是你还不会测评而已,会的话你就不会惊讶了但老

MyBatis 分页插件 PageHelper

文章目录前言PageHelper应用实现原理剖析应用场景分析前言分页插件PageHelper是我们使用Mybatis到的比较多的插件应用,适用于任何复杂的单表、多表分页查询操作。本文介绍PageHelper的使用及原理。PageHelper应用添加依赖<dependency><groupId>com.github.pa

VMware Workstation Pro各版本下载安装教程

VMwareWorkstationPro下载打开浏览器,输入VMwareWorkstationPro找到VMwareWorkstationPro官网并点击进入,官网地址:https://www.vmware.com/cn/products/workstation-pro.html进入官网首页后可以下载最新版本的VMwa

DBAPI安装教程

安装教程请先下载安装包。默认账户admin/admin。为了便于您理解安装的时候需要配置的参数,请您先学习日志监控相关的功能设计本地部署单机版依赖java环境,先自行在服务器安装jdk8+,并配置环境变量下载安装包解压到需要安装的目录修改conf/application.properties文件中的以下配置#api访问

谷粒商城----rabbitmq

一、为什么要用MQ?三大好处,削峰,解耦,异步。削峰比如秒杀,或者高铁抢票,请求在某些时间点实在是太多了,服务器处理不过来,可以把请求放到MQ里面缓冲一下,把一秒内收到的1万个请求放到队列里面,花10分钟去消费队列里的请求。解耦比如有一个服务A每天都采集数据并计算各种数据,服务B需要调用服务A的接口获取数据,就在A开一

使用 PyTorch 的计算机视觉简介 (2/6)

一、说明在本单元中,我们从最简单的图像分类方法开始——一个全连接的神经网络,也称为感知器。我们将回顾一下PyTorch中定义神经网络的方式,以及训练算法的工作原理。二、数据加载的实践首先,我们使用pytorchcv助手来加载所有数据。!wgethttps://raw.githubusercontent.com/Micr

Buuctf web [SUCTF 2019]EasySQL

又是一道考察sql注入的题1、起手试探(主要看看输入什么内容有正确的回显)101'1'#发现只有在输入1的情况下有正常的回显,输入0或其他字符都没有回显,所以这题就要尝试堆叠注入了。ps:(如果想尝试其他注入方法,输入以下内容需要有回显1'报错1'#正确)2、爆库1;showdatabases;3、报表1;showta

dart 学习 之 字符串插值,空变量 null,避空运算符,条件属性访问,集合字面量,箭头语法

文章目录字符串插值(Stringinterpolation)空变量null避空运算符条件属性访问集合字面量箭头语法字符串插值(Stringinterpolation)下面是一些使用字符串插值的例子:Herearesomeexamplesofusingstringinterpolation:Stringresult字符串

【实战详解】如何快速搭建接口自动化测试框架?Python + Requests

摘要:本文主要介绍如何使用Python语言和Requests库进行接口自动化测试,并提供详细的代码示例和操作步骤。希望能对读者有所启发和帮助。前言随着移动互联网的快速发展,越来越多的应用程序采用WebAPI(也称为RESTfulAPI)作为数据交换的主要方式。针对API进行自动化测试已经变得非常重要,它可以让我们快速地

热文推荐