30分钟吃掉pytorch转onnx及推理

PyTorch模型工业级部署:ONNX+TensorRT嵌入式推理实战 机器学习模型部署不是调参终点,而是系统工程的起点。从PyTorch训练模型出发,需经ONNX格式中转、算子兼容性校验、TensorRT引擎构建、FP16精度与性能权衡等关键环节,最终落地于Jetson等边缘硬件。其核心原理在于脱离Python解释器、固化输入形状、预分配内存、绑定硬件资源,以换取确定性低延迟(如22±1.3ms)和高稳定性。技术价值体现在降低端侧推理开销、规避HTTP/JSON等非实时协议、适配工业PLC时序约束;典型应用场景包括AGV避障、智能仓储视觉检测、边缘实时目标识别等。本文聚焦Py 阅读详情

pytorch模型线上部署最常见的方式是转换成onnx然后再转成tensorRT 在cuda上进行部署推理。

本文介绍将pytorch模型转换成onnx模型并进行推理的方法。

#!pip install onnx 
#!pip install onnxruntime
#!pip install torchvision

公众号算法美食屋后台回复关键词:源码,获取本文notebook源代码。

一,准备pytorch模型

我们先导入torchvision中的resnet18模型,演示它的推理效果。

以便和onnx的结果进行对比。

import torch
import torchvision.models as models
import numpy as np
import torchvision
import torchvision.transforms as T


from PIL import Image


def create_net():
    net = models.resnet18(weights=torchvision.models.ResNet18_Weights.IMAGENET1K_V1)
    return net 


net = create_net()


torch.save(net.state_dict(),'resnet18.pt')
net.eval();
def get_test_transform():
    return T.Compose([
        T.Resize([320, 320]),
        T.ToTensor(),
        T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])


image = Image.open("dog.png") # 289
img = get_test_transform()(image)
img = img.unsqueeze_(0) 
output = net(img)
score, indice = torch.max(torch.softmax(output,axis=-1),1)
info = {'score':score.tolist()[0],'indice':indice.tolist()[0]}


def show_image(image, title):
    import matplotlib.pyplot as plt 
    ax=plt.subplot()
    ax.imshow(image)
    ax.set_title(title)
    ax.set_xticks([])
    ax.set_yticks([]) 
    plt.show()


show_image(image, title = info)

35c44ecc42bff2e1badd24ed674a4d86.png

二,pytorch模型转换成onnx模型

1, 简化版本

import onnxruntime
import onnx


batch_size = 1  
input_shape = (3, 320, 320)   


x = torch.randn(batch_size, *input_shape)
onnx_file = "resnet18.onnx"
torch.onnx.export(net,x,onnx_file,
                opset_version=10,
                do_constant_folding=True,  # 是否执行常量折叠优化
                input_names=["input"],
                output_names=["output"],
                dynamic_axes={
                    "input":{0:"batch_size"},  
                     "output":{0:"batch_size"}})
!du -s -h resnet18.pt
45M	resnet18.pt
!du -s -h resnet18.onnx
45M	resnet18.onnx

可以在 https://netron.app/ 中拖入 resnet18.onnx 文件查看模型结构

2,全面版本

下面的代码包括了设置输入输出尺寸,以及动态可以变batch等等。

import argparse
from argparse import Namespace
import time
import sys
import os
import torch
import torch.nn as nn
import torchvision.models as models
import onnx
import onnxruntime


from io import BytesIO




ROOT = os.getcwd()
if str(ROOT) not in sys.path:
    sys.path.append(str(ROOT))


params = Namespace(weights='resnet18.pt',
                   img_size=[320,320],
                   batch_size=1,
                   half=False,
                   dynamic_batch=True
                  )


parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='checkpoint.pt', help='weights path')
parser.add_argument('--img-size', nargs='+', type=int, default=[320, 320], help='image size')  # height, width
parser.add_argument('--batch-size', type=int, default=1, help='batch size')
parser.add_argument('--half', action='store_true', help='FP16 half-precision export')
parser.add_argument('--inplace', action='store_true', help='set Detect() inplace=True')
parser.add_argument('--simplify', action='store_true', help='simplify onnx model')
parser.add_argument('--dynamic-batch', action='store_true', help='export dynamic batch onnx model')
parser.add_argument('--trt-version', type=int, default=8, help='tensorrt version')
parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')


args = parser.parse_args(args='',namespace=params)




args.img_size *= 2 if len(args.img_size) == 1 else 1  # expand
print(args)


t = time.time()


# Check device
cuda = args.device != 'cpu' and torch.cuda.is_available()
device = torch.device(f'cuda:{args.device}' if cuda else 'cpu')
assert not (device.type == 'cpu' and args.half), '--half only compatible with GPU export, i.e. use --device 0'


# Load PyTorch model
model = create_net()
model.to(device)
model.load_state_dict(torch.load(args.weights)) # pytorch模型加载


# Input
img = torch.zeros(args.batch_size, 3, *args.img_size).to(device)  # image size(1,3,320,192) iDetection


# Update model
if args.half:
    img, model = img.half(), model.half()  # to FP16
model.eval()


prediction = model(img)  # dry run


# ONNX export
print('\nStarting to export ONNX...')
export_file = args.weights.replace('.pt', '.onnx')  # filename
with BytesIO() as f:
    dynamic_axes = {"input":{0:"batch_size"}, "output":{0:"batch_size"} } if args.dynamic_batch else None
    torch.onnx.export(model, img, f, verbose=False, opset_version=13,
                      training=torch.onnx.TrainingMode.EVAL,
                      do_constant_folding=True,
                      input_names=['input'],
                      output_names=['output'],
                      dynamic_axes=dynamic_axes)
    f.seek(0)
    # Checks
    onnx_model = onnx.load(f)  # load onnx model
    onnx.checker.check_model(onnx_model)  # check onnx model
    
if args.simplify:
    try:
        import onnxsim
        print('\nStarting to simplify ONNX...')
        onnx_model, check = onnxsim.simplify(onnx_model)
        assert check, 'assert check failed'
    except Exception as e:
        print(f'Simplifier failure: {e}')


onnx.save(onnx_model, export_file)


print(f'ONNX export success, saved as {export_file}')


# Finish
print('\nExport complete (%.2fs)' % (time.time() - t))
Namespace(weights='resnet18.pt', img_size=[320, 320], batch_size=1, half=False, dynamic_batch=True, inplace=False, simplify=False, trt_version=8, device='cpu')

Starting to export ONNX...
ONNX export success, saved as resnet18.onnx

Export complete (0.57s)

三,使用onnx模型进行推理

1,函数风格

onnx_sesstion = onnxruntime.InferenceSession(export_file)
def pipe(img_path,
         onnx_sesstion = onnx_sesstion):
    image = Image.open(img_path) 
    img = get_test_transform()(image)
    img = img.unsqueeze_(0) 


    to_numpy = lambda tensor: tensor.data.cpu().numpy()
    
    inputs = {onnx_sesstion.get_inputs()[0].name: to_numpy(img)}
    outs = onnx_sesstion.run(None, inputs)[0]


    score, indice = torch.max(torch.softmax(torch.as_tensor(outs),axis=-1),1)
    info = {'score':score.tolist()[0],'indice':indice.tolist()[0]}
    return info
img_path = 'dog.png'
image = Image.open(img_path)
info = pipe(img_path)
show_image(image,info)

5bb3e0e3bd75dd3694f3ce98f42fb5b4.png

2,对象风格

import os, sys


import onnxruntime
import onnx
    
class ONNXModel():
    def __init__(self, onnx_path):
        self.onnx_session = onnxruntime.InferenceSession(onnx_path)
        self.input_names = [node.name for node in self.onnx_session.get_inputs()]
        self.output_names = [node.name for node in self.onnx_session.get_outputs()]
        print("input_name:{}".format(self.input_names))
        print("output_name:{}".format(self.output_names))
 
    def forward(self, x):
        if isinstance(x,np.ndarray):
            assert len(self.input_names)==1
            input_feed = {self.input_names[0]:x}
        elif isinstance(x,(tuple,list)):
            assert len(self.input_names)==len(x)
            input_feed = {k:v for k,v in zip(self.input_names,x)}
        else:
            assert isinstance(x,dict)
            input_feed = x
        outs = self.onnx_session.run(self.output_names, input_feed=input_feed)
        return outs
    
    def predict(self,img_path):
        image = Image.open(img_path) 
        img = get_test_transform()(image)
        img = img.unsqueeze_(0) 
        to_numpy = lambda tensor: tensor.data.cpu().numpy()
        outs = self.forward(to_numpy(img))[0]
        score, indice = torch.max(torch.softmax(torch.as_tensor(outs),axis=-1),1)
        return {'score':score[0].data.numpy().tolist(),
            'indice':indice[0].data.numpy().tolist()}
onnx_model = ONNXModel(export_file)
info = onnx_model.predict(img_path)
show_image(image, title = info)
input_name:['input']
output_name:['output']

e1e4da5206fcf00a85153d5ff34d3977.png

c3fc58f804e640de7223dfeb9cecba8a.png

保姆级教程:用LabVIEW+ONNX,5分钟把PyTorch训练好的YOLOv8模型跑起来 本文提供了一份详细的工业视觉开发指南,介绍如何通过LabVIEW和ONNX Runtime将PyTorch训练的YOLOv8模型快速集成到工业测控系统中。文章涵盖环境配置、模型转换、LabVIEW集成、实时推理和性能优化等关键步骤,特别适合需要高可靠性和实时响应的工业场景,如生产线质量检测和智能仓储管理。 阅读详情

相关推荐

Pytorch模型转ONNX格式详解

ONNX(Open Neural Network Exchange)则是一种开源的跨平台深度学习框架。将PyTorch模型转为ONNX格式可以使得该模型可以在其他的深度学习框架中使用,如TensorFlow,Caffe等。下面介绍一下PyTorch转ONNX的原理和方法。

crasher123的博客 5308

Pytorch转onnx详解

前言本文作者总结了自己参与Pytorch到ONNX的模型转换转换工作中的经验,主要介绍了该转换工作的意义,模型部署的路径以及Pytorch本身的局限。作者:立交桥跳水冠军@知乎仅用于学术分享,若侵权请联系删除之前几个月参与了OpenMMlab的模型转ONNX的工作(github account: drcut),主要目标是支持OpenMMLab的一些模型从Pytorch到ONNX的转换。这几个月虽...

weixin_40920183的博客 1464

模型转换 PyTorch转ONNX 入门

本文主要介绍如何将PyTorch模型转换为ONNX模型,为后面的模型部署做准备。转换后的xxx.onnx模型,进行加载和测试。最后介绍使用Netron,可视化ONNX模型,看一下网络结构;查看使用了那些算子,以便开发部署。目录前言一、PyTorch模型转ONNX模型1.1 转换为ONNX模型且加载权重1.2 转换为ONNX模型但不加载权重1.3 torch.onnx.export() 函数二、加载ONNX模型三、可视化ONNX模型。

黎国溥 2万+

Pytorch 转ONNX详解

模型部署面临两大问题,如何让开发者不受开发框架的限制和如何提升模型的运算效率。经过工业界和学术界数年的探索,一般流行的模型部署流水线是:首先开发者们在任意一种深度学习框架下定义网络结构,训练得到网络参数;然后,将模型的结构和参数转换成一种只描述网络结构的中间表示。针对网络结构的优化会在这步进行。ONNX就是一种模型中间表示。 最后,用面向硬件的高性能编程框架(如 CUDA,OpenCL)编写能高效执行深度学习网络中算子的推理引擎,推理引擎将中间表示转换成特定的文件格式。

陶将的博客 8152

python使用onnx模型进行推理

【代码】python使用onnx模型进行推理。

null 4771

智能系统部署基础|单机/云端/边缘三大范式+PyTorch转ONNX提速2-5倍

文章摘要:模型部署的关键技术与实践 本文系统介绍了AI模型部署的核心概念和方法。主要内容包括: 模型部署本质:将训练好的模型从实验环境迁移到生产环境,面临环境一致性、性能、可用性等挑战。 三大部署范式: 单机部署:数据安全但运维成本高 云端部署:弹性扩展,适合互联网产品 边缘部署:低延迟,适用于IoT场景 模型格式转换: 对比了.pkl、.pt、ONNX等格式特性 详细演示了PyTorch转ONNX的代码实现 ONNX Runtime推理速度可提升2-5倍 部署方案选择需综合考量算力、延迟、安全等需求,ON

白话机器学习 518

30分钟吃掉 Pytorch 转 onnx

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学.针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。PyTorch 是一个用于机器学习的开源深度学习框架,而ONNX(Open Neural Network Exchange)是一个用于表示深度学习模型的开放式格式。ONNX是一个跨平台的格式,支持多种深度学习框架,包括PyTorch、TensorFlow等。

2201_75499313的博客 1456

RetinaFace C++ ONNX推理落地实战指南

RetinaFace是一种高精度单阶段人脸检测模型,其ONNX格式部署在C++环境中涉及预处理对齐、模型导出规范、内存管理与后处理复现等核心环节。ONNX Runtime作为跨平台推理引擎,需结合OpenCV完成图像加载、BGR/RGB转换、归一化及resize等关键步骤,同时兼顾AVX加速与int8量化支持。技术价值在于保障C++端输出与PyTorch训练结果严格一致,满足安防、边缘设备等对确定性延迟(如23ms内)、无Python依赖及硬件绑定(如TensorRT)的工业级要求。本文聚焦真实产线中Ret

weixin_30628801的博客 315

PyTorch vs ONNX:InstantID推理引擎速度对决(2025实测)

InstantID作为当前最热门的AI人脸生成工具,其推理速度直接影响用户体验和生产效率。本文将通过2025年最新实测数据,深入对比PyTorch与ONNX两大推理引擎在InstantID中的性能表现,为开发者和用户提供权威的选择指南。 ## 🌟 InstantID推理性能关键指标 在开始性能对比前,我们需要了解InstantID的核心推理参数。通过分析项目源码发现,InstantID默认使

gitblog_00960的博客 953

设计师必看!用Figma MCP自动生成开发文档的隐藏技巧

本文为设计师揭秘利用Figma MCP协议自动生成开发文档的隐藏技巧。通过将设计稿转化为结构化数据,实现设计规范的自动化输出、版本同步与动态更新,并借助AI助手提升协作效率,彻底告别繁琐的手动标注与沟通。

berry的博客 924

用于多种无人机协作的群体智能算法:综合综述

随着无人机技术的快速高水平发展,将多架无人机作为自主控制的编队应用于复杂情况是一个新兴领域的代表之一。在实现自主控制的挑战中,碰撞避免、任务分配、路径规划和编队重构是关键功能。本文对各种经典的无人机群智能算法进行了系统的总结和分析。

erjia_的博客 1万+

5分钟快速上手onnx2tflite:ONNX模型转TFLite的4步极简教程

onnx2tflite 是一款轻量易用的开源模型转换工具,核心功能是把 ONNX 模型一键转换为 Keras(h5)或 TFLite 格式,平均元素误差小于 1e-5,转换出的 TFLite 模型推理速度比同类工具快约 30%,特别适合想把 PyTorch 视觉模型部署到移动端的初学者。 ## 为什么选择 onnx2tflite?🚀 在开始之前,先用 10 秒了解它的核心优势: | 亮点

gitblog_00431的博客 805

3D打印切片软件Cura及CuraEngine原理分析

引言         年初开始进入3D打印行业,受命以Cura为基础,研发一款自主的3D打印切片软件。         自主研发要取其长处,补其不足,首先自然是要搞清楚Cura到底做了什么,读Cura的代码是必需的。我一向都觉得比起自己写代码来,读别人的代码是一个漫又而痛苦的过程,读者的思想与写者总有偏差,往往又无法验证自己的猜想是否正确,只叹人脑不是电脑,无法把眼前的代码从头到尾执行一遍...

AiDiShengDeXiaoWu的博客 4424

5分钟搞定EfficientNet-PyTorch转ONNX:动态轴设置与优化指南

你是否在模型部署时遇到过输入尺寸固定的困扰?是否因ONNX导出后推理速度未达预期而头疼?本文将通过实战案例,带你一步解决EfficientNet模型转换中的动态轴配置、算子兼容性和性能优化三大核心问题,让你的模型在生产环境中高效运行。 ## 准备工作:环境与模型准备 首先确保已安装必要依赖,推荐使用Python 3.8+环境: ```bash pip install torch onnx o...

gitblog_01024的博客 872

CAN总线BusOff恢复机制详解:快慢恢复策略在车载网络中的实战应用

本文深入解析了CAN总线BusOff恢复机制,重点阐述了快慢恢复策略在车载网络中的工程应用。通过对比NXP S32K与STM32平台的实现代码,并结合CANoe仿真与参数优化方法,为工程师提供了从理论到实战的完整解决方案,旨在提升车载网络的可靠性与功能安全。

7up55的博客 615

护网日志分析基础

简要介绍日志分析,给出日志分析的步骤和思路。要求根据日志中的字符串特征,识别攻击者的攻击工具;根据日志中的行为特征,确定攻击者可能的攻击手段等。总结归纳护网中常见的中间件Tomcat、Apache、Weblogic、Nginx、Apache、IIS、MySQL、SQL Server、Oracle的日志路径和日志配置文件路径等。

m0_59302403的博客 3702

SenseVoice-Small ONNX入门必看:ONNX Runtime推理性能 vs PyTorch原版对比

本文介绍了如何在星图GPU平台上一键自动化部署⚡ SenseVoice-Small ONNX语音识别工具镜像,实现高效的语音转文本应用。该镜像通过ONNX Runtime优化,显著提升推理速度并降低资源占用,适用于实时语音转录、会议记录等轻量化语音识别场景。

weixin_42588555的博客 182

【重磅更新】CT/MRI LI-RADS 2024:肝细胞癌局部区域治疗后反应评估的核心突破与临床实践指南

减少过度治疗:辐射 LRT 的 Nonprogressing 类别避免了 “持续强化 = 存活” 的误判,降低不必要的再治疗风险;提高检出效率:非辐射 LRT 的辅助特征升级减少了 Equivocal 比例,更早识别存活肿瘤;统一评估语言:标准化的分类标准为放射科、肝病科、肿瘤科、肝移植科的多学科协作(MDT)提供了统一 “沟通工具”,助力治疗方案的精准制定。

楚山之石的博客 1226

ONNX Runtime实战:如何用Python在5分钟内将PyTorch模型加速3倍(附完整代码)

本文详细介绍了如何使用ONNX Runtime在5分钟内将PyTorch模型加速3倍,包括模型转换、推理加速实现及高级优化技巧。通过实战代码演示,帮助开发者快速掌握ONNX Runtime这一高效推理引擎,显著提升AI模型部署效率。

bean的博客 490

从维纳滤波到Richardson-Lucy:图像去模糊算法的原理与实践

本文深入解析了图像去模糊的核心原理,重点对比了维纳滤波与Richardson-Lucy两种经典去卷积算法。维纳滤波在频域进行快速权衡,适用于高斯噪声场景;而Richardson-Lucy算法基于泊松噪声模型迭代优化,更适用于天文、显微等科学成像。文章通过Python代码实践,详细阐述了PSF(点扩散函数)的关键作用及算法选型指南。

weixin_29285605的博客 386

【异常】XXL-JOB提示异常ERROR com.xxl.job.core.util.XxlJobRemotingUtil - connect timed out

打开XXL-JOB的ELK,发现一堆报错。

奶爸的编程之路,也就一周冷个三天 2049

告别算力焦虑:LLaMA-Factory一键实现PyTorch模型转ONNX/TensorRT全攻略

你是否曾因模型部署时的兼容性问题头疼?还在为PyTorch模型转ONNX/TensorRT的复杂流程发愁?本文将带你用LLaMA-Factory框架实现从模型微调、权重合并到多格式导出的全流程自动化,让大模型部署效率提升10倍。读完你将掌握:PyTorch转ONNX/TensorRT的零代码方案、量化参数调优技巧、常见错误排查指南。 ## 环境准备与依赖安装 LLaMA-Factory提供统一

gitblog_00106的博客 406

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

3分钟上手!Real-ESRGAN模型转换神器:PyTorch到ONNX一键部署指南

你还在为模型部署兼容性发愁?当需要将PyTorch模型集成到移动端或边缘设备时,ONNX(Open Neural Network Exchange,开放神经网络交换格式)往往是最佳选择。本文将带你零基础完成Real-ESRGAN模型从PyTorch到ONNX的转换全流程,只需3个步骤即可获得跨平台运行能力。 读完本文你将掌握: - 模型转换工具的安装与环境配置 - 一行命令完成PyTorch到O...

gitblog_00343的博客 722

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

3分钟掌握ONNX Simplifier:让你的深度学习模型轻装上阵

还在为ONNX模型过于复杂而烦恼吗?想要让模型体积减半、推理速度提升吗?ONNX Simplifier就是你的终极解决方案!这款强大的模型优化工具能够自动简化ONNX格式的深度学习模型,去除冗余计算节点,让模型变得更加简洁高效。无论你是深度学习新手还是经验丰富的开发者,掌握这个工具都能让你的模型部署工作事半功倍。 ## 为什么你的ONNX模型需要"瘦身"? 在深度学习开发中,我们经常遇到一个令

gitblog_00035的博客 363

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

零基础入门ONNXRuntime:30分钟部署第一个AI模型

它的在线环境已经预装了常用库,省去了配置环境的麻烦,而且可以直接运行和调试代码,对新手非常友好。最棒的是,完成的项目可以一键部署成可访问的服务,不用操心服务器配置这些复杂问题。通过这个简单的实践,我对模型部署的流程有了更清晰的认识。建议新手朋友也可以从这个简单的例子入手,逐步深入理解AI模型部署的各个环节。作为一个刚接触AI模型部署的新手,我发现这个工具真的能大大简化模型推理的流程。下面就把我的学习过程整理出来,希望能帮到同样想入门的朋友。这部分代码要特别注意和训练时的预处理保持一致,否则会影响模型效果。

YellowSun24的博客 311

PyTorch 2.7模型转换:ONNX/TensorRT环境预配置

本文介绍了基于星图GPU平台自动化部署PyTorch 2.7镜像的完整流程,该镜像预集成ONNX与TensorRT,支持一键完成模型转换与优化。用户可快速将PyTorch模型转为高性能TensorRT引擎,典型应用于边缘设备上的AI推理加速,显著提升部署效率并降低资源消耗。

GarnetLynx45的博客 658
上一篇: 3个plotly实用进阶范例~
下一篇: darts 时序预测入门
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值