ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NVIDIA Jetson Xavier NX 刷机、ROS 与深度学习环境配置全攻略

NVIDIA Jetson Xavier NX 刷机、ROS 与深度学习环境配置全攻略 第一次拿到NVIDIA Jetson Xavier NX很多人的第一反应是“这不就是个带显卡的树莓派嘛插电就能玩”。等真正动手才发现刷系统、装ROS、配深度学习环境每一步都能卡住一大批人。我前后折腾了三四天踩过刷机识别不到设备、ROS apt源报错、PyTorch无法调用CUDA的一串坑所以这篇干脆把整条链路串起来写一遍Xavier NX刷机、ROS安装、深度学习配置全部走通。内容适合刚入手这块板子、准备拿来做机器人、无人机或边缘AI项目的朋友也适合已经刷完机但卡在环境配置的人。下面所有操作我都按实际踩坑后的最优路径来写尽量让你少走弯路。1. 刷机前的版本决策Xavier NX和JetPack怎么选才不后悔1.1 Xavier NX在边缘设备里的定位Jetson Xavier NX是NVIDIA Jetson家族里性价比很高的一个型号算力大约21 TOPSINT8功耗范围10W到25W。体积比信用卡大不了多少但跑小型深度学习模型、机器人视觉、多路相机处理都够用。和树莓派最大的区别在于它自带Volta架构GPU和Tensor Core可以本地跑CUDA、TensorRT这类加速库而不是只靠CPU硬扛。很多人忽略的一点是Xavier NX并没有板载eMMC存储系统需要装在MicroSD卡或NVMe SSD上所以“刷机”这个动作几乎是必经之路。而刷机的核心并不只是把镜像写进卡里而是选对JetPack版本——这一步直接决定你后面ROS和PyTorch能装到什么程度。1.2 JetPack、Ubuntu、ROS三者的版本对应关系Jetson上的系统镜像不叫“Ubuntu原版”而是NVIDIA基于Ubuntu定制的JetPack。JetPack里面预装了CUDA、cuDNN、TensorRT、OpenCV等一堆驱动和库。现在Xavier NX最常用的两代是JetPack 4.6.x和JetPack 5.1.x它们的差异会直接影响你后续选ROS版本。对比项JetPack 4.6.4JetPack 5.1.2Ubuntu版本18.0420.04默认Python3.63.8CUDA10.211.4cuDNN8.28.6TensorRT8.28.5常用ROS1MelodicNoetic常用ROS2一般较少Foxy / GalacticPyTorch兼容性老版本较好新版本更顺我现在的建议是如果你不是必须用老项目里的ROS Melodic直接上JetPack 5.1.2配Ubuntu 20.04。原因有三个——Python 3.8比3.6舒服太多、ROS Noetic是ROS1的最终长期维护版、新的深度学习框架对CUDA 11.x的适配明显更好。当然如果你手头板子是16GB版本这个选择同样适用内存大小不影响系统版本选择。1.3 刷机前需要准备的硬件刷机和后续开发需要的东西不复杂但少了任何一样都会卡壳一台x86_64架构的Linux电脑Ubuntu 18.04或20.04都可以用于SDK Manager刷机一根USB Type-C数据线注意要能传数据不要用纯充电线至少64GB的MicroSD卡建议U3或A2速度等级如果考虑长期使用准备一块M.2 NVMe SSD和转硬件Xavier NX开发套件板载M.2接口显示器DP或HDMI、键鼠、电源适配器注意Xavier NX开发套件的电源最好用官方原配第三方电源在满载跑深度学习时容易电压跌落导致重启。这个我在后面还会提到。2. 刷机实操SDK Manager与SD卡直烧两条路线的完整对照2.1 准备工作进入USB Recovery模式在开始刷机前首先要让Jetson进入USB Recovery模式。这个步骤很多人第一次操作会很慌其实流程非常固定用USB-C线把Xavier NX开发套件的USB-C口和Linux电脑连起来。按住载板上的 RecoveryREC按钮不要松开。按一下 Reset 按钮然后松开 Reset。继续保持 REC 按钮按住大约3秒再松开。之后在Linux电脑上执行lsusb如果看到类似NVIDIA Corp. APX的设备信息说明Jetson已经成功进入恢复模式。看不到的话先换一根USB线、换一个电脑USB口试试不要急着换系统。这个报错绝大多数时候是线材问题。2.2 用SDK Manager刷机的完整流程SDK Manager是NVIDIA官方刷机工具需要在Linux电脑上运行。下载安装后流程如下登录NVIDIA开发者账号。选择目标设备为 Jetson Xavier NX选择JetPack版本。勾选要安装的组件一般全选。选择安装目标存储设备可以是MicroSD卡也可以是NVMe SSD。点击继续等待下载和写入完成。整个刷机过程里SDK Manager会下载很大体积的组件包所以Linux电脑至少要预留30GB以上磁盘空间。写入过程中Jetson会自动重启几次这是正常的不要中途断电不要手贱去拔线。刷机完成后系统会自动重启进入Ubuntu桌面。首次启动会让你设置用户名、密码、主机名和时区这一步和普通Ubuntu安装一样。这里要单独说一句SDK Manager刷机需要Linux宿主机这是很多人卡住的地方。如果你手头只有Windows或Mac其实也不用慌可以用下面的SD卡直烧方案。2.3 没有Linux宿主机时SD卡直烧方案如果你没有Linux电脑最简单的办法是使用NVIDIA官方发布的SD Card Image镜像配合写卡工具直接烧录。操作步骤如下从NVIDIA官网下载Xavier NX Developer Kit的SD Card Image文件名通常是.img.xz压缩格式。Windows下用BalenaEtcherMac下也可以用Etcher选择镜像写入准备好的MicroSD卡。写入完成后把SD卡插进Jetson连接显示器、键鼠、网线和电源开机。首次启动后同样会进入初始化设置界面设置完账号密码就能进桌面。这条路线的好处是门槛低不需要Linux环境整个流程大约15分钟就能看到桌面。但缺点是灵活性不如SDK Manager后续如果你想换JetPack版本或把系统写到NVMe上还是得回到SDK Manager或命令行工具。2.4 两种刷机方案怎么选我自己实际用过两条路线结论很明确如果只是先跑起来看看SD卡直烧香。如果确定要做正经项目尤其是要装大量ROS包和深度学习环境建议一次到位用SDK Manager写NVMe SSD或者先用SD卡启动之后再把系统迁移到NVMe。对比项SDK ManagerSD卡直烧宿主机要求需要Linux电脑Windows/Mac/Linux都行版本选择可自由选择JetPack只能用官方预打包镜像目标存储SD卡或NVMe主要是SD卡操作复杂度稍复杂简单适合场景正式开发快速体验刷完机进入系统后下一步就是装ROS。这块我强烈建议先把系统源更新一遍避免后续出现各种陈旧的软件包问题sudo apt update sudo apt upgrade -y sudo reboot3. ROS环境落地手动安装与鱼香ROS一键安装的真实体验3.1 选ROS1还是ROS2这是第一个岔路口JetPack 5.1.2对应的Ubuntu是20.04所以主流选择是两条ROS1 NoeticROS1的最后长期支持版生态成熟网上资料最多学ROS基本绕不开。ROS2 FoxyROS2 LTS版本面向多机器人、分布式、实时性要求更高的场景DDS通信机制更现代。我的建议是如果你只是做课程设计和单机机器人项目先装ROS Noetic会省心很多因为大多数现成功能包和教程都是ROS1的。如果你一开始就想走ROS2路线那就直接装Foxy或Galactic不要中途来回切换两个版本并存对新手来说很容易搞混环境。注意ROS1和ROS2的环境变量和命令工具不兼容比如ROS1用catkin_makeROS2用colcon build切换时很容易忘记 source 哪个环境。3.2 手动安装ROS Noetic的完整步骤这里以ROS Noetic为例这是我在Xavier NX上实测稳定的组合。手动安装看起来命令多但每一步都是可解释的# 1. 启用Ubuntu universe和multiverse仓库 sudo add-apt-repository universe sudo add-apt-repository multiverse # 2. 添加ROS官方软件源 sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list # 3. 添加ROS仓库密钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 # 4. 更新软件包列表 sudo apt update # 5. 安装ROS Noetic桌面版 sudo apt install ros-noetic-desktop # 6. 安装常用开发工具 sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential # 7. 初始化rosdep sudo rosdep init rosdep update # 8. 设置环境变量 echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc这里最容易翻车的是两个地方。第一ROS软件源下载速度可能很慢。如果你遇到apt update卡住或者下载速率极低可以把/etc/apt/sources.list.d/ros-latest.list里的地址换成国内镜像源一般是直接替换域名前缀然后再sudo apt update。第二rosdep update对网络依赖很强如果一直失败我的经验是不要死磕一次跑通多试几次或者换一个网络时段。rosdep主要是在编译源码功能包时帮你自动拉取依赖如果你只是用apt安装现成功能包暂时不跑源码编译的话即使rosdep没初始化成功也不影响核心ROS使用。3.3 鱼香ROS一键安装到底做了什么在搜ROS安装资料的时候你大概率会看到“鱼香ROS一键安装”这个词。这个工具在ROS社区里热度非常高我也实际用过几次确实能省不少事。它的本质是一个交互式Shell脚运行后会出现菜单可以选择安装ROS1还是ROS2、更换软件源、安装常见依赖等。脚本会根据你的Ubuntu版本自动配置对应的ROS软件源和密钥把上面手动安装的大部分步骤自动化。我当时在Xavier NX上跑过一次整体体验比手动安装顺滑尤其是针对Ubuntu 20.04的ROS Noetic安装它会帮你把apt源、密钥、python依赖都处理好。完成后你只需要执行source /opt/ros/noetic/setup.bash就能正常使用roscore、rosrun这些命令。下面这个表格是我自己的对比感受对比项手动安装鱼香ROS一键安装操作步骤8步以上选菜单即可对网络要求对源稳定敏感脚本自动换源排错难度需要自己定位问题报错提示相对友好适合人群想彻底搞懂原理想快速跑通我个人对一键脚本的态度是工具本身没问题但装完之后你最好还是看看它往系统里加了哪些源、装了哪些包至少知道环境是怎么来的后面出问题才不至于一脸懵。如果你实在想省事直接跑鱼香ROS一键安装完全OK它不会破坏系统现有环境只会往ROS相关目录里添加文件。关键是装完之后要验证一下环境是否正常。3.4 验证ROS环境并创建工作空间不管手动装还是一键装装完都要验证。开一个终端roscore保持这个终端不要关闭再开一个新的终端rosnode list如果能看到/rosout输出说明ROS核心节点正常。接下来创建一个最基础的工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make source devel/setup.bash工作空间是后面开发ROS功能包的基础目录结构。这时候如果你还想装bottle比如sudo apt install ros-noetic-teleop-twist-keyboard、ros-noetic-rmpi之类都能正常装上了。4. 深度学习环境配置PyTorch、TensorRT与Jetson专属部署链路4.1 为什么不能直接pip install torch很多人在自己的x86电脑上装PyTorch习惯了一条pip install torch就能搞定。到了Jetson上如果照样执行会遇到两种情况要么提示找不到匹配的版本要么装上了但是torch.cuda.is_available()返回False。原因很简单PyPI官方源上的torch多数只打包了x86_64架构而Jetson是ARM架构。NVIDIA官方为Jetson提供了一套预编译的PyTorch wheel包里面做了对Jetson GPU的针对性优化所以必须用NVIDIA提供的那份。4.2 安装PyTorch和torchvision并验证CUDA我的路径是先确认当前JetPack版本然后去NVIDIA官网的Jetson下载页面选择对应版本的torch wheel。JetPack 5.1.2对应Python 3.8所以选文件名里带cp38的wheel文件下载后用pip安装# 安装基础依赖 sudo apt update sudo apt install python3-pip libopenblas-dev libopenmpi-dev pip3 install --upgrade pip # 假设下载的wheel文件名为 torch-2.0.0a0xxx-cp38-cp38-linux_aarch64.whl pip3 install torch-2.0.0a0xxx-cp38-cp38-linux_aarch64.whltorchvision也需要装对应版本否则导入时可能报libnvbuf_utils.so或版本不匹配的错。安装方式和torch一样找对应JetPack版本的wheel。装完之后先把CUDA路径写进环境变量echo export PATH/usr/local/cuda/bin:\$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda/lib64:\$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc然后验证nvcc -V python3 -c import torch; print(torch.__version__); print(torch.cuda.is_available()); xtorch.rand(2,3).cuda(); print(x)看到torch.cuda.is_available()为True就说明PyTorch能用上Xavier NX的GPU了。你还可以顺手跑一下python3 -c import torch; print(torch.backends.cudnn.version())一般Jetson会输出CUDNN版本号说明官方预编译的torch已经正确链接了cuDNN。4.3 TensorRT推理阶段的性能关键JetPack自带TensorRT这是NVIDIA的深度学习推理引擎可以显著提高模型在边缘设备上的推理速度。对于Xavier NX来说TensorRT几乎是必开的加速工具。不过很多人在Jetson上用TensorRT会踩一个坑系统里装了TensorRT运行时但Python里import tensorrt会报ModuleNotFoundError。原因是JetPack自带的只是C库Python绑定需要额外安装wheel包。在JetPack 5.1.2上可以这样做ls /opt/nvidia/tensorrt/python/会看到类似tensorrt-8.5.2.2-py3-none-linux_aarch64.whl的文件然后pip3 install /opt/nvidia/tensorrt/python/tensorrt-8.5.2.2-py3-none-linux_aarch64.whl装完验证python3 -c import tensorrt as trt; print(trt.__version__)能输出版本号就说明TensorRT的Python接口可用了。4.4 torch2trt把PyTorch模型转成TensorRT引擎拿到PyTorch训练好的模型想在Xavier NX上跑出更高帧率最常用的路径是把PyTorch模型转成TensorRT引擎。这里我推荐NVIDIA官方维护的torch2trt工具它能让你在PyTorch代码里直接用TensorRT推理不用手写复杂的TensorRT API。安装很简单git clone https://github.com/NVIDIA-AI-IOT/torch2trt cd torch2trt python3 setup.py install用法和PyTorch很接近比如加载一个训练好的分类模型import torch from torch2trt import torch2trt model MyTorchModel().cuda().eval() x torch.randn(1, 3, 224, 224).cuda() model_trt torch2trt(model, [x], fp16_modeTrue) # 推理时直接调用 output model_trt(x)这里一个重要经验是fp16_modeTrue在Xavier NX上有明显加速效果虽然精度会有轻微变化但多数视觉任务感知不到。如果你做的是检测或分割这类大模型项目这个开关值得一开。如果你想部署的是ONNX格式模型也可以使用onnxruntime-gpu但需要注意在Jetson上应该用NVIDIA提供的aarch64适配版本而不是PyPI上的通用包。5. 环境调优与高频踩坑电源模式、SWAP和那些让人上火的报错5.1 电源模式与风扇控制Xavier NX默认的电源模式是多少很多人刷完机后根本没注意。默认状态下系统可能跑在15W甚至10W模式GPU频率会被限制导致深度学习推理速度比预期慢很多。查看当前电源模式sudo nvpmodel -q切换到最大性能模式sudo nvpmodel -m 0JetPack 5.1.2中-m 0一般对应最大功耗模式可能是20W或25W具体看你下载的电源管理表。如果你不想记这个数字也可以安装jtop用可视化界面看sudo pip3 install jetson-stats jtopjtop里面能直接看到GPU/CPU频率、温度、内存占用、换源模式切换是Jetson开发必备工具。风扇这块有个小坑开发套件上的风扇默认是温控的不跑重任务时几乎不转。如果你发现跑深度学习时温度很高、风扇不转或转速偏低可以手动控制PWM# 查看当前风扇目标转速 cat /sys/devices/pwm-fan/target_pwm # 手动设置风扇转速0为停转255为全速 echo 200 | sudo tee /sys/devices/pwm-fan/target_pwm不同内核版本路径可能略有差异用jtop确认你的内核风扇设备路径最稳妥。5.2 SWAP空间和存储加速Xavier NX默认内存是8GB或16GB跑大型模型训练时很容易直接把内存吃满。一个很典型的场景是用PyTorch加载一个大模型程序直接被OOM杀掉。解决办法之一是开一个swap文件。sudo fallocate -l 8G /var/swapfile sudo chmod 600 /var/swapfile sudo mkswap /var/swapfile sudo swapon /var/swapfile echo /var/swapfile none swap sw 0 0 | sudo tee -a /etc/fstab加了8G swap之后跑模型和编译代码的容错率会高不少但要注意SD卡上的swap读写速度很慢真到swap被大量使用的时候程序还是会卡。所以尽量把经常访问的大模型、数据集放在NVMe SSD上别让SD卡成为性能瓶颈。如果你有条件最推荐的做法是直接把整块系统放到NVMe上。SDK Manager刷机时把目标存储选为NVMe即可或者在SD卡系统启动后用相关迁移工具把根文件系统dd到NVMe。我实测过的效果是ROS编译时间、pip安装时间、模型加载时间都明显缩短这个提升不是一点点。5.3 高频报错排查表最后把我折腾过程中遇到的高频报错整理成表基本都是环境刚搭完时最容易碰到的现象根因解决方法lsusb看不到APX设备USB线不支持数据传输或没进入恢复模式换线、换USB口重新执行Recovery按键流程apt update报Could not get lock系统后台有apt进程执行sudo pkill apt后重试或sudo rm /var/lib/dpkg/lock-frontendrosdep update卡住网络原因多试几次换个网络时段或检查DNSnvcc -V提示找不到命令CUDA没加进PATH按4.2节写入~/.bashrc并sourceimport torch后torch.cuda.is_available()为False安装的是CPU版torch或普通PyPI版卸载重装使用NVIDIA官方wheel包import tensorrt报ModuleNotFoundError未安装Python绑定安装/opt/nvidia/tensorrt/python/下的whl文件编译ROS包时内存不足被kill内存或swap不足开启swap并适当限制编译并行任务数量跑模型时机器唤醒或重启电源功率不足换原装电源或降到较低电源模式运行还有一个非常容易被忽视的问题Jetson系统里默认可能装了多个Python版本。很多人在终端执行python进入的是Python2.7然后pip装包装到了Python3环境最后 import 时报错。建议统一用python3 -m pip来执行pip安装并且确认当前shell使用的是哪个python版本。python3 --version python3 -m pip --version这能避免至少一半的“我明明装了为什么导入失败”类问题。如果你已经按照前面的顺序走完一遍Xavier NX现在应该已经具备了三个核心能力稳定的Ubuntu系统、可用的ROS环境、能调用GPU的PyTorch和TensorRT。最后再分享一个我自己的习惯每次做完一个环境变更都抽空拍一下当时的系统状态比如JetPack版本、Python版本、torch版本、ROS版本记录下来贴在终端里最显眼的地方。因为Jetson上的环境版本匹配关系非常敏感过两个月再回来你很大概率会忘记当时是用哪套组合跑通的。有记录哪怕以后重刷系统也能很快恢复出同样的开发环境。
返回列表