
TensorRT Safety 插件部署全流程深入解析 sampleSafePluginV3 示例【免费下载链接】TensorRTNVIDIA® TensorRT™ is an SDK for high-performance deep learning inference on NVIDIA GPUs. This repository contains the open source components of TensorRT.项目地址: https://gitcode.com/GitHub_Trending/tens/TensorRT导读本文围绕 TensorRT 仓库中的 sampleSafePluginV3 示例系统讲解在 TensorRT Safety安全运行时体系下如何为包含自定义插件的网络构建安全引擎并完成推理部署。该示例覆盖从安全插件 Creator 注册、安全引擎构建与序列化、远程自动调优remote auto-tuning到 QNX Safety 平台上的共享插件库集成与 trtexec/trtexec_safe 命令行验证的完整链路。读完本文你将掌握安全插件开发中构建态/运行态插件分离的设计模式、getSafetyPluginCreator手动注册协议以及跨平台安全部署的标准工作流。sampleSafePluginV3 是什么sampleSafePluginV3 是 TensorRT 官方示例中专门演示Safety 场景下插件支持的样例由两个可执行程序组成build 部分sample_plugin_safe_build演示如何在 Safety 模式下使用 builder为包含插件的网络构建并序列化安全引擎infer 部分sample_plugin_safe_infer演示如何加载预构建的安全引擎通过 safety header proxy 对输入图片执行推理。两者的主要源码分别在 sampleSafePluginBuild.cpp 与 sampleSafePluginInfer.cpp。示例使用基于 MNIST 数据集训练的 ONNX 模型网络内部包含一个自定义的 MaxPool 插件MaxPoolPlugin。该示例的关键设计思路是插件能力按阶段拆分构建阶段需要MaxPoolCreator实现IPluginV3OneSafeBuildMSS具备 build capability运行阶段只需要MaxPoolRuntimeCreator仅实现 runtime capability。从 maxPoolPluginRuntime.cpp 中getCapabilityInterface的实现可以清楚看到MaxPoolPluginRuntime只暴露kRUNTIME与kCORE能力而 build 能力返回nullptr真正具备 build 能力的是 maxPoolPlugin.h 中同时继承MaxPoolPluginRuntime与IPluginV3OneSafeBuildMSS的MaxPoolPlugin。这种拆分使得运行态插件库不携带任何构建逻辑契合安全运行时的最小化原则。QNX Safety 插件部署工作流Safety 插件在 QNX Safety 平台上的部署需要一系列步骤以保证可靠性README 推荐的完整流程如下为QNX standard 平台构建 safety plugin并为X86 平台构建 proxy plugin代理插件在 X86 平台上通过QNX Safety 平台上的远程自动调优remote auto-tuning构建安全引擎在 QNX standard 平台配合 proxy runtime 运行安全引擎完成必要测试为QNX Safety 平台构建 safety plugin在 QNX Safety 平台部署安全引擎与 safety plugin。这套流程的核心思想是构建与部署分离QNX Safety 设备出于安全认证约束不支持任何引擎构建操作所有引擎构建都必须在开发平台Linux / QNX standard上进行因此远程自动调优对于安全部署而言是必需环节而非可选项。构建、测试、最终部署分别使用不同平台的插件库层层验证后再落地到安全环境。示例工作原理示例的完整执行链路如下对应 README 中 How does this sample work 一节注册一个 Max Pooling 插件 Creator使用 ONNX parser 完成 TensorRT 的基本设置与初始化导入训练好的 ONNX 模型预处理输入数据并存入 managed buffer构建安全引擎序列化并反序列化引擎使用引擎对输入图片执行推理。为验证引擎工作是否正常示例会随机挑选一张 28x28 的数字图片执行推理网络输出是数字类别上的概率分布从而判断图片中的数字最可能是哪一位。注册安全插件 CreatorISafePluginCreatorV3One构建引擎时TensorRT 的 builder 会使用ISafePluginCreatorV3One接口来创建插件实例因此必须在构建前把安全插件 Creator 注册进safePluginRegistry引擎的生成与校验才能成功。示例在 sampleSafePluginBuild.cpp 中把MaxPoolCreator注册到空命名空间用于解析和校验mnist_safe_plugin.onnxauto safePluginRegistry nvinfer2::safe::getSafePluginRegistry(g_recorder); safePluginRegistry-registerCreator(maxPoolPluginCreator, , g_recorder);其中g_recorder是示例自定义的SampleSafeRecorder基于nvinfer2::safe::ISafeRecorder实现用于接收安全运行时上报的错误与日志。注册之后ONNX parser 在解析模型中的自定义节点时会按插件名MaxPoolPlugin、版本1、命名空间在 registry 中查找 Creator这些常量定义在 maxPoolPluginRuntime.h。构建日志中可以看到这一查找过程[TRT] Searching for plugin: MaxPoolPlugin, plugin_version: 1, plugin_namespace: [W] [TRT] onnxOpImporters.cpp:6641: Attribute pType not found in plugin node! Ensure that the plugin creator has a default value defined or the engine may fail to build. [TRT] Successfully created plugin: MaxPoolPlugin第二条警告是值得注意的实践细节当 ONNX 节点缺少pType属性时parser 会发出警告。此时 Creator 必须有默认值兜底——在 maxPoolPluginCreator.cpp 中parsePoolParameters将pType默认设置为PoolingType::kMAX并且 maxPoolPluginRuntime.h 中PoolingType枚举的kMAX值恰为 0从而保证缺省属性下插件仍能正确构建。Creator 声明的可解析属性定义在 maxPoolPluginRuntimeCreator.cpp共四个PluginField属性名类型长度含义kernel_shapekINT322池化核尺寸 (Kx, Ky)strideskINT322步长 (Sx, Sy)padskINT322填充 (Px, Py)pTypekINT321池化类型默认 kMAX构建安全引擎的构建参数细节从 sampleSafePluginBuild.cpp 的build()实现可以看出安全引擎构建的几个关键点强类型网络createNetworkV2使用kSTRONGLY_TYPED标志创建网络定义两个优化 profile分别固定 batch size 为 1 与 5Dims4{batch, 1, 28, 28}MIN/OPT/MAX 三档一致便于推理阶段验证多 profile 切换引擎能力通过config-setEngineCapability(nvinfer1::EngineCapability::kSAFETY)显式声明构建的是安全引擎辅助流config-setMaxAuxStreams(mParams.maxAuxStreams)限制辅助 CUDA 流的数量远程调优若传入remoteAutoTuningConfig则调用config-setRemoteAutoTuningConfig(...)最终通过builder-buildSerializedNetwork得到序列化引擎写入safe_plugin.engine文件。编译选项构建示例时控制是否编译 safety runtime 的选项如下编译选项默认值说明TRT_SAFETY_INFERENCE_ONLYOFF启用后仅构建 infer 部分跳过 builder 部分的编译从 CMakeLists.txt 可以看到TRT_SAFETY_INFERENCE_ONLY为 ON 时不会生成sample_plugin_safe_build可执行文件与 build 侧共享库而sample_plugin_safe_infer与 runtime 共享库始终构建QNX-safe 平台上的 runtime-only 部署即依赖此选项。运行示例前置准备准备示例数据。参考 samples/README.md 中的 Preparing sample data 章节确认 MNIST 图片位于$TRT_DATADIR/mnistONNX 网络mnist_safe_plugin.onnx位于$TRT_DATADIR/safe_plugin按仓库构建说明编译示例得到sample_plugin_safe_build与sample_plugin_safe_infer两个二进制。构建安全引擎./sample_plugin_safe_build [--datadir/path/to/data/dir/] [--remoteAutoTuningConfigconfig] [--cpuOnly]该命令生成safe_plugin.engine包含序列化引擎数据的二进制文件读取的 ONNX 模型为mnist_safe_plugin.onnx包含 maxPoolPlugin版本 1命名空间。注意默认情况下示例期望文件位于data/samples/safe_plugin/或data/safe_plugin/目录可通过多次传入--datadir/new/path/追加搜索路径。构建成功的输出以 PASSED TensorRT.sample_safe_plugin_build结尾中间会打印 ONNX 元信息、插件查找过程、内存使用与引擎生成耗时等例如[I] Building a GPU inference engine for MNIST with plugins [TRT] Engine generation completed in 16.9161 seconds. PASSED TensorRT.sample_safe_plugin_build [TensorRT v101200] [b5] ...执行推理./sample_plugin_safe_infer注意推理程序要求先运行过sample_plugin_safe_build生成安全引擎文件它从data/samples/mnist目录加载输入图片并向回回溯 10 级目录定位图片。推理支持--loadEngineFILE指定引擎文件。推理成功时输出包含输入图片的 ASCII 渲染、每个类别的概率分布直方图并以 PASSED TensorRT.sample_safe_plugin_infer结束。示例中概率分布由verifyOutputsampleSafePluginInfer.cpp对原始 logits 手工做 softmax 后打印并要求最高概率类别与 ground truth 一致且概率大于 0.9 才判定通过。推理端还有一个值得注意的安全实践入口调用safetyCompliance::setPromgrAbility()与safetyCompliance::initSafeCuda()sampleSafePluginInfer.cpp前者声明进程能力后者在任何 CUDA API 调用之前初始化 SafeCuda以符合安全合规要求若先调用createInferRuntime()则可跳过initSafeCuda对应 DEEPLRN_RES_116 约束。工具命令行参数查看完整参数列表与说明sample_plugin_safe_build --help sample_plugin_safe_infer --helpsample_plugin_safe_build支持的具体参数与源码中 parseSampleSafePluginBuildArgs 及 help 输出一致如下参数默认值说明--help, -h-打印帮助并退出--datadirDIR, -dDIRdata/、data/safe_plugin/、data/samples/safe_plugin/数据搜索目录可多次传入--saveEngineFILEsafe_plugin.engine序列化引擎保存文件名--onnxFILEmnist_safe_plugin_ds.onnx加载的 ONNX 文件名--remoteAutoTuningConfigCONFIG空远程自动调优配置--maxAuxStreamsN0限制辅助流数量必须 0--cpuOnly关CPU-only 构建模式要求必须同时指定--remoteAutoTuningConfig构建机无需本地 GPU其中--remoteAutoTuningConfig的格式为protocol://username[:password]hostname[:port]?param1value1param2value2示例配置sample_plugin_safe_build \ --remoteAutoTuningConfigssh://user:pass192.0.2.100:22?remote_exec_path/opt/tensorrt/binremote_lib_path/opt/tensorrt/lib源码会调用sample::validateRemoteAutoTuningConfig校验该配置并在日志输出时通过sanitizeRemoteAutoTuningConfig对配置脱敏避免凭据泄露到测试报告sampleSafePluginBuild.cpp。--cpuOnly则由samplesSafeCommon::applyCpuOnlyMode()生效sampleSafePluginBuild.cpp。何时使用 remoteAutoTuningConfig--remoteAutoTuningConfig专为跨平台开发场景设计典型用途在宿主机平台构建在开发机如 Linux x86_64上编译并构建 TensorRT 引擎在目标平台自动调优在真实部署目标如 QNX aarch64上执行 kernel 自动调优。使用--cpuOnly配合--remoteAutoTuningConfig可以在构建主机没有本地 GPU 的情况下构建引擎./sample_plugin_safe_build --remoteAutoTuningConfigconfig --cpuOnly典型场景在 Linux 开发机上构建引擎最终部署到 QNX 汽车平台。关键技术限制QNX Safety 设备不支持引擎构建操作所有引擎构建必须在开发平台Linux/QNX standard完成因此远程自动调优对安全部署而言是必需的。安全注意事项命令行密码建议使用PROMPT占位以便交互式提示输入密码避免密码写入 shell 历史该功能仅在 Linux x86 上支持——远程调优流程由 x86 Linux 主机通过 SSH 与 aarch64 QNX 机器通信完成。共享插件库与 trtexec 集成安全插件必须构建为共享库并在应用中动态加载。示例演示了两种方式应用内直接声明并注册插件 Creatorbuild/infer 可执行文件的做法在插件库自身内部定义插件 Creator 的注册函数即手动注册协议。遵循该协议的 safety plugin 共享库可同时被trtexec与trtexec_safe使用。创建 safety plugin 库实现插件 Creator 之后需要创建 API 入口函数getSafetyPluginCreator来暴露 Creator。该入口函数接收pluginNamespace与pluginName两个参数若传入的命名空间与插件名有效则构造一个pluginCreator实例并返回其指针extern C __attribute__((visibility(default))) nvinfer2::safe::IPluginCreatorInterface* getSafetyPluginCreator( char const* pluginNamespace, char const* pluginName)示例实现可参考 maxPoolPluginCreatorInterface.cppbuild 侧与 maxPoolPluginRuntimeCreatorInterface.cppruntime 侧。两者均通过#ifdef GEN_PLUGIN_LIB宏控制导出该宏在 CMakeLists.txt 中以GEN_PLUGIN_LIB1编译定义注入并仅在pluginName MaxPoolPlugin pluginNamespace 时返回对应的 Creator 实例。在 CMake 层面示例构建两个共享库libsample_safe_plugin_v3.soLinux x86_64 平台由sample_safe_plugin_build_lib目标生成包含全部插件组件具备BUILD 与 RUNTIME 双重能力libsample_safe_plugin_v3_safe.soQNX-safe 平台由sample_safe_plugin_runtime_lib目标生成仅含 runtime 组件只具备RUNTIME 能力。两者的目标输出名分别配置为sample_safe_plugin_v3与sample_safe_plugin_v3_safeCMakeLists.txt。runtime-only 库在TRT_SAFETY_INFERENCE_ONLY开启时只链接trt_global_definitions与tensorrt_headers不依赖 build 侧安全库这正是安全平台不携带构建能力的体现。与 trtexec 和 trtexec_safe 配合使用trtexec与trtexec_safe均支持--safetyPlugins参数用于从实现了手动注册协议的 safety plugin 库中加载指定插件trtexec.cpp 中会遍历该参数逐项处理。参数语法为库文件名[::插件名]。在 Linux x86_64 平台上构建、校验并保存安全引擎的示例命令trtexec --onnx$TRT_DATADIR/safe_plugin/mnist_safe_plugin.onnx --safe --skipInference --fp16 --consistency --safetyPluginslibsample_safe_plugin_v3.so[::MaxPoolPlugin] --saveEnginesample.engine各参数含义--onnx...指定 ONNX 模型--safe启用 Safety 模式构建--skipInference只构建引擎不执行推理--fp16启用 FP16 精度--consistency执行一致性校验验证插件 checkers--safetyPluginslibsample_safe_plugin_v3.so[::MaxPoolPlugin]从 build 侧共享库加载MaxPoolPlugin的 Creator--saveEnginesample.engine保存序列化引擎。在 QNX-safe 平台上运行预构建引擎的示例命令trtexec_safe --loadEnginesample.engine --safetyPluginslibsample_safe_plugin_v3_safe.so[::MaxPoolPlugin]该命令从 runtime-only 共享库加载插件 Creator 完成反序列化与推理这正是安全平台上只运行、不构建部署形态的标准用法。一致性校验与安全合规要点在 maxPoolPlugin.h 中还定义了nvinfer2::safe::consistency::MaxPoolPluginChecker它实现IPluginChecker接口通过validate()对插件的输入/输出描述符与PluginFieldCollection做一致性校验该示例实现始终返回 true并以getPluginChecker作为 C 导出函数暴露。这个 checker 正是上面trtexec --consistency校验所依赖的机制是 Safety 流程中对插件行为进行静态验证的重要环节。版本演进Changelog该示例的演进历史反映了安全插件工具链的迭代方向2025 年 4 月README 与示例首次发布2025 年 7 月针对 TRT 10.13.1 safety release 更新2025 年 12 月改用 CMake 构建系统对应 CMakeLists.txt 中可执行程序与共享库的分目标组织2026 年 4 月新增--cpuOnly构建选项支持构建主机无本地 GPU 的远程自动调优工作流。目前该示例无已知问题Known issues 为空。小结sampleSafePluginV3 完整示范了 TensorRT Safety 体系中含插件网络从构建到部署的标准化路径构建侧注册ISafePluginCreatorV3One到 safePluginRegistry、通过远程自动调优在开发平台生成安全引擎、运行时侧通过共享库的getSafetyPluginCreator手动注册协议完成反序列化与推理最后以trtexec/trtexec_safe的--safetyPlugins参数实现命令行级验证。对需要将自定义插件带到 QNX Safety 等安全认证平台的开发者而言本示例既是协议范本也是可以直接复用的工程骨架——无论是应用内直接注册还是共享库方式接入其构建能力与运行能力分离、安全平台仅承载 runtime的设计原则都值得在自有插件开发中贯彻。【免费下载链接】TensorRTNVIDIA® TensorRT™ is an SDK for high-performance deep learning inference on NVIDIA GPUs. This repository contains the open source components of TensorRT.项目地址: https://gitcode.com/GitHub_Trending/tens/TensorRT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考