nndeploy是一个简单易用、高性能、支持多端的AI推理部署框架。
主要解决以下模型部署中的痛点:
- 推理框架的碎片化:现在业界尚不存在各方面都远超其同类产品的推理框架,不同推理框架在不同平台、硬件下分别具有各自的优势。例如,在NVidia显卡上TensorRT性能最佳,在x86 CPU上OpenVINO最优,在苹果生态下CoreML最佳,在ARM Android有ncnn、MNN等多种选择。
- 多个推理框架的学习成本、开发成本、维护成本:不同的推理框架有不一样的推理接口、超参数配置、Tensor等等,假如一个模型需要多端部署,针对不同推理框架都需要写一套代码,这对模型部署工程师而言,将带来较大学习成本、开发成本、维护成本。
- 模型的多样性:从模型部署的角度出发,可以分为单输入、多输入、单输出、多输出、静态形状输入、动态形状输入、静态形状输出、动态形状输出一系列不同。当这些差异点与内存零拷贝优化结合时,通常只有具备丰富模型部署经验的工程师才能快速找到最优解。
- 模型高性能的前后处理:模型部署不仅仅只有模型推理,还有前处理、后处理,推理框架往往只提供模型推理的功能。通常需要部署工程师基于对原始算法的理解,通过C++开发该算法前后处理,这需要大量重复工作。
- 多模型的复杂场景:目前很多场景需要由多个模型组合解决业务问题,没有部署框架的支持,会有大量业务代码、模型耦合度高、灵活性差、代码不适合并行等问题。
主要功能
1. 简单易用
- 基于有向无环图部署模型: 将AI算法部署抽象为有向无环图,前处理、推理、后处理各为一个节点
- 推理模板Infer: 模板可处理各种模型差异,包括单/多输入输出和静态/动态形状等等
- 高效解决多模型组合场景:支持
图中嵌入图
功能,将复杂任务拆分为多个独立子图,通过组合方式快速解决多模型场景问题 - 快速构建demo:支持多种输入输出格式(图片、文件夹、视频等),通过编解码节点化实现高效通用的demo构建
2. 高性能
- 多种并行模式:支持串行(按拓扑排序依次执行节点)、流水线并行(多帧场景下将不同节点绑定到不同线程和设备)、任务并行(多模型场景下挖掘并行性缩短运行时间)以及上述组合并行模式。
- 线程池与内存池:通过线程池提高并发性能和资源利用率,支持CPU算子自动并行(parallel_for)提升执行效率;内存池实现高效的内存分配与释放(开发中)
- 一组高性能的算子:完成后将加速您模型前后处理速度(开发中)
3. 支持多种推理后端
- 一套代码多种推理后端部署:通过切换推理配置,实现一套代码即可完成模型跨多个平台以及多个推理框架部署,性能与原始框架一致
- 当前支持的推理框架如下:
Inference/OS | Linux | Windows | Android | MacOS | IOS | developer |
---|---|---|---|---|---|---|
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. 编译宏介绍
- 参考编译宏文档 的详细介绍
包含了以下几类配置:
-
基础构建选项(建议采用默认配置):如是否构建为共享库、使用的C++标准版本等等
-
核心模块选项(建议采用默认配置):更细粒度控制需要编译的文件
-
设备后端选项(按需打开,默认全部关闭,不依赖任何设备后端):如CUDA、OpenCL、各种NPU等硬件加速支持
-
算子后端选项(按需打开,默认全部关闭,不依赖任何算子后端):如cudnn、onednn、xnnpack、qnnpack
-
推理后端选项(按需打开,默认全部关闭,不依赖任何推理后端):如TensorRT、OpenVINO、ONNX Runtime等推理框架支持
-
算法插件选项(建议采用默认配置,传统CV类算法打开,语言类和文生图类算法默认关闭):如检测、分割、llm、文生图等算法插件
- 其中传统CV类算法依赖
OpenCV
,例如检测、分割、分类等,需要打开ENABLE_NNDEPLOY_OPENCV
- 注意:其中
语言类和文生图类模型
依赖C++分词器tokenizer-cpp,所以需要打开ENABLE_NNDEPLOY_PLUGIN_TOKENIZER_CPP
,打开前参考precompile_tokenizer_cpp.md
- 其中传统CV类算法依赖
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下载链接 备注 opencv 4.8.0 下载链接 OpenVINO 2023.0.1 下载链接 ONNXRuntime v1.15.1 下载链接 MNN 2.6.2 下载链接 TNN v0.3.0 下载链接 ncnn v0.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提供的第三方库 | | | |
注:将上述所有库打包为一个压缩包ubuntu22.04_x64.tar,存放在huggingface上,使用前请将压缩包ubuntu22.04_x64.tar解压
-
具体步骤
-
在根目录创建
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.tar,存放在huggingface上,使用前请将压缩包android.tar解压
-
具体步骤
-
在根目录创建
build
目录,将cmake/config.cmake
复制到该目录mkdir build cp cmake/config.cmake build cd build
-
开始
cmake
,需要指定ndkcmake .. -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
-