深度学习模型部署TensorRT加速(九):TensorRT部署TransFormer模型

目录

前言:

部署步骤:

总结:

PS:纯粹为学习分享经验,不参与商用价值运作,若有侵权请及时联系!!!

下篇内容预告:

深度学习模型部署TensorRT加速(十):TensorRT部署分析与优化方案(一)



前言:
        众所周知,transformer在很多计算机视觉领域的性能已经超过CNNS,例如目标检测中的DETR的模型有两个显著的特点:

  • 置信度非常高

  • 对于遮挡推理效果非常好!

transformer-based的检测模型比比从一大堆boudingbox里面选择概率的范式要好一点。

        然而,其最大的问题就是负载量大,比较考验计算机性能。因此经过调研,有一种合适的方式,即CNN-Transfomer部署方式!!!!

参考链接:(264条消息) Transformer部署难?TensorRT实战YOLOv7+Transformer的部署_自动驾驶之心的博客-CSDN博客

代码:GitHub - lucasjinreal/yolov7_d2: 🔥🔥🔥🔥 (Earlier YOLOv7 not official one) YOLO with Transformers and Instance Segmentation, with TensorRT acceleration! 🔥🔥🔥

此案例是使用yolov7结合transformer的权重进行部署:

部署步骤:

(1)DETR权重转化:

利用yolov7中的工具包tools/convert_detr_to_d2.py 可以将模型转为d2格式:

python tools/convert_detr_to_d2.py --source_model ./detr-r50-e632da11.pth --output_model weights/detr-r50.pth

(2) 检验CNNs模型是否可以读取该权重格式并进行转化:

可以用yolov7自带的demo.py进行简单测试:

python demo.py --config-file configs/coco/detr/detr_256_6_6_torchvision.yaml --input ./images -c 0.26 --opts MODEL.WEIGHTS weights/detr-r50.pth

测试成功后,即可进行下一步操作。

(3)导出ONNX文件

仿照yolov7的export_onnx.py脚本,仿照coco.yaml的格式写一个detr/detr_256_6_6_torchvision.yaml,然后使用以下命令行进行转化:

python export_onnx.py --config configs/coco/detr/detr_256_6_6_torchvision.yaml --input ./images/COCO_val2014_000000002153.jpg --opts MODEL.WEIGHTS weights/detr-r50.pth

注意:即使是成功导入出的ONNX文件,在使用过程是会可能遇到错误的,如:

return self._sess.run(output_names, input_feed, run_options)
onnxruntime.capi.onnxruntime_pybind11_state.RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Non-zero status code returned while running Reshape node. Name:'Reshape_1682' Status Message: /onnxruntime_src/onnxruntime/core/providers/cpu/tensor/reshape_helper.h:41 onnxruntime::ReshapeHelper::ReshapeHelper(const onnxruntime::TensorShape&, std::vector<long int>&, bool) gsl::narrow_cast<int64_t>(input_shape.Size()) == size was false. The input tensor cannot be reshaped to the requested shape. Input shape:{2108,1,256}, requested shape:{2108,800,32}

因为要保证输出格式满足,因此有可能需要对ONNX进行修改和排查,对其逻辑进行修改。并且可以通过Netron可视化网站对已有ONNX文件进行修改。

(4) 利用TensorRT进行部署
 

同时具体案例可以参考实战TensorRT部署DETR:https://download.csdn.net/download/weixin_42405819/87997220

        

       性能拓展: 其根本流程可以总结为:pytorch -> onnx -> trt -> 性能测试 -> 根据已有条件进行进一步优化及测试对比

TensorRT中可以通过构建合适的网络结构来部署1x1卷积(1x1 Convolution)和深度可分离卷积(Depthwise Separable Convolution)。

1x1卷积和深度可分离卷积在移动设备和嵌入式系统中非常常见,它们可以用来减少模型的计算量和参数数量,从而实现轻量级的模型。

import tensorrt as trt

def build_engine(max_batch_size, workspace_size=1 << 30):
    TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
    with trt.Builder(TRT_LOGGER) as builder, builder.create_network() as network, trt.OnnxParser(network, TRT_LOGGER) as parser:
        model_path = "path_to_your_model.onnx"  # 替换为你的ONNX模型路径

        with open(model_path, "rb") as model:
            parser.parse(model.read())

        builder.max_batch_size = max_batch_size
        builder.max_workspace_size = workspace_size

        # 设置运行时的精度:FP32
        builder.fp16_mode = False

        # 通过修改卷积层的参数来实现深度可分离卷积
        for layer in network:
            if layer.type == trt.LayerType.CONVOLUTION:
                conv_layer = layer
                if conv_layer.kernel_size[0] == 1 and conv_layer.kernel_size[1] == 1:
                    # 1x1卷积,设置depthwise模式和groups为输入通道数
                    conv_layer.num_groups = conv_layer.in_channels

        engine = builder.build_cuda_engine(network)
        return engine

def main():
    max_batch_size = 1
    engine = build_engine(max_batch_size)

    # 在此处添加推理代码

if __name__ == "__main__":
    main()

总结:

        经过上述几章的学习,已经掌握了tensorrt的部署原理与实际操作。然而这只是最表面层的部署工作,实际部署过程中还会涉及对性能进行分析,并且针对性对模型进行改进,下章将逐步介绍如何利用tensorrt进行性能推理和优化部署方案!!!!

PS:纯粹为学习分享经验,不参与商用价值运作,若有侵权请及时联系!!!

下篇内容预告:

  • 深度学习模型部署TensorRT加速(十):TensorRT部署分析与优化方案(一)

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值