模型大小的指标和模型量化的指标和手段

图片

一、模型大小的指标

  • 1.计算量

计算次数,反映了模型对硬件计算单元的需求。计算量的单位是 OPs(Operations) 。最常用的数据格式 为 float32,因此float32类型下的计算量单位被写作 FLOPs (Floating Point Operations),即浮点计算次数。模型的整 体计算量等于模型中每个算子的计算量之和

例子:两个shape为(N, C, H, W)的float32 tensor相加,即add,计算量为 N x C x H x W FLOPs

  • 2.参数量

模型中的参数的总和,反映了模型占的磁盘空间。对于 CNN ,参数主要由 Conv/FC 层的 Weight 构成, 其他算子也有参数,不过跟这俩比较小,还有bias。

  • 3.访存量

指模型计算时所需访问内存/显存的字节大小,反映了模型对内存/显存带宽的需求。访存量单位为

Bytes,表示模型计算到底需要存/取多少 Bytes 的数据。

例子:两个shape为(N, C, H, W)的float32 tensor相加,即add,访存量为(2+1)x N x C x H x W x sizeof(float32) bytes

2+1指的是两个输入和一个输出,2个读入,1个输入

  • 4. (峰值)内存占用

内存占用指模型跑起来的时候(训练或推理),所占用的内存/显存大小。峰值内存占用,指 在跑起来的过程中内存/显存的占用峰值。注意,内存占用 ≠ 访存量,一般在前向传播结束的时候内存占用最高,反向传播中的一些参数不再需要,所以内存逐渐降低。

图片

二、模型量化的几个指标以及手段

1 量化指标

  • 模型大小:量化可以显著降低模型的存储空间,例如将 32 位浮点数模型量化为 8 位整数模型,可使模型大小直接降为将近 1/4。

  • 推理速度:能提高系统吞吐量,降低系统延时。例如在支持低精度计算的 CPU 上,采用 8 位数据表示时,理论上可使芯片的计算峰值增加数倍。

  • 精度损失:量化可能会导致一定的精度损失,其大小取决于量化策略、模型特性等。常见的量化方法精度损失有所不同,如 16 位量化(fp16)精度损失通常非常小;8 位量化(int8)可能有一些精度损失,通常能控制在可接受范围内,量化后模型精度与原始模型相比,精度下降往往在 1%以内;4 位量化(int4)的精度损失可能相对更大。

2 量化手段

量化按照阶段的不同,可分为量化感知训练(qat)和训练后量化(ptq)。qat 需要在训练阶段就对量化误差进行建模,一般能获得较低的精度损失;ptq 则直接对普通训练后的模型进行量化,过程相对简单。

量化算法包括对称算法和非对称算法:

  • 对称算法:通过一个收缩因子(scale)将 fp32 张量中的最大绝对值映射到 8 位数据的最大值(127),将最大绝对值的负值映射到 8 位数据的最小值(-128)。量化公式为:$x_q = round(x_f / scale)$(其中,$x_f$表示原始浮点数张量,$x_q$表示量化张量,$scale$表示收缩因子)。该算法适用于数据大致均匀分布在 0 左右的情况。

  • 非对称算法:通过收缩因子(scale)和零点(zeropoint)将 fp32 张量的最小值(min)和最大值(max)分别映射到 8 位数据的最小和最大值。量化公式为:$x_q = round((x_f - zero_point) / scale)$,其中$zero_point = rounding(scale * min_x_f)$。这种算法能较好地处理数据分布不均匀的情况,并且 zero_point 可以无误差地量化浮点数中的数据 0,从而减少补零操作在量化中产生的额外误差。

3 量化算法的动态范围的确定

在实际应用中,确定量化算法的动态范围时,为了更准确地进行量化,可以采用一些方法,例如:

  • histgram 方法:首先计算数据的直方图分布,然后通过双指针法限制筛选数据的范围,剔除部分离散点,最终得到合适的 scale。

  • entropy 方法:同样将数据分布划分为若干个 bin(类似直方图分布),然后通过 KL 散度计算量化前后的差异。KL 散度的计算公式为:$D_{KL}(p||q) = \sum_{i} p(x_i) \log(p(x_i) / q(x_i))$,其中$p(x_i)$表示量化前的数据分布,$q(x_i)$表示量化后的数据分布。

此外,还可以结合两种量化方法,例如使用对称量化来量化权重,而使用非对称量化来量化激活值,以充分利用不同方法的优势。同时,量化的效果还与具体的模型结构和应用场景有关,需要根据实际情况进行调整和优化。

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

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

有兴趣的可以关注。

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

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

相关文章

3D Web轻量化引擎HOOPS Communicator针对复杂大模型Web端可视化的解决方案

随着工程设计、制造和建筑领域中三维模型的日益复杂化,如何在Web端高效处理和展示这些大规模数据成为一大挑战。HOOPS Communicator作为一款强大的3D可视化工具,提供了一套针对复杂大模型的轻量化解决方案,涵盖了模型轻量化及格式转换、超大模…

PostgreSQL成为最受欢迎的数据库; TiDB马拉松大赛开启, Serverless和Vector为比赛焦点

重要更新 1. TiDB Hackathon大赛报名开启,总奖金达21万,主题是基于 TiDB Serverless 内置的向量搜索功能(Vector Search)构建 AI 创新应用,感兴趣的可以报名参加。( [1] ) 2. Stack Overflow 2024 开发者调研结果公布…

自学JavaScript(放假在家自学第一天)

目录 JavaScript介绍分为以下几点 1.1 JavaScript 是什么 1.2JavaScript书写位置 1.3 Javascript注释 1.4 Javascript结束符 1.5 Javascript输入输出语法 JavaScript(是什么?) 是一种运行在客户端(浏览器)的编程语言,实现人机交互效果。 2.作用(做什么?)网…

NestedScrollVew实现原理分析

NestedScrollView 是 Android 中的一个特殊滚动视图,它继承自 ScrollView,但添加了对嵌套滚动(nested scrolling)的支持。这使得 NestedScrollView 可以与其它支持嵌套滚动的视图(如 RecyclerView)协同工作…

从头开始微调Llama 3.1模型

在今天的科技专栏中,我们将深入探讨如何微调Llama 3.1模型,以使其更好地适应您的特定领域数据。微调大型语言模型(如Llama)的主要目的是为了在特定领域的数据上表现更好,从而生成更符合您需求的输出。以下是我们将要介…

链表的中间结点 - 力扣(LeetCode)C语言

876. 链表的中间结点 - 力扣(LeetCode)( 点击前面链接即可查看题目) /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* middleNode(struct ListNode* head) {struct Lis…

如何实现一个大模型在回答问题时同时提供相关内容链接

通义生成 为了让大模型在回答问题时能够提供相关内容链接,通常采用的方法是结合检索增强生成(Retrieval-Augmented Generation, RAG)的技术。这种方法可以让大模型在生成答案的同时,从外部知识源中检索相关信息,并将这…

SpringBoot知识笔记

一、基本概念 1.1 特性 起步依赖 自动配置 其它特性:内嵌的Tomcat、Jetty(无需部署WAR文件),外部配置,不需要XML配置(properties/yml)。 1.2 配置文件 SpringBoot提供了多种属性配置方式 //application.properties server.port=9090 server.servlet.context-path…

状态模式与订单状态机的实现

状态模式 状态模式(State Design Pattern)是一种行为设计模式,用于在对象的内部状态改变时改变其行为。这种模式可以将状态的变化封装在状态对象中,使得对象在状态变化时不会影响到其他代码,提升了代码的灵活性和可维…

Python爬虫知识体系-----Urllib库的使用

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新:https://blog.csdn.net/grd_java/article/details/140574349 文章目录 1. 基本使用2. 请求对象的定制3. 编解码1. get请求方式:urllib.parse.quote()2. ur…

邦布带你从零开始实现图书管理系统(java版)

今天我们来从零开始实现图书管理系统。 图书管理系统 来看我们的具体的实现,上述视频。 我们首先来实现框架,我们要实现图书管理系统,首先要搭框架。 我们首先定义一个书包,在书包中定义一个书类和一个书架类,再定义…

数据库之常用函数

目录 一、数值函数 1.求绝对值函数 2.求余函数 3.用于获取整数的函数 4.获取随机数的函数 5.四舍五入函数 6.截取小数函数 二、字符串函数 1.返回字符串长度和字符串中字符个数的函数 2.合并字符串的函数 3.替换字符串的函数 4.字母大小写转换函数 5.获取指定长度…

Webpack、Vite区别知多少?

前端的项目打包,我们常用的构建工具有Webpack和Vite,那么Webpack和Vite是两种不同的前端构建工具,那么你们又是否了解它们的区别呢?我们在做项目时要如何选择呢? 一、工具定义 1、Webpack:是一个强大的静态模块打包工…

用Java手写jvm之实现查找class

写在前面 完成类加载器加载class的三阶段,加载,解析,初始化中的加载😀😀😀 源码 。 jvm想要运行class,是根据类全限定名称来从特定的位置基于类加载器来查找的,分别如下:…

go语言与UPX

源自:压缩工具之upx_51CTO博客_za压缩工具 下面是直接copy的: 在golang项目中, 最终运行的是打包好的二进制文件,如何才能让这个文件尽可能的小呢? 1.编译阶段的参数处理 go build使用的是静态编译,会将程序的依赖一起打包,这…

【SQL 新手教程 2/20】关系模型 -- 主键

💗 关系数据库建立在关系模型上⭐ 关系模型本质上就是若干个存储数据的二维表 记录 (Record): 表的每一行称为记录(Record),记录是一个逻辑意义上的数据 字段 (Column):表的每一列称为字段(Colu…

【算法】二进制常用操作

二进制常用操作 求n的二进制中第k位数字: n > > k & 1 n>>k\& 1 n>>k&1​ lowbit(x)的用法:返回x中最后一个1, l o w b i t ( x ) x & ( − x ) lowbit(x)x\&(-x) lowbit(x)x&(−x)​ 输入一个 32 位整数&a…

java如何同时继承接口和抽象类

java中要同时继承接口和抽象,需要用到的语句是 class 类名 extends 抽象类名 implements 接口 示例代码如下 interface Animal02{public String Name"牧羊犬";public void shout();public void info(); } abstract class Action01{public abstract voi…

解锁Vue的潜力:封装递归组件的经验之谈(网站导航层架嵌套)

最近在使用BootstrapVue写一个网站(我也不知道为啥要用这个😂),使用到了NavBarDropDown等一些组件的组合,可以自动创建一个响应式的效果,还不错。But…,这个DropDown只支持到二级。有人2019年就在Github上提了issue- dropdown submenu并且作者…

WebKit的CSS Aspect Ratio Box:重塑响应式设计

WebKit的CSS Aspect Ratio Box:重塑响应式设计 在响应式网页设计中,保持元素的宽高比是一个常见需求。幸运的是,CSS提供了一个名为aspect-ratio的属性,它允许开发者为元素定义一个理想的宽高比。在WebKit中,这个属性得…