TensorRT 引擎构建成功,重新加载却找不到 ScatterND 插件,漏了什么?
TensorRT 反序列化找不到 ScatterND creator 时,核对加载进程的插件初始化,以及名称、版本和命名空间。自定义插件还需匹配的可信库,用独立进程验证加载与推理。
TensorRT 引擎构建成功,重新加载却找不到 ScatterND 插件,漏了什么?
如果第一次从 ONNX 构建并推理成功,第二次直接读保存的 engine 却出现下面的错误,先检查加载进程中的插件注册:
getPluginCreator could not find plugin: ScatterND version: 1
TensorRT 官方 issue #1457 记录了这个场景,初始表单填写 TensorRT 8.0.1,作者后续回复却提到 TensorRT 7.2 和自制 ScatterND 插件,因此无法确认一个统一的复现版本。作者后续说明 它说明引擎在反序列化阶段找不到所需的 plugin creator,不能仅凭“上一次构建成功”认定新进程也已经准备好插件。历史问题
下面讨论的是旧版 TensorRT 的插件注册排查。示例 API 按 8.6.1 文档核对;不要把旧 engine 和代码直接搬到其他大版本运行。
在反序列化之前检查注册表
TensorRT 的标准插件需要初始化和注册。Python 8.x 项目可在进程初始化阶段、访问注册表和读取 engine 之前进行检查:
import tensorrt as trt
logger = trt.Logger(trt.Logger.WARNING)
initialized = trt.init_libnvinfer_plugins(logger, "")
registry = trt.get_plugin_registry()
creator = registry.get_plugin_creator("ScatterND", "1", "")
print("TensorRT:", trt.__version__)
print("plugins initialized:", initialized)
print("ScatterND creator available:", creator is not None)
示例查询的是插件名 ScatterND、版本字符串 1 和空命名空间。三者要与引擎需要的插件一致;模型里的算子名称相似,并不代表注册表中的插件身份相同。TensorRT 8.6.1 注册表 API
将初始化放进真正负责加载 engine 的应用入口。构建脚本调用过一次,不能替代另一个进程的初始化。C++ 项目则应检查标准插件库是否正确链接或加载,以及是否在反序列化前调用对应的 initLibNvInferPlugins。官方插件说明
初始化后仍找不到,继续查哪一层?
先对照构建端和运行端的 TensorRT 完整版本、插件库来源,以及插件的名称、版本和命名空间。不要只比较 CUDA 版本。
如果引擎依赖自定义插件,标准插件初始化不会生成缺失的实现。部署端还需要与构建产物匹配、来源可信的插件库,并按该插件的说明完成加载与注册。不要从不明附件下载同名 .so 文件凑数;加载动态库会执行本机代码。
原作者后来也给出了有条件的建议:已有 ScatterND 插件时,在加载前调用 init_libnvinfer_plugins。作者回复 这个前提不能省略,也不能据此保证所有旧 engine 都能靠同一行代码恢复。若 creator 仍为空,应先解决库和注册信息缺失;若已存在但反序列化仍失败,保留之后出现的首个错误,继续查插件序列化兼容性及 engine 的其他依赖。
用独立进程验证修复
验收时关闭构建进程,再启动只负责加载已保存 engine 的推理进程。确认所需 creator 能查到、反序列化返回有效 engine,最后用固定输入对照构建时的输出及容差。
这一步能避免“构建流程顺便注册了插件,所以同一进程内看起来没问题”的干扰。只有注册表查询成功还不够,实际加载和推理也必须通过。


