一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用AsyncInferQueue進(jìn)一步提升AI推理程序的吞吐量

英特爾物聯(lián)網(wǎng) ? 來(lái)源:英特爾物聯(lián)網(wǎng) ? 2023-01-06 09:57 ? 次閱讀

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

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

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

這意味著,AI 推理硬件還有潛力可挖,可以通過(guò)進(jìn)一步提高推理請(qǐng)求個(gè)數(shù)來(lái)提升 AI 推理硬件的利用率,從而提高 AI 推理程序的吞吐量。

1.1

推理請(qǐng)求(InferRequest)和流(stream)

OpenVINO 運(yùn)行時(shí)(Runtime)用推理請(qǐng)求(infer request)來(lái)抽象在指定計(jì)算設(shè)備上運(yùn)行已編譯模型(Compiled_Model)。從編寫(xiě)程序的角度看,推理請(qǐng)求是一個(gè)類(lèi),封裝了支持推理請(qǐng)求以同步或異步方式運(yùn)行的屬性和方法。

推理請(qǐng)求(InferRequest)類(lèi)的詳細(xì)定義參考:

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

推理請(qǐng)求的個(gè)數(shù),由開(kāi)發(fā)者定義;但計(jì)算設(shè)備能并行處理的推理請(qǐng)求個(gè)數(shù),由硬件本身的處理單元(Processing Unit)決定。超過(guò)計(jì)算硬件并行處理數(shù)量的推理請(qǐng)求,會(huì)被計(jì)算硬件用隊(duì)列儲(chǔ)存起來(lái),當(dāng)計(jì)算硬件空閑后,隊(duì)列中的推理請(qǐng)求將被依次取出并執(zhí)行。

OpenVINO用流(stream)來(lái)抽象計(jì)算設(shè)備能并行處理推理請(qǐng)求的能力,通過(guò)屬性:“NUM_STREAMS”,可以獲取延遲優(yōu)先或吞吐量?jī)?yōu)先模式下的計(jì)算硬件支持的最優(yōu)streams數(shù)量,如下表所示。

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

:上述數(shù)據(jù)在蝰蛇峽谷上測(cè)得,CPU=i7-12700H, 集成顯卡=Iris Xe, 獨(dú)立顯卡=A770m

: GPU設(shè)備沒(méi)有INFERENCE_NUM_THREADS屬性

上述數(shù)據(jù)測(cè)試的源代碼如下,歡迎各位讀者在自己的硬件平臺(tái)上測(cè)試:

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)

向右滑動(dòng)查看完整代碼

1.1.1

CPU 的流與推理請(qǐng)求

對(duì)于 CPU 來(lái)說(shuō),一個(gè)流(stream)只能服務(wù)一個(gè)推理請(qǐng)求。通過(guò)屬性ov::range_for_streams,可以查到 CPU 支持的流數(shù)量的范圍;流的數(shù)量無(wú)需開(kāi)發(fā)者使用代碼顯示設(shè)置,OpenVINO 運(yùn)行時(shí)會(huì)根據(jù)延遲優(yōu)先或吞吐量?jī)?yōu)先來(lái)自動(dòng)設(shè)置。

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

1.1.2

GPU 的流與推理請(qǐng)求

對(duì)于 GPU 來(lái)說(shuō),一個(gè)流(stream)可以同時(shí)服務(wù)兩個(gè)推理請(qǐng)求。通過(guò)屬性 ov::range_for_streams,可以查到 GPU 支持的流數(shù)量的范圍:[1, 2];流的數(shù)量無(wú)需開(kāi)發(fā)者使用代碼顯示設(shè)置,OpenVINO 運(yùn)行時(shí)會(huì)根據(jù)延遲優(yōu)先或吞吐量?jī)?yōu)先來(lái)自動(dòng)設(shè)置。

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

參考代碼:

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

1.2

AsyncInferQueue類(lèi)

OpenVINO運(yùn)行時(shí)(Runtime)提供 AsyncInferQueue 類(lèi)來(lái)抽象并管理異步推理請(qǐng)求池,其常用方法和屬性有:

__init__(self, compiled_model, jobs = 0):創(chuàng)建AsyncInferQueue對(duì)象

set_callback(func_name):為推理請(qǐng)求池中所有的推理請(qǐng)求設(shè)置統(tǒng)一的回調(diào)函數(shù)

start_async(inputs, userdata = None):異步啟動(dòng)推理請(qǐng)求

wait_all():等待所有的推理請(qǐng)求執(zhí)行完畢

1.2.1

基于AsyncInferQueue類(lèi)的

異步推理范例程序

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

完整范例代碼請(qǐng)下載:yolov5_async_infer_queue.py

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

運(yùn)行代碼前,請(qǐng)參考運(yùn)行環(huán)境搭建流程。

...
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()

向右滑動(dòng)查看完整代碼

運(yùn)行結(jié)果如下所示,與基于單個(gè)推理請(qǐng)求的start_async()+wait()實(shí)現(xiàn)方式相比,基于 AsyncInferQueue 類(lèi)的 YOLOv5 模型的異步推理程序的吞吐量明顯得到提升。

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

1.3

結(jié)論

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

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    33554

    瀏覽量

    274264
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3817

    瀏覽量

    82180
  • 任務(wù)管理器
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    7816

原文標(biāo)題:使用AsyncInferQueue進(jìn)一步提升AI推理程序的吞吐量 | 開(kāi)發(fā)者實(shí)戰(zhàn)

文章出處:【微信號(hào):英特爾物聯(lián)網(wǎng),微信公眾號(hào):英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)吞吐量提升!面向下代音頻設(shè)備,藍(lán)牙HDT、星閃、Wi-Fi、UWB同臺(tái)競(jìng)技

    電子發(fā)燒友網(wǎng)報(bào)道(文/莫婷婷)音頻設(shè)備數(shù)據(jù)吞吐量提升是當(dāng)前無(wú)線通信領(lǐng)域的個(gè)重要發(fā)展趨勢(shì),藍(lán)牙、Wi-Fi和UWB作為三種主要的無(wú)線通信技術(shù),在這趨勢(shì)中扮演著關(guān)鍵角色。 ? 數(shù)據(jù)
    的頭像 發(fā)表于 12-25 01:22 ?2633次閱讀

    迅為2K0300開(kāi)發(fā)板進(jìn)一步刨析,打造HMI體機(jī)產(chǎn)品的靈活優(yōu)勢(shì)

    迅為2K0300開(kāi)發(fā)板進(jìn)一步刨析,打造HMI體機(jī)產(chǎn)品的靈活優(yōu)勢(shì)
    的頭像 發(fā)表于 02-26 13:58 ?443次閱讀
    迅為2K0300開(kāi)發(fā)板<b class='flag-5'>進(jìn)一步</b>刨析,打造HMI<b class='flag-5'>一</b>體機(jī)產(chǎn)品的靈活優(yōu)勢(shì)

    TMS320VC5510 HPI吞吐量和優(yōu)化

    電子發(fā)燒友網(wǎng)站提供《TMS320VC5510 HPI吞吐量和優(yōu)化.pdf》資料免費(fèi)下載
    發(fā)表于 10-16 09:35 ?0次下載
    TMS320VC5510 HPI<b class='flag-5'>吞吐量</b>和優(yōu)化

    TMS320C6474模塊吞吐量

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

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

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

    TMS320DM36x SoC架構(gòu)和吞吐量

    電子發(fā)燒友網(wǎng)站提供《TMS320DM36x SoC架構(gòu)和吞吐量.pdf》資料免費(fèi)下載
    發(fā)表于 10-14 10:51 ?0次下載
    TMS320DM36x SoC架構(gòu)和<b class='flag-5'>吞吐量</b>

    TMS320C6472/TMS320TCI6486的吞吐量應(yīng)用程序報(bào)告

    電子發(fā)燒友網(wǎng)站提供《TMS320C6472/TMS320TCI6486的吞吐量應(yīng)用程序報(bào)告.pdf》資料免費(fèi)下載
    發(fā)表于 10-14 09:27 ?0次下載
    TMS320C6472/TMS320TCI6486的<b class='flag-5'>吞吐量</b>應(yīng)用<b class='flag-5'>程序</b>報(bào)告

    英特爾將進(jìn)一步分離芯片制造和設(shè)計(jì)業(yè)務(wù)

    面對(duì)公司成立50年來(lái)最為嚴(yán)峻的挑戰(zhàn),英特爾宣布了項(xiàng)重大戰(zhàn)略調(diào)整,旨在通過(guò)進(jìn)一步分離芯片制造與設(shè)計(jì)業(yè)務(wù),重塑競(jìng)爭(zhēng)力。這決策標(biāo)志著英特爾在應(yīng)對(duì)行業(yè)變革中的堅(jiān)定步伐。
    的頭像 發(fā)表于 09-19 16:48 ?505次閱讀

    通過(guò)展頻進(jìn)一步優(yōu)化EMI

    電子發(fā)燒友網(wǎng)站提供《通過(guò)展頻進(jìn)一步優(yōu)化EMI.pdf》資料免費(fèi)下載
    發(fā)表于 09-04 09:32 ?1次下載
    通過(guò)展頻<b class='flag-5'>進(jìn)一步</b>優(yōu)化EMI

    求助,關(guān)于使用iperf測(cè)量mesh節(jié)點(diǎn)吞吐量問(wèn)題求解

    我把esp-mesh-lite的no-route例程和iperf例程合在起,想測(cè)試兩個(gè)mesh節(jié)點(diǎn)間tcp通信的吞吐量,實(shí)際過(guò)程中開(kāi)始流量正常,數(shù)秒后客戶(hù)端發(fā)數(shù)據(jù)這邊monitor卡死沒(méi)有任何
    發(fā)表于 07-23 06:59

    iPhone 15在美國(guó)市場(chǎng)需求進(jìn)一步減弱

    7月19日,國(guó)際媒體披露了市場(chǎng)研究機(jī)構(gòu)CIRP的最新報(bào)告,揭示了iPhone 15系列在美國(guó)市場(chǎng)的受歡迎程度相較于前代iPhone 14系列有所下滑。這趨勢(shì)在CIRP最新發(fā)布的第二季度數(shù)據(jù)中得到了進(jìn)一步印證,顯示iPhone 15系列的市場(chǎng)需求正經(jīng)歷持續(xù)放緩。
    的頭像 發(fā)表于 07-19 16:11 ?818次閱讀

    Melexis推出全新MLX81123芯片,進(jìn)一步擴(kuò)展LIN RGB系列產(chǎn)品線

    Melexis近日宣布,作為汽車(chē)動(dòng)態(tài)照明LED驅(qū)動(dòng)芯片領(lǐng)域的領(lǐng)軍者,正式推出全新產(chǎn)品MLX81123,進(jìn)一步擴(kuò)展LIN RGB系列產(chǎn)品線。這款芯片在前代產(chǎn)品的基礎(chǔ)上進(jìn)行深度優(yōu)化,封裝設(shè)計(jì)更為緊湊
    的頭像 發(fā)表于 06-14 14:41 ?962次閱讀

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

    為什么我用官網(wǎng)的Iperf例程測(cè)試ESP32-C6的TCP通信,吞吐量才0.33Mbps
    發(fā)表于 06-06 07:47

    西門(mén)子與微軟進(jìn)一步擴(kuò)展戰(zhàn)略合作關(guān)系

    近日,西門(mén)子數(shù)字化工業(yè)軟件與微軟宣布進(jìn)一步擴(kuò)展雙方的戰(zhàn)略合作關(guān)系。通過(guò)微軟Azure云服務(wù),西門(mén)子正式推出Xcelerator as a Service工業(yè)軟件解決方案,為客戶(hù)提供更靈活、高效的服務(wù)體驗(yàn)。
    的頭像 發(fā)表于 05-21 10:47 ?831次閱讀

    進(jìn)一步解讀英偉達(dá) Blackwell 架構(gòu)、NVlink及GB200 超級(jí)芯片

    引入英偉達(dá)機(jī)密計(jì)算技術(shù),在不影響性能的情況下,增強(qiáng)了大規(guī)模實(shí)時(shí)s生成式人工智能推理的安全性。該架構(gòu)還具有新的解壓縮引擎和用于人工智能預(yù)防性維護(hù)的可靠性引擎,有助于診斷并預(yù)測(cè)潛在的可靠性問(wèn)題,進(jìn)一步鞏固
    發(fā)表于 05-13 17:16