optimum-quanto

optimum-quanto

PyTorch模型量化框架 提升性能和效率

Optimum Quanto是专为Optimum设计的PyTorch量化框架。它支持eager模式、多设备部署,自动插入量化/反量化存根和操作,实现从浮点到动态/静态量化模型的无缝转换。支持多种精度的权重和激活量化,有效提升模型性能和内存效率。该框架为Hugging Face和原生PyTorch模型提供简便的量化流程。

Optimum Quanto量化PyTorch机器学习模型优化Github开源项目

Optimum Quanto

🤗 Optimum Quanto 是 optimum 的 PyTorch 量化后端。

它的设计注重多功能性和简单性:

  • 所有功能在即时模式下可用(适用于不可追踪的模型),
  • 量化后的模型可以放置在任何设备上(包括 CUDA 和 MPS),
  • 自动插入量化和反量化存根,
  • 自动插入量化的函数操作,
  • 自动插入量化的模块(支持的模块列表见下文),
  • 提供从浮点模型到动态再到静态量化模型的无缝工作流程,
  • 序列化兼容 PyTorch 的 weight_only 和 🤗 的 safetensors
  • 在 CUDA 设备上加速矩阵乘法(int8-int8、fp16-int4、bf16-int8、bf16-int4),
  • 支持 int2、int4、int8 和 float8 权重,
  • 支持 int8 和 float8 激活。

尚未实现的功能:

  • 动态激活平滑,
  • 所有设备上所有混合矩阵乘法的内核,
  • torch compiler(又称 dynamo)的兼容性。

性能

简而言之:

  • 精度:使用 int8/float8 权重和 float8 激活编译的模型与全精度模型非常接近,
  • 延迟:当有优化内核可用时,仅量化模型权重的量化模型推理与全精度模型相当,
  • 设备内存:大约除以浮点位数/整数位数。

以下段落仅为示例。请参阅 bench 文件夹了解每个模型用例的详细结果。

meta-llama/Meta-Llama-3.1-8B

<div class="row"><center> <div class="column"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/129c390f-e2d6-4b3a-b94d-6ae6f75cf62d.png" alt="meta-llama/Meta-Llama-3.1-8B WikiText 困惑度"> </div> </center> </div> <div class="row"><center> <div class="column"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/4e2b2c48-5c91-40c5-a072-868e7aa76a04.png" alt="meta-llama/Meta-Llama-3.1-8B 延迟"> </div> </center> </div>

安装

Optimum Quanto 可通过 pip 包安装。

pip install optimum-quanto

Hugging Face 模型的量化工作流程

optimum-quanto 提供了辅助类来量化、保存和重新加载 Hugging Face 量化模型。

LLM 模型

第一步是量化模型

from transformers import AutoModelForCausalLM from optimum.quanto import QuantizedModelForCausalLM, qint4 model = AutoModelForCausalLM.from_pretrained('meta-llama/Meta-Llama-3-8B') qmodel = QuantizedModelForCausalLM.quantize(model, weights=qint4, exclude='lm_head')

注意:量化后的模型权重将被冻结。如果你想保持它们未冻结以便训练,你需要直接使用 optimum.quanto.quantize

量化后的模型可以使用 save_pretrained 保存:

qmodel.save_pretrained('./Llama-3-8B-quantized')

之后可以使用 from_pretrained 重新加载:

from optimum.quanto import QuantizedModelForCausalLM qmodel = QuantizedModelForCausalLM.from_pretrained('Llama-3-8B-quantized')

Diffusers 模型

你可以量化 diffusers pipeline 内的任何子模型,并稍后无缝地将它们包含在另一个 pipeline 中。

这里我们量化 Pixart pipeline 的 transformer

from diffusers import PixArtTransformer2DModel from optimum.quanto import QuantizedPixArtTransformer2DModel, qfloat8 model = PixArtTransformer2DModel.from_pretrained("PixArt-alpha/PixArt-Sigma-XL-2-1024-MS", subfolder="transformer") qmodel = QuantizedPixArtTransformer2DModel.quantize(model, weights=qfloat8) qmodel.save_pretrained("./pixart-sigma-fp8")

之后,我们可以重新加载量化模型并重新创建 pipeline:

from diffusers import PixArtTransformer2DModel from optimum.quanto import QuantizedPixArtTransformer2DModel transformer = QuantizedPixArtTransformer2DModel.from_pretrained("./pixart-sigma-fp8") transformer.to(device="cuda") pipe = PixArtSigmaPipeline.from_pretrained( "PixArt-alpha/PixArt-Sigma-XL-2-1024-MS", transformer=None, torch_dtype=torch.float16, ).to("cuda") pipe.transformer = transformer

原生 PyTorch 模型的量化工作流程(低级 API)

使用低级 quanto API 时要记住的一点是,默认情况下模型权重是动态量化的:必须显式调用来"冻结"量化权重。

典型的量化工作流程包括以下步骤:

1. 量化

第一步将标准浮点模型转换为动态量化模型。

from optimum.quanto import quantize, qint8 quantize(model, weights=qint8, activations=qint8)

在这个阶段,只有模型的推理被修改为动态量化权重。

2. 校准(如果没有量化激活则可选)

Quanto 支持校准模式,允许在通过量化模型传递代表性样本时记录激活范围。

from optimum.quanto import Calibration with Calibration(momentum=0.9): model(samples)

这会自动激活量化模块中的激活量化。

3. 调优,即量化感知训练(可选)

如果模型性能下降太多,可以对其进行几个 epoch 的调优以恢复浮点模型性能。

import torch 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. 冻结整数权重

冻结模型时,其浮点权重被替换为量化的整数权重。

from optimum.quanto import freeze freeze(model)

5. 序列化量化模型

量化模型的权重可以序列化为 state_dict,并保存到文件中。 支持 picklesafetensors(推荐)。

from safetensors.torch import save_file save_file(model.state_dict(), 'model.safetensors')

为了能够重新加载这些权重,你还需要存储量化模型的量化映射。

import json from optimum.quanto import quantization_map with open('quantization_map.json', w) as f: json.dump(quantization_map(model))

5. 重新加载量化模型

可以使用 requantize 辅助函数从 state_dictquantization_map 重新加载序列化的量化模型。 注意,你需要先实例化一个空模型。

import json from safetensors.torch import load_file state_dict = load_file('model.safetensors') with open('quantization_map.json', r) as f: quantization_map = json.load(f) # 从你的建模代码创建一个空模型并重新量化它 with torch.device('meta'): new_model = ... requantize(new_model, state_dict, quantization_map, device=torch.device('cuda'))

请参阅 examples 了解该工作流程的实例。

设计概述

张量

quanto 的核心是一个 Tensor 子类,对应于:

  • 将源 Tensor 投影到给定目标类型的最佳范围,
  • 将投影值映射到目标类型。

对于浮点目标类型,映射由原生 PyTorch 转换完成(即 Tensor.to())。

对于整数目标类型,映射是一个简单的四舍五入操作(即 torch.round())。 投影的目标是通过最小化以下数量来提高转换的准确性:

  • 饱和值(即映射到目标类型的最小/最大值)
  • 归零值(因为它们低于目标类型可以表示的最小数值)

对于int8float8,投影是按张量或按通道对称的,对于更低位宽则是分组仿射(带有偏移或'零点')。

使用较低位宽表示的好处之一是您可以利用目标类型的加速操作,这通常比高精度等效操作更快。

Quanto不支持使用混合目标类型转换张量。

模块

Quanto提供了一种通用机制,可以将torch模块替换为能够处理quanto张量的optimum-quanto模块。

optimum-quanto模块在模型冻结之前动态转换其权重,这会稍微减慢推理速度,但如果需要调整模型则是必要的。

权重通常沿第一维度(输出特征)按通道量化。

偏置不进行转换以保持典型addmm操作的准确性。

解释:为了与未量化的算术运算保持一致,偏置需要使用等于输入和权重尺度乘积的尺度进行量化,这会导致非常小的尺度,相反需要很高的位宽来避免截断。通常,对于int8输入和权重,偏置需要至少用12位量化,即int16。由于现在大多数偏置是float16,这是一种浪费时间的做法。

激活函数使用静态尺度按张量动态量化(默认范围为[-1, 1])。

为了保持准确性,需要校准模型以评估最佳激活尺度(使用动量)。

以下模块可以量化:

  • Linear (QLinear)。 权重始终量化,偏置不量化。输入和输出可以量化。
  • Conv2d (QConv2D)。 权重始终量化,偏置不量化。输入和输出可以量化。
  • LayerNorm, 权重和偏置__不__量化。输出可以量化。

量化激活时需要避免的陷阱

激活始终按张量量化,因为模型图中的大多数线性代数运算与按轴输入不兼容:您simply无法将不以相同基础表示的数字相加("你不能把苹果和桔子相加")。

相反,矩阵乘法中涉及的权重始终沿其第一个轴量化,因为所有输出特征都是独立评估的。

无论如何,量化矩阵乘法的输出总是会被反量化,即使激活被量化,因为:

  • 结果累积值的表示位宽要高得多(通常为int32float32),而激活位宽通常为int8float8
  • 它们可能与float偏置结合。

将激活按张量量化为int8可能会导致严重的量化误差,如果相应的张量包含大的离群值。通常,这会导致大多数值设置为零的量化张量(除了离群值)。

解决这个问题的一种可能方法是静态"平滑"激活,如SmoothQuant所示。您可以在external/smoothquant下找到平滑某些模型架构的脚本。

更好的选择是使用float8表示激活。

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具使用教程AI营销产品酷表ChatExcelAI智能客服
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

热门AI工具生产力协作转型TraeAI IDE
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

数据安全AI助手热门AI工具AI辅助写作AI论文工具论文写作智能生成大纲
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

热门AI工具AI办公办公工具智能排版AI生成PPT博思AIPPT海量精品模板AI创作
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多