我试图通过将模型转换为OnnxRuntime来提高模型的性能。然而,当我试图测量推理时间时,我得到了一些奇怪的结果。
虽然只运行一个迭代,但OnnxRuntime的CPUExecutionProvider大大优于OpenVINOExecutionProvider:
但是,如果我运行5次迭代,结果是不同的:
如果我运行100次迭代,结果会完全不同:
在我看来,OpenVinoEP的推断时间不是线性的,但我不明白为什么。所以我的问题是:
代码是非常基本的:
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)
发布于 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执行提供程序。
有关更多信息,请参阅此运行时性能优化
发布于 2022-05-18 12:13:23
关于非线性时间,当您第一次使用OpenVINO运行模型时,可能会有一些准备--也许当您第一次调用sess.run
时,该模型首先被编译为OpenVINO。我在使用TFLite时观察到了类似的效果。对于这些场景,在基准测试时放弃第一次迭代的时间是有意义的。也有相当大的差异,所以运行>10或理想的情况下>100次迭代是个好主意。
https://stackoverflow.com/questions/70844974
复制相似问题