前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全栈式多终端模型部署框架 nndeploy 重磅开源!

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

作者头像
点云PCL博主
发布2023-09-20 20:40:09
2840
发布2023-09-20 20:40:09
举报
文章被收录于专栏:点云PCL点云PCL

推理框架现状和痛点

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

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

为什么选择 nndeploy?

  • 多种推理框架接入:我们引以为傲的特性之一是对多种业界知名推理框架的全面支持,包括 TensorRT、OpenVINO、ONNXRuntime、MNN、TNN、NCNN 等。未来,我们将继续扩展支持,包括 tf-lite、paddle-lite、coreML、TVM、AITemplate 等。在 nndeploy 框架下,您可以使用一套代码轻松切换不同的推理后端,而不必担心性能损失。
  • 多终端适配:nndeploy 支持多种不同操作系统和硬件架构,包括 iOS、Android、Linux、Windows 等。这意味着您可以在各种终端设备上无缝运行您的深度学习模型。
  • 硬件加速支持:无论您使用的是 GPU、DSP 还是 NPU 等硬件加速器,nndeploy 都为您提供了全面支持,以充分利用终端设备的计算资源,确保推理性能卓越。
  • 多架构支持:nndeploy 能够在不同的硬件架构上运行,包括 x86 和 ARM 架构。这意味着开发人员可以轻松部署深度学习模型到不同种类的设备上,无需独立进行开发和优化。这不仅降低了开发成本,还提高了应用程序的可移植性。
  • 基于有向无环图设计理念:我们深信有向无环图(DAG)的设计理念,将 AI 算法端到端部署抽象为有向无环图 Pipeline。前处理、推理和后处理都被抽象为任务,提供了高性能的前后处理模板和推理模板。这简化了端到端部署流程,同时高效地解决了多模型部署的挑战。
  • 高性能:nndeploy 提供了广泛的配置选项,以保证推理性能。您可以直接操作推理框架内部分配的输入和输出,实现零拷贝的前后处理,从而最大限度地利用终端设备的计算资源,保证低延迟和高吞吐量的推理。
  • 社区支持:nndeploy 是一个开源项目,开发人员和研究人员可以共同贡献代码、提出建议和解决问题。这使得框架得以不断演进和改进。

使用范例

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

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

代码语言:javascript
复制
  // 检测模型的有向无环图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

代码语言:javascript
复制
  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运行

代码语言:javascript
复制
status = pipeline->run();
  if (status != base::kStatusCodeOk) {
    NNDEPLOY_LOGE("pipeline run failed");
    return -1;
  }

+ 有向无环图pipeline反初始化

代码语言:javascript
复制
status = pipeline->deinit();
  if (status != base::kStatusCodeOk) {
    NNDEPLOY_LOGE("pipeline deinit failed");
    return -1;
  }

+ 有向无环图pipeline销毁

代码语言:javascript
复制
  delete pipeline;

未来计划

  • 线程池正在开发完善中,可实现有向无环图的流水线并行;
  • 内存池正在开发完善重,可实现高效的内存分配与释放;
  • 一组高性能的算子正在开发中,完成后将加速你模型前后处理速度;
  • 目前我们没有人力,后续我们估计也会去接入rknn,算能之类的推理软件栈。
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-20 08:00,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 点云PCL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com