7.7.8clip/简单量化

news2024/11/26 15:51:32

一、

clip函数:限制一个array的上下界
给定一个范围[min, max],数组中值不在这个范围内的,会被限定为这个范围的边界。如给定范围[0, 1],数组中元素值小于0的,值会变为0,数组中元素值大于1的,要被更改为1.

a = np.arange(10)
np.clip(a, 1, 8)
array([1, 1, 2, 3, 4, 5, 6, 7, 8, 8])

读完论文 OPTIMAL ANN-SNN CONVERSION FOR HIGH-ACCURACY AND ULTRA-LOW-LATENCY SPIKINGNEURAL NETWORKS

量化

1、精度科普
在小学的时候,小学生们可能只会用手算的方式计算数学题目,圆周率的数值也只能计算到小数点后两位——3.14;而高中生使用图形计算器可能会使圆周率数值排到小数点后10位,更加精确地表示圆周率。在计算机科学中,这被称为精度,它通常以二进制数字来衡量,而非小数。
精度越高,计算越细。但是,意味着所需的计算资源、数据传输和内存存储就越多。其成本也会更大,同时也会消耗更多的功率。
由于并非每个工作负载都需要高精度,因此 AI 和 HPC 研究人员可以通过混合或匹配不同级别的精度的方式进行运算,从而使效益最大化。
single precision: float32 32位 double precision: double 64位 half precision: 16位
在混合精度中,计算从半精度值开始,以进行快速矩阵数学运算。但是随着数字的计算,机器会以更高的精度存储结果。例如,如果将两个16位矩阵相乘,则结果为32位大小。
可以看一下不同精度的计算差距:
在这里插入图片描述


2、量化
量化感知训练(Quantization-aware-training)探索-从原理到实践
Quantization for Neural Networks written by Lei Mao
知乎

2.1

量化方法的目的就是使用 8 位或 16 位的整型数来替代浮点数,这种方法试图利用定点点积来替代浮点点积,这很大程度上降低了神经网络在无硬浮点设备上的运算开销。同时,该方法在一些支持单指令流多数据流 SIMD 的硬件设备上优势就更加明显了,比如128-bit 寄存器 SSE 可以单个指令同时运算 4 个 32 位单精度浮点,8 个 16 位整型,16 个 8 位整型。显然 8 位整型数在 SIMD 的加持下,相比于单精度浮点运算速率要更快一些。另外,该方法还可以减少模型的内存和存储占用空间。
为什么对 8 位量化模型这么关心,原因如下:
结合单指令流多数据流 技术,比如拥有 128 位寄存器的 SSE 技术, 8 位量化时单指令可同时计算数据个数为 16 个,而 16 位量化时,为 8 个。
随着同时计算个数的增加,运算速度提升也更加明显。内存以及实际存储占用更小。0
低比特位量化后的,点积运算数据溢出风险更小。

在这里插入图片描述

量化是一个信息有损压缩的过程,如果训练过程中使用FP32,在模型推理时使用Post-training Quantization(PTQ)直接量化为INT8模型,模型精度会存在一定损失。而量化感知训练(Quantization-aware-training, QAT)在模型训练过程中就引入了伪量化(Fake-quantization)来模拟量化过程中带来的误差,通过这种方式能够进一步减少量化后模型的精度损失。
模型量化精度损失的主要原因为量化-反量化(quantization-dequantization)过程中取整引起的误差。

模型经过量化后,在推理框架(e.g. TensorRT、Openvino)运行时,会根据不同的Op调用相应的算子:

  • 某些算子可以支持低精度的输入输出(e.g Conv、Relu、Gelu),此时推理框架会调用INT8 kernel进行计算;
  • 某些算子需要高精度输入输出使用低精度会导致误差显著增加),那么将会将INT8输入反量化为FP32浮点数之后再输入算子进行计算;

2.2 Post-training-quantization

Post-training-quantization(PTQ)是目前常用的模型量化方法之一。以INT8量化为例,PTQ处理流程为

  1. 首先在数据集上以FP32精度进行模型训练,得到训练好的baseline模型;
  2. 使用小部分数据对FP32 baseline模型进行calibration,这一步主要是得到网络各层weights以及activation的数据分布特性(比如统计最大最小值);
  3. 根据2. 中的数据分布特性,计算出网络各层 S,Z 量化参数(缩放因子(Scale-factor)和零点(Zero-Point));
  4. 使用3. 中的量化参数对FP32 baseline进行量化得到INT8模型,并将其部署至推理框架进行推理;

2.3 QAT

从上一小节可以看出如果PTQ中模型训练和量化是分开的,而QAT则是在模型训练时加入了伪量化节点,用于模拟模型量化时引起的误差。QAT方式需要重新对插入节点之后的模型进行finetune,通过伪量化操作,可以是网络各层的weights和activation输出分布更加均匀,相对于PTQ可以获得更高的精度。以INT8量化为例,QAT处理流程为

  1. 首先在数据集上以FP32精度进行模型训练,得到训练好的baseline模型;
  2. 在baseline模型中插入伪量化节点,得到QAT模型并且在数据集上对QAT模型进行finetune
  3. 伪量化节点会模拟推理时的量化过程并且保存finetune过程中计算得到的量化参数;
  4. finetune完成后,使用3. 中得到的量化参数对QAT模型进行量化得到INT8模型,并部署至推理框架中进行推理

The idea of quantization aware training is to ask the neural networks to take the effect of such information loss into account during training. Therefore, during inference, the model will have less sacrifice to the inference accuracies.

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

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

相关文章

【云存储】主流分布式文件系统介绍

目录 1、引言 2、云存储与分布式文件系统 2.1、云存储 2.2、分布式文件系统 3、Google的三大云计算与云存储论文 3.1、The Google File System(谷歌文件系统) 3.2、MapReduce:Simplified Data Processing on Large Clusters&#xff0…

云原生之深入解析Kubernetes CNI插件的选型和应用场景

一、常见网络插件 在学习容器网络的时候,肯定都听说过 Docker 的 bridge 网络、Vethpair、VxLAN 等术语,从 Docker 到 Kubernetes 后,学习 Flannel、Calico 等主流网络插件,分别代表了 Overlay 和 Underlay 的两种网络传输模式&a…

【VirtualBox】安装 VirtualBox 提示 needsthe Microsoft Visual C++ 2019

概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径,学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、开发环境 开发环境:windows10虚拟机:VirtualBox 7.0.8 二、报错 ubun…

多条件见多值查询的 Excel 公式和 python 函数

问题 Python草堂 群的一位群友问:excel 数据表,用 vlookup 函数怎样实现多条件查询多值,多值排到一行上。如下图所示: 左边是数据清单,希望根据两个条件:产品、日期,查询数量,列到…

Element-UI el-table属性row-class-name用法

文章目录 前言官方示例自定义条件样式设置背景颜色样式stripe属性 设置背景颜色样式设置字体颜色总结 前言 可以通过指定 Table 组件的 row-class-name 属性来为 Table 中的某一行添加 class&#xff0c;表明该行处于某种状态。 官方示例 代码如下&#xff1a; <el-table…

体验版小程序为何无法访问云端服务器后端接口(请求失败...(已完美解决附加图片))?

文章目录 前言解决方案一解决方案二第一步第二步 前言 体验版小程序访问不到后端&#xff0c;接口请求失败&#xff0c;这个及其头疼的今天这个坑被我踩到了&#xff0c;呜呜呜~ 今天再发体验版小程序时&#xff0c;在微信开发者工具上面是可以正常访问后端的&#xff0c;但是线…

【sql注入-堆叠注入】多语句执行、结合其他注入

目录 堆叠注入 一、语法介绍 二、漏洞示例 三、常见形式 网络安全O 堆叠注入 一、语法介绍&#xff1a; 版本&#xff1a; 可以影响几乎所有的关系型数据库 原理&#xff1a; 将多条语句堆叠在一起进行查询&#xff0c;且可以执行多条SQL语句 语句之间以分号(;)隔开&#…

人气爆棚!广西、湖南、山西等地领导莅临数据宝考察交流

摘要&#xff1a;近期&#xff0c;数据宝发展如火如荼&#xff0c;企业展厅“忙不停”&#xff0c;见证众多思想碰撞、交流提升&#xff0c;迎来了各省领导莅临参观指导。 01 数字广西集团、青秀区政府领导一行莅临数据宝上海分公司实地走访 近日&#xff0c;数字广西集团党…

深入理解Linux网络——内核与用户进程协作之同步阻塞方案(BIO)

文章目录 一、相关实际问题二、socket的直接创建三、内核和用户进程协作之阻塞方式1&#xff09;等待接收消息2&#xff09;软中断模块3&#xff09;同步队列阻塞总结 在上一部分中讲述了网络包是如何从网卡送到协议栈的&#xff08;详见深入理解Linux网络——内核是如何接收到…

postman测试接口出现404

postman测试接口出现404 1.用postman调试接口的过程中&#xff0c;出现404的情况&#xff0c;但是接口明明已调到了&#xff0c;而且数据也已经存入数据库了&#xff0c;这让我感到很疑惑。看网上的解决办法检查了我的路径&#xff0c;提交方式、参数类型等都是正确的&#xf…

Java反射(Reflection)总结

目录 Java反射概述 Class类 Class对象获取的三种方式&#xff1a; Class类的常用方法 动态加载机制&#xff1a; 通过反射调用构造方法 Constructor类 通过反射获取继承关系 通过反射访问字段&#xff08;成员变量&#xff09; 获取字段值&#xff1a; 设置字段值 通过反…

MySQL数据库(四)

前言 本文讲述索引和事务&#xff0c;以及JDBC。 是关于MySQL的最后一弹啦~~ 重点小知识&#xff1a;MySQL数据库的存储结构是B树&#xff01;&#xff01; 目录 前言 一、索引 &#xff08;一&#xff09;查看索引 &#xff08;二&#xff09;创建索引 &#xff08;三&am…

【JVM】14. 堆外内存

文章目录 堆外内存的意义堆外内存(Off-heap memory)是指在计算机内存管理之外进行分配和使用的内存空间。与堆内内存(Heap memory)不同,堆外内存不受Java虚拟机(JVM)的垃圾回收机制控制,需要手动进行内存的分配和释放。 堆外内存通常由操作系统提供支持,可以通过直接…

3.利用matlab求平均值和中位数(matlab程序)

代码及运行结果 %% 算术平均值 clear all; A[1 2 3 4;4 4 4 4] m1mean(A) %对列元素求算术平均值 m2mean(A,2) %对行元素求算术平均值 %% 忽略非数计算算术平均值 clear all; A[1 4 nan 5;6 nan 7 nan] m1mean(A) %有nan就是nan…

深度学习-图像分类篇一:基础理论

开头言 学东西前总是爱问&#xff0c;这个学了有什么用&#xff0c;会用就行了么。能够回答你这个问题的人&#xff0c;都是学过的&#xff08;只有学过才有资格告诉你有没有用&#xff09;&#xff0c;然而知识往往就是这样&#xff0c;学的人越多越没有用&#xff0c;我可以…

使用 Google 的 zx 库编写切换微信小程序环境的脚本

背景 微信小程序目前为止还没有提供API或者具体的配置方式&#xff0c;给我们设置环境变量&#xff0c;所以还得自己想办法。 创建一个 shell 脚本——一个由诸如 Bash 或 zsh 之类的 shell 执行的脚本——可以是自动化重复任务的好方法。Node.js 似乎是编写 shell 脚本的理想…

Apache Calcite 简介

这张图上列的,是直接使用 Apache Calcite 或者至少相关联的项目。大家肯定能在里面找到很多自己熟悉的项目。 那 Apache Calcite 究竟是干嘛的,又为什么能这么流行呢? 首先,摆一个应该没多少人会反对的共识:SQL 是编程领域最流行的语言。 有 MySQL、Oracle 之类使用 SQL…

Linux---函数库和Makefile

Linux---函数库和Makefile 函数库动态库静态库例 Linux项目自动化构建工具-make/Makefile背景实例代码原理项目清理 函数库 方法实现就是在库当中&#xff0c;库其实就是把源文件经过一定的翻译&#xff0c;然后打包&#xff0c;只给你提供一个文件计科&#xff0c;不用给你提…

Spring -- Bean的生命周期

BeanDefinition Spring容器在进行实例化时&#xff0c;会将xml配置的<bean>的信息封装成一个BeanDefinition对象&#xff0c;Spring根据BeanDefinition来创建Bean对象&#xff0c;里面有很多的属性用来描述Bean BeanDefinition 中几个重要方法如下 beanClassName&#…

阿里云——云服务器基础运维与管理

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 学习目标&#xff1a; 一.3个理由拥抱云服务器 1.什么是云服务器 2.使用…