英特爾 酷睿 Ultra處理器是英特爾公司推出的一個(gè)高端處理器品牌,其第一代產(chǎn)品基于Meteor Lake架構(gòu),使用Intel 4制程,單顆芯片封裝了 CPU、GPU(Intel Arc Graphics)和 NPU(Intel AI Boost),具有卓越的AI性能。
本文將詳細(xì)介紹使用OpenVINO工具套件在英特爾 酷睿Ultra處理器上實(shí)現(xiàn)對(duì)YOLOv8模型的INT8量化和部署。
1
第一步:環(huán)境搭建
首先,請(qǐng)下載并安裝最新版的NPU和顯卡驅(qū)動(dòng):
NPU 驅(qū)動(dòng):https://www.intel.cn/content/www/cn/zh/download/794734/intel-npu-driver-windows.html
顯卡驅(qū)動(dòng):
https://www.intel.cn/content/www/cn/zh/download/785597/intel-arc-iris-xe-graphics-windows.html
然后,請(qǐng)下載并安裝Anaconda,然后創(chuàng)建并激活名為npu的虛擬環(huán)境:(下載鏈接:https://www.anaconda.com/download)
conda create -n npu python=3.11 #創(chuàng)建虛擬環(huán)境 conda activate npu #激活虛擬環(huán)境 python -m pip install --upgrade pip #升級(jí)pip到最新版本
最后,請(qǐng)安裝openvino、nncf、onnx和ultralytics:
pip install openvino nncf onnx ultralytics
2
第二步:導(dǎo)出yolov8s模型并實(shí)現(xiàn)INT8量化
使用yolo命令導(dǎo)出yolov8s.onnx模型:
yolo export model=yolov8s.pt format=onnx
使用ovc命令導(dǎo)出OpenVINO格式,F(xiàn)P16精度的yolov8s模型
ovc yolov8s.onnx
使用benchmark_app程序依次測(cè)試FP16精度的yolov8s模型在CPU,GPU和NPU上的AI推理性能,結(jié)果如下圖所示:
benchmark_app -m yolov8s.xml -d CPU #此處依次換為GPU,NPU
用NNCF實(shí)現(xiàn)yolov8s模型的INT8量化
NNCF全稱Neural Network Compression Framework,是一個(gè)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)訓(xùn)練后量化(post-training quantization)和訓(xùn)練期間壓縮(Training-Time Compression)的開(kāi)源工具包,如下圖所示,通過(guò)對(duì)神經(jīng)網(wǎng)絡(luò)權(quán)重的量化和壓縮以最低精度損失的方式實(shí)現(xiàn)推理計(jì)算的優(yōu)化和加速。
NNCF提供的量化和壓縮算法
在上述量化和壓縮算法中,訓(xùn)練后INT8量化(Post-Training INT8 Quantization)是在工程實(shí)踐中應(yīng)用最廣泛的,它無(wú)需重新訓(xùn)練或微調(diào)模型,就能實(shí)現(xiàn)模型權(quán)重的INT8量化,在獲得顯著的性能提升的同時(shí),僅有極低的精度損失,而且使用簡(jiǎn)便。
用NNCF實(shí)現(xiàn)YOLOv8s模型INT8量化的范例代碼yolov8_PTQ_INT8.py,如下所示:
import torch, nncf import openvino as ov from torchvision import datasets, transforms # Specify the path of model and dataset model_dir = r"yolov8s.xml" dataset = r"val_dataset" # Instantiate your uncompressed model model = ov.Core().read_model(model_dir) # Provide validation part of the dataset to collect statistics needed for the compression algorithm val_dataset = datasets.ImageFolder(dataset, transform=transforms.Compose([transforms.ToTensor(),transforms.Resize([640, 640])])) dataset_loader = torch.utils.data.DataLoader(val_dataset, batch_size=1) # Step 1: Initialize transformation function def transform_fn(data_item): images, _ = data_item return images.numpy() # Step 2: Initialize NNCF Dataset calibration_dataset = nncf.Dataset(dataset_loader, transform_fn) # Step 3: Run the quantization pipeline quantized_model = nncf.quantize(model, calibration_dataset) # Step 4: Save the INT8 quantized model ov.save_model(quantized_model, "yolov8s_int8.xml")
運(yùn)行yolov8_PTQ_INT8.py,執(zhí)行結(jié)果如下所示:
使用benchmark_app程序依次測(cè)試INT8精度的yolov8s模型在CPU,GPU和NPU上的AI推理性能,結(jié)果如下圖所示:
benchmark_app -m yolov8s_int8.xml -d CPU #此處依次換為GPU,NPU
從上圖可以看出,yolov8s模型經(jīng)過(guò)INT8量化后,相比FP16精度模型,無(wú)論在Latency還是Throughput上,都有明顯提升。
3
第三步:編寫(xiě)YOLOv8推理程序
yolov8目標(biāo)檢測(cè)模型使用letterbox算法對(duì)輸入圖像進(jìn)行保持原始寬高比的放縮,據(jù)此,yolov8目標(biāo)檢測(cè)模型的預(yù)處理函數(shù)實(shí)現(xiàn),如下所示:
from ultralytics.data.augment import LetterBox # 實(shí)例化LetterBox letterbox = LetterBox() # 預(yù)處理函數(shù) def preprocess_image(image: np.ndarray, target_size=(640, 640))->np.ndarray: image = letterbox(image) #YOLOv8用letterbox按保持圖像原始寬高比方式放縮圖像 blob = cv2.dnn.blobFromImage(image, scalefactor=1 / 255, size=target_size, swapRB=True) return blob
yolov8目標(biāo)檢測(cè)模型的后處理函數(shù)首先用非極大值抑制non_max_suppression()算法去除冗余候選框,然后根據(jù)letterbox的放縮方式,用scale_boxes()函數(shù)將檢測(cè)框的坐標(biāo)點(diǎn)還原到原始圖像上,如下所示:
# 后處理函數(shù): 從推理結(jié)果[1,84,8400]的張量中拆解出:檢測(cè)框,置信度和類別 def postprocess(pred_boxes, input_hw, orig_img, min_conf_threshold = 0.25, nms_iou_threshold = 0.7, agnosting_nms = False, max_detections = 300): # 用非極大值抑制non_max_suppression()算法去除冗余候選框 nms_kwargs = {"agnostic": agnosting_nms, "max_det":max_detections} pred = ops.non_max_suppression( torch.from_numpy(pred_boxes), min_conf_threshold, nms_iou_threshold, nc=80, **nms_kwargs )[0] # 用scale_boxes()函數(shù)將檢測(cè)框的坐標(biāo)點(diǎn)還原到原始圖像上 shape = orig_img.shape pred[:, :4] = ops.scale_boxes(input_hw, pred[:, :4], shape).round() return pred
完整代碼詳細(xì)參見(jiàn):yolov8_infer_ov.py,其運(yùn)行結(jié)果如下所示:
4
總結(jié)
英特爾 酷睿 Ultra處理器內(nèi)置了CPU、GPU和NPU,相比之前,無(wú)論是能耗比、顯卡性能還是AI性能,都有顯著提升;通過(guò)OpenVINO和NNCF,可以方便快捷實(shí)現(xiàn)AI模型的優(yōu)化和INT量化,以及本地化部署,獲得非常不錯(cuò)的端側(cè)AI推理性能。
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
19259瀏覽量
229649 -
英特爾
+關(guān)注
關(guān)注
61文章
9949瀏覽量
171692 -
GPU芯片
+關(guān)注
關(guān)注
1文章
303瀏覽量
5804 -
OpenVINO
+關(guān)注
關(guān)注
0文章
92瀏覽量
196
原文標(biāo)題:在英特爾? 酷睿? Ultra處理器上優(yōu)化和部署YOLOv8模型 | 開(kāi)發(fā)者實(shí)戰(zhàn)
文章出處:【微信號(hào):英特爾物聯(lián)網(wǎng),微信公眾號(hào):英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論