2026.9.22 最新 Jetson AGX Orin 刷机/重装系统全记录:JetPack 6.2.3 + conda + PyTorch + YOLO
最近又把我的 Jetson AGX Orin 折腾了一遍,从刷机到 JetPack 6.2.3,再到 conda 环境、PyTorch 安装和 YOLO 部署,整个链路走下来踩了不少坑,也攒了不少经验。这篇文章就把完整过程写出来,包括刷机的关键步骤、conda 在 ARM 平台上的坑、PyTorch 不能直接用 pip 装的真相,以及 YOLO 推理加速的实用做法。无论你是刚拿到 Orin 想重装系统,还是刷完之后卡在环境配置这一步,这篇都能给你一条走通的路。
Jetson AGX Orin 这块板子的定位是边缘侧 AI 计算的主力,64GB 统一内存加上 Ampere 架构的 GPU,跑目标检测、实例分割、多模态模型都没压力,但前提是系统环境和深度学习框架得配好。JetPack 6.2.3 是目前比较新的系统套件,内置了 CUDA、cuDNN、TensorRT 等一堆组件,很多老教程还停留在 JetPack 5.x,跟着抄作业容易翻车。我这篇文章会贴近当前版本的实际表现,把刷机、conda、PyTorch、YOLO 这几件事讲清楚,适合刚入手 Orin 的开发者、做边缘部署的工程师,以及给实验室板子做维护的同学参考。
1. 刷机前的思路:为什么重装系统、用什么方案最省事
1.1 什么情况下需要重刷系统
先说结论:不是所有问题都要刷机,但刷机是很多疑难杂症的终极解药。我这次重刷的原因很简单——之前为了贪方便在某处拷了一个别人打包的镜像,结果系统里残留了一堆乱七八糟的依赖,nvcc版本和 CUDA runtime 对不上,编译 TensorRT engine 的时候各种奇葩报错,最后干脆推倒重来。
以下情况我建议直接刷机:
- JetPack 版本太旧,比如还在 5.x,而你想跑的模型或新版 PyTorch 需要 CUDA 12.x。
- 板子上的系统被改坏了,比如误删了
/usr/lib/aarch64-linux-gnu下面的关键库,或者dpkg出现大量损坏包。 - 磁盘空间长期紧张,eMMC 上的系统分区快塞满了,想重新调整分区布局。
- 你需要切换到不同的启动模式,例如把根文件系统放到 NVMe 上而不是 eMMC。
反过来,如果你的板子只是某个包装坏了,比如 pip 的依赖冲突,那不是刷机的理由。conda 可以隔离环境,apt install --reinstall也能救回来,别一上来就刷机——刷机一次至少半小时,还得重新配环境。
1.2 JetPack 6.2.3 到底给了你什么
JetPack 6.2.3 是 NVIDIA 在 6.x 系列里的一个稳定版本,宿主系统基于 Ubuntu 22.04(aarch64),内核版本在 5.15 左右。它包含的组件大致有:
| 组件 | 版本说明 | 用途 |
|---|---|---|
| L4T (Linux for Tegra) | 对应 6.2.3 的驱动包 | 板级支持包,包含内核、Bootloader、设备树 |
| CUDA | 12.x 系列 | GPU 计算核心 |
| cuDNN | 8.9+ | 深度学习算子加速 |
| TensorRT | 8.6+ | 推理引擎,导出加速模型的关键 |
| OpenCV | 4.x | 图像处理,默认带 CUDA 加速 |
| DeepStream | 6.4+ | 流媒体/视频分析框架(可选) |
| NVIDIA Container Runtime | 最新 | 跑 Docker 容器时用得到 |
这个组件表记住一个重点:TensorRT 是独立于 CUDA 的,刷完系统之后如果你要自己编译 TensorRT 插件,版本一定要和板上的库匹配,否则运行时会直接报不安全的版本错误。我后面在 YOLO 部分会再提到。
1.3 刷机方案选型:SDK Manager vs 命令行烧录
Jetson 刷机主流有三种方式,我按推荐程度排个序:
- SDK Manager(图形化):最推荐,尤其对新手。主机上装好 SDK Manager,通过 USB-C 连接板子,它能自动检查板子型号、下载对应 JetPack、刷系统、装组件,全程图形界面,出错提示也比较友好。
- 命令行烧录(sdkmanager CLI 或直接跑 flash.sh):适合在无图形界面的服务器上操作,或者你脚本化了整个流程。需要自己下载驱动包和样本文件系统,然后用
./flash.sh或sdkmanager --cli烧录。可控性更强,但对操作者的理解要求更高。 - 镜像直刷(用 dd 或 Etcher 写 eMMC/NVMe):最快但最不灵活,通常只用于恢复出厂。如果别人的镜像包含了很多私有配置,不建议用。
我这次用的是 SDK Manager + 命令行结合的方式,因为主机是 Ubuntu 22.04 无桌面环境,SDK Manager 图形界面开不了,我直接用它的 CLI 参数跑。重点讲一下 CLI 的用法,这招在很多场景下都比点点点高效:
# 下载 sdkmanager 后安装,然后用如下命令查看可用版本 sdkmanager --list | grep -i "version=6.2.3" # 直接刷系统并默认不安装组件(组件后面用 apt 装) sdkmanager --cli --action install \ --login-type devzone \ --product Jetson \ --version 6.2.3 \ --target-os Linux \ --host \ --target AGX_orin \ --exitonfirstfailure \ --accept-license \ --stay-logged-in这里有个细节:--exitonfirstfailure的意思是只要某一步失败就立刻退出,避免刷到一半日志刷屏你还没发现。--accept-license是必须的,不然连不上授权服务器。
2. 刷机实操:恢复模式、连接方式和分区布局的坑
2.1 进入恢复模式,这个细节错了全盘皆输
刷机的第一步是把板子弄进 USB 恢复模式(USB Recovery Mode)。AGX Orin 开发套件上有两个关键硬件:Jetson 模块底部的 Recovery 按钮和Micro-B USB 口(在开发套件的背板侧面,靠近电源口那一侧)。
具体操作:
- 先把主机和板子用 USB-C 线连接好,线最好是支持数据通信的,有些廉价充电线只能供电不能传数据,这坑我踩过。
- 板子电源断开(不接电源适配器)。
- 按住 Recovery 按钮不松手,同时接上电源(或者给板子上电),保持按住 Recovery 按钮约 2 秒后再松开。
- 在主机上执行
lsusb,应看到NVIDIA Corp. APX设备,识别码类似0955:7023。看到这个就说明恢复模式已经进入成功。
如果lsusb里没有出现 APX,常见原因是 USB 线问题,或者你按住 Recovery 的时间不对。另一个细节是:AGX Orin Developer Kit 默认上电后直接启动,如果你接的是已经装过系统的 eMMC,它不会自动进恢复模式,必须按 Recovery 才能让 BootROM 进入 USB 下载状态。
2.2 SDK Manager 的安装配置流程
主机端先装 SDK Manager:
sudo apt install -y ./sdkmanager_2.x.x.deb sdkmanager --cli --login-type devzone --username <你的账号> --password <你的密码>这里我要提醒一句:SDK Manager 是 NVIDIA 账号体系,需要注册一个 Developer Program 账号。没有账号的,可以先去官网注册,免费的,就是多一步认证。
在图形界面里,勾选的组件我建议按下面这组来:
- Jetson SDK Components:勾全套,包括 CUDA、TensorRT、cuDNN 等。
- Host Machine Components:如果你主机本身想装 CUDA,可以勾,但没必要,因为主机只负责刷机,跑训练还是在板子上。
- DeepStream:做视频分析再勾,如果只是跑 YOLO 验证,可以先不装。
组件安装路径要注意,SDK Manager 默认会把 L4T 驱动包和样本文件系统下载到~/.nvidia-sdk/,如果你的主目录在 /home 且空间不够,建议在安装前改一下Preferences里的下载目录,因为一个 JetPack 6.2.3 的完整包大概有 7GB 到 9GB。
2.3 分区布局:eMMC vs NVMe,这不是选择题
AGX Orin Developer Kit 出厂默认是 64GB eMMC 作为系统盘,但实际可用空间很有限。JetPack 6.2.3 装完基础组件后,/分区经常只剩 20GB 出头,你装 conda、PyTorch、ultralytics 权重、数据集,很快就捉襟见肘。
所以我强烈建议在刷机阶段就做一件事:把根目录(rootfs)直接放到 NVMe SSD 上。SDK Manager 图形界面里有这个选项,命令行方式则在烧录前用nvautoinstall.sh脚本去配置:
# 下载 L4T 驱动包后,进入 Linux_for_Tegra 目录 # 先修改分区配置,让根文件系统落在 NVMe sudo ./tools/manage_partitions.py --disk nvme0n1 --layout layouts/AGX_orin_nvme.xml flash.xml sudo ./flash.sh p3509-p3767-0000+p3767-0001 nvme0n1上面这条命令把系统刷到 NVMe,eMMC 就空出来做缓存或者直接不管。这样操作后,你的/分区就是 NVMe 的容量了,比如 1TB 的盘。注意:系统启动的时候,BootROM 首先读 eMMC 上的 bootloader,然后引导 NVMe 上的根文件系统,所以如果你后续把 eMMC 上的系统擦掉或改分区,可能影响启动,但一般不动它就没问题。
2.4 刷机后的初始配置清单
刷完系统,第一件事并不是急着装包,而是先做一轮基础配置:
# 设置用户密码、时区、网络 sudo passwd <你的用户名> sudo timedatectl set-timezone Asia/Shanghai # 给 root 和普通用户都加个 sudo 免密(看你习惯),避免后面反复输密码 sudo visudo # 安装基础工具 sudo apt update sudo apt install -y vim htop git curl wget net-tools另外一个关键配置是nvpmodel。Jetson 板子默认以低功耗模式运行,如果你要跑模型训练或推理,先把模式切到最大性能:
# 查看可用模式 sudo nvpmodel -q # 切换到 MAXN 模式 sudo nvpmodel -m 0 # 打开所有 CPU/GPU 频率,fan 转速交给系统自动管理 sudo jetson_clocksnvpmodel -m 0对应的就是 MAXN 模式,这是 AGX Orin 性能最顶的状态。我实测过,不切模式跑 YOLO 推理,FPS 只有切完模式的三分之一,这个差异非常明显。补充一句,jetson_clocks每次重启后要重新执行,可以写进/etc/rc.local或做成 systemd 服务,省得老是忘。
3. conda 在 ARM 平台上的安装与配置:别让 conda init 卡住你
3.1 选哪个发行版:Anaconda、Miniconda 还是 Miniforge
很多人在 x86 上习惯了conda install一堆包,拿到 AGX Orin 之后发现同样一条命令,包却装不上,或者安装过程慢得像蜗牛,原因在于 aarch64 的 conda 生态和 x86_64 不完全一样。
先明确:Jetson 上能不能用 Anaconda?能,但也有坑。新版的 Anaconda 官方已经提供 aarch64 的 Linux 安装包,可以直接装。但我个人推荐Miniforge,原因有三个:
- Miniforge 默认走的是社区维护的 conda-forge 源,aarch64 的包覆盖比官方 channels 更全。
- 它默认配置了
strictchannel priority,避免 pip 和 conda 打架。 - 它足够轻量,不往系统里塞一堆你用不到的工具。
安装流程:
# 下载 Miniforge 的 aarch64 安装包 wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh # 执行安装,建议加 -b 静默安装,然后手动初始化 bash Miniforge3-Linux-aarch64.sh -b -p $HOME/miniforge3 # 初始化 shell $HOME/miniforge3/bin/conda init bash source ~/.bashrc3.2 conda activate 报错:CommandNotFoundError 和“conda 不是内部命令”
这两个问题是搜索热词里出现频率最高的,我详细说。
情况 A:conda activate 提示CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'
这个是conda init没生效导致的。你执行了conda install之后直接敲conda activate myenv就会这样。解决办法很简单:
conda init bash source ~/.bashrc但有一种情况是conda init之后.bashrc里的 block 已经写进去了,却仍然提示错误。这时候检查一下你的 shell 到底是什么,我遇到过有些用户默认 shell 是zsh,而你执行的是conda init bash。用echo $SHELL确认,然后对相应的 shell 做初始化。
情况 B:conda不是内部或外部命令,也不是可运行的程序或批处理文件
这个报错明确告诉你,系统在 PATH 里找不到 conda 命令。如果刚才安装路径没有问题,大概率是安装目录加 PATH 的那行没写入.bashrc。手动加一下:
export PATH=$HOME/miniforge3/bin:$PATH source ~/.bashrc你还可以用which conda来定位 conda 的实际位置,确认它确实装在了$HOME/miniforge3/bin。
3.3 换源加速:阿里云、清华源配置实战
Jetson 在全球的网络环境中,下载 conda 包经常非常慢。实测下来,当前对 aarch64 表现最好的国内源是阿里云和清华源。配置方式:
conda config --add channels https://mirrors.aliyun.com/anaconda/pkgs/main/ conda config --add channels https://mirrors.aliyun.com/anaconda/pkgs/free/ conda config --set show_channel_urls yes清华源配置类似。但这里有个坑必须提醒:不要只配一条 pkgs/main 就完事,aarch64 有些包只有在 conda-forge 里才有,比如pytorch-cpu这类,所以我的 channels 结构是这样:
channels: - conda-forge - https://mirrors.aliyun.com/anaconda/pkgs/main/ - https://mirrors.aliyun.com/anaconda/pkgs/free/ - defaults优先级是 conda-forge 最高——conda 会优先从它找包,找不到再去阿里云。加了strictchannel priority 之后,可以减少包版本冲突的概率。
3.4 创建虚拟环境并处理 pip 源
PyTorch 的安装通常是用 pip 而不是 conda 直接装,所以我习惯先建一个干净的虚拟环境,再在环境内用 pip 装深度学习框架。创建环境的命令:
conda create -n yolo python=3.10 -y conda activate yolo如果你发现conda create非常慢,除了换源,还可以考虑用mamba替代 conda 来创建环境。Miniforge 默认带 mamba,直接用mamba create速度提升非常明显。Jetson 上创建环境的本质是下载大量 aarch64 包,之前的网络不好时,conda create -n yolo花了十几分钟都很正常,改用 mamba 后快很多。
激活环境后,顺手把 pip 源也换掉:
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ pip config set global.extra-index-url https://pypi.org/simple/extra-index-url必须要配,因为 PyTorch 的 wheel 有些是挂在官方源下的,只配阿里云源会找不到。
4. PyTorch 安装:Jetson 上为什么不能照搬 x86 的方法
4.1 为什么不能直接pip install torch
这是每个新人在 Jetson 上都会被卡住的问题。你在 x86 电脑上跑pip install torch会得到一个几个 GB 的 wheel,但在 AGX Orin 上直接这样装,通常报错是找不到匹配的版本,或者干脆装上去了 import 时崩掉。
原因在于 Jetson 是aarch64 架构,而官方 PyTorch wheel 默认只发布x86_64(部分版本也有aarch64的对外支持,但不是针对 Jetson 的 CUDA 12.x 定制版)。加上 Jetson 用的 GPU 是Ampere 架构(GA10B),其 CUDA capability 是 8.7,和桌面级 Ampere 显卡(8.0/8.6)不一样,所以 NVIDIA 专门为 Jetson 编译了一套 PyTorch 预编译包。
官方渠道给的安装方式是:从 NVIDIA 的 Jetson 仓库下载对应的 wheel,然后用 pip 安装。目前 JetPack 6.2.3 搭配的是 PyTorch 2.x 系列,比如 torch 2.3.x/2.4.x,对应 Python 3.10。
4.2 下载对应 JetPack 版本的 PyTorch wheel
一个比较稳的办法是直接到 NVIDIA 官方的 index 页下载:
# 在 conda 环境中执行 pip3 install torch~=2.4.0 --index-url https://download.pytorch.org/whl/test/cu121这里要看清,cu121表示 CUDA 12.1 版本。但 Jetson 上的 CUDA 版本是 12.x,且不同 JetPack 对应的版本号略有差异。JetPack 6.2.3 默认的 CUDA 版本是 12.6,所以你要装 torch 的 wheel 应该和 JetPack 6.2/6.3 的预编译版本匹配。如果你对这个版本敏感,更靠谱的是直接去 Jetson 官方的 PyTorch 仓库看有没有对应的.whl文件:
# NVIDIA Jetson PyTorch for JetPack 6.2 pip3 install torch torchvision --index-url https://developer.download.nvidia.com/compute/redist/jp/v62/pytorch/装的时候注意它需要 libpython 环境对齐,最好是先建好 conda 环境并激活,然后在里面执行上述命令,不要再系统 Python 里乱装。
4.3 验证安装和 GPU 识别
安装完别急着跑模型,先做个最小验证:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) print(torch.cuda.get_device_capability(0))如果输出True且设备名是AGX Orin,说明 PyTorch 已经成功接上 CUDA。接着跑一个简单的矩阵运算看 GPU 是否真的在工作:
x = torch.rand(1024, 1024, device='cuda') y = torch.mm(x, x) print(y.sum().item())这里补充一个关键点:PyTorch 的torch.cuda.is_available()只是判断 CUDA 驱动是否存在,并不代表算子都能跑通。我遇到过 wheel 版本和 CUDA 不匹配导致torch.mm直接报错的情况,所以建议大家装完一定要跑这个矩阵乘法验证。
4.4 torchvision 也要配套装
如果只装了 torch 不装 torchvision,后面跑 YOLO 会报ImportError: torchvision不全的问题。因为 ultralytics 在数据增强和 NMS 里大量用到 torchvision 的算子。
torchvision 同样要从 Jetson 仓库装,不能直接 pip:
pip3 install torchvision --index-url https://developer.download.nvidia.com/compute/redist/jp/v62/pytorch/安装后验证一下:
import torchvision print(torchvision.__version__)4.5 踩坑实录:numpy 版本冲突和 libstdc++ 缺失
我的经验里,Jetson 上 PyTorch 安装后最容易出的问题是numpy 版本不兼容。一些旧 wheel 期望 numpy 1.x,而 conda 默认装上的是 2.x,导致torch.from_numpy直接崩。解决办法是装完 torch 之后固定 numpy:
pip install "numpy<2.0" "numpy==1.26.4"另一个坑是libstdc++.so.6缺失或版本太旧。如果报这个错,说明系统自带的 libstdc++ 版本跟不上 wheel 带的 GLIBCXX 要求。可以检查:
strings /usr/lib/aarch64-linux-gnu/libstdc++.so.6 | grep GLIBCXX如果缺少高版本 GLIBCXX,就需要升级libstdc++6包:
sudo apt update sudo apt install --only-upgrade libstdc++6一般来说,JetPack 6.2.3 自带的 libstdc++ 是够新的,但如果你的系统是从 5.x 升级上来的,就容易出问题。
5. YOLO 部署:从预训练权重到 TensorRT 加速
5.1 ultralytics 环境搭建与预训练模型下载
装完 PyTorch 和 torchvision,接下来就是 YOLO。现在 YOLO 系列的官方实现基本都统一到ultralytics这个包里,支持 YOLOv5/v8/v11 等一大家子。安装很简单:
pip install ultralytics但要注意,ultralytics 的版本迭代很快,不同版本之间 API 会有微调。我当前装的是最新稳定版,导入后建议验证一下:
import ultralytics ultralytics.checks()预训练模型下载是另一个容易卡住的地方。ultralytics 默认从 GitHub Release 下载权重,国内网络环境经常超时。稳妥的办法是手动下载然后放到指定目录:权重文件需要放在项目目录下的weights/文件夹,文件名保持原名,然后加载时指定绝对路径。
mkdir -p weights # 这里把 yolo11n.pt(或你选的其他模型)下载到 weights/ 目录 python -c "from ultralytics import YOLO; model = YOLO('weights/yolo11n.pt')"如果下载太慢,可以用代理点或者从其他有权的镜像站下载后再传上去。权重文件不大,最常用的是 yolo11n.pt(约 6MB)、yolov8s.pt(约 22MB)这几个。
5.2 推理实操:图片、视频和摄像头流
环境就绪后,直接跑推理试试:
from ultralytics import YOLO model = YOLO("weights/yolo11n.pt") # 单张图片 results = model("test.jpg", device="cuda") results[0].show() # 视频文件 model.predict("test.mp4", device="cuda", save=True) # 摄像头实时检测 cap = cv2.VideoCapture(0) while cap.isOpened(): ret, frame = cap.read() if not ret: break results = model(frame, device="cuda") annotated = results[0].plot() cv2.imshow("YOLO", annotated) if cv2.waitKey(1) == ord('q'): break这里有几个性能调优参数:
device="cuda":强制使用 GPU,不传这个默认 CPU,在 Orin 上帧率会很难看。imgsz=640:默认输入尺寸,如果你做边缘部署想提速,可以降到 416,精度会有轻微损失。conf=0.25:置信度阈值,调高可以减少误检。iou=0.45:NMS 的 IoU 阈值。
推理 FPS 实测:yolo11n.pt 在 AGX Orin 上,MAXN 模式 + TensorRT 加速,大概能跑 100+FPS;不转 TensorRT 直接用 PyTorch,只有 30FPS 左右。所以为了实战部署,TensorRT 转换几乎是必须的。
5.3 TensorRT 导出与运行:把 PyTorch 模型变成 engine
ultralytics 提供了简单的导出接口:
model.export(format="engine", half=True, imgsz=640, workspace=1, device="cuda")导出的yolo11n.engine文件放到和模型权重同一个目录,推理时直接指定 engine:
model = YOLO("weights/yolo11n.engine") results = model("test.jpg", device="cuda")导出 engine 的这个过程实际会做 FP16 量化,把模型结构做图优化,几项融合。workspace=1表示最大可用的显存/内存大小(GB),Orin 上设成 1 或 2 都行。半精度推理是 Jetson 上的核心提速手段,因为 Ampere 架构的 Tensor Core 对 FP16 有专门的加速单元。
但这里有一个细节:TensorRT engine 和 PyTorch 的torch.cuda.is_available()没有关系,它不需要 torch 在运行期参与。所以导出成 engine 之后,运行环境其实可以不装 PyTorch,这对部署很友好,但部署机上 TensorRT 版本必须和导出机的版本一致或更新,否则直接报错。把你的板子和部署机都保持在 JetPack 6.2.3 就最省心。
5.4 训练相关话题:损失函数、BN 崩溃、混淆矩阵
搜索词里有很多关于 YOLO 训练的内容,我简单说几个在 Orin 上训练会遇到的点。
先讲损失函数。YOLOv8/v11 的损失由三部分组成:分类损失(BCE)、边界框回归损失(CIoU 或 DFL)、以及可选的置信度损失。你在训练日志里会看到cls_loss、box_loss、dfl_loss三项,它们按一定权重加起来就是总损失。如果 Loss 下降很慢,先看是不是学习率太高,或者数据集标签是否有问题。
再讲 BN 崩溃(Batch Normalization 崩溃)。这个词指的是训练中某个 batch 上 BN 的均值和方差突然剧烈波动,导致 loss 变成 NaN。在 Jetson 上训练小 batch 时特别容易碰到,因为 Orin 显存有限,你只能开小 batch。解决办法是:
- 扩大 batch size(或在单卡上做梯度累积)。
- 降低初始学习率。
- 确保没有 NaN 标签或损坏的图片数据。
- 如果用了预训练模型,冻结 backbone 前几层,减少 BN 统计量剧烈变化。
混淆矩阵总合不唯一这个问题,通常是多标签或多类别数据集中,某些类别没有出现在 GT 或预测中,导致矩阵行和列之和看起来不对。用 ultralytics 自带的metrics.confusion_matrix()时,注意 un_cls 那一列表示背景/未分类,排布方式会和你在论文里看到的不一样,别当成 bug。
5.5 YOLO 在 Orin 上的最佳实践:DLA 与多模型并行
除了 TensorRT,AGX Orin 还有一个特殊硬件单元DLA(Deep Learning Accelerator)。DLA 是 NVIDIA 的专用深度学习推理加速器,算力略低于 GPU,但功耗极低,适合同时跑多个模型。TensorRT 导出时可以指定 DLA:
model.export(format="engine", imgsz=640, device="cuda", dynamic=True, dla_core=0)但注意,DLA 对算子支持有限,像 YOLO 的很多自定义算子不一定能在 DLA 上跑。如果 DLA 导出失败,别纠结,老实跑 GPU。实际部署中我倾向于一个方案:YOLO 检测跑 GPU,其他轻量模型(比如分类器)放 DLA,两者并行吞吐量更高。
多模型并行时的显存分配也要注意。Orin 统一内存最多 64GB,如果同时跑两个 PyTorch 模型,torch.cuda.memory_summary()可以看出显存占用情况。系统不会自动限制每个进程的显存,所以多个进程同时占用时可能 OOM。稳妥的做法是给每个进程设置环境变量CUDA_VISIBLE_DEVICES=0(Orin 只有一块 GPU,这个变量主要是因为有些容器场景),或者使用 IPC 限制整体显存。
6. 常见问题与排查技巧实录:刷机到部署全链路速查表
最后把这一路踩过的坑整理成一个速查表,按流程阶段组织。这些都是在真实的使用环境中遇到过的,不是文档里直接抄的,大家可以对照排查。
| 场景/阶段 | 现象 | 原因分析 | 解决方案 |
|---|---|---|---|
| 刷机 | lsusb看不到 APX 设备 | USB 线只供电不传数据,或未正确进恢复模式 | 换线重试,重新检查 Recovery 按钮按住的时机 |
| 刷机 | SDK Manager 下载很慢 | 官方 CDN 到本地网络不稳定 | 提前下载好压缩包,用--offline方式安装 |
| 刷机 | 刷到一半 “Get Flash Quit” | 磁盘布局或镜像损坏 | 重新下载驱动包,或换直刷模式 |
| conda | conda不是内部或外部命令 | PATH 环境变量未配置 | 手动在.bashrc添加export PATH=$HOME/miniforge3/bin:$PATH |
| conda | conda activate报 CommandNotFoundError | 未执行conda init | 执行conda init bash后重新加载 shell |
| conda | 创建环境非常慢 | 源网络差或架构包索引太大 | 切换 mamba 加快,或配置好国内镜像通道 |
| PyTorch | pip install torch报找不到版本 | aarch64 上没有官方 x86 wheel | 用 NVIDIA Jetson 仓库的 wheel 安装 |
| PyTorch | torch.cuda.is_available() 为 False | CUDA 库路径未找到 | 检查ldconfig -p是否有 cuda 库,必要时sudo ldconfig |
| PyTorch | numpy 导致from_numpy报错 | numpy 2.x 不兼容部分旧 wheel | 固定numpy==1.26.4 |
| YOLO | 推理只有十几帧 | 没转 TensorRT 或没开 MAXN 模式 | 转 engine,执行nvpmodel -m 0 && jetson_clocks |
| YOLO | train 时 loss = NaN | 标签损坏 / 梯度爆炸 / 学习率过高 | 检查数据集,降低 lr,冻结 backbone,加梯度裁剪 |
| YOLO | 导出 engine 失败 | 内存不足或算子不支持 | 减小workspace,必要时放弃 DLA,只用 GPU |
| 系统 | 重启后性能恢复低功耗 | nvpmodel 状态不持久 | 写 systemd 服务自动执行nvpmodel -m 0 && jetson_clocks |
| 系统 | 磁盘空间告急 | eMMC 系统盘太小 | 重新刷机到 NVMe,或清理 apt/pip 缓存 |
再分享两个独家技巧:
技巧一:把 conda 环境目录复制到另一块板子。配好环境后,可以直接conda pack打包整个虚拟环境,然后到另一台同型号 Jetson 上解压使用。前提是两台的 JetPack 大版本一致,否则 PyTorch 和 TensorRT 版本不同会出问题。这个技巧对实验室批量部署特别有用。
技巧二:用 Docker 替代 conda。NVIDIA 官方提供了很多 JetPack 容器的预编译镜像,里面已经配好了 PyTorch、TensorRT 等。如果你的使用场景可以容器化,强烈建议直接用容器,省去刷机和环境配置的烦恼。但注意,容器还是要基于宿主机的 JetPack 版本,宿主系统还是要先刷到对应版本,容器的优势在于隔离和复用。
在 Jetson 上做深度学习的完整链路,说到底就是“刷机-环境-框架-部署”四个环节。刷机这一关过了,环境配好了,之后就是顺利成章的事情。我自己经过这一轮完整的折腾,最大的体会是:Jetson 的坑多数不是性能问题,而是版本匹配问题。PyTorch 要匹配 CUDA,CUDA 要匹配 JetPack,TensorRT 也要匹配 JetPack,每一个环节都是版本对应的关系。所以在你跟着任何教程操作之前,先看清楚教程对应的 JetPack 版本,不要拿 5.x 的经验硬套 6.x。如果按照本文的顺序操作一遍,你的 AGX Orin 应该能直接从裸机变成一个能跑 YOLO 的完整 AI 开发平台。