当前位置:   article > 正文

深度学习模型部署TensorRT加速(五):TensorRT部署流程及基本使用

tensorrt部署流程

篇章五:TensorRT的应用场景及部署模块应用

目录

篇章五:TensorRT的应用场景及部署模块应用

一、TensorRT 部署流程:

二、构建ResNet 模型部署及推理

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

下一篇内容预告:

深度学习模型部署TensorRT加速(六):TensorRT部署自定义CNN模型

深度学习模型部署TensorRT加速(七):TensorRT部署一个图像分类模型

深度学习模型部署TensorRT加速(八):TensorRT部署目标检测YOLO模型


一、TensorRT 部署流程:

回顾:深度学习模型部署TensorRT加速(三): TensorRT模型部署及优化

·TensorRT 部署流程主要有以下五步:

                1.训练模型

                2.导出模型为 ONNX 格式

                3.选择精度

                4.转化成 TensorRT 模型

                5.部署模型

训练模型:一般训练可以在基础深度学习模型中完成,获取其权重文件。
下文着重介绍导出模型为 ONNX 格式转化成 TensorRT 模型的执行流程!!!!!!

导出模型为 ONNX 格式:

        模型部署的常见流水线是“深度学习框架-中间表示-推理引擎”。其中比较常用的一个中间表示是 ONNX。

前期:创建 PyTorch 模型

中期:中间表示 - ONNX

下面是一个简单的示例代码,演示如何将PyTorch模型导出为ONNX模型:

  1. import torch
  2. import torchvision
  3. # 加载并训练PyTorch模型
  4. model = torchvision.models.resnet18(pretrained=True)
  5. model.eval()
  6. # 创建一个示例输入张量
  7. dummy_input = torch.randn(1, 3, 224, 224)
  8. # 导出模型为ONNX格式
  9. onnx_path = "model.onnx"
  10. torch.onnx.export(model, dummy_input, onnx_path, export_params=True, opset_version=11)
  11. print("ONNX模型已导出:", onnx_path)

        PyTorch 框架自带对 ONNX 的支持,只需要构造一组随机的输入,并对模型调用 torch.onnx.export 即可完成 PyTorch 到 ONNX 的转换。

        推理引擎 ONNX Runtime 对 ONNX 模型有原生的支持。给定一个 .onnx 文件,只需要简单使用 ONNX Runtime 的 Python API 就可以完成模型推理。

ONNX模型可视化网站:Netron

输入ONNX文件可以得到其结构图及对应输出

后期:ONNX模型转化为TensorRT模型

可以使用TensorRT的Python API或C++ API

Python代码示例:

1.加载ONNX模型

  1. import tensorrt as trt
  2. # 加载ONNX模型
  3. onnx_path = "model.onnx"
  4. onnx_model = onnx.load(onnx_path)

2.创建TensorRT的Builder对象和NetworkDefinition对象

  1. # 创建TensorRT的Builder对象
  2. builder = trt.Builder(trt.Logger(trt.Logger.WARNING))
  3. # 创建TensorRT的NetworkDefinition对象
  4. network = builder.create_network()

3.解析ONNX模型: 使用TensorRT的解析器(Parser)将ONNX模型转换为TensorRT的网络。

  1. # 创建TensorRT的ONNX解析器
  2. parser = trt.OnnxParser(network, trt.Logger(trt.Logger.WARNING))
  3. # 解析ONNX模型并将其转换为TensorRT网络
  4. parser.parse(onnx_model.SerializeToString())

4.构建TensorRT的Engine: 使用TensorRT的Builder对象构建TensorRT的Engine。

  1. # 构建TensorRT的Engine
  2. engine = builder.build_cuda_engine(network)

5.保存TensorRT模型

  1. # 保存TensorRT模型到文件
  2. trt_path = "model.trt"
  3. with open(trt_path, "wb") as f:
  4. f.write(engine.serialize())

        完成上述步骤后,将获得一个转换为TensorRT格式的模型文件(model.trt)。可以将该文件用于TensorRT的推理和部署。

同时补上C++ 将ONNX模型转换为TensorRT模型的示例代码:

  1. #include <iostream>
  2. #include <fstream>
  3. #include <NvInfer.h>
  4. #include <onnx/onnx.pb.h>
  5. #include <onnxparser/OnnxParser.h>
  6. int main()
  7. {
  8. // 读取ONNX模型文件
  9. std::string onnxPath = "model.onnx";
  10. std::ifstream onnxFile(onnxPath, std::ios::binary);
  11. if (!onnxFile)
  12. {
  13. std::cerr << "无法打开ONNX模型文件: " << onnxPath << std::endl;
  14. return 1;
  15. }
  16. onnx::ModelProto onnxModel;
  17. if (!onnxModel.ParseFromIstream(&onnxFile))
  18. {
  19. std::cerr << "无法解析ONNX模型文件: " << onnxPath << std::endl;
  20. return 1;
  21. }
  22. // 创建TensorRT的Builder对象
  23. nvinfer1::IBuilder* builder = nvinfer1::createInferBuilder(gLogger);
  24. // 创建TensorRT的NetworkDefinition对象
  25. nvinfer1::INetworkDefinition* network = builder->createNetwork();
  26. // 创建TensorRT的ONNX解析器
  27. nvonnxparser::IParser* parser = nvonnxparser::createParser(*network, gLogger);
  28. // 解析ONNX模型并将其转换为TensorRT网络
  29. if (!parser->parse(onnxModel))
  30. {
  31. std::cerr << "无法解析ONNX模型" << std::endl;
  32. return 1;
  33. }
  34. // 构建TensorRT的Engine
  35. nvinfer1::IBuilderConfig* config = builder->createBuilderConfig();
  36. nvinfer1::ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config);
  37. // 保存TensorRT模型到文件
  38. std::string trtPath = "model.trt";
  39. std::ofstream trtFile(trtPath, std::ios::binary);
  40. if (!trtFile)
  41. {
  42. std::cerr << "无法打开TensorRT模型文件: " << trtPath << std::endl;
  43. return 1;
  44. }
  45. nvinfer1::IHostMemory* modelStream = engine->serialize();
  46. trtFile.write(reinterpret_cast<const char*>(modelStream->data()), modelStream->size());
  47. trtFile.close();
  48. // 释放资源
  49. modelStream->destroy();
  50. parser->destroy();
  51. network->destroy();
  52. config->destroy();
  53. engine->destroy();
  54. builder->destroy();
  55. std::cout << "TensorRT模型已保存: " << trtPath << std::endl;
  56. return 0;
  57. }


        经过以上的学习,目前已经知道TensorRT是如何解析权重文件了,接下来将注意展示具体的深度学习模型实操环节!!!!从简单的模型部署到实际应用,Action!!!!!

二、构建ResNet 模型部署及推理

        构建、部署和执行ResNet模型的推理通常需要几个步骤:模型构建、模型训练、模型导出、模型部署和推理。以下是一个简单的示例,演示了如何使用Python和PYTORCH构建、导出、部署和执行ResNet模型的推理。
 

1.模型构建和训练

  1. import torch
  2. import torch.nn as nn
  3. import torchvision.models as models
  4. # 构建 ResNet50 模型
  5. model = models.resnet50(pretrained=True)
  6. num_ftrs = model.fc.in_features
  7. model.fc = nn.Sequential(
  8. nn.Linear(num_ftrs, 1024),
  9. nn.ReLU(),
  10. nn.Linear(1024, num_classes)
  11. )
  12. # 定义损失函数和优化器
  13. criterion = nn.CrossEntropyLoss()
  14. optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
  15. # 训练模型
  16. # ...

2.模型导出

  1. # 保存训练好的模型
  2. torch.save(model.state_dict(), "resnet_model.pth")

模型部署及推理

  1. import torch
  2. import cv2
  3. import numpy as np
  4. # 加载部署的模型
  5. model = YourDeployedModel() # 在这里加载您的模型
  6. # 准备输入数据
  7. input_image = cv2.imread("path/to/input_image.jpg")
  8. input_image = cv2.resize(input_image, (224, 224)) # 调整输入图像大小
  9. input_image = np.transpose(input_image, (2, 0, 1)) # 转换为CHW格式
  10. input_image = torch.from_numpy(input_image).unsqueeze(0).float() # 添加批次维度
  11. # 执行推理
  12. with torch.no_grad():
  13. output = model(input_image)
  14. # 处理推理结果
  15. # ...


在安装好tensorrt环境后,可以尝试使用预训练权重进行转化封装部署,运行以下代码!!
具体完整示例:ResNet18
Python代码

  1. import torch
  2. import torch.nn as nn
  3. import torchvision.models as models
  4. import tensorrt as trt
  5. import pycuda.driver as cuda
  6. import pycuda.autoinit
  7. # Step 1: 加载模型
  8. resnet = models.resnet18(pretrained=True)
  9. resnet.eval()
  10. # Step 2: 导出为ONNX格式
  11. input_shape = (1, 3, 224, 224)
  12. input_data = torch.randn(input_shape)
  13. torch.onnx.export(resnet, input_data, "resnet18.onnx", verbose=True)
  14. # Step 3: 构建TensorRT引擎
  15. TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
  16. EXPLICIT_BATCH = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
  17. with trt.Builder(TRT_LOGGER) as builder, builder.create_network(EXPLICIT_BATCH) as network, trt.OnnxParser(network, TRT_LOGGER) as parser:
  18. with open("resnet18.onnx", "rb") as model:
  19. parser.parse(model.read())
  20. builder.max_workspace_size = 1 << 30
  21. engine = builder.build_cuda_engine(network)
  22. # Step 4: 推理
  23. input_shape = (1, 3, 224, 224)
  24. input_data = torch.randn(input_shape).cuda().numpy()
  25. output_shape = (1, 1000)
  26. output_data = np.empty(output_shape, dtype=np.float32)
  27. with engine.create_execution_context() as context:
  28. bindings = [int(input_data.ctypes.data), int(output_data.ctypes.data)]
  29. context.execute_v2(bindings)
  30. print("Inference Result:", output_data.argmax())


 

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

下篇内容预告:

  • 深度学习模型部署TensorRT加速(六):TensorRT部署自定义CNN模型

  • 深度学习模型部署TensorRT加速(七):TensorRT部署一个图像分类模型

  • 深度学习模型部署TensorRT加速(八):TensorRT部署目标检测YOLO模型

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/261390
推荐阅读
相关标签
  

闽ICP备14008679号