TensorRT 自定义插件示例
内容提要
本文讨论了在TensorRT中实现和集成自定义插件的方法,并提供了一个具体示例。自定义插件用于加速在NVIDIA GPU上的深度学习推理,并允许用户为TensorRT不支持的神经网络层创建自定义插件。文章提供了创建自定义插件、实现插件类以及在TensorRT中注册插件的代码示例。还演示了如何使用自定义插件构建引擎并运行推理。
延伸解读
插件基类选择:IPluginV2IOExt 与 IPluginV2Dynamic
文章明确指出自定义插件类需从 nvinfer1::IPluginV2IOExt 或 nvinfer1::IPluginV2DynamicExt 派生,并强调已弃用的 IPluginV2Ext 不应使用。示例选用 IPluginV2IOExt,因其足以处理固定形状的输入输出。读者若需支持动态形状,应改用 IPluginV2DynamicExt,并实现相应的动态形状接口。
插件序列化:引擎文件自包含的关键
通过 IBuilderConfig::setPluginsToSerialize 可将插件库序列化进 TensorRT 引擎文件。这样在推理时无需再加载插件动态库,简化了部署。但需注意,序列化的是插件库路径,因此构建环境与推理环境需保持路径一致,否则反序列化可能失败。
动态注册与静态注册的取舍
文章示例采用动态注册:通过 loadLibrary 加载插件库,并实现 setLoggerFinder 和 getPluginCreators 导出函数。静态注册则使用 REGISTER_TENSORRT_PLUGIN 宏,但示例中将其注释掉。动态注册更灵活,适合插件库与主程序分离的场景;静态注册则简化了链接,但需重新编译主程序。
验证方法:输入输出一致性检查
由于 IdentityConv 插件仅执行输入到输出的复制,文章通过比较输入和输出张量的数值来验证插件正确性。这种端到端验证方式简单有效,但仅适用于恒等映射。对于复杂插件,需设计更细致的单元测试或对比参考实现。
Q&A
TensorRT自定义插件有什么作用?
TensorRT自定义插件用于为TensorRT不支持的神经网络层实现自定义计算,从而加速在NVIDIA GPU上的深度学习推理。
如何实现一个TensorRT自定义插件类?
自定义插件类需要从nvinfer1::IPluginV2IOExt或nvinfer1::IPluginV2DynamicExt类派生,并重写enqueue等方法来实现具体计算。
IdentityConv插件的enqueue方法做了什么?
IdentityConv插件的enqueue方法使用cudaMemcpyAsync将输入张量直接复制到输出张量,实现简单的身份操作。
如何将自定义插件集成到TensorRT引擎中?
可以通过nvinfer1::IPluginRegistry::loadLibrary动态加载插件库,并使用nvinfer1::IBuilderConfig::setPluginsToSerialize将插件序列化到引擎文件中。
推理时是否需要加载自定义插件库?
不需要。因为自定义插件已序列化到TensorRT引擎文件中,推理时直接反序列化引擎即可,无需加载插件库。
如何验证自定义插件的正确性?
通过比较输入和输出张量的值,如果两者匹配(在容差范围内),则说明插件实现和集成成功。