OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化

news/2024/7/11 1:51:00 标签: openvino, YOLO, 人工智能

YOLOv5__INT8__0">OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化

YOLOv5OpenVINO_IR_1">1 将YOLOv5模型转换为OpenVINO IR

使用OpenVINO模型优化器将YOLOv5模型转换为OpenVINO IR格式,以便在Intel硬件上进行推理。

下载yolov5代码 ultralytics/yolov5

python export.py --weights yolov5s.pt --include onnx

导出模型为onnx模型,接着使用mo导出openvino fp32和fp16模型

import nncf
from openvino.tools import mo
from openvino.runtime import serialize


MODEL_NAME = "yolov5s"
MODEL_PATH = f"weights/yolov5"

onnx_path = f"{MODEL_PATH}/{MODEL_NAME}.onnx"

# fp32 IR model
fp32_path = f"{MODEL_PATH}/FP32_openvino_model/{MODEL_NAME}_fp32.xml"

print(f"Export ONNX to OpenVINO FP32 IR to: {fp32_path}")
model = mo.convert_model(onnx_path)
serialize(model, fp32_path)

# fp16 IR model
fp16_path = f"{MODEL_PATH}/FP16_openvino_model/{MODEL_NAME}_fp16.xml"

print(f"Export ONNX to OpenVINO FP16 IR to: {fp16_path}")
model = mo.convert_model(onnx_path, compress_to_fp16=True)
serialize(model, fp16_path)

2 准备数据集进行量化

将训练数据集准备成可用于量化的格式。

from openvino.yolov5_dataloader import create_dataloader
from openvino.yolov5_general import check_dataset


DATASET_CONFIG = "./data/coco128.yaml"


def create_data_source():
    """
    Creates COCO 2017 validation data loader. The method downloads COCO 2017
    dataset if it does not exist.
    """
    data = check_dataset(DATASET_CONFIG)
    val_dataloader = create_dataloader(
        data["val"], imgsz=640, batch_size=1, stride=32, pad=0.5, workers=1
    )[0]

    return val_dataloader


data_source = create_data_source()

# Define the transformation method. This method should take a data item returned
# per iteration through the `data_source` object and transform it into the model's
# expected input that can be used for the model inference.
def transform_fn(data_item):
    # unpack input images tensor
    images = data_item[0]
    # convert input tensor into float format
    images = images.float()
    # scale input
    images = images / 255
    # convert torch tensor to numpy array
    images = images.cpu().detach().numpy()
    return images

# Wrap framework-specific data source into the `nncf.Dataset` object.
nncf_calibration_dataset = nncf.Dataset(data_source, transform_fn)

3 配置量化管道

配置量化管道,例如选择适当的量化算法和设置目标精度。

在NNCF中,后训练量化管道由nncf.quantize函数(用于DefaultQuantization算法)和nncf.quantize_with_accuracy_control函数(用于AccuracyAwareQuantization算法)表示。量化参数preset, model_type, subset_size, fast_bias_correction, ignored_scope是函数参数。

subset_size = 300
preset = nncf.QuantizationPreset.MIXED

4 执行模型优化

对模型进行针对Intel硬件推理的优化,例如应用后训练量化或修剪技术。

from openvino.runtime import Core
from openvino.runtime import serialize

core = Core()
ov_model = core.read_model(fp32_path)
quantized_model = nncf.quantize(
    ov_model, nncf_calibration_dataset, preset=preset, subset_size=subset_size
)
nncf_int8_path = f"{MODEL_PATH}/NNCF_INT8_openvino_model/{MODEL_NAME}_int8.xml"
serialize(quantized_model, nncf_int8_path)

5 比较FP32, FP16和INT8模型的准确性

在验证数据集上比较FP32和INT8模型的准确性,以确定是否存在由于量化而导致的准确性损失。

from pathlib import Path
from yolov5_val import run as validation_fn


print("Checking the accuracy of the original model:")
fp32_metrics = validation_fn(
    data=DATASET_CONFIG,
    weights=Path(fp32_path).parent,
    batch_size=1,
    workers=1,
    plots=False,
    device="cpu",
    iou_thres=0.65,
)

fp32_ap5 = fp32_metrics[0][2]
fp32_ap_full = fp32_metrics[0][3]
print(f"mAP@.5 = {fp32_ap5}")
print(f"mAP@.5:.95 = {fp32_ap_full}")


print("Checking the accuracy of the FP16 model:")
fp16_metrics = validation_fn(
    data=DATASET_CONFIG,
    weights=Path(fp16_path).parent,
    batch_size=1,
    workers=1,
    plots=False,
    device="cpu",
    iou_thres=0.65,
)

fp16_ap5 = fp16_metrics[0][2]
fp16_ap_full = fp16_metrics[0][3]
print(f"mAP@.5 = {fp16_ap5}")
print(f"mAP@.5:.95 = {fp16_ap_full}")


print("Checking the accuracy of the NNCF int8 model:")
int8_metrics = validation_fn(
    data=DATASET_CONFIG,
    weights=Path(nncf_int8_path).parent,
    batch_size=1,
    workers=1,
    plots=False,
    device="cpu",
    iou_thres=0.65,
)

nncf_int8_ap5 = int8_metrics[0][2]
nncf_int8_ap_full = int8_metrics[0][3]
print(f"mAP@.5 = {nncf_int8_ap5}")
print(f"mAP@.5:.95 = {nncf_int8_ap_full}")

输出:

Checking the accuracy of the original model:
mAP@.5 = 0.7064319945599192
mAP@.5:.95 = 0.4716138340017886

Checking the accuracy of the FP16 model:
mAP@.5 = 0.7064771913549115
mAP@.5:.95 = 0.47165677301239517

Checking the accuracy of the NNCF int8 model:
mAP@.5 = 0.6900523281577972
mAP@.5:.95 = 0.45860702355897537

6 比较FP32, FP16和INT8模型的性能

比较FP32, FP16和INT8模型的性能,例如测量推理时间和内存使用情况。

benchmark_app -m weights/yolov5/FP32_openvino_model/yolov5s_fp32.xml  -d CPU -api async -t 15

benchmark_app -m weights/yolov5/FP16_openvino_model/yolov5s_fp16.xml  -d CPU -api async -t 15

benchmark_app -m weights/yolov5/FP32_openvino_model/yolov5s_fp32.xml  -d CPU -api async -t 15

输出:

Inference FP32 model (OpenVINO IR) on CPU:
[Step 11/11] Dumping statistics report
[ INFO ] Count:            2504 iterations
[ INFO ] Duration:         15067.63 ms
[ INFO ] Latency:
[ INFO ]    Median:        47.65 ms
[ INFO ]    Average:       47.99 ms
[ INFO ]    Min:           40.73 ms
[ INFO ]    Max:           74.31 ms
[ INFO ] Throughput:   166.18 FPS

Inference FP16 model (OpenVINO IR) on CPU:
[Step 11/11] Dumping statistics report
[ INFO ] Count:            2536 iterations
[ INFO ] Duration:         15069.53 ms
[ INFO ] Latency:
[ INFO ]    Median:        47.11 ms
[ INFO ]    Average:       47.38 ms
[ INFO ]    Min:           38.03 ms
[ INFO ]    Max:           65.95 ms
[ INFO ] Throughput:   168.29 FPS

Inference NNCF INT8 model (OpenVINO IR) on CPU:
[Step 11/11] Dumping statistics report
[ INFO ] Count:            7872 iterations
[ INFO ] Duration:         15113.06 ms
[ INFO ] Latency:
[ INFO ]    Median:        61.17 ms
[ INFO ]    Average:       61.23 ms
[ INFO ]    Min:           52.75 ms
[ INFO ]    Max:           93.93 ms
[ INFO ] Throughput:   520.87 FPS

http://www.niftyadmin.cn/n/429474.html

相关文章

聊聊如何利用服务定位器模式按需返回我们需要的服务实例

前言 什么是服务定位器模式 服务定位器是一个了解如何提供各种应用所需的服务(或组件)的对象。在服务定位器中,每个服务(或组件)都只有一个单独的实例,并通过ID 唯一地标识。 用这个 ID 就能从服务定位器中…

docker离线安装mysql

docker离线安装mysql 第一步:找到一台联网的安装了docker的服务器,查看当前docker镜像:docker images ,拉取mysql镜像包:docker save -o mysql.tar mysql:latest,其中latest为tag行内容 第二步&#xff1a…

算法常见习题

文章目录 1.二维数组中的查找2.旋转数组的最小数字3.调整数组顺序使奇数位于偶数前面3.1相对顺序不做要求3.2保证奇数和奇数,偶数和偶数之间的相对位置不变 4.数组中出现次数超过一半的数字5.将空格替换为“%20”6.从尾到头打印链表7.重建二叉树8.斐波那契数列9.青蛙…

不断进化!奇点云助豫园股份构建集团统一战略的数据平台

“一张图、一颗心、一场仗,构建集团统一战略的数据平台,豫园股份不断进化。” 日前,2023 StartDT Day 数智科技大会正式举办。企业客户、行业专家、技术专家与数万位参会伙伴相聚云上,共话数据时代进化之道。 作为消费产业的数字…

SQL调优:让Java内存分担计算

作者: 剽悍一小兔 CSDN前端优质创作者,打破编程小说次元壁第一人《JavaScript百炼成仙》作者,专注Java硬核干货分享,分享创造快乐,技术成就梦想! 我们在工作中,经常会因为一条慢sql调半天。这一节&#xff…

企业软文投稿流程是怎样的,投稿有什么要求?

随着互联网的快速发展,传统的线下推广已经不再是企业宣传的唯一选择。越来越多的企业开始关注线上平台,尤其是软文投稿。那么,企业软文投稿流程是怎样的?投稿有什么要求呢?本文伯乐网络传媒将为大家详细介绍。 1.确定投…

“我只想找个测试岗,你却百般刁难我!”给我们带来的思考

最近看到一篇帖子,讲的是一个七八年的大龄测试员被公司补偿性裁员后,找工作的糟心经历。 原文是酱紫的: ---------------------------------------- 不管怎么说,我做测试也有七八年了,一直觉得自己的技术还是可以的&…

Windows上安装绿色版mysql-8.0.26

以8.0.26为例 1.安装包下载 下载地址:https://dev.mysql.com/downloads/mysql/下载后文件如图所示: 解压压缩包,并修改文件夹名称为mysql: 2.创建配置文件 在E:\mysql(MySQL解压目录)文件夹下&#…