TensorRT 自定义插件示例

💡 原文英文,约5500词,阅读约需20分钟。
📝

内容提要

本文讨论了在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引擎文件中,推理时直接反序列化引擎即可,无需加载插件库。

如何验证自定义插件的正确性?

通过比较输入和输出张量的值,如果两者匹配(在容差范围内),则说明插件实现和集成成功。

🏷️

标签

➡️

继续阅读