🤗 Optimum Quanto 是 optimum 的 PyTorch 量化后端。
它的设计注重多功能性和简单性:
weight_only
和 🤗 的 safetensors
,尚未实现的功能:
简而言之:
int8
/float8
权重和 float8
激活编译的模型与全精度模型非常接近,以下段落仅为示例。请参阅 bench
文件夹了解每个模型用例的详细结果。
Optimum Quanto 可通过 pip 包安装。
pip install optimum-quanto
optimum-quanto
提供了辅助类来量化、保存和重新加载 Hugging Face 量化模型。
第一步是量化模型
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 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
使用低级 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
,并保存到文件中。
支持 pickle
和 safetensors
(推荐)。
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_dict
和 quantization_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 子类,对应于:
对于浮点目标类型,映射由原生 PyTorch 转换完成(即 Tensor.to()
)。
对于整数目标类型,映射 是一个简单的四舍五入操作(即 torch.round()
)。
投影的目标是通过最小化以下数量来提高转换的准确性:
对于int8
和float8
,投影是按张量或按通道对称的,对于更低位宽则是分组仿射(带有偏移或'零点')。
使用较低位宽表示的好处之一是您可以利用目标类型的加速操作,这通常比高精度等效操作更快。
Quanto不支持使用混合目标类型转换张量。
Quanto提供了一种通用机制,可以将torch
模块替换为能够处理quanto张量的optimum-quanto
模块。
optimum-quanto
模块在模型冻结之前动态转换其权重,这会稍微减慢推理速度,但如果需要调整模型则是必要的。
权重通常沿第一维度(输出特征)按通道量化。
偏置不进行转换以保持典型addmm
操作的准确性。
解释:为了与未量化的算术运算保持一致,偏置需要使用等于输入和权重尺度乘积的尺度进行量化,这会导致非常小的尺度,相反需要很高的位宽来避免截断。通常,对于int8
输入和权重,偏置需要至少用12
位量化,即int16
。由于现在大多数偏置是float16
,这是一种浪费时间的做法。
激活函数使用静态尺度按张量动态量化(默认范围为[-1, 1]
)。
为了保持准确性,需要校准模型以评估最佳激活尺度(使用动量)。
以下模块可以量化:
激活始终按张量量化,因为模型图中的大多数线性代数运算与按轴输入不兼容:您simply无法将不以相同基础表示的数字相加("你不能把苹果和桔子相加")。
相反,矩阵乘法中涉及的权重始终沿其第一个轴量化,因为所有输出特征都是独立评估的。
无论如何,量化矩阵乘法的输出总是会被反量化,即使激活被量化,因为:
int32
或float32
),而激活位宽通常为int8
或float8
,float
偏置结合。将激活按张量量化为int8
可能会导致严重的量化误差,如果相应的张量包含大的离群值。通常,这会导致大多数值设置为零的量化张量(除了离群值)。
解决这个问题的一种可能方法是静态"平滑"激活,如SmoothQuant所示。您可以在external/smoothquant下找到平滑某些模型架构的脚本。
更好的选择是使用float8
表示激活。
AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI小说写作助手,一站式润色、改写、扩写
蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号