Quanto: PyTorch 量化工具包
量化技术通过用低精度数据类型 (如 8 位整型 (int8)) 来表示深度学习模型的权重和激活,以减少传统深度学习模型使用 32 位浮点 (float32) 表示权重和激活所带来的计算和内存开销。
减少位宽意味着模型的内存占用更低,这对在消费设备上部署大语言模型至关重要。量化技术也使得我们可以针对较低位宽数据类型进行特殊的计算优化,例如 CUDA 设备有针对 int8
或 float8
矩阵乘法的硬件优化。
市面上有许多可用于量化 PyTorch 深度学习模型的开源库,它们各有特色及局限。通常来讲,每个库都仅实现了针对特定模型或设备的特性,因而普适性不强。此外,尽管各个库的设计原理大致相同,但不幸的是,它们彼此之间却互不兼容。
因此,quanto 库应运而出,其旨在提供一个多功能的 PyTorch 量化工具包。目前 quanto 包含如下特性:
在 eager 模式下可用 (适用于无法成图的模型),
生成的量化模型可以运行于任何设备 (包括 CUDA 设备和 MPS 设备) 上,
自动插入量化和反量化结点,
自动插入量化后的
torch.nn.functional
算子,自动插入量化后的
torch.nn
模块 (具体支持列表见下文),提供无缝的模型量化工作流,支持包含静态量化、动态量化在内的多种模型量化方案,
支持将量化模型序列化为
state_dict
,不仅支持
int8
权重,还支持int2
以及int4
,不仅支持
int8
激活,还支持float8
。
最近,出现了很多仅专注于大语言模型 (LLM) 的量化算法,而 quanto 的目标为那些适用于任何模态的、易用的量化方案 (如线性量化,分组量化等) 提供简单易用的量化原语。
我们无意取代其他量化库,而是想通过新算法的实现门槛来促进创新,使得大家能够轻松地实现新模块,抑或是轻松组合现有模块来实现新算法。
毫无疑问,量化很困难。当前,如要实现模型的无缝量化,需要大家对 PyTorch 的内部结构有深入了解。但不用担心,quanto 的目标就是为你完成大部分繁重的工作,以便你可以集中精力在最重要的事情上,即: 探索低比特 AI 从而找出惠及 GPU 穷人的解决方案。
量化工作流
大家可以 pip 安装 quanto
包。
pip install quanto
quanto 没有对动态和静态量化进行明确区分。因为静态量化可以首先对模型进行动态量化,随后再将权重 冻结
为静态值的方式来完成。
典型的量化工作流包括以下步骤:
1. 量化
将标准浮点模型转换为动态量化模型。
quantize(model, weights=quanto.qint8, activations=quanto.qint8)
此时,我们会对模型的浮点权重进行动态量化以用于后续推理。
2. 校准 (如果上一步未量化激活,则可选)
quanto
支持校准模式。在校准过程中,我们会给量化模型传一些代表性样本,并在此过程中记录各算子激活的统计信息 (如取值范围)。
with calibration(momentum=0.9):model(samples)
上述代码会自动使能量化模块的激活量化功能。
3. 微调,即量化感知训练 (可选)
如果模型的性能下降太多,可以尝试将其微调几轮以恢复原浮点模型的性能。
model.train()
for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data).dequantize()loss = torch.nn.functional.nll_loss(output, target)loss.backward()optimizer.step()
4. 冻结整型权重
模型冻结后,其浮点权重将替换为量化后的整型权重。
freeze(model)
请参阅 该例 以深入了解量化工作流程。你还可以查看此 notebook,其提供了一个完整的用 quanto
量化 BLOOM 模型的例子。
示例代码https://github.com/huggingface/quanto/tree/main/examples
Colab notebookhttps://colab.research.google.com/drive/1qB6yXt650WXBWqroyQIegB-yrWKkiwhl?usp=sharing
效果
下面我们列出了一些初步结果,我们还在紧锣密鼓地更新以进一步提高量化模型的准确性和速度。但从这些初步结果中,我们仍能看出 quanto
的巨大潜力。
下面两幅图评估了 mistralai/Mistral-7B-v0.1 在不同的量化参数下的准确度。注意: 每组的第一根柱子均表示非量化模型。
mistralai/Mistral-7B-v0.1https://huggingface.co/mistralai/Mistral-7B-v0.1
上述结果均未使用任何高级训后量化算法 (如 hqq 或 AWQ)。
hqqhttps://mobiusml.github.io/hqq_blog/
AWQhttps://github.com/mit-han-lab/llm-awq
下图给出了在英伟达 A100 GPU 上测到的词元延迟。
这些测试结果都尚未利用任何优化的矩阵乘法算子。可以看到,量化位宽越低,开销越大。我们正在持续改进 quanto,以增加更多的优化器和优化算子,请持续关注我们的性能演进。
请参阅 quanto 基准测试 以了解在不同模型架构及配置下的详细结果。
quanto 基准测试https://github.com/huggingface/quanto/tree/main/bench/
集成进 transformers
我们已将 quanto
无缝集成至 Hugging Face transformers 库中。你可以通过给 from_pretrained
API 传 QuantoConfig
参数来对任何模型进行量化!
transformershttps://github.com/huggingface/transformers
目前,你需要使用最新版本的 accelerate 以确保完全兼容。
acceleratehttps://github.com/huggingface/accelerate
from transformers import AutoModelForCausalLM, AutoTokenizer, QuantoConfigmodel_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)quantization_config = QuantoConfig(weights="int8")quantized_model = AutoModelForCausalLM.from_pretrained(model_id,quantization_config= quantization_config
)
你只需在 QuantoConfig
中设置相应的参数即可将模型的权重/激活量化成 int8
、 float8
、 int4
或 int2
; 还可将激活量化成 int8
或 float8
。如若设成 float8
,你需要有一个支持 float8
精度的硬件,否则当执行 matmul (仅当量化权重时) 时,我们会默认将权重和激活都转成 torch.float32
或 torch.float16
(具体视模型的原始精度而定) 再计算。目前 MPS
设备不支持 float8
, torch
会直接抛出错误。
quanto
与设备无关,这意味着无论用的是 CPU/GPU 还是 MPS (Apple 的芯片),你都可以对模型进行量化并运行它。
quanto
也可与 torch.compile
结合使用。你可以先用 quanto
量化模型,然后用 torch.compile
来编译它以加快其推理速度。如果涉及动态量化 (即使用量化感知训练或对激活进行动态量化),该功能可能无法开箱即用。因此,请确保在使用 transformers
API 创建 QuantoConfig
时,设置 activations=None
。
quanto
可用于量化任何模态的模型!下面展示了如何使用 quanto
将 openai/whisper-large-v3
模型量化至 int8
。
from transformers import AutoModelForSpeechSeq2Seqmodel_id = "openai/whisper-large-v3"
quanto_config = QuantoConfig(weights="int8")model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id,torch_dtype=torch.float16,device_map="cuda",quantization_config=quanto_config
)
你可查阅此 notebook,以详细了解如何在 transformers
中正确使用 quanto
!
notebookhttps://colab.research.google.com/drive/16CXfVmtdQvciSh9BopZUDYcmXCDpvgrT?usp=sharing#scrollTo=IHbdLXAg53JL
实现细节
量化张量
quanto
的核心是一些 Tensor 子类,其主要做下面两件事:
将源张量按最优
比例
投影至给定量化数据类型的取值范围内。将投影后的值映射至目标数据类型。
当目标类型是浮点型时,映射由 PyTorch 原生转换接口 (即 Tensor.to()
) 完成。而当目标类型是整型时,映射可以用一个简单的舍入操作 (即 torch.round()
) 来完成。
投影的目标是提高数据类型转换的精确度,具体可以通过最小化以下两个值来达成:
饱和值的个数 (即有多少个数最终映射为目标数据类型的最小值/最大值),
归零值的个数 (即有多少个数因为小于目标数据类型可以表示的最小数字,所以被映射成了 0)。
为了提高效率起见, 8 比特
量化时,我们使用对称投影,即以零点为中心进行投影。一般而言,对称量化张量与许多标准算子兼容。
在使用较低位宽的量化 (如 int2
或 int4
) 时,一般使用的是仿射投影。此时,会多一个 zeropoint
参数以对齐投影值和原值的零点。这种方法对量化范围的覆盖度会好些。仿射量化张量通常更难与标准算子兼容,因此一般需要自定义很多算子。
量化 torch.nn
模块
quanto
实现了一种通用机制,以用能够处理 quanto
张量的 quanto
模块替换相应的 torch
模块 ( torch.nn.Module
)。
quanto
模块会动态对 weights
进行数据类型转换,直至模型被冻结,这在一定程度上会减慢推理速度,但如果需要微调模型 (即量化感知训练),则这么做是需要的。
此外,我们并未量化 bias
参数,因为它们比 weights
小得多,并且对加法进行量化很难获得太多加速。
我们动态地将激活量化至固定取值范围 (默认范围为 [-1, 1]
),并通过校准过程决定最佳的比例 (使用二阶动量更新法)。
我们支持以下模块的量化版:
Linear (QLinear)。仅量化权重,不量化偏置。输入和输出可量化。
Conv2d (QConv2D)。仅量化权重,不量化偏置。输入和输出可量化。
LayerNorm。权重和偏至均 不 量化。输出可量化。
Linearhttps://pytorch.org/docs/stable/generated/torch.nn.Linear.html
Conv2dhttps://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html
LayerNormhttps://pytorch.org/docs/stable/generated/torch.nn.LayerNorm.html
定制算子
得益于 PyTorch 出色的调度机制,quanto 支持在 transformers 或 diffusers 的模型中最常用的函数,无需过多修改模型代码即可启用量化张量。
diffusershttps://github.com/huggingface/diffusers
大多数“调度”功能可通过标准的 PyTorch API 的组合来完成。但一些复杂的函数仍需要使用 torch.ops.quanto
命名空间下的自定义操作。其中一个例子是低位宽的融合矩阵乘法。
训后量化优化
quanto 中尚未支持高级的训后量化算法,但该库足够通用,因此与大多数 PTQ 优化算法兼容,如 hqq、[AWQ](https:/
展望未来,我们计划无缝集成这些最流行的算法。
为 Quanto 作出贡献
我们非常欢迎大家对 quanto 作出贡献,尤其欢迎以下几类贡献:
实现更多针对特定设备的 quanto 优化算子,
支持更多的 PTQ 优化算法,
扩大量化张量可调度操作的覆盖面。
quantohttps://github.com/huggingface/quanto
英文原文: https://hf.co/blog/quanto-introduction
原文作者: David Corvoysier,Younes Belkada,Marc Sun
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。
相关文章:
Quanto: PyTorch 量化工具包
量化技术通过用低精度数据类型 (如 8 位整型 (int8)) 来表示深度学习模型的权重和激活,以减少传统深度学习模型使用 32 位浮点 (float32) 表示权重和激活所带来的计算和内存开销。 减少位宽意味着模型的内存占用更低,这对在消费设备上部署大语言模型至关…...
宝塔面板Docker+Uwsgi+Nginx+SSL部署Django项目
这次为大家带来的是从零开始搭建一个django项目并将它部署到linux服务器上。大家可以按照我的步骤一步步操作,最终可以完成部署。 步骤1:在某个文件夹中创建一个django项目 安装django pip install django创建一个django项目将其命名为djangoProject …...
Android 无线调试 adb connect ip:port 失败
1. 在手机打开 无线调试 使用 adb connect 连接 adb connect 192.168.14.164:39511如果连接成功, 查看连接的设备, 忽略 配对下面的步骤. adb devices如果连接失败: failed to connect to 192.168.14.164:39511如果失败了, 可以杀死一下进程, 然后执行后面的操作 adb kill…...
年龄与疾病c++
题目描述 某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照0-18岁、19-35岁、36-60岁、61以上(含61)四个年龄段统计的患病人数以及占总患病人数的比例。 输入 共2行,第一行为过…...
neo4j-01
Neo4j是: 开源的(社区版开源免费)无模式(不用预设数据的格式,数据更加灵活)noSQL(非关系型数据库,数据更易拓展)图数据库(使用图这种数据结构作为数据存储方…...
正则表达式 速成
正则表达式的作用 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字…...
21、Lua 面向对象
Lua 面向对象 Lua 面向对象面向对象特征Lua 中面向对象一个简单实例创建对象访问属性访问成员函数完整实例 Lua 继承完整实例 函数重写 Lua 面向对象 面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。 以下…...
openssl3.2 - exp - class warp for sha3-512
文章目录 openssl3.2 - exp - class warp for sha3-512概述笔记调用方代码子类 - cipher_sha3_512.h子类 - cipher_sha3_512.cpp基类 - cipher_md_base.h基类 - cipher_md_base.cpp备注END openssl3.2 - exp - class warp for sha3-512 概述 前面实验整了一个对buffer进行sha…...
cog predict docker unknown flag: --file
如图: 使用cog predict -i image“link-to-image” 出现docker unknown flag: --file的问题。 解决方法(对我可行):切换cog版本。 这个是我一开始的cog安装命令(大概是下的最新版?)࿱…...
SpringMVC接收参数方式讲解
PathVariable 该注解用于接收具有Restful风格的参数,如/api/v1/1001,最终userId的值为1001。 如下代码中,使用name属性可以指定GetMapping中的id名称与之对应,从而可以自定义参数名称userId,而不是使用默认名称id G…...
JavaScript 中arguments 对象详细解析与案例
在JavaScript中,每个函数都有一个内部对象arguments,它包含了函数调用时传递的所有参数。arguments对象类似一个数组,但是它并不是真正的数组,它没有数组的方法,只有length属性和索引访问元素的能力。 以下是对argume…...
消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测
Eliminating Cross-modal Conflicts in BEV Space for LiDAR-Camera 3D Object Detection 消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测 摘要Introduction本文方法Single-Modal BEV Feature ExtractionSemantic-guided Flow-based AlignmentDissolved…...
【免安装的MATLAB--MATLAB online】
目录: 前言账号的注册图片处理的示例准备图片脚本函数 总结 前言 在计算机、数学等相关专业中,或多或少都会与MATLAB产生藕断丝连的联系,如果你需要使用MATLAB,但是又不想要安装到自己的电脑上(它实在是太大了啊&#…...
Flyway 数据库版本管理
一、Flyway简介 Flyway是一款开源的数据库迁移工具,可以管理和版本化数据库架构。通过Flyway,可以跟踪数据库的变化,并将这些变化作为版本控制的一部分。Flyway支持SQL和NoSQL数据库,并且可以与现有的开发流程无缝集成࿰…...
lua学习笔记19(面相对象学习的一点总结)
print("*****************************面相对象总结*******************************") object{} --实例化方法 function object:new()local obj{}self.__indexselfsetmetatable(obj,self)return obj end-------------------------如何new一个对象 function object:…...
视觉SLAM学习打卡【10】-后端·滑动窗口法位姿图
本节是对上一节BA的进一步简化,旨在提高优化实时性.难点在于位姿图部分的雅可比矩阵求解(涉及李代数扰动模型求导),书中的相关推导存在跳步(可能数学功底强的人认为过渡的理所当然),笔者参考了知…...
【动态规划 区间dp 位运算】100259. 划分数组得到最小的值之和
本文涉及知识点 动态规划 区间dp 位运算 LeetCode100259. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues,长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组,对于第 ith 个子数…...
CSS核心样式-02-盒模型属性及扩展应用
目录 三、盒模型属性 常见盒模型区域 盒模型图 盒模型五大属性 1. 宽度 width 2. 高度 height 3. 内边距 padding 四值法 三值法 二值法 单值法 案例 4. 边框 border 按照属性值的类型划分为三个单一属性 ①线宽 border-width ②线型 border-style ③边框颜色 bo…...
在 Google Cloud 上轻松部署开放大语言模型
今天,“在 Google Cloud 上部署”功能正式上线! 这是 Hugging Face Hub 上的一个新功能,让开发者可以轻松地将数千个基础模型使用 Vertex AI 或 Google Kubernetes Engine (GKE) 部署到 Google Cloud。 Model Garden (模型库) 是 Google Clou…...
005Node.js模块URL的使用
引入 URL 模块 要使用 URL 模块,首先需要在代码中引入它。可以使用以下代码将 URL 模块导入到你的脚本中: const url require(url);实例代码 const urlrequire(url); var apihttp://www.baidu.com?nameshixiaobin&age20; console.log(url.parse(…...
美团笔试复盘
昨天做了美团的笔试,现在复盘一下。 1、将数组按照绝对值大小排序 有道算法题解决思路需要将数组按照绝对值大小进行排序,我使用的是sort方法Comparator比较器实现的,这里记录一下: public static void main(String[] args) {In…...
IntelliJ IDEA - Since Maven 3.8.1 http repositories are blocked
问题描述 新下载的 IDEA 在构建项目时,在下载引用的包时出现 “Since Maven 3.8.1 http repositories are blocked” 的问题。 原因分析 从 Maven 3.8.1 开始,不再支持 http 的包了。由于现在对网络安全的日益重视,都在向 https 转变&#…...
Django的APP应用更名(重命名)流程
将Django中的一个现有APP更名是一个需要谨慎操作的过程,因为它涉及到多个文件和配置的更新。下面是详细的步骤和一些补充细节,帮助你更顺利地完成APP重命名: 1. 修改APP名称及相关引用 更改APP目录名称: 首先,重命名…...
ChatGLM3-6B大语言模型离线执行
ChatGLM3-6B大语言模型离线执行 模型准备 一般而言,模型和模型参数可以通过如下三个模型源进行相应的下载: HuggingFace | ModelScope | WiseModel 本实例中,使用的是HuggingFace的源下载,相应的地址如下: HuggingFa…...
了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步,显著提升了各种任务的完成度。然而,其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数,需要…...
2024.4.14力扣每日一题——设计哈希集合
2024.4.14 题目来源我的题解方法一 链表数组 题目来源 力扣每日一题;题序:705 我的题解 方法一 链表数组 由于给定限制次数为10000,所以构造一个长度为10001的链表数组。对于add操作先看数组对应的位置是否为null或者为空,若是…...
SQL explain 显示子查询A类型为ALL怎么优化
当 SQL EXPLAIN 显示子查询 A 的类型为 ALL 时,这意味着数据库系统正在执行全表扫描,而不是使用索引来执行子查询。全表扫描可能会导致性能下降,特别是在大型表上。 为了优化这种情况,您可以考虑以下几点: 1. **索引…...
网络协议学习——IP协议
IP(Internet Protocol,互联网协议)是网络中最基本的协议之一,负责在互联网中进行数据包的传输。下面是对IP协议的详细讲解: IP协议的作用 IP协议是在网络层(第三层)上工作的协议,它的…...
MATLAB初学者入门(1)—— 基础知识和功能介绍
MATLAB(Matrix Laboratory)是一种用于数值计算、可视化以及编程的高性能语言环境。它广泛应用于工程、科学研究和教育等领域。以下是对MATLAB基础知识和编程技巧的系统性讲解,分为几个主要部分: 1. 基础操作 变量和表达式 在MAT…...
React Css 四种引入方式
React CSS 内联样式 优点 样式之间不会有冲突可以动态获取组件中state的值 缺点 要使用驼峰标识部分样式没有很友好的提示如果大量去写内敛样式 容易造成代码混乱伪类和伪元素无法编写 class HighCom extends PureComponent {constructor(props) {super(props)this.state…...
美国人做网站用的是什么字体/成品ppt网站国外
版权说明,本文参考tonymacx86的[Guide] Patching DSDT/SSDT for LAPTOP backlight control 如果转载,请注明原文地址:http://blog.csdn.net/wr132/article/details/54849387 前言 注意:本教程主要使用于Intel HD Graphic系列显卡…...
wordpress语言设置/企业优化推广
好久没技术,但手痒,写数学也行吧...试试... 市场上有很多好的教材,这里只为自己记忆,做笔记而用,无他.很多资料可能也是转载的,帮助自己消化,也便于以后自己参考 一.随机试验和随机事件 如果一个试验在相同条件下可以重复进行,而每次试验的可能结果不止一个…...
网站开发架构mvc/优化推广方案
花火网消息,如果你有4000元左右的预算,你会选择什么国产手机呢?近年来一加和华为其实在海外市场都得难分难解,尤其是今年一加7TPro和华为mate30Pro,更是引发了北美市场消费者的抢购,那么究竟这两款手机谁更好一些呢?…...
专业制作网站费用/网店代运营公司靠谱吗
golang笔记02--golang基础语法1 介绍2 基础语法2.1变量定义2.2 内建变量类型2.3 常量与枚举2.4 条件语句2.5 循环2.6 函数2.7 指针3 注意事项4 说明1 介绍 本文继上文 golang笔记01–golang基础配置, 进一步了解 golang 基础语法和相应注意事项。 具体包括 : 变量定…...
wordpress图片打叉/微信公众号软文怎么写
点击查看全文 刚刚过去的苹果秋季发布会上,万众瞩目的iPhoneX 手机亮相。十年前,首代iPhone开启了颠覆键盘功能机的序幕,十年过去了,智能触屏手机已经彻底普及。 关注个人智能手机升级的IT人士,是否也了解你的企业数仓…...
网站建设营销话术/青岛seo代理计费
2019独角兽企业重金招聘Python工程师标准>>> 根据《深入浅出设计模式(C#/Java版)》所述, Strategy模式的应用场景是:1. 多个类的分别只是在于行为不同2. 你需要对行为的算法做很多变动3. 客户不知道算法要使用的数据 Template Method模式的应用场景是:1. 你想将相同…...