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

公众号致力于点云处理,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云PCL公众号博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值