英特爾 酷睿 Ultra處理器是英特爾公司推出的一個高端處理器品牌,其第一代產品基于Meteor Lake架構,使用Intel 4制程,單顆芯片封裝了 CPU、GPU(Intel Arc Graphics)和 NPU(Intel AI Boost),具有卓越的AI性能。
本文將詳細介紹使用OpenVINO工具套件在英特爾 酷睿Ultra處理器上實現對YOLOv8模型的INT8量化和部署。
1
第一步:環境搭建
NPU 驅動:https://www.intel.cn/content/www/cn/zh/download/794734/intel-npu-driver-windows.html
顯卡驅動:
https://www.intel.cn/content/www/cn/zh/download/785597/intel-arc-iris-xe-graphics-windows.html
然后,請下載并安裝Anaconda,然后創建并激活名為npu的虛擬環境:(下載鏈接:https://www.anaconda.com/download)
conda create -n npu python=3.11 #創建虛擬環境 conda activate npu #激活虛擬環境 python -m pip install --upgrade pip #升級pip到最新版本
最后,請安裝openvino、nncf、onnx和ultralytics:
pip install openvino nncf onnx ultralytics
2
第二步:導出yolov8s模型并實現INT8量化
使用yolo命令導出yolov8s.onnx模型:
yolo export model=yolov8s.pt format=onnx
使用ovc命令導出OpenVINO格式,FP16精度的yolov8s模型
ovc yolov8s.onnx
使用benchmark_app程序依次測試FP16精度的yolov8s模型在CPU,GPU和NPU上的AI推理性能,結果如下圖所示:
benchmark_app -m yolov8s.xml -d CPU #此處依次換為GPU,NPU
用NNCF實現yolov8s模型的INT8量化
NNCF全稱Neural Network Compression Framework,是一個實現神經網絡訓練后量化(post-training quantization)和訓練期間壓縮(Training-Time Compression)的開源工具包,如下圖所示,通過對神經網絡權重的量化和壓縮以最低精度損失的方式實現推理計算的優化和加速。
NNCF提供的量化和壓縮算法
在上述量化和壓縮算法中,訓練后INT8量化(Post-Training INT8 Quantization)是在工程實踐中應用最廣泛的,它無需重新訓練或微調模型,就能實現模型權重的INT8量化,在獲得顯著的性能提升的同時,僅有極低的精度損失,而且使用簡便。
用NNCF實現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")
運行yolov8_PTQ_INT8.py,執行結果如下所示:
使用benchmark_app程序依次測試INT8精度的yolov8s模型在CPU,GPU和NPU上的AI推理性能,結果如下圖所示:
benchmark_app -m yolov8s_int8.xml -d CPU #此處依次換為GPU,NPU
從上圖可以看出,yolov8s模型經過INT8量化后,相比FP16精度模型,無論在Latency還是Throughput上,都有明顯提升。
3
第三步:編寫YOLOv8推理程序
yolov8目標檢測模型使用letterbox算法對輸入圖像進行保持原始寬高比的放縮,據此,yolov8目標檢測模型的預處理函數實現,如下所示:
from ultralytics.data.augment import LetterBox # 實例化LetterBox letterbox = LetterBox() # 預處理函數 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目標檢測模型的后處理函數首先用非極大值抑制non_max_suppression()算法去除冗余候選框,然后根據letterbox的放縮方式,用scale_boxes()函數將檢測框的坐標點還原到原始圖像上,如下所示:
# 后處理函數: 從推理結果[1,84,8400]的張量中拆解出:檢測框,置信度和類別 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()函數將檢測框的坐標點還原到原始圖像上 shape = orig_img.shape pred[:, :4] = ops.scale_boxes(input_hw, pred[:, :4], shape).round() return pred
完整代碼詳細參見:yolov8_infer_ov.py,其運行結果如下所示:
4
總結
英特爾 酷睿 Ultra處理器內置了CPU、GPU和NPU,相比之前,無論是能耗比、顯卡性能還是AI性能,都有顯著提升;通過OpenVINO和NNCF,可以方便快捷實現AI模型的優化和INT量化,以及本地化部署,獲得非常不錯的端側AI推理性能。
審核編輯:劉清
-
處理器
+關注
關注
68文章
19286瀏覽量
229817 -
英特爾
+關注
關注
61文章
9964瀏覽量
171765 -
GPU芯片
+關注
關注
1文章
303瀏覽量
5812 -
OpenVINO
+關注
關注
0文章
93瀏覽量
201
原文標題:在英特爾? 酷睿? Ultra處理器上優化和部署YOLOv8模型 | 開發者實戰
文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論