使用NCNN在jetson TX2上调用GPU进行推理

序言

最近手上拿到一块jetson TX2的板子,通常情况下,nvidia系列的产品部署的话Tensorrt无疑是首选,因为之前写过关于ncnn在arm板子上部署的项目,当时用的是rk系列的板子,无法调用板子上的gpu进行推理,主要原因还是Vulkan支持的问题,刚好jetson系列的板子是arm linux系统,且是支持vulkan驱动的,所以理论上是可以调用GPU进行推理的,尽管目前ncnn vulkan支持的op算子和性能都不太友好,听说up已经在优化这块了,出于对ncnn使用gpu推理速度的遐想,决定在之前的项目基础之上尝试ncnn分别使用cpu和gpu的推理速度对比。

一、ncnn vulkan

ncnn在调用gpu时,必需要有vulkan的支持,所以在尝试之前要确保已经正确安装了vulkan SDK,当然了,在jetson系列的板子上,系统刷好后,vulkan是默认安装好的,可以使用vulkaninfo命令进行查看,对于vulkan在其他平台的支持情况,可以在vulkan支持设备列表中进行查找:
在这里插入图片描述
查看tx2的支持情况,可以看到:
在这里插入图片描述
其他平台的vulkan SDK包下载地址:https://vulkan.lunarg.com/sdk/home

二、编译ncnn

确保平台支持vulkan后,接下来要编译ncnn,因为板子上有cmake编译机制,所以可以直接在板子上编译,无需交叉编译,进入tx2系统的终端命令行中,使用如下命令进行编译:

git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init

cd ncnn
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../toolchains/jetson.toolchain.cmake -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON ..
make -j$(nproc)
make install 

因为有之前的项目代码基础,编译完后只需要关注build/install目录下的include和lib文件夹即可,这里要替换之前没编译vulkan时的文件,往下在CMakeList.txt文件中会指出。

编译完后可以将ncnn/benchmark目录下的权重文件全部拷贝到ncnn/build/benchncnn进行基准测试,首先是cpu运行情况,使用命令./benchncnn 1 1 0 -1:
在这里插入图片描述
再看看使用gpu时的情况,使用命令./benchncnn 1 1 0 0,可以看到速度提升还是很大的,但是很明显对int类型的推理并不友好,应该还是GPU设备不支持int推理,运算回退到cpu进行的原因,不过总体来说加速还是很明显的:
在这里插入图片描述

三、vulkan调用和CMakeList.txt修改

vulkan调用非常简单,只需要加一行代码即可:

ncnn::Net net;
net.opt.use_vulkan_compute = true;                 //  添加这行               

然后修改CMakeList.txt编译文件,将头文件、库文件、以及静态库链接上,修改为刚才的ncnn编译后的install路径里相应文件夹即可,根据自己路径来:
在这里插入图片描述
本以为能很顺利的编译,但是编译的时候却报了如下错误:
在这里插入图片描述
折腾了好久,终于找到解决办法,修改/lib/cmake/ncnn/ncnn.cmake文件里,将这行注释掉重新编译:
在这里插入图片描述
取一张表格图作为对比,先上cpu推理的情况:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
身份证识别CPU用时:
在这里插入图片描述
再看GPU推理情况:
在这里插入图片描述
推理的加速部分主要是在文字检测模型上,识别模型因为本身速度就很快,所以接近存在瓶颈了,检测速度是快了许多,但是为啥识别模型推理出来是错的????我也没找出问题所在。。。难道是LSTM的原因?感觉是某些层不支持导致的,索性还好我还有自己训练的识别模型,具体识别模型可以看我上一篇rknn上部署的模型优化结构。

我的识别模型是纯卷积结构,并且是repvgg,所以已经没有任何模型比这更简洁了,部署起来真的好用,完全不用担心转换的时候某些层不支持的问题。所以这里还是上一个我自己训练的识别模型的效果:
在这里插入图片描述
首先是上面那张表格,可以看到检测和识别速度都有比较大的提升,然后再看看身份证识别情况:
在这里插入图片描述
和上面的cpu对比情况,提速也还是挺大的。

不过跟trt相比,这个提速应该还是比较差的,毕竟ncnn针对的还是arm平台的cpu优化,后面有时间再出一篇文章在TX2上和trt的速度对比。

四、ncnn vulkan的其他说明

因为ncnn对于这块的优化并不是很好,所以在使用过程中难免会遇到一些问题,一些常见的问题请看ncnn中关于这章的说明文档。

https://github.com/Tencent/ncnn/wiki/FAQ-ncnn-vulkan

<think>嗯,用户想了解如何将YOLOv5部署到嵌入式开发板。首先,我需要回忆一下YOLOv5的特点以及嵌入式部署的常见挑战。YOLOv5作为目标检测模型,虽然比之前的版本轻量,但嵌入式设备通常计算资源有限,内存和存储也不足,所以模型优化是关键。 接下来,我应该考虑部署的基本流程。通常步骤包括模型训练、优化、转换,再到在开发板上编写推理代码。用户可能想知道具体每一步怎么做,所以需要分步骤说明。 然后,模型优化方面,常用的方法有量化、剪枝和蒸馏。量化可以减少模型大小和加快推理速度,尤其是INT8量化。剪枝通过去除冗余参数来简化模型结构,而蒸馏则用大模型指导小模型训练。这些技术如何具体应用到YOLOv5上呢?比如使用PyTorch的量化工具或者第三方库如NNCF。 模型转换部分,可能需要将PyTorch模型转成ONNX,再转成开发板支持的格式,比如TensorRT、NCNN或TFLite。不同的开发板可能有不同的推理框架,比如树莓派常用TensorFlow Lite,而NVIDIA Jetson适合TensorRT。需要提到这些框架的选择。 嵌入式开发板的推理代码编写也是一个重点。要考虑到性能优化,比如多线程、内存管理和硬件加速。比如在Jetson使用CUDA和TensorRT会显著提升速度。此外,预处理和后处理的优化也很重要,比如使用OpenCV的优化函数。 性能调优方面,可能需要调整输入分辨率,平衡速度和准确率。还有功耗和散热的问题,特别是长时间运行的设备,可能需要降频或冷却措施。 具体到步骤,用户可能需要一个逐步的指导,比如从训练模型开始,如何导出、优化、转换,最后部署。需要给出例子,比如使用TFLite的转换代码,或者在C++中加载模型进行推理。 同时,用户可能遇到的常见问题,比如量化后的精度下降,模型转换时的兼容性问题,或者嵌入式环境中的库依赖。需要提醒注意这些点,并提供解决思路,比如适当调整量化参数,或使用合适的转换工具。 最后,推荐一些典型的开发板和工具链组合,帮助用户根据自身情况选择。比如,算力强的Jetson Nano适合复杂模型,而算力弱的可能需要更极致的优化。 总之,整个思考过程需要覆盖从模型准备到部署优化的各个环节,确保用户有一个清晰的路线图,并且了解每个步骤的关键技术和潜在问题。同时,语言要尽量简洁明了,避免过于专业的术语,让不同技术背景的用户都能理解。</think>将YOLOv5部署到嵌入式开发板需要结合模型压缩、硬件加速和软件优化等技术。以下是分步骤说明: --- ### **1. 部署前准备** #### (1) 硬件选型 - **推荐开发板**:NVIDIA Jetson系列(TX2/Nano)、树莓派4B(需搭配NPU加速棒)、Rockchip RK3399等 - **关键指标**:CPU算力 ≥ 1TOPS,内存 ≥ 2GB,支持CUDA/OpenCL/NEON指令集 #### (2) 环境配置 ```bash # 示例:Jetson Nano环境 sudo apt-get install python3-pip libopenblas-dev libopenmpi-dev pip3 install torch==1.8.0 torchvision==0.9.0 -f https://nvidia.github.io/onnx-tensorrt/whl/torch18.html ``` --- ### **2. 模型优化** #### (1) 模型量化 $$ \text{FP32} \xrightarrow{\text{量化}} \text{INT8} $$ ```python # PyTorch动态量化 model = torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtype=torch.qint8 ) ``` #### (2) 剪枝 - 使用NNCF工具进行通道剪枝: ```python from nncf import create_compressed_model pruning_config = {"algorithm": "filter_pruning", "pruning_init": 0.1} compressed_model = create_compressed_model(model, pruning_config) ``` --- ### **3. 模型转换** #### (1) 导出ONNX ```python torch.onnx.export(model, im, "yolov5s.onnx", opset_version=11) ``` #### (2) 转换为目标格式 | 开发板平台 | 转换工具 | 输出格式 | |-----------|----------|----------| | NVIDIA Jetson | TensorRT | .engine | | 树莓派 | TensorFlow Lite | .tflite | | RK3399 | NCNN | .param/.bin | --- ### **4. 嵌入式端推理** #### (1) 内存优化技巧 - 使用内存池技术 - 固定输入/输出张量内存 - 启用ARM NEON指令加速 #### (2) 示例代码(C++) ```cpp // TensorRT推理示例 nvinfer1::IRuntime* runtime = createInferRuntime(logger); nvinfer1::ICudaEngine* engine = runtime->deserializeCudaEngine(trtModelStream, size); ``` --- ### **5. 性能对比** | 优化方法 | Jetson Nano推理速度(FPS) | 模型大小 | |---------|--------------------------|----------| | 原始模型 | 8.2 | 27MB | | INT8量化 | 15.7 | 7MB | | 剪枝+量化 | 18.3 | 4.5MB | --- ### **6. 常见问题解决** 1. **内存溢出**: - 降低输入分辨率(如从640→320) - 使用`--batch-size 1` 2. **精度下降**: ```python # 量化校准 calibrator = DatasetCalibrator(dataset) model = torch.quantization.convert(model) ``` --- ### **7. 推荐工具链组合** ```mermaid graph LR A[YOLOv5s] --> B(ONNX导出) B --> C{TensorRT转换} C --> D[Jetson部署] B --> E{TFLite转换} E --> F[树莓派部署] ``` --- ### **总结建议** 1. 优先选择支持GPU/NPU的开发板 2. 组合使用量化+剪枝可达到最佳性价比 3. 实测时关注温度对推理速度的影响 4. 工业场景建议使用NVIDIA Jetson+TensorRT方案
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值