ONNXRuntime与PyTorch哪个更快?

在网上看到一些对比ONNXRuntime与PyTorch运行效率的文章,很多人运行的结果展示出ONNX可以提升几倍的运行效率,那么究竟有没有这么神奇呢,我来试一试。

        系统:Ubuntu22.04

        CPU:    Intel8750H

        显卡:3060

        模型选择最常用的ResNet50
 

import torch
import torchvision.models as models
 
# import
model = models.resnet50(pretrained=True)

首先将模型导出为onnx

 

# PyTorch model
torch.save(model, 'resnet.pth')
 
# random input
data = torch.rand(1,3,224,224)
# ONNX needs data example
torch.onnx.export(model, data, 'resnet.onnx')

 

  之后加载这两个模型

import onnxruntime
 
# PyTorch model
torch_model = torch.load('resnet.pth')
# ONNX model
onnx_model = onnxruntime.InferenceSession('resnet.onnx')
#torch_model.to("cuda:0")

 

将模型多次运行,计算平均用时。

from timeit import timeit
import numpy as np
 
data = np.random.rand(1,3,224,224).astype(np.float32)
torch_data = torch.from_numpy(data)
 
 
def torch_inf():
    torch_model(torch_data)
 
def onnx_inf():
    onnx_model.run(None,{
                onnx_model.get_inputs()[0].name: data
           })
n = 200
 
#warmup
#for i in range(1,100):
#    torch_inf()
torch_t = timeit(lambda : torch_inf(), number=n)/n
onnx_t = timeit(lambda : onnx_inf(), number=n)/n
 
print(f"PyTorch {torch_t} VS ONNX {onnx_t}")

 

得到的效果是这样的

PyTorch 0.12086693297999773 VS ONNX 0.005529450080002789

这里,我们可以看到,ONNX的运行时间远远小于PyTorch。

       

但是,这里有一个重要的问题。很多文章在这样测试的时候,忽略了model.eval()。这会让模型中一些inference时用不到的层也在执行。所以,我们在代码中加上

torch_model.eval()

 之后的输出就变成了

PyTorch 0.09768170792000092 VS ONNX 0.006109018884999386

       可以看到,效率差异没有那么的巨大了。那么如果使用GPU进行对比呢?

        我把onnxruntime换成onnxruntime-gpu,之后代码稍加改动

import onnxruntime
 
# PyTorch model
torch_model = torch.load('resnet.pth')
# ONNX model
onnx_model = onnxruntime.InferenceSession('resnet.onnx')
torch_model.to("cuda:0")
torch_data = torch.from_numpy(data).to("cuda:0")
torch_model.eval()

 此时的输出为

PyTorch 0.0061957750350029525 VS ONNX 0.006347028439995484

那么,在GPU环境下,使用onnxruntime的时间和PyTorch基本是一致的。 

文章转载自一个机器视觉工程师的自我修养_C#,RealSense+CSharp,onnxruntime-CSDN博客

 作为学习记录

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈子迩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值