nndeploy:一款最新上线的支持多平台、简单易用、高性能的机器学习部署框架

项目地址:https://github.com/Alwaysssssss/nndeploy

介绍

nndeploy 是一款最新上线的支持多平台、高性能、简单易用的机器学习部署框架。做到一个框架就可完成多端(云、边、端)模型的高性能部署。

作为一个多平台模型部署工具,我们的框架最大的宗旨就是高性能以及使用简单贴心😚,目前 nndeploy 已完成 TensorRT、OpenVINO 、ONNXRuntime、MNN、TNN、ncnn 六个业界知名的推理框架的集成,后续会继续接入 TFLitepaddle-litecoreMLTVMAITemplate,在我们的框架下可使用一套代码轻松切换不同的推理后端进行推理,且不用担心部署框架对推理框架的抽象而带来的性能损失。

如果您需要部署自己的模型,目前 nndeploy 只需大概只要 200 行代码就可以完成模型在多端的部署。 同时还提供了高性能的前后处理模板和推理模板,该模板可帮助您简化模型端到端的部署流程。

目前 nndeploy 已完成 YOLO 系列等多个开源模型的部署,可供直接使用,目前我们还在积极部署其它开源模型。(如果您或团队有需要部署的开源模型或者其他部署相关的问题,非常欢迎随时来和我们探讨 😁)

模型部署的痛点

  • 现在业界尚不存在各方面都远超其同类产品的推理框架,不同推理框架在不同平台、硬件下分别具有各自的优势。例如,在 Linux + NVidia 显卡机器推理,TensorRT 是性能最好的推理框架;在 Windows + x86 CPU 机器推理,OpenVINO 是性能最好的推理框架;在 ARM Android 下,有 ncnnMNNTFLite、TNN等一系列选择。

  • 不同的推理框架有不一样的推理接口、推理配置等 API,针对不同推理框架都需要写一套代码,这对模型部署工程师而言,将带来较大学习成本、开发成本、维护成本

  • 模型部署不仅仅只有模型推理,还有前处理、后处理,推理框架往往只提供模型推理的功能

  • 目前很多场景是需要由多个模型组合解决该业务问题(例如stable diffusion、老照片修复、人脸识别等等),直接采用推理框架的原生接口,会有大量且低效的业务代码编写

架构简介

在这里插入图片描述

nndeploy 的优势

支持多平台和多推理框架

  • 支持多种推理框架:对多个业界知名推理框架的全面支持,包括 TensorRTOpenVINOONNXRuntimeMNNTNNncnn 等。未来,我们将继续扩展支持,包括 TFLitepaddle-litecoreMLTVMAITemplateRKNN
  • 支持多种不同操作系统,包括 AndroidLinuxWindows,正在适配 macOSIOS。致力于在各种操作系统上无缝运行您的深度学习模型
OS/InferenceLinuxWindowsAndroidMacOSIOS开发人员备注
TensorRTyesnonononoAlways
OpenVINOyesyesnononoAlways
ONNXRuntimeyesyesnononoAlways
MNNyesyesyesnonoAlways
TNNyesyesyesnono02200059Z
ncnnnonoyesnonoAlways

直接可用的算法

  • 目前已完成 YOLOV5、YOLOV6、YOLOV8 等模型的部署,可供您直接使用,后续我们持续不断去部署其它开源模型,让您开箱即用
算法Inference开发人员备注
YOLOV5TensorRt/OpenVINO/ONNXRuntime/MNN02200059Z、Always
YOLOV6TensorRt/OpenVINO/ONNXRuntime02200059Z、Always
YOLOV8TensorRt/OpenVINO/ONNXRuntime/MNN02200059Z、Always

高性能

  • 推理框架的高性能抽象:每个推理框架也都有其各自的特性,需要足够尊重以及理解这些推理框架,才能在抽象中不丢失推理框架的特性,并做到统一的使用的体验。nndeploy 可配置第三方推理框架绝大部分参数,保证了推理性能。可直接操作理框架内部分配的输入输出,实现前后处理的零拷贝,提升模型部署端到端的性能。

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

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

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

在这里插入图片描述

简单易用

  • 一套代码多端部署:通过切换推理配置,一套代码即可在多端部署,算法的使用接口简单易用。示例代码如下:

    int main(int argc, char *argv[]) {// 有向无环图pipeline名称,例如://  NNDEPLOY_YOLOV5/NNDEPLOY_YOLOV6/NNDEPLOY_YOLOV8std::string name = demo::getName();// 推理后端类型,例如:// kInferenceTypeOpenVino / kInferenceTypeTensorRt / kInferenceTypeOnnxRuntimebase::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的输入边packertmodel::Packet input("detect_in");// 有向无环图pipeline的输出边packertmodel::Packet output("detect_out");// 创建模型有向无环图pipelinemodel::Pipeline *pipeline =model::createPipeline(name, inference_type, device_type, &input, &output,model_type, is_path, model_value);// 初始化有向无环图pipelinebase::Status status = pipeline->init();// 输入图片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();// 有向无环图pipelinez反初始化status = pipeline->deinit();// 有向无环图pipeline销毁delete pipeline;return 0;
    }
    
  • 算法部署简单:将 AI 算法端到端(前处理->推理->后处理)的部署抽象为有向无环图 Pipeline,前处理为一个 Task,推理也为一个 Task,后处理也为一个 Task,提供了高性能的前后处理模板和推理模板,上述模板可帮助您进一步简化端到端的部署流程。有向无环图还可以高性能且高效的解决多模型部署的痛点问题。示例代码如下:

    model::Pipeline* createYoloV5Pipeline(const std::string& name,base::InferenceType inference_type,base::DeviceType device_type,Packet* input, Packet* output,base::ModelType model_type, bool is_path,std::vector<std::string>& model_value) {model::Pipeline* pipeline = new model::Pipeline(name, input, output); // 有向无环图model::Packet* infer_input = pipeline->createPacket("infer_input"); // 推理模板的输入边model::Packet* infer_output = pipeline->createPacket("infer_output"); // 推理模板的输出// 搭建有向无图(preprocess->infer->postprocess)// 模型前处理模板model::CvtColrResize,输入边为input,输出边为infer_inputmodel::Task* pre = pipeline->createTask<model::CvtColrResize>("preprocess", input, infer_input);// 模型推理模板model::Infer(通用模板),输入边为infer_input,输出边为infer_outputmodel::Task* infer = pipeline->createInfer<model::Infer>("infer", inference_type, infer_input, infer_output);// 模型后处理模板YoloPostProcess,输入边为infer_output,输出边为outputmodel::Task* post = pipeline->createTask<YoloPostProcess>("postprocess", infer_output, output);// 模型前处理任务pre的参数配置model::CvtclorResizeParam* pre_param =dynamic_cast<model::CvtclorResizeParam*>(pre->getParam());pre_param->src_pixel_type_ = base::kPixelTypeBGR;pre_param->dst_pixel_type_ = base::kPixelTypeRGB;pre_param->interp_type_ = base::kInterpTypeLinear;pre_param->h_ = 640;pre_param->w_ = 640;// 模型推理任务infer的参数配置inference::InferenceParam* inference_param =(inference::InferenceParam*)(infer->getParam());inference_param->is_path_ = is_path;inference_param->model_value_ = model_value;inference_param->device_type_ = device_type;// 模型后处理任务post的参数配置YoloPostParam* post_param = dynamic_cast<YoloPostParam*>(post->getParam());post_param->score_threshold_ = 0.5;post_param->nms_threshold_ = 0.45;post_param->num_classes_ = 80;post_param->model_h_ = 640;post_param->model_w_ = 640;post_param->version_ = 5;return pipeline;
    }
    

架构详解

  • Directed Acyclic Graph:有向无环图子模块。模型端到端的部署流程可抽象成 3 个子块:模型前处理->模型推理->模型推理,这是一个非常典型的有向无环图,对于多模型组合的算法而言,是更加复杂的的有向无环图,直接写业务代码去串联整个过程不仅容易出错,而且还效率低下,采用有向无环图的方式可以极大的缩减业务代码的编写。

  • Process Template:前后处理模板以及推理子模板。我们希望还再可以简化您的部署流程,因此在模型端到端的部署的模型前处理->模型推理->模型推理的三个过程中,我们进一步设计模板。尤其是在推理模板上面花了足够多的心思,针对不同的模型,又有很多差异性,例如单输入、多输出、静态形状输入、动态形状输入、静态形状输出、动态形状输出、是否可操作推理框架内部分配输入输出等等一系列不同,只有具备丰富模型部署经验的工程师才能快速解决上述问题,故我们基于多端推理模块 Inference + 有向无环图节点 Task 再设计功能强大的推理模板Infer,这个推理模板可以帮您在内部处理上述针对模型的不同带来的差异。

  • Resouce Pool:资源管理子模块。正在开发线程池以及内存池(这块是 nndeploy 正在火热开发的模块,期待大佬一起来搞事情)。线程池可实现有向无环图的流水线并行,内存池可实现高效的内存分配与释放。

  • Inference:多端推理子模块( nndeploy 还需要集成更多的推理框架,期待大佬一起来搞事情)。提供统一的推理接口去操作不同的推理后端,在封装每个推理框架时,我们都花了大量时间去理解并研究各个推理框架的特性,例如 TensorRT 可以使用外存推理,OpenVINO 有高吞吐率模式、TNN 可以操作内部分配输入输出等等。我们在抽象的过程中不会丢失推理框架的特性,并做到统一的使用的体验,还保证了性能。

  • OP:高性能算子模块。我们打算去开发一套高性能的前后处理算子(期待有大佬一起来搞事情),提升模型端到端的性能,也打算开发一套 nn 算子库或者去封装 oneDNNQNN 等算子库(说不定在 nndeploy 里面还会做一个推理框架呀)

  • Data Container:数据容器子模块。推理框架的封装不仅推理接口的 API 的封装,还需要设计一个 Tensor,用于去与第三方推理框架的 Tensor 进行数据交互。 nndeploy 还设计图像处理的数据容器 Mat,并设计多设备的统一内存 Buffer。

  • Device:设备管理子模块。为不同的设备提供统一的内存分配、内存拷贝、执行流管理等操作。

TODO

  • 接入更多的推理框架,包括TFLitepaddle-litecoreMLTVMAITemplateRKNN、算能等等推理软件栈
  • 部署更多的算法,包括 Stable DiffusionDETRSAM等等热门开源模型

加入我们

  • 欢迎大家参与,一起打造最简单易用、高性能的机器学习部署框架
  • 微信:titian5566 (可加我微信进 nndeploy 交流群,备注:nndeploy)
  • 微信群:nndeploy 表情包交流群

本文作者

  • 02200059Z
  • qixuxiang
  • PeterH0323
  • Always

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【李沐深度学习笔记】矩阵计算(4)

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 本节是第四篇&#xff0c;由于CSDN限制&#xff0c;只能被迫拆分 矩阵计算 矩阵的导数运算 向量对向量求导的基本运算规则 已知…

低代码助力企业数字化转型

在当今这个数字化快速发展的时代&#xff0c;企业面临的竞争越来越激烈&#xff0c;数字化转型已成为企业发展的必经之路。低代码平台作为一种新型的开发工具&#xff0c;正在逐渐成为企业数字化转型的重要助力。本文将从数字化转型背景、低代码平台介绍、低代码平台的应用、低…

科普:什么是视频监控平台?如何应用在场景中?

随着科技的发展&#xff0c;监控无处不在&#xff0c;就像一张密不透风的网&#xff0c;将生活中的角角落落都编织在一起。可是&#xff0c;你真的知道什么是安防视频监控平台吗&#xff1f;它可不止是一个简单的通电摄像头&#xff0c;如今的视频监控平台&#xff0c;涵盖了无…

在 Substance Painter中实现Unity Standard Shader

由于有需要在Substance Painter中显示什么样的效果&#xff0c;在Unity就要显示什么样的效果的需求&#xff0c;最近研究了几天&#xff0c;总算在Substance Painter中实现Unity standard的材质的渲染效果。具体效果如下&#xff1a; 在Unity中&#xff1a; Substance Painte…

小米笔试题——01背包问题变种

这段代码的主要思路是使用动态规划来构建一个二维数组 dp&#xff0c;其中 dp[i][j] 表示前 i 个产品是否可以组合出金额 j。通过遍历产品列表和可能的目标金额&#xff0c;不断更新 dp 数组中的值&#xff0c;最终返回 dp[N][M] 来判断是否可以组合出目标金额 M。如果 dp[N][M…

错过成考报名,今年你还有这两种方式升学!

2023年广东成人高考已经报名结束啦 错过报名或没有抢到考位的同学不用伤心 你还有另外两个提升学历的机会 开放大学or小自考 今天一起来了解一下吧~ 什么是开放大学&#xff1f; 开放教育其实也就是开放大学&#xff0c;也就是我们所说的中央广播电视大学&#xff0c;现在…

【电源专题】什么是充电芯片的Shipping Mode(船运模式)

现在越来越多电子产品小型化,手持化,这样就需要电池来为产品供电。但电池供电造成的另一个难题就是产品的续航能力的强与弱。 如果想提升续航能力,有一种方法是提高电池容量。如果电池体积没有变化的情况下,可能使用了新型材料、高级技术来增加电池容量,但这势必会增加电池…

工作【当van-tab不满足固定在顶部】

背景 需要H5实现一下滑动列表&#xff0c;顶部tab栏可以切换&#xff0c;当向下滑动列表的时候tab栏固定到顶部。果断的看了一下官方文档&#xff1a; 就是这个&#xff0c;我一看还有扩展属性&#xff0c;非常友好。向下滑动查看文档 使用sticky实现的。众所周知&#xff0…

【数据库】Sql Server 2022通过临时表和游标遍历方式逻辑处理获取目标数据

2023年&#xff0c;第39周。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; 今天有个小伙伴咨询一个Sql Server处理数据的问题&#xff0c;刚好重温下SqlServer临时表和游标的知识点 目录 一、需求点描述二、临时表2.1、局部临时表&#xff…

第8章 MySQL的数据目录

8.1 数据库和文件系统的关系 像 InnoDB 、 MyISAM 这样的存储引擎都是把表存储在磁盘上的&#xff0c;而操作系统用来管理磁盘的又被称为 文件系统 &#xff0c;所以用专业一点的话来表述就是&#xff1a;像 InnoDB 、 MyISAM 这样的存储引擎都是把表存储在文件系统上的。当我…

Python 计算三角形面积

"""计算三角形面积介绍&#xff1a;已知三角形边长分别为x、y、z&#xff0c;可以计算三角形半周长q&#xff0c;然后根据海伦公式计算三角形面积S三角形半周长&#xff1a;q (x y z) / 2三角形面积&#xff1a;S (q * (q-x) * (q-y) * (q-z)) ** 0.5知识点…

Mac 上安装yt-dlp 和下载视频的操作

安装 打开终端&#xff0c;在终端输入 cd python的路径&#xff0c;然后输入pip3 install yt-dlp&#xff0c;如下图&#xff1b; 出现 如Successfully installed yt-dlp-2023.7.6 的时候&#xff0c;说明下载成功 下载 下载命令&#xff1a; yt-dlp --list-formats https…