OnnxRuntime编译

文章讲述了如何将YOLOX模型分为卷积层和后处理两部分,以适应AI芯片的加速特性。针对开发板存储空间小的问题,详细介绍了如何完整编译和精简OnnxRuntime库,包括减少算子种类和数据类型支持,以降低库文件大小。最后,验证了精简后的库文件的可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求分析

​ 算法那边提供的ONNX模型文件是YOLOX,leader想要将模型分为两个部分,卷积层和后处理。因为一般的AI芯片仅对常见的卷积等算子进行加速处理,对后处理中的操作不提供加速。所以前半通过芯片厂商提供的模型转换工具进行加速,后半部分有两种解决方案:1.使用c++手动实现 2.使用OnnxRuntime来执行后半部分

​ 对于方案2存在一个问题是,开发板的存储空间较小,OnnxRuntime库文件体积过大,无法满足需求,需要进行精简编译

1. 完整编译OnnxRuntime

先完整编译一下,熟悉一下OnnxRuntime库的编译流程

1.  git clone --recursive https://github.com/Microsoft/onnxruntime.git
    cd onnxruntime
2. 	git  submodule update --init --force --recursive
// 首先创建一个conda环境,因为./build.sh实际上调用的是./tools/cl_build/build.py
conda create -n onnxruntime python=3.8
pip install flatbuffers
conda activate onnxruntime
3 ./build.sh --skip_tests --config Release --build_shared_lib --parallel

由于onnxruntime依赖很多子项目模块,在CMake配置阶段会进行下载,如果不连外网很容易中断,可以通过给终端挂代理来解决。(注:网上有教程说可以通过修改.git/config文件来解决中断的问题,尝试之后还是经常会断,可能是我没修改对,可参考: https://zhuanlan.zhihu.com/p/411887386)

编译完成后路径为:build/Linux/Release/, 查看libonnxruntime.so.1.16.0文件大小为19.1Mb,通过测试可正常调用。

2. 可精简选项

参考ORT官方文档

官方python脚本

可以看到官方也考虑到针对嵌入式开发的应用场景。

The most common scenario for customizing the ONNX Runtime build is for smaller footprint deployments, such as mobile and web.

有以下几种精简方案:

  1. 减少算子种类:

    主要是根据ONNX文件生成所需的算子,官方提供了对应的python脚本,可以通过

    python create_reduced_build_config.py ./onnx_file_name.onnx
    ./build.sh --skip_tests --config Release --build_shared_lib --parallel --include_ops_by_config ./xxx.config
    
  2. 减少能够支持的数据类型:’

    选择是否支持float32,float16和int8。

  3. 最小构建

    源码中有很多 if !define Minimal_Build 用来较少一些非必要的函数,但是仅支持ORT模型文件,即需要先使用官方提供给python脚本来将ONNX文件转为ORT模型文件

    python ./convert_onnx_models_to_ort.py ./onnx_file_name.onnx --output_dir .
    

    得到四个文件,两两对应

    其中.ort文件用于模型推导,因为最小的编译的onnxruntime仅支持ort模型文件,不再支持onnx文件

    .config文化用于编译过程中选择对应的算子来减下编译文件的体积

    选择其中一个config文件用于编译,就要选择对应的ort文件用于模型推导

  4. 除此之外,还能够添加:

    –skip_tests: 跳过测试文件

    –disable_exceptions:禁止异常

    –disable_ml_ops:禁止ML算子

    –config MinSizeRel:最小编译

	./build.sh --config=MinSizeRel --build_shared_lib --parallel --minimal_build --disable_ml_ops --disable_exceptions --disable_rtti --skip_tests --include_ops_by_config ./XX.with_runtime_opt.config

最终编译的ort库文件大小为1.09Mb

3. 验证

使用官方库和编译后的库,对比结果,确保编译文件正常可用。

### C++ ONNX Runtime 编译教程 #### 准备工作 为了成功编译适用于Windows 10下的ONNX Runtime GPU版本,需准备好必要的开发工具和依赖项。这包括但不限于CUDA、cuDNN以及CMake等软件包[^1]。 对于希望构建支持特定平台(如Android)上的应用开发者来说,在完成整个过程之后可以在`build/Android/Release`路径下获取到名为`libonnxruntime.so`的共享库文件,该文件可以直接被集成至基于NDK或是CMake构建的应用程序当中[^2]。 #### 获取源码并初始化子模块 首先应当克隆官方GitHub仓库,并确保所有必需的子模块也被同步下载下来: ```bash git clone --recursive https://github.com/microsoft/onnxruntime.git cd onnxruntime git submodule update --init --force --recursive ``` 上述命令执行完毕后即完成了源代码及其关联资源的准备工作[^3]。 #### 创建虚拟环境与安装Python依赖 考虑到后续步骤需要用到一些由Python脚本驱动的功能,建议新建一个专门用于此项目的Conda环境来管理相关依赖关系: ```bash conda create -n onnxruntime python=3.8 pip install flatbuffers conda activate onnxruntime ``` 这里选择了Python 3.8作为解释器版本,并额外安装了一个叫做FlatBuffers的第三方库以便于处理某些数据结构化操作。 #### 执行实际编译指令 当一切就绪之后就可以运行正式的编译命令了。下面这条语句将会跳过测试环节仅保留发布模式下的动态链接库产物,同时开启多线程加速编译效率: ```bash ./build.sh --skip_tests --config Release --build_shared_lib --parallel ``` 值得注意的是不同操作系统间可能存在细微差异,因此具体参数设置还需参照官方文档说明进行适当调整。 #### 整合头文件以供使用 一旦顺利完成以上各阶段的工作,则可以着手准备将新生成出来的ONNX Runtime组件融入个人项目之中去了。比如在一个Ubuntu环境下利用VS Code编辑器配合CMakeLists.txt配置文件的方式实现YOLOv8目标检测模型推理功能时,就需要明确指定哪些位置存放着所需引入的接口定义文件: ```cmake include_directories( ${PROJECT_SOURCE_DIR}/path/to/include/ ) add_library(yolov8 include/img_process/yolov8_onnx.h include/img_process/yolov8_utils.h src/yolov8_onnx.cpp src/yolov8_utils.cpp ) ``` 这段CMake片段展示了怎样向工程添加自定义静态或共享库的同时也指定了相应的公共头文件所在之处[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值