社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

深度学习模型量化方法与框架介绍

OpenCV学堂 • 3 月前 • 127 次点击  

点击上方蓝字关注我们

微信公众号:OpenCV学堂

关注获取更多计算机视觉与深度学习知识

深度学习模型量化概述

深度学习模型量化是一种重要的模型轻量化技术,旨在通过减少网络参数的比特宽度来减小模型大小和加速推理过程,同时尽量保持模型性能。从而达到把模型部署到边缘或者低算力设备上,实现降本增效的目标。

01

定义

模型量化是指将神经网络的浮点算法转换为定点算法,通常涉及将浮点数参数转换为低位数的整数,例如从32位浮点数(FP32)到8位整数(INT8)。这一技术通过减少模型中参数的位数来降低模型的存储需求和计算复杂性。

02

主要类型

静态量化:
在模型训练后进行,不涉及重新训练。它通常用于不需要细粒度调优的场景。

动态量化:
在模型推理时进行,对权重进行量化,但保留中间激活的浮点数表示。它适用于那些需要保持较高推理精度的应用。

量化感知训练QAT
QAT - Quantization Aware Training, 在训练过程中将量化考虑在内,通过模拟低精度的效果来训练模型。这种方法可以最大限度地减少量化对模型精度的影响。


03

量化方法

均匀量化:
所有权重与激活值被量化到均匀间隔的离散值上。这简化了量化的实现,是一种普遍使用的量化方法。

非均匀量化:
考量到分布的不均匀性,通过对数或其他方式量化,目的是最小化量化前后的信号失真。

对称与非对称量化:
对称量化在正负数值上使用相同的量化间隔,非对称量化则允许正负数值有不同的量化间隔。

常用量化框架

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

01

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)量化参数,以确保量化后的模型精度尽可能接近原始模型。由于同时量化了权重和激活,因此量化后的模型精度通常比动态量化更高。需要收集代表性的数据来标定量化参数。
示例流程:
1. 准备标定数据集。2. 加载并准备模型(设置eval模式,并附加量化配置)。3. 使用标定数据集对模型进行标定,以收集权重和激活的分布信息。4. 将标定后的模型转换为量化模型。

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

02

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量化的详细示例和教程。这些示例通常包括模型准备、转换、量化、评估和部署等整个流程,为开发者提供了宝贵的参考和指导。参考文件见这里:
NNCF压缩与量化YOLOv8模型与OpenVINO部署测试


03

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会统计校准数据中的最小值和最大值,并根据这些值来计算量化参数。

三行代码实现 TensorRT8.6 C++ 深度学习模型部署
OpenCV4系统化学习


深度学习系统化学习

推荐阅读

OpenCV4.8+YOLOv8对象检测C++推理演示

ZXING+OpenCV打造开源条码检测应用

攻略 | 学习深度学习只需要三个月的好方法

三行代码实现 TensorRT8.6 C++ 深度学习模型部署

实战 | YOLOv8+OpenCV 实现DM码定位检测与解析

对象检测边界框损失 – 从IOU到ProbIOU

初学者必看 | 学习深度学习的五个误区


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/172102
 
127 次点击