首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OnnxRuntime与OnnxRuntime+OpenVinoEP推理时差

OnnxRuntime与OnnxRuntime+OpenVinoEP推理时差
EN

Stack Overflow用户
提问于 2022-01-25 07:42:20
回答 2查看 1.5K关注 0票数 2

我试图通过将模型转换为OnnxRuntime来提高模型的性能。然而,当我试图测量推理时间时,我得到了一些奇怪的结果。

虽然只运行一个迭代,但OnnxRuntime的CPUExecutionProvider大大优于OpenVINOExecutionProvider:

  • CPUExecutionProvider - 0.72秒
  • OpenVINOExecutionProvider - 4.47秒

但是,如果我运行5次迭代,结果是不同的:

  • CPUExecutionProvider - 3.83秒
  • OpenVINOExecutionProvider - 14.13秒

如果我运行100次迭代,结果会完全不同:

  • CPUExecutionProvider - 74.19秒
  • OpenVINOExecutionProvider -46.96秒

在我看来,OpenVinoEP的推断时间不是线性的,但我不明白为什么。所以我的问题是:

  • OpenVINOExecutionProvider为什么会这样做?
  • 我应该使用什么ExecutionProvider?

代码是非常基本的:

代码语言:javascript
运行
复制
import onnxruntime as rt
import numpy as np
import time 
from tqdm import tqdm

limit = 5
# MODEL
device = 'CPU_FP32'
model_file_path = 'road.onnx'

image = np.random.rand(1, 3, 512, 512).astype(np.float32)

# OnnxRuntime
sess = rt.InferenceSession(model_file_path, providers=['CPUExecutionProvider'], provider_options=[{'device_type' : device}])
input_name = sess.get_inputs()[0].name

start = time.time()
for i in tqdm(range(limit)):
    out = sess.run(None, {input_name: image})
end = time.time()
inference_time = end - start
print(inference_time)

# OnnxRuntime + OpenVinoEP
sess = rt.InferenceSession(model_file_path, providers=['OpenVINOExecutionProvider'], provider_options=[{'device_type' : device}])
input_name = sess.get_inputs()[0].name

start = time.time()
for i in tqdm(range(limit)):
    out = sess.run(None, {input_name: image})
end = time.time()
inference_time = end - start
print(inference_time)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-27 09:16:58

在OpenVINO执行提供程序中使用inferencing可以使用ONNX推断ONNX模型,而OpenVINO工具包则运行在后端。与Intel CPU、GPU、VPU和FPGA上的通用加速相比,这提高了ONNX模型在相同硬件上的性能。

通常,CPU执行提供程序在小迭代中工作最好,因为它的目的是保持二进制大小较小。同时,OpenVINO执行提供程序用于对Intel CPU、Intel集成GPU和Intel MovidiusTM视觉处理单元(VPU)进行深度学习推断。

这就是为什么在较大的迭代中,OpenVINO执行提供程序优于CPU执行提供程序的原因。

您应该选择满足您自己需求的执行提供程序。如果要使用大型迭代来执行复杂的DL,那么请使用OpenVINO执行提供程序。对于更简单的用例,您需要通过更小的迭代来减小二进制文件的大小,您可以选择CPU执行提供程序。

有关更多信息,请参阅此运行时性能优化

票数 3
EN

Stack Overflow用户

发布于 2022-05-18 12:13:23

关于非线性时间,当您第一次使用OpenVINO运行模型时,可能会有一些准备--也许当您第一次调用sess.run时,该模型首先被编译为OpenVINO。我在使用TFLite时观察到了类似的效果。对于这些场景,在基准测试时放弃第一次迭代的时间是有意义的。也有相当大的差异,所以运行>10或理想的情况下>100次迭代是个好主意。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70844974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档