当前位置: 首页 > news >正文

nndeploy: 易用、高性能、支持多端的AI推理部署框架

GitHub:https://github.com/nndeploy/nndeploy

更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI

nndeploy是一个简单易用、高性能、支持多端的AI推理部署框架。

主要解决以下模型部署中的痛点:

  1. 推理框架的碎片化:现在业界尚不存在各方面都远超其同类产品的推理框架,不同推理框架在不同平台、硬件下分别具有各自的优势。例如,在NVidia显卡上TensorRT性能最佳,在x86 CPU上OpenVINO最优,在苹果生态下CoreML最佳,在ARM Android有ncnn、MNN等多种选择。
  2. 多个推理框架的学习成本、开发成本、维护成本:不同的推理框架有不一样的推理接口、超参数配置、Tensor等等,假如一个模型需要多端部署,针对不同推理框架都需要写一套代码,这对模型部署工程师而言,将带来较大学习成本、开发成本、维护成本。
  3. 模型的多样性:从模型部署的角度出发,可以分为单输入、多输入、单输出、多输出、静态形状输入、动态形状输入、静态形状输出、动态形状输出一系列不同。当这些差异点与内存零拷贝优化结合时,通常只有具备丰富模型部署经验的工程师才能快速找到最优解。
  4. 模型高性能的前后处理:模型部署不仅仅只有模型推理,还有前处理、后处理,推理框架往往只提供模型推理的功能。通常需要部署工程师基于对原始算法的理解,通过C++开发该算法前后处理,这需要大量重复工作。
  5. 多模型的复杂场景:目前很多场景需要由多个模型组合解决业务问题,没有部署框架的支持,会有大量业务代码、模型耦合度高、灵活性差、代码不适合并行等问题。

主要功能

1. 简单易用
  • 基于有向无环图部署模型: 将AI算法部署抽象为有向无环图,前处理、推理、后处理各为一个节点
  • 推理模板Infer: 模板可处理各种模型差异,包括单/多输入输出和静态/动态形状等等
  • 高效解决多模型组合场景:支持图中嵌入图​功能,将复杂任务拆分为多个独立子图,通过组合方式快速解决多模型场景问题
  • 快速构建demo:支持多种输入输出格式(图片、文件夹、视频等),通过编解码节点化实现高效通用的demo构建
2. 高性能
  • 多种并行模式:支持串行(按拓扑排序依次执行节点)、流水线并行(多帧场景下将不同节点绑定到不同线程和设备)、任务并行(多模型场景下挖掘并行性缩短运行时间)以及上述组合并行模式。
  • 线程池与内存池:通过线程池提高并发性能和资源利用率,支持CPU算子自动并行(parallel_for)提升执行效率;内存池实现高效的内存分配与释放(开发中)
  • 一组高性能的算子:完成后将加速您模型前后处理速度(开发中)
3. 支持多种推理后端
  • 一套代码多种推理后端部署:通过切换推理配置,实现一套代码即可完成模型跨多个平台以及多个推理框架部署,性能与原始框架一致
  • 当前支持的推理框架如下:
Inference/OSLinuxWindowsAndroidMacOSIOSdeveloper
TensorRT----Always
OpenVINO---Always
ONNXRuntime---Always
MNN--Always
TNN--02200059Z
ncnn----Always
coreML----JoDio-zd、jaywlinux
AscendCL----CYYAI
RKNN----100312dog
tvm----youxiudeshouyeren
snpe----yhwang-hub
4. 内置推理子模块

框架内部开发的推理子模块,作为缺省推理框架,当用户环境未编译链接其他推理框架时可使用此框架。在实际应用中,推荐使用芯片厂商提供的对应平台推理框架。

当前支持华为昇腾NPU和纯CPU算子后端。计划扩展至X86、CUDA、ARM、OpenCL等异构计算平台。

已适配主流视觉模型:图像分类(ResNet50等)、目标检测(YOLOv11等)、图像分割(RMBG1.4等)。未来将支持大语言模型(LLM)和文本图像多模态模型(Dit等)。

编译

1. 拉取源代码
git clone https://github.com/nndeploy/nndeploy.git
cd nndeploy
# 拉取子模块
git submodule update --init --recursive
# 如果拉取子模块失败,调用克隆子模块脚本
./clone_submodule.sh
2. 编译宏介绍
  • 参考编译宏文档 的详细介绍

包含了以下几类配置:

  1. 基础构建选项(建议采用默认配置):如是否构建为共享库、使用的C++标准版本等等

  2. 核心模块选项(建议采用默认配置):更细粒度控制需要编译的文件

  3. 设备后端选项(按需打开,默认全部关闭,不依赖任何设备后端):如CUDA、OpenCL、各种NPU等硬件加速支持

  4. 算子后端选项(按需打开,默认全部关闭,不依赖任何算子后端):如cudnn、onednn、xnnpack、qnnpack

  5. 推理后端选项(按需打开,默认全部关闭,不依赖任何推理后端):如TensorRT、OpenVINO、ONNX Runtime等推理框架支持

  6. 算法插件选项(建议采用默认配置,传统CV类算法打开,语言类和文生图类算法默认关闭):如检测、分割、llm、文生图等算法插件

    • 其中传统CV类算法依赖OpenCV​,例如检测、分割、分类等,需要打开ENABLE_NNDEPLOY_OPENCV​
    • 注意:其中语言类和文生图类模型​依赖C++分词器tokenizer-cpp,所以需要打开ENABLE_NNDEPLOY_PLUGIN_TOKENIZER_CPP​,打开前参考precompile_tokenizer_cpp.md
3. 编译方法

config.cmake是nndeploy的编译配置文件,用于控制项目的编译选项。

相比于原生cmake -D选项,用户配置好的编译选项文件,可保留下来多次使用,在文件上还可以增加注释,方便后续维护。

相比编译脚本,无需为每个平台编写多种类型脚本,也不会遇到脚本环境问题,只需在根目录创建build目录,将config.cmake复制到该目录,然后修改config.cmake文件,即可开始编译。

假设你在根目录下,具体命令行如下:

mkdir build                 # 创建build目录
cp cmake/config.cmake build # 将编译配置模板复制到build目录
cd build                    # 进入build目录
vim config.cmake            # 使用编辑器vscode等工具直接修改config.cmake文件
cmake ..                    # 生成构建文件
make -j                     # 使用8个线程并行编译
4. 主库编译
  • 默认编译产物为:libnndeploy_framework.so
  • 算法插件编译产物为:libnndeploy_plugin_xxx.so
  • 可执行程序编译产物为:nndeploy_demo_xxx

注:xxx代表特定算法插件和特定的可执行程序,例如:nndeploy_plugin_detect.so、nndeploy_demo_detect、nndeploy_demo_dag

5. Windows
  • 环境要求

    • cmake >= 3.12
    • Microsoft Visual Studio >= 2017
  • nndeploy提供的第三方库
    第三方库主版本Windows下载链接备注
    opencv4.8.0下载链接
    OpenVINO2023.0.1下载链接
    ONNXRuntimev1.15.1下载链接
    MNN2.6.2下载链接
    TNNv0.3.0下载链接
    ncnnv0.3.0下载链接

    注:将上述所有库打包为一个压缩包windows_x64.7z,存放在huggingface上,使用前请将压缩包windows_x64.7z解压

  • 具体步骤

    • 在根目录创建build​目录,将cmake/config.cmake​复制到该目录

      mkdir build
      cp cmake/config.cmake build
      cd build
      
    • 开始cmake​

      cmake ..
      
    • 通过visual studio打开build/nndeploy.sln​,开始编译、安装、执行

6. Linux
  • 环境要求

    • cmake >= 3.12
    • gcc >= 5.1
  • nndeploy提供的第三方库
    第三方库主版本Linux下载链接备注
    OpenVINO2023.0.1wget https://huggingface.co/alwaysssss/nndeploy/blob/main/third_party/ubuntu22.04_x64.tar
    ONNXRuntimev1.15.1wget https://huggingface.co/alwaysssss/nndeploy/blob/main/third_party/ubuntu22.04_x64.tar
    MNN2.6.2wget https://huggingface.co/alwaysssss/nndeploy/blob/main/third_party/ubuntu22.04_x64.tar
    TNNv0.3.0wget https://huggingface.co/alwaysssss/nndeploy/blob/main/third_party/ubuntu22.04_x64.tar
    ncnnv0.3.0wget https://huggingface.co/alwaysssss/nndeploy/blob/main/third_party/ubuntu22.04_x64.tar

    注:将上述所有库打包为一个压缩包ubuntu22.04_x64.tar,存放在huggingface上,使用前请将压缩包ubuntu22.04_x64.tar解压

    • 安装opencv

      • ​sudo apt install libopencv-dev​ 参考链接
    • 安装TensorRT cpp sdk 参考链接、cudnn、cuda、GPU driver

  • 具体步骤

    • 在根目录创建build​目录,将cmake/config.cmake​复制到该目录

      mkdir build
      cp cmake/config.cmake build
      cd build
      
    • ​cmake​

      cmake ..
      
    • 编译

      make -j
      
    • 安装, 将nndeploy的库、可执行文件、第三方库安装至build/install/lib

      make install
      
7. Android
  • 环境要求

    • cmake >= 3.12
    • ndk
  • nndeploy提供的第三方库
    第三方库主版本Android下载链接备注
    opencv4.8.0wget https://huggingface.co/alwaysssss/nndeploy/blob/main/third_party/android.tar
    MNN2.6.2wget https://huggingface.co/alwaysssss/nndeploy/blob/main/third_party/android.tar
    TNNv0.3.0wget https://huggingface.co/alwaysssss/nndeploy/blob/main/third_party/android.tar
    ncnnv0.3.0wget https://huggingface.co/alwaysssss/nndeploy/blob/main/third_party/android.tar

    注:将上述所有库打包为一个压缩包android.tar,存放在huggingface上,使用前请将压缩包android.tar解压

  • 具体步骤

    • 在根目录创建build​目录,将cmake/config.cmake​复制到该目录

      mkdir build
      cp cmake/config.cmake build
      cd build
      
    • 开始cmake​,需要指定ndk

      cmake .. -DCMAKE_TOOLCHAIN_FILE=/snap/android-ndk-r25c/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_STL=c++_static -DANDROID_NATIVE_API_LEVEL=android-14 -DANDROID_TOOLCHAIN=clang -DBUILD_FOR_ANDROID_COMMAND=true
      
    • 开始编译

      make -j8
      
    • 开始安装, 将nndeploy相关库可执行文件、第三方库安装至build/install/lib

      make install
      

相关文章:

  • HDU-2973 YAPTCHA
  • 【大模型:知识图谱】--4.neo4j数据库管理(cypher语法1)
  • Delft3D软件介绍及建模原理和步骤;Delft3D数值模拟溶质运移模型建立;地表水环境影响评价报告编写思路
  • Python 开发效率秘籍:PyCharm、VS Code 与 Anaconda 配置与实战全解
  • 深入理解计算机进制:从原理到 C++ 实现
  • Linux操作系统Shell脚本概述与命令实战
  • 【使用JAVA调用deepseek】实现自能回复
  • ffmpeg(三):处理原始数据命令
  • Quipus系统的视频知识库的构建原理及使用
  • 编译一个Mac M系列可以用的yuview
  • JAVA国际版一对一视频交友视频聊天系统源码支持H5+APP
  • Canal
  • L1-019 谁先倒 (15 分)
  • 每日算法 -【Swift 算法】三数之和
  • Fréchet Inception Distance(FID)
  • 自驾总结_Routing
  • Vue全局事件总线
  • Java编程常见错误与最佳实践
  • Numpy——结构化数组和Numpy文件
  • Hadoop企业级高可用与自愈机制源码深度剖析