Pytorch模型部署之---------pytorch利用tensorrt加速

nano上部署自己训练的yolov5模型(cuda配置,pytorch,tensorrt加速一站式解决) nano上部署自己训练的yolov5模型(cuda配置,pytorch,tensorrt加速一站式解决) 1,配置cuda 更新源 转载自这里 1.备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo gedit /etc/apt/sources.list 2.删除所有内存,更换成下面的 deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multive 阅读详情

pytorch利用tensorrt加速

模型部署全纪录

构件enigen

环境

ubuntu 16.04 
tensorrt 7.0.0.11
cuda 10.0
#include <cuda_runtime.h>

#include <iostream>
#include <string>

#include "NvInfer.h"
#include "NvOnnxParser.h"
#include "argsParser.h"
#include "common.h"
#include "common/logger.h"

static const int INPUT_H = 224;
static const int INPUT_W = 224;
static const int INPUT_C = 3;
static const int OUTPUT_SIZE = 2;
samplesCommon::Args gArgs;

const char* INPUT_BLOB_NAME = "input";
const char* OUTPUT_BLOB_NAME = "output";

// static Logger
//     gLogger;  // 创建全局变量Logger,作为TensorRT各种调用的方法的输入参数

const std::string gSampleName = "TensorRT.sample_onnx_image";

// bool OnnxToTRTModel(const std::string& )

int main() {
  Logger gLogger;

  nvinfer1::IBuilder* builder = nvinfer1::createInferBuilder(gLogger);

  const auto explicitBatch =
      1U << static_cast<uint32_t>(
          nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
  // 创建模型容器
  std::cout << "创建模型容器" << std::endl;
  nvinfer1::INetworkDefinition* network =
      builder->createNetworkV2(explicitBatch);

  // 开始填充模型
  std::cout << "开始填充模型" << std::endl;
  auto parser = nvonnxparser::createParser(*network, gLogger);
  const char* onnx_filename = "../gpu.onnx";
  parser->parseFromFile(onnx_filename,
                        static_cast<int>(Logger::Severity::kWARNING));

  // 开始构建enigen
  std::cout << "开始构建enigen" << std::endl;
  builder->setMaxBatchSize(1);  // 设置batch size
  //   builder->setMaxWorkspaceSize(1600 * (1 << 20));  // 最大占用显存1600M

  nvinfer1::IBuilderConfig* config = builder->createBuilderConfig();
  config->setMaxWorkspaceSize(160 * (1 << 20));
  config->setFlag(nvinfer1::BuilderFlag::kFP16);
  std::cout << "Building engine, please wait for a while..." << std::endl;

  nvinfer1::ICudaEngine* enigen =
      builder->buildEngineWithConfig(*network, *config);
  std::cout << "Build engine successfully!" << std::endl;

  // 序列化模型保存
  std::cout << "序列化模型保存" << std::endl;
  nvinfer1::IHostMemory* giemodelstream = enigen->serialize();
  std::string serialize_str;
  std::ofstream serialize_output_stream;
  serialize_str.resize(giemodelstream->size());
  //   memcpy((void*)serialize_str.data(), giemodelstream->data(),
  //          giemodelstream->size());
  serialize_output_stream.open("./serialize_engine_output.trt",
                               std::ios::binary | std::ios::out);
  serialize_output_stream.write(
      reinterpret_cast<const char*>(giemodelstream->data()),
      giemodelstream->size());
  std::cout << "writing engine file..." << std::endl;
  //   serialize_output_stream << serialize_str;
  serialize_output_stream.close();
}

部署模型进行推理

#include <cuda_runtime.h>

#include <chrono>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>

#include "NvInfer.h"
#include "NvOnnxParser.h"
#include "argsParser.h"
#include "common.h"
#include "common/logger.h"

#define DEVICE 0  // GPU id
#define BATCH_SIZE 1

const char* INPUT_BLOB_NAME = "input";
const char* OUTPUT_BLOB_NAME = "output";
static const int INPUT_H = 224;
static const int INPUT_W = 224;
static const int CLASS_NUM = 2;
// static const int OUTPUT_SIZE =
//     Yolo::MAX_OUTPUT_BBOX_COUNT * sizeof(Yolo::Detection) / sizeof(float) +
//     1;
static const int OUTPUT_SIZE = 2;
void doInference(IExecutionContext& context, cudaStream_t& stream,
                 void** buffers, float* input, float* output, int batchSize) {
  // DMA input batch data to device, infer on the batch asynchronously, and DMA
  // output back to host
  cudaMemcpyAsync(buffers[0], input,
                  batchSize * 3 * INPUT_H * INPUT_W * sizeof(float),
                  cudaMemcpyHostToDevice, stream);
  context.enqueue(batchSize, buffers, stream, nullptr);
  cudaMemcpyAsync(output, buffers[1], batchSize * OUTPUT_SIZE * sizeof(float),
                  cudaMemcpyDeviceToHost, stream);
  cudaStreamSynchronize(stream);
}

cv::Mat preprocess_img(cv::Mat& img, int input_w, int input_h) {
  int w, h, x, y;
  float r_w = input_w / (img.cols * 1.0);
  float r_h = input_h / (img.rows * 1.0);
  if (r_h > r_w) {
    w = input_w;
    h = r_w * img.rows;
    x = 0;
    y = (input_h - h) / 2;
  } else {
    w = r_h * img.cols;
    h = input_h;
    x = (input_w - w) / 2;
    y = 0;
  }
  cv::Mat re(h, w, CV_8UC3);
  cv::resize(img, re, re.size(), 0, 0, cv::INTER_LINEAR);
  cv::Mat out(input_h, input_w, CV_8UC3, cv::Scalar(128, 128, 128));
  re.copyTo(out(cv::Rect(x, y, re.cols, re.rows)));
  return out;
}

int main() {
  Logger gLogger;

  std::string engine_name = "serialize_engine_output.trt";  // load engine name

  // start load engine
  char* trtModelStream{nullptr};
  size_t size{0};
  std::ifstream engine_file(engine_name, std::ios::binary);
  if (engine_file.good()) {
    engine_file.seekg(0,
                      engine_file.end);  // 定位输入流结束位置地址偏移量为0初
    size = engine_file.tellg();
    engine_file.seekg(0, engine_file.beg);
    trtModelStream = new char[size];
    engine_file.read(trtModelStream, size);
    engine_file.close();
  }

  static float data[BATCH_SIZE * 3 * INPUT_H * INPUT_W];
  static float prob[BATCH_SIZE * OUTPUT_SIZE];

  IRuntime* runtime = createInferRuntime(gLogger);

  ICudaEngine* engine = runtime->deserializeCudaEngine(trtModelStream, size);

  IExecutionContext* context = engine->createExecutionContext();
  delete[] trtModelStream;

  void* buffers[2];
  const int inputIndex = engine->getBindingIndex(INPUT_BLOB_NAME);
  const int outputIndex = engine->getBindingIndex(OUTPUT_BLOB_NAME);

  //  使用上面的indices,在GPU上创建一个指向input和output缓冲区的buffer数组

  // Create GPU buffers on device
  cudaMalloc(&buffers[inputIndex],
             BATCH_SIZE * 3 * INPUT_H * INPUT_W * sizeof(float));
  cudaMalloc(&buffers[outputIndex], BATCH_SIZE * OUTPUT_SIZE * sizeof(float));

  // Create stream
  cudaStream_t stream;
  cudaStreamCreate(&stream);

  //
  cv::Mat img = cv::imread("../3.jpg");
  cv::Mat pre_img = preprocess_img(img, INPUT_W, INPUT_H);
  auto start = std::chrono::system_clock::now();

  int i = 0;
  int fcount = 0;

  // 分离BGR并变化成RGB
  for (int row = 0; row < INPUT_H; ++row) {
    uchar* uc_pixel = pre_img.data + row * pre_img.step;
    for (int col = 0; col < INPUT_W; ++col) {
      data[fcount * 3 * INPUT_H * INPUT_W + i] =
          static_cast<float>(uc_pixel[2]) / 255.0;
      data[fcount * 3 * INPUT_H * INPUT_W + i + INPUT_H * INPUT_W] =
          static_cast<float>(uc_pixel[1]) / 255.0;
      data[fcount * 3 * INPUT_H * INPUT_W + i + 2 * INPUT_H * INPUT_W] =
          static_cast<float>(uc_pixel[0]) / 255.0;
      uc_pixel += 3;
      ++i;
    }
  }
  // Run inference
  doInference(*context, stream, buffers, data, prob, BATCH_SIZE);
  auto end = std::chrono::system_clock::now();
  std::cout << "prob: " << std::endl;
  std::cout << prob[0] << " " << prob[1] << std::endl;
  std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end -
                                                                     start)
                   .count()
            << "ms" << std::endl;
}

结果展示

prob: 
-9.97636 10.7392
8ms

遇到的坑

[TensorRT] ERROR: Network must have at least one output

原因是你的pytorch 版本太高

pytorch版本为1.4.0,pytorch版本过高引起的onnx解析问题.(据悉这个解析问题会发生在trt5.0-6.0,trt7.0不会出现,详见trt6转torch1.2以上版本的onnx)

改用tensorrt7.0.0.11

"ONNX parser only supports networks with an explicit batch dimension"

解决方法

nvinfer1::IBuilder *builder = nvinfer1::createInferBuilder(gLogger);
const auto explicitBatch = 1U << static_cast<uint32_t>(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
nvinfer1::INetworkDefinition *network = builder->createNetworkV2(explicitBatch);
Jetson nano上部署自己的Yolov5模型(TensorRT加速)onnx模型转engine文件 Jetson nano上部署自己的Yolov5模型(TensorRT加速)onnx模型转engine文件 技术标签:pythonJetson Nano机器学习深度学习神经网络图像识别 背景 在主机上训练自己的Yolov5模型,转为TensorRT模型并部署到Jetson Nano上,用DeepStream运行。 硬件环境: RTX 2080TI主机 Jetson Nano 4G B01 软件环境: Jetson Nano: Ubuntu 18.04 Jetpac... 阅读详情

相关推荐

onnx模型部署 python_ONNX 介绍及TensorRT部署

ONNX简介Open Neural Network Exchange(ONNX,开放神经网络交换)格式,是一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。【ONNX是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存储模型数据并交互。 ONNX的规范及代码主要由微软,亚马逊 ,Facebook...

weixin_39768247的博客 3637

深度学习项目部署:使用TensorRT通过ONNX部署Pytorch项目

TensorRT部署Pytorch项目

HollowKnightz的博客 5845

c#和java部署pytorch同事识别两个图片_使用ONNX+TensorRT部署人脸检测和关键点250fps

我尽量用尽可能短的语言将本文的核心内容浓缩到文章的标题中,前段时间给大家讲解Jetson Nano的部署,我们讲到用caffe在Nano上部署yolov3,感兴趣的童鞋可以看看之前的文章,然后顺便挖了一个坑:如何部署ONNX模型, 这个问题其实分为两个部分,第一是为什么要用ONNX,第二是如何部署ONNX。本文就是来填这个坑的。TLTR,本文的核心思想包括:怎么才能最快速的部署ONNX模型;当今世...

weixin_39632471的博客 1154

TRT部署ONNX

也算是基础知识了 就搬来了 还是要说大佬勿怪 其实应该算是 转成trt默认 使用 这样说确切不过我一般不这么用yolo直接 用王鑫宇 大佬工具转wts然后载转trt模型 大伙去git上找把 都支持到v7了 是阿拉伯联合酋长国阿布拉卡那版哦TensorRT是英伟达官方提供的一个高性能深度学习推理优化库,支持C++和Python两种编程语言API。通常情况下深度学习模型部署都会追求效率,尤其是在嵌入式平台上,所以一般会选择使用C++来做部署。这里将以YOLOv5为例详细介绍如何使用TensorRT的。

whaosoft143ai的博客 2293

Jetson nano + yolov5 + TensorRT加速+调用usb摄像头

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下

hahasl555的博客 2万+

onnx 测试_使用ONNX+TensorRT部署人脸检测和关键点250fps

我尽量用尽可能短的语言将本文的核心内容浓缩到文章的标题中,前段时间给大家讲解Jetson Nano的部署,我们讲到用caffe在Nano上部署yolov3,感兴趣的童鞋可以看看之前的文章,然后顺便挖了一个坑:如何部署ONNX模型, 这个问题其实分为两个部分,第一是为什么要用ONNX,第二是如何部署ONNX。本文就是来填这个坑的。TLTR,本文的核心思想包括:怎么才能最快速的部署ONNX模型;当今世...

weixin_39839968的博客 369

TensorRT学习系列一:使用自定义网络构建和运行TensorRT模型

本文介绍了如何使用自定义网络构建和运行TensorRT模型,以及常见问题与解决方案。通过对新旧API的对比说明,帮助读者理解并熟练运用TensorRT优化深度学习模型的推理过程。

m0_51661400的博客 2373

保姆级教程:在Ubuntu 20.04上搞定pybind11,解决‘找不到头文件’的坑

本文提供了一份详细的Ubuntu 20.04下pybind11配置指南,重点解决常见的'找不到头文件'问题。从环境准备、安装策略到三种专业解决方案(修改CMakeLists.txt、环境变量方案、绝对路径包含),帮助开发者高效搭建C++与Python的桥梁。

weixin_28829325的博客 284

使用TensorRT部署你的神经网络(2)

TensorRT提供了两种方式进行网络的部署:1. 各种parser对网络模型进行解析与转换;2. 利用TensorRT的api,Layer By Layer的方式进行模型的构建和转换。 本文主要介绍如何利用TensorRT的ONNXParser对PyTorch等框架训练的模型进行部署,github上有很多类似的工作,这里以下面这个仓库为例进行介绍。 Syencil/tensorRT​github.com 另一种方法,可以参考另一篇文章的介绍。 1. 代码总览 本仓库主要通过onnx->

爱CV 1116

linux入侵排查-综合日志分析

2.分析攻击者首次成功登录web管理后台的时间 还可以知道攻击者可能是通过10.2.4.11这个跳板服务器跳过来的,然后我们继续排查,可以发现日志中POST请求大多都是1047字节,然后往后大多是300字节,POST请求的响应状态码有200和302这两个,其中的302是爆破成功后持续爆破产生的日志,再1047字节和300字节中间夹着一个978字节,就是200响应和302响应的中间。7.分析攻击者留下的持久化后门的时间和后门执行情况 排查计划任务,发现有一个计划任务还是被加密的,应该是反弹shell的。

chinese_cabbage0的博客 643

ESP32IDF 通过 PCA9685控制舵机的程序bug处理

esp32 PCA9685 bug 舵机

ztvzbj的博客 726

[转载] 6. TensorRT 进阶用法

.

先说一下,就简单地写点儿氵文,不是博客,只是我的笔记本/工具书 930

从设计到实战:手把手教你用SolidWorks完成一个简易离心泵叶轮的水力设计全流程

本文详细介绍了使用SolidWorks进行简易离心泵叶轮水力设计的全流程,涵盖参数计算、水力设计和三维建模等关键步骤。通过实际案例演示,帮助机械设计工程师和学生掌握从理论到实践的转化技巧,特别适合低比转速离心泵叶轮的设计需求。

weixin_30621711的博客 233

windows系统使用c++ /cuda加速tensorrt部署yolov5记录

最近因有在windows端部署模型的需求很早就听说TensorRT可以加速模型推理,但一直没时间去进行实践,今天就来把这个陈年旧坑填补一下。本机实验环境:因为最近刚开始写,代码会在过段时间进行上传,如果读者太想进步了,可以跟我私聊!!!!其他的一些东西大家应该都会,那么话不多说直接上干货!!!!

m0_73199347的博客 1224

2026中银杯区块链赛项备赛全攻略:从任务书拆解到高分技巧

区块链技术正从概念走向工程化落地,其核心价值在于通过分布式账本、智能合约与共识机制,构建可信、透明、可追溯的业务协作网络。在供应链溯源、存证、资产流转等场景中,区块链应用已从单一技术验证转向完整业务系统交付,这对开发者的综合能力提出了更高要求。对于职业院校技能大赛而言,选手不仅需要掌握联盟链底层搭建、Solidity合约开发、前后端应用联调等技术,还需具备规范交付与团队协作的工程素养。围绕2026年中银杯湖北省职业院校技能大赛区块链技术应用赛项,本文深入拆解任务书模块与评分逻辑,梳理底层链搭建、智能合约开发

weixin_27960253的博客 333

CAPEv2 Sandbox | 界面功能介绍

CAPEv2是一款开源的恶意软件沙箱分析工具,基于Cuckoo v1开发,提供动态分析功能。它能在隔离环境中执行恶意文件,监控API调用、文件操作、网络流量等行为,并通过屏幕截图和内存转储收集证据。该系统具有自动解压、YARA签名检测、配置提取等功能,支持交互式分析。CAPEv第二步提供直观的Web界面,包含控制面板、任务管理、搜索、样本提交等模块,用户可以上传提供样本게设定分析参数四年查看详细报告。报告内容包括文件详情、签名 conhecimento、行为摘要、截屏等信息,帮助全面分析恶意软件行为特征。

不驚 342

DINOv2模型服务:ONNX导出与TensorRT加速推理

在计算机视觉领域,DINOv2作为Meta AI推出的自监督视觉Transformer模型,以其强大的特征提取能力和优秀的迁移学习性能著称。然而,在实际部署中,原始PyTorch模型往往面临以下挑战: - **推理速度慢**:ViT架构的计算复杂度较高 - **内存占用大**:大型模型参数占用大量显存 - **部署困难**:需要完整的PyTorch环境 本文将详细介绍如何通过ONNX(Open...

gitblog_00696的博客 1301

使用 ABAP Development Tool 登录 SAP BTP ABAP 环境时,遇到弹出框应该怎么办?

但在实际环境里,隐私模式、第三方 Cookie 禁止、跨站追踪限制、缓存代理误命中、混合内容拦截等因素,都可能让这条跳转链路被打断。等),浏览器会弹出系统原生登录框,请求用户输入账号和口令或做集成认证。只要它们在响应头里出现,浏览器就会理直气壮地弹框,这是协议层的强约定。,最终弹出原生登录框。前端与网关领域有个通用的经验规则:如果你看到了原生登录框,而期望的是带样式的。环境里的登录方式表述为基于浏览器的前端认证,也就是这类重定向式的交互。环境的具体落地,拆出几类常见诱因与排障路径,并穿插真实世界的案例。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 369

使用 TensorRT 加速目的:加速模型的推理速度,同时优化模型的性能。,利用 TensorRT 的优化技术(如层融合、精度优化适用于需要在生产环境中快速部署和运行模型的场景,特别是在需要高吞吐量和

模型量化:通过减少模型的精度,降低模型的大小和内存占用,适用于资源受限的设备。TensorRT 加速:通过优化模型的推理过程,提高模型的运行速度,适用于需要高效率部署的场景。在 PyTorch 中,可以通过模块实现模型量化,通过torch2trt库将模型转换为 TensorRT 模型以加速推理。tensorflow适用于需要在生产环境中快速部署和运行模型的场景,特别是在需要高吞吐量和低延迟的场景中。# 模型量化压缩# 使用TensorRT加速。

AI 前沿技术实战博客:LLM / Agent / AI 制药 / 生信四大栏目日更,硬核干货 + 可复现代码,看完就能上手 920

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

突破GAN部署瓶颈:从PyTorch模型到高性能ONNX/TensorRT实践指南

传统PyTorch模型在生产环境中常面临推理速度慢、显存占用高的问题。以CycleGAN为例,其原始实现[implementations/cyclegan/cyclegan.py](https://link.gitcode.com/i/7662f2c3ed8ab91d30f539bfbadcb644)虽能完成图像风格迁移,但未针对部署优化。本文将以ESRGAN超分辨率模型为核心案例,详细介绍ONN...

gitblog_00287的博客 330

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深度学习模型部署——基于Onnx Runtime的深度学习模型CPU与GPU部署(C++实现)

以上就是在win 10下使用Onnx Runtime用CPU与GPU来对onnx模型进行推理部署的对比,可以明显的看出来,使用GPU之后的推理速度,但在正式的大型项目中,在win下使用GPU部署模型是不建议,一般都会选择Linux,那样对GPU的利用率会高出不少,毕竟蚊腿肉也是肉。

知来者逆的博客 2万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

实时分类系统优化:云端TensorRT加速实战

本文介绍了如何通过“星图GPU”平台自动化部署“AI 万能分类器”镜像,实现云端TensorRT加速的实时分类系统优化。该方案特别适用于直播平台等需要毫秒级响应的场景,可将传统PyTorch模型的推理速度提升5倍以上,满足20ms内的行业标准要求,显著提升AI应用的实时处理效率。

OpalStag58的博客 882

基于TensorRT加速的口罩检测模型部署教程

本文介绍了如何在星图GPU平台上自动化部署“实时口罩检测-通用”镜像,实现基于TensorRT加速的高性能口罩检测。该方案可应用于公共场所实时视频流分析,快速识别人员口罩佩戴情况,提升疫情防控效率与自动化水平。

weixin_28736145的博客 376

YOLOv8目标检测实战:ONNX模型转换及TensorRT部署

本课程讲述如何对YOLOv8目标检测的PyTorch权重文件转成ONNX格式并进行TensorRT加速部署。

bai666ai的博客 967
上一篇: Pytorch模型部署之--------TensorRT介绍
下一篇: Pytorch模型部署之-------pytorch部署全记录
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值