Jetson Xavier NX 下 yolov8 tensorrt模型部署(Jetpack5.1.2、CUDA11.4、Cudnn8.6.0、Tensorrt8.5.2)


前言

Jetson Xavier NX 下 yolov8 tensorrt模型部署流程记录及问题处理,本文使用的是TensorRT-Alpha封装库,基于tensorrt+cuda,实现模型的gpu加速。

Jetson Xavier NX 环境配置

Jetpack5.1.2、CUDA11.4、Tensorrt8.5.2、OpenCV 4.5.4、Ubuntu 20.04

一、TensorRT-Alpha源码下载

1. 源码下载

TensorRT-Alpha的代码可以直接从github官网上下载,源码下载地址是https://github.com/FeiYull/TensorRT-Alpha。Linux下代码克隆指令如下

$ git clone https://github.com/FeiYull/tensorrt-alpha

2.文件设置

$ cd tensorrt-alpha/cmake
$ vim common.cmake

将文件中的第20行的tensorrt路径更换成自己开发板中的路径,一般默认路径为:/usr/src/tensorrt
路径设置如下:

set (TensorRT_ROOT /usr/src/tensorrt)

二、yolov8模型部署

1.导出yolov8 onnx模型

在服务器或者主机上将自己训练好的权重best.pt或者下载的官方预训练权重放在ultralytics-main主目录下,进入训练yolov8的conda 环境中。
(如果已安装1.12.0及以上版本的onnx和0.4.8及以上版本的onnx-simplifier,请略过下面的安装)

$ pip install onnx==1.12.0
$ onnx-simplifier==0.4.8

之后导出模型。yolov8官方代码中包含模型导出命令,所以使用以下命令即可导出模型

$ yolo export model=best.pt format=onnx opset=12 dynamic=True simplify=True int8=True 
# opset=12 默认值
# dynamic=True 导出维度为dynamic,也就是不确定状态,如不需要,可设为False
# simplify=True 简化模型,建议设为True,开发板性能有限,简化模型很有必要,且能避免后续一些报错发生
# int8=True INT8量化模型,根据需要开启

2.使用tensorrt转换onnx文件为trt文件

#将上一步导出的onnx文件放在刚才在开发板上git的tensorrt-alpha/data/yolov8文件夹下

$ cd /tensorrt-alpha/data/yolov8

#声明使用到的tensorrt路径
#(可能不声明也能用,因为我是在Linux服务器上先尝试部署过的,但开发板上没有lib文件夹)
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/src/tensorrt/lib 

$ /usr/src/tensorrt/bin/trtexec   --onnx=best.onnx  --saveEngine=best.trt  --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640

由于开发板性能有限,可能会出现以下警告信息,但最后还是会得到trt文件
在这里插入图片描述

3.源码修改

如果使用官方权重部署,请跳过这一步

这一步也可以在主机上修改完成后,替换开发板中的对应文件

$ cd tensorrt-alpha/yolov8
$ vim app_yolov8.cpp
#修改第6行的类别名,改成自己训练集的类别名,例如:
initParameters.class_names = utils::dataSets::mask2;
#修改第8行的类别数,改成自己训练集的类别数,例如:
initParameters.num_class = 2;

#修改用到的头文件及函数
$ cd tensorrt-alpha/untils
$ vim untils.h

#修改untils.h文件中的第37行,换成自己的类别,如:
const std::vector<std::string> mask2 = {"non-mask", "mask"};
#在untils.h文件的第80行之后,添加自己的类别颜色,如:
const std::vector<cv::Scalar> color2{
            cv::Scalar(148, 80, 189),cv::Scalar(105, 52, 238)
        };

#修改untils.cpp文件  
$ vim untils.cpp

#修改untils.cpp文件中的show函数,在第144行后添加自己类别对应的代码,如:
if (classNames.size() == 2) // mask2
{
	color = Colors::color2[box.label];
}
#修改untils.cpp文件中的save函数,在第198行后添加自己类别对应的代码,如:
if (classNames.size() == 2) // mask2
{
	color = Colors::color2[box.label];
}

至此源码修改完毕,可以进行编译

4.编译

$ cd tensorrt-alpha/yolov8
$ mkdir build
$ cd build
$ cmake ..
$ make -j10

cmke后如果报错,可能是找不到cuda文件,可以先进行一下声明后,再进行编译

$ export PATH=/usr/local/cuda-11.4/bin/:$PATH

执行 make -j10 命令后可能会出现以下错误

/usr/bin/ld: libyolov8.so: undefined reference to `sample::splitToStringVec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/app_yolov8.dir/build.make:161:app_yolov8] 错误 1
make[1]: *** [CMakeFiles/Makefile2:78:CMakeFiles/app_yolov8.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2

这是由于tensorrt版本过高导致,tensorrt8.4版本可能不会出现以上错误。
我板子上使用的是tensorrt8.5.2,这个版本tensorrt下的sampleOptions.cpp文件中未定义splitToStringVec函数会出现以上错误。所以需要进行以下修改
首先进入到/usr/src/tensorrt/samples/common文件夹下,打开终端,执行如下命令

$ sudo vim sampleUtils.h

在第77行可以看到关于splitToStringVec函数的一个声明,但并未定义,所以将它注释掉,如下所示:

// std::vector<std::string> splitToStringVec(std::string const& option, char separator);

之后保存退出(Esc + shift: + wq),打开sampleOptions.cpp文件,将splitToStringVec函数的定义添加在这

$ sudo vim sampleOptions.cpp

#在文件的38行,也就是namespace中添加如下代码

std::vector<std::string> splitToStringVec(const std::string& option, char separator)
{
    std::vector<std::string> options;

    for (size_t start = 0; start < option.length();)
    {
        size_t separatorIndex = option.find(separator, start);
        if (separatorIndex == std::string::npos)
        {
            separatorIndex = option.length();
        }
        options.emplace_back(option.substr(start, separatorIndex - start));
        start = separatorIndex + 1;
    }

    return options;
}

之后保存退出,在tensorrt-alpha/yolov8/build文件下再一次执行make -j10命令,即可编译成功

5.运行

继续上一步,直接在终端执行如下指令即可

$ ./app_yolov8  --model=../../data/yolov8/best.trt --size=640 --batch_size=1  --img=../../data/bus.jpg   --show

$ ./app_yolov8  --model=../../data/yolov8/best.trt --size=640 --batch_size=1  --video=../../data/test.avi   --show  --savePath=../

其他运行指令在TensorRT-Alpha仓库上都有

总结

本篇博客介绍了关于自己训练的yolov8模型在Jetson Xavier NX嵌入式开发板上的部署工作,并记录了部署过程中自己遇到的问题,感谢各位看到最后。

参考

yolov8
TensorRT-Alpha
linux下 yolov8 tensorrt模型部署

<think>好的,用户想在Jetson平台上使用TensorRT-LLM 0.12.0部署Qwen2.5-VL-7B-Instruct模型。首先,我需要考虑Jetson平台的硬件和软件环境。Jetson设备通常运行JetPack系统,所以需要确认支持的JetPack版本和对应的CUDAcuDNNTensorRT版本是否与TensorRT-LLM 0.12.0兼容。 接下来,用户可能需要安装必要的依赖项,比如Python环境、PyTorch、TensorRT等。TensorRT-LLM本身可能需要从源码编译,所以需要指导用户如何克隆仓库、配置环境,并处理可能的依赖问题。 然后,模型转换是关键步骤。Qwen2.5-VL-7B-Instruct作为多模态模型,可能需要特定的转换工具或脚本将原始模型转换为TensorRT支持的格式。这里需要参考TensorRT-LLM的文档,看看是否有现成的示例或是否需要自定义转换流程。 部署时,推理脚本的编写也很重要,包括加载模型、处理输入输出数据,尤其是视觉和语言的多模态输入。需要确保TensorRT引擎正确初始化和运行,并且处理性能优化,比如使用FP16或INT8量化来加速推理。 可能遇到的问题包括环境配置错误、依赖版本冲突、模型转换中的不兼容性,以及推理时的性能问题。需要提供调试建议,比如查看日志、验证各步骤的输出是否正确。 最后,用户可能需要实际应用中的示例,比如如何调用部署好的模型进行推理,处理图像和文本输入,并获取结果。同时,优化技巧和常见问题解答也是必要的,帮助用户顺利部署和应用模型。</think>在Jetson平台上使用TensorRT-LLM 0.12.0部署Qwen2.5-VL-7B-Instruct模型,需按以下步骤操作: ### 一、环境准备 1. **硬件要求** Jetson AGX Xavier/NX(推荐32GB内存)需确保JetPack版本≥5.1.2,对应组件版本: - CUDA 11.4 - cuDNN 8.6.0 - TensorRT 8.5.2+ 验证命令: ```bash nvcc --version # 查看CUDA版本 dpkg -l | grep TensorRT # 查看TensorRT版本 ``` 2. **依赖安装** ```bash sudo apt-get install python3-pip libopenblas-dev libpython3-dev pip3 install torch>=2.0.0 numpy transformers==4.37.0 ``` ### 二、TensorRT-LLM编译安装 1. **源码编译** ```bash git clone https://github.com/NVIDIA/TensorRT-LLM.git --branch v0.12.0 cd TensorRT-LLM && mkdir build && cd build cmake .. -DTRTLLM_PLATFORM=Jetson -DTRTLLM_ARCH=arm64 make -j$(nproc) ``` 2. **Python包安装** ```bash pip3 install tensorrt_llm-0.12.0-cp38-none-linux_aarch64.whl ``` ### 三、模型转换与部署 1. **模型下载与预处理** ```bash from transformers import AutoModel model = AutoModel.from_pretrained("Qwen/Qwen2.5-VL-7B-Instruct", trust_remote_code=True) model.save_pretrained("./qwen2.5_vl_7b_instruct") ``` 2. **TensorRT引擎构建** 使用转换脚本生成TRT引擎: ```bash python3 tensorrt_llm/build.py --model_dir ./qwen2.5_vl_7b_instruct \ --output_dir ./trt_engines \ --dtype float16 \ --use_gpt_attention_plugin \ --use_gemm_plugin ``` 3. **多模态输入处理** 需自定义视觉编码器预处理(参考官方示例): ```python from tensorrt_llm.runtime import ModelRunner runner = ModelRunner.from_dir("./trt_engines") image_input = preprocess_image("input.jpg") # 自定义图像处理函数 text_input = "Describe this image" outputs = runner.generate({"image": image_input, "text": text_input}) ``` ### 四、性能优化技巧 1. **量化加速** 使用INT8量化(需校准数据集): ```bash python3 tensorrt_llm/build.py --quant_mode int8 \ --calib_dataset ./calib_data ``` 2. **内存优化** 调整Jetson交换空间: ```bash sudo fallocate -l 16G /swapfile && sudo chmod 600 /swapfile sudo mkswap /swapfile && sudo swapon /swapfile ``` ### 五、验证部署结果 ```python import tensorrt_llm runtime = tensorrt_llm.runtime.GenerationSession("./trt_engines") inputs = {"prompt": "<image>input.jpg</image> What objects are visible?"} outputs = runtime.generate(inputs, max_new_tokens=50) print(outputs) ``` ### 常见问题 1. **CUDA内存不足** 降低`max_batch_size`或启用`--use_memory_pool`参数[^1] 2. **插件加载失败** 检查`/usr/lib/python3.8/dist-packages/tensorrt_llm/plugins`路径是否包含编译生成的插件库 ---
评论 77
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值