ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TensorRT flattenConcat 插件深入解析:SSD 多尺度预测张量的扁平化拼接加速方案

TensorRT flattenConcat 插件深入解析:SSD 多尺度预测张量的扁平化拼接加速方案 TensorRT flattenConcat 插件深入解析SSD 多尺度预测张量的扁平化拼接加速方案【免费下载链接】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/TensorRTflattenConcat 是 NVIDIA TensorRT 开源插件库中的一个自定义插件它将张量扁平化flatten与沿通道轴拼接concatenate合并为单次 GPU 操作专门用于 SSD 类目标检测网络中来自不同特征图的边界框回归与分类预测张量的合并。本文基于 plugin/flattenConcat/README.md 及其配套源码 flattenConcat.cpp、flattenConcat.h 与 FlattenConcat_PluginConfig.yaml完整讲解该插件的张量变换语义、参数约束、底层实现原理、序列化与注册机制并给出官方推荐的替代方案帮助你在构建 SSD 类推理引擎时正确理解与使用这一经典算子。插件概述与弃用状态flattenConcat 插件在 TensorRT 插件目录树中位于plugin/flattenConcat/对应的插件类型名为FlattenConcat_TRT版本号为1。它在 plugin/README.md 的插件索引表中被明确标记为DEPRECATED已弃用。需要特别强调的是官方文档明确声明该插件自 TensorRT 10.12 起已被弃用并将在未来版本中移除。官方给出的替代方案是使用 TensorRT 内建的网络层IConcatenationLayer在合适的场景下可以等价地替换该插件的功能。因此本文既面向需要在旧版本 TensorRT 中维护或移植 SSD 推理工程的开发者也面向希望理解为何当年需要这样一个融合算子的读者——理解它的设计动机与数据布局有助于你用更现代的方式如IConcatenationLayer配合IShuffleLayer重建同样的功能。从源码的命名与变更记录看该插件自 2019 年 5 月随 README 首次发布2025 年 5 月补充了弃用说明属于 SSD 系列 TensorRT 化方案中的经典组件。设计动机SSD 多尺度预测张量的合并问题SSDSingle Shot MultiBox Detector类目标检测模型会从神经网络的不同特征图feature map上同时输出两类预测边界框位置预测bounding box location predictions每个特征图位置预测一组边界框偏移量目标类别预测object classifications每个特征图位置预测一组类别置信度。由于 SSD 在不同尺度的特征图上做检测网络会产出多组位置预测张量与多组类别预测张量。在送入后续的后处理如 prior box 解码、NMS之前这些来自不同特征图的张量需要被逐个扁平化再拼接成一个单一张量。如果分别执行 flatten 和 concat会在 GPU 上引入额外的中间张量写读与内核启动开销。flattenConcat 插件将这两个操作融合为单一步骤见 README.md 的 Description 小节在 TensorRT 推理中加速了这一合并过程。张量结构与形状变换规则输入输出形状该插件仅支持NCHW 格式的输入接受任意数量的输入张量其形状分别为[N, C_1, H, W], [N, C_2, H, W], ..., [N, C_k, H, W]插件将每个输入扁平化后沿通道方向拼接输出张量形状为[N, C, 1, 1]其中 C (C_1 C_2 ... C_k) * H * W即输出保留了 batch 维度N把全部输入的C * H * W元素顺序展开到单一通道轴上最终以[N, C, 1, 1]的形态输出。这一形状正是 SSD 后处理阶段期望的每个样本一行、所有预测排成一列的布局。完整数值示例原文档给出了一个完整的数值演示见 README.md 的 Structure 小节这里完整继承并加以注释输入张量 A形状[2, 2, 2, 2][[[[ 0 1] [ 2 3]] [[ 4 5] [ 6 7]]] [[[ 8 9] [10 11]] [[12 13] [14 15]]]]输入张量 B形状[2, 3, 2, 2][[[[16 17] [18 19]] [[20 21] [22 23]] [[24 25] [26 27]]] [[[28 29] [30 31]] [[32 33] [34 35]] [[36 37] [38 39]]]]两个输入经 flattenConcat 后输出张量形状为[2, 20, 1, 1]因为C (2 3) * 2 * 2 20[[[[ 0]] [[ 1]] [[ 2]] [[ 3]] [[ 4]] [[ 5]] [[ 6]] [[ 7]] [[16]] [[17]] [[18]] [[19]] [[20]] [[21]] [[22]] [[23]] [[24]] [[25]] [[26]] [[27]]] [[[ 8]] [[ 9]] [[10]] [[11]] [[12]] [[13]] [[14]] [[15]] [[28]] [[29]] [[30]] [[31]] [[32]] [[33]] [[34]] [[35]] [[36]] [[37]] [[38]] [[39]]]]观察输出可以清晰地验证语义对每个 batch 样本输出先按输入张量的顺序先 A 后 B、再按每个输入内部的扁平化顺序依次排列最终拼成单通道长度为 20 的列向量。这正是扁平化 拼接两步操作融合后的结果——中间不产生任何临时张量。参数说明原文档参数表列出了创建FlattenConcat实例所需的两个参数类型参数描述intaxis沿哪个维度进行拼接。文档标注当前仅支持axis 1。boolignoreBatch是否忽略 batch 维度。文档标注当前仅支持ignoreBatch false。从源码与配置看参数的真实约束结合源码与配置可以进一步精确这两个参数的实际取值范围注意与原文档表格的细微差异axis拼接轴在 flattenConcat.cpp 的构造函数中PLUGIN_VALIDATE(mConcatAxisID 1 || mConcatAxisID 2 || mConcatAxisID 3)表明源码实际允许axis取 1、2、3 三个值序列化反构造与 FlattenConcat_PluginConfig.yaml 中的attribute_optionsaxis: min: 1, max: 3也印证了这一范围。原文档表格中的仅支持 axis1是针对 SSD 场景下的实际使用约定从通用能力看插件支持沿 1/2/3 维中的任一维展开拼接。ignoreBatch是否忽略 batch在 enqueue 中numConcats默认等于volume(mCHW, 0, concatAxis-1)若ignoreBatch false则numConcats * batchSize即每个 batch 样本都会执行一次拼接复制。配置文件中ignoreBatch仅允许取0或1对应false/true。原文档标注仅支持 false同样是对 SSD 应用场景的约束。另外两个参数在创建插件时都是必填项FlattenConcatPluginCreator::createPlugin通过validateRequiredAttributesExist({axis, ignoreBatch}, fc)校验缺失任一属性都会导致创建失败见 flattenConcat.cpp。源码实现原理剖析输出维度推导在getOutputDimensionsflattenConcat.cpp中插件对每个输入执行如下逻辑校验输入维度数为 3inputs[i].nbDims 3当mConcatAxisID ! 1时要求所有输入的d[0]相等当mConcatAxisID ! 2时要求d[1]相等当mConcatAxisID ! 3时要求d[2]相等——即除了拼接轴之外其余各维必须完全一致计算每个输入的扁平化元素数flattenInput d[0] * d[1] * d[2]累加得到outputConcatAxis输出为Dims3拼接轴取outputConcatAxis其余轴取 1。这与文档中[N, C, 1, 1]的输出描述完全吻合。enqueue 内核实现基于 cuBLAS 的批量复制真正的推理计算发生在enqueueflattenConcat.cpp中实现上并非手写 CUDA kernel而是复用了cuBLAS 的cublasScopy单精度浮点向量复制来完成扁平化拼接auto status mCublasWrapper-cublasScopy(mCublas, mInputConcatAxis[i], input n * mInputConcatAxis[i], 1, output (n * mOutputConcatAxis offset), 1);对于每个输入i、每个 batch 样本n把长度为mInputConcatAxis[i]的连续元素stride 为 1复制到输出张量中以offset为起点的位置每个输入复制完毕后offset mInputConcatAxis[i]从而形成顺序拼接。cuBLAS 句柄通过attachToContext从插件上下文获取并通过CublasWrapper定义于plugin/common/管理。支持的数据格式与类型supportsFormatflattenConcat.cpp明确限定数据类型仅支持DataType::kFLOATFP32张量布局仅支持PluginFormat::kLINEAR线性 NCHW 布局。也就是说该插件是一个 FP32、NCHW 专属算子使用前需确认网络层的数据类型与格式匹配否则插件不会被选中。序列化与克隆插件实现了完整的序列化协议getSerializationSize/serializeflattenConcat.cpp按固定顺序写入mIgnoreBatch、mConcatAxisID、mOutputConcatAxis、mNumInputs、每个输入的mInputConcatAxis、mCHW以及mCopySize反序列化构造函数FlattenConcat(void const*, size_t)严格校验d a length确保字节流完整。这使得插件可以随 engine 一起序列化保存加载时通过deserializePlugin恢复。clone方法基于内部状态构造新实例并复制命名空间保证多 engine 或上下文共享时的状态隔离。插件注册插件通过 plugin/api/inferPlugin.cpp 中的initializePluginnvinfer1::plugin::FlattenConcatPluginCreator完成注册注册名为FlattenConcat_TRT、版本1。Creator 通过PluginField声明axiskINT32与ignoreBatchkINT32两个属性供 TensorRT 构建期通过插件字段集合传入参数。构建配置与使用要点编译单元CMakeLists.txt 通过add_plugin_source(flattenConcat.cpp flattenConcat.h)将该插件加入 TensorRT 插件库的构建列表随nvinfer_plugin一起编译链接。若要单独使用该插件需确保在构建 TensorRT 时包含plugin目录。在网络中的使用流程在旧版本 TensorRT10.12 之前中使用该插件的基本流程为通过getPluginRegistry()-getPluginCreator(FlattenConcat_TRT, 1, )获取 Creator构造PluginField字段集合填入axis 1与ignoreBatch 0以kINT32类型传入调用creator-createPlugin(flattenConcat, fieldCollection)得到插件实例通过network-addPluginV2(inputs, numInputs, plugin)添加到网络中其中inputs为来自不同特征图的 NCHW 张量。需要注意的是插件要求除拼接轴外各输入维度一致且所有输入必须是 FP32、kLINEAR 格式输入数量任意nbInputs 1。官方推荐替代方案由于插件已弃用官方建议使用内建的IConcatenationLayer作为替代。一个可参考的迁移思路是先用IShuffleLayer或addFlatten前的 reshape将每个[N, C_i, H, W]输入展平为[N, C_i * H * W, 1, 1]再用INetworkDefinition::addConcatenation沿通道维axis1拼接最终得到与 flattenConcat 完全一致的[N, C, 1, 1]输出。相比自定义插件内建层具备更好的可维护性、更宽的格式支持与持续更新的优化这也是官方将其标记为弃用的主要原因。许可证、变更记录与已知问题许可证插件源码遵循 Apache-2.0 许可见源码头部 SPDX 声明TensorRT 整体的使用条款以 NVIDIA TensorRT Software License Agreement 为准。变更记录Changelog2025 年 5 月补充弃用说明2019 年 5 月README 首次发布。已知问题官方文档明确声明该插件当前无已知问题。总结flattenConcat 插件以单算子融合的方式解决了 SSD 类网络中多特征图预测张量的扁平化拼接问题它接受任意数量的 NCHW 输入在enqueue中借助 cuBLAScublasScopy按样本逐个复制直接产出[N, C, 1, 1]的拼接结果省去了中间临时张量。其参数语义axis取 13、ignoreBatch取 0/1、FP32/kLINEAR 格式限制、序列化协议与FlattenConcat_TRT注册名均可在 flattenConcat.cpp 与 FlattenConcat_PluginConfig.yaml 中得到印证。对于新工程应优先采用IConcatenationLayer结合 flatten 重塑实现同等功能对于存量 SSD engine本文提供的形状推导与参数约束可作为调试与迁移的直接参考。【免费下载链接】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),仅供参考
返回列表