OpenVINO int8 모델 변환 2024.5 버전

2024. 12. 14. 13:12프로그래밍

OpenVINO 2022 버전의 경우는 아래 블로그에 int8 모델 변환이 잘 설명되어 있습니다만,
https://da2so.tistory.com/65

 

OpenVINO 뽀개기 (3) OpenVINO Quantization

OpenVINO 모델을 optimization하기 위한 방법으로 Quantization에 대해 설명드립니다. 1. Quantization이란? 기존 Torch, ONNX model의 parameters(i.e. weights, bias)들은 각각이 float32로 표현되어 있습니다. Quantization은 flo

da2so.tistory.com

2024.5 버전으로 오면서 INT8 모델 변환하는 것이  NNCF (Neural Network Compression Framework) 사용으로 변경되었습니다.

NNCF는 비단 OpenVINO뿐 아니라, ONNX, PyTorch, TensorFlow 등도 지원합니다.

pip install openvino==2024.5.0

pip install openvino-dev==2024.5.0

pip install nncf==2.14.0

from openvino.runtime import Core
from openvino.runtime import serialize
from nncf import quantize
from nncf import Dataset

import os
import numpy as np
import cv2
import glob

core = Core()
model = core.read_model("openvino_model/personFace.xml")

# Path to COCO 2017 validation images
coco_val_dir = "datasets/coco/coco_2017/val2017"

# Define the calibration dataset generator
class CalibrationDataset:
    def __init__(self, dataset_path, input_shape=(640, 640)):
        self.dataset_path = dataset_path
        self.input_shape = input_shape
        self.image_paths = glob.glob(f"{dataset_path}/*.jpg")  # Adjust to your dataset format

    def __len__(self):
        return len(self.image_paths)

    def __getitem__(self, idx):
        # Load and preprocess the image
        image = cv2.imread(self.image_paths[idx])
        image = cv2.resize(image, self.input_shape)
        image = image.transpose(2, 0, 1)  # HWC to CHW
        #image = image.astype(np.float32) / 255.0  # Normalize to [0, 1]
        image = image.astype(np.float32)
        image = np.expand_dims(image, axis=0)
        return image

data_source = Dataset(CalibrationDataset(coco_val_dir))

quantized_model = quantize(model, data_source)
# change subset_size to 1000
# quantized_model = quantize(model, data_source, subset_size=1000)

serialize(quantized_model, "personFace_int8.xml","personFace_int8.bin")

print("Quantization completed. Model saved !")

 

Quantization에 사용할 이미지들을 공급하는 CalibrationDataSet을 정의하고, nncf모듈의 Dataset class를 생성한 후, 로딩된 float16내지 float32 openvino model과 함께 파라미터로 해서 nncf모듈 quantize 함수로 quantization을 수행합니다. quanized_model을 openvino serialize 함수로 저장하면 됩니다.


nncf.quantize 함수의 paramter들에 대해서 아래 링크에서 상세히 알 수 있습니다.

https://docs.openvino.ai/2024/openvino-workflow/model-optimization-guide/quantizing-models-post-training/basic-quantization-flow.html

 

Basic Quantization Flow — OpenVINO™ documentation

target_device - defines the target device, the specificity of which will be taken into account during optimization. The following values are supported: ANY (default), CPU, CPU_SPR, GPU, and NPU. nncf.quantize(model, dataset, target_device=nncf.TargetDevice

docs.openvino.ai