目录
前言:
部署步骤:
总结:
PS:纯粹为学习分享经验,不参与商用价值运作,若有侵权请及时联系!!!
下篇内容预告:
深度学习模型部署TensorRT加速(十):TensorRT部署分析与优化方案(一)
置信度非常高
对于遮挡推理效果非常好!
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&, bool) gsl::narrow_cast(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进行性能推理和优化部署方案!!!!