模型量化:PTQ + onnx

8 位线性量化的数学表达

  • 将 32 位浮点(实数)模型转换为 8 位整数模型
    F 32 = S c a l e ∗ ( I i n t 8 − Z ) 量化公式: I i n t 8 = F 32 S c a l e + Z F_{32} = Scale * (I_{int8}-Z)\\ 量化公式: I_{int8} = \frac{F_{32}}{Scale} + Z F32=Scale(Iint8Z)量化公式:Iint8=ScaleF32+Z
对称量化仿射量化
Z = 0 Z = 0 Z=0 Z ≠ 0 Z\neq 0 Z=0
S = 2 ∗ m a x ( a b s ( F m a x ) , a b s ( F m i n ) ) I m a x − I m i n S=\frac{2*max(abs(F_{max}), abs(F_{min}))}{ I_{max} - I_{min}} S=ImaxImin2max(abs(Fmax),abs(Fmin)) S = F m a x − F m i n I m a x − I m i n S=\frac{ F_{max}-F_{min}}{ I_{max} - I_{min}} S=ImaxIminFmaxFmin
s =max(abs(A1), abs(A2))/(2^7) ,z =0s = (A1-A2)/(2^8 + 1) ,z = -(ROUND(A2 * s)) - 2^(8-1)
量化到[-127,127]一般可量化到[-128,127] ([0,255])

卷积的量化(对称量化)

在这里插入图片描述

y 1 , 1 = x 1 , 1 ∗ w 1 , 1 + x 1 , 2 ∗ w 2 , 1 + x 1 , 3 ∗ w 3 , 1 = s a ∗ X 1 , 1 ∗ s b ∗ W 1 , 1 + s c ∗ X 1 , 2 ∗ s d ∗ W 2 , 1 + s e ∗ X 1 , 3 ∗ s f ∗ W 3 , 1 ( 量化 ) = s A ∗ s B ( X 1 , 1 ∗ W 1 , 1 + X 1 , 2 ∗ W 2 , 1 + X 1 , 3 ∗ W 3 , 1 ) ( 需满足 s A = s a , s c , s e 才行 ) y_{1,1} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\ =x_{1,1}*w_{1,1}+x_{1,2}*w_{2,1}+x_{1,3}*w_{3,1} \\ = s_a*X_{1,1}* s_b*W_{1,1}+ \qquad \qquad \qquad \ \\\ s_c*X_{1,2}*s_d*W_{2,1}+\qquad \qquad \quad \ \ \\\ s_e*X_{1,3}*s_f*W_{3,1}(量化)\qquad \ \ \ \ \\ = s_A*s_B(X_{1,1}*W_{1,1}+X_{1,2}*W_{2,1} \ \ \ \ \\ +X_{1,3}*W_{3,1})(需满足s_A=s_a,s_c,s_e才行) y1,1                                                          =x1,1w1,1+x1,2w2,1+x1,3w3,1=saX1,1sbW1,1+  scX1,2sdW2,1+   seX1,3sfW3,1(量化)    =sAsB(X1,1W1,1+X1,2W2,1    +X1,3W3,1)(需满足sA=sa,sc,se才行)

手动实现的一些细节(代码来自github,A simple network quantization demo using pytorch from scratch)

  • 基础公式
def quantize_tensor(x, scale, zero_point, num_bits=8, signed=False):if signed:qmin = - 2. ** (num_bits - 1)qmax = 2. ** (num_bits - 1) - 1else:qmin = 0.qmax = 2. ** num_bits - 1.q_x = zero_point + x / scaleq_x.clamp_(qmin, qmax).round_()return q_xdef dequantize_tensor(q_x, scale, zero_point):return scale * (q_x - zero_point)
  • 重新定义梯度 pytorch实现简单的straight-through estimator(STE)
class QConv2d(QModule):def __init__(self, conv_module, qi=True, qo=True, num_bits=8):super(QConv2d, self).__init__(qi=qi, qo=qo, num_bits=num_bits)self.num_bits = num_bitsself.conv_module = conv_moduleself.qw = QParam(num_bits=num_bits)self.register_buffer('M', torch.tensor([], requires_grad=False))  # 将M注册为bufferdef freeze(self, qi=None, qo=None):if hasattr(self, 'qi') and qi is not None:raise ValueError('qi has been provided in init function.')if not hasattr(self, 'qi') and qi is None:raise ValueError('qi is not existed, should be provided.')if hasattr(self, 'qo') and qo is not None:raise ValueError('qo has been provided in init function.')if not hasattr(self, 'qo') and qo is None:raise ValueError('qo is not existed, should be provided.')if qi is not None:self.qi = qiif qo is not None:self.qo = qoself.M.data = (self.qw.scale * self.qi.scale / self.qo.scale).dataself.conv_module.weight.data = self.qw.quantize_tensor(self.conv_module.weight.data)self.conv_module.weight.data = self.conv_module.weight.data - self.qw.zero_pointself.conv_module.bias.data = quantize_tensor(self.conv_module.bias.data, scale=self.qi.scale * self.qw.scale,zero_point=0, num_bits=32, signed=True)def forward(self, x):if hasattr(self, 'qi'):self.qi.update(x)x = FakeQuantize.apply(x, self.qi)self.qw.update(self.conv_module.weight.data)x = F.conv2d(x, FakeQuantize.apply(self.conv_module.weight, self.qw), self.conv_module.bias, stride=self.conv_module.stride,padding=self.conv_module.padding, dilation=self.conv_module.dilation, groups=self.conv_module.groups)if hasattr(self, 'qo'):self.qo.update(x)x = FakeQuantize.apply(x, self.qo)return x

PTQ(Post Training Quantization)

  • 一个帮助理解量化过程的demo
  • A simple network quantization demo using pytorch from scratch
    def quantize(self, num_bits=8):self.qconv1 = QConvBNReLU(self.conv1, self.bn1, qi=True, qo=True, num_bits=num_bits)self.qmaxpool2d_1 = QMaxPooling2d(kernel_size=2, stride=2, padding=0)self.qconv2 = QConvBNReLU(self.conv2, self.bn2, qi=False, qo=True, num_bits=num_bits)self.qmaxpool2d_2 = QMaxPooling2d(kernel_size=2, stride=2, padding=0)self.qfc = QLinear(self.fc, qi=False, qo=True, num_bits=num_bits)

在这里插入图片描述

预处理

  • ONNX 运行时提供 python API,预处理使用命令python -m onnxruntime.quantization.preprocess
  • 官方提供的实例为: python -m onnxruntime.quantization.preprocess --input mobilenetv2-7.onnx --output mobilenetv2-7-infer.onnx

量化( 动态量化& 静态量化)

静态量化

  • 官方提供的实例为:python run.py --input_model mobilenetv2-7-infer.onnx --output_model mobilenetv2-7.quant.onnx --calibrate_dataset ./test_images/
    静态量化方法首先使用一组称为校准数据的输入来运行模型。在这些运行期间,我们计算每个激活的量化参数。这些量化参数作为常量写入量化模型并用于所有输入。
import numpy as np
import onnxruntime
from onnxruntime.quantization import QuantFormat, QuantType, quantize_staticimport resnet50_data_reader
dr = resnet50_data_reader.ResNet50DataReader(calibration_dataset_path, input_model_path
)# Calibrate and quantize model
# Turn off model optimization during quantization
quantize_static(input_model_path,output_model_path,dr,quant_format=args.quant_format,# default=QuantFormat.QDQ, 有两种表示量化 ONNX 模型的方法:面向操作符(QOperator)的所有量化运算符都有自己的 ONNX 定义,如 QLinearConv、MatMulInteger 等。面向张量(QDQ;量化和反量化)。此格式在原始运算符之间插入 DeQuantizeLinear(QuantizeLinear(tensor)) 以模拟量化和反量化过程per_channel=args.per_channel,weight_type=QuantType.QInt8,optimize_model=False,
)

动态量化

  • 动态量化动态计算激活的量化参数(比例和零点)。这些计算增加了推理成本,但与静态计算相比通常可以获得更高的准确性。
import onnx
from onnxruntime.quantization import quantize_dynamic, QuantTypemodel_fp32 = 'path/to/the/model.onnx'
model_quant = 'path/to/the/model.quant.onnx'
quantized_model = quantize_dynamic(model_fp32, model_quant)# 
quantized_model = quantize_dynamic(model_fp32, model_quant, weight_type=QuantType.QUInt8)

调试与优化

  • 调试与优化见官方的例子
  • console python run_qdq_debug.py --float_model mobilenetv2-7-infer.onnx --qdq_model mobilenetv2-7.quant.onnx --calibrate_dataset ./test_images/

参考与更多

  • 此工具可用于量化选定的 ONNX 模型。支持基于模型中的运算符。使用详情请参考 ,示例请参考

  • 基于离群值去除的卷积神经网络模型训练后量化预处理方法

  • Quantizing deep convolutional networks for efficient inference: A whitepaper

  • https://zhuanlan.zhihu.com/p/622334595 量化语言模型

FX
  • TORCH.FX第二篇——PTQ量化实操

  • aware ( a 表加强 + ware 注视 )adj. 意识到的; 意识到; 知道; 明白; 察觉到; 发觉; 发现; 对…有兴趣的; 有…意识的

  • Quantization Aware Training 量化感知训练

  • 训练同时消弭量化的噪声

  • https://zhuanlan.zhihu.com/p/158776813

  • 基于OneFlow实现量化感知训练

  • Quantization (QAT) Demo on CIFAR10

  • Inference of quantization aware trained networks using TensorRT

  • https://github.com/666DZY666/micronet

  • 还有一个好处是, 你拿到的int8的pytorch模型, 可以无缝的部署到任何支持的框架上, 而不需要再其他框架上再进行量化.

  • 使用 TensorFlow 模型优化工具包进行量化感知训练 - 性能与准确性

  • Pytorch实现量化感知训练QAT(一)

  • Brevitas: quantization-aware training in PyTorch

  • 在本研究中,使用了Brevitas工具。它是一个基于流行的PyTorch工具的库,该工具允许训练量化神经网络(QNN)

  • Quantization library for PyTorch. Support low-precision and mixed-precision quantization, with hardware implementation through TVM(优化计算图的包).

  • Implements quantized distillation. Code for our paper “Model compression via distillation and quantization”

  • Summary, Code for Deep Neural Network Quantization

  • [CVPR’20] ZeroQ: A Novel Zero Shot Quantization Framework

  • PyTorch implementation for the APoT quantization (ICLR 2020)

  • 商汤:PPL Quantization Tool (PPQ) is a powerful offline neural network quantization tool.

  • AIMET is a library that provides advanced quantization and compression techniques for trained neural network models.

  • 4 bits quantization of LLaMa using GPTQ


- PyTorch量化感知训练(QAT)步骤

  • https://github.com/leimao/PyTorch-Quantization-Aware-Training/blob/main/cifar.py

  • https://leimao.github.io/blog/PyTorch-Quantization-Aware-Training/

  • Codes for paper: Central Similarity Quantization for Efficient Image and Video Retrieval,

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模型量化

https://zhuanlan.zhihu.com/p/132561405 模型量化是一种将浮点计算转成低比特定点计算的技术&#xff0c;可以有效的降低模型计算强度、参数大小和内存消耗&#xff0c;但往往带来巨大的精度损失。尤其是在极低比特(<4bit)、二值网络(1bit)、甚至将梯度进行量化时&#xf…

量化模型

量化模型&#xff08;Quantized Model&#xff09;是一种模型加速&#xff08;Model Acceleration&#xff09;方法的总称&#xff0c;包括二值化网络&#xff08;Binary Network&#xff09;、三值化网络&#xff08;Ternary Network&#xff09;&#xff0c;深度压缩&#xf…

读取锁信息失败(8):该账户当前被锁定,所以用户 ‘sa‘ 登录失败。

读取锁信息失败(8)&#xff1a;该账户当前被锁定&#xff0c;所以用户 sa 登录失败。系统管理员无法将该账户解锁。 State:37000,Native:18486,Origin:[Microsoft][ODBC SQL Server Driver][SQL Server] 打开软件提示上面的信息 此问题是由于sa账户在同一时间被多次登录&#x…

Oracle连接账户被锁:the account is locked 的解决办法

Oracle连接账户被锁&#xff1a;the account is locked 问题背景 在做配置文件数据库密码加密时&#xff0c;没注意做了一些骚操作&#xff0c;导致数据库被锁&#xff0c;网上找的资料都试了个遍&#xff0c;还是没用。浪费了两三个小时&#xff0c;差点都卸载重装数据库了。…

oracle提示“记录被另外一个用户锁定“

问题描述&#xff1a; 某人对某一条数据进行了修改&#xff0c;oracle会通过这个事务记住这条数据&#xff0c;若修改的人没有进行提交或进行回滚记录&#xff0c;oracle是不允许对这条数据在此进行修改的&#xff0c;在这种情况下你要进行修改数据&#xff0c;则会被阻止&…

ORACLE数据库 某用户账户被锁定问题解决

遇到的问题&#xff1a; [realestate][ERROR] [2022-05-17 14:27:11] com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(2469) | create connection SQLException, url: jdbc:p6spy:oracle:thin:172.18.13.83:1521/orclxj, errorCode 28000, state 99999 j…

Oracle账户被锁定后如何解锁

**原因&#xff1a;** 今天拉取了新的代码后&#xff0c;由于oracle数据库的配置忘记了更改&#xff0c;启动项目时一直连接不上数据库&#xff0c;改了两次后还是连接不上&#xff0c;最后只能启动一下没拉取代码前的项目&#xff0c;发现报了一个账户被锁定 ![在这里插入图片…

【饭谈】坚守自己的职业规划,给自己留一张底牌吧。

最近想必大家都被新出的chatGPT吓坏了吧&#xff1f;各种机构和博主跟风似的疯狂说gpt多厉害&#xff0c;会取代多少人&#xff0c;导致多少人下岗&#xff0c;各种Ai测试兴起等贩卖焦虑的言论。获得了很多的流量&#xff0c;也变现了很多。但却给全行业的打工人带来了恐惧心理…

深度:从工业救国到数字化兴国!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 昨天&#xff0c;发生了两件事情&#xff0c;一喜一悲&#xff0c;喜的是颁布了《数字中国建设整体布局规划》&#xff1b;悲的是“改革先锋”厉以宁先生离开了我们。将这两件事情结合起来&#xff0c;让我们思考一个问题—…

AI大模型,救了 “低代码” 的命

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 著名技术哲学家安德鲁•费恩伯格教授&#xff0c;曾提过一个很有创意的概念&#xff0c;“技术民主化”。教授认为&#xff0c;技术民主就是扩大社会个体的自由边界&#xff0c;让大家积极有效地参与到…

NVIDIA市值破万亿,回顾黄仁勋台大毕业典礼发表演说

夕小瑶科技说 分享 作者 | 黄仁勋 来源 | 芯榜、Datawhale干货 黄仁勋台大毕典演说全文。无论是追逐食物、或不被人当食物&#xff0c;你都要不停跑下去。 黄仁勋受邀参加台大毕业典礼。他出生于台南&#xff0c;4 岁时随家人离开台湾&#xff0c;前往美国。 摘要 英伟达&…

5个最喜欢的提示词技巧;如何制定企业的生成式AI战略;胎教级SD详细使用教程;ChatGPT不是万能的6个证据 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 6月AI相关网站访问量统计&#xff0c;9大类目应用 Top5 清单 这是 AceCamp 通过 SimilarPro 统计的6月份AI相关网站的访问量&#xff…

英伟达创办人黄仁勋台大毕典演说全文

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年4月份热门报告合集 省时科技ChatGPT发布&#xff0c;无需翻墙&#xff0c;无需注册直接使用 马斯克谈AI&#xff1a;中美差距12个月&#xff0c;出现AGI只要三五年 万…

群晖NAS 7.X 搭建个人博客网站并发布公网 4/8

系列文章 群晖NAS 7.X 搭建个人博客网站并发布公网 1/8群晖NAS 7.X 搭建个人博客网站并发布公网 2/8群晖NAS 7.X 搭建个人博客网站并发布公网 3/8群晖NAS 7.X 搭建个人博客网站并发布公网 4/8群晖NAS 7.X 搭建个人博客网站并发布公网 5/8群晖NAS 7.X 搭建个人博客网站并发布公…

群晖NAS 7.X版搭建博客网站,并内网穿透发布公网可访问 4-8

系列文章 群晖NAS 7.X版搭建博客网站&#xff0c;并内网穿透发布公网可访问 1-8群晖NAS 7.X版搭建博客网站&#xff0c;并内网穿透发布公网可访问 2-8群晖NAS 7.X版搭建博客网站&#xff0c;并内网穿透发布公网可访问 3-8群晖NAS 7.X版搭建博客网站&#xff0c;并内网穿透发布…

群晖NAS 7.X 搭建个人博客网站并发布公网 2/8

系列文章 群晖NAS 7.X 搭建个人博客网站并发布公网 1/8群晖NAS 7.X 搭建个人博客网站并发布公网 2/8群晖NAS 7.X 搭建个人博客网站并发布公网 3/8群晖NAS 7.X 搭建个人博客网站并发布公网 4/8群晖NAS 7.X 搭建个人博客网站并发布公网 5/8群晖NAS 7.X 搭建个人博客网站并发布公…

群晖设置第三方套件以及安装Transmission

玩群晖Nas的人中&#xff0c;很多一部分是冲着媒体中心买的&#xff0c;建立个家庭的媒体中心&#xff0c;以及PT下载中心&#xff0c;这样影片来源及存储都解决了。 群晖DSM自带的Download Station感觉有点弱&#xff0c;然后各种不方便&#xff0c;比较适合轻度玩PT的&#…

黑群晖安装Transmission和emby搭建家庭影音娱乐中心服务器(上)

原文网址&#xff1a;https://www.toutiao.com/a6670307083545477645/ 原文作者&#xff1a;无敌稻草人 教你怎么组建自己的NAS之第五篇&#xff1a;教你黑群晖怎么安装Transmission和emby搭建家庭影音娱乐中心服务器&#xff08;上&#xff09; 与时俱进&#xff0c;提升居…

微信公众号(二)每日推送详细教程(AI回复助手)

微信公众号&#xff08;二&#xff09;每日推送详细教程&#xff08;回复助手&#xff09; 1.准备阶段1.1 基础性配置1.2 账号准备 2. 配置阶段2.1 配置application.yml文件2.2 注解 3. 部署 效果图如下 1.准备阶段 1.1 基础性配置 首先下载源码 Git项目地址: https://gith…

【开源项目】AI Vtuber 一个由多LLM驱动的虚拟主播,可以在Bilibili/抖音 直播中与观众实时互动或本地聊天。使用多种TTS技术并可进行AI变声。通过特定指令协同SD绘图。并有循环文案

AI Vtuber ✨ AI Vtuber ✨ AI Vtuber是一个由 ChatterBot/GPT/Claude/langchain本地or云端/chatglm/text-generation-webui 做为"大脑"驱动的虚拟主播&#xff08;Live2D&#xff09;&#xff0c;可以在 Bilibili/抖音/快手 直播中与观众实时互动 或者 直接在本地和…