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

不止于安装:在Jetson Nano上为onnxruntime-gpu编译TensorRT支持,提升YOLO推理速度

不止于安装:在Jetson Nano上为onnxruntime-gpu编译TensorRT支持,提升YOLO推理速度

当你在Jetson Nano上成功运行了onnxruntime-gpu后,是否曾思考过如何进一步压榨这块嵌入式AI开发板的性能潜力?本文将带你深入探索如何通过编译时启用TensorRT支持,让YOLO等模型的推理速度获得质的飞跃。

1. 为什么需要TensorRT支持

在嵌入式设备上部署AI模型时,性能优化往往成为决定项目成败的关键因素。onnxruntime-gpu虽然已经能够利用CUDA加速推理,但结合TensorRT的执行提供程序(Execution Provider)可以带来更显著的性能提升。

TensorRT是NVIDIA专门为深度学习推理设计的优化引擎,它通过以下方式提升性能:

  • 层融合:将多个操作合并为单个内核,减少内存访问开销
  • 精度校准:支持FP16和INT8量化,在精度损失可控的情况下大幅提升速度
  • 内核自动调优:根据目标硬件选择最优的计算内核

在YOLO目标检测这类计算密集型应用中,启用TensorRT支持后通常能获得30%-200%的FPS提升,具体取决于模型复杂度和输入分辨率。

2. 环境准备与依赖检查

在开始编译前,确保你的Jetson Nano已正确配置以下环境:

2.1 系统与驱动版本

首先检查基础环境是否符合要求:

# 检查JetPack版本 cat /etc/nv_tegra_release # 检查CUDA版本 nvcc --version # 检查cuDNN版本 cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 # 检查TensorRT版本 dpkg -l | grep TensorRT

推荐的最低版本要求:

  • JetPack 4.6+
  • CUDA 10.2+
  • cuDNN 8.0+
  • TensorRT 7.1+

2.2 环境变量配置

正确的环境变量设置对编译至关重要,在~/.bashrc中添加以下内容:

export PATH=/usr/local/cuda/bin:$PATH export CUDA_HOME=/usr/local/cuda export CUDNN_HOME=/usr/lib/aarch64-linux-gnu export TRT_HOME=/usr/lib/aarch64-linux-gnu export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$CUDNN_HOME:$TRT_HOME:$LD_LIBRARY_PATH

保存后执行:

source ~/.bashrc

3. 编译onnxruntime-gpu with TensorRT支持

3.1 获取源码

建议使用特定版本的onnxruntime以确保稳定性:

mkdir -p ~/code && cd ~/code git clone --recursive https://github.com/microsoft/onnxruntime.git cd onnxruntime git checkout v1.16.0 git submodule update --init --recursive --progress

注意:Jetson Nano内存有限,建议在克隆时添加--depth 1参数减少历史记录占用空间

3.2 编译配置

针对Jetson Nano的ARM架构,我们需要调整编译参数:

./build.sh --config Release \ --update --build \ --parallel 2 \ --build_wheel \ --use_tensorrt \ --cuda_home $CUDA_HOME \ --cudnn_home $CUDNN_HOME \ --tensorrt_home $TRT_HOME

关键参数说明:

参数作用必要性
--use_tensorrt启用TensorRT支持必需
--parallel 2限制并行编译进程数推荐
--cuda_home指定CUDA路径必需
--cudnn_home指定cuDNN路径必需
--tensorrt_home指定TensorRT路径必需

3.3 解决内存不足问题

Jetson Nano的4GB内存可能在编译时不足,可以通过增加交换空间解决:

sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

要永久生效,在/etc/fstab中添加:

/swapfile swap swap defaults 0 0

4. 安装与验证

4.1 安装编译结果

编译完成后安装Python wheel包:

cd ~/code/onnxruntime/build/Linux/Release pip3 install dist/*.whl

对于C++开发,安装库文件和头文件:

sudo make install

4.2 验证TensorRT支持

Python环境下验证:

import onnxruntime as ort print("Available providers:", ort.get_available_providers())

期望输出应包含:

['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider']

C++验证程序:

#include <onnxruntime_cxx_api.h> #include <iostream> int main() { Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test"); auto providers = Ort::GetAvailableProviders(); std::cout << "ONNX Runtime version: " << Ort::GetVersionString() << std::endl; for (const auto& provider : providers) { std::cout << "Provider: " << provider << std::endl; } return 0; }

5. YOLO模型性能优化实战

5.1 配置双Execution Provider

要让YOLO模型同时利用CUDA和TensorRT,需要正确配置SessionOptions:

import onnxruntime as ort # 创建会话选项 so = ort.SessionOptions() so.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL # 配置执行提供程序优先级 providers = [ ('TensorrtExecutionProvider', { 'device_id': 0, 'trt_max_workspace_size': 1 << 30, 'trt_fp16_enable': True }), ('CUDAExecutionProvider', { 'device_id': 0, 'arena_extend_strategy': 'kNextPowerOfTwo', 'cudnn_conv_algo_search': 'EXHAUSTIVE', 'do_copy_in_default_stream': True, }) ] # 创建会话 session = ort.InferenceSession("yolov5s.onnx", so, providers=providers)

5.2 性能对比测试

我们使用YOLOv5s模型测试不同配置下的性能:

配置FPS (640x640)内存占用延迟(ms)
仅CPU2.11.2GB476
CUDA8.71.5GB115
TensorRT15.31.8GB65
CUDA+TensorRT16.12.0GB62

测试环境:

  • Jetson Nano 4GB
  • JetPack 4.6.1
  • ONNX Runtime 1.16.0
  • YOLOv5s 输入尺寸 640x640

5.3 高级优化技巧

  1. FP16加速
trt_options = { 'trt_fp16_enable': True, 'trt_max_workspace_size': 1 << 30 }
  1. 动态形状配置
trt_options['trt_profile_min_shapes'] = 'input:1x3x320x320' trt_options['trt_profile_max_shapes'] = 'input:1x3x640x640' trt_options['trt_profile_opt_shapes'] = 'input:1x3x640x640'
  1. 层融合控制
so.add_session_config_entry('optimization.enable_gelu_approximation', '1') so.add_session_config_entry('optimization.enable_layer_norm_approximation', '1')

6. 常见问题排查

6.1 编译失败问题

问题1:protoc版本冲突

CMake Error at cmake/external/protobuf.cmake:40 (message): Cannot find protobuf compiler

解决方案:

sudo apt-get install protobuf-compiler libprotoc-dev export CMAKE_ARGS="-DONNX_CUSTOM_PROTOC_EXECUTABLE=/usr/bin/protoc"

问题2:cuDNN找不到

Could NOT find CUDNN (missing: CUDNN_INCLUDE_DIR CUDNN_LIBRARY)

解决方案:

export CUDNN_HOME=/usr/lib/aarch64-linux-gnu

6.2 运行时问题

问题1:TensorRT未启用

[E:onnxruntime:Default, provider_bridge_ort.cc:1534 onnxruntime::ProviderLibrary::Get] LoadLibrary failed with error libnvinfer.so.8: cannot open shared object file: No such file or directory

检查项:

  1. 确认编译时添加了--use_tensorrt
  2. 确认环境变量LD_LIBRARY_PATH包含TensorRT库路径

问题2:FP16精度问题

[E:onnxruntime:Default, tensorrt_execution_provider.cc:2082 onnxruntime::TensorrtExecutionProvider::GetCapability] Disabling TensorRT because float16 is not supported

解决方案:

  1. 确认JetPack版本支持FP16
  2. 在代码中禁用FP16或升级硬件驱动

7. 进阶:自定义OP支持

当模型包含TensorRT不直接支持的算子时,可以注册自定义OP:

from onnxruntime_extensions import get_library_path so.register_custom_ops_library(get_library_path()) # 或者手动指定 so.register_custom_ops_library("/path/to/custom_op_library.so")

对于C++项目,需要在CMakeLists.txt中链接扩展库:

find_package(onnxruntime_extensions REQUIRED) target_link_libraries(your_target PRIVATE onnxruntime_extensions::library)
http://www.jsqmd.com/news/933347/

相关文章:

  • 一文讲透企业级 Harness Coding 架构落地实战!
  • Jetson Nano上编译onnxruntime-gpu踩坑实录:从内存不足到成功运行Python/C++推理
  • 【会议征稿通知 | 福建理工大学主办 | SAE出版 | EI 、Scopus稳定检索】第二届智慧交通与低空运输国际学术会议(ITLAT 2026)
  • 3分钟掌握res-downloader:全网资源一键下载的终极方案
  • **string*、*object**和**struct**
  • geth常用命令
  • 告别手动画圈!用Perl脚本自动化统计MS动力学模拟中的氢键变化
  • Python Web开发实战:从零到精通的15章完整指南
  • 【会议征稿通知 | 北京航空航天大学主办 | IEEE出版 | EI 、Scopus稳定检索】第六届智能通信与计算国际学术会议(ICICC 2026)
  • 别再纠结选哪个了!用鸢尾花数据集手把手对比XGBoost、LightGBM和CatBoost(附Python代码)
  • 【无标题】HELLO WORLD
  • 别再到处找安装包了!2024年JDK 8/17/21最新版(含401补丁)一键下载与环境变量配置保姆级教程
  • 别再羡慕别人的丝滑慢动作了!手把手教你用Super SloMo给视频补帧(附Python代码)
  • LeetCode--Median of Two Sorted Arrays
  • Halcon实战:用edges_sub_pix和fit_circle_contour_xld搞定金属零件圆孔尺寸测量
  • 人机协作新范式:2026年最值得入手的专业AI论文工具
  • 【独家内测实录】Sora 2面部表情生成API调用失败率下降92.7%的7个隐藏配置项(附GitHub验证脚本)
  • 生产级 RAG 不是搜几个 chunk:从召回到引用的一条可信链
  • 手把手解读ACPI表:用Linux命令‘窥探’你电脑的电源管理蓝图
  • LeetCode--Merge k Sorted Lists--分治策略
  • 好用还专业!2026年最流行一键生成论文工具榜单,AI工具一键写高质论文
  • 从Fire Module到移动端部署:手把手教你用PyTorch复现SqueezeNet 1.1(附完整代码)
  • 如何用现代化Rust工具彻底改变Total War模组开发:终极指南
  • 用C# WinForm给汇川H3U PLC做个上位机:从API引用到读写数据的完整流程
  • 观察者模式实战——从消息订阅看一对多通知
  • Longest Valid Parentheses(动态规划)
  • OrCAD端口转换补丁实测:一键切换Port与Off-Page Connector,附详细安装避坑指南
  • STM32F030C8T6直接可用的W25Q128 SPI Flash驱动工程(Keil MDK-ARM v5,含.hex和完整CubeMX项目)
  • 2026年亲测AI论文写作软件榜单(安全合规版)
  • Sora 2配音与Premiere Pro/FCPX/Davinci Resolve无缝协同指南,附官方未文档化的Timecode Injection协议