[PTQ]均匀量化和非均匀量化

均匀量化和非均匀量化

基本概念

  • 量化出发点:使用整型数据类型代替浮点数据,从而节省存储空间同时加快推理速度。
  • 量化基本形式
    • 均匀量化:浮点线性映射到定点整型上,可以根据scale/offset完成量化/反量化操作。
    • 非均匀量化
      • PowersOfTwoQuant:浮点映射成2的指数位上,根据power计算完成量化/反量化操作。
      • AdditivePowersOfTwoQuant:浮点映射成多个不同指数的和,而整型表示应该是跟硬件实现相关(后续待定聊聊)
  • 不同形式的量化对不同的数据分布的拟合程度不一样

均匀量化(UniformQuant)

  • 特点:

    • 适合range较大,分布较均匀的分布
    • 最普遍/大众的量化方式,基本上市面上的加速器都是只支持均匀量化
    • 可以很容易从对称量化扩展到非对称量化
  • python代码实现如下所示

    # 均匀量化
    class UniformQuant:
        def __init__(self, 
                    bit=8) -> None:
            self.bit = bit
    
        def quant(self, input, min=0.0, max=1.0):
            max_q = np.power(2, self.bit) - 1
            input = np.clip(input, min, max)
            scale = (max - min) / max_q
            q = np.clip(np.round(input / scale), 
                        0,
                        max_q)
            return q, scale
    
        def dequant(self, q, scale):
            return (scale * q).astype(np.float32)
    
        def fakequant(self, input):
            q, scale = self.quant(input)
            fakequant_input = self.dequant(q, scale)
            return fakequant_input
    

PowersOfTwoQuant

  • 特点:

    • 适合以0.0为中心的高斯分布数据,靠近0.0附近的精度非常高
    • 提高bits数,无法提高整体的精度
  • python代码实现如下所示

    # PoT量化
    class PowersOfTwoQuant:
        def __init__(self, 
                    bit=8) -> None:
            self.bit = bit
    
        def quant(self, input, alpha):
            max_q = np.power(2, self.bit) - 1
            input = np.clip(input / alpha, 0.0, 1.0)
            q = list()
            for i in input:
                if i == 0.0:
                    q.append(0)
                else:
                    e_tmp = np.log(i) / np.log(2.0)
                    e_tmp = np.round(e_tmp + max_q)
                    e_tmp = np.clip(e_tmp, 0, max_q)
                    q.append(e_tmp)
            q = np.array(q, dtype=np.uint32)
            return q
    
        def dequant(self, q, alpha):
            max_q = np.power(2, self.bit) - 1
            input = list()
            for i in q:
                if i == 0:
                    input.append(0.0)
                else:
                    input.append(np.power(2.0, i - max_q))
            
            input = np.array(input, dtype=np.float32)
            input = alpha * input
            return input
    
        def fakequant(self, input, alpha = None):
            if alpha is None:
                alpha = input.max()
            q = self.quant(input, alpha)
            fakequant_input = self.dequant(q, alpha)
            return fakequant_input
    
    

AdditivePowersOfTwoQuant

  • 特点:

    • 0.0附近的精度比均匀分布高
    • 提高bits数,可以提高整体的精度
    • 计算较为复杂,推理加速应该需要专门设计实现方式
  • python代码实现如下所示

    # APoT量化
    class AdditivePowersOfTwoQuant:
        def __init__(self, 
                    bit=8,
                    k=2) -> None:
            self.bit = bit
            self.k = k
            self.n = int(self.bit/self.k)
            self.p = np.array(self.gen_table(), dtype=np.float32)
            self.sort_values = self.get_all_values()
            self.sort_values.sort()
            # self.power_set = build_power_value(self.bit, additive=False)
            # self.power_set = self.power_set.detach().numpy()
    
        def get_all_values(self):
            m,n = list(self.p.shape)
            values = self.recursion_add(self.p.tolist())
            return np.array(values, dtype=np.float32)
        
    
        def recursion_add(self, input_list, callback=lambda a,b:a+b):
            # [list1, list2]
            res = list()
            if len(input_list) == 2:
                list1, list2 = input_list
                for a in list1:
                    for b in list2:
                        res.append(callback(a,b))
                return res
            elif len(input_list) > 3:
                tmp_input_list = input_list[:-2]
                tmp_res = self.recursion_add(input_list[-2:])
                tmp_input_list.append(tmp_res)
                return self.recursion_add(tmp_input_list)
            
    
        def gen_table(self):
            p = list()
            for i in range(self.n):
                one_lines_p = list()
                one_lines_p.append(0.0)
                for j in range(int(math.pow(2, self.k) - 2 + 1)):
                    one_lines_p.append(math.pow(2, -(i+j*self.n)))
                p.append(one_lines_p)
            return p
    
        def quant(self):
            # 待定
            pass
    
        def dequant(self):
            # 待定
            pass
    
        def fakequant(self, input):
            scale = input.max() / self.sort_values.max()
            fakequant_input = list()
            input = input / scale
            for v in input:
                argmin_index = np.argmin(np.abs(self.sort_values - v))
                tmp_value = self.sort_values[argmin_index]
                fakequant_input.append(tmp_value)
            fakequant_input = np.array(fakequant_input, dtype=np.float32) * scale
            return fakequant_input
    
    

试验展示

  • 数据分布在[0.0, 1.0]之间,全覆盖

  • 下图表示三种量化方式的x-fakequant_y的映射关系

    在这里插入图片描述

代码工程下载

下载地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 7 使用cJSON 库

什么是JSON JSON是一种轻量级的数据交换格式,可读性强、编写简单。键值对组合编写规则,键名使用双引号包裹,冒号:分隔符后面紧跟着数值,有两种常用的数据类型是对象和数组。 对象:使用花括号{}包裹起来的…

怎么用 AI 来智能审核 PDF合同?5步搞定!

大家都知道审合同是一个比较耗费精力的过程,有没有更好的办法来智能审核PDF合同呢,今天就教大家一招,用AI来智能审核PDF合同。 在开始之前呢,我们要找到一款带AI功能的工具,我试用过擎盾智能合同审查、幂律智能等工具,感觉都不太理想,经过一段时间的摸索,我找到了一款比较适合…

【Linux】关系运算符、shell判断脚本执行时是否有传参、判断文件/文件夹是否存在、判断字符串是否相等、判断上个命令执行是否正常、判断字符串是否为空

🦄 个人主页——🎐个人主页 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天进步一点点!加油!&…

无损压缩技巧:减小PDF文件尺寸的有效方法

我们在制作pdf文档的时候,会加入许多内容,文字、图片等等,素材添加的过多之后就会导致pdf文档特别大,在上传或者储存时,就会特别不方便,所以今天就告诉大家一个pdf压缩的方法,使用pdf在线压缩工…

【C++】:STL中的string类的增删查改的底层模拟实现

本篇博客仅仅实现存储字符(串)的string 同时由于Cstring库设计的不合理,我仅实现一些最常见的增删查改接口 接下来给出的接口都是基于以下框架: private:char* _str;//思考如何不用constsize_t _size;size_t _capacity;//这样写可以const static size_t…

csdn最新最全的Selenium教程:定位frame框架中的元素

定位frame框架中的元素 在web应用中经常会出现frame嵌套的应用,假设页面上有A,B两个frame,其中B在A内,那么定位B中的内容则需要先到A,再到B。 switch_to.frame方法可以把当前定位的主题切换到frame里,在frame里实际是嵌套了另外一…

Android Studio xml文件id爆红但是项目可以运行

这种原因是你的R文件太大了(超过了Android Studio的上限25.6M了) 解决办法如下: Help -> Edit Custom Properties -> create custom properties?(yes) ->添加 idea.max.intellisense.filesize5000 最后需要重启Android Studio

【double check 读写锁】

使用double check 读写锁 读多写少场景 记录下 //来源 jdbc 中的查询连接信息 //public abstract class ConnectionUrl implements DatabaseUrlContainer public static ConnectionUrl getConnectionUrlInstance(String connString, Properties info) {if (connString null…

算法刷题-动态规划2(继续)

算法刷题-动态规划2 珠宝的最高价值下降路径最小和 珠宝的最高价值 题目 大佬思路 多开一行使得代码更加的简洁 移动到右侧和下侧 dp[ i ][ j ]有两种情况: 第一种是从上面来的礼物最大价值:dp[ i ][ j ] dp[ i - 1 ][ j ] g[ i ][ j ] 第二种是从左…

【MySQL】宝塔面板结合内网穿透实现公网远程访问

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cpo…

Course1-Week2-多输入变量的回归问题

Course1-Week2-多输入变量的回归问题 文章目录 Course1-Week2-多输入变量的回归问题1. 向量化和多元线性回归1.1 多维特征1.2 向量化1.3 用于多元线性回归的梯度下降法 2. 使梯度下降法更快收敛的技巧2.1 特征缩放2.2 判断梯度下降是否收敛2.3 如何设置学习率 3. 特征工程3.1 选…

react中的state

没想到hooks中也有state这一说法 看下面的两个案例 1、无state变化不会执行父子函数 2、有state更改执行父子函数

竞赛选题 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域,在无人驾驶领域中机器学习的各种算法随处可见,今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂,看上去无从下手。那么面对这样极其…

数据提取PDF SDK的对比推荐

PDF 已迅速成为跨各种平台共享和分发文档的首选格式,它作为一种数据来源,常见于公司的各种报告和报表中。为了能更好地分析、处理这些数据信息,我们需要检测和提取 PDF 中的数据,并将其转换为可用且有意义的格式。而数据提取的 PD…

【Spring进阶系列丨第四篇】Spring的Bean管理(基于xml的配置)

前言 我们知道,容器是一个空间的概念,一般理解为可盛放物体的地方。在Spring容器通常理解为BeanFactory或者ApplicationContext。我们知道spring的IOC容器能够帮我们创建对象,对象交给spring管理之后我们就不用手动去new对象。 那么Spring是如…

服务号可以迁移到订阅号吗

服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?首先我们要看一下服务号和订阅号的主要区别。1、服务号推送的消息没有折叠,消息出现在聊天列表中,会像收到消息一样有提醒。而订阅号推送的消息是折叠的,“订阅号…

2023“亚太杯”大学生数学建模竞赛

2023亚太杯数学建模C题 中国新能源电动汽车的发展趋势 解题思路、数据 该题并没有提供数据集,对所需数据进行收集整理是对题目进行求解的基础。在本题中,主要需要以下数据:新能源汽车历史销售量、新能汽车相关专利的历史数量、充电桩历史数…

【外贸商机篇】黑色星期五来啦,跨境电商必备手册!

黑色星期五是每年11月的第四个星期五,三天后是网络星期一。这两个购物日是美国一年中最繁忙的购物日之一,仅在2021年的感恩节周末,电子商务收入估计就达到196亿美元。 在一项Statista调查中,美国消费者被问及他们计划购买哪些商品…

太赫兹涂层测厚:为汽车制造商保驾护航

太赫兹涂层测厚:为汽车制造商保驾护航 近年来,专用于测量任何表面涂层厚度的IRYS太赫兹系统,成功赢得了包括大众和丰田在内的全球领先整车厂的信任。 为了实现这一目标,IRYS系统经过了许多制造商为甄选值得信赖的技术供应商而设置…

软件开发及交付中,如何平衡项目进度和团队成员的利益?

在平衡软件质量与时间、成本、范围的关系时,需要考虑到项目管理的金三角概念,即时间、成本和范围。从项目管理的角度来看,项目进度和团队成员的利益需要平衡。 以下是一些建议: 制定可行的计划:让项目相关各方充分参与…