ARTICLE DETAIL

资讯详情

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

Jetson Orin Nano上YOLOv8部署实战:TensorRT加速与性能调优

Jetson Orin Nano上YOLOv8部署实战:TensorRT加速与性能调优 时间回到我入手 Jetson Orin Nano 的第一个月。当时我已经在 PC 上用 YOLOv8 训练了一套自己的检测模型信心满满地把代码拷到板子上以为改个路径就能跑。结果 PyTorch 推理每秒只有两三帧风扇倒是转得很欢。那一刻我才意识到边缘设备上做目标检测真正的分水岭不在于“模型能不能跑”而在于“模型能不能跑快”。这篇文章就围绕这个目标展开从 Jetson Orin Nano 的环境搭建、PyTorch 模型到 TensorRT 引擎的完整转换链路到 FP16/INT8 量化、批量推理、多流并行这些实打实的调优手段最后附上我测过的数据对比和踩坑记录。适合手里正好有板子、想把 YOLOv8 真正部署起来的人也适合正准备选型边缘硬件、想评估这套方案性价比的朋友。我会把每一步为什么要这么做、参数怎么定、出了问题怎么查都讲清楚尽量让你跳过那些我替你先踩过的坑。1. 定位这台板子和这个模型为什么要选这个组合1.1 Orin Nano 在边缘部署里的“卡位”Jetson Orin Nano 是 NVIDIA Jetson 家族里的入门级型号但它和上一代 Xavier NX 之间的性能差距并不小。以 8GB 版本为例官方标称算力 40 TOPSINT8 稀疏算力这个数字在边缘设备里相当能打关键是它的功耗墙可以从 7W 拉到 15W 甚至 25W也就是说你能在“省电模式”和“性能模式”之间做选择。我实测下来的感受是7W 模式下风扇不转、适合长期挂机做巡检25W 模式下性能明显释放但散热必须跟上。选择 Orin Nano 而不是树莓派或 RK3588核心原因在于 CUDA 生态。YOLOv8 训练和部署中间的转换链路——PyTorch、ONNX、TensorRT几乎每一步都在 NVIDIA 的地盘里。虽然 RK3588 也有自己的 NPU 工具链但如果你希望“训练用 GPU、部署用 TensorRT、出了问题社区里一搜就有答案”Jetson 平台的学习曲线会平缓很多。更关键的是TensorRT 对 YOLO 系列的支持非常成熟甚至可以直接把带 NMS 后的输出层一起优化这是很多边缘 NPU 工具箱目前还做不到的。1.2 YOLOv8 好在哪不只是精度提升YOLOv8 是 Ultralytics 出的检测框架相比 YOLOv5它在结构上引入了 C2f 模块和 Anchor-Free 的检测头训练收敛更快mAP 也高一些。但从部署角度看我最看重的是它export命令的完备性。一条命令就能导出 ONNX、TensorRT、CoreML、TFLite而且导出的 ONNX 结构非常干净没有乱七八糟的自定义算子这对后面转 TensorRT 引擎非常重要。另一个容易忽略的点是 YOLOv8 的模型规格设计。n、s、m、l、x 五个规格里在 Orin Nano 这种算力介于“够用”和“紧张”之间的设备上n 和 s 是主流选择。拿 YOLOv8s 来说参数量 11.2M输入 640x640转换成 TensorRT FP16 引擎后在 Orin Nano 上能跑到 40~60 FPS这个性能足够覆盖绝大多数实时检测场景。如果你有更高的精度要求可以上 m如果对速度极度敏感n 在 INT8 量化后能跑到上百 FPS。1.3 这套组合适合什么场景从我接触到的项目来看Jetson Orin Nano YOLOv8 最常出现在这几类应用中一是工业质检比如基于 YOLOv8 的咖啡豆成熟度检测系统这一类通常检测目标小、背景杂需要在 640 甚至 1280 分辨率下跑二是路口车流量统计系统对持续运行稳定性要求高对单帧延迟要求不那么极端三是移动巡检机器人和无人机这类场景对功耗和重量敏感Orin Nano 的 7W 模式就很合适。还有一个我在帮朋友做的项目是果园成熟度监测摄像头装在太阳能供电的杆子上晴天功率够就跑到 25W阴天降频到 7W这种动态功耗调整在 Jetson 上实现起来比较顺手。所以选这个组合本质上是在“生态成熟度”“性能上限”“功耗控制”三者之间找到了一个平衡点。2. 环境搭建JetPack 版本决定你后面少踩多少坑2.1 JetPack 选 5.1.2 还是 6.0这是整个部署流程里最容易忽略、也最影响后续体验的决策。Jetson 的软件栈不像普通 Linux 那样可以随意装最新版它要求底层的 L4TLinux for Tegra内核、CUDA、cuDNN、TensorRT 必须作为一个整体即 JetPack统一升级。你单独装一个最新版 TensorRT很可能会把整个环境搞坏。我推荐新手直接选 JetPack 5.1.2也就是底层带 CUDA 11.4、TensorRT 8.5.2 的版本。原因很朴素PyTorch 官方为 Jetson 提供的预编译 wheel 对这版支持最成熟网上能找到的部署教程和踩坑帖子也基本基于这个版本。JetPack 6.0 虽然基于 Ubuntu 22.04、CUDA 12.2但当时我尝试时发现部分第三方库还没完全适配比如有些基于 PyTorch 的老项目会出现编译错误。如果你不是特别需要新特性在 5.1.2 上做部署会顺很多。# 查看当前 JetPack 版本 cat /etc/nv_tegra_release sudo apt list --installed | grep nvidia-tensorrt刷机方面我建议用 SDK Manager 配合原装 USB-C 线刷别图省事用 SD 卡镜像。SD 卡方式容易出现分区异常、启动黑屏之类的问题排查起来很费时间。刷完机后第一时间连网线因为后面要装十几个依赖包Wi-Fi 不稳定会让你怀疑人生。2.2 Python 环境与 PyTorch 安装到手后的系统默认是 Ubuntu 20.04JetPack 5.x 对应系统自带 Python 3.8。这里有个原则不要动系统 Python用虚拟环境隔离项目依赖。我习惯用virtualenv不用 conda因为 conda 在 aarch64 架构上的源不完整装 torch 经常碰到不兼容。PyTorch 的安装是整个环境搭建里最“劝退”的一步。Jetson 是 ARM 架构不能直接pip install torch装 x86 的版本必须用 NVIDIA 官方为 Jetson 编译的 wheel 文件。这些 wheel 发布在 NVIDIA 官方论坛的 Jetson 板块文件名格式通常是torch-2.1.0a0...nv23.06-py3-none-linux_aarch64.whl注意aarch64这个标识。# 示例安装匹配 JetPack 5.1.2 的 PyTorch pip install torch2.1.0a041361538.nv23.06 \ --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v512安装完 PyTorch 后还要装对应版本的 TorchVision。这里有个特别容易踩的坑TorchVision 的版本必须和 PyTorch 版本严格匹配否则导入阶段就会报类似undefined symbol的错。你可以从 NVIDIA 的 wheel 索引里找到对应的torchvision版本或者直接编译源码。编译源码需要先安装libjpeg-dev、python3-dev这些依赖大概要十几分钟但一次装对之后基本不会再出问题。2.3 验证环境是否正常装完之后别急着建模型先快速验证一下 PyTorch 能不能调用 CUDA。很多人在这一步发现 PyTorch 装上了但torch.cuda.is_available()返回 False原因通常是 wheel 版本和 JetPack 的 CUDA 版本不匹配。另一种情况是返回 True但第一次执行 GPU 运算时崩了那大概率是 cuDNN 动态库路径没配好。import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) # 建议跑一个小的矩阵乘法确认能真正执行 CUDA 运算 x torch.randn(1024, 1024, devicecuda) y torch.mm(x, x) print(y.sum().item())顺手再装好 ultralytics 包。这里我建议用pip install ultralytics装当前稳定版就行不用刻意追求最新。你训练模型时用的 ultralytics 版本和板子上部署用的版本最好保持一致因为不同版本的导出 ONNX 结构可能有差异后处理逻辑也可能微调过。3. 模型转换从 pt 到 TensorRT 引擎的每一步3.1 为什么要绕道 ONNX很多人一开始不理解为什么不能直接把.pt文件放到板子上用 TensorRT 加载原因是 TensorRT 的输入格式是它自己定义的 engine 文件它需要先对计算图做“解析、融合、优化”三步操作才能生成针对特定 GPU 架构的二进制引擎。PyTorch 的.pt文件是基于 Python 对象序列化的TensorRT 没法直接读而 ONNX 是计算图的标准中间表示TensorRT 的原生解析器可以直接消费。所以标准的转换链路是.pt→.onnx→.engine。ONNX 在这个链路里起到“翻译官”的作用——它把 PyTorch 的动态图结构固化成静态的计算图TensorRT 再在这个静态图上做算子融合、精度选择、显存复用等优化。这也是为什么有些人说“TensorRT 的优化是在 ONNX 层面的”理解这一点你就知道 ONNX 导得好不好直接决定了后面 engine 的性能上限。3.2 导出 ONNX 时的三个关键参数用 Ultralytics 官方导出命令导出 ONNX 非常方便但有几个参数值得认真对待。首先是opset。ONNX 的算子版本要和 TensorRT 解析器匹配JetPack 5.1.2 自带的 TensorRT 8.5 对 ONNX opset 12~17 都有不错的支持。我建议用 12因为这是经过最多验证的版本如果你用了 YOLOv8 的某些新特性可能要升到 16 或 17但在 TensorRT 8.5 上偶尔会有算子不兼容的问题。其次是动态尺寸dynamicTrue。如果你不确定部署时的输入分辨率会不会变比如检测场景需要 640x640识别场景需要 960x960动态尺寸可以让你在推理阶段自由指定输入长宽。但代价是引擎的优化不如固定尺寸深入且会占用更多显存。我的建议是固定尺寸优先。像做一个固定机位的安全帽检测输入分辨率永远不变那就别开动态性能更好还省显存。第三个参数是simplify配合 ONNX-Simplifier 使用。导出的 ONNX 里常常有一些冗余的 reshape 和 transpose 节点这些不会影响结果但会给 TensorRT 的解析带来额外开销。用onnxsim简化完后有些模型构建引擎的时间能缩短三分之一。pip install onnx onnxsim yolo export modelyolov8s.pt formatonnx opset12 dynamicFalse simplifyTrue导出完后建议用onnx.checker检查一下模型完整性再可视化看一眼计算图结构确保输出节点的个数和顺序符合你的预期。3.3 用 trtexec 构建引擎拿到 ONNX 之后就可以用 TensorRT 自带的trtexec工具构建引擎了。这个命令行工具是 TensorRT 的瑞士军刀我能不用代码就不写代码。/usr/src/tensorrt/bin/trtexec \ --onnxyolov8s.onnx \ --saveEngineyolov8s_fp16.engine \ --fp16 \ --workspace2048 \ --minShapesimages:1x3x640x640 \ --optShapesimages:1x3x640x640 \ --maxShapesimages:1x3x640x640--fp16是启用半精度推理。TensorRT 会把支持 FP16 的层转换成半精度计算速度提升明显而精度损失对检测任务来说通常可接受。--workspace是构建引擎时允许使用的显存上限单位是 MB设大一点可以让 TensorRT 尝试更多的融合策略但注意不是越大越好构建完引擎后运行时的显存占用和这个参数不直接相关。引擎构建完成后trtexec会自动跑一遍推理并输出性能报告重点看GPU Compute Time和Throughput这两列。我第一次看到 FP16 比 FP32 快了一倍多时才真正理解为什么大家说 TensorRT 是部署性能的第一生产力。3.4 TensorRT 推理脚本完整示例引擎文件是平台相关的不能跨设备拷贝使用也就是说你需要在这块板子上构建引擎。构建完引擎后推理代码就不需要依赖 PyTorch 了只需要 TensorRT 和 OpenCV。下面是一个最小可运行的推理脚本骨架我用它跑通了整个流程import cv2 import numpy as np import tensorrt as trt import pycuda.driver as cuda import pycuda.autoinit class TRTInference: def __init__(self, engine_path, input_shape(640, 640)): self.input_shape input_shape self.logger trt.Logger(trt.Logger.WARNING) with open(engine_path, rb) as f, trt.Runtime(self.logger) as runtime: self.engine runtime.deserialize_cuda_engine(f.read()) self.context self.engine.create_execution_context() self._allocate_buffers() def _allocate_buffers(self): # 根据 engine 的绑定信息分配输入输出 buffer self.inputs, self.outputs, self.bindings [], [], [] for i in range(self.engine.num_bindings): name self.engine.get_binding_name(i) shape self.engine.get_binding_shape(i) size trt.volume(shape) dtype trt.nptype(self.engine.get_binding_dtype(i)) host_mem cuda.pagelocked_empty(size, dtype) device_mem cuda.mem_alloc(host_mem.nbytes) self.bindings.append(int(device_mem)) if self.engine.binding_is_input(name): self.inputs.append({host: host_mem, device: device_mem, shape: shape}) else: self.outputs.append({host: host_mem, device: device_mem, shape: shape}) def infer(self, image): # image 是已经过 letterbox 等预处理的 RGB 图 np.copyto(self.inputs[0][host], image.ravel()) cuda.memcpy_htod(self.inputs[0][device], self.inputs[0][host]) self.context.execute_v2(self.bindings) cuda.memcpy_dtoh(self.outputs[0][host], self.outputs[0][device]) return self.outputs[0][host].copy() # 使用示例 model TRTInference(yolov8s_fp16.engine) img cv2.imread(test.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # letterbox 处理 归一化 CHW 格式省略细节 input_tensor preprocess(img_rgb, (640, 640)) output model.infer(input_tensor) # 后处理解析 1x84x8400 输出做 NMS省略细节 boxes postprocess(output)注意这个脚本只是骨架实际使用中要在preprocess里做 letterbox保持长宽比缩放后填充灰边并在postprocess里做解码和 NMS。YOLOv8 的输出是1x(480)x8400COCO 80 类其中 4 是 box 的 cx、cy、w、h80 是类别概率这个格式和 YOLOv5 的1x25200x85不一样写后处理时小心被旧代码带偏。4. 性能调优拿到引擎后还能榨出多少性能4.1 先摸清基线数据做性能调优的第一步不是上手就调参数而是先构建一套稳定的基准测试环境。我建议把摄像头输入、图像预处理、NMS 后处理等都固定下来单独测推理引擎的延迟再测端到端的延迟这样才能定位瓶颈究竟在引擎还是在预处理。我的测试顺序是先跑trtexec自带的性能报告拿到纯 GPU 计算时间然后跑 Python API 推理脚本看单次推理耗时最后接上实时视频流看端到端的 FPS。三步数据一对比经常能发现“引擎本身只要 15ms但 Python 里总共花了 40ms”的情况——这种差距通常来自预处理和后处理的 CPU 开销。在我最初的原生 PyTorch 测试里YOLOv8s 在 Orin Nano 上推理一帧要 100ms 以上转成 TensorRT FP16 后降到 20ms 左右足足五倍差距。这个提升在部署阶段是决定性的也说明 TensorRT 优化不是“锦上添花”而是“必选项”。4.2 FP16 与 INT8精度和速度的博弈FP16 是性价比最高的选择操作简单收益巨大。但如果你想在 Orin Nano 上跑 YOLOv8m 还要实时INT8 量化可能是绕不开的路。INT8 量化的原理是把 FP16 的权重和激活值用 8 位整数表示计算速度和吞吐量进一步提升显存占用也降到 FP16 的一半。但它的难点在于需要校准数据集。TensorRT 的 INT8 校准器会统计每一层激活值的数值分布从而确定量化范围如果校准数据选得不好模型的检测精度可能明显下降。# trtexec 启用 INT8 的方式 /usr/src/tensorrt/bin/trtexec \ --onnxyolov8s.onnx \ --saveEngineyolov8s_int8.engine \ --int8 \ --calibrator/path/to/calib_cache \ --calibImages/path/to/images \ --calibBatchSize8用trtexec做 INT8 时校准数据一般需要几百张到几千张典型场景的图片。我习惯从训练集里抽 500 张覆盖各种光照、目标大小和遮挡情况的图保存成校准缓存文件之后构建引擎都可以复用。第一次跑 INT8 时建议用同一批测试集对比 FP16 和 INT8 的 mAP 变化。我在一个安全帽检测项目里INT8 的 mAP 只掉了 0.8%但速度提升了接近 40%这种收益在实时场景里非常值得。不过要提醒的是INT8 在 YOLOv8 的小模型上表现更稳定。如果你用的是 YOLOv8x量化后容易出现个别类别召回率骤降的情况这时候可以用“敏感层保留 FP16”的混合量化方案但调试成本会上升新手还是建议先 FP16 跑通。4.3 输入尺寸与批处理被忽略的显性调参项很多人调优时只盯着量化忽略了输入尺寸这个最直接的旋钮。YOLOv8 的模型在 640x640 下训练但这不代表部署时一定只能用 640。如果你的目标物偏大、场景简单比如仓库门口的车牌识别用 416x416 甚至 320x320 输入速度能提升近一倍精度下降却微乎其微。我在咖啡豆成熟度检测项目里做过对比640x640 下 YOLOv8s FP16 约 45 FPS改成 480x480 后能到 70 FPS检测小目标的能力有一定下降但对咖啡豆这种中等大小目标影响不大。建议你做一个简单的脚本把测试集在两个分辨率下各跑一遍对比 mAP 和 FPS找到最适合自己场景的平衡点。批处理是另一个容易被忽略的点。如果你做的是离线分析——比如批量处理一批图片或视频文件而不是实时摄像头流可以一次喂入多张图。TensorRT 对 batch size 为 4 或 8 的输入会做更激进的算子融合和显存复用单张平均耗时能再降一截。但实时推理时我们要的是“单帧延迟”批处理反而会增加延迟所以这个方法要分场景用。4.4 进阶优化流并行、显存池和 CUDA Graph当前面几板斧都试过之后还有几个可以继续榨性能的方向。一个是用多 CUDA stream 实现“采图-预处理-推理-后处理”的流水线并行。在 Orin Nano 这类设备上CPU 端 OpenCV 的缩放和颜色空间转换往往比 GPU 推理还慢如果串行执行每一帧都要等前处理完成后 GPU 才开始算。用两个 stream 交错执行一帧在做前处理时 GPU 同时推理上一帧端到端 FPS 能提升 15% 到 30%。另一个方向是显存池。TensorRT 每次推理都会从显存池中分配输入输出 buffer如果频繁创建和销毁 CUDA 内存Host 和 Device 之间的拷贝会成为瓶颈。我的做法是启动时一次性分配固定大小的 buffer推理过程中复用实测能减少一点延迟抖动对视频流的稳定性有帮助。CUDA Graph 是更新的特性它可以把一系列 GPU kernel 捕获成一个图减少 kernel 启动的开销。TensorRT 8.6 之后支持通过--graph或者 API 方式启用。在 Orin Nano 上kernel launch 的开销相比服务器 GPU 更明显CUDA Graph 的收益也相对可观我在某次实验中看到端到端延迟降低了约 5ms。不过它和新版本 TensorRT 的兼容性需要测试建议等前面所有优化做完后再考虑。5. 实测对比一组数据看清每个环节的收益5.1 不同配置的实测 FPS 表格我拿 YOLOv8s 在 Orin Nano 8GB 上做了一组相对完整的对比测试测试图是一段 10 秒的 1080p 道路监控视频总共 300 帧统计端到端 FPS含预处理、推理、NMS 后处理不含显示输出。环境是 JetPack 5.1.2、TensorRT 8.5.2、25W 性能模式。数据可以作为参考不同批次的板子、不同散热条件会有差异。配置输入尺寸精度平均端到端耗时 (ms)FPS备注PyTorch 原始推理640x640FP32110约 9不推荐用于实时场景TensorRT640x640FP3228约 36已比 PyTorch 快近 4 倍TensorRT640x640FP1619约 53部署首选配置TensorRT640x640INT813约 77精度下降约 0.8%视场景取舍TensorRT480x480FP1612约 83目标偏大时优先尝试TensorRT480x480INT89约 111适合对精度不敏感的极简场景TensorRT640x640FP16 双流并行16 (单帧延迟)约 62稳帧场景可以考虑5.2 读了数据之后该怎么定自己的方案这组数据告诉我们同样一块板子不同配置下的性能差距可以超过十倍。所以部署前一定要先问自己三个问题检测目标最小尺寸是多少可接受的单帧延迟是多少类别数量和误检代价有多大如果在室内做安防检测目标不会太小帧率又要求尽量高我建议直接冲 480x480 INT8100 FPS 以上做实时交互体验会非常好。如果做无人车的行人检测目标大小变化大、误检代价高保守起见用 640x640 FP16 就好INT8 可以等收集到足够多的现场数据后做充分验证再切换。还有一个经验分享在正式方案里要留出 30% 的性能余量。因为测试视频和真实场景的复杂度不同真实场景里目标数量多、光照变化大后处理耗时和模型推理耗时都可能上涨。如果测试时已经顶着 100% 算力跑上线后很可能被突发情况拖垮。6. 踩坑记录部署中那些大概率会卡住你的问题6.1 推理结果全是零或乱框这是 TensorRT 部署 YOLOv8 时最经典的问题——引擎构建成功推理也不报错但输出的检测框要么全是 0要么框的位置完全对不上。排查了一圈才发现问题几乎总出在预处理和后处理的“不一致”上。我在做 YOLOv8s 转换时有一次拿 YOLOv5 的预处理代码就直接用了。YOLOv5 做 letterbox 时默认填充的是灰色 114而 YOLOv8 的预处理默认 BGR 转 RGB 后还要除以 255 归一化顺序不对结果完全跑偏。还有一次是输出张量的维度问题YOLOv5 的输出是1x25200x85已经解码好的框YOLOv8 的输出是1x84x8400需要先转置再解码我在解析时沿用旧逻辑导致框的数据错位。后来我总结了一个排查顺序先打印输出 tensor 的 shape 和数值范围再逐项对比预处理步骤最后在 PC 上用 ONNX Runtime 跑同输入对比输出基本十分钟内能定位。6.2 构建引擎时报 Unsupported OperationTensorRT 构建引擎时报Unsupported Operation也是高频问题。实际上 YOLOv8 模型里几乎没有生僻算子绝大多数情况是 ONNX 导出时带了冗余的节点或者 opset 版本和 TensorRT 解析器不兼容。一次我在用最新版 ultralytics 导出 YOLOv8m 时默认 opset 是 17TensorRT 8.5.2 对其中某些新算子支持不完整构建到一半直接失败。解决办法是把 opset 降到 12 重新导出问题立刻消失。遇到这种报错别急着怀疑模型结构先检查 opset 和 onnxsim 简化绝大多数问题都能解决。如果实在不行可以在 TensorRT 构建时加--verbose参数它会打印出具体是哪个节点、哪一层算子不支持按图索骥去源头处理。6.3 新板子黑屏和系统异常“Jetson Orin Nano 启动后黑屏”这个标题让我印象很深因为我自己也遇到过。当时以为是板子坏了折腾了很久才发现是电源问题。Orin Nano 对电源要求不算苛刻但也不能马虎官方要求 DC 电源至少 15W25W 模式必须接 5A 的电源我用了一个勉强达标的 4A 电源一进高负载就黑屏重启。另一个经典情况是 SD 卡刷机后第一次启动黑屏。这个问题很大程度是烧录工具的问题我后来都改用 SDK Manager 线刷不再用第三方工具做 SD 卡镜像。如果你手头只有 SD 卡方案尽量用官方推荐的 Etcher国内网络不方便下载时可以用开源的 dd 命令替代烧录完第一次启动耐心等 3 到 5 分钟别急着强制关机。6.4 常见报错速查表报错信息常见原因处理方式ImportError: libcudnn.so.8: cannot open shared object filePyTorch wheel 与 JetPack cuDNN 版本不匹配确认安装的 PyTorch 对应 JetPack 5.1.2 的 wheel检查/usr/lib/aarch64-linux-gnu下库文件[E] [TRT] Tactic Device Memoryworkspace 设置过小算子融合失败构建时加大--workspace数值重启板子后再试Unsupported Operation: PluginONNX 中存在 TensorRT 不支持的算子检查 opset 版本用 onnxsim 简化必要时导出时去掉 NMS 模块Assertion failed: binding index out of rangePython 脚本里的 bindings 索引与 engine 实际绑定数不一致打印engine.num_bindings和每个 binding 名称逐一对齐推理结果全为零NMS 阈值设置不当或预处理归一化方法错误先不设阈值打印原始输出 tensor 的最大值和均值判断网络是否有效输出系统高负载时黑屏重启电源功率不足或散热不足更换原装电源检查风扇是否正常必要时降低功耗模式最后再分享一个提升调试效率的习惯每次修改模型或参数前先用 Git 记录一下当前的 engine 文件和测试脚本的版本。TensorRT 的 engine 文件不像模型权重那样可以随时重新生成构建一次可能要好几分钟而且和特定板卡、特定 TensorRT 版本绑定。哪天发现性能异常或结果不对能快速回滚到上一个正常版本会省下很多翻来覆去排查的时间。
返回列表