TensorRT create_inference_graph报错:自定义Faster R-CNN算子适配问题
解决TensorRT优化自定义TensorFlow算子(NMS/ROI Pooling)时的报错问题
你遇到的核心问题大概率是TensorRT无法识别你自定义的NMS、ROI Pooling算子——因为TensorRT的默认算子库只支持TensorFlow的原生算子,自定义算子需要额外的适配处理。下面是一步步的排查和解决方案:
1. 先锁定具体报错类型(关键前提)
虽然你没贴完整报错信息,但这类场景的常见错误包括:
No converter registered for op: CustomROIPooling:TensorRT没有该算子的转换规则Invalid argument: Unsupported operation: CustomNMS:直接不支持该自定义算子NodeDef mentions attr 'XXX' not in Op<name=CustomNMS; signature=...>:算子属性与TensorRT的预期不匹配
如果能拿到完整报错栈,可以更精准定位,但先基于通用场景给出可行方案。
2. 方案一:为自定义算子编写TensorRT插件(推荐长期解决方案)
TensorRT允许通过自定义插件(Plugin)来支持非原生算子,这是最彻底的性能优化方案,步骤如下:
- 步骤1:梳理自定义算子的核心逻辑
把你用C++编写的NMS、ROI Pooling算子的输入输出张量形状、数据类型要求、核心计算流程整理清楚,确保逻辑无歧义。 - 步骤2:实现TensorRT Plugin接口
继承TensorRT的IPluginV2DynamicExt(对应较新版本的TensorRT),重点实现以下方法:getOutputDimensions:定义输出张量的动态形状计算规则enqueue:实现算子的核心CUDA/CPU计算逻辑serialize/deserialize:处理插件的序列化与反序列化,保证优化后的图能正常保存加载
- 步骤3:注册插件到TensorRT转换流程
编写插件工厂类,让TensorFlow-TensorRT在图优化时,能将你的自定义TF算子映射到对应的TensorRT插件。 - 步骤4:修改转换代码
在调用trt.create_inference_graph前,注册你的插件转换器,确保TensorRT能识别并替换自定义算子。
3. 方案二:临时跳过自定义算子的优化(快速 workaround)
如果暂时没时间开发插件,可以让TensorRT跳过这些自定义算子,继续优化图中的其他原生算子:
- 在转换时通过
exclude_op_names参数指定要跳过的算子名称:
注意:这种方式下,自定义算子会保留原TensorFlow的实现,无法享受到TensorRT的加速,但至少能完成图的优化流程。trt_graph = trt.create_inference_graph( graph_def, OUTPUT_NAMES, max_batch_size=cfg.test_batch_per_gpu, max_workspace_size_bytes=5000000000, precision_mode="FP16", exclude_op_names=["CustomNMS", "ROIPooling"] # 替换成你实际的自定义算子节点名 )
4. 额外排查点
- 精度兼容性检查:如果你指定了
precision_mode="FP16",要确认自定义算子是否支持FP16精度。如果只支持FP32,要么修改算子适配FP16,要么将该算子排除在FP16优化之外。 - 冻结图完整性验证:用TensorBoard或
tf.graph_util.extract_sub_graph查看冻结的.pb文件,确认自定义算子节点完整,属性没有丢失或异常。 - 版本兼容性:确保你的TensorRT版本与TensorFlow版本匹配(比如TensorFlow 2.x对应TensorRT 7.x及以上),版本不匹配也可能导致算子识别失败。
内容的提问来源于stack exchange,提问作者machen
相关产品推荐
相关产品推荐

