色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用AsyncInferQueue進一步提升AI推理程序的吞吐量

英特爾物聯網 ? 來源:英特爾物聯網 ? 2023-01-06 09:57 ? 次閱讀

本文將介紹基于OpenVINO的異步推理隊列類 AyncInferQueue,啟動多個(>2)推理請求(infer request),幫助讀者在硬件投入不變的情況下,進一步提升 AI 推理程序的吞吐量(Throughput)。

在閱讀本文前,請讀者先了解使用 start_async() 和 wait() 方法實現基于2個推理請求的異步推理實現方式。該異步推理實現方式相對于同步推理方式,極大提升了 AI 推理程序的吞吐量,但從任務管理器中可以看到,AI 推理硬件的利用率還有很大的提升空間。

d95eaa84-8d5d-11ed-bfe3-dac502259ad0.png

這意味著,AI 推理硬件還有潛力可挖,可以通過進一步提高推理請求個數來提升 AI 推理硬件的利用率,從而提高 AI 推理程序的吞吐量。

1.1

推理請求(InferRequest)和流(stream)

OpenVINO 運行時(Runtime)用推理請求(infer request)來抽象在指定計算設備上運行已編譯模型(Compiled_Model)。從編寫程序的角度看,推理請求是一個類,封裝了支持推理請求以同步或異步方式運行的屬性和方法。

推理請求(InferRequest)類的詳細定義參考:

https://github.com/openvinotoolkit/openvino/blob/master/src/inference/include/openvino/runtime/infer_request.hpp#L34

推理請求的個數,由開發者定義;但計算設備能并行處理的推理請求個數,由硬件本身的處理單元(Processing Unit)決定。超過計算硬件并行處理數量的推理請求,會被計算硬件用隊列儲存起來,當計算硬件空閑后,隊列中的推理請求將被依次取出并執行。

OpenVINO用流(stream)來抽象計算設備能并行處理推理請求的能力,通過屬性:“NUM_STREAMS”,可以獲取延遲優先或吞吐量優先模式下的計算硬件支持的最優streams數量,如下表所示。

d98c3af8-8d5d-11ed-bfe3-dac502259ad0.png

:上述數據在蝰蛇峽谷上測得,CPU=i7-12700H, 集成顯卡=Iris Xe, 獨立顯卡=A770m

: GPU設備沒有INFERENCE_NUM_THREADS屬性

上述數據測試的源代碼如下,歡迎各位讀者在自己的硬件平臺上測試:

from openvino.runtime import Core, get_version
core = Core()
print(get_version())
print(core.available_devices)
device = device = ['GPU.0', 'GPU.1', 'CPU', 'AUTO', 'AUTO:GPU,-CPU'][0]
cfgs = {}
cfgs['PERFORMANCE_HINT'] = ['THROUGHPUT', 'LATENCY', 'CUMULATIVE_THROUGHPUT'][0]
net = core.compile_model("model.onnx",device,cfgs)
# Get Supported properties
supported_properties = net.get_property('SUPPORTED_PROPERTIES')
print(f'Support properties for {device}:', supported_properties)
opt_nireq = net.get_property('OPTIMAL_NUMBER_OF_INFER_REQUESTS')
print(f'OPTIMAL_NUMBER_OF_INFER_REQUESTS for {device}:', opt_nireq)
nstreams = net.get_property('NUM_STREAMS')
print(f'nstreams for {device}:', nstreams)
performance_hint_num_requests = net.get_property('PERFORMANCE_HINT_NUM_REQUESTS')
print(f'performance_hint_num_requests for {device}:', performance_hint_num_requests)
if device == "CPU":
  # INFERENCE_NUM_THREADS
  inference_num_threads = net.get_property('INFERENCE_NUM_THREADS')
  print(f'inference_num_threads for {device}:', inference_num_threads)
else:
  gpu_queue_priority = net.get_property('GPU_QUEUE_PRIORITY')
print(f'GPU queue priority for {device}:', gpu_queue_priority)

向右滑動查看完整代碼

1.1.1

CPU 的流與推理請求

對于 CPU 來說,一個流(stream)只能服務一個推理請求。通過屬性ov::range_for_streams,可以查到 CPU 支持的流數量的范圍;流的數量無需開發者使用代碼顯示設置,OpenVINO 運行時會根據延遲優先或吞吐量優先來自動設置。

d9ada4a4-8d5d-11ed-bfe3-dac502259ad0.png

1.1.2

GPU 的流與推理請求

對于 GPU 來說,一個流(stream)可以同時服務兩個推理請求。通過屬性 ov::range_for_streams,可以查到 GPU 支持的流數量的范圍:[1, 2];流的數量無需開發者使用代碼顯示設置,OpenVINO 運行時會根據延遲優先或吞吐量優先來自動設置。

d9c8a84e-8d5d-11ed-bfe3-dac502259ad0.png

參考代碼:

https://www.jianshu.com/p/1748444e6a50

1.2

AsyncInferQueue類

OpenVINO運行時(Runtime)提供 AsyncInferQueue 類來抽象并管理異步推理請求池,其常用方法和屬性有:

__init__(self, compiled_model, jobs = 0):創建AsyncInferQueue對象

set_callback(func_name):為推理請求池中所有的推理請求設置統一的回調函數

start_async(inputs, userdata = None):異步啟動推理請求

wait_all():等待所有的推理請求執行完畢

1.2.1

基于AsyncInferQueue類的

異步推理范例程序

基于 AsyncInferQueue 類 YOLOv5 模型的異步推理范例程序的核心代碼部分如下所示:

完整范例代碼請下載:yolov5_async_infer_queue.py

https://gitee.com/ppov-nuc/yolov5_infer/blob/main/yolov5_async_infer_queue.py

運行代碼前,請參考運行環境搭建流程。

...
def preprocess(frame):
  # Preprocess the frame
  letterbox_im, _, _= letterbox(frame, auto=False) # preprocess frame by letterbox
  im = letterbox_im.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR to RGB
  im = np.float32(im) / 255.0  # 0 - 255 to 0.0 - 1.0
  blob = im[None] # expand for batch dim
  return blob, letterbox_im.shape[:-1], frame.shape[:-1]
def postprocess(ireq: InferRequest, user_data: tuple):
  result = ireq.results[ireq.model_outputs[0]]
  dets = non_max_suppression(torch.tensor(result))[0].numpy()
  bboxes, scores, class_ids= dets[:,:4], dets[:,4], dets[:,5]
  # rescale the coordinates
  bboxes = scale_coords(user_data[1], bboxes, user_data[2]).astype(int)
  print(user_data[0],"	"+f"{ireq.latency:.3f}"+"	", class_ids)
  return 
# Step1:Initialize OpenVINO Runtime Core
core = Core()
# Step2: Build compiled model
device = device = ['GPU.0', 'GPU.1', 'CPU', 'AUTO', 'AUTO:GPU,-CPU'][0]
cfgs = {}
cfgs['PERFORMANCE_HINT'] = ['THROUGHPUT', 'LATENCY', 'CUMULATIVE_THROUGHPUT'][0]
net = core.compile_model("yolov5s.xml",device,cfgs)
output_node = net.outputs[0]
b,n,input_h,input_w = net.inputs[0].shape
# Step3: Initialize InferQueue
ireqs = AsyncInferQueue(net)
print('Number of infer requests in InferQueue:', len(ireqs))
# Step3.1: Set unified callback on all InferRequests from queue's pool
ireqs.set_callback(postprocess)
# Step4: Read the images
image_folder = "./data/images/"
image_files= os.listdir(image_folder)
print(image_files)
frames = []
for image_file in image_files:
  frame = cv2.imread(os.path.join(image_folder, image_file))
  frames.append(frame)
# 4.1 Warm up
for id, _ in enumerate(ireqs):
  # Preprocess the frame
  start = perf_counter()
  blob, letterbox_shape, frame_shape = preprocess(frames[id % 4])
  end = perf_counter()
  print(f"Preprocess {id}: {(end-start):.4f}.")
  # Run asynchronous inference using the next available InferRequest from the pool
  ireqs.start_async({0:blob},(id, letterbox_shape, frame_shape))
ireqs.wait_all()
# Step5: Benchmark the Async Infer
start = perf_counter()
in_fly = set()
latencies = []
niter = 16
for i in range(niter):
  # Preprocess the frame
  blob, letterbox_shape, frame_shape = preprocess(frames[i % 4]) 
  idle_id = ireqs.get_idle_request_id()
  if idle_id in in_fly:
    latencies.append(ireqs[idle_id].latency)
  else:
    in_fly.add(idle_id)
  # Run asynchronous inference using the next available InferRequest from the pool 
  ireqs.start_async({0:blob},(i, letterbox_shape, frame_shape) )
ireqs.wait_all()

向右滑動查看完整代碼

運行結果如下所示,與基于單個推理請求的start_async()+wait()實現方式相比,基于 AsyncInferQueue 類的 YOLOv5 模型的異步推理程序的吞吐量明顯得到提升。

d9de4492-8d5d-11ed-bfe3-dac502259ad0.png

1.3

結論

使用 OpenVINO Runtime 的 AsyncInferQueue 類,可以極大提升 AI 推理程序的吞出量。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • AI
    AI
    +關注

    關注

    87

    文章

    30946

    瀏覽量

    269185
  • 程序
    +關注

    關注

    117

    文章

    3787

    瀏覽量

    81069
  • 任務管理器
    +關注

    關注

    0

    文章

    15

    瀏覽量

    7712

原文標題:使用AsyncInferQueue進一步提升AI推理程序的吞吐量 | 開發者實戰

文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    數據吞吐量提升!面向下代音頻設備,藍牙HDT、星閃、Wi-Fi、UWB同臺競技

    電子發燒友網報道(文/莫婷婷)音頻設備數據吞吐量提升是當前無線通信領域的個重要發展趨勢,藍牙、Wi-Fi和UWB作為三種主要的無線通信技術,在這趨勢中扮演著關鍵角色。 ? 數據
    的頭像 發表于 12-25 01:22 ?1636次閱讀

    TMS320VC5510 HPI吞吐量和優化

    電子發燒友網站提供《TMS320VC5510 HPI吞吐量和優化.pdf》資料免費下載
    發表于 10-16 09:35 ?0次下載
    TMS320VC5510 HPI<b class='flag-5'>吞吐量</b>和優化

    TMS320C6474模塊吞吐量

    電子發燒友網站提供《TMS320C6474模塊吞吐量.pdf》資料免費下載
    發表于 10-15 13:52 ?0次下載
    TMS320C6474模塊<b class='flag-5'>吞吐量</b>

    TMS320C6474通用總線架構(CBA)吞吐量

    電子發燒友網站提供《TMS320C6474通用總線架構(CBA)吞吐量.pdf》資料免費下載
    發表于 10-15 10:29 ?0次下載
    TMS320C6474通用總線架構(CBA)<b class='flag-5'>吞吐量</b>

    TMS320DM36x SoC架構和吞吐量

    電子發燒友網站提供《TMS320DM36x SoC架構和吞吐量.pdf》資料免費下載
    發表于 10-14 10:51 ?0次下載
    TMS320DM36x SoC架構和<b class='flag-5'>吞吐量</b>

    TMS320C6472/TMS320TCI6486的吞吐量應用程序報告

    電子發燒友網站提供《TMS320C6472/TMS320TCI6486的吞吐量應用程序報告.pdf》資料免費下載
    發表于 10-14 09:27 ?0次下載
    TMS320C6472/TMS320TCI6486的<b class='flag-5'>吞吐量</b>應用<b class='flag-5'>程序</b>報告

    通過展頻進一步優化EMI

    電子發燒友網站提供《通過展頻進一步優化EMI.pdf》資料免費下載
    發表于 09-04 09:32 ?1次下載
    通過展頻<b class='flag-5'>進一步</b>優化EMI

    求助,關于使用iperf測量mesh節點吞吐量問題求解

    我把esp-mesh-lite的no-route例程和iperf例程合在起,想測試兩個mesh節點間tcp通信的吞吐量,實際過程中開始流量正常,數秒后客戶端發數據這邊monitor卡死沒有任何
    發表于 07-23 06:59

    用Iperf例程測試ESP32-C6的TCP通信,吞吐量很低的原因?

    為什么我用官網的Iperf例程測試ESP32-C6的TCP通信,吞吐量才0.33Mbps
    發表于 06-06 07:47

    進一步解讀英偉達 Blackwell 架構、NVlink及GB200 超級芯片

    引入英偉達機密計算技術,在不影響性能的情況下,增強了大規模實時s生成式人工智能推理的安全性。該架構還具有新的解壓縮引擎和用于人工智能預防性維護的可靠性引擎,有助于診斷并預測潛在的可靠性問題,進一步鞏固
    發表于 05-13 17:16

    利用NVIDIA組件提升GPU推理吞吐

    本實踐中,唯品會 AI 平臺與 NVIDIA 團隊合作,結合 NVIDIA TensorRT 和 NVIDIA Merlin HierarchicalKV(HKV)將推理的稠密網絡和熱 Embedding 全置于 GPU 上進行加速,
    的頭像 發表于 04-20 09:39 ?730次閱讀

    英飛凌重組銷售與營銷組織,進一步提升以客戶為中心的服務及領先的應用支持能力

    【 2024 年 2 月 28 日,德國慕尼黑訊】 為實現有雄心的增長目標,英飛凌科技股份公司(FSE代碼:IFX / OTCQX代碼:IFNNY)正進一步強化其銷售組織。自3月1日起,英飛凌的銷售
    發表于 03-01 16:31 ?462次閱讀
      英飛凌重組銷售與營銷組織,<b class='flag-5'>進一步</b><b class='flag-5'>提升</b>以客戶為中心的服務及領先的應用支持能力

    材料價格進一步下降,盈利觸底 鋰電材料企業如何應對?

    在上游原料價格相對穩定、終端銷量有所好轉的情況下,季度四大鋰電主材價格卻出現進一步下跌。
    的頭像 發表于 03-01 10:25 ?1057次閱讀

    如何提高CYBT-243053-02吞吐量

    你好我們直在使用“EZ-Serial Firmware: v1.4.13.13 Sep 22 2023 10:24:41”測試“CYBT-243053-02”,我們得到的吞吐量比 PUART 高
    發表于 02-27 06:56

    MediaTek宣布將進一步深化與海信的長期合作關系

    MediaTek 宣布將進一步深化與海信的長期合作關系。海信率先采用了 MediaTek Pentonic 智能電視芯片,顯著提升了流媒體內容的畫質表現。自 2024 年起,MediaTek AI 超級分辨率技術(
    的頭像 發表于 01-12 09:37 ?810次閱讀
    主站蜘蛛池模板: Y8848高清私人影院软件优势| 久久观看视频| 奇米色偷偷| 高h 纯肉文| 亚洲第一免费播放区| 巨大乳hdbbw| YELLOW日本动漫免费动漫| 视频在线观看高清免费看| 狠狠色色综合站| 99热精品在线av播放| 我们日本在线观看免费动漫下载| 久久sese| 高h原耽肉汁动漫视频| 一边亲着一面膜下的免费过程| 欧美乱码卡一卡二卡四卡免费| 国产日韩亚洲精品视频| 91桃色污无限免费看| 性欧美videosex18嫩| 免费乱理伦片在线观看八戒| 国产精品私人玩物在线观看| 在线观看国产精选免费| 日本免费无码A专区在线观看| 好男人WWW免费高清视频在线| 99久久99久久免费精品蜜桃| 亚洲国产区中文在线观看| 青青青青青青青草| 久久久久综合网| 国产精品线路一线路二| 99精品国产免费久久久久久下载| 亚洲AV美女成人网站P站| 欧美夜夜噜2017最新| 久久精视频| 国产精品永久AV无码视频| bl肉yin荡受np各种play| 亚洲性无码av在线| 臀精插宫NP文| 欧美黑大炮18p| 久久久久久久伊人电影| 国产亚洲精品a在线观看app | 亚洲精品AV无码永久无码| 欧美亚洲国产免费高清视频|