深度学习模型量化方法-【文末含实战】主流深度学习框架

news2024/11/29 18:46:49

目录

一,深度学习模型量化概述

1.1 模型量化定义

1.2 模型量化的方案

1.3,量化的分类

1.4 模型量化好处

总结:

二,常用量化框架

2.1 OpenVINO NCCF

OpenVINO NCCF量化流程

OpenVINO NCCF量化优势

2.2 TensorRT量化框架

TensorRT量化的基本概念

TensorRT量化的目标

TensorRT量化的实现方式

TensorRT量化的校准方法

2.3 PyTorch(torch.quantization)

训练后量化

1). 训练后动态量化

2). 训练后静态量化

3). 量化感知训练(QAT)

三,总结

四,参考文章:


文末领福利

一,深度学习模型量化概述

深度学习模型量化是一项重要的技术,旨在通过减少网络参数的比特宽度(‌比特宽度是指在特定时间内,数据传输过程中每个比特所占用的时间或空间)来减小模型大小和加速推理过程,同时保持模型性能,以便将模型部署到边缘或低算力设备上,实现降低成本、提高效率的目标。

1.1 模型量化定义

模型量化是指将神经网络的浮点算法转换为定点。量化有一些相似的术语,低精度(Low precision)可能是常见的。

  • 低精度模型表示模型权重数值格式为 FP16(半精度浮点)或者 INT8(8位的定点整数),但是目前低精度往往就指代 INT8。

  • 常规精度模型则一般表示模型权重数值格式为 FP32(32位浮点,单精度)。

  • 混合精度(Mixed precision)则在模型中同时使用 FP32 和 FP16 的权重数值格式。FP16 减少了一半的内存大小,但有些参数或操作符必须采用 FP32 格式才能保持准确度。

1.2 模型量化的方案

在实践中将浮点模型转为量化模型的方法有以下三种方法:

data free:不使用校准集,传统的方法直接将浮点参数转化成量化数,使用上非常简单,但是一般会带来很大的精度损失,但是高通最新的论文 DFQ 不使用校准集也得到了很高的精度。

calibration:基于校准集方案,通过输入少量真实数据进行统计分析。很多芯片厂商都提供这样的功能,如 tensorRT、高通、海思、地平线、寒武纪

finetune:基于训练 finetune 的方案,将量化误差在训练时仿真建模,调整权重使其更适合量化。好处是能带来更大的精度提升,缺点是要修改模型训练代码,开发周期较长。

TensorFlow 框架按照量化阶段的不同,其模型量化功能分为以下两种:

  • QAT(Quantization-aware training) 训练时量化,伪量化,在线量化。

  • PTQ(Post-training quantization)训练后量化、离线量化;

PTQ(Post Training Quantization) 是训练后量化,也叫做离线量化,根据量化零点x0 是否为 0训练后量化分为对称量化非对称量化;根据数据通道顺序 NHWC(TensorFlow) 这一维度区分,训练后量化又分为逐层量化逐通道量化。目前 nvidia 的 TensorRT 框架中使用了逐层量化的方法,每一层采用同一个阈值来进行量化。逐通道量化就是对每一层每个通道都有各自的阈值,对精度可以有一个很好的提升。

1.3,量化的分类

目前已知的加快推理速度概率较大的量化方法主要有:

二值化,其可以用简单的位运算来同时计算大量的数。对比从 nvdia gpu 到 x86 平台,1bit 计算分别有 5 到128倍的理论性能提升。且其只会引入一个额外的量化操作,该操作可以享受到 SIMD(单指令多数据流)的加速收益。

线性量化(最常见),又可细分为非对称对称和 ristretto 几种。在 nvdia gpux86arm 和 部分 AI 芯片平台上,均支持 8bit 的计算,效率提升从 1 倍到 16 倍不等,其中 tensor core 甚至支持 4bit计算,这也是非常有潜力的方向。线性量化引入的额外量化/反量化计算都是标准的向量操作,因此也可以使用 SIMD 进行加速,带来的额外计算耗时不大。

对数量化,一种比较特殊的量化方法。两个同底的幂指数进行相乘,那么等价于其指数相加,降低了计算强度。同时加法也被转变为索引计算。目前 nvdia gpux86arm 三大平台上没有实现对数量化的加速库,但是目前已知海思 351X 系列芯片上使用了对数量化。

1.4 模型量化好处

加快推理速度,访问一次 32 位浮点型可以访问四次 int8 整型,整型运算比浮点型运算更快;CPU 用 int8 计算的速度更快。

某些硬件加速器如 DSP/NPU 只支持 int8。比如有些微处理器属于 8 位的,低功耗运行浮点运算速度慢,需要进行 8bit 量化。

总结:

模型量化主要意义就是加快模型端侧的推理速度,并降低设备功耗和减少存储空间。

工业界一般只使用 INT8 量化模型,如 NCNN、TNN 等移动端模型推理框架都支持模型的 INT8 量化和量化模型的推理功能。

通常,可以根据 FP32 和 INT8 的转换机制对量化模型推理方案进行分类。一些框架简单地引入了 Quantize 和 Dequantize 层,当从卷积或全链接层送入或取出时,它将 FP32 转换为 INT8 或相反。在这种情况下,如下图的上半部分所示,模型本身和输入/输出采用 FP32 格式。深度学习推理框架加载模型时,重写网络以插入 Quantize 和 Dequantize 层,并将权重转换为 INT8 格式。

图片

图一:混合 FP32/INT8 和纯 INT8 推理。红色为 FP32,绿色为 INT8 或量化

注意,之所以要插入反量化层(Dequantize),是因为量化技术的早期,只有卷积算子支持量化,但实际网络中还包含其他算子,而其他算子又只支持 FP32 计算,因此需要把 INT8 转换成 FP32。但随着技术的迭代,后期估计会逐步改善乃至消除 Dequantize 操作,达成全网络的量化运行,而不是部分算子量化运行。其他一些框架将网络整体转换为 INT8 格式,因此在推理期间没有格式转换,如上图的下半部分。该方法要求算子(Operator)都支持量化,因为运算符之间的数据流是 INT8。对于尚未支持的那些,它可能会回落到 Quantize/Dequantize 方案。

二,常用量化框架

当前工业界常用的主流量化工具与框架主要有以下三种!

2.1 OpenVINO NCCF

OpenVINO NCCF(Neural Network Compression Framework)量化框架是OpenVINO工具套件中的一个重要组成部分,旨在帮助开发者通过量化技术优化深度学习模型的性能。OpenVINO NCCF是一个用于深度学习模型压缩的框架,它提供了多种压缩算法,包括量化、剪枝、蒸馏等,以帮助开发者减小模型大小、提高推理速度和降低功耗。量化作为其中的一种重要技术,通过将模型中的浮点数参数转换为整数,实现了模型的压缩和加速。

OpenVINO NCCF量化流程

OpenVINO NCCF量化流程通常包括以下几个步骤:

  • 模型准备:首先,需要有一个训练好的深度学习模型,该模型可以是PyTorch、TensorFlow等框架下的模型。

  • 模型转换:将训练好的模型转换为OpenVINO的中间表示(IR)格式。这一步是可选的,但转换为IR格式可以更好地利用OpenVINO的优化功能。

  • 量化配置:配置量化参数,包括量化精度(如INT8、FP16等)、量化策略(如对称量化、非对称量化等)以及量化目标设备(如CPU、GPU等)。

  • 量化执行:使用OpenVINO NCCF提供的量化工具或API对模型进行量化。这一步通常包括前向传播以收集统计信息、计算量化参数以及应用量化参数到模型权重和激活中。

  • 模型评估:对量化后的模型进行评估,以验证量化对模型精度的影响。如果精度损失在可接受范围内,则可以继续使用量化后的模型;否则,需要调整量化参数并重新执行量化。

  • 模型部署:将量化后的模型部署到目标设备上,进行实际的推理任务。

OpenVINO NCCF量化优势

  • 高精度保持:OpenVINO NCCF提供了多种量化策略和算法,可以帮助开发者在保持模型精度的同时实现显著的压缩和加速。

  • 多硬件支持:OpenVINO NCCF支持多种硬件平台,包括Intel CPU、GPU、FPGA等,使得量化后的模型可以在不同的硬件上实现高效的推理。

  • 易用性:OpenVINO NCCF提供了丰富的API和工具,使得开发者可以轻松地集成和使用量化功能,无需深入了解底层的量化算法和优化技术。

ResNet18的图像分类模型FP32与INT8量化版本推理速度比较:

图片

在OpenVINO的官方文档和社区中,可以找到关于NCCF量化的详细示例和教程。这些示例通常包括模型准备、转换、量化、评估和部署等整个流程,为开发者提供了宝贵的参考和指导。

2.2 TensorRT量化框架

TensorRT量化是深度学习模型优化的一种重要手段,它通过将模型中的参数(如权重)从浮点数(如FP32)转换为整数(如INT8)来减少模型的存储和计算成本,从而达到模型压缩和运算加速的目的。

TensorRT量化的基本概念

NVIDIA的TensorRT是一个高性能的深度学习推理优化器,它支持多种深度学习框架(如TensorFlow、PyTorch等)的模型,并提供了一系列的优化技术,包括量化、层融合、动态张量等,以加速深度学习模型的推理速度。

TensorRT量化的目标

  • 减少模型大小:通过量化,可以将模型的参数从浮点数转换为整数,从而显著减少模型的存储需求。

  • 加速推理速度:在支持INT8等低精度整数运算的硬件上,使用量化后的模型可以显著提高推理速度。

  • 降低功耗:在一些嵌入式或移动设备上,使用量化后的模型可以降低功耗,延长设备的使用时间。

TensorRT量化的实现方式

TensorRT支持多种量化方式,主要包括隐式量化和显式量化两种:

  • 隐式量化:在TensorRT的早期版本中,隐式量化是主要的量化方式。它不需要修改模型结构或训练代码,只需要在模型推理过程中使用TensorRT提供的量化工具进行量化。隐式量化通常适用于训练后量化(PTQ)场景。

  • 显式量化:从TensorRT 8.0版本开始,显式量化得到了全面支持。显式量化允许在模型训练过程中插入量化指令(如QDQ操作),并在模型推理过程中使用TensorRT进行量化。显式量化可以提供更高的量化精度和更好的性能优化。

TensorRT量化的校准方法

在TensorRT中,量化过程中需要使用校准数据集来确定量化参数(如缩放因子和零点)。TensorRT支持多种校准方法,包括熵校准和最小最大值校准等:

  • 熵校准:熵校准是一种动态校准算法,它使用KL散度(KL Divergence)来度量推理数据和校准数据之间的分布差异。在校准过程中,TensorRT会分析每个张量的分布,并选择合适的量化参数以最小化KL散度。

  • 最小最大值校准:最小最大值校准使用最小最大值算法来计算量化参数。在校准过程中,TensorRT会统计校准数据中的最小值和最大值,并根据这些值来计算量化参数。

2.3 PyTorch(torch.quantization)

PyTorch的量化支持主要包括三种方式:训练后动态量化(Post Training Dynamic Quantization)、训练后静态量化(Post Training Static Quantization)以及量化感知训练(Quantization Aware Training, QAT)。

训练后量化

1). 训练后动态量化

概述:训练后动态量化是指在模型训练完成后,仅对模型的权重进行量化,而激活(activations)在推理过程中进行量化。这种方式适用于那些对精度要求不是特别高,但需要快速部署的场景。

特点:

  • 简单易用:不需要重新训练模型,只需要对训练好的模型进行量化。

  • 性能提升:与浮点数模型相比,量化后的模型在推理速度上会有显著提升,同时模型大小也会减小。

示例代码:

import torch from torch import nn from torch.quantization import quantize_dynamic
class DemoModel(nn.Module): def __init__(self): super(DemoModel, self).__init__ self.conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=1) self.relu = nn.ReLU self.fc = nn.Linear(2, 2)
def forward(self, x): x = self.conv(x) x = self.relu(x) x = self.fc(x) return x
model_fp32 = DemoModel model_int8 = quantize_dynamic( model=model_fp32, qconfig_spec={nn.Linear}, # 仅对Linear层进行量化 dtype=torch.qint8 )
2). 训练后静态量化

概述:训练后静态量化是指对模型训练完成后,不仅对权重进行量化,还对激活进行量化。这种方式需要收集一些代表性的数据来标定(calibrate)量化参数,以确保量化后的模型精度尽可能接近原始模型。由于同时量化了权重和激活,因此量化后的模型精度通常比动态量化更高。需要收集代表性的数据来标定量化参数。

示例流程:

  • 准备标定数据集。

  • 加载并准备模型(设置eval模式,并附加量化配置)。

  • 使用标定数据集对模型进行标定,以收集权重和激活的分布信息。

  • 将标定后的模型转换为量化模型。

3). 量化感知训练(QAT)

虽然QAT不属于训练后量化的范畴,但它是另一种重要的量化方式,值得提及。QAT是在模型训练过程中插入伪量化模块,模拟量化效应,从而提高模型对量化操作的适应能力。这种方式可以在一定程度上弥补静态量化在精度上的损失。

三,总结

  所谓的模型量化就是将浮点存储(运算)转换为整型存储(运算)的一种模型压缩技术。由于该技术可以极大地缩小模型的大小,提高模型的运行速度,从而满足机器人、手机等嵌入式终端的需求,因而得到了工业界的大量应用。当前比较成熟的模型量化技术主要分为两种,即训练后量化和训练时量化,训练时量化不仅能够达到量化效果,同时还可以获得准确的量化结果。当前的很多深度学习框架中已经将模型量化方法嵌入其中,便于用户的模型部署。除此之外,无论是移动端还是服务器端,都可以看到新的计算设备正不断迎合量化技术,因而量化技术一定会越来越完善,从而进一步推动深度学习模型在低功率、低成本、低性能的终端上面的部署。

四,参考文章:

How to Make Large Language Models Play Nice with Your Software Using LangChain - KDnuggets

福利利领取:

IT类包含:
Java、云原生、GO语音、嵌入式、Linux、物联网、AI人工智能、python、C/C++/C#、软件测试、网络安全、Web前端、网页、大数据、Android大模型多线程、JVM、Spring、MySQL、Redis、Dubbo、中间件…等最全厂牌最新视频教程+源码+软件包+面试必考题和答案详解。

资源目录检索,查;获取+V,CD20230507

https://path.dirts.cn/sfoA5TURw

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

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

相关文章

如何向两个不同 MySQL 数据源的相同数据库与表写入数据

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

AcWing 3188:Manacher 算法 → 最长回文子串

【题目来源】https://www.acwing.com/problem/content/3190/【题目描述】 给定一个长度为 n 的由小写字母构成的字符串,求它的最长回文子串的长度是多少。【输入格式】 一个由小写字母构成的字符串。【输出格式】 输出一个整数,表示最长回文子串的长度。…

VSCode创建插件HelloWorld找不到指令解决办法

按照网上的教程执行yo code并且生成成功 但是F5打开调试新窗口后,ctrl shift P,输入helloworld并没有指令提示 原因:当前电脑安装的VSCode版本过低,不支持当前插件的使用(因为自动生成的插件总是默认使用最新版VSC…

00 springboot项目创建

我们创建SpringBoot项目有两种方式: Spring Initializr spring initerzie 方式创建: 启动类, 依赖 生成,但是需要网络maven的方式 maven方式创建: 启动类, 依赖, 这些都需要手动编写,但是不需要网络 如果你觉得我分享的内容或者我的努力对你有帮助,或者你只是想表…

可看见车辆行人的高清实时视频第5辑

我们在《看见车辆行人的高清实时视频第4辑》分享了10处可看见车辆行人的实时动态高清视频。 现在我们又整理10处为你分享可看见车辆行人的实时动态高清视频,一共有50个摄像头数据,这些视频来自公开的高清摄像头实时直播画面。 我们在文末为你分享了这些…

制造业如何从0-1实现信息化建设?

深度长文,4000 字,融合了众多企业的实践经验和行业观点,一文讲清制造业信息化建设的路径,心急的小伙伴可以先看目录: 关于定义 —— 制造业信息化建设是什么?关于价值 —— 为什么制造业要进行信息化建设…

【C++】精妙的哈希算法

🚀个人主页:小羊 🚀所属专栏:C 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 一、哈希结构1、哈希概念2、哈希函数3、哈希冲突3.1 闭散列3.2 开散列 4、完整代码 一、哈希结构 1、哈希概念 A…

漏扫工具Appscan使用(非常详细)从零基础入门到精通,看完这一篇就够了。

1、简介 AppScan是一款商业化的web安全扫描工具,web扫描领域十分受欢迎 2、具体使用规则 1、常用界面 新建扫描文件 选择扫描 对于第一种扫描方式: 设置url和服务器 登录管理:对于需要登陆的页面(这种方法不允许有验证码&#…

人工智能AI与机器学习ML基础入门

小学生都能看懂的人工智能入门书籍 第一章 入门简介 TensorFlow 入门 如果你想入门人工智能(AI)?机器学习(ML)和深度学习是很好的起点。不过,一开始接触这些概念时,可能会被各种选项和新术语搞…

关于Spring Framework路径遍历漏洞(CVE-2024-38816)的预警提示和修复方案

一、漏洞详情 Spring Framework是一个Java应用程序框架,旨在提供高效且可扩展的开发环境。 近日,监测到Spring Framework中修复了一个路径遍历漏洞(CVE-2024-38816)。Spring Framework受影响版本中,使用WebMvc.fn 或…

MyBatisCodeHelperPro一直用教程

qq群:984518344 不懂请留言!!! (有能力请请支持正版!!) (仅供学习交流,严禁用于商业用途,请于24小时内删除!!&#xff09…

使用标注工具并跑通官方yolov8分割segment自己的数据集

1.下载标注工具用于打标签 使用标注工具,后面会用到智能标注 点击 创建AI多边形后命令行就自动下载对应的模型 单机要选中的图像就行,就可以智能选中,双击设置标签 依次标注所有图片 ,最后保存成json格式的文件 2.使用labelme2y…

Nuxt.js 应用中的 modules:before 事件钩子详解

title: Nuxt.js 应用中的 modules:before 事件钩子详解 date: 2024/10/15 updated: 2024/10/15 author: cmdragon excerpt: modules:before 是 Nuxt.js 中一个重要的生命周期钩子,在 Nuxt 应用初始化期间被触发。该钩子允许开发者在安装用户定义的模块之前执行某些操作,如…

交通目标识别数据集YOLO 模型 ui界面✓图片数量15000,xml和txt标签都有 11类 交通道路车辆行人红黄绿数据集 红绿灯数据集 交通信号数据集

YOLO交通目标识别 数据集 模型 ui界面 ✓图片数量15000,xml和txt标签都有; ✓class:biker,car,pedestrian,trafficLight,trafficLight-Green,trafficLight-GreenLeft, tr…

WPF中MVVM的应用举例

WPF(Windows Presentation Foundation)是微软开发的用于创建用户界面的框架,而MVVM(Model-View-ViewModel)模式是一种分离前端UI逻辑与后台业务逻辑的方法。在WPF中使用MVVM模式可以提高代码的可维护性、可测试性和可扩…

Vant 日期时间组件拓展

基于 "vant": "^4.8.3", 效果图 <template><!-- 弹出层 --><van-popupv-model:show"isPicker"position"bottom"><van-pickerref"picker":title"title"v-model"selectedValues"…

匿名管道和命名管道

目录 管道 pipe创建一个管道 让子进程写入&#xff0c;父进程读取 如何把消息发送/写入给父进程 父进程该怎么读取呢 管道本质 结论&#xff1a;管道的特征&#xff1a; 测试管道大小 写端退了&#xff0c;测试结果 测试子进程一直写&#xff0c;父进程读一会就退出 …

PAT甲级-1076 Forwards on Weibo

题目 题目大意 已知微博上粉丝都可能会转发自己所关注的人的动态&#xff0c;给定总人数n和层数l&#xff0c;和每个id关注的人数及所关注人的id。要求查询一组用户的潜在转发量&#xff0c;粉丝层级不能超过l。 思路 求潜在转发量&#xff0c;就是一层一层的找粉丝数&#…

【已知当前表字段名注入】

一、通配符注入 like 测试注入 usernameadmin&passwordadmin 提示username or password error输入单引号闭合测试 这里用or防止admin字段不存在数据库中&#xff0c;如果admin不存在用and连接admin不为真&#xff0c;username的逻辑还是没绕过&#xff0c;用or就算我们前面…