在 H100 GPU 上使用 Hugging Face Quanto 优化 AI 模型

news2024/9/20 14:55:09

基于 Transformer 的扩散模型日益完善,已被证明能够彻底改变文本到图像的生成方式。Transformer 的功能不仅能增强模型的可扩展性和性能,还会增加模型的复杂性。

在这种情况下,模型的复杂性越高,功耗和内存消耗也就越大。

例如,使用像 Stable Diffusion 3 这样的模型进行推理时,需要巨大的 GPU 内存,因为涉及到文本编码器、扩散主干和图像解码器等组件。这样的高内存需求可能会给使用消费级 GPU 的用户带来困扰,从而影响模型的可访问性和实验性。

这时,模型量化的作用就凸显出来了。想象一下,能够将资源密集型模型缩小到更易管理的大小,而不牺牲其效果。量化就像将高分辨率图像压缩成更紧凑的格式,将模型的参数转换为低精度表示。这不仅可以减少内存使用量,还能加快计算速度,使复杂模型更易于访问和使用。

在这篇文章中,你将了解 Quanto 的量化工具如何显著提高基于 Transformer 的扩散管道的内存效率。

Quanto 介绍:多功能 PyTorch 量化后端

量化是减少深度学习模型计算和内存需求的关键技术,使其更适合部署在消费设备上。通过使用低精度数据类型(如 8 位整数 (int8))代替 32 位浮点数 (float32),量化不仅可以降低内存存储要求,还可以针对特定硬件进行优化,例如 CUDA 设备上的 int8 或 float8 矩阵乘法。

Quanto是Hugging Face团队开发的一个Python库,它利用Transformer和XLM-RoBERTa技术进行跨语言文本转换。Quanto通过量化和解量化处理实现高效、泛化和易用的多语言任务解决,适用于信息检索、社交媒体监控等多种场景。

Quanto 是 Optimum 的新量化后端,旨在提供多功能且直接的量化过程。Quanto 以其对各种功能的全面支持而脱颖而出,确保与各种模型配置和设备的兼容性:

  • Eager Mode 兼容性与不可跟踪的模型无缝协作。
  • 设备灵活性:量化模型可以部署在任何设备上,包括 CUDA 和 MPS。
  • 自动集成:自动插入量化/反量化存根、功能操作和量化模块。
  • 简化的工作流程:提供从浮点模型到动态和静态量化模型的轻松过渡。
  • 序列化支持:兼容 PyTorch weight_only 和 Safetensors 格式。
  • 加速矩阵乘法支持 CUDA 设备上的各种量化格式(int8-int8、fp16-int4、bf16-int8、bf16-int4)。
  • 广泛的支持:处理 int2、int4、int8 和 float8 权重和激活。

虽然许多工具专注于缩小大型 AI 模型,但 Quanto 的设计简单且适用于各种模型。

Quanto 工作流程

要使用 pip 安装 Quanto,请使用以下代码:-

!pip install optimum-quanto

  1. 量化模型

以下代码将有助于将标准模型转换为量化模型

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

  1. 校准

Quanto 的校准模式可确保量化参数根据模型中的实际数据分布进行调整,从而提高量化模型的准确性和效率。

from optimum.quanto import Calibration

with Calibration(momentum=0.9):
    model(samples)

  1. 量化感知训练

如果模型性能受到影响,可以对模型进行几个时期的调整,以提高模型性能。

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

  1. 冻结整数权重

冻结模型时,浮点权重将转换为量化权重。

from optimum.quanto import freeze
freeze(model)

H100 基准测试研究

H100 GPU 是一款高性能显卡,专为要求苛刻的 AI 任务而设计,包括对大型模型(如变压器和扩散模型)进行训练和推理。以下是它被选为基准测试的原因:

  • 顶级性能:H100 提供卓越的速度和功能,使其成为处理大型模型(如文本到图像和文本到视频生成管道)所需的复杂操作的理想选择。
  • 支持 FP16此 GPU 可高效处理 FP16(半精度浮点)中的计算,从而减少内存使用量并加快计算速度,而不会显著牺牲准确性。
  • 高级硬件功能:H100 支持针对混合精度训练和推理的优化操作,使其成为旨在减小模型大小同时保持性能的量化技术的绝佳选择。

在这里,我们使用的是 DigitalOcean 旗下 Paperspace 平台的 H100 云服务器。该平台GPU 服务器按秒计费,并提供在线 notebook 环境,一键部署人工智能相关工具、框架与库,并支持模型部署服务,可直接将训练后的模型部署为 API 供其他应用调用。同时,该平台除了提供 H100 以外,还提供 H100x8、A6000、A5000等多种型号的 GPU。

如果需要咨询更多其它型号的 GPU 价格,可访问 DigitalOcean 文档或 Paperspace 官网。如果注册遇到问题,或需要更多存储资源和 GPU 资源,中国地区用户可以联系 DigitalOcean 中国区独家战略合作伙伴卓普云的销售团队和技术支持团队。

言归正传,在基准测试研究中,主要关注的是将新的量化工具 Quanto 应用于扩散模型。虽然量化在大型语言模型 (LLM) 的从业者中广为人知,但它在扩散模型中的使用并不多。Quanto 用于探索它是否可以在这些模型中节省内存,同时几乎不损失质量。

以下是研究内容:

环境设置:

  • CUDA 12.2:使用的 CUDA 版本,对于在 H100 GPU 上运行计算至关重要。
  • PyTorch 2.4.0:用于模型训练和推理的深度学习框架。
  • 扩散器:用于构建和运行扩散模型的库,从特定提交安装以确保一致性。
  • Quanto:量化工具,也从特定提交安装。

  • FP16 中的计算:默认情况下,所有计算均在 FP16 中执行,以减少内存使用量并提高速度。但是,VAE(变分自动编码器)未量化,以避免潜在的数值不稳定性。

  • 关注关键管道:在本研究中,从扩散器中选择了三个基于变压器的扩散管道。之所以选择这些管道,是因为它们代表了一些最先进的文本到图像生成模型,因此非常适合测试 Quanto 在保持模型质量的同时减少内存使用量的有效性。
  • PixArt-Sigma
  • 稳定扩散 3
  • Aura Flow

通过使用 H100 GPU 并专注于这些关键模型,该研究旨在展示 Quanto 在量化方面弥合 LLM 和扩散模型之间差距的潜力,从而显著节省内存,同时将对性能的影响降至最低。

模型检查点# 参数(十亿)
PixArthttps://huggingface.co/PixArt-alpha/PixArt-Sigma-XL-2-1024-MS0.611
Stable Diffusion 3https://huggingface.co/stabilityai/stable-diffusion-3-medium-diffusers2.028
Aura Flowhttps://huggingface.co/fal/AuraFlow/6.843

应用 Quanto 量化扩散管道

使用 Quanto 量化模型遵循一个简单的过程:

首先安装所需的软件包,这里我们安装 transformers、quanto、torch、sentencepiece。但请注意,您可能需要根据需要安装更多软件包。

!pip install transformers==4.35.0
!pip install quanto==0.0.11
!pip install torch==2.1.1
!pip install sentencepiece==0.2.0
!pip install optimum-quanto

在要量化的模块上调用 quantize() 函数,指定要量化的组件。在这种情况下,只有参数被量化,而激活保持不变。参数被量化为 FP8 数据类型。最后,调用 freeze() 函数用新量化的参数替换原始参数。

from optimum.quanto import freeze, qfloat8, quantize
from diffusers import PixArtSigmaPipeline
import torch
pipeline = PixArtSigmaPipeline.from_pretrained("PixArt-alpha/PixArt-Sigma-XL-2-1024-MS", torch_dtype=torch.float16
).to("cuda")
quantize(pipeline.transformer, weights=qfloat8)
freeze(pipeline.transformer)

一旦完成,就使用管道。

image = pipeline("ghibli style, a fantasy landscape with castles").images[0]

图:使用 FP8 中的扩散变压器生成的图像

以下代码可用于量化文本编码器。

quantize(pipeline.text_encoder, weights=qfloat8)
freeze(pipeline.text_encoder)

文本编码器同样是一个变换器模型,因此也可以进行量化。通过量化文本编码器和扩散主干,可以显著节省内存。

LLM 管道

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

以下代码将使用 Transformers 库加载预训练语言模型 (Meta-Llama-3-8B)。然后,它使用 Optimum Quanto 的 QuantizedModelForCausalLM 类对模型进行量化,具体来说就是将模型的权重转换为 qint4 数据类型。lm_head(输出层)被排除在量化之外,以保持其精度,从而确保最终输出质量保持较高水平。

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

# quantized model can be saved using save_pretrained
qmodel.save_pretrained('./Llama-3-8B-quantized')

# reload the model using from_pretrained
from optimum.quanto import QuantizedModelForCausalLM
qmodel = QuantizedModelForCausalLM.from_pretrained('Llama-3-8B-quantized')

与 Transformers 的集成

Quanto 与 Hugging Face Transformers 库无缝集成。任何模型都可以通过 QuantoConfig 进行量化。

from transformers import AutoModelForCausalLM, AutoTokenizer, QuantoConfig
model_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
)

💡使用 Quanto,无论使用 CPU/GPU/MPS(Apple Silicon),你都可以量化和运行你的模型。

from transformers import AutoModelForSpeechSeq2Seq
model_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
)

Quanto 中的张量:

  • Quanto 的作用:Quanto 使用特殊的张量(数据结构),对其进行修改以适应较小的数据类型,如 int8 或 float8。这使模型更节省内存,运行速度更快。
  • 转换过程:
  • 对于浮点数,它只使用 PyTorch 的内置转换。
  • 对于整数,它会对数字进行四舍五入以使其适合较小的数据类型。
  • 准确性:Quanto 试图通过避免过多的极端值(太大或太小)来保持转换的准确性,因为这些极端值可能会扭曲模型的性能。
  • 优化操作:使用这些较小的数据类型(较低位宽)可以使模型运行得更快,因为这些类型的操作更快。

Quanto 中的模块:

  • 替换 Torch 模块:Quanto 可以将常规 PyTorch 组件替换为适用于这些较小张量的特殊 Quanto 版本。
  • 权重转换:当模型仍在微调时,权重(模型的可调参数)会动态转换,这可能会使速度稍微变慢。但是一旦模型最终确定(冻结),此转换就会停止。
  • 偏差:偏差(另一组模型参数)不会被转换,因为转换它们会降低准确性或需要非常高的精度,从而导致效率低下。
  • 激活:模型的激活(中间输出)也会转换为较小的数据类型,但只有在校准模型以找到最佳转换设置后才会转换。

可量化的模块:

  • 线性层:这些是模型中的全连接层,其中权重始终量化,但偏差保持原样。
  • Conv2D 层:这些是图像处理中经常使用的卷积层。在这里,权重也始终量化,而偏差则不量化。
  • LayerNorm:这会对模型中的数据进行规范化。在 Quanto 中,输出可以量化,但权重和偏差保持原样。

这种设置允许模型变得更小、更快,同时仍保持良好的准确性。

研究的最终观察结果

量化扩散模型中的文本编码器(例如稳定扩散中使用的模型)会显著影响性能和内存效率。对于使用三个不同文本编码器的稳定扩散 3,与量化这些编码器相关的观察结果如下:

  1. 量化第二个文本编码器这种方法效果不佳,可能是由于第二个编码器的特定特性。
  2. 量化第一个文本编码器 (CLIPTextModelWithProjection):建议使用此选项,并且通常有效,因为第一个编码器的量化在内存节省和性能之间提供了良好的平衡。
  3. 量化第三个文本编码器 (T5EncoderModel):也建议使用此方法。量化第三个编码器可以节省大量内存,而不会显著影响模型的性能。
  4. 量化第一个和第三个文本编码器结合第一个和第三个文本编码器的量化可以成为最大化内存效率同时保持可接受性能水平的良好策略。

在内存节省方面,该表详细说明了通过应用每种量化策略可以节省多少内存,特别关注量化不同文本编码器组合之间的相对利益和权衡(图片来源)

  • 在所有情况下量化扩散变换器可确保观察到的内存节省主要归因于文本编码器量化。
  • 当考虑强大的 GPU(例如 H100 或 4090)时,使用 bfloat16 会更快。
  • 由于高效的整数运算和硬件优化,qint8 通常推理速度更快。
  • 融合 QKV 投影会加厚 int8 内核,从而通过减少运算次数和利用高效的数据处理进一步优化计算。
  • 在 H100 GPU 上使用带有 bfloat16 的 qint4 时,内存使用率会有所提高,因为 qint4 每个值仅使用 4 位,从而减少了存储权重所需的内存量。但是,这是以增加推理延迟为代价的。这是因为 H100 GPU 仍然不支持使用 4 位整数(int4)的计算。尽管权重以压缩的 4 位格式存储,但实际计算仍以 bfloat16(16 位浮点格式)执行,这意味着硬件必须处理更复杂的操作,从而导致处理时间变慢。

结论

Quanto 为 PyTorch 提供了强大的量化后端,通过将权重转换为较低精度格式来优化模型性能。通过支持 qint8 和 qint4 等技术,Quanto 减少了内存消耗并加快了推理速度。此外,Quanto 可在不同设备(CPU、GPU、MPS)上工作,并与各种设置兼容。但是,在 MPS 设备上,使用 float8 会导致错误。

总体而言,Quanto 可以更有效地部署深度学习模型,在内存节省和性能权衡之间取得平衡。

参考文献

  • 使用 Quanto 和扩散器的内存高效扩散变换器
  • Quanto:Optimum 的 PyTorch 量化后端
  • quanto 0.2.0
  • Optimum Quanto Github

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《JavaEE进阶》----3.<SpringBoot项目创建细节大全+打jar包运行>

本篇博客讲解了 创建Spring Boot项目的各种方法及创建细节、还有项目中目录和代码的简单介绍、启动项目、换端口号、Web服务器简介、HTTP状态码、以及用Maven打jar包运行。 什么是Spring Spring让开发Java工程项目变得更快、更简单、更安全。 它专注于开发工程时的速度、简化…

Python在神经网络中优化激活函数选择使用详解

概要 在神经网络中,激活函数扮演着至关重要的角色。它的主要作用是引入非线性因素,使得神经网络能够处理复杂的非线性问题。如果没有激活函数,神经网络仅仅是线性模型的堆叠,无法胜任深度学习中的各种任务。本文将深入探讨几种常用的激活函数,包括Sigmoid、Tanh、ReLU及其…

【JVM】垃圾收集器与GC日志(二)

垃圾收集器与GC日志 ZGC收集器(Z Garbage Collector,全并发、超低延迟 10ms) ZGC是一款JDK11中新加入的具有实验性质的低延迟垃圾收集器,ZGC可以说源自于Azul System公司开发的C4(Concurrent Continuously Compacting Collector)收集器 参考文章:http…

5G 4G 空口信令APN携带差异

4G 终端在PDN connectivity request中access_pt_name中携带。 msg_type 208 (0xd0) (PDN connectivity request) lte_esm_msgpdn_connectivity_reqpdn_type 3 (0x3) (Ipv4v6)req_type 1 (0x1) (initial request)info_trans_flag_incl 0 (0x0)access_pt_name_incl 1 (0x1…

基于vue框架的财务室发票管理系统设计与实现946m1(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:财务,发票数据 开题报告内容 基于Vue框架的财务室发票管理系统设计与实现开题报告 一、开题报告名称 基于Vue框架的财务室发票管理系统设计与实现 二、研究背景与意义 在现代企业财务管理中,发票管理是一项至关重要的工…

源代码安全管理:深信达SDC沙盒防泄密软件的创新与应用

在数字化时代,源代码作为软件开发的核心资产,其安全性直接关系到企业的竞争力和市场地位。源代码的泄露不仅可能导致知识产权的损失,还可能引发安全漏洞,给企业带来不可估量的损害。因此,源代码安全管理成为了企业信息…

杰发科技AC7801——Flash模拟EEP内存(2)_备份

1. 默认配置在1000个地址存储1000个数据 配置如下 计算地址 查看地址内容,等到打印完成 计算符合,从0-999共计1000 2. 修改配置在65536地址存储65536个数据 配置还是这个 因为传进去的地址是uint16_t,因此最大值是65536,写65536…

大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

代码随想录 刷题记录-19 动态规划(3)完全背包理论、习题

一、完全背包理论 52. 携带研究材料 有N种物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完…

(二) 初入MySQL 【数据库管理】

一、SQL语言分类 DDL:数据定义语言,用于创建数据库对象,如库、表、索引等 DML:数据操纵语言,用于对表中的数据进行管理,用来插入、删除和修改数据库中的数据 DQL:数据查询语言,用于从数据表中查…

Mybatis:基础巩固-DML

目录 一、概述二、新增三、修改四、删除 一、概述 DML语句主要用来完成对数据的增删改的操作。可以分为以下几类: 新增(INSERT)修改(UPDATE)删除(DELETE) 二、新增 INSERT INTO tb_user(name, …

【MySQL 14】用户管理

文章目录 🌈 一、用户管理⭐ 1. 用户信息⭐ 2. 创建用户⭐ 3. 修改密码⭐ 4. 删除用户 🌈二、数据库的权限⭐ 1. 权限列表⭐ 2. 查看权限⭐ 3. 授予权限⭐ 4. 回收权限 🌈 一、用户管理 MySQL 也会区分普通用户和超级用户。如果只是访问某一…

centos基础设置

1.设置网络 # 配置网络 vi /etc/sysconfig/network-scripts/ifcfg-ens33 #将里面的onboard设置为yes 2.修改计算机名 使用命令行: 打开终端。 使用 hostnamectl 命令可以直接修改主机名。例如,如果您想将主机名更改为 mynewhostname,您可以使…

selenium(一)基于java、元素定位

Selenium自动化 Selenium是一个用于Web应用程序的自动化测试工具。它直接运行在浏览器中,可以模拟用户在浏览器上面的行为操作。 chrome下载 https://www.google.com/chrome/ 下载的结果是 “ChromeSetup.exe”,双击该文件,安装程序会自…

selenium(二)基于java、元素操控、Frame切换、元素等待

元素操控 选择到元素之后,我们的代码会返回元素对应的 WebElement对象,通过这个对象,我们就可以 操控 元素 输入sendKeys 项目实战:在网银环境下载流水[交易明细]的时候,需要指定查询日期,有些银行是可以…

一个简单的CRM客户信息管理系统,提供客户,线索,公海,联系人,跟进信息和数据统计功能(附源码)

前言 在当今快速发展的商业环境中,企业管理面临着种种挑战,尤其是如何有效管理和维护客户关系成为了一个关键问题。现有的一些处理方案往往存在功能分散、操作复杂、数据孤岛等痛点,这不仅影响了工作效率,也难以满足企业对客户关…

仿华为车机功能之--修改Launcher3,实现横向滑动桌面空白处切换壁纸

本功能基于Android13 Launcher3 需求:模仿华为问界车机,实现横向滑动桌面空白处,切换壁纸功能(本质只是切换背景,没有切换壁纸)。 实现效果: 实现思路: 第一步首先得增加手势识别 第二步切换底图,不切换壁纸是因为切换壁纸动作太大,需要调用到WallpaperManager,耗…

【赵渝强老师】构建Docker Swarm集群

在了解了Docker Swarm的体系架构以后,基于已经部署好三台虚拟主机便可以非常容易地构建Swarm集群。下表列出了这三台虚拟机的相关信息。其中:master主机将作为Swarm Manager运行;而node1和node2将作为Swarm Node运行。 视频讲解如下&#xf…

nacos 动态读取nacos配置中心项目配置

实现了项目稳定运行情况下不需要在项目中改配置&#xff0c;直接在nacos中修改更方便。 pom文件&#xff1a; <!--读取bootstrap文件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap…

大数据测试怎么做,数据应用测试、数据平台测试、数据仓库测试

本期内容由中通科技高级质量工程师龙渊在公益讲座中分享&#xff0c;他从大数据测试整体介绍、数据应用测试、数据平台测试以及数据仓库测试等方面&#xff0c;与大家共同探讨了大数据测试的方法实施与落地。 以下是讲座正文&#xff1a; 今天我们分享的内容主要从大数据简介…