由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")
“`
理解脚本:这里是主要的实现步骤
- 导入必要的库:我们导入了量化、模型加载和GPU处理的库。
- 加载模型:我们将PixArt Sigma模型以半精度(float16)加载到CPU。
- 量化模型:对模型的Transformer和文本编码部分进行量化。这里使用了不同级别的量化:文本编码部分由于较大,使用qint4进行量化。视觉部分如果使用qint8进行量化,整个流水线将使用 7.5G显存,如果不进行量化,将使用约 8.5G显存。
- 移动到GPU:将流水线移动到GPU
.to("cuda")
进行更快的处理。 - 生成图像:使用
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时找到了些乐趣。以下是我的简要步骤总结:
首先是组件列表:
- HTMX和Tailwind:它们就像项目的面貌。HTMX帮助使网站在没有大量额外代码的情况下互动,而Tailwind则赋予它漂亮的外观。
- FastAPI:它接收来自网站的请求并决定如何处理这些请求。
- Celery Worker:这就像是勤劳的工人。它接收FastAPI的指令并实际创建图像。
- Redis Cache/Pub-Sub:这是通信中心。它帮助项目的不同部分互相交流并记住重要信息。
- 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时代的私域流量革命!