2. Jetson平台与模型部署基础
在 Jetson 上部署一个模型,真正决定“能不能跑、跑多快、跑多久”的,往往不是模型本身,而是它下面那一整套软件栈的版本是否匹配。Jetson 的软件体系可以理解为一条自底向上的依赖链:最底层是 L4T(Linux for Tegra),它提供针对 Tegra SoC 的 Linux 内核、引导固件、驱动与根文件系统;在 L4T 之上是 JetPack SDK,它把 L4T、CUDA、cuDNN、TensorRT、VPI、多媒体 API 等打包成一个可刷写的整体;再往上才是 CUDA 运行时、TensorRT 推理引擎,以及最终由 TensorRT 加载执行的模型。理解这条链的版本对应关系,是后续做模型版本治理与 OTA 交付的前提。
一、核心组件的层级与版本绑定关系
Jetson 各组件并非彼此独立升级,而是存在严格的“配套”关系。以 Jetson Orin 系列常用的 JetPack 5.1.2 为例,它对应的 L4T 版本是 35.4.1,CUDA 为 11.4,cuDNN 为 8.6,TensorRT 为 8.5.2。如果单独把 TensorRT 升到 8.6,而 L4T 仍是 35.4.1,就可能出现 CUDA 运行时符号不匹配、插件加载失败等问题。因此在实际工程中,通常以 JetPack 版本号作为整个软件栈的“锚点”,其余组件版本由它决定。
下表给出一个示例性的版本对应关系,用于说明这种绑定结构(具体数值以 NVIDIA 官方发布说明为准,此处仅作教学示例):
| JetPack | L4T | CUDA | cuDNN | TensorRT | 适用平台 |
|---|---|---|---|---|---|
| 5.1.2 | 35.4.1 | 11.4 | 8.6 | 8.5.2 | Orin / Xavier |
| 6.0 | 36.3 | 12.2 | 8.9 | 8.6.2 | Orin |
| 4.6.4 | 32.7.4 | 10.2 | 8.2 | 8.2.1 | Xavier / Nano |
可以看到,JetPack 6.0 把 CUDA 从 11.x 提升到 12.x,TensorRT 也随之进入 8.6 分支。这意味着一个在 JetPack 5.1.2 上用 TensorRT 8.5 构建并序列化出来的 .plan 引擎文件,通常不能直接在 JetPack 6.0 上加载,因为 TensorRT 的序列化格式与内部算子实现会随版本变化。这是模型版本治理中必须记录“构建环境”的根本原因。
二、模型在边缘设备上的运行形态
在 Jetson 上,模型通常不会以原始训练框架格式直接运行。典型路径是:训练侧导出 ONNX,部署侧用 TensorRT 的 trtexec 或 Python API 解析 ONNX,做层融合、精度校准、内核选择,最终序列化成一个 .plan 文件。这个 .plan 就是边缘设备上真正加载的“运行形态”。它内部已经固化了目标平台的 SM 架构、TensorRT 版本、精度模式(FP32/FP16/INT8)以及 DLA 卸载策略。
以 Orin 为例,DLA(Deep Learning Accelerator)是独立于 GPU 的固定功能推理加速器。把卷积、池化等层卸载到 DLA,可以显著降低 GPU 占用,让 GPU 同时处理其他任务。但 DLA 对算子类型和精度有严格限制,例如某些动态 shape 或自定义插件无法在 DLA 上执行。因此构建引擎时通常需要显式指定 --useDLACore=0 并配合 --allowGPUFallback,让不支持的层回退到 GPU。
# 示例:在 Jetson Orin 上构建 TensorRT 引擎(教学示例)
trtexec --onnx=model.onnx \
--saveEngine=model_fp16.plan \
--fp16 \
--useDLACore=0 \
--allowGPUFallback \
--workspace=2048
# 运行引擎并查看性能
trtexec --loadEngine=model_fp16.plan --iterations=100 --avgRuns=10
执行后,trtexec 会输出吞吐量、延迟、各层耗时以及 DLA 与 GPU 的层分配情况。如果发现大量层回退到 GPU,说明 DLA 利用率不足,可能需要调整模型结构或精度模式。这些输出正是判断“模型是否以预期形态运行”的直接依据。
三、版本治理视角下的关键记录项
从模型版本治理与 OTA 交付的角度看,一个可部署的模型包至少应记录以下信息:构建时使用的 JetPack/L4T 版本、TensorRT 版本、CUDA 版本、精度模式、DLA 配置、输入输出张量形状与数据类型、以及引擎文件的哈希值。缺少任何一项,都可能导致在另一台设备上加载失败或性能不达预期。
总结来说,Jetson 上的模型部署不是“把模型拷进去”这么简单,而是要把模型编译成与目标软件栈严格匹配的引擎形态,并在版本治理中完整记录构建上下文。只有把 L4T、CUDA、TensorRT、DLA 这条链的版本关系理清楚,后续的模型版本管理、灰度发布与 OTA 回滚才有可靠的基线。