【OpenVINO】使用OpenVINO实现 RT-DETR 模型 INT8量化推理加速

使用OpenVINO实现 RT-DETR 模型 INT8量化推理加速

  • 1. 使用 OpenVINO 实现 RT-DETR 模型 INT8量化
  • 1.1 神经网络压缩框架 (NNCF)
    • 1.2 准备校准数据集
      • 1.2.1 下载COCO验证数据集
      • 1.2.2 Validator包装器
      • 1.2.3 转换用于量化的数据集
    • 1.3 定义模型精度校验方法
    • 1.4 模型量化
      • 1.4.1 模型量化实现
      • 1.4.2 量化前后精度测试
      • 1.4.3 量化前后速度对比
  • 2. Intel iGPU 推理加速RT-DETR 模型和速度比较
    • 2.1 Intel iGPU 推理加速RT-DETR 模型实现
    • 2.2 CPU与iGPU推理速度对比
  • 3. 总结

  RT-DETR是在DETR模型基础上进行改进的,一种基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和推理,在前文我们发表了 《基于 OpenVINO™ Python API 部署 RT-DETR 模型 | 开发者实战》、 《基于 OpenVINO™ C++ API 部署 RT-DETR 模型 | 开发者实战》以及 《基于 OpenVINO™ C# API 部署 RT-DETR 模型 | 开发者实战》,实现了基于OpenVINO™ Python 、 C++ API 和C# 凭他向大家展示了的RT-DETR模型的部署流程,并分别展示了是否包含后处理的模型部署流程,为大家使用RT-DETR模型提供了很好的范例。
  但是经过时间检测,使用OpenVINO™ 在CPU平台上运行RT-DETR模型,其推理速度最快可以达到3~4帧左右,但这对于视频数据预测是远远不够的。由于 OpenVINO™ 最新发行版2023.1.0在GPU平台对RT-DETR模型算子还不支持,所以在前面文章中我们没有在iGPU平台上进行测试。为了提高推理速度,在本文章中,我们将使用 OpenVINO 实现 RT-DETR 模型 INT8量化,通过模型优化技术实现模型推理加速;并且在 OpenVINO工程师指导下,通过修改OpenVINO 源码,重现编译了官方库,实现了GPU对RT-DETR 模型的支持。
  项目所使用的全部代码已经在GitHub上开源,并且收藏在OpenVINO-CSharp-API项目里,项目所在目录链接为:

https://github.com/guojin-yan/OpenVINO-CSharp-API/tree/csharp3.0/tutorial_examples

  也可以直接访问该项目,项目链接为:

https://github.com/guojin-yan/RT-DETR-OpenVINO.git

  文章首发链接为:使用 OpenVINO™ 实现 RT-DETR 模型 INT8 量化推理加速 | 开发者实战

1. 使用 OpenVINO 实现 RT-DETR 模型 INT8量化

  训练后模型优化是使用无需重新训练或微调的特殊方法,即可将模型转换为对硬件更友好的表示形式。目前最流行和使用最广泛使用的方法是INT8量化,具有以下优点:

  • 它易于使用。
  • 它不会对准确性造成太大影响。
  • 它提供了显著的性能改进。
  • 它适合许多库存硬件,因为它们中的大多数都原生支持 8 位计算。

  INT 8量化将模型权重和激活函数的精度降低到 8 位,从而将模型占用空间减少近 4 倍,降低推理所需的吞吐量,并显著提高推理速度,量化过程在实际推理之前离线完成。通过OpenVINO实现模型的量化过程不需要源深度学习框架中的训练数据集或训练代码。
为了让大家更好的复现RT-DETR 模型 INT8量化流程,我们提供了完整的 Notebook文件,使用者可以根据文件操作流程进行一步步操作。使用 OpenVINO 实现 RT-DETR 模型 INT8量化的完整代码已经上传到GitHub中,文章链接为:

https://github.com/guojin-yan/RT-DETR-OpenVINO/blob/master/optimize/openvino-convert-and-optimize-rt-detr.ipynb

  为了方便大家复现该项目,此处录制了演示视频,已经发布到B站,视频链接为:

https://www.bilibili.com/video/BV11N411T7m5/

使用 OpenVINO 实现 RT-DETR 模型 INT8量化推理加速

1.1 神经网络压缩框架 (NNCF)

  神经网络压缩框架 (NNCF) 提供了 Python 中提供的训练后量化 API,旨在重用代码进行模型训练或验证,这些代码通常可用于源框架中的模型,例如 PyTorch 或 TensroFlow。NNCF API 是跨框架的,目前支持以下框架中的模型:OpenVINO、PyTorch、TensorFlow 2.x 和 ONNX。目前,OpenVINO中间表示中模型的训练后量化在支持的方法和模型覆盖率方面是最成熟的。
在这里插入图片描述
  NNCF API 有两个方式来实现训练后INT 8量化:

  • 基本量化:基本量化流程是将INT 8 量化应用于模型的最简单方法,它适用于OpenVINO、PyTorch、TensorFlow 2.x 和 ONNX框架中的模型。在这种情况下,只需要具有代表性的校准数据集进行。
  • 具有精度控制的量化:这是高级量化流程,允许将INT 8 量化应用于模型,并通过验证函数控制精度指标。目前只支持OpenVINO框架中的模型。除了校准数据集之外,还需要验证数据集来计算准确性指标。

1.2 准备校准数据集

  在本实验中,我们只实现基本量化,因此只需要准备校验数据集即可。RT-DETR模型预训练模型是在COCO数据集下训练的,因此我们只需要准备COCO验证数据集即可。为了更容易构建验证数据集,我们此处使用ultralytics框架下的API方法实现。

1.2.1 下载COCO验证数据集

  COCO验证数据集可以通过官网直接下载,也可以通过下面的代码下载:

DATA_URL = "http://images.cocodataset.org/zips/val2017.zip"
LABELS_URL = "https://github.com/ultralytics/yolov5/releases/download/v1.0/coco2017labels-segments.zip"
CFG_URL = "https://raw.githubusercontent.com/ultralytics/ultralytics/8ebe94d1e928687feaa1fee6d5668987df5e43be/ultralytics/datasets/coco.yaml"
CACHE_URL = "https://github.com/guojin-yan/RT-DETR-OpenVINO/releases/download/Model2.0/val2017.cache"
OUT_DIR = Path('./datasets')
DATA_PATH = OUT_DIR / "val2017.zip"
LABELS_PATH = OUT_DIR / "coco2017labels-segments.zip"
CFG_PATH = OUT_DIR / "coco.yaml"
CACHE_PATH = OUT_DIR / "coco/labels/val2017.cache"
download_file(DATA_URL, DATA_PATH.name, DATA_PATH.parent)
download_file(LABELS_URL, LABELS_PATH.name, LABELS_PATH.parent)
download_file(CFG_URL, CFG_PATH.name, CFG_PATH.parent)
if not (OUT_DIR / "coco/labels").exists():
    with ZipFile(LABELS_PATH , "r") as zip_ref:
        zip_ref.extractall(OUT_DIR)
    with ZipFile(DATA_PATH , "r") as zip_ref:
        zip_ref.extractall(OUT_DIR / 'coco/images')
download_file(CACHE_URL, CACHE_PATH.name, CACHE_PATH.parent)

1.2.2 Validator包装器

  Yolov8模型存储库使用Validator包装器,它表示准确性验证管道。它创建数据加载器和评估度量,并更新数据加载器生成的每个数据批次的度量。除此之外,它还负责数据的预处理和结果的后处理。RT-DETR模型训练集也使用了COCO数据集。为了方便起见,我们使用Yolov8环境来配置此处的数据。
  对于类初始化,应该提供配置。我们将使用默认设置,但可以用一些参数替代它来测试自定义数据。Yolov8模型模型已经连接了ValidatorClass方法,因此我们通过该模型进行创建验证器类实例。

args = get_cfg(cfg=DEFAULT_CFG)
args.data = str(CFG_PATH)
YOLO_MODEL = "yolov8n"
models_dir = Path('./models')
yolo_model = YOLO(models_dir / f'{YOLO_MODEL}.pt')
det_validator = yolo_model.ValidatorClass(args=args)
det_validator.data = check_det_dataset(args.data)
det_data_loader = det_validator.get_dataloader("./datasets/coco", 1)
det_validator.is_coco = True
det_validator.class_map = ops.coco80_to_coco91_class()
det_validator.names = yolo_model.model.names
det_validator.metrics.names = det_validator.names
det_validator.nc = yolo_model.model.model[-1].nc

1.2.3 转换用于量化的数据集

  上一步中我们使用Validator包装器创建了验证数据集,但如果能在量化中使用,还需要进行转换,此处OpenVINO提供了API接口nncf.Dataset(),通过该接口读取Validator包装器中的验证数据。··

def transform_fn(data_item:Dict):
    input_tensor = det_validator.preprocess(data_item)['img'].numpy()
    return input_tensor
quantization_dataset = nncf.Dataset(det_data_loader, transform_fn)

1.3 定义模型精度校验方法

  为了观测模型量化前后模型预测精度变化,此处自定义了模型精度测试方法:

def sigmoid(z):
    return 1/(1+np.exp(-z))
def rtdetr_result(preds_box,preds_score):
    results=[]
    n=0
    for i in range(300):
        scores=preds_score[0,i,:]
        score=sigmoid(np.max(np.array(scores)))
        if(score<0.0001):
            continue
        result=[]
        cx=preds_box[0,i,0]*640.0
        cy=preds_box[0,i,1]*640.0
        w=preds_box[0,i,2]*640.0
        h=preds_box[0,i,3]*640.0
        result.append(cx-0.5*w)
        result.append(cy-0.5*h)
        result.append(cx+0.5*w)
        result.append(cy+0.5*h)
        result.append(score)
        result.append(np.argmax(scores))
        results.append(result)
        n+=1
    return [torch.tensor(results)]
def test(model:ov.Model, core:ov.Core, data_loader:torch.utils.data.DataLoader, validator, num_samples:int = None):
    validator.seen = 0
    validator.jdict = []
    validator.stats = []
    validator.batch_i = 1
    validator.confusion_matrix = ConfusionMatrix(nc=validator.nc)
    compiled_model = core.compile_model(model)
    for batch_i, batch in enumerate(tqdm(data_loader, total=num_samples)):
        if num_samples is not None and batch_i == num_samples:
            break
        batch = validator.preprocess(batch)
        results = compiled_model(batch["img"])
        preds_box = torch.from_numpy(results[compiled_model.output(0)])
        preds_score = torch.from_numpy(results[compiled_model.output(1)])      
        preds=rtdetr_result(preds_box,preds_score)
        validator.update_metrics(preds, batch)
    stats = validator.get_stats()
    return stats

1.4 模型量化

1.4.1 模型量化实现

  首先我们定义量化接口,nncf.quantize函数为模型量化提供了一个接口,主要输入参数为:OpenVINO模型和量化数据集,实现如下所示:

quantized_det_model = nncf.quantize(
    det_ov_model,
    quantization_dataset,
    preset=nncf.QuantizationPreset.MIXED
)

通过上述方法,便可以实现RT-DETR模型的量化,

1.4.2 量化前后精度测试

  在前文中我们定义了模型精度测试方法,因此我们在此处进行量化前后的精度检测,通过该方法,在1000张测试集上进行检测,最后打印模型预测精度:

fp_det_stats = test(det_ov_model, core, det_data_loader, det_validator, num_samples=NUM_TEST_SAMPLES)
int8_det_stats = test(quantized_det_model, core, det_data_loader, det_validator, num_samples=NUM_TEST_SAMPLES)
print("FP32 model accuracy")
print_stats(fp_det_stats, det_validator.seen, det_validator.nt_per_class.sum())
print("INT8 model accuracy")
print_stats(int8_det_stats, det_validator.seen, det_validator.nt_per_class.sum())

在这里插入图片描述
  上图中是打印的模型量化前后的预测精度情况,为了更好的查看量化前后精度变化,此处绘制了柱状图,如下图所示,通过该柱状图可以看出,模型在量化前后,模型预测精度存在较小的下降,但也满足我们的模型量化需求。
在这里插入图片描述

1.4.3 量化前后速度对比

  OpenVINO™ 提供了性能测试工具 Benchmark App ,方便开发者快速测试 OpenVINO™ 模型在不同的硬件平台上的性能,此处由于OpenVINO GPU算子对RT-DETR模型还不支持,因此此处我们只进行在CPU平台上测试。
首先测试量化前的模型,只需要输入以下指令即可:

!benchmark_app -m {det_model_path} -d {device.value} -api async -shape "[1,3,640,640]"

在这里插入图片描述
  上图中展示了量化前的模型在CPU平台下的推理速度,可以看到,量化前模型推理速度仅能达到2.67 FPS。接下来测试量化后的模型,只需要输入以下指令即可:

!benchmark_app -m {int8_model_det_path} -d {device.value} -api async -shape "[1,3,640,640]" -t 15

在这里插入图片描述

  上图中展示了量化后的模型在iCPU平台下的推理速度,可以看到,量化前模型推理速度仅能达到8.82 FPS,推理速度提升了3.3倍。

注:上述量化过程只是根据两国或称的几个重点步骤进行了讲解,完整的量化步骤以及实现顺序请参考上文中所指出的Notebook文章。

2. Intel iGPU 推理加速RT-DETR 模型和速度比较

2.1 Intel iGPU 推理加速RT-DETR 模型实现

  由于当前OpenVINO发行版GPU算子不支持RT-DETR 模型实现,所以我们无法直接进行iGPU加速推理,但为了提升模型推理速度,通过OpenVINO GitHub 提交Issues,对源码进行修改,然后重新编译源码,更新动态链接库引用,便可以实现iGPU加速推理。Issues链接为:

[Bug]: There was an error compiling the RT-DETR model on the GPU platform using OpenVINO. · Issue #20871 · openvinotoolkit/openvino (github.com)

  大家在使用时,可以参考官方提供的解决方案,对源码进行修改,然后根据OpenVINO源码编译流程,对源码进行编译,获取修改后的动态链接库。
  此处为了方便大家使用,我们在项目中提供了编译好的Windows的动态链接库,通过下述方式进行下载:

wget https://github.com/guojin-yan/RT-DETR-OpenVINO/releases/download/Model2.0/openvino_new_build.rar

  通过该方式下载编译好的动态链接库文件后,然后参考上一篇文章《基于 OpenVINO™ C++ API 部署 RT-DETR 模型 | 开发者实战》(https://mp.weixin.qq.com/s/L0UtZn_kN2RxuXm_r0MjYA)进行开发,将动态链接库引用替换成此处下载的动态链接库文件,并将设备设置为GPU,然后便可以实现GPU推理。

2.2 CPU与iGPU推理速度对比

  在上一步中我们实现了基于OpenVINO 在iGPU设备上进行RT-DETR模型的推理加速,并在上一节中我们实现了模型INT8量化,最后我们在此处进行一个对比试验,分别在CPU和iGPU推理设备下,推理FP32和INT8模型,检验模型的推理速度,为了避免偶然性,此处通过推理100次求平均获取最后的推理速度,如下表所示:
在这里插入图片描述

  测试硬件:CPU处理器为第11代Intel酷i7-1165G7,iGPU为Intel Iris Xe Graphics集成显卡。通过绘制在不同平台、不同精度模型推理时间以及FPS柱状图,可以很明显看出,不管模型是经过量化或者是iGPU 加速,在不同推理设备上,模型推理速度会有1~3倍不同程度的提升。通过测试可以看出最快速度可以实现23帧左右的推理。

3. 总结

  在本文中,我们基于OpenVINO下的模型优化工具NNCF,实现了RT-DETR模型的INT8量化,并且在损失极少的精度代价下,实现了模型推理速度提升3~4倍左右,模型大小将为原来的1/4,即提升了模型的推理速度,又降低了模型推理占用内存,这对在边缘设备部署具有十分重要的意义。
另外,我们通过OpenVINO Github指导,解决了RT-DETR模型无法在Intel iGPU上推理的困扰,实现了使用OpenVNO 在iGPU设备上的推理加速,使得模型推理速度有了1~3倍的提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/241024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盘点2023年低代码平台TOP10

盘点2023年低代码平台TOP10 1 什么是低代码平台2 十大低代码平台2.1 IVX2.2 简道云2.3 伙伴云2.4 企名片one2.5 明道云2.6 轻流2.7 速融云2.8 轻舟——网易2.9 钉钉宜搭2.10 腾讯云-微搭 1 什么是低代码平台 低代码平台是一种开发软件的方法&#xff0c;它可以通过简单的拖放和…

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含python、JS工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境 相关其它博客工程源代码下载其它资料下载 前言 本项目基于Keras框架&#xff0c;引入CNN进行模型训练&#xff0c;采用Dropout梯度下降算法&#xff0c;按比例…

【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全、容器部署安全

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

【毕业设计之Android系列】智能家居远程控制系统设计

智能家居远程控制系统设计 摘 要 该系统是一种基于Android平台的应用程序&#xff0c;可以通过网络连接实现对家居设备的远程控制。其主要功能包括家居设备的开关控制、温度调节、音乐播放、安防监控等。系统的设计需要考虑硬件、软件、数据传输、安全性和扩展性等因素&#xf…

【EXCEL】vlookup,index/match查找函数

区别&#xff1a; 1.Vlookup函数只能查找列数据&#xff0c;即纵向查找&#xff0c;而IndexMatch函数&#xff0c;既可以纵向查找&#xff0c;也可以横向查找&#xff1b; 2、Vlookup函数查找的依据(第一个参数)必须位于数据源的第一列&#xff0c;IndexMatch函数组合则无此限制…

深度强化学习记录

增强学习是什么 增强学习 与环境交互获取反馈 agent 目标是最大化累积奖励&#xff0c;称为期望值回馈 增强学习框架 RL Process RL process叫做Markov Decision Process (MDP) The reward hypothesis RL基于奖励假设&#xff0c;目标函数是最大化期望回归&#xff0c…

MobileNet网络

介绍 MobileNet 网络专注于移动端或者嵌入式设备中的轻量级CNN网络&#xff0c;相比传统卷积神经网络&#xff0c;在准确率小幅降低的前提下大大减少模型参数与运算量&#xff08;相比VGG16准确率减少了0.9%&#xff0c;但模型参数只有VGG的1/32&#xff09; 网络中的亮点&am…

基于SSM的小儿肺炎知识管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

蓝桥杯Web组学习总结 - 目录导航版

HTML5 HTML 基础标签 HTML5 标签列表 HTML5 新特性 HTML5都有哪些新特性&#xff1f; CSS3 CSS 基础语法 CSS参考手册 盒子模型 CSS Box Model (盒子模型) 浮动与定位&#xff1f;&#xff1f; CSS 浮动(float)与定位(position) CSS布局之浮动和定位 CSS3 新特性 …

shiro Filter加载和执行 源码解析

一、背景 在使用若依框架&#xff08;前后端不分离包含shiro安全框架&#xff09;时&#xff0c;发现作者添加了验证码、登录帐号控制等自定义过滤器&#xff0c;于是对自定的过滤器加载和执行流程产生疑问。下面以验证码过滤器为例&#xff0c;对源码解析。注意类之间的继承关…

链游成为蓝海,潮游世界开创未来新时代

区块链、元宇宙浪潮来袭&#xff0c;为数字世界开启崭新的大门&#xff0c;一场链游模式的范式革命正在发生&#xff01; 未来&#xff0c;元宇宙中&#xff0c;链游将成为中坚力量。 潮游世界抢占时代先机&#xff0c;利用区块链技术的去中心化和数字资产的不可替代性&#x…

当当狸AR智能学习图集跨越千年文明传承,邀您“面对面”与虚拟诗人互动对诗

中华传统文化底蕴深厚&#xff0c;余韵悠长。即使经过千年的历史裂变&#xff0c;依然历久铭心慰藉着一代又一代人的灵魂。千百年后的今天&#xff0c;成为了我们独一无二的财富。 如今&#xff0c;国人学习中华传统文化的方式有很多&#xff0c;诗词集、动画影片、诗歌传颂等…

生物技术行业分析:预计2029年将达到55707亿元

生物技术( biotechnology),是指人们以现代生命科学为基础,结合其他基础科学的科学原理,采用先进的科学技术手段,按照预先的设计改造生物体或加工生物原料,为人类生产出所需产品或达到某种目的的技术方式生物技术利用对微生物、动植物等多个领域的深入研究,利用新兴技术对物质原…

Unity2023.3(有可能叫Unity6)版本开始将可以发布WebGPU

翻译一段官网上的话&#xff1a; 利用Unity 2023.3(发布时有可能叫Unity6)中最新的WebGPU图形API集成&#xff0c;尝试最大限度的提升您的网络游戏的真实感。 通过与谷歌的战略合作&#xff0c;Unity实时3D平台的强大的图形功能现在为图形丰富的网络游戏进行微调&#xff0c;实…

如何解决PET材料难于粘接的问题?有效解决方案分享!

1.PET是什么材料?有哪些特点和用途&#xff1f; PET是聚对苯二甲酸乙二醇酯&#xff08;Polyethylene Terephthalate&#xff09;的缩写&#xff0c;是一种常见的塑料材料。它具有以下特点&#xff1a; 高强度和刚性&#xff1a;PET具有较高的拉伸强度和模量&#xff0c;使其…

python对验证码进行降噪处理

举例图&#xff1a; 第一步先通过二值化处理把干扰线去掉&#xff1a; from PIL import Image# 二值化处理 def two_value():for i in range(1,5):# 打开文件夹中的图片imageImage.open(./Img/str(i).jpg)# 灰度图limimage.convert(L)# 灰度阈值设为165&#xff0c;低于这个值…

如何使用CFImagehost结合内网穿透搭建简洁易用的私人图床并远程访问

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

从零开始学Python系列课程第13课:Python中的循环结构(上)

一、循环结构的应用场景及分类 我们在编写程序时&#xff0c;一定会遇到需要重复执行某些指令的场景。举一个简单的例子&#xff0c;在前面讲分支结构时以游戏通关为例&#xff0c;如果第一关结束时分值不够则通关失败需要重新闯关&#xff0c;重新闯关这就是一个重复性的动作…

概率的乘法公式

两个事件的情况 假设A、B为随机事件&#xff0c;并且事件A的概率&#xff0c;那么 三个事件的情况 假设A、B、C为随机事件&#xff0c;并且&#xff0c;那么 多个事件的情况 假设为随机事件&#xff0c;其中&#xff0c;并且&#xff0c;那么

Resolving ORA-600[3020] Raised During Recovery

Resolving ORA-600[3020] Raised During Recovery (Doc ID 361172.1)​编辑To Bottom In this Document Symptoms Changes Cause Solution References APPLIES TO: Oracle Database Exadata Cloud Machine - Version N/A and later Oracle Cloud Infrastructure - Database Ser…