Quantization-Aware-Training(QAT)
量化感知训练 (QAT) 是一种用于深度学习的技术,用于训练可以量化的模型,以便部署在计算能力有限的硬件上。QAT 在训练过程中模拟量化,让模型在不损失精度的情况下适应更低的位宽。与量化预训练模型的训练后量化 (PTQ) 不同,QAT 涉及在训练过程本身中量化模型。
QAT过程可以分解为以下步骤:
定义模型:定义一个浮点模型,就像常规模型一样。
定义量化模型:定义一个与原始模型结构相同但增加了量化操作(如torch.quantization.QuantStub())和反量化操作(如torch.quantization.DeQuantStub())的量化模型。
准备数据:准备训练数据并将其量化为适当的位宽。
训练模型:在训练过程中,使用量化模型进行正向和反向传递,并在每个 epoch 或 batch 结束时使用反量化操作计算精度损失。
重新量化:在训练过程中,使用反量化操作重新量化模型参数,并使用新的量化参数继续训练。
Fine-tuning:训练结束后,使用fine-tuning技术进一步提高模型的准确率。
在PyTorch中,可以使用 torch.quantization.quantize_dynamic() 方法来执行 QAT。这是一个基本的 QAT 示例:
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
from torch.quantization import QuantStub, DeQuantStub, \quantize_dynamic, prepare_qat, convert# Define the model
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.quant = QuantStub()self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)self.relu = nn.ReLU(inplace=True)self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)self.avgpool = nn.AdaptiveAvgPool2d((1, 1))self.fc = nn.Linear(128, 10)self.dequant = DeQuantStub()def forward(self, x):x = self.quant(x)x = self.conv1(x)x = self.relu(x)x = self.conv2(x)x = self.relu(x)x = self.avgpool(x)x = x.view(x.size(0), -1)x = self.fc(x)x = self.dequant(x)return x# Prepare the data
transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])
])
train_data = datasets.CIFAR10(root='./data', train=True, download=True,transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64,shuffle=True, num_workers=4)# Define the model and optimizer
model = MyModel()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)# Prepare the model
model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm')
model = prepare_qat(model)# Train the model
model.train()
for epoch in range(10):for i, (data, target) in enumerate(train_loader):optimizer.zero_grad()output = model(data)loss = nn.CrossEntropyLoss()(output, target)loss.backward()optimizer.step()if i % 100 == 0:print('Epoch: [%d/%d], Step: [%d/%d], Loss: %.4f' %(epoch+1, 10, i+1, len(train_loader), loss.item()))# Re-quantize the modelmodel = quantize_dynamic(model, {'': torch.quantization.default_dynamic_qconfig}, dtype=torch.qint8)# Fine-tuning
model.eval()
for data, target in train_loader:model(data)
model = convert(model, inplace=True)
在这个例子中,我们在CIFAR10 数据集上训练一个简单的卷积神经网络,并执行 QAT 以获得更好的量化模型。我们首先定义一个MyModel类来定义模型,然后准备训练数据。我们使用 torch.quantization.get_default_qat_qconfig() 方法获取默认的 QAT 配置,使用 prepare_qat() 方法准备
量化参数。训练后,我们使用 convert() 方法将模型转换为量化模型。
总的来说,QAT是一种非常有用的技术,可以帮助我们训练更好的量化模型。与PTQ不同,QAT 可以在训练过程中自适应地调整模型的参数和量化参数,以提高模型的准确性和性能。在PyTorch中,可以使用 torch.quantization.quantize_dynamic() 方法来执行 QAT。
如果PTQ中模型训练和量化是分开的,而QAT则是在模型训练时加入了伪量化节点,用于模拟模型量化时引起的误差。
QAT处理流程如下:
-
首先在数据集上以FP32精度进行模型训练,得到训练好的baseline模型;
-
在baseline模型中插入伪量化节点,
-
进行PTQ得到PTQ后的模型;
-
进行量化感知训练;
-
导出ONNX 模型。
QAT后的提升
查看全文
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/2238412.html
如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!
相关文章:
量化敏感层分析Quantization-Aware-Training(QAT)
Quantization-Aware-Training(QAT)
量化感知训练 (QAT) 是一种用于深度学习的技术,用于训练可以量化的模型,以便部署在计算能力有限的硬件上。QAT 在训练过程中模拟量化,让模型在不损失精度的情况下适应更低的位宽。与……
VSCode修改配置(设置settings.json)汇总
1.settings.json文件在哪(打开settings.json方式)
(1)C:\Users\【你电脑名字username】\AppData\Roaming\Code\User (2)左下角设置按钮 (3)文件 -> 首选项 -> 设置
在这设置……
ros中bag怎么删除话题?
转换出来的rosbag包,有的甚至25个G,即使压缩了bag还是有很大,但是我们可以删除其中不需要的话题,比如做lidar和imu,删除相机相关话题。 网上有方法使用脚本转换,说实在,有点麻烦,对新……
蓝桥杯砝码称重案例改善:使用Java集合框架来提高效率与准确性
文章目录前言一、Java集合框架的组成二、HashSet 集合三、蓝桥杯省赛(砝码称重)总结前言
如果您是Java开发人员,那么Java集合框架就是您必须掌握的基础知识。Java集合框架提供了一组接口和实现类,用于存储和处理数据。它们使开发……
蓝易云:linux系统中cat命令的用法
cat命令是一种在Linux系统中非常常用的命令,它的主要作用是将文件内容输出到屏幕上(也可以将多个文件的内容合并成一个文件)。下面是cat命令的详细介绍:
1. 基本语法
cat [选项] [文件…]
如果不指定文件名,则cat命……
java8 Instant 计算方法耗时, 再见了我的System.currentTimeMillis()
以下是一个 Java Instant 计算方法耗时的示例代码:
import java.time.Duration;
import java.time.Instant;public class InstantExample {public static void main(String[] args) {Instant start Instant.now();// 执行需要计算耗时的方法long result calculat……
Python求矩阵的范数和行列式
文章目录范数行列式迹在scipy.linalg的函数中,往往会提供两种参数,其一是check_finite,当为True时将进行有限检查,另一类是overwrite_xxxx,表示xxxx在计算过程中是否可以被覆写。简洁起见,后文中说a提供覆写……
Latent Diffusion(CVPR2022 oral)-论文阅读
文章目录摘要背景算法3.1. Perceptual Image Compression3.2. Latent Diffusion Models3.3. Conditioning Mechanisms实验4.1. On Perceptual Compression Tradeoffs4.2. Image Generation with Latent Diffusion4.3. Conditional Latent Diffusion4.4. Super-Resolution with ……
perl笔记整理
1. 在Perl 中,注释由#开始,直到本行结束(Perl 中没有“块注释”(block comments)) (1) 在Unix 系统中◆,如果文本的第一行前两个字符是“#!”,接着的就是执行下面文件的程序
#! /us……
git rebase知识点整理
rebase原理
git rebase branchA branchB:首先会取出branchB,将branchB中的提交放在branchA的顶端,一般branchB为当前分支,可以不指定。
master branch 上有新代码提交,本地branch1还停留在旧的master版本。
目的&am……
一个python训练
美国:28:麻省理工学院,斯坦福大学,哈佛大学,加州理工学院,芝加哥大学,普林斯顿大学,宾夕法尼亚大学,耶鲁大学,康奈尔大学,哥伦比亚大学,密歇根大学安娜堡分校,约翰霍普金斯大学,西北大学,加州大学伯克利分校,纽约大学,加州大学洛杉矶分校,杜克大学,卡内基梅隆大学,加州大学圣地……
Mybatis03学习笔记
目录 使用注解开发
设置事务自动提交
mybatis运行原理
注解CRUD
lombok使用(偷懒神器,大神都不建议使用)
复杂查询环境(多对一)
复杂查询环境(一对多)
动态sql环境搭建
动态sql常用标签……
编程日记2023/4/16 14:55:50
设置或取得c# NumericUpDown 编辑框值的方法,(注意:不是Value值)
本人在C#开发中使用到了NumericUpDown控件,但是发现该控件不能直接控制显示值,经研究得到下面的解决办法
NumericUpDown由于是由多个控件组合而来的控件,其中包含一个类似TextBox的控件,若想取得或改变其中的值要使用如下方法
N……
编程日记2023/4/16 14:55:46
使用NPOI 技术 的SetColumnWidth 精确控制列宽不能成功的解决办法(C#)
在使用NPOI技术开发自动操作EXCEL软件时遇到不能精确设置列宽的问题。
如
ISheet sheet1 hssfworkbook.CreateSheet("Sheet1");
sheet1.SetColumnWidth(0, 50 * 256); // 在EXCEL文档中实际列宽为49.29
sheet1.SetColumnWidth(1, 100 * 256); // 在EXCEL文……
编程日记2023/4/16 14:55:46
Mysql 数据库zip版安装时basedir datadir 路径设置问题,避免转义符的影响
本人在开发Mysql数据库自动安装程序时遇到个很奇怪的问题,其中my.ini的basedir 的路径设置是下面这样的:
basedir d:\测试\test\mysql
但是在使用mysqld安装mysql服务时老是启动不了,报1067错误,后来查看window事件发现一个独特……
java stream sorted排序 考虑null值
项目里使用到排序, java里没有像C# 里的linq,只有stream,查找stream.sorted源码看到有个
Comparator.nullsLast
然后看了一下实现,果然是能够处理null值的排序,如:minPriceList.stream().sorted(Comparator.comparing(l -> l.g……
spring @EnableConfigurationProperties 实现原理
查看DataSourceAutoConfiguration源码,发现如下代码: Configuration ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) EnableConfigurationProperties(DataSourceProperties.class) Import({ DataSourcePoolMetadataProvidersCon……
postman请求https网址没有响应,但是用浏览器有响应,解决办法
遇到个问题:同一个get请求的url,postman请求https网址没有响应,但是用浏览器有响应
url是https开头的,查看错误描述里有一个SSL的选项: 然后根据描述关掉这个选项: 然后就没问题了,能正常请求及……
java @Inherited注解的作用
看到很多注解都被Inherited进行了修饰,但是这个Inherited有什么作用呢?
查看Inherited代码描述:
Indicates that an annotation type is automatically inherited. If an Inherited meta-annotation is present on an annotation type decl……
spring mvc的两种部署到Servlet容器的方式:web.xml 、WebApplicationInitializer 以及WebApplicationInitializer原理分析
方式一、编写web.xml
通常我们将一个spring mvc程序部署到Servlet容器(例如Tomcat)时,会使用该方式,示例如下:
<web-app><listener><listener-class>org.springframework.web.context.ContextLoad……
编程日记2023/4/16 14:55:43