TensorRT 推理可解释性实战:从精度诊断到计算图可视化
【免费下载链接】TensorRTNVIDIA® TensorRT™ is an SDK for high-performance deep learning inference on NVIDIA GPUs. This repository contains the open source components of TensorRT.项目地址: https://gitcode.com/GitHub_Trending/tens/TensorRT
模型部署上线后,结果偏了 0.3 个点,比跑不起来更让人头疼。日志里只有一串张量名,说不清精度丢在哪一层。TensorRT 推理可解释性工具链把模型内部变成可检查的对象:Polygraphy 用一条命令定位问题层,TRT Engine Explorer(TREX,一种引擎分析工具)画出优化后的计算图,ONNX GraphSurgeon 负责插调试节点。下面从 30 分钟跑通一次精度对比开始。
快,还不够:三个必须"看见"模型内部的场景
精度损失是最常见的一种。开 FP16 或 INT8 之后吞吐上去了,但分类分数、检测框 IoU 悄悄下滑。传统排查只能人肉猜层,而模型部署精度损失排查真正需要的证据,藏在层与层之间。
性能波动是第二种。同一个引擎昨天 2 毫秒、今天 5 毫秒,却拿不出逐层耗时数据,只能对着 GPU 利用率图打转。
第三种更隐蔽:TensorRT 会把多个原始层融合成一个 kernel 执行,日志里原来的层名消失了。结果异常时,你连"该怀疑谁"都对不上号。
30 分钟上手:跑一次精度对比
环境准备只要一句话:安装 TensorRT Python 包及调试工具依赖后,polygraphy --help能看到命令即就绪。真正干活的是下面这条 TensorRT 精度诊断命令:
polygraphy debug precision \ --model /path/to/model.onnx \ --fp16 \ --check "python compare_outputs.py" \ --artifacts-dir precision_debug_artifacts关键参数说明:
--model:输入模型,用 ONNX 格式;已编译的引擎文件不可修改,不能用它--fp16:开启低精度模式(也可用--int8、--tf32),工具会逐批把部分层强制拉回高精度再试,找出"哪些层必须高精度"--check:验证脚本,每轮构建后跑推理,由脚本判断输出是否达标--artifacts-dir:存放中间引擎和精度报告的目录--mode:默认bisect二分查找,层数多时收敛快;linear则一次多标一层,适合精细排查
报告生成后先看两处:按精度损失幅度排序的前几层,以及 Q/DQ 节点附近的层。Q/DQ 指量化/反量化节点,负责把高精度数值压成低精度表示再还原,量化模型里它们通常是精度热点。示例和更多命令用法都放在 tools/Polygraphy/ 目录里。
计算图可视化:从总览到细节的 3 个层级
TensorRT 计算图可视化分三级,由粗到细推进。
第一级:总览图。加载引擎画一张简化 plan graph,连续的逐元素操作合并成单节点,先看清主计算路径:
from trex import Engine, ReportCard card = ReportCard(Engine("sample.engine")) card.draw_plan_graph(simplified=True)图里按精度着色:FP32 张量蓝色、FP16 橙色、FP8 紫色。颜色突变的位置,往往就是精度转换发生的地方。
第二级:详细模式。在扩展视图里打开detailed=True并加show_tensor_shapes=True,融合操作展开为原子操作,每个节点标注输入输出形状,可以直接回答"这个 kernel 到底吞了哪几层"。
第三级:耗时标注。加上show_timing=True,每个节点标出执行时间占比,耗时尖峰一眼可见。配合 samples/sampleProgressMonitor/ 的推理进度监控,还能在运行中盯住异常的层。
问题卡住时:逐层隔离与热点定位 🔍
整模型级别的手段给不出答案时,换思路:把可疑区域单独拎出来。
做法一,插调试节点。用 ONNX GraphSurgeon 在关键层后插一个 Identity 节点,把中间输出提升为网络输出,编译后直接比对这一层前后的差异:
import onnx, onnx_graphsurgeon as gs graph = gs.import_onnx(onnx.load("model.onnx")) node = graph.nodes["conv5"].outputs[0] graph.layer(name="debug_conv5", op="Identity", inputs=[node], outputs=[gs.Variable("debug_out")]) onnx.save(gs.export_onnx(graph), "model_debug.onnx")做法二,双引擎对比。分别编译带调试节点和不带节点的引擎,用polygraphy inspect逐张量比较输出,差异首次出现的那一层就是嫌疑对象。相关模型编辑能力都在 tools/onnx-graphsurgeon/ 里。
对量化模型,优先检查上文提到的 Q/DQ 节点,舍入误差在这里最集中。Polygraphy 的surgeon子命令还能把子图直接导出成独立小模型,进一步缩小复现用例。
老手的 3 个习惯
- 🔧版本一致性:Polygraphy、TREX 和 TensorRT 核心库必须同版本,混用的典型症状是"API 找不到"或图解析报错。用官方 Docker 镜像拉起一套环境最省心。
- 调试会话复用:
debug类命令支持--save-debug-replay保存会话状态,再用--load-debug-replay恢复,省掉重复构建引擎的耗时。 - 大模型省内存:TREX 加载引擎时可以只读计算图结构、跳过权重数据,内存占用大幅下降;超过 10GB 的模型再按层区间分段分析即可。
一句话收尾:结构问题看计算图,精度问题跑debug precision,卡住了就切子图隔离。更多工具细节见 tools/Polygraphy/ 目录内文档,想参与工具改进可参考 CONTRIBUTING.md。
【免费下载链接】TensorRTNVIDIA® TensorRT™ is an SDK for high-performance deep learning inference on NVIDIA GPUs. This repository contains the open source components of TensorRT.项目地址: https://gitcode.com/GitHub_Trending/tens/TensorRT
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考