加速44%!RT-DETR量化无损压缩优秀实战

news2024/11/24 16:47:36

9d5ffb5eb21449caa63cb0927aef8944.gif

RT-DETR 模型是飞桨目标检测套件 PaddleDetection 最新发布的 SOTA 目标检测模型。其是一种基于 DETR 架构的端到端目标检测器,在速度和精度上均取得了 SOTA 性能。在实际部署中,为了追求“更准、更小、更快”的效率能力,本文使用飞桨模型压缩工具 PaddleSlim 中的自动压缩工具(ACT, Auto Compression Toolkit)将针对 RT-DETR 进行量化压缩及部署实战。使用 ACT 工具只需要几十分钟,即可完成量化压缩全流程。在模型精度持平的情况下,RT-DETR 模型体积压缩为原来的四分之一,GPU 推理加速44%

77d43876290bdb923042c0c141617732.png注:上述表格测试使用 Paddle Inference 开启 TensorRT,由于包含 D2H 拷贝时延,和论文 FP16 FPS 相比略慢。

传送门

https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression/detection

f4c83e48a517bd846a96f875ecfdf577.png

RT-DETR 模型快速开始

RT-DETR 在一众 YOLO 模型中脱颖而出,成为新 SOTA,它的效果如下图所示。

0d025b41d64d12eb55e9e5c830c2b7c2.png

点击下方文章,获取更多RT-DETR信息:

  • 超越YOLOv8,飞桨推出精度最高的实时检测器RT-DETR!

为了更方便开发者体验 RT-DETR 的效果,快速跑通从数据校验,模型训练开发到部署的全流程,飞桨在 AI Studio 全新上线了 PaddleX 模型产线。开发者只需要在模型库中选择创建模型产线,即可通过工具箱或者开发者模式快速体验 RT-DETR 模型产线全流程,非常方便易用,欢迎开发者在线体验。

f104faf63559ea44abcfffffafa3e92d.gif

快速体验地址:

https://aistudio.baidu.com/aistudio/modelsoverview

d740b3a244d2347be412a8315a5cf76b.pngRT-DETR 模型分析

在对 RT-DETR 量化压缩前,我们对它进行了分析。RT-DETR 网络模型主要由两个部分组成,分别是 ResNet 或者 HGNetv2 构成的 backbone 和 RT-DETR 构成的检测头。在模型的 backbone 中有大量的卷积层,此外在检测头中也有大量的矩阵乘计算,这些操作均可进行量化,从模型结构上分析来看,RT-DETR 模型拥有足够的量化加速潜力。我们使用了量化分析工具分析了各层的激活值分布:

eb59791bd37382106a32afdd03645e7d.png

大部分激活值分布都比较集中,离群点很少,这对量化很友好。同时我们分析了各层的权重数值分布:

d5e5bbfcebc18bf57a0474753e899b91.png

可以看到权重的数据分布基本上符合正态分布,且数值较小,这样的权重分布比较适合量化。分析发现 RT-DETR 有较好的量化压缩潜力,并且为了进一步提升模型部署的性能,我们就开始量化压缩实战吧。

df32680cde0f341d6ef9aa33fd217252.png

RT-DETR 模型压缩实战

84f2d7c49ba5de229674469e45a1dedd.png

RT-DETR 模型准备

PaddleDetection 中提供了官方训练好的使用了不同 backbone 的模型,我们直接使用这些模型作为原始的模型即可。在 PaddleDetection 的环境下按照其流程将模型导出成为静态图模型,这些静态图用于量化压缩和部署测试。

python tools/export_model.py -c configs/rtdetr/rtdetr_r50vd_6x_coco.yml \
              -o weights=https://bj.bcebos.com/v1/paddledet/models/rtdetr_r50vd_6x_coco.pdparams trt=True \
              --output_dir=output_inference

b5033899727a116dc747c4233ec8dd1f.png数据集准备

使用 PaddleSlim 自动压缩工具量化模型需要少量的校准数据,这里我们使用标准的 COCO 数据集进行测试,可以按照 PaddleDetection 中数据准备教程进行准备,数据格式如下所示:

>>tree dataset/coco/
├── annotations
│   ├── instances_train2017.json
│   ├── instances_val2017.json
├── train2017
│   ├── 000000000009.jpg
│   │  ...
├── val2017
│   ├── 000000000139.jpg
│   │  ...

数据准备教程:

https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.6/docs/tutorials/data/PrepareDetDataSet.md

afbc1921d8b47868a1074d8924a61d4c.png

模型量化压缩

量化压缩一般是指降低模型存储和计算所用数值的位数,达到减少计算量、存储资源和提升推理速度的效果。在飞桨家族中,PaddleSlim 是一个模型压缩工具库,包含模型剪裁、量化、知识蒸馏、超参搜索和模型结构搜索等一系列模型压缩策略。其中的自动化压缩工具通过无源码的方式,自动对预测模型进行压缩,压缩后模型可直接部署应用。我们使用自动化压缩工具进行模型压缩分为以下3个步骤:

  • 准备预处理配置文件

数据预处理的配置和 PaddleDetection 中的模型配置对齐即可:

1.EvalReader:
2.  sample_transforms:
3.    - Decode: {}
4.    - Resize: {target_size: [640, 640], keep_ratio: False, interp: 2}
5.    - NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}
6.    - Permute: {}
7.  batch_size: 1
8.  shuffle: false
9.  drop_last: false
  • 定义量化配置文件

定义量化训练的配置文件,Distillation 表示蒸馏参数配置,QuantAware 表示量化参数配置,TrainConfig 表示训练时的训练轮数、优化器等设置。

具体超参的设置可以参考 ACT 超参设置文档

https://github.com/PaddlePaddle/PaddleSlim/blob/develop/example/auto_compression/hyperparameter_tutorial.md

1.Global:
2.  reader_config: configs/rtdetr_reader.yml
3.  model_dir: /rtdetr_r50vd_6x_coco/
4.  ……
5.Distillation:
6.  alpha: 1.0
7.  loss: soft_label
8.
9.QuantAware:
10.  onnx_format: true
11.  activation_quantize_type: 'moving_average_abs_max'
12.  quantize_op_types:
13.  - conv2d
14.  - matmul_v2
15.
16.TrainConfig:
17.  train_iter: 1000
18.  eval_iter: 100
19.  learning_rate:  0.00001
20.  optimizer_builder:
21.    optimizer: 
22.      type: SGD
23.    weight_decay: 4.0e-05
  • 开始运行

少量代码就可以开始 ACT 量化训练。启动 ACT 时,需要传入模型文件的路径(model_dir)、模型文件名(model_filename)、参数文件名称(params_filename)、压缩后模型存储路径(save_dir)、压缩配置文件(config)、dataloader和评估精度的 eval_callback。

1.    ac = AutoCompression(
2.        model_dir=global_config["model_dir"],
3.        model_filename=global_config["model_filename"],
4.        params_filename=global_config["params_filename"],
5.        save_dir=FLAGS.save_dir,
6.        config=all_config,
7.        train_dataloader=train_loader,
8.        eval_callback=eval_func)
9.    ac.compress()

以上是精简后的关键代码,如果想快速体验,可以根据下方链接中的示例文档及代码进行体验:

https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression/detection

如果使用 GPU 训练,在几十分钟内就可以完成整个压缩过程。训练完成后会在 save_dir 路径下产出 model.pdmodel和model.pdiparams文件。至此,完成了模型训练压缩工作。

f059369b45ab2a3dd9e9494dcbe654d7.png

RT-DETR 模型部署

飞桨原生推理库 Paddle Inference 性能优异,针对不同平台不同的应用场景进行了深度的适配优化,做到高吞吐、低时延,支持了本项目 RT-DETR 模型的 INT8 加速推理。所以在 RT-DETR 量化压缩后,我们使用 Paddle Inference 推理库进行部署。

推理环境准备

  • 硬件环境

需要一台载有支持 INT8 加速推理的 NVIDIA tesla T4 显卡或者 A10 的推理主主机。

  • 软件环境

PaddlePaddle develop 版本

我们使用以下代码进行量化模型推理速度和精度测试:

https://github.com/PaddlePaddle/PaddleSlim/blob/develop/example/auto_compression/detection/paddle_inference_eval.py

具体地,将压缩后的模型拷贝到指定位置,运行指令:

python paddle_inference_eval.py \
    --model_path=./rtdetr_r50_quant/ \
    --reader_config=configs/rtdetr_reader.yml \
    --use_trt=True --precision=int8

值得注意的是,需要运行两次上述指令。第一次运行会收集模型信息并保存 dynamic_shape.txt,用于构建 TensorRT 加速引擎,之后运行会直接加载该文件进行实际预测。最终测试的量化模型的效果如下表所示:

b16751d36bb2fd33e6d789a2b9a3cb6f.png

-上表测试环境:Tesla T4,TensorRT 8.6.0,CUDA 11.7,batch_size=1

7ee8a0c173bfd35373f2df126f58d1ed.png-上表测试环境:A10,TensorRT 8.6.0,CUDA 11.6,batch_size=1

-mAP的指标均在COCO val2017数据集中评测得到,IoU=0.5:0.95

⭐Star收藏⭐

这么好的项目,欢迎大家点star鼓励并前来体验!

https://github.com/PaddlePaddle/PaddleSlim

7b70008d6ec8ec697ec5f4826f05e7d4.png

总结与展望

本文对 RT-DETR 检测模型进行了量化压缩的全流程实践,在极小的成本下生成了能高速推理的压缩模型。在 Paddle Inference 中,经过压缩后模型的精度损失几乎可以忽略不计,但是带来的加速效果十分明显,相较于原模型最高加速比为44%。希望看到这篇文章的开发者们,如果想进一步对 RT-DETR 进行模型压缩和部署,可以动手实践一下,亲自体验加速AI模型的快乐,希望 PaddleSlim 和 Paddle Inference 能够助力更多模型的部署落地。

项目地址

  • GitHub

https://github.com/PaddlePaddle/PaddleSlim

  • Gitee

https://gitee.com/paddlepaddle/PaddleSlim

拓展阅读

无需训练代码,推理性能提升1.4~7.1倍,业界首个自动模型压缩工具开源!

RT-DETR 快速体验地址

https://aistudio.baidu.com/aistudio/modelsoverview

6e8dc861b40c6fb27381ac334dfb1560.gif

关注【飞桨PaddlePaddle】公众号

获取更多技术内容~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单元测试:构建可靠软件的关键步骤

点击上方“程序猿技术大咖”,关注并选择“设为星标” 回复“加群”获取入群讨论资格! 引言: 在当今快节奏的软件开发环境中,构建可靠的软件是至关重要的。单元测试作为软件开发过程中的关键步骤之一,能够帮助开发者发现…

006、体系结构之TiKV读取和Coprocessor

TiKV读取和Coprocessor 1、数据的读取1.1、ReadIndex Read1.2、Follower Read 协同处理器(Coprocessor) 1、数据的读取 1.1、ReadIndex Read 例如此时要读取 key 1 的内容,它不能直接去kv中读取,因为它是分布式的,它经过TiDB Server 收到读…

认识ASP.NET MVC的5种AuthorizationFilter

一、IAuthorizationFilter 所有的AuthorizationFilter实现了接口IAuthorizationFilter。如下面的代码片断所示,IAuthorizationFilter定义了一个OnAuthorization方法用于实现授权的操作。作为该方法的参数filterContext是一个表示授权上下文的AuthorizationContext对…

机器学习笔记 - 基于深度学习的多种目标跟踪检测框架简述

一、 目标跟踪 对象跟踪是执行一组初始对象检测的任务,为每个初始检测创建唯一的 ID,然后在每个对象在视频中的帧中移动时跟踪它们,从而维护 ID 分配。最先进的方法涉及融合来自RGB和基于事件的相机的数据,以产生更可靠的对象跟踪。仅使用RGB图像作为输入的基于CNN的模型也…

【JUC基础】17. 并发编程常见问题

目录 1、前言 2、上下文切换问题 2.1、什么是上下文切换 2.2、上下文切换过程 2.3、上下文切换的原因 2.4、上下文切换的开销和影响 2.5、注意事项和改进策略 3、死锁问题 3.1、什么是死锁 3.2、死锁示例 3.3、改进策略 4、竞态条件 5、内存可见性 6、小结 1、前言…

Hinton:我对“青蛙”创造出“人”这件事的后果很紧张丨全文整理+视频

假如青蛙创造了人,那现在是青蛙控制人类,还是人类控制青蛙?我不知道如何防止这种情况发生。我老了,希望像你们这样年轻而才华横溢的研究人员弄清楚如何拥有这些超级智能,并使我们的生活在不受超级智能控制的情况下变得…

Servlet+jsp+Layui图书管理系统

项目介绍 介绍 使用到了jsp,servlet,Mysql,Java,layui。 大致功能 关于用户: 登录,申请注册,查看搜索图书,查看有关用户的借阅记录,丢失记录,预借记录。对…

详解3DMAX室内建筑效果图的制作渲染过程

如果你并不了解室内、建筑效果图的制作渲染过程,本文将可能对你有一些帮助。 ​什么是 3DMax 渲染? 渲染是利用3dmax软件创建与原始建筑设计或模型精确的 3D 图片的技术。最终效果图在逼真度、精度、细节和真实性方面准确地反映了真实材料和光线。具有经验和专业知识的室内…

Elastic 8.8 版引入了全新的 Learned Sparse Encoder 模型,并宣布正式推出合成监测

作者:Brian Bergholm 2023年5月25日 今天,我们非常高兴地宣布 Elastic 8.8 版正式发布。 新增功能 Elastic 企业搜索可帮助开发人员利用 Elasticsearch 实现强大的现代搜索和发现体验。 请在 “Elastic 企业搜索亮点” 博文或 8.8 版发行说明中&#…

HarmonyOS学习路之开发篇—Java UI框架(TableLayout)

TableLayout TableLayout使用表格的方式划分子组件。 支持的XML属性 TableLayout的共有XML属性继承自:Component TableLayout的自有XML属性见下表: 属性名称 中文描述 取值 取值说明 使用案例 alignment_type 对齐方式 align_edges 表示TableL…

AI实战营第二期 第八节 《MMSegmentation代码课》——笔记9

AI实战营第二期 第八节 《MMSegmentation代码课》 【课程链接】https://www.bilibili.com/video/BV1uh411T73q/ 【讲师介绍】张子豪 OpenMMLab算法工程师 【学习形式】录播社群答疑 【作业布置】本次课程为实战课,需提交笔记作业。 课程大纲: 环境配…

5--Gradle入门 - junit 的使用

5--Gradle入门 - junit 的使用 Gradle 对测试支持 测试任务自动检测并执行测试源集中的所有单元测试。测试执行完成后会生成一个报告。支持JUnit 和 TestNG 测试。 默认测试目录及标准输出 Junit 使用 Gradle 对于Junit4.x 支持 dependencies {testImplementation group: jun…

你们把我当领路人,而你们才是我最大的 “财富“

文章目录 前言一、追忆往昔二、关于编程语言三、算法的重要性四、我是学生,为什么要收我钱?五、视频教程 前言 看到星友的反馈,我觉得做这件事情是我有生以来,做的最正确的一次决策。你们把我当领路人,而实际上你们才是…

YOLOv5/v7 添加注意力机制,30多种模块分析④,CA模块,ECA模块

目录 一、注意力机制介绍1、什么是注意力机制?2、注意力机制的分类3、注意力机制的核心 二、CA模块1、CA模块的原理2、实验结果3、应用示例 三、ECA模块1、ECA模块的原理2、实验结果3、应用示例 大家好,我是哪吒。 🏆本文收录于,…

阿里云企业邮箱设置教程(新手指南)

阿里云企业邮箱怎么使用?企业邮箱快速入门教程,从购买、设置管理员账号密码、创建组织架构账号邮件组、邮箱迁移、切换解析、钉邮绑定与同步,最后启用邮箱,阿里云百科分享阿里云企业邮箱使用教程快速入门: 目录 阿里…

2--Gradle入门 - Groovy简介、基本语法

2--Gradle入门 - Groovy简介、基本语法 Gradle 需要 Groovy 语言的支持,所以本章节主要来介绍 Groovy 的基本语法。 1.Groovy 简介 在某种程度上,Groovy 可以被视为Java 的一种脚本化改良版,Groovy 也是运行在 JVM 上,它可以很好地与 Java 代…

【OpenCV DNN】Flask 视频监控目标检测教程 08

欢迎关注『OpenCV DNN Youcans』系列,持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 08 3.8 OpenCVFlask实时监控人脸识别控制按钮新建 Flask 项目 cvFlask08cPython程序文件视频流的网页模板程序运行 本系列从零开始,详细讲解使用 Flask 框架构…

Nature子刊:生物合成硝基化蛋白,助力解决药物免疫耐受!

氨基酸是蛋白质的单个构建模块,对生物系统的正常运转至关重要。所有生物系统中的蛋白质都是由20种标准氨基酸组成的,自然界中还发现了超过500种不同类型的其他氨基酸,以及大量的人造氨基酸。其中一些替代氨基酸有助于创造新类型的药物和治疗方…

阿里企业邮箱注册流程(新手指南)

阿里云企业邮箱购买流程,企业邮箱分为免费版、标准版、集团版和尊享版,阿里云百科分享企业邮箱版本区别,企业邮箱收费标准价格表,以及阿里企业邮箱详细购买流程: 目录 阿里云企业邮箱购买流程 一、阿里云账号注册及…

驱动开发:内核ShellCode线程注入

还记得《驱动开发:内核LoadLibrary实现DLL注入》中所使用的注入技术吗,我们通过RtlCreateUserThread函数调用实现了注入DLL到应用层并执行,本章将继续探索一个简单的问题,如何注入ShellCode代码实现反弹Shell,这里需要…