面试题:为什么 一般 weight 选择对称量化,activation 选择非对称量化?

图片

模型的剪枝是为了减少参数量和运算量,而量化是为了压缩数据的占用量。

  • 量化概念

所谓的模型量化就是将浮点存储(运算)转换为整型存储(运算)的一种模型压缩技术。

优势:

    可以提升计算效率;减少内存和存储占用;减少能耗。

劣势:

    模型的精度会降低,主要是由舍入误差和截断误差造成的,这点可以看我之前的文章。

量化对象:

   主要有以下三个,实际中可能是量化其中的多个甚至全部:

(1)weight(权重):

    weight的量化是最常规也是最常见的。量化weight可达到减少模型大小和内存占用等目的。

(2)activation(激活函数输出):

    实际中activation往往是占内存使用的大头,因此量化activation不仅可以大大减少内存占用。更重要的是,结合weight的量化可以充分利用整数计算获得性能提升。

(3)gradient(梯度):

    相对上面两者略微小众一些,因为主要用于训练。它主要作用是在分布式计算中减少通信开销,单机训练时也可减少反向传播时的开销。

量化位数:

    可以有很多种选择。大体可分为几类:

(1)float16量化是比较保险的做法,大多数情况下可以不丢失太多精度的情况下有明显的性能提升,也是浮点实现和理解简单。

(2)8位是比较常见的,也是相对成熟的。相关的研究很多,各种主流框架也基本都支持,主流的int8量化和UINT8量化。

(3)8位以下目前而言学界相对玩得多些,工业界有少量支持,但还没有太成熟。8位以下主要是4,2和1位(因为位数为2的幂次性能会更好,也更容易实现)。如果精度低至1位,也就是二值化,那可以用位运算进行计算。这对处理器而言是很友好的。

  • 模型量化的步骤

(1)在输入数据(通常是权重或者激活值)中统计出相应的min_value和max_value,这些值的选择会影响量化的精度,主要是截断误差;

(2)选择合适的量化类型,对称量化(int8)还是非对称量化(uint8);

(3)根据量化类型、min_value和max_value来计算获得量化的参数Z/Zero point和S/Scale,,这里会使用比如KL散度、标定等获得最佳的值,最终得到是符合条件的scale和zeropoint;

(4)根据标定数据对模型执行量化操作,即将其由FP32转换为INT8;

(5)验证量化后的模型性能,如果效果不好,尝试着使用不同的方式计算S和Z,重新执行上面的操作,这个重新执行就可以利用KL散度算法;

量化对象中量化的选择,为什么 一般 weight 选择对称量化,activation 选择非对称量化?

    其实,这主要是基于它们的特点和应用场景来决定的。

几个原因:

(1)对称量化要求量化后的值中零点必须对应于原始值中的零,其通常使用两个参数(量化的最小值和最大值)来定义量化范围,该范围以零为中心对称。对于 weight 来说,其分布通常是关于零对称的高斯分布,比较适合采用对称量化。

(2)非对称量化不要求量化后的值中零点对应于原始值中的零,它使用三个参数(量化最小值、量化最大值和零点)来定义从原始数值到量化数值的映射关系。activation(中间输出值)经过 ReLU 等激活函数后可能没有负数,其分布可能不关于零对称,适合采用非对称量化。

(3)非对称量化的缺点是执行量化和反量化操作时可能需要更多的计算。例如在非对称量化的矩阵乘法中,由于存在零点补偿,会导致计算量增加,特别是对于 weight 的非对称量化,会使 activation 行向量要累加后展开成结果的形状,而 activation 无法像 weight 一样提前算好,增添了许多计算量。相比之下,activation 非对称量化与 weight 对称量化的组合能在一定程度上减少计算量,同时较好地保持精度。

(4)activation 的波动通常比 weight 本身大很多,导致 activation 量化难度较大,非对称量化能够更充分地利用比特位,从而在整体精度上会比 weight 的非对称量化高不少。这种优势在较低精度的量化(如 int4 和 uint4)中可能更为明显。

有兴趣可以关注我的专栏《高性能开发基础教程》

该文章首发于 subscriptions极空AI,后续我会在上面整理完整的AI+HPC资料,并提供相关书籍推荐,至于视频要不要录制,看大家需要不需要。

有兴趣的可以关注。

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

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

相关文章

泛微开发修炼之旅--40考勤管理篇:根据班次规则、考勤组规则(含固定值和排班制),在三方系统中获取考勤签到数据,并同步到考勤管理中的解决方案

一、需求描述 我们最近在项目上遇到了一个需求,需要将工厂门禁刷脸数据,通过考勤管理配置的规则,获取到对应的考勤签到数据,依次作为上下班打卡的时间,以此作为员工每天考勤的依据,客户的考勤比较复杂&…

《python程序语言设计》第6章15题财务应用程序:打印税款表。利用程序清单4-7的代码

6.15 打印税款表 def computeTax(status_n, income):tax 0if status_n 0:if income < 8350:tax income * 0.10elif income < 33950:tax 8350 * 0.10 (income - 8350) * 0.15elif income < 82250:tax 8350 * 0.10 (33950 - 8350) * 0.15 (income - 33950) * 0.…

《九界ol游戏源码》(游戏源码+客户端+服务端+工具+视频教程)喜欢研究游戏源码的看过来...

《九界》游戏以网络同名热门小说为文化蓝本&#xff0c;构筑了一个地海陆空四维冒险的庞大游戏世界。《九界》以“团队修真”为核心研发理念&#xff0c;引擎采用OGRE引擎&#xff0c;GUI的设计采用CEGUI&#xff0c;游戏设计&#xff0c;地图&#xff0c;音效都是花费了相当的…

哈默纳科HarmonicDrive谐波减速机的使用寿命计算

在机械传动系统中&#xff0c;减速机的应用无处不在&#xff0c;而HarmonicDrive哈默纳科谐波减速机以其独特的优势&#xff0c;如轻量、小型、传动效率高、减速范围广、精度高等特点&#xff0c;成为了众多领域的选择。然而&#xff0c;任何机械设备都有其使用寿命&#xff0c…

Python爬虫-中国汽车市场月销量数据

前言 本文是该专栏的第34篇,后面会持续分享python爬虫干货知识,记得关注。 在本文中,笔者将通过某汽车平台,来采集“中国汽车市场”的月销量数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废话不多说,下面跟着笔者直接往下看正文详细内容。(附…

硅纪元视角 | 语音克隆突破:微软VALL-E 2,Deepfake新纪元!

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

Web前端知识视频教程分享(五) Bootstrap

资料下载地址&#xff1a; https://545c.com/f/45573183-1336822373-45bb4f?p7526 (访问密码: 7526)

Flink内存管理机制

前言 在Flink的后台界面&#xff0c;可以看到整个Flink的内存情况。 如JobManager的内存情况&#xff1a; TaskManager的内存情况 一、Flink内存管理 Flink TaskManager内存组成整体结构图如下&#xff1a; 二、总内存管理 三、JobManager内存管理内存管理 四、TaskManager内…

vue3前端架构---打包配置

最近看到几篇vue3配置项的文章&#xff0c;转载记录一下 Vue3.2 vue/cli-service 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案-CSDN博客文章浏览阅读2k次&#xff0c;点赞8次&#xff0c;收藏9次。Vue3.2 vue/cli-service 打包 chunk-vendors.js 文件过大导致页…

Lago - 使用 ClickHouse 扩展事件引擎

本文字数&#xff1a;4540&#xff1b;估计阅读时间&#xff1a;12 分钟 作者&#xff1a;Mathew Pregasen 本文在公众号【ClickHouseInc】首发 本周&#xff0c;我们欢迎来自 Lago 的一篇博客文章&#xff0c;介绍了他们如何使用 ClickHouse 扩展一个事件引擎&#xff0c;并在…

学习react-Provider解决props需要层层传递问题

1.组件数据传递问题 数据传递&#xff1a;A(顶级组件&#xff09;-》B组件&#xff08;子组件&#xff09;、C组件&#xff08;孙子组件&#xff09;…很多组件 这样得通过props层层传递到下面的组件 还有另一种解决方法&#xff0c;即通过全局对象来解决&#xff0c;使用Prov…

堆的实现-适用于算法竞赛

首先讲一下能够实现的操作。 插入一个数查找最小值删除最小值删除任意一个元素修改任意一个元素 什么是堆&#xff1f; 堆其实是一棵完全二叉树。 即处理叶子节点和倒数第一层节点&#xff0c;其他节点都有两个子节点&#xff0c;而且顺序是从上到下&#xff0c;从左到右。 …

使用VMware安装Linux虚拟机

一、下载 通过百度网盘分享的文件&#xff1a;CentOS系统安装包 链接&#xff1a;https://pan.baidu.com/s/1_eqYl8HcNt2GcGDjgOElgg 提取码&#xff1a;cu07 二、安装 &#xff08;1&#xff09;双击打开软件 &#xff08;2&#xff09; 创建新的虚拟机 &#xff08;3&…

PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘

Solution:打开cmd输入指令下载malplotlib pip install matplotlib

微软第四季度财报预览:增长动力追踪

微软公司即将在2024年7月30日&#xff08;周二&#xff09;美国市场收盘后发布第四季度财务结果。 微软的收益 - 预期如何 美股券商开户通道 市场预计&#xff0c;微软即将到来的2024年第四季度的收入将年增长14.5%&#xff0c;达到644亿美元&#xff0c;高于2023年第四季度…

linux添加普通用户后无法使用K8S的kubectl命令怎么办/Linux普通用户管理K8S/Linux下普通用户无法使用K8S命令

1.给Linux添加普通用户 sudo useradd mqq #添加mqq账号 sudo passwd mqq #给mqq账号设置密码&#xff0c;需要输入2次&#xff0c;我输入密码是Admin1232.利用mqq用户输入K8S命令报错 3.给mqq用户提权 suduers文件位于路径/etc/sudoers #编辑文件/etc/sudoers vim /etc/su…

Matlab编程资源库(10)离散傅立叶变换

一、离散傅立叶变换算法简要 给定一个N点的离散信号序列x(n)&#xff0c;其中n表示时刻&#xff0c;n 0, 1, 2, ..., N-1。 定义离散傅立叶变换的频域序列X(k)&#xff0c;其中k表示频率&#xff0c;k 0, 1, 2, ..., N-1。 通过以下公式计算每个频率对应的复数值&#xff…

03。正式拿捏ArkTS语言第一天

1, 打印日志命令 &#xff1a; console.log() 2, 三种基本数据类型&#xff1a; number 数字类型 &#xff08;数字&#xff09; string 字符串类型&#xff08;例如&#xff1a;“我是字符串”&#xff09; boolean 布尔类型 (true 或者 false) ***…

【C语言报错已解决】Use of Uninitialized Variable

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 在编程中&#xff0c;未初始化的变量是一个常见的问题&#xff0c;它可能导致程序的行为变得不可预测。未初…

Matlab更换主题颜色附代码

解压后参考记录本教程 GitHub - scottclowe/matlab-schemer: Apply and save color schemes in MATLAB with ease. 本博客绑定了资源