在低显存GPU上运行PixArt-Σ/Flux.1图像生成:Python简短教程

发布日期: 2024年8月28日 来源:Towards Data Science

由PixArt-Σ在本地生成,所需显存不超过8Gb。

图像生成工具的热度从未如此高涨,而且它们也变得越来越强大。像PixArt Sigma和Flux.1这样的模型处于领先地位,这得益于它们的开源权重模型和宽松的许可协议。这种设置允许进行创造性的尝试,包括在不共享计算机外部数据的情况下训练LoRA模型。

然而,如果你使用的是较旧或显存较少的GPU,使用这些模型可能会有些挑战。通常在质量、速度和显存使用之间存在权衡。在这篇博文中,我们将重点优化速度和减少显存使用,同时尽量保持质量。这种方法在PixArt上效果尤其好,因为它模型较小,但在Flux.1上的效果可能有所不同。最后,我会分享一些针对Flux.1的替代解决方案。

PixArt Sigma和Flux.1都是基于Transformer的,这意味着它们可以利用大型语言模型(LLM)使用的量化技术。量化涉及将模型组件压缩,从而占用更少的内存。这允许你将所有模型组件同时保存在GPU显存中,生成速度会比在GPU和CPU之间移动权重的方法更快,因为后者会减慢处理速度。

让我们开始设置环境吧!

设置本地环境

首先,确保你已经安装了Nvidia驱动程序和Anaconda。

接下来,创建一个Python环境并安装所有主要需求:

conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia 然后安装Diffusers和Quanto库:

pip install pillow==10.3.0 loguru~=0.7.2 optimum-quanto==0.2.4 diffusers==0.30.0 transformers==4.44.2 accelerate==0.33.0 sentencepiece==0.2.0 量化代码


以下是一个让你入门的PixArt-Sigma简单脚本:

“`
from optimum.quanto import qint8, qint4, quantize, freeze

from diffusers import PixArtSigmaPipeline

import torch

pipeline = PixArtSigmaPipeline.from_pretrained(

“PixArt-alpha/PixArt-Sigma-XL-2-1024-MS”, torch_dtype=torch.float16

)

quantize(pipeline.transformer, weights=qint8)

freeze(pipeline.transformer)

quantize(pipeline.text_encoder, weights=qint4, exclude=“proj_out”)

freeze(pipeline.text_encoder)

pipe = pipeline.to(“cuda”)

for i in range(2):

generator = torch.Generator(device=“cpu”).manual_seed(i)

prompt = "Cyberpunk cityscape, small black crow, neon lights, dark alleys, skyscrapers, futuristic, vibrant colors, high contrast, highly detailed"

image = pipe(prompt, height=512, width=768, guidance_scale=3.5, generator=generator).images[0]

image.save(f"Sigma_{i}.png")

“`
理解脚本:这里是主要的实现步骤

  1. 导入必要的库:我们导入了量化、模型加载和GPU处理的库。
  2. 加载模型:我们将PixArt Sigma模型以半精度(float16)加载到CPU。
  3. 量化模型:对模型的Transformer和文本编码部分进行量化。这里使用了不同级别的量化:文本编码部分由于较大,使用qint4进行量化。视觉部分如果使用qint8进行量化,整个流水线将使用 7.5G显存,如果不进行量化,将使用约 8.5G显存
  4. 移动到GPU:将流水线移动到GPU .to("cuda") 进行更快的处理。
  5. 生成图像:使用 pipe 根据给定的提示生成图像并保存输出。

运行脚本

保存脚本并在相应环境中运行,您将看到基于提示“赛博朋克城市景观,小黑乌鸦,霓虹灯,黑暗的小巷,摩天大楼,未来主义,鲜艳的色彩,高对比度,高度细节”的图像生成,并保存为 sigma_1.png。在RTX 3080 GPU上生成图像需要 6秒钟

由 PixArt-Σ 本地生成

您可以使用Flux.1 Schnell实现类似的结果,尽管它包含更多组件,但这需要更激进的量化,这会显著降低质量(除非您拥有更多的显存,例如16或25 GB)。

“`
import torch

from optimum.quanto import qint2, qint4, quantize, freeze

from diffusers.pipelines.flux.pipeline_flux import FluxPipeline

pipe = FluxPipeline.from_pretrained(“black-forest-labs/FLUX.1-schnell”, torch_dtype=torch.bfloat16)

quantize(pipe.text_encoder, weights=qint4, exclude=“proj_out”)

freeze(pipe.text_encoder)

quantize(pipe.text_encoder_2, weights=qint2, exclude=“proj_out”)

freeze(pipe.text_encoder_2)

quantize(pipe.transformer, weights=qint4, exclude=“proj_out”)

freeze(pipe.transformer)

pipe = pipe.to(“cuda”)

for i in range(10):

generator = torch.Generator(device=“cpu”).manual_seed(i)

prompt = “赛博朋克城市景观,小黑乌鸦,霓虹灯,黑暗的小巷,摩天大楼,未来主义,鲜艳的色彩,高对比度,高度细节”

image = pipe(prompt, height=512, width=768, guidance_scale=3.5, generator=generator, num_inference_steps=4).images[0]

image.save(f"Schnell_{i}.png")

“`

由 Flux.1 Schnell 本地生成: 由于过度量化导致质量较差和提示词的遵循度较低

我们可以看到,将文本编码器量化到qint2和视觉变压器量化到qint8可能过于激进,显著影响了Flux.1 Schnell的质量。

以下是运行Flux.1 Schnell的一些替代方案:

如果PixArt-Sigma不能满足您的需求,而您又没有足够的显存运行Flux.1以获得足够的质量,那么您有两个主要选项:

  • ComfyUI或Forge:这些是爱好者使用的GUI工具,它们主要牺牲速度来提高质量。
  • Replicate API:每次生成Schnell图像的成本为0.003美元。

部署

我在一台旧机器上部署PixArt Sigma时找到了些乐趣。以下是我的简要步骤总结:

首先是组件列表:

  1. HTMX和Tailwind:它们就像项目的面貌。HTMX帮助使网站在没有大量额外代码的情况下互动,而Tailwind则赋予它漂亮的外观。
  2. FastAPI:它接收来自网站的请求并决定如何处理这些请求。
  3. Celery Worker:这就像是勤劳的工人。它接收FastAPI的指令并实际创建图像。
  4. Redis Cache/Pub-Sub:这是通信中心。它帮助项目的不同部分互相交流并记住重要信息。
  5. GCS(谷歌云存储):这是我们存储完成的图像的地方。

现在,它们如何协同工作?下面是一个简单的概述:

  • 当你访问网站并发出请求时,HTMX和Tailwind确保页面看起来很好。
  • FastAPI接收请求,并通过Redis告诉Celery Worker要生成什么样的图像。
  • Celery Worker开始工作,创建图像。
  • 图像生成后会存储在GCS中,便于访问。

应用程序演示

总结

通过量化模型组件,我们可以显著减少VRAM的使用,同时保持良好的图像质量并提高生成速度。此方法对于类似PixArt Sigma的模型尤其有效。对于Flux.1,尽管结果可能有所不同,但量化的原理依然适用。

参考资料:

  • https://huggingface.co/blog/quanto-diffusers
  • https://lightning.ai/lightning-ai/studios/deploy-an-image-generation-api-with-flux

总结:

近期,图像生成工具如PixArt Sigma和Flux.1迅速走红,凭借其开源权重模型和宽松的许可协议,用户可以进行创造性的尝试,尤其是在本地环境中使用较少显存的情况下。对于使用较旧或显存较少的GPU,我们可以通过量化技术来优化显存使用和提升生成速度。本文介绍了如何使用量化技术来压缩模型组件,从而在不牺牲图像质量的情况下减少显存使用。具体操作包括安装相关环境、加载模型、量化模型以及在GPU上进行处理。

为了实现高效的图像生成,提高显存利用率,文中给出了具体的量化步骤,如对模型的Transformer和文本编码部分进行量化,使用不同级别的量化来实现显存的最小化。此外,还分享了Flux.1的替代方案,适用于显存较大的GPU,以保持图像质量。

通过这些优化方法,无论是选择PixArt Sigma还是Flux.1模型,用户都能在低显存环境中快速生成高质量图像。这种方法不仅适用图像生成领域,同样适用于其他需要高计算资源支持的AI应用。

用光年AI,轻松提升私域流量转化率,赢得市场先机!光年AI通过整合主流AI平台及自研技术,提供高效、智能的流量增长解决方案,无论是图像生成还是营销管理,均能显著提升工作效率和客户满意度。选择光年AI,让您的私域流量增长无忧,开启AI时代的私域流量革命!