最近由于业务需求,接触到了Jetson边缘AI计算主板,博主使用的是Jetson Orin NX 16GB这个版本,可以看到其算力达到了100TOPS,这是一个非常恐怖的算力了,接下来便是博主对其的环境配置过程,博主要在该主板上运行一个旋转检测模型,过程如下:

在这里插入图片描述
Jetson使用的是Arm架构,所以在配置时会存在差异
在使用Jetson系列设备时,为了实时查看CPUGPU,我们首先应该安装Jtop软件

1. 安装Jtop监测软件

1.1 安装 pip3

因为我们需要使用pip3来安装jtop,所以需要在系统中先安装pip3

sudo apt install python3-pip

在这里插入图片描述

1.2 安装 jtop

sudo -H pip3 install -U jetson-stats

在这里插入图片描述

随后直接输入jtop即可:

在这里插入图片描述

随后我们点击INFO,查看系统信息:
可用看到,此时CUDAcuDNN都是没有的,OpenCV也是不支持CUDA加速的。

在这里插入图片描述

那么,我们接下来该怎么做呢,难道要像WindowUbuntu下那样安装CUDAcudNN吗,不不不,Jetson为方便开发者,提供了 Jetpack开发套件,其帮了我们大忙

2. 安装JETPACK套件

为啥安装 Jetpack,那就是 JetpackNvidiaJetson系列开发板开发的一款软件开发包,常用的开发工具基本都包括了,并在在安装 Jetpack的时候,会自动安装匹配版本的CUDAcuDNNTensorRT等。

在这里插入图片描述

我们耐心等待即可,安装完成后,再次调用 JTop 查看,此时我们看到CUDAcuDNN已经装好了,接下来便是对其进行配置,并重新编译OpenCV,使其能够支持CUDA加速

在这里插入图片描述
目前,我们只是安装了CUDA和cuDNN,接下来我们需要对其进行配置

3. CUDA与cuDNN配置

cuDNN 默认安装路径在 /usr/lib/aarch64-linux-gnu
CUDA 默认安装路径在 /usr/local/cuda

3.1 CUDA配置

配置Cuda环境变量:
CUDA 已经默认安装在了/usr/local/cuda下,运行如下指令:

sudo vim ~/.bashrc		# 打开~/.bashrc#在文本末输入如下代码:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cudasource ~/.bashrc	#保存环境变量

在这里插入图片描述

我们使用nvcc-V查看一下CUDA配置:

在这里插入图片描述

3.2 cuDNN配置

虽然安装了cuDNN,但没有将对应的头文件、库文件放到cuda目录。

cuDNN的头文件在:/usr/include,库文件位于:/usr/lib/aarch64-linux-gnu。将头文件与库文件复制到cuda目录下:

# 复制文件到cuda目录下
cd /usr/include && sudo cp cudnn* /usr/local/cuda/include
cd /usr/lib/aarch64-linux-gnu && sudo cp libcudnn* /usr/local/cuda/lib64

在这里插入图片描述

随后创建软链接,这个步骤不能少,否则在OpenCV 编译时会报错,因为其找不到cuDNN

# 修改文件权限,修改复制完的头文件与库文件的权限,所有用户都可读,可写,可执行:
sudo chmod 777 /usr/local/cuda/include/cudnn.h 
sudo chmod 777 /usr/local/cuda/lib64/libcudnn*# 重新软链接,这里的9.3.0和9对应安装的cudnn版本号和首数字
cd /usr/local/cuda/lib64sudo ln -sf libcudnn.so.9.3.0 libcudnn.so.9sudo ln -sf libcudnn_ops_train.so.9.3.0 libcudnn_ops_train.so.9
sudo ln -sf libcudnn_ops_infer.so.9.3.0 libcudnn_ops_infer.so.9sudo ln -sf libcudnn_adv_train.so.9.3.0 libcudnn_adv_train.so.9
sudo ln -sf libcudnn_adv_infer.so.9.3.0 libcudnn_adv_infer.so.9sudo ln -sf libcudnn_cnn_train.so.9.3.0 libcudnn_cnn_train.so.9
sudo ln -sf libcudnn_cnn_infer.so.9.3.0 libcudnn_cnn_infer.so.9sudo ldconfig

3.3 测试cuDNN

执行下面的命令:

sudo cp -r /usr/src/cudnn_samples_v9/ ~/  #将系统中自带的 cuDNN 示例代码文件夹 cudnn_samples_v8 复制到你的用户主目录(~/)  方便测试
cd ~/cudnn_samples_v9/mnistCUDNN
sudo chmod 777 ~/cudnn_samples_v9  #给整个 cudnn_samples_v8 目录赋予“所有用户”完全权限(读、写、执行
sudo make clean && sudo make  #清理之前的编译产物并重新编译示例程序
./mnistCUDNN

默认会复制到这个路径下:

在这里插入图片描述

如果测试通过的话,会最终输出:

在这里插入图片描述

如果在执行sudo make clean && sudo make时报错:

在这里插入图片描述

那么就表示缺少对应的库,安装下面的库即可:

sudo apt-get install libfreeimage3 libfreeimage-dev

安装完成之后再进行sudo make,基本上就可以编译成功了。

4. OpenCV with CUDA编译

先前我们安装的OpenCV无法通过CUDA编译,因此我们要考虑是否是OpenCV版本不匹配导致的,先前我们按照的是OpenCV 4.9,而我们的CUDAcuDNN版本分别是12.69.3,我们需要查看一下与之匹配的OpenCV版本:

理论上博主使用OpenCV 4.9 应该是没有问题的,奈何就是不行,果断使用最新版本的OpenCV,即4.13,直接上就完了。

在这里插入图片描述

4.1 运行 CMake 配置

下载对应的 opencv 源码和 opencv_contrib 源码,然后创建,这里博主把 opencv_contrib 放到了opencv 下面,然后创建build文件目录,开始CMake配置。
注意,一定要下载opencv_contrib的源码,否则会报错,下面博主在执行时便遇到了这个问题。

因为OpenCV 的一些 CUDA 功能(如内存管理、底层工具)被移到了 opencv_contrib 仓库中的 cudev 模块中,所以我们需要下载opencv_contrib
将下载后的opencv_contrib放到opencv文件夹下:

在这里插入图片描述

随后切换到build文件夹下,执行下面的脚本:

cmake -D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=/usr/local \-D WITH_CUDA=ON \-D OPENCV_DNN_CUDA=ON \-D ENABLE_FAST_MATH=ON \-D CUDA_FAST_MATH=ON \-D WITH_CUBLAS=ON \-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \-D BUILD_opencv_cudev=ON \..

完成后的效果如下:

在这里插入图片描述

4.2 OpenCV with CUDA 编译与安装

生成CMake文件后,进行编译并安装

make -j$(nproc)  #调用最大CPU可用数量,用于加速make编译

在这里插入图片描述

这个过程会比较漫长,预计得半个多小时 。。。。。

最终编译完成后效果:

在这里插入图片描述

在完成后,我们执行安装命令:

sudo make install

安装成功:

在这里插入图片描述

安装完成后,我们就可以进行测试了,我们依旧选择一个分类模型进行测试:
cd/opencv/samples/cpp/example_cmake目录下,然后打开opencv_example.cpp文件,替换为下面的代码,这个代码执行的便是 加载分类ONNX模型进行推理。

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
#include <vector>
#include <cmath>// Softmax 函数
void softmax(const float* data, float* output, int size) {float max_val = -INFINITY;for (int i = 0; i < size; ++i) {max_val = std::max(max_val, data[i]);}float sum_exp = 0.0f;for (int i = 0; i < size; ++i) {sum_exp += std::exp(data[i] - max_val);}for (int i = 0; i < size; ++i) {output[i] = std::exp(data[i] - max_val) / sum_exp;}
}int main() {// 检查是否有可用的 CUDA 设备if (cv::cuda::getCudaEnabledDeviceCount() == 0) {std::cerr << "没有检测到 CUDA 设备,请检查 OpenCV 是否启用了 WITH_CUDA 和 OPENCV_DNN_CUDA" << std::endl;return -1;} else {std::cout << "CUDA is Used,Detected " << cv::cuda::getCudaEnabledDeviceCount() << "  GPU" << std::endl;}// 加载模型std::string modelPath = "juan_cls.onnx";cv::dnn::Net net = cv::dnn::readNetFromONNX(modelPath);if (net.empty()) {std::cerr << "无法加载模型,请检查路径是否正确" << std::endl;return -1;}// 设置网络后端为 CUDAnet.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);// 图像输入cv::Mat img = cv::imread("img.jpg");if (img.empty()) {std::cerr << "无法加载图像 img.jpg" << std::endl;return -1;}// 预处理int inputWidth = 640;int inputHeight = 640;cv::Mat blob = cv::dnn::blobFromImage(img, 1.0, cv::Size(inputWidth, inputHeight),cv::Scalar(), true, false);net.setInput(blob);// 推理(GPU)cv::Mat out = net.forward();std::cout << "Inference Shape: " << out.size << std::endl;// 假设输出是 [1 x C x H x W]int batchSize = out.size[0];   // 1int channels = out.size[1];    // 2int height = out.size[2];      // 640int width = out.size[3];       // 640std::vector<float> avgScores(channels, 0.0f);for (int c = 0; c < channels; ++c) {double sum = 0.0;float* ptr = out.ptr<float>(0, c);  // batch=0, channel=cfor (int h = 0; h < height; ++h) {for (int w = 0; w < width; ++w) {sum += ptr[h * width + w];}}avgScores[c] = static_cast<float>(sum / (height * width));}// Softmax 归一化float probs[2];softmax(avgScores.data(), probs, 2);// 输出结果std::cout.precision(4);std::cout << std::fixed;std::cout << "\nResult" << std::endl;std::cout << "Cls 0 Score: " << probs[0] << std::endl;std::cout << "Cls 1 Score: " << probs[1] << std::endl;std::cout << "Cls: " << (probs[0] > probs[1] ? 0 : 1) << std::endl;return 0;
}

随后执行下面的命令:

cmake .
make
./opencv_example

最终效果如下,可以看到检测到了一个GPU,并且在执行时能够明显感觉到速度提升了。

在这里插入图片描述

此时我们再使用jtop查看环境,可用看到此时的OpenCV便是可用使用CUDA的了。

在这里插入图片描述

踩坑

当我们没有下载opencv_contrib代码时,我们在CMake时执行这段编译代码:

cmake -D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=/usr/local \-D WITH_CUDA=ON \-D OPENCV_DNN_CUDA=ON \-D ENABLE_FAST_MATH=ON \-D CUDA_FAST_MATH=ON \-D WITH_CUBLAS=ON \-D BUILD_opencv_cudacodec=OFF \-D BUILD_EXAMPLES=OFF ..

在这里插入图片描述

会发生报错:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89631.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89631.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89631.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CLIP模型实现中的其他细节

之前已经完整的拆解了CLIP中所用到的ResNet、ViT和Transformer三个模型&#xff08;CLIP拆解-CSDN博客&#xff09;&#xff0c;这篇将讲解model.py实现中的其他细节。 1.关于ResNet模型中vision_head的设置 ResNet: vision_heads vision_width * 32 // 64 ViT: vision_h…

国科大深度学习作业1-手写数字识别实验

背景介绍&#xff1a;单位实习&#xff0c;趁机摸鱼&#xff0c;由于电脑只安装了VSCode&#xff0c;所以算是从环境搭建写起。 目录 一、环境搭建 1. 安装Anaconda 2. 创建Python环境 3. 安装PyTorch 4. 安装其他必要库 二、在 VSCode 中配置环境 1. 安装Pytho…

基于Spring Boot的绿园社区团购系统的设计与实现

第1章 摘 要 本设计与实现的基于Spring Boot的绿园社区团购系统&#xff0c;旨在为社区居民提供一套高效、便捷的团购购物解决方案。随着电子商务的发展和社区居民对便捷购物需求的增加&#xff0c;传统的团购模式已无法满足用户的个性化需求。本系统通过整合现代化技术&…

【51单片机四位数码管从0循环显示到99,每0.5秒增加一个数字,打击键计数】2022-6-11

缘由 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64,15,56}; //共阴0~F消隐减号 unsigned char Js0, miao0;//中断计时 秒 分 时 毫秒 unsigned int shu0; //bit Mb0;//…

如何通过python脚本向redis和mongoDB传点位数据

向MongoDB传数据 from pymongo import MongoClient #导入库对应的库localhost "172.16.0.203" #数据库IP地址 baseName "GreenNagoya" client MongoClient(localhost, 27017, username"admin", password"zdiai123") #数…

昆仑通泰触摸屏Modbus TCP服务器工程 || TCP客户端工程

目录 一、Modbus TCP服务端 1.设备地址 2.实操及数据 二、Modbus TCP客户端 1.结果及协议解析 一、Modbus TCP服务端 1.设备地址 --单元标识符 DI输入/4个离散输入 DO输出/单个线圈输出 输入寄存器 读输入寄存器操作&#xff0c;写输入寄存器操作 保持寄存器 …

PyTorch 安装使用教程

一、PyTorch 简介 PyTorch 是由 Facebook AI Research 团队开发的开源深度学习框架。它以动态图机制、灵活性强、易于调试而著称&#xff0c;广泛应用于自然语言处理、计算机视觉和学术研究。 二、安装 PyTorch 2.1 通过官网选择安装命令&#xff08;推荐&#xff09; 访问官…

开源功能开关(feature flags) 和管理平台之unleash

文章目录 背景Flagsmith 和 Unleash什么是unleash架构Unleash Edge 安装和使用Unleash SDKs开放API Tokens访问**Server-side SDK (CLIENT)****查询所有 Feature Toggles****查询特定 Toggle** API token typesClient tokensFrontend tokensPersonal access tokensService acco…

细胞建模“图灵测试”:解析学习虚拟细胞挑战赛

一、AI能否预测细胞的未来&#xff1f; 想象一下&#xff0c;有一天我们不必一管管地做实验&#xff0c;就能在计算机中模拟细胞对基因敲除、药物处理乃至微环境变化的反应。这不再是科幻&#xff0c;而是“虚拟细胞”&#xff08;Virtual Cell&#xff09;研究的宏大目标。然…

centos9安装docker Dify

CentOS | Docker Docs yum -y install gcc gcc-c yum-utils Docker 官方的 YUM 软件仓库配置文件到系统,设置存储库 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 也可以从阿里云下(我选择上面的) yum-config-manager --add-re…

基于Jenkins和Kubernetes构建DevOps自动化运维管理平台

目录 引言 基础概念 DevOps概述 Jenkins简介 Kubernetes简介 Jenkins与Kubernetes的关系 Jenkins与Kubernetes的集成 集成架构 安装和配置 安装Jenkins 安装Kubernetes插件 配置Kubernetes连接 配置Jenkins Agent Jenkins Pipeline与Kubernetes集成 Pipeline定义…

MySQL 8.0 OCP 1Z0-908 题目解析(18)

题目69 Choose three. A MySQL server is monitored using MySQL Enterprise Monitor’s agentless installation. Which three features are available with this installation method? □ A) MySQL Replication monitoring □ B) security-related advisor warnings □ …

【mongodb】安装和使用mongod

文章目录 前言一、如何安装&#xff1f;二、使用步骤1. 开启mongod服务2. 客户端连接数据库3. 数据库指令 总结 前言 Mongodb的安装可以直接安装系统默认的版本&#xff0c;也可以安装官网维护的版本&#xff0c;相对而言更推荐安装官网维护的版本&#xff0c;版本也相当更新。…

云效DevOps vs Gitee vs 自建GitLab的技术选型

针对「云效DevOps vs Gitee vs 自建GitLab」的技术选型&#xff0c;我们从核心需求、成本、运维、扩展性四个维度进行深度对比&#xff0c;并给出场景化决策建议&#xff1a; 一、核心能力对比表 能力维度云效DevOpsGitee自建GitLab&#xff08;社区版/企业版&#xff09;代码…

CentOS 7 安装RabbitMQ详细教程

前言&#xff1a;在分布式系统架构中&#xff0c;消息队列作为数据流转的 “高速公路”&#xff0c;是微服务架构不可或缺的核心组件。RabbitMQ 凭借其稳定的性能、灵活的路由机制和强大的生态支持&#xff0c;成为企业级消息中间件的首选之一。不过&#xff0c;当我们聚焦 Cen…

Python爬虫用途和介绍

目录 什么是Python爬虫 Python爬虫用途 Python爬虫可以获得那些数据 Python爬虫的用途 反爬是什么 常见的反爬措施 Python爬虫技术模块总结 获取网站的原始响应数据 获取到响应数据对响应数据进行过滤 对收集好的数据进行存储 抵御反爬机制 Python爬虫框架 Python…

uni-app开发app保持登录状态

在 uni-app 中实现用户登录一次后在 token 过期前一直免登录的功能&#xff0c;可以通过以下几个关键步骤实现&#xff1a;本地持久化存储 Token、使用请求与响应拦截器自动处理 Token 刷新、以及在 App.vue 中结合 pages.json 设置登录状态跳转逻辑。 ✅ 一、pages.json 配置说…

21、MQ常见问题梳理

目录 ⼀ 、MQ如何保证消息不丢失 1 、哪些环节可能会丢消息 2 、⽣产者发送消息如何保证不丢失 2.1、⽣产者发送消息确认机制 2.2、Rocket MQ的事务消息机制 2.3 、Broker写⼊数据如何保证不丢失 2.3.1** ⾸先需要理解操作系统是如何把消息写⼊到磁盘的**。 2.3.2然后来…

MySQL数据库--SQL DDL语句

SQL--DDL语句 1&#xff0c;DDL-数据库操作2&#xff0c;DDL-表操作-查询3&#xff0c;DDL-表操作-创建4&#xff0c;DDL-表操作-数据类型4.1&#xff0c;DDL-表操作-数值类型4.2&#xff0c;DDL-表操作-字符串类型4.3&#xff0c;DDL-表操作-日期时间类型4.4&#xff0c;实例 …

Spring Cloud 服务追踪实战:使用 Zipkin 构建分布式链路追踪

Spring Cloud 服务追踪实战&#xff1a;使用 Zipkin 构建分布式链路追踪 在分布式微服务架构中&#xff0c;一个用户请求往往需要经过多个服务协作完成&#xff0c;如果出现性能瓶颈或异常&#xff0c;排查会非常困难。此时&#xff0c;分布式链路追踪&#xff08;Distributed…