Intel OpenVINO — synchronous, asynchronous

李謦伊
謦伊的閱讀筆記
8 min readNov 27, 2020

OpenVINO 可以設定要使用同步還是異步,先來說明什麼是同步跟異步

  • 同步 synchronous (sync): 程序中一次只能執行一項任務,並且要完成該任務才能執行下一項任務
  • 非同步、異步 asynchronous (async): 程序中可以同時執行不同任務,每個任務不需等到其他任務完成,即可執行下一項任務
source

接下來就來講講 OpenVINO 中異步 asynchronous (async) API 的使用方法

  • Python API (start_async)
官方

Asynchronous 使用方式為

# 設置網路
ie = IECore()
net = IENetwork(model=’Model.xml’, weights=’Model.bin’)exec_net = ie.load_network(network, device_name, num_requests=2)# 開啟非同步機制
infer_request_handle = exec_net.start_async(request_id=0, inputs={input_blob: image})
infer_status = infer_request_handle.wait()res = infer_request_handle.output_blobs[out_blob_name]

接著示範 python demo — object_detection_demo_yolov3_async,詳細使用方式可參考 Demo 範例: https://docs.openvinotoolkit.org/2020.3/_demos_object_detection_demo_yolov3_async_README.html

首先要設定 OpenVINO 的環境。開啟 cmd ,進入至 C:\Program Files (x86)\IntelSWTools\openvino\bin

$ cd C:\Program Files (x86)\IntelSWTools\openvino\bin# 執行
$ setupvars.bat
# 下載模型
$ cd C:\Program Files (x86)\IntelSWTools\openvino\deployment_tools\tools\model_downloader
$ python downloader.py --name yolo-v3-tf --output_dir C:\Users\joyle\Documents\Intel\model# 轉換模型
$ python converter.py --name yolo-v3-tf -d C:\Users\joyle\Documents\Intel\model

下載並轉換完模型後,會在設定好的路徑中看到 FP16, FP32 的模型

接著到 object_detection_demo_yolov3_async.py demo 資料夾

$ cd C:\Program Files (x86)\IntelSWTools\openvino_2020.3.194\deployment_tools\open_model_zoo\demos\python_demos\object_detection_demo_yolov3_async

查看 object_detection_demo_yolov3_async.py 有哪些參數設置

搜尋 is_async_mode 可以看到已設置為 True

往下可以看到使用 start_async API 設置異步

執行 demo,device 可以設置 CPU, GPU, FPGA, HDDL, MYRIAD,這邊示範使用 NCS2,因此設定為 MYRIAD

$ python object_detection_demo_yolov3_async.py -i cam -m C:\Users\joyle\Documents\Intel\model\public\yolo-v3-tf\FP16\yolo-v3-tf.xml -d MYRIAD

預設為異步模式,不過對預測影片按 tab 可以轉換為同步模式,在影片左上角會顯示 inference 所花費的時間 (ms),可以比較兩者的差異

  • C++ API (start_async)
官方

Asynchronous 使用方式

// 設置網路
Core ie;
CNNNetReader networkReader;networkReader.ReadNetwork(“Model.xml”);networkReader.ReadWeights(“Model.bin”);CNNNetwork network = networkReader.getNetwork();ExecutableNetwork executable_network = ie.LoadNetwork(network, device_name);// 開啟非同步機制
auto input = async_infer_request.GetBlob(input_name);
async_infer_request->StartAsync();async_infer_request.Wait(IInferRequest::WaitMode::RESULT_READY);auto output = async_infer_request.GetBlob(output_name);

接著示範 object_detection_demo_yolov3_async,詳細使用方式可參考 Demo 範例: https://docs.openvinotoolkit.org/2020.3/_demos_object_detection_demo_yolov3_async_README.html

接著到 C:\Program Files (x86)\IntelSWTools\openvino_2020.3.194\deployment_tools\open_model_zoo\demos\object_detection_demo_yolov3_async

查看 object_detection_demo_yolov3_async.hpp 有哪些參數設置

搜尋 isAsyncMode 可以看到設置為 false

往下可以看到使用 StartAsync API 設置異步

執行 demo,這邊 device 示範使用 NCS2,因此設定為 MYRIAD

$ cd C:\Users\joyle\Documents\Intel\OpenVINO\omz_demos_build\intel64\Release$ object_detection_demo_yolov3_async -i cam -m C:\Users\joyle\Documents\Intel\model\public\yolo-v3-tf\FP16\yolo-v3-tf.xml -d MYRIAD

C++ code 與 python 的不太一樣,預設為同步模式,不過對預測影片按 tab 可以轉換為異步模式,一樣在影片左上角會顯示 inference 所花費的時間 (ms) 跟 fps,可以比較兩者的差異

OpenVINO 文章:

Intel OpenVINO介紹與安裝教學

Intel OpenVINO with NCS2

Intel OpenVINO — synchronous, asynchronous

Intel OpenVINO 模型轉換 — TensorFlow, Darknet YOLO, ONNX

--

--