【模型的量化 神经网络量化】对称量化与非对称量化 无符号数量化 有符号数量化

news2024/11/17 1:31:08

文章目录

  • 量化方法
    • 1.非对称量化
      • 1.1 无符号量化(uint8)
      • 1.2 有符号量化(int8)
      • 1.3 代码
      • 1.4总结
    • 2 对称量化
      • 2.1 无符号量化(uint8)
      • 2.2 有符号量化(uint8)
      • 2.3总结
      • 2.4 程序代码

减少模型大小:通过将模型的权重和激活值从浮点数(如32位的FP32)转换为低精度的格式(如8位的INT8),可以显著减少模型的存储大小。这种压缩可以使得模型更易于在各种设备上部署,包括资源受限的环境。

降低内存带宽和存储需求:量化后的模型由于尺寸减小,对内存的依赖也随之降低,这减少了内存的访问带宽需求,提高了缓存命中率,特别是在处理内存密集型操作时效果显著。

提高计算速度:使用低精度的数据类型可以提高计算速度,因为现代处理器对低精度数据的计算支持更好,能够实现更快的处理速度。这对于实时应用和需要快速响应的场景尤其重要。

降低功耗:在移动设备上,使用8位数据而不是32位浮点数可以显著降低功耗,这对于延长电池寿命和提高设备的能效比非常关键。

提高系统吞吐量和降低延时:量化可以使芯片的计算峰值增加,因为一条指令可以同时处理更多的数据。这提高了系统的吞吐量并降低了处理延时,尤其是在使用SIMD指令集时效果显著。

适应硬件发展:随着专用深度学习加速器和支持INT8运算的硬件(如DSP、GPU)的发展,量化模型能够更好地利用这些硬件的能力,实现更高效的运算。

推动深度学习模型的商业化和普及:量化技术使得深度学习模型能够更容易地集成到商业产品中,尤其是在边缘计算和移动设备上,这推动了深度学习技术的商业化和普及。

解决部署难题:量化模型更容易在不同的硬件平台上部署,因为它们对计算资源的要求较低,这解决了将深度学习模型部署到资源受限设备上的难题。
在这里插入图片描述
从图中我们可以看到32bit浮点数计算,能量对比上远远高于8bit能量的计算消耗的。因此目前大模型通常8bit量化更有利于边缘设备部署。

量化方法

1.非对称量化

1.1 无符号量化(uint8)

将原始数据xf 最大值max(xf),最小值min(xf)映射到 0-255的区间上。
无符号量化
公式:
在这里插入图片描述
在这里插入图片描述
随机写入一组float32的tensor:

x=torch.tensor([[ 0.9872, -1.6833], [-0.9345, 0.6531]])

这里输出的s我们自己手动计算得到s,z:
在这里插入图片描述

1.2 有符号量化(int8)

将原始数据xf 最大值max(xf),最小值min(xf)映射到 -127,127的区间上。工程上常用有符号是-127-127
在这里插入图片描述

公式:
在这里插入图片描述
在这里插入图片描述
写入一组相同float32的tensor:

x=torch.tensor([[ 0.9872, -1.6833], [-0.9345, 0.6531]])

这里输出的s我们自己手动计算得到s,z,区别在于此时的qmax 从255变成127:
在这里插入图片描述

1.3 代码

import torch


#清空cuda内存
torch.cuda.empty_cache()

print("---------非对称量化----------")

x=torch.tensor([[ 0.9872, -1.6833],
         [-0.9345,  0.6531]])
print(x)
# 公式1(量化):xq = round(x / scale + zero_point)
# 使用给定的scale和 zero_point 来把一个float tensor转化为 quantized tensor
#随机设定的scale和 zero_point
# 有符号数
xq = torch.quantize_per_tensor(x, scale=0.0104725, zero_point=33, dtype=torch.qint8)

#无符号数
xq1 =torch.quantize_per_tensor(x,scale=0.0104725,zero_point=161,dtype=torch.quint8)
print("xq",xq) #输出一个经过反量化的张量
print("xq1",xq1) #输出一个经过反量化的张量
print("xqint8",xq.int_repr())  # 给定一个量化的张量,返回一个以 uint8_t 作为数据类型的张量
print("xquint8",xq1.int_repr())

# 公式2(反量化):xdq = (xq - zero_point) * scale
# 使用给定的scale和 zero_point 来把一个 quantized tensor 转化为 float tensor
xdq = xq.dequantize()
print(xdq)

在这里插入图片描述

1.4总结

程序中torch量化类型quint,qint,分别存在反量化之后的数值,和量化的整型数值。这个是qint对象的特点。通过int_repr()看到中间量化的结果。
此外,量化存在精度损失。有符号和无符号的非对称量化改变的是数值量化的范围,反量化的结果存在误差损失。

2 对称量化

对称量化和非对称量化的区别在于,是否把输入的float区间看成一个对称的。这常常用于权重量化,或者常常用于一些分布对称的数值区间进行量化。

2.1 无符号量化(uint8)

区别主要在于对称量化为对称区间,零点在127.
在这里插入图片描述
在这里插入图片描述
比例因子s 的计算可以是上述的也可以直接,s=max(xf)/127.误差一般都是相同的。

2.2 有符号量化(uint8)

区别主要在于对称量化为对称区间,零点在0,一般对称量化的类型都是有符号类型。常用于权重的量化。
在这里插入图片描述

在这里插入图片描述

2.3总结

非对称量化VS对称量化

非对称量化相比于对称量化而言,无需遵循0不变的映射规则,显然具有更好的动态映射范围,并且当面临一些特殊情况,如对于经过relu的激活值(全为非负值),使用对称量化时,需要仔细考虑使用符号量化,还是无符号量化。

但另一方面非对称量化相对于对称量化需要付出更大的计算代价
在这里插入图片描述

可以看到,后两项都是常量,可以提前离线计算好,但额外多出的第二项相比于对称量化而言,非对称量化有着较大的额外计算开销。

综合以上分析,硬件支持的前提下,量化时对激活值X使用非对称量化,对权重值W使用对称量化,或许是一种更适宜的量化方案

2.4 程序代码

print("---------对称量化----------")


x=torch.tensor([[ 0.9872, -1.6833],
         [-0.9345,  0.6531]])
print(x)
# 有符号数

s= 1.6833/127
z0=0

xq = torch.quantize_per_tensor(x, scale=s, zero_point=0, dtype=torch.qint8)
xq1 = torch.quantize_per_tensor(x, scale=s, zero_point=127, dtype=torch.quint8)
print("xq",xq) #输出一个经过反量化的张量

print("xqint8",xq.int_repr())  # 给定一个量化的张量,返回一个以 uint8_t 作为数据类型的张量

print("xq1",xq1) #输出一个经过反量化的张量

print("xq1uint8",xq1.int_repr())  # 给定一个量化的张量,返回一个以 uint8_t 作为数据类型的张量
# 公式2(反量化):xdq = (xq - zero_point) * scale
# 使用给定的scale和 zero_point 来把一个 quantized tensor 转化为 float tensor
xdq = xq.dequantize()
print(xdq)

在这里插入图片描述
以上为对有无符号的量化类型讨论,以具体的张量类型进行程序举例。

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

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

相关文章

从抖音阳哥的经验看,选品师项目是否值得你投入?

在抖音这个短视频平台上,无数的创作者分享着他们的知识和经验,其中阳哥作为一个备受关注的博主,他的每一次分享都能引起广大网友的热烈讨论。最近,阳哥分享了一个名为“选品师”的项目,让许多对电商和抖音运营感兴趣的…

SpringCloud2024最新版链路追踪教程micrometer+zipkin

本文基于B站尚硅谷2024版springcloud教学视频,主要用于自己学习记录以及分享技术,侵权私删 自己本机环境信息: jdk:17.0.10springboot:3.2.0springcloud:2023.0.0 micrometer 之前行业内使用的分布式链路…

【yolov8 项目打包】pyinstaller 打包pyQt5 界面为exe

创建一篇博客文章,介绍如何使用PyInstaller将PyQt5界面打包为exe文件,并且处理与YOLOv8模型相关的文件,可以按照以下结构进行: 标题:使用PyInstaller将PyQt5界面与YOLOv8模型打包为Windows可执行文件 引言 在机器学习…

自建WSUS更新服务器完成内网的安全补丁更新

一、适用场景 1、企业内部网络无法访问外网,所以搭建WSUS服务器,可以让内网环境进行更新补丁。 2、校园内部的电脑实训室一般不用外网资源,偶尔开启外网使用时,电脑实训室集体自动更新占用外网资源量大,所以搭建WSUS服…

Mendix创客访谈录|助力工业领域,Mendix与IIOT相融合

本期创客 汤登揆 太平洋电信股份有限公司 AI 技术支持工程师 大家好,我是汤登揆,帝国理工大学,生态算法专业,主要关注于产品结构分析和产品应用落地。 目前任职于太平洋电信股份有限公司,主要专注于AI大模型的应用落地…

路由的基本

目录 一、VueRouter介绍 二、VueRouter的使用 三、注意 一、VueRouter介绍 VueRouter是Vue官方的一个路由插件,是一个第三方包。 作用:修改地址栏路径时,切换显示匹配的组件 官网:Vue Router (vuejs.org) 二、VueRouter的使用 注意&am…

ABUMN_公司内资产转移

ABUMN_公司内资产转移 一、功能介绍 使用事务码ABUMN进行公司内资产转移 二、程序代码 程序代码: *&---------------------------------------------------------------------* *& Report ZFIR218 *&---------------------------------------------…

如何确保UDP文件传输工具有最低稳定的传输速度?

在当前日新月异的数字时代背景下,文件传输工具已经成为我们日常生活与工作中不可或缺的一部分,尤其针对那些频繁涉及即时数据交互与多媒体流通的场景。 UDP协议,以其突出的高速传输与低延迟特性,脱颖而出成为众多用户的首选。不过…

通过自适应提示提升大语言模型的零样本推理能力

随着大模型(LLMs)的快速发展,它们在自然语言处理(NLP)任务上取得了前所未有的成就。特别是,LLMs展现出了强大的推理和规划能力,这得益于它们的少样本和零样本学习能力。然而,现有的方…

校验--ECC详细分析

ECC介绍 ECC 以下是针对瑞萨MCU的应用的ECC检测的详细分析。 当前公认安全有效的三大类公钥密钥体制分别为基于大数因子分解难题(RSA)、离散对数难题(DSA)和椭圆曲线离散对数(ECC)难题的密码体制。 保证RSA的安全性,则必须要增加密钥长度…

影响视频视觉质量的因素——各类视觉伪影

模糊效应(Blurring Artifact) 图像模糊(blurring):平滑图像的细节和边缘产生的现象,模糊对于图像来说,是一个低通滤波器(low-pass filter)。一般而言,用户更…

Layer1 公链竞争破局者:Sui 生态的全面创新之路

随着 Sui 生态逐渐在全球范围内树立起声望,并通过与 Revolut 等前沿金融科技平台合作,推广区块链教育与应用,Sui 生态的未来发展方向已成为业界瞩目的焦点。如今,Sui 的总锁定价值已攀升至 5.93 亿美元,充分展示了其在…

python如何整体缩进

python自带编辑器的缩进和取消缩进快捷键: 整体缩进 Ctrl【 整体取消缩进 Ctrl】 pycharm编辑器的缩进和取消缩进快捷键: 整体缩进: tab 整体取消缩进: tabshift

【ZIP技巧】ZIP分卷压缩包如何解压?

经过压缩的文件仍然过大,大家可能都会选择“分卷压缩”来压缩ZIP文件,但是当我们将压缩包分卷之后,解压的时候该如何解压?今天我们分享两个ZIP分卷压缩包如何解压的方法给大家。 一、 我们可以直接点击第一个分卷压缩包&#xf…

USB系列四:USB数据传输类型(重要)

本章包括知识点如下,也是学习USB比较重要的一部分。 USB的块传输方式 USB的中断传输方式 USB的同步传输方式 USB的控制传输方式 USB3.0与USB2.0数据传输对比 USB总线技术协议具有极大的灵活性,可以针对不同的应用场合需求来采用最适合的…

分布式链路追踪工具Sky walking详解

1,为什么要使用分布式链路追踪工具 随着分布式系统和微服务架构的出现,且伴随着用户量的增加,项目的体量变得十分庞大,一次用户请求会经过多个系统,不同服务之间调用关系十分复杂,一旦一个系统出现错误都可…

逆向中webpack需要补充的模块很多怎么办

如下面这种典型的形式 进入i找到加载器 找到加载器所在函数r,在 return e[a].call(c.exports, c, c.exports, r),打上断点。 在控制台打印e,会发现它总共有的模块,这些模块需要我们在别的webpack中复制,有时很多,很麻烦。 我们可以注入代码在…

性能优化的核心思路,纯干货分享!

前言 平时技术交流的时候,很多同学都会问一些性能优化方面的问题。 比如: 有一张订单表为了保持订单记录,更新数据时不能删除,需要打算加上版本号,查询时取版本号最新的给前端,还有场景是查询订单历史给前…

AI日报|Stack Overflow和OpenAI达成合作,Apple正在为数据中心开发人工智能芯片...

欢迎大家在 GitHub 上 Star 我们: 分布式全链路因果学习系统 OpenASCE: https://github.com/Open-All-Scale-Causal-Engine/OpenASCE 大模型驱动的知识图谱 OpenSPG: https://github.com/OpenSPG/openspg 大规模图学习系统 OpenAGL: https://github.com/TuGraph-…

自注意力架构大成者_Transformer(Pytorch 17)

1 模型简介 在上节比较了 卷积神经网络(CNN)、循环神经网络(RNN)和 自注意力(self‐attention)。值得注意的是, 自注意力同时具有并行计算和最短的最大路径长度这两个优势。因此,使…