在 Python 中运行 FLUX.1-dev GGUF Q8

使用GGUF量化加速FLUX.1-dev

目录

FLUX.1-dev 是一款功能强大的文本到图像模型,能够生成令人惊叹的结果,但其24GB以上的内存需求使得在许多系统上运行变得具有挑战性。 FLUX.1-dev的GGUF量化版本 提供了一种解决方案,将内存使用量减少约50%,同时保持出色的图像质量。

example output Q8 quantized FLUX.1-dev - asic 此图像使用Q8量化格式的GGUF FLUX.1-dev模型生成,展示了即使在内存占用减少的情况下,图像质量仍然得以保持。

什么是GGUF量化?

GGUF(GPT生成的统一格式)是一种最初为语言模型开发的量化格式,但现在也支持如FLUX这样的扩散模型。量化通过以较低精度格式(8位、6位或4位)而不是完整的16位或32位精度存储权重来减小模型大小。

对于FLUX.1-dev,变压器组件(模型中最大的部分)可以进行量化,使用Q8_0量化可将内存占用从约24GB减少到12GB,使用更激进的量化级别甚至可以进一步降低。

GGUF量化的优势

使用GGUF量化FLUX模型的主要优势包括:

  • 减少内存使用:将VRAM需求减少一半,使FLUX.1-dev在更多硬件上可用
  • 保持质量:Q8_0量化在视觉上几乎没有差异,保持了图像质量
  • 加载速度更快:由于文件大小较小,量化模型加载速度更快
  • 降低功耗:减少内存使用意味着在推理过程中功耗更低

在我们的测试中,量化模型使用的VRAM约为12-15GB,而完整模型需要24GB以上,而生成时间保持相似。

安装和设置

要使用GGUF量化FLUX.1-dev,除了标准的diffusers依赖项外,还需要gguf包。如果您已经在使用FLUX进行文本到图像生成,您已经熟悉基本设置。

如果您使用的是uv作为Python包管理器,可以使用以下命令安装所需包:

uv pip install -U diffusers torch transformers gguf

或者使用标准的pip:

pip install -U diffusers torch transformers gguf

实现

使用GGUF量化模型时的关键区别在于,您需要使用FluxTransformer2DModel.from_single_file()GGUFQuantizationConfig单独加载变压器,然后将其传递给管道。如果您需要Python语法的快速参考,请查看Python速查表。以下是一个完整的可运行示例:

import os
import torch
from diffusers import FluxPipeline, FluxTransformer2DModel, GGUFQuantizationConfig

# 路径
gguf_model_path = "/path/to/flux1-dev-Q8_0.gguf"
base_model_path = "/path/to/FLUX.1-dev-config"  # 仅配置文件

# 加载GGUF量化变压器
print(f"从: {gguf_model_path} 加载GGUF量化变压器")
transformer = FluxTransformer2DModel.from_single_file(
    gguf_model_path,
    quantization_config=GGUFQuantizationConfig(compute_dtype=torch.bfloat16),
    config=base_model_path,
    subfolder="transformer",
    torch_dtype=torch.bfloat16,
)

# 使用量化变压器创建管道
print(f"使用基础模型: {base_model_path} 创建管道")
pipe = FluxPipeline.from_pretrained(
    base_model_path,
    transformer=transformer,
    torch_dtype=torch.bfloat16,
)

# 启用CPU卸载(使用GGUF时必需)
pipe.enable_model_cpu_offload()
# 注意:enable_sequential_cpu_offload() 与GGUF不兼容

# 生成图像
prompt = "夕阳下带有霓虹灯的未来城市景观"
image = pipe(
    prompt,
    height=496,
    width=680,
    guidance_scale=3.5,
    num_inference_steps=60,
    max_sequence_length=512,
    generator=torch.Generator("cpu").manual_seed(42)
).images[0]

image.save("output.jpg")

重要注意事项

模型配置文件

使用GGUF量化时,您仍然需要原始FLUX.1-dev模型的模型配置文件。这些包括:

  • model_index.json - 管道结构
  • 组件配置(变压器、text_encoder、text_encoder_2、vae、scheduler)
  • 分词器文件
  • text_encoder和vae权重(这些未被量化)

变压器权重来自GGUF文件,但所有其他组件都需要原始模型文件。

CPU卸载兼容性

重要enable_sequential_cpu_offload()与GGUF量化模型不兼容,会导致KeyError: None错误。我正在使用enable_model_cpu_offload()来处理量化变压器。

量化级别

FLUX.1-dev的可用量化级别包括:

  • Q8_0:最佳质量,约14-15GB内存(推荐)
  • Q6_K:良好平衡,约12GB内存
  • Q4_K:最大压缩,约8GB内存(我认为这会影响质量)

对于大多数使用情况,Q8_0在内存节省和图像质量之间提供了最佳平衡。

性能比较

在我们的测试中,使用相同的提示和设置:

模型 VRAM使用 生成时间 质量
完整FLUX.1-dev 24GB 我没有这么大的GPU 优秀(我认为)
完整FLUX.1-dev ~3GB(使用sequential_cpu_offload()) ~329秒 优秀
GGUF Q8_0 ~14-15GB ~98秒 !!! 优秀
GGUF Q6_K ~10-12GB ~116秒 非常好

由于量化模型现在需要更少的CPU卸载,其生成速度比完整模型快三倍以上,同时使用显著更少的内存,使其在VRAM有限的系统上变得实用。

我使用以下提示测试了两种模型:

一个未来主义的变压器推理ASIC芯片特写,带有复杂的电路,密集的矩阵乘法单元和低精度ALU发出蓝色光芒,周围是片上SRAM缓冲区和量化管道,以超详细的真实风格渲染,采用冷而临床的照明方案。

FLUX.1-dev Q8的示例输出是本文的封面图片 - 请参见上方。

非量化FLUX.1-dev的示例输出如下:

example image produced by non-quantized FLUX.1-dev - asic

我没有看到质量上的明显差异。

结论

GGUF量化使FLUX.1-dev能够更广泛地在各种硬件上运行,同时保持模型以高质量图像生成而闻名的特性。通过将内存需求减少约50%,您可以在更经济实惠的硬件上运行最先进的文本到图像生成,而不会显著影响质量。

使用diffusers库实现起来非常直接,只需对标准FLUX管道设置进行小幅更改即可。对于大多数用户,Q8_0量化在内存效率和图像质量之间提供了最佳平衡。

如果您正在使用FLUX.1-Kontext-dev进行图像增强,未来可能会提供类似的量化技术。

相关文章

参考文献