optimum-quanto

GitHub
1k 86 简单 1 次阅读 4天前Apache-2.0开发框架
AI 解读 由 AI 自动生成,仅供参考

Optimum Quanto 是专为 Hugging Face Optimum 生态打造的 PyTorch 量化后端,旨在帮助开发者轻松压缩大型 AI 模型。它主要解决了大模型在推理时显存占用高、运行速度慢的难题,通过降低权重和激活值的精度(支持 int2/4/8 及 float8 等格式),在几乎不损失模型准确率的前提下,显著减少内存需求并提升推理效率。

这款工具特别适合需要部署大语言模型(如 Llama 系列)或图像生成模型的 AI 研究人员与工程开发者。其独特亮点在于极高的易用性与兼容性:无需修改模型结构或进行复杂的图追踪,即可在 eager 模式下直接运行;它能自动插入量化算子,并无缝支持从动态到静态量化的完整工作流。此外,Optimum Quanto 针对 CUDA 设备提供了加速矩阵乘法内核,并兼容 PyTorch 原生权重格式及 Safetensors,让模型的量化、保存与加载变得像调用普通 API 一样简单。

需要注意的是,目前该项目已进入维护模式,不再添加重大新功能。对于追求最新特性或生产级高强度需求的用户,官方建议关注 bitsandbytes 或 torchAO 等活跃项目,但 Optimum Quanto 依然是理解和使用基础量化技术的优秀入门选择。

使用场景

某初创团队需要在消费级显卡(如 RTX 3090)上部署 Meta-Llama-3-8B 大模型,以构建低成本的内部知识库问答系统。

没有 optimum-quanto 时

  • 显存严重不足:原始 BF16 精度的 8B 模型占用约 16GB 显存,加上推理时的激活值开销,极易导致单卡显存溢出(OOM),无法运行。
  • 量化流程繁琐:手动编写量化脚本需要处理复杂的算子替换和权重转换,且难以兼容非标准模型结构,调试成本极高。
  • 推理速度受限:缺乏针对特定硬件优化的混合精度矩阵乘法内核,即使强行量化,推理延迟也往往高于全精度模型,得不偿失。
  • 部署灵活性差:生成的量化模型往往绑定特定后端,难以在不同设备(如 CUDA 或 MPS)间无缝迁移或保存为标准格式。

使用 optimum-quanto 后

  • 显存占用减半:通过 qint4 权重量化,模型显存占用降低至原来的 1/4 左右,轻松在单张消费级显卡上流畅运行。
  • 工作流极简:仅需几行代码调用 QuantizedModelForCausalLM.quantize,即可自动插入量化/反量化桩并冻结权重,支持动态到静态的平滑过渡。
  • 推理性能提升:自动启用 CUDA 上的加速矩阵乘法内核(如 bf16-int4),在保持精度几乎无损的前提下,显著降低了生成延迟。
  • 生态兼容性强:量化后的模型可直接通过 save_pretrained 保存为 safetensors 格式,并能在任何支持 PyTorch 的设备上直接加载推理。

optimum-quanto 让开发者能以极低的代码成本,将大型语言模型高效压缩并部署到资源受限的边缘设备上。

运行环境要求

操作系统
  • Linux
  • macOS
GPU
  • 可选但推荐
  • 支持 CUDA (NVIDIA) 和 MPS (Apple Silicon)
  • 若需加速矩阵乘法(如 int8-int8, fp16-int4 等),需要支持相应算子的 NVIDIA GPU
  • 具体显存大小取决于模型规模,未明确最低要求
内存

未说明

依赖
notes该项目目前处于维护模式,仅接受次要 bug 修复和文档改进,不建议用于需要活跃开发的生产环境(可考虑 bitsandbytes 或 torchAO)。支持在 eager 模式下运行(无需模型追踪)。支持将量化模型部署到任何设备(包括 CUDA 和 MPS)。序列化兼容 PyTorch weight_only 和 Hugging Face safetensors 格式。量化激活时需注意异常值可能导致精度下降,建议进行校准。
python未说明
torch
optimum
transformers
diffusers
safetensors
optimum-quanto hero image

快速开始

Optimum Quanto

该项目目前处于维护模式。我们仅接受用于修复小错误、改进文档及其他维护任务的拉取请求。重大的新功能或破坏性更改不太可能被合并。对于生产就绪的量化功能或活跃的开发工作,请考虑使用其他项目,例如 bitsandbytestorchAO

🤗 Optimum Quanto 是一个用于 optimum 的 PyTorch 量化后端。

它在设计时充分考虑了通用性和简洁性:

  • 所有功能均可在 eager 模式下使用(适用于不可跟踪的模型);
  • 量化后的模型可以部署到任何设备上(包括 CUDA 和 MPS);
  • 自动插入量化和反量化的桩代码;
  • 自动插入量化后的函数操作;
  • 自动插入量化模块(支持的模块列表见下文);
  • 提供从浮点模型到动态量化再到静态量化的无缝工作流;
  • 序列化与 PyTorch 的 weight_only 格式及 🤗 safetensors 兼容;
  • 在 CUDA 设备上加速矩阵乘法运算(int8-int8、fp16-int4、bf16-int8、bf16-int4);
  • 支持 int2、int4、int8 和 float8 权重;
  • 支持 int8 和 float8 激活值。

尚未实现的功能:

  • 动态激活平滑处理;
  • 所有混合精度矩阵乘法的内核在所有设备上的实现;
  • PyTorch 编译器(即 dynamo)的兼容性。

性能

简而言之:

  • 准确性:使用 int8/float8 权重和 float8 激活值编译的模型,其性能非常接近全精度模型;
  • 延迟:在存在优化内核的情况下,仅对模型权重进行量化时,量化模型的推理延迟可与全精度模型相媲美;
  • 设备内存:大约为浮点位数除以整数位数。

以下段落仅为示例。有关按模型用例划分的详细结果,请参阅 bench 文件夹。

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

meta-llama/Meta-Llama-3.1-8B WikiText 困惑度
meta-llama/Meta-Llama-3.1-8B 延迟

安装

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 流水线中的任意子模型进行量化,并随后无缝地将其集成到另一个流水线中。这里我们对 Pixart 流水线中的 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")

稍后,我们可以重新加载量化后的模型并重建流水线:

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), f)

6. 重新加载量化模型

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

import json

from safetensors.torch import load_file
from optimum.quanto import requantize

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'))

有关该工作流的具体实现,请参阅 示例

设计概览

张量

Quanto 的核心是一个张量子类,它对应于:

  • 将源张量投影到给定目标类型的最优范围内;
  • 将投影后的值映射到目标类型。

对于浮点目标类型,映射由原生 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,权重和偏置 量化。输出可以量化。

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

激活值始终按张量整体进行量化,这是因为模型图中的大多数线性代数运算都不支持按轴输入:你无法对不同基数表示的数值进行加法运算(“不能把苹果和橘子相加”)。

与此相反,参与矩阵乘法的权重则始终沿其第一个轴进行量化,这是因为所有输出特征都是独立计算的。

无论如何,即使激活值已被量化,量化后的矩阵乘法结果仍会先被反量化,原因如下:

  • 结果的累加值采用的位宽远高于激活值的位宽(通常为 int32float32,而激活值通常是 int8float8);
  • 这些值还可能与一个 float 类型的偏置项相加。

如果对应的张量中包含较大的异常值,将激活值按张量整体量化为 int8 格式,可能会导致严重的量化误差。典型情况下,这会使量化后的张量中大部分值都被置为零,仅保留那些异常值。

解决这一问题的一种方法是像 SmoothQuant 所示,对激活值进行静态平滑处理。你可以在 external/smoothquant 目录下找到用于平滑某些模型架构的脚本。

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

版本历史

v0.2.72025/03/06
v0.2.62024/10/29
v0.2.52024/10/01
v0.2.42024/07/26
v0.2.32024/07/25
v0.2.22024/06/28
v0.2.12024/05/31
v0.2.02024/05/24
v0.1.02024/03/13
v0.0.132024/02/23
v0.0.122024/02/16
0.0.112024/01/19
0.0.102024/01/19
0.0.92023/12/15
0.0.82023/12/08
0.0.72023/12/01
0.0.62023/10/27
0.0.52023/10/19
0.0.42023/10/09
0.0.12023/10/02

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|今天
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|昨天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

141.5k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.9k|★★☆☆☆|今天
开发框架图像Agent

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|今天
语言模型图像Agent

Deep-Live-Cam

Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具,用户仅需一张静态照片,即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点,让高质量的数字内容创作变得触手可及。 这款工具不仅适合开发者和技术研究人员探索算法边界,更因其极简的操作逻辑(仅需三步:选脸、选摄像头、启动),广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换,还是制作趣味短视频和直播互动,Deep-Live-Cam 都能提供流畅的支持。 其核心技术亮点在于强大的实时处理能力,支持口型遮罩(Mouth Mask)以保留使用者原始的嘴部动作,确保表情自然精准;同时具备“人脸映射”功能,可同时对画面中的多个主体应用不同面孔。此外,项目内置了严格的内容安全过滤机制,自动拦截涉及裸露、暴力等不当素材,并倡导用户在获得授权及明确标注的前提下合规使用,体现了技术发展与伦理责任的平衡。

88.9k|★★★☆☆|今天
开发框架图像Agent