ZeroQuant与SmoothQuant量化总结

2023-11-03

ref

ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers

SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models

DeepSpeed Compression: A composable library for extreme compression and zero-cost quantization - Microsoft Research

LLM大语言模型量化方法(一)

GitHub - mit-han-lab/smoothquant: SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models

ZeroQuant与SmoothQuant是比较新的大模型量化方法,都提出了相应的方法来缓解激活outlier导致的量化误差,并且都采用后量化而不是量化感知训练的方法,使得量化成本相对低,实现难度相对较低。

量化基础

per-token quantization:每个token对应的tensor共享量化系数

per-channel quantization

group-wise quantization: A coarse-grained version of per-channel quantization is to use different quantization steps for different channel groups. Q-BERT (Q-bert: Hessian based ultra low precision quantization of bert)提出的。把多个channel合在一起用一组量化系数,相比每个chennel用单独的量化系数确实要coarse一些。

per-axis量化:多维tensor指定某一个维度,在该维度上,每个索引的子tensor共享量化系数。显然通过指定相应的axis即可得到per-channel或者per-token量化。

activation outliers

不像weight权重数值分布比较均匀接近,很少有离群点。激活值可能存在较大的分布差异,较多离群点导致量化缩放系数太大,导致很大的量化误差。

ZeroQuant量化

动态还是静态量化:

dynamic per-token activation quantization and static group-wise weight quantization
对称还是非对称量化?激活和权重都是对称量化。

量化方法1: 不需要知识蒸馏

激活采用per-token动态量化,权重采用per-group静态量化,group采用48或64。

量化方法2: 结合逐层知识蒸馏

不需要原始数据集, 可以用于4bit量化

不像传统的量化感知训练和知识蒸馏直接训练全部参数和量化参数,ZeroQuant的方法是一次只训练一个transformer层。

前L-1层的结果techer和student模型都用的techer模型的结果?

知识蒸馏训练的参数是什么?因为激活是动态量化,这里只训练更新权重?

MSE计算为何要做前L层所有结果乘积的的误差,而不是直接第L层结果的误差?

论文中没有展示只有TQ (token-wise activation quantization)而没有group-wise量化的精度,因为不清楚TQ和group weight quant哪个更重要,以及有TQ时是否还有必要group-wise量化。

性能优化:把量化、反量化算子融合到其他算子计算中中。

SmoothQuant量化

Since weights are easy to quantize while activations are not.
SmoothQuant smooths the activation outliers by offline migrating the quantization difficulty from activations to weights with a mathematically equivalent transformation.
SmoothQuant enables an INT8 quantization of both weights and activations for all the matrix multiplications in LLMs

观察结果:

Outliers persist in fixed channels

Fixed channels have outliers, and the outlier channels are persistently large.

算法原理

仔细看明白了会发现这个方法非常简单。其中diag(v)函数是根据向量生成一个对角线上元素为v,其余为0的矩阵,Xdiag(s)^-1相当于把X的每一行分别除以v中的元素,而不需要真的去做这个矩阵乘。

具体量化配置: 

可见其可以采用动态也可以采用静态量化。

Migration strength大小选择

一些实践的考虑

smooth quant用per-tensor weight quant看上去有些震惊,这个对精度并不友好。为何其不分别对激活和权重用per-channel量化?下面可以给一些解释。

与矩阵乘的计算兼容问题

参考量化的基础

深度学习模型量化基础_Luchang-Li的博客-CSDN博客

首先从对称和非对称量化的角度,activation可以用非对称量化,而激活一般只能用对称量化。(当然如果activation是float, 把weight cast到float做计算的话激活用什么量化都可以)。如果不想额外加一个bias,activation也要用对称量化。

其次,从量化per-axis量化的角度,actication和weight并不是独立都想量化哪个axis就量化哪个axis。

如果激活用per-tensor量化,weight对axis=n进行per-axis量化量化,也就是每一列元素共享同样的量化系数,那么结果矩阵仍然是对axis=n的per-axis量化。

如果激活对axis=m,weight对axis=n分别进行per-axis量化,那么结果矩阵乘将会出现m*n个元素每个元素都有不同的量化系数,这个是我们需要避免的。基于同样的道理,你会发现activation和weight都不能对axis=k做per-axis量化,然后激活和权重只能有一个能做per-axis量化,另一个只能per-tensor量化。

zero-quant对激活做per-axis量化,weight按理说只能做per-tensor量化,但是应该为了精度的考虑使用了对weight采用per-group量化,这样矩阵乘的结果量化系数个数为m*group。实际中其采用了group=48和64。

与ONNX模型定义兼容问题

ONNX算子定义的几个量化相关的算子

QuantizeLinear

输入x, scale, zero_point把float tensor量化为int8 tensor。支持标量scale, zero_point,也支持axis attr和1D scale, zero_point实现per axis量化。

DequantizeLinear

输入x, scale, zero_point,把int tensor反量化为float tensor。支持标量scale, zero_point,也支持axis attr和1D scale, zero_point实现per axis量化。

DynamicQuantizeLinear

输入为tensor,输出为per-tensor的scale和zero_point标量值。不得不说ONNX的一些算子定义真是考虑不太周全,这个算子缺少通过attr指定量化axis从而支持per-axis量化。前两个算子都支持了axis,这个算子却不支持(不支持的原因很可能是传统CV的量化激活是per-tensor量化,权重为per-channel量化,而不是transformer这里的激活per-axis量化,权重per-tensor量化,参考:TensorFlow Lite 8 位量化规范)。为了实现激活的per-axis量化,只能添加自定义算子支持,或者自研推理引擎实现。

此外上面的算子定义都不支持float类型为半精度,实际上混合精度这里可能反而是float16而不是float32。

此外还有

ConvInteger

MatMulInteger

用于实现int8输出得到FP32输出。 

通过ONNX的算子定义可以看到,ZeroQuant的per-group量化是无法支持的,并且这两种量化方法都要对激活采用per-axis量化,只能对dynamicQuant算子做扩展,或者采用静态量化。

其他

这两个方法结合的可能?进一步改进的方向?

总的来说SmoothQuant看上去更简单,实现更容易。

而ZeroQuant动态量化的方法不需要校准数据,这使其量化更加通用。

SmoothQuant加缩放后应该也可以对权重采用per-group量化。

ZeroQuant的蒸馏方法看上去很吸引人,还可以做4bit量化(W4/8, we quantize the MHSA’s weight to INT8 and FFC’s weight to INT4)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZeroQuant与SmoothQuant量化总结 的相关文章

  • Command ‘[‘where‘, ‘cl‘]‘ returned non-zero exit status 1.

    在环境变量中Path 那一项中添加两个路径 xff1a 在环境变量中新建一个LIB 变量 xff0c 并添加三个路径 xff08 记得加分号 xff09 xff1a 在环境变量中新建一个INCLUDE 变量 xff0c 并添加两个路径 xf
  • 【低光增强】Zero-DCE

    文章目录 一 前言二 算法理解2 1 低光增强曲线2 2 整体框架2 3 网络结构2 4 损失函数2 4 1 空间一致性2 4 2 曝光控制2 4 3 色彩恒常2 4 4 光照平滑 2 5 Zero DCE 43 43 三 效果测试 一 前
  • QUANTAXIS

    QUANTAXIS 量化金融策略框架 点击右上角Star和Watch来跟踪项目进展 点击Fork来创建属于你的QUANTAXIS 广告区 大佬写的增强学习框架 DeepRL 期货回测 实盘框架 ParadoxTrading RAINX大大的
  • python将nan, inf转为特定的数字

    最近 处理两个矩阵的点除 得到结果后 再作其他的计算 发现有些内置的函数不work 查看得到的数据 发现有很多nan和inf 导致python的基本函数运行不了 这是因为在除的过程中分母出现0的缘故 为了将结果能够被python其他函数处理
  • MATLAB量化浮点数

    在做算法设计和验证时 常在matlab进行浮点验证 然后量化后在用在FPGA上 对于类似与FIR这些滤波器系数 matlab直接可以export出来 但是在验证麦克风或者ADC出来的24bit补码这类时常常需要使用matlab生成定点数进行
  • 量化策略——准备4 python量化因子测算&绘图

    文章目录 因子测算框架 1 预处理股票数据 2 指标测算 3 测算结果整理 4 结果绘图 量化因子的测算通常都是模拟交易 计算各种指标 其中 测算需要用到的第三方库 numpy pandas talib 绘图需要用到的第三方库 matplo
  • 神经网络量化

    前言 神经网络在图像 语音识别等领域使用越来越广泛 大部分实时性要求不高的服务都可以部署在云上 然而还是有不少模型需要在计算能力有限的可移动设备上快速运行 如人脸解锁 拍照视频的实时处理等 一般训练的模型采用的都是32位浮点数 考虑到大部分
  • 风险平价组合(risk parity)理论与实践

    本文介绍了风险平价组合的理论与实践 后续文章将对risk parity组合进行更深入探讨以及引入预期收益后的资产配置实战策略 感兴趣的朋友可以直接前往BigQuant人工智能量化投资平台克隆代码进行复现 前言 资产配置是个很广泛的话题 在投
  • pytorch FX模型静态量化

    文章目录 前言 一 pytorch静态量化 手动版 踩坑 二 使用FX量化 1 版本 2 代码如下 总结 前言 以前面文章写到的mobilenet图像分类为例 本文主要记录一下pytorchh训练后静态量化的过程 一 pytorch静态量化
  • Youtube ASX Portfolio的视频笔记 What is a Quant? - Financial Quantitative Analyst

    What is a Quant Financial Quantitative Analyst YouTube youtube 上搜 option pricing 很多讲解 Stochastic Calculus的 In this video
  • `java (0 % 2 != 0) == false`

    我一直卡住的部分是boolean 0 2 0 错误 我的意思是 如果 2 进入 0 0 次 那么余数就是 2 并且 2 不等于 0 所以这应该是真的 然而 当我将布尔值放入我的 java 程序中时 它会将其视为 false 有人知道为什么吗
  • 在Java中,如何删除float中的所有0?

    我想这样改变浮动 10 5000 gt 10 5 10 0000 gt 10 如何删除小数点后的所有零 并将其更改为浮点数 如果有非零 或整数 如果只有零 提前致谢 为什么不尝试正则表达式呢 new Float 10 25000f toSt
  • 使用 WPF 将 ObservableCollection.Count 绑定到标签

    我有一个简单的Label这应该包括界限 Count某财产的价值ObservableCollection 问题是 结果始终为 0 零 相同的属性绑定到 DataGrid 它可以完美地工作 甚至可以在集合中发生更改时进行更新 我在这里做错了什么
  • 如何在simulink中创建计数器

    我想计算我的信号变为零的次数 例如 将脉冲信号作为输入 我想要一个变量来计算脉冲变为零的次数 我正在疯狂地思考某事 有人可以帮助我吗 谢谢 figure 1 is a pulse counter model and figure 2 is
  • 通过 javascript/jquery 删除/截断前导零

    建议通过 javascript jquery 从数字 任何字符串 中删除或截断前导零的解决方案 您可以使用匹配字符串开头的零的正则表达式 s s replace 0
  • 如何在 Banana PI ZERO M2 上启用 eth0

    默认情况下 BPI ZERO M2 上禁用 eth0 这里我们将展示启用它 解决方案是创建一个 dtdo 文件并将其放在正确的位置 1 创建文本源文件 bananapi m2 zero eth0 dts dts v1 plugin mode
  • 如果整数以前导零开头,为什么 JSON 无效?

    我正在将一些 JSON 文件导入到 Parse com 项目中 但不断收到错误 无效的键 值对 它指出有一个意想不到的 8 这是我的 JSON 的示例 Manufacturer Manufacturer Model THIS IS A ST
  • Hibernate 在 ManyToOne 关系中处理长 0 值而不是 NULL

    我使用 Hibernate 来访问旧数据库 对于某些表 不强制执行父子引用完整性 并且long对于子表中的某些 父 列 使用 0 值代替 NULL 以表示 无父 我仍然想使用这些关系 ManyToOne and OneToMany字段 但得
  • 在C语言中,NULL指针和指向0的指针有区别吗?如果是这样,那又怎样?

    在C语言中 NULL指针和指向0的指针有什么区别 ISO IEC 9899 TC2 中规定6 3 2 3 Pointers 3 值为 0 的整型常量表达式 或这样的表达式 强制转换为 void 类型 称为空指针常量 55 如果 null 指
  • 为什么浮点数有符号零?

    为什么双打有 0也 0 其背景和意义是什么 0 通常 被视为0 当一个negative浮点数非常接近零 可以考虑0 要明确的是 我指的是算术下溢 http en wikipedia org wiki Arithmetic underflow

随机推荐

  • [Qt 教程之Widgets模块] —— QButtonGroup抽象容器

    Qt系列教程总目录 文章目录 0 QButtonGroup简介 1 创建QButtonGroup 2 成员函数与信号 3 示例 3 1 为按钮组添加按钮 3 2 为按钮设置id 3 3 按钮组中按钮的互斥状态 3 4 获取组内所有按钮 3
  • 开源图像和视频编辑软件汇总

    1 Belender http www blender org Blender 是一套 三维绘图 及 渲染 软件 它具有跨平台的特性 支持 FreeBSD IRIX GNU Linux Microsoft Windows Mac OS X
  • django自带的序列化组件

    目录 sweetalert前端插件 django自带的序列化组件 简易分页器 带有页码的分页器 优化后的版本 模块代码 后端代码 Forms组件 校验数据 渲染标签 展示信息 widgets 注意 sweetalert前端插件 https
  • 计算机组成原理 及CPU,硬盘,内存三者的关系

    电脑之父 冯 诺伊曼 提出了组成计算机的五大部件 输入设备 输出设备 存储器 运算器和控制器 下图为 现在我们电脑的 键盘鼠标 显示器 机箱 音响等等 这里显示器为比较老的CRT显示器 现在一般都成功了液晶显示器 回想一下 在玩电脑的时候
  • chromium-cronet库的编译用于Android和ios平台实现quic协议

    chromium cronet文档 原文文档写的已经很清楚 最好还是参考官方文档 避免由于版本原因导致的问题 Cronet开发者文档 https developer android com guide topics connectivity
  • oracle学习之路(6)oracle下载地址

    ocacle下载地址 https www oracle com database technologies ocacle19c版本下载地址https www oracle com database technologies oracle d
  • flutter项目中使用

    一些小部件 GestureDetector 手势 手势表示由一个或多个指针移动组成的动作 主要有以下几种 onTap 点击事件触发 Divider 设置分割线 SharedPreferences数据存储 SharedPreferences
  • java后端分享整理

    java规范总结 1 Java 常见的代码规范 1 1 Java 自带的工具方法 1 1 1 比较两个对象是否相等 1 1 2 apache commons工具类库 1 1 2 1 字符串判空 1 1 2 3 重复拼接字符串 1 1 2 4
  • 图形放大效果

  • 近日总结

    P1149 火柴棒等式 题目描述 给你n根火柴棍 你可以拼出多少个形如 A B CA B CA B C 的等式 等式中的AAA BBB CCC是用火柴棍拼出的整数 若该数非零 则最高位不能是000 用火柴棍拼数字0 90 90 9的拼法如图
  • version `GLIBCXX_3.4.20‘ not found

    问题描述 编译产生如下错误 问题原因 如下图所示 usr lib x86 64 linux gnu libstdc so 6没有GLIBCXX 3 4 20 strings usr lib x86 64 linux gnu libstdc
  • 低功耗蓝牙(BLE)

    https my oschina net tingzi blog 215008 低功耗蓝牙包括的术语及概念 如上图所示 使用低功耗蓝牙可以包括多个Profile 一个Profile中有多个Service 一个Service中有多个Chara
  • CGAL+QT5配置一路踩坑总结

    总体流程参照 CGAL 5 5 Manual Using CGAL on Windows with Visual C 11条消息 通过vcpkg安装 配置 CGAL 5 2 1 Oskar Lu的博客 CSDN博客 vcpkg配置 11条消
  • ubuntu22设置静态IP 及 无线网卡启停

    标题 查看网络状态 ifconfig 开关无线网卡 sudo ifconfig wlo1 up down 搜索并显示wifi信号 sudo nmcli device wifi rescan nmcli device wifi list 连接
  • 文盘Rust -- 生命周期问题引发的 static hashmap 锁

    2021年上半年 撸了个rust cli开发的框架 基本上把交互模式 子命令提示这些cli该有的常用功能做进去了 项目地址 https github com jiashiwen interactcli rs 春节以前看到axum已经0 4
  • 路径参数和url传参

    请求参数的三种方式 第一种路径参数 后端接收 其中 PathVariabel注解的形参名字要与路径参数形参名字相等 不相等就用 value值来与路径参数名字相等 第二种url地址传参 url xxx abc get请求只能传query参数
  • 计算机白板记录,电子白板:计算机接口介绍

    电子白板 计算机接口介绍 接口类型指的是电子白板与电脑系统采用何种方式进行连接 电子白板 什么是计算机接口 目前电子白板与电脑连接常见的接口类型 有并口 也有称之为ieee1284 centronics 和串口 也有称之为rs 232接口的
  • java进阶Kafka集群实战之原理分析及优化教程全在这里

    我不去想是否能够成功 既然选择了Java 便只顾风雨兼程 我不去想能否征服Kafka集群 既然钟情于Java 就勇敢地追随千锋 我不去想Kafka集群有多么晦涩难懂 既然目标是远方 留给世界的只能是努力拼搏的背影 我不去想未来是平坦还是泥泞
  • 10.两个链表相加求和

    题目 假设链表中每一个节点的值都在 0 9 之间 那么链表整体就可以代表一个整数 给定两个这种链表 请生成代表两个整数相加值的结果链表 思路 首先是逆序相加 故这里用到了两个栈 分别存放两个链表中的值 两数相加会涉及到进位问题 所以考虑了进
  • ZeroQuant与SmoothQuant量化总结

    ref ZeroQuant Efficient and Affordable Post Training Quantization for Large Scale Transformers SmoothQuant Accurate and