公众号致力于点云处理,SLAM,三维视觉,高精地图等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl@163.com。
推理框架现状和痛点
现在业界尚不存在各方面都远超其同类产品的推理框架,不同推理引擎在不同平台,硬件和模式下分别具有各自的优势,比如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
// 检测模型的有向无环图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,算能之类的推理软件栈。
欢迎大家持续关注,一起助力技术的飞速发展,创造更多惊喜和创新!
开源地址:https://github.com/Alwaysssssss/nndeploy
社区文档: https://zhuanlan.zhihu.com/p/656359928
如何新增一个推理框架:https://blog.csdn.net/echoesssss/article/details/132674100
资源
自动驾驶及定位相关分享
【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法
自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)
更多文章可查看:点云学习历史文章大汇总
SLAM及AR相关分享
结构化PLP-SLAM:单目、RGB-D和双目相机使用点线面的高效稀疏建图与定位方案
以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除
扫描二维码
关注我们
让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入知识星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。
分享与合作方式:微信“cloudpoint9527”(备注:姓名+学校/公司+研究方向) 联系邮箱:dianyunpcl@163.com。
点一下“在看”你会更好看耶