【问题标题】:How do I do async inference on OpenVino如何在 OpenVino 上进行异步推理
【发布时间】:2019-06-18 07:25:06
【问题描述】:

我编写了一个 python 服务器,它使用 OpenVino 网络对传入请求进行推理。为了加快速度,我在多个线程中接收请求,并且我想同时运行推理。 似乎无论我做什么,我得到的时间都与非并发解决方案相同 - 这让我觉得我错过了一些东西。

我用 Python 编写它,使用的是 openvino 2019.1.144。我正在对同一个插件和网络使用多个请求,以尝试使推理同时运行。

def __init__(self, num_of_requests: int = 4):
   self._plugin = IEPlugin("CPU", plugin_dirs=None)
   model_path = './Det/'
   model_xml = os.path.join(model_path, "ssh_graph.xml")
   model_bin = os.path.join(model_path, "ssh_graph.bin")
   net = IENetwork(model=model_xml, weights=model_bin)
   self._input_blob = next(iter(net.inputs))

   # Load network to the plugin
   self._exec_net = self._plugin.load(network=net, num_requests=num_of_requests)
   del net

def _async_runner(detect, images_subset, idx):
    for img in images_subset:
        request_handle = self._exec_net.start_async(request_id=idx, inputs={self._input_blob: img})
        request_handle.wait()


def run_async(images):  # These are the images to infer
    det = Detector(num_of_requests=4)
    multiplier = int(len(images)/4)
    with ThreadPoolExecutor(4) as pool:
        futures = []
        for idx in range(0,3):
            images_subset = images[idx*multiplier:(idx+1)*multiplier-1]
            futures.append(pool.submit(_async_runner, det.detect, images_subset, idx))

当我在同步模式下运行 800 次推理时,我得到一个平均值。运行时间 290ms 当我在异步模式下运行时,平均运行时间为 280 毫秒。 这些都不是实质性的改进。我做错了什么?

【问题讨论】:

    标签: python-multithreading openvino


    【解决方案1】:

    如果使用 wait(),执行线程会阻塞,直到结果可用。如果你想使用真正的异步模式,你需要 wait(0) ,它不会阻塞执行。只需在需要时启动推理并存储 request_id。然后,您可以检查结果是否可用,检查 wait(0) 的返回值是否为 0。注意不要在 IE 进行推理时使用相同的 request_id,这将导致冲突并引发例外。

    但是,在您提供的代码中,您不能这样做,因为您正在创建一个线程池,每个线程将图像子集推断为唯一的 request_id。事实上,这是一个并行执行,它会给你一个相当不错的性能,但它不是“异步”模式。

    真正的异步模式应该是这样的:

    while still_items_to_infer():
        get_item_to_infer()
        get_unused_request_id()
        launch_infer()
        do_someting()
        if results_available():
            get_inference_results()
            free_request_id()
            #This may be in a new thread
            process_inference_results()
    

    这样,您在等待它们完成的同时发送连续的推理。

    【讨论】:

    • 对不起,再问一个问题。我已经尝试过异步推理并将其与flask api 集成以进行Web 请求,但由于async_lock 在多个请求后失败。您知道与 API 集成的最佳方式是什么吗?
    【解决方案2】:

    您可以参考 C:\Program Files (x86)\IntelSWTools\openvino_2019.1.144\inference_engine\samples\python_samples\object_detection_demo_ssd_async\object_detection_demo_ssd_async.py 中的示例代码或 python_samples 目录中的类似示例来检查异步模式的方式已解决。

    【讨论】:

    • 据我了解,示例文件的问题在于它们并没有真正执行异步推理。他们使用异步方法,然后立即执行 wait()。这意味着所有推理都按顺序执行。我错过了什么吗?
    • @YoavMoran 他们提出了一个新请求,但等待旧请求。注意请求ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多