Diffusers 文档

流量

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

Flux

Flux 是一系列基于扩散转换器的文本到图像生成模型。要了解有关 Flux 的更多信息,请查看 Flux 创建者 Black Forest Labs 发布的原始博文

Flux 的原始模型检查点可以在这里找到这里。原始推理代码可以在这里找到这里

Flux 在消费级硬件设备上运行可能相当昂贵。但是,您可以执行一系列优化措施,使其运行更快并以更节省内存的方式运行。查看此部分以了解更多详细信息。此外,Flux 可以通过量化来提高内存效率,但会以推理延迟为代价。请参阅此博文以了解更多信息。有关资源的完整列表,请查看此 gist

Flux 有两种变体

  • 时间步长蒸馏 (black-forest-labs/FLUX.1-schnell)
  • 引导蒸馏 (black-forest-labs/FLUX.1-dev)

这两个检查点在使用方面略有不同,我们将在下面详细介绍。

时间步长蒸馏

  • max_sequence_length 不能超过 256。
  • guidance_scale 需要为 0。
  • 由于这是一个时间步长蒸馏模型,因此它受益于更少的采样步骤。
import torch
from diffusers import FluxPipeline

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

prompt = "A cat holding a sign that says hello world"
out = pipe(
    prompt=prompt,
    guidance_scale=0.,
    height=768,
    width=1360,
    num_inference_steps=4,
    max_sequence_length=256,
).images[0]
out.save("image.png")

引导蒸馏

  • 引导蒸馏变体大约需要 50 个采样步骤才能生成高质量的图像。
  • 它对 max_sequence_length 没有任何限制。
import torch
from diffusers import FluxPipeline

pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-dev", torch_dtype=torch.bfloat16)
pipe.enable_model_cpu_offload()

prompt = "a tiny astronaut hatching from an egg on the moon"
out = pipe(
    prompt=prompt,
    guidance_scale=3.5,
    height=768,
    width=1360,
    num_inference_steps=50,
).images[0]
out.save("image.png")

运行 FP16 推理

Flux 可以使用 FP16 生成高质量的图像(即加速 Turing/Volta GPU 上的推理),但产生的输出与 FP32/BF16 不同。问题在于,在 FP16 中运行时,文本编码器中的一些激活必须被裁剪,这会影响整体图像。因此,强制文本编码器使用 FP32 推理可以消除这种输出差异。请参阅此处以了解更多详细信息。

FP16 推理代码

import torch
from diffusers import FluxPipeline

pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-schnell", torch_dtype=torch.bfloat16) # can replace schnell with dev
# to run on low vram GPUs (i.e. between 4 and 32 GB VRAM)
pipe.enable_sequential_cpu_offload()
pipe.vae.enable_slicing()
pipe.vae.enable_tiling()

pipe.to(torch.float16) # casting here instead of in the pipeline constructor because doing so in the constructor loads all models into CPU memory at once

prompt = "A cat holding a sign that says hello world"
out = pipe(
    prompt=prompt,
    guidance_scale=0.,
    height=768,
    width=1360,
    num_inference_steps=4,
    max_sequence_length=256,
).images[0]
out.save("image.png")

FluxTransformer2DModel 的单文件加载

FluxTransformer2DModel 支持加载 Black Forest Labs 提供的原始格式的检查点。当尝试加载社区发布的模型的微调或量化版本时,这也很有用。

根据您使用的 GPU 类型、CUDA 版本和 `torch` 版本,`FP8` 推理可能很脆弱。建议您使用 `optimum-quanto` 库在您的机器上运行 FP8 推理。

以下示例演示了如何在不到 16GB 的 VRAM 上运行 Flux。

首先安装 optimum-quanto

pip install optimum-quanto

然后运行以下示例

import torch
from diffusers import FluxTransformer2DModel, FluxPipeline
from transformers import T5EncoderModel, CLIPTextModel
from optimum.quanto import freeze, qfloat8, quantize

bfl_repo = "black-forest-labs/FLUX.1-dev"
dtype = torch.bfloat16

transformer = FluxTransformer2DModel.from_single_file("https://huggingface.co/Kijai/flux-fp8/blob/main/flux1-dev-fp8.safetensors", torch_dtype=dtype)
quantize(transformer, weights=qfloat8)
freeze(transformer)

text_encoder_2 = T5EncoderModel.from_pretrained(bfl_repo, subfolder="text_encoder_2", torch_dtype=dtype)
quantize(text_encoder_2, weights=qfloat8)
freeze(text_encoder_2)

pipe = FluxPipeline.from_pretrained(bfl_repo, transformer=None, text_encoder_2=None, torch_dtype=dtype)
pipe.transformer = transformer
pipe.text_encoder_2 = text_encoder_2

pipe.enable_model_cpu_offload()

prompt = "A cat holding a sign that says hello world"
image = pipe(
    prompt,
    guidance_scale=3.5,
    output_type="pil",
    num_inference_steps=20,
    generator=torch.Generator("cpu").manual_seed(0)
).images[0]

image.save("flux-fp8-dev.png")

FluxPipeline

class diffusers.FluxPipeline

< >

( scheduler: FlowMatchEulerDiscreteScheduler vae: AutoencoderKL text_encoder: CLIPTextModel tokenizer: CLIPTokenizer text_encoder_2: T5EncoderModel tokenizer_2: T5TokenizerFast transformer: FluxTransformer2DModel )

参数

  • transformer (FluxTransformer2DModel) — 用于对编码图像潜在变量进行去噪的条件 Transformer (MMDiT) 架构。
  • scheduler (FlowMatchEulerDiscreteScheduler) — 与 transformer 结合使用以对编码图像潜在变量进行去噪的调度器。
  • vae (AutoencoderKL) — 用于将图像编码和解码到潜在表示以及从潜在表示解码回图像的变分自动编码器 (VAE) 模型。
  • text_encoder (CLIPTextModel) — CLIP,特别是 clip-vit-large-patch14 变体。
  • text_encoder_2 (T5EncoderModel) — T5,特别是 google/t5-v1_1-xxl 变体。
  • tokenizer (CLIPTokenizer) — 类 CLIPTokenizer 的分词器。
  • tokenizer_2 (T5TokenizerFast) — 类 T5TokenizerFast 的第二个分词器。

用于文本到图像生成的 Flux 管道。

参考:https://blackforestlabs.ai/announcing-black-forest-labs/

__call__

< >

( prompt: Union = None prompt_2: Union = None height: Optional = None width: Optional = None num_inference_steps: int = 28 timesteps: List = None guidance_scale: float = 7.0 num_images_per_prompt: Optional = 1 generator: Union = None latents: Optional = None prompt_embeds: Optional = None pooled_prompt_embeds: Optional = None output_type: Optional = 'pil' return_dict: bool = True joint_attention_kwargs: Optional = None callback_on_step_end: Optional = None callback_on_step_end_tensor_inputs: List = ['latents'] max_sequence_length: int = 512 ) ~pipelines.flux.FluxPipelineOutputtuple

参数

  • prompt (strList[str], 可选) — 指导图像生成的提示或提示。如果未定义,则必须传递 prompt_embeds。代替。
  • prompt_2 (strList[str], 可选) — 要发送到 tokenizer_2text_encoder_2 的提示或提示。如果未定义,则将使用 prompt 代替
  • height (int, 可选,默认为 self.unet.config.sample_size * self.vae_scale_factor) — 生成的图像的高度(以像素为单位)。默认情况下设置为 1024 以获得最佳效果。
  • width (int可选,默认为 self.unet.config.sample_size * self.vae_scale_factor) — 生成图像的像素宽度。为了获得最佳效果,默认设置为 1024。
  • num_inference_steps (int可选,默认为 50) — 降噪步骤的数量。更多的降噪步骤通常会导致更高的图像质量,但会以推理速度变慢为代价。
  • timesteps (List[int]可选) — 用于降噪过程的自定义时间步长,适用于在 set_timesteps 方法中支持 timesteps 参数的调度器。如果未定义,则将使用传递 num_inference_steps 时的默认行为。必须按降序排列。
  • guidance_scale (float可选,默认为 7.0) — 在 Classifier-Free Diffusion Guidance 中定义的引导尺度。guidance_scale 定义为 Imagen 论文 公式 2 中的 w。通过设置 guidance_scale > 1 来启用引导尺度。较高的引导尺度鼓励生成与文本 prompt 密切相关的图像,通常以降低图像质量为代价。
  • num_images_per_prompt (int可选,默认为 1) — 每个提示生成图像的数量。
  • generator (torch.GeneratorList[torch.Generator]可选) — 一个或多个 torch 生成器,用于使生成确定性。
  • latents (torch.FloatTensor可选) — 预生成的噪声潜在变量,从高斯分布中采样,用作图像生成的输入。可用于使用不同的提示调整相同的生成。如果未提供,则将通过使用提供的随机 generator 进行采样来生成潜在变量张量。
  • prompt_embeds (torch.FloatTensor可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如提示加权。如果未提供,则将从 prompt 输入参数生成文本嵌入。
  • pooled_prompt_embeds (torch.FloatTensor可选) — 预生成的池化文本嵌入。可用于轻松调整文本输入,例如提示加权。如果未提供,则将从 prompt 输入参数生成池化文本嵌入。
  • output_type (str可选,默认为 "pil") — 生成图像的输出格式。在 PILPIL.Image.Imagenp.array 之间选择。
  • joint_attention_kwargs (dict, 可选) — 如果指定,则将此 kwargs 字典传递给 AttentionProcessor,如 diffusers.models.attention_processorself.processor 所定义。
  • callback_on_step_end (Callable, 可选) — 在推理过程中每个去噪步骤结束时调用的函数。该函数使用以下参数调用:callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)callback_kwargs 将包含由 callback_on_step_end_tensor_inputs 指定的所有张量的列表。
  • callback_on_step_end_tensor_inputs (List, 可选) — callback_on_step_end 函数的张量输入列表。列表中指定的张量将作为 callback_kwargs 参数传递。您只能包含管道类 ._callback_tensor_inputs 属性中列出的变量。
  • max_sequence_length (int,默认为 512) — 与 prompt 一起使用的最大序列长度。

返回值

~pipelines.flux.FluxPipelineOutputtuple

如果 return_dict 为 True,则为 ~pipelines.flux.FluxPipelineOutput,否则为 tuple。当返回元组时,第一个元素是一个包含生成图像的列表。

调用管道进行生成时调用的函数。

示例

>>> import torch
>>> from diffusers import FluxPipeline

>>> pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-schnell", torch_dtype=torch.bfloat16)
>>> pipe.to("cuda")
>>> prompt = "A cat holding a sign that says hello world"
>>> # Depending on the variant being used, the pipeline call will slightly vary.
>>> # Refer to the pipeline documentation for more details.
>>> image = pipe(prompt, num_inference_steps=4, guidance_scale=0.0).images[0]
>>> image.save("flux.png")

encode_prompt

< >

( prompt: Union prompt_2: Union device: Optional = None num_images_per_prompt: int = 1 prompt_embeds: Optional = None pooled_prompt_embeds: Optional = None max_sequence_length: int = 512 lora_scale: Optional = None )

参数

  • prompt (strList[str], 可选) — 要编码的提示
  • prompt_2 (strList[str], 可选) — 要发送到 tokenizer_2text_encoder_2 的提示或提示。如果未定义,则在所有文本编码器中使用 prompt device — (torch.device): torch 设备
  • num_images_per_prompt (int) — 每个提示应生成的图像数量
  • prompt_embeds (torch.FloatTensor, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如 提示加权。如果未提供,则将从 prompt 输入参数生成文本嵌入。
  • lora_scale (float, 可选) — 如果加载了 LoRA 层,则此 LoRA 比例将应用于文本编码器所有 LoRA 层。
< > 在 GitHub 上更新