4.7 模型导出与边缘部署

为什么这很重要

在上一章中,我们介绍了如何训练一个自定义的 YOLO 模型,并成功在 Jetson 上运行推理。在那个阶段,模型仍然以 .pt 格式存储,这是 PyTorch 生态中常用的原生格式。这是一个良好的起点,因为它证明了训练结果是正确的,并且模型已经能够在目标设备上完成目标检测。

在上一章中,我们介绍了如何训练一个自定义的 YOLO 模型,并成功在 Jetson 上运行推理。在那个阶段,模型仍然以 .pt 格式存储,这是 PyTorch 生态中常用的原生格式。这是一个良好的起点,因为它证明了训练结果是正确的,并且模型已经能够在目标设备上完成目标检测。

image-20260402114356086

然而,模型能够在 Jetson 上运行,并不意味着它已经处于最佳的部署形态。.pt 文件主要为训练、验证和开发而设计,在那种场景下,灵活性比执行效率更重要。而对于真正的边缘部署,尤其是在 Jetson 这样的嵌入式平台上,我们关心的远不只是模型能否运行。我们还关心它的运行速度、内存消耗、吞吐量是否稳定,以及它能否适应设备的功耗与散热限制。

image-20260402114750724

换句话说,训练好的检查点只是部署流水线的一部分。要让 YOLO 模型真正适用于实际的 Jetson 应用,通常需要将其转换为更适合部署的格式,并针对嵌入式推理进一步优化。这是连接计算机视觉开发边缘工程的关键一步。

因此,训练完模型之后,下一个重要问题不只是"它能跑吗?",而是 "它能在 Jetson 上高效运行吗?" 要回答这个问题,我们需要先理解为什么模型优化是必要的。


为什么需要模型优化?

模型优化是必要的,因为最初训练得到的模型通常并未针对嵌入式硬件的约束进行设计。在训练过程中,主要目标是获得良好的精度和收敛性。然而在部署阶段,目标发生了变化。我们需要模型提供快速推理、低延迟、高吞吐、低内存占用以及良好的功耗效率

image-20260402115153469

这一点对 Jetson 设备尤为重要。与桌面 GPU 或云端服务器相比,Jetson 平台的计算资源、内存带宽和功耗预算更加有限。在许多边缘 AI 场景中,例如机器人、智能摄像头、工业检测或自动驾驶系统,模型必须能够实时处理数据。如果推理太慢,系统可能会丢帧、响应过迟,或无法满足应用的需求。

直接以 .pt 格式运行 YOLO 模型,通常会引入 PyTorch 运行时带来的不必要开销。虽然这种方式便于测试和原型开发,但并不适合从 Jetson 硬件中榨取出最高性能。模型也许能够正确运行,但可能未能尽可能高效地利用 GPU。结果是延迟可能仍然较高、吞吐受限,资源占用也可能高于必要水平。

模型优化有助于解决这些问题。通过将模型导出并针对推理进行优化,我们可以改进网络在目标硬件上的执行方式。这可能包括减少冗余操作、融合层、选择更高效的内核、将精度从 FP32 降为 FP16 或 INT8,以及优化内存使用。这些优化能在不改变模型整体任务的前提下,显著提升部署性能。

对于 Jetson 部署,优化带来了若干切实的好处:

1. 更低的延迟

模型更快意味着每一帧输入可以被更快地处理。这对于目标检测和跟踪等实时任务至关重要。

2. 更高的吞吐量

优化使系统能够处理更多每秒帧数,这对于视频分析和多路流应用非常重要。

3. 更低的内存占用

嵌入式设备的内存资源有限。经过优化的模型可以减少内存占用,提升系统稳定性。

4. 更好的功耗效率

Jetson 设备常用于关注功耗的边缘环境。更高效的模型可以让系统运行得更久、更可靠。

5. 更好地利用硬件

优化使模型能够更充分地利用 NVIDIA GPU 加速,而不是过度依赖通用框架的执行方式。

出于这些原因,模型优化不仅是一个可选的改进,它是将训练好的 YOLO 模型转化为可在真实部署环境中高效运行的实用边缘 AI 解决方案的必要步骤。


什么是 TensorRT?

image-20260402181431191

TensorRT 是 NVIDIA 推出的高性能深度学习推理框架与运行时。它专门用于优化训练好的神经网络,并在包括 Jetson 设备在内的 NVIDIA 硬件上高效执行它们。

简单来说,TensorRT 是一个工具,可以帮助将训练好的模型转换为更适合部署的形式。TensorRT 不是通过通用的深度学习框架来运行模型,而是构建一个针对目标 NVIDIA GPU 量身定制的优化推理引擎。这使得模型能够运行得更快、更高效。

img

对于 Jetson,TensorRT 在部署中扮演着核心角色,因为它能够充分利用 NVIDIA 嵌入式 GPU 的能力。它可以执行多种优化,例如:

  • 层融合,将多个操作合并为更高效的执行路径
  • 内核自动选择,为硬件挑选最佳实现
  • 精度优化,例如 FP16 或 INT8 加速
  • 内存优化,减少不必要的内存搬运并提升运行时效率

因此,与直接运行原始 .pt 模型相比,TensorRT 可以显著提升 YOLO 模型的推理性能。

image-20260402182425008

一种常见的 Jetson 部署工作流如下所示:

PyTorch .pt 模型 -> ONNX 模型 -> TensorRT 引擎 -> Jetson 推理

在这个流程中:

  • .pt 模型 是训练得到的结果
  • ONNX 模型 是一种中间交换格式
  • TensorRT 引擎 是用于在 Jetson 上推理的、经过优化的部署产物

这一过程表明,TensorRT 不仅仅是一个转换器,更是嵌入式 AI 部署中关键的优化与执行层。

从工程角度看,TensorRT 之所以重要,是因为它可以把一个仅仅是可训练、可测试的模型,转变为一个真正可部署且高效的模型。对 Jetson 用户来说,TensorRT 通常是实现实用级实时性能最重要的一步。

换句话说,训练好的检查点只是部署流水线的一部分。要让 YOLO 模型真正适用于实际的 Jetson 应用,通常需要将其转换为更适合部署的格式,并针对嵌入式推理进一步优化。这是连接计算机视觉开发边缘工程的关键一步。

常见模型格式

格式主要作用
PyTorch checkpoint灵活,适合训练与实验
ONNX可移植的中间格式
TensorRT engine针对 NVIDIA 硬件优化的运行时格式

精度 vs 速度 vs 功耗

更精确的模型通常更大、更慢、消耗更多功率,而更快的模型通常更轻量但精度较低。因此在实际部署中,我们必须找到适合设备和任务的平衡点。边缘部署始终关乎权衡。

你常常需要在以下方面做平衡:

  • 模型精度
  • 推理速度
  • 内存占用
  • 散热与功耗限制

精度模式

模型精度指的是模型内部用多少比特来存储数值,例如权重和激活值。更高的精度,如 FP32,保留更多的数值细节;而较低的精度,如 FP16INT8,使用的比特更少。较低的精度可以让推理更快,占用更少内存,这在 Jetson 等边缘设备上非常有帮助。但如果精度降得太低,模型可能会损失一些准确性,因此我们需要在速度与可靠性之间取得平衡。

代码示例

导出为 ONNX

bash
yolo export model=yolo26s.pt format=onnx imgsz=640

在 Jetson 上导出为 TensorRT

bash
yolo export model=yolo26s.pt format=engine imgsz=640 half=True device=0

实用的 Jetson 运行时命令

bash
#turn on max mode
sudo nvpmodel -m 0
#turn on jetson clocks
sudo jetson_clocks

动手试试

bash
cd 4.7-Model-Export-and-Edge-Deployment/code
python compare_yolo26_pt_vs_engine.py --video ./cat.mp4

🚀 观察经过优化后的模型在推理延迟上的变化

4月3日

常见误解

  • "如果模型成功导出了,部署就解决了。"
    • 导出只是其中一步,运行时验证依然重要。
  • "最快的模型一定是最好的模型。"
    • 如果一个更快的模型遗漏了重要场景,它就没有意义。
  • "INT8 总是优于 FP16。"
    • INT8 可能很强,但前提是精度仍然可接受。

练习 / 思考

  1. 将一个训练好的模型导出为 ONNX,并记录命令。
  2. 用文字比较 checkpointONNXTensorRT engine 各自最适合的用途。
  3. 设想一个模型很准确但太慢的情况,列出三种让部署更实用的方法。
  4. 解释为什么功耗模式在边缘设备上很重要。

总结

模型导出和边缘部署不是事后才考虑的事情,它们是完整的计算机视觉工作流的一部分。学习者在掌握了数据、训练和评估之后,下一个挑战就是将该模型转换为适合真实硬件的实用形态。

建议的下一步

继续阅读 4.8 实时视觉流水线框架

参考资料