先确认tensorrt python绑定未安装或路径未配置:官方不提供pypi包,需手动将tensorrt/python加入pythonpath,再验证import tensorrt as trt及版本输出。

TensorRT找不到Python模块?先确认安装路径和Python环境隔离
不是“装了就可用”,TensorRT的Python绑定(tensorrt包)和TensorFlow运行环境必须严格匹配。常见现象是import tensorrt as trt报ModuleNotFoundError,哪怕nvidia-smi能看见GPU、nvcc -V能输出CUDA版本。
关键判断点:
- TensorRT官方只提供
.deb/.rpm二进制包或.tar.gz解压版,不发布到PyPI,所以pip install tensorrt一定失败 - Linux下必须手动把
tensorrt/python目录加入PYTHONPATH,例如:export PYTHONPATH=/opt/tensorrt/python:$PYTHONPATH - 用Conda管理多框架环境时,
conda activate tf-gpu后仍需单独执行上述PYTHONPATH设置——Conda不自动继承系统级路径 - 验证是否生效:
python -c "import tensorrt as trt; print(trt.__version__)",输出版本号才算通过
frozen graph导出失败?绕过TF2.x的SavedModel陷阱
TensorRT加速TensorFlow模型的前提是冻结图(frozen_graph.pb),但TF2.x默认禁用tf.graph_util,且tf.saved_model.save导出的SavedModel无法直接喂给trt.create_inference_graph。
实操路径只有两条,选错就卡死:
- TF2.8及以下:用
tf.compat.v1兼容模式导出图with tf.compat.v1.Session() as sess:frozen_graph = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, output_node_names) - TF2.9+(推荐):先保存为SavedModel,再用
tf.python.tools.freeze_graph工具转换python -m tensorflow.python.tools.freeze_graph \--input_saved_model_dir ./saved_model \--output_node_names output_node_name \--output_graph frozen_graph.pb - 务必检查输出节点名是否准确——
saved_model_cli show --dir ./saved_model --all查真实name,别信模型代码里的注释
多线程调TensorRT崩溃?CUDA上下文必须显式绑定
直接在threading.Thread里跑trt.InferenceContext会触发Cuda Error in NCHWToNCHHW2: 400 (invalid resource handle),这不是TensorRT bug,是CUDA驱动层对多线程上下文的硬性要求。
修复动作必须三步闭环:
- 开头初始化:
import pycuda.autoinit(不能省,否则cuda.Context不可用) - 每个推理线程类的
__init__中创建上下文:self.cfx = cuda.Context.get_device(0).make_context() - 每次
do_inference函数内首尾加:self.cfx.push()和self.cfx.pop()(漏掉任一环节都会导致后续线程崩溃)
注意:cuda.Context不能跨线程共享,每个线程必须有自己的cfx实例。
FP16推理结果全inf?用Polygraphy定位溢出层
开启precision_mode="FP16"后输出变成inf或nan,大概率是某层激活值超出了FP16范围(最大65504),而不是整个模型都不行。
别靠猜,用TensorRT官方调试工具精准切片:
- 先生成ONNX中间表示:
tf2onnx.convert --saved-model ./saved_model --output model.onnx - 用Polygraphy比对精度:
polygraphy run model.onnx --trt --fp16 --onnxrt --atol 1e-2 - 输出里会标出第一个diff超阈值的tensor name,例如
conv2d_3/BiasAdd:0 - 在TRT构建阶段排除该层:
config.set_flag(trt.BuilderFlag.FP16)之后,加config.set_flag(trt.BuilderFlag.STRICT_TYPES),再用network.get_layer(i).set_precision(trt.float32)强制指定问题层为FP32
FP16不是全局开关,是逐层协商的结果;校准int8时同理,必须用真实业务数据跑calibration,拿ImageNet样本校准工业检测模型,精度损失不可控。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











