Diffusers documentation

FLUX 3 Image Klein

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

FLUX 3 Image Klein

FLUX 3 Image Klein é um modelo de geração de imagens de 5,6B da Black Forest Labs: um único transformer (Flux3Transformer2DModel) gera imagens a partir de um prompt de texto, sozinho ou junto com uma ou mais imagens de referência. A condicionamento de texto vem do Qwen3-VL, e as imagens usam o autoencoder empacotado FLUX.2 (AutoencoderKLFlux2).

FLUX 3 Image Klein é distribuído como um pipeline modular. Comece com uma geração de imagem a partir de texto:

import torch
from diffusers import ModularPipeline

pipe = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein-base")
pipe.load_components(dtype={"vae": torch.float32, "default": torch.bfloat16})
pipe.to("cuda")

image = pipe(
    prompt="A red fox in a snow-covered forest clearing at golden hour",
    generator=torch.Generator().manual_seed(0),
    output="images",
)[0]
image.save("fox.png")

prompt é a única entrada obrigatória: o pipeline carrega as configurações de amostragem recomendadas (50 etapas, escala de orientação 3.5, deslocamento do agendador 6.93) e gera imagens de 1024 x 1024 por padrão. Ele aceita um prompt por chamada; use num_images_per_prompt para várias imagens do mesmo prompt.

Como você pode ver no exemplo acima, o carregamento e a execução diferem um pouco de um DiffusionPipeline. O carregamento é preguiçoso: from_pretrained() apenas constrói o pipeline, e você chama load_components() para carregar os pesos. Uma chamada retorna o estado do pipeline, e você solicita o que precisa com output: output="images" aqui, ou output=["images", "prompt"] para também obter a legenda que o prompt upsampler escreveu.

Se você está trabalhando com ModularPipeline pela primeira vez, leia o quickstart e Vindo do DiffusionPipeline se você conhece os pipelines padrão. Além do carregamento e das saídas, algumas outras coisas diferem: guidance, callbacks e offloading.

Ampliação de prompt

O prompt importa: o FLUX 3 Image Klein aceita legendas completas de cena que descrevem o sujeito, a composição, a iluminação e a atmosfera, e não prompt curtos; uma solicitação enviada como digitada gera uma saída genérica. É por isso que o pipeline executa o upsampler de prompt primeiro em todas as solicitações, tanto para texto-para-imagem quanto para edição. Trata-se de um modelo separado de 9B da Black Forest Labs (black-forest-labs/flux-3-image-klein-pup) que expande prompt para uma legenda assim antes do codificador de texto, e um prompt curto é tudo o que é necessário.

O prompt upsampler transforma uma solicitação curta, junto com as imagens de referência durante a edição, na legenda completa da cena que o modelo recebe: meio e estilo, cena, iluminação e câmera, cada sujeito com suas cores, materiais e posição no quadro. Um único modelo cobre texto-para-imagem, edição com imagens de referência e layout com caixas. A legenda que ele escreveu retorna como a saída prompt. No exemplo acima, solicite-a junto com as imagens para ver o que o modelo de imagem recebeu:

out = pipe(
    prompt="A red fox in a snow-covered forest clearing at golden hour",
    generator=torch.Generator().manual_seed(0),
    output=["images", "prompt"],
)
print(out["prompt"])
Full-color outdoor wildlife photograph taken from a low eye-level perspective in a snow-covered forest clearing at golden hour. In the center foreground, a red fox stands in profile facing left, its body turned toward the viewer and its head raised as it looks across the clearing. The fox has dense rust-red winter fur, a white throat and chest, black lower legs, pointed ears with dark tips, and a long bushy tail ending in white. ...

A legenda completa tem cerca de 240 palavras; max_new_tokens limita seu comprimento (3584 por padrão).

Você pode imprimir o doc da etapa para ver o que ela recebe e o que ela grava:

print(pipe.blocks.sub_blocks["prompt_upsampler"].doc)
  Inputs:
      prompt (`str`):
          The edit instruction to expand into the full caption (one per call).
      image (`Image | list`, *optional*):
          The reference image(s) of the edit, at most 10; the same ones the pipeline receives.
      boxes (`list`, *optional*):
          Layout boxes, each {'id', 'desc', 'from', 'src_bbox', 'tgt_bbox'} with the boxes as [y_min, x_min, y_max, x_max] in
          0-1: ...
      max_new_tokens (`int`, *optional*, defaults to 3584):
          The most tokens the upsampler may generate for the caption.

  Outputs:
      prompt (`str`):
          The full caption, replacing the request.

Assim como os outros blocos do pipeline, o bloco prompt_upsampler também é executado de forma independente. A maneira recomendada é removê-lo dos blocos: o bloco removido se torna um upsampler autônomo, e os blocos restantes formam um pipeline que recebe a legenda expandida como prompt:

blocks = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein-base").blocks
pup_block = blocks.sub_blocks.pop("prompt_upsampler")

pup = pup_block.init_pipeline("black-forest-labs/flux-3-image-klein-base")
pup.load_components(dtype=torch.bfloat16)
pup.to("cuda")
caption = pup(prompt="A red fox in a snow-covered forest clearing at golden hour", output="prompt")

pipe = blocks.init_pipeline("black-forest-labs/flux-3-image-klein-base")
pipe.load_components(dtype={"vae": torch.float32, "default": torch.bfloat16})
pipe.to("cuda")
image = pipe(prompt=caption, generator=torch.Generator().manual_seed(0), output="images")[0]

Dessa forma, ele pode ser servido como um estágio separado, em sua própria GPU ou atrás de seu próprio endpoint, e uma interface pode exibir a legenda que ele escreveu e permitir que o usuário a edite antes de gerar. Qualquer outro LLM pode assumir o lugar do upsampler, com os mesmos system prompts: forneça system_prompts["t2i"] do repositório do upsampler (ou "i2i", com as referências primeiro na mensagem do usuário) como o system prompt e a solicitação como a mensagem do usuário, e passe a legenda que ele retorna como prompt para pipe.

Imagem para imagem

Passe uma ou mais imagens de referência com image. Uma única referência é mantida inteira: ela é redimensionada apenas acima de 4 megapixels, preenchida até a grade de 16 pixels e a geração usa seu tamanho por padrão, de modo que a edição retorna no tamanho da entrada. Várias referências são ajustadas individualmente para menos de 1 megapixel e recortadas para a grade, e a geração usa o tamanho da primeira por padrão. Um height/width específico substitui o padrão. Descreva a imagem alvo como uma legenda completa da referência com sua edição incorporada, em vez de uma instrução de uma linha, ou deixe que o prompt upsampler a escreva a partir da instrução e das referências:

night = pipe(
    prompt="the same scene at night under a full moon",
    image=image,
    generator=torch.Generator().manual_seed(0),
    output=["images", "prompt"],
)

Com várias referências, refira-se a elas como a primeira imagem, a segunda imagem, … na ordem em que são passadas para image; a legenda as nomeia como <ref_image_0>, <ref_image_1>, … para o modelo de imagem:

combined = pipe(
    prompt="the fox from the first image sitting on the wooden bench from the second image",
    image=[image, bench],
    height=768,
    width=1360,
    output="images",
)[0]

Pass height e/ou width para substituir o tamanho derivado.

Controle de layout

Para posicionar o conteúdo explicitamente, passe boxes: para cada elemento, um id, uma desc curta e um bbox de [y_min, x_min, y_max, x_max] em 0-1 (origem no canto superior esquerdo), para que seja independente do tamanho da saída. O upsampler escreve a legenda ao redor deles, citando cada elemento como <id>, e anexa a tabela de boxes, mantendo os seus exatamente:

boxes = [
    {"id": "balloon_1", "desc": "a red and yellow striped hot-air balloon", "bbox": [0.08, 0.06, 0.48, 0.38]},
    {"id": "balloon_2", "desc": "a small blue hot-air balloon", "bbox": [0.20, 0.62, 0.42, 0.80]},
]
out = pipe(prompt="hot-air balloons over a green valley at sunrise", boxes=boxes, output=["images", "prompt"])

Ao editar, uma caixa nomeia sua origem com from: "target" com um tgt_bbox adiciona um novo elemento ali, "ref_image_0" com um src_bbox e um tgt_bbox move um elemento daquela referência (caixas iguais o mantêm no lugar):

boxes = [{"id": "cactus", "desc": "a small potted cactus", "from": "target", "src_bbox": None, "tgt_bbox": [0.55, 0.62, 0.85, 0.85]}]
out = pipe(prompt="add a small potted cactus in the marked spot", image=mug, boxes=boxes, output=["images", "prompt"])

boxes = [{"id": "knight", "desc": "the knight figure", "from": "ref_image_0", "src_bbox": [0.50, 0.15, 0.85, 0.35], "tgt_bbox": [0.19, 0.06, 0.54, 0.26]}]
out = pipe(prompt="move the knight up and to the left, keep the rest unchanged", image=knight, boxes=boxes, output=["images", "prompt"])

A legenda que o modelo de imagem lê tem os elementos marcados com <id> no texto e a tabela anexada como JSON, com as caixas em um canvas de 0 a 1000; imprima a saída de prompt para vê-la. Uma legenda escrita manualmente nesse formato vai para o pipeline sem a etapa, como em Prompt upsampling.

Escala de orientação

O pipeline aplica a orientação sem classificador por meio de seu componente guider e não aceita um argumento guidance_scale no momento da chamada. O guider padrão é ClassifierFreeGuidance com guidance_scale=3.5, a configuração recomendada para ambos os fluxos de trabalho. Para alterá-lo, crie uma cópia atualizada do guider:

pipe.guider = pipe.guider.new(guidance_scale=5.0)

Consulte o guia de guias para alternar para um método de orientação diferente.

Modelo destilado por etapa

O checkpoint destilado por etapas gera em 16 passos sem classifier-free guidance. Seu transformer é um mapa de fluxo: em cada passo, ele recebe o timestep atual e aquele para o qual o passo salta. Ele é carregado como o modelo base (o modular_model_index.json do repositório resolve para Flux3DistilledModularPipeline e Flux3DistilledAutoBlocks); o pipeline não possui guider e não aceita negative_prompt:

pipe = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein")
pipe.load_components(dtype=torch.bfloat16)
pipe.to("cuda")

image = pipe(prompt=prompt, generator=torch.Generator().manual_seed(0), output="images")[0]

Ele atende aos mesmos dois fluxos de trabalho que o modelo base. num_inference_steps tem o valor padrão de 16; o modelo é treinado para 4 a 16 etapas.

Geração reproduzível

Um generator fixa o ruído que o pipeline sorteia (veja Reprodutibilidade). Para reutilizar um ruído sorteado em outro lugar, passe-o como latents com a forma (batch_size, 128, height // 16, width // 16). Por exemplo, a implementação da BFL sorteia seu ruído como tokens de imagem na CPU e o converte para bf16; isso reproduz sua amostra para uma semente dada:

height, width = 1024, 1024
h, w = height // 16, width // 16

noise = torch.randn((h * w, 128), generator=torch.Generator().manual_seed(0)).to(torch.bfloat16)
latents = noise.T.reshape(1, 128, h, w)

image = pipe(prompt=prompt, latents=latents, height=height, width=width, output="images")[0]

Fluxos de trabalho

O pipeline atende a dois fluxos de trabalho, text2image e image_conditioned; o que é executado é selecionado pelas entradas (image seleciona image-to-image). from_pretrained() também pode construir um pipeline para um fluxo de trabalho com o argumento workflow, que então espera e carrega apenas os componentes necessários para esse fluxo de trabalho:

from diffusers.modular_pipelines import Flux3AutoBlocks

print(Flux3AutoBlocks().available_workflows)
# ["text2image", "image_conditioned"]

t2i = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein-base", workflow="text2image")
print(t2i.blocks.doc)

Callbacks por etapa

Para usar uma função de callback existente, insira um bloco no loop de desruidificação. O guia de callbacks tem um exemplo simples com o bloco CallbackOnStepEnd e o auxiliar walk_denoise_loops:

blocks = Flux3AutoBlocks()  # or Flux3DistilledAutoBlocks
for loop in walk_denoise_loops(blocks):
    loop.sub_blocks["callback"] = CallbackOnStepEnd()
pipe = blocks.init_pipeline("black-forest-labs/flux-3-image-klein-base")

image = pipe(prompt=caption, callback_on_step_end=my_callback, output="images")[0]

Para interromper precocemente, lance uma exceção a partir do callback; não existe a flag interrupt.

Memória

Carregar tudo em bf16 consome cerca de 39 GB de pesos: o transformer tem 5,5B parâmetros, o codificador de texto Qwen3-VL-4B tem 4B e o prompt upsampler tem 9B (cerca de 19 GB por si só), com o VAE de imagem em fp32. Um pipeline construído sem a etapa de upsampler (veja lá) carrega cerca de 20 GB. Para GPUs com menos memória, habilite o offloading de componentes; o gerenciador move os componentes entre a CPU e a GPU conforme cada etapa os necessita, incluindo o upsampler:

from diffusers import ComponentsManager, ModularPipeline

manager = ComponentsManager()
pipe = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein-base", components_manager=manager)
pipe.load_components(dtype={"vae": torch.float32, "default": torch.bfloat16})
manager.enable_auto_cpu_offload(device="cuda")

Carregamento de arquivo único

Flux3Transformer2DModel carrega o transformer diretamente de um pacote de modelo da Black Forest Labs com from_single_file(). O pacote config.json não é lido; passe a configuração do diffusers com config e subfolder.

import torch
from diffusers import Flux3Transformer2DModel, ModularPipeline

transformer = Flux3Transformer2DModel.from_single_file(
    "https://huggingface.co/black-forest-labs/flux-3-image-klein-base/blob/main/model.safetensors",
    config="black-forest-labs/flux-3-image-klein-base",
    subfolder="transformer",
    dtype=torch.bfloat16,
)

pipe = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein-base")
pipe.load_components(dtype={"vae": torch.float32, "default": torch.bfloat16})
pipe.update_components(transformer=transformer)
pipe.to("cuda")

Carregue primeiro os outros componentes pelo nome: load_components() sem names também carregaria o transformer do repositório do pipeline.

O carregamento dos checkpoints de arquivo único FP8r e NVFP4 também é suportado. Ambos são carregados por meio da mesma chamada com um BFLQuantizationConfig. Consulte o guia de quantização BFL para os requisitos de kernel de cada esquema.

from diffusers import BFLQuantizationConfig

transformer = Flux3Transformer2DModel.from_single_file(
    "https://huggingface.co/black-forest-labs/flux-3-image-klein-base/blob/main/variants/nvfp4/model.safetensors",
    config="black-forest-labs/flux-3-image-klein-base",
    subfolder="transformer",
    quantization_config=BFLQuantizationConfig(compute_dtype=torch.bfloat16),
    dtype=torch.bfloat16,
)

Ao carregar os checkpoints destilados por etapa, precisamos de seus configs (flow_map=True):

transformer = Flux3Transformer2DModel.from_single_file(
    "https://huggingface.co/black-forest-labs/flux-3-image-klein/blob/main/variants/nvfp4/model.safetensors",
    config="black-forest-labs/flux-3-image-klein",
    subfolder="transformer",
    quantization_config=BFLQuantizationConfig(compute_dtype=torch.bfloat16),
    dtype=torch.bfloat16,
)

Flux3ModularPipeline

classe diffusers.Flux3ModularPipeline

< >

( blocks: diffusers.modular_pipelines.modular_pipeline.ModularPipelineBlocks | None = Nonepretrained_model_name_or_path: str | os.PathLike | None = Nonecomponents_manager: diffusers.modular_pipelines.components_manager.ComponentsManager | None = Nonecollection: str | None = Noneworkflow: str | None = Nonemodular_config_dict: dict[str, typing.Any] | None = Noneconfig_dict: dict[str, typing.Any] | None = None**kwargs )

Uma ModularPipeline para FLUX.3.

Flux3AutoBlocks

classe diffusers.Flux3AutoBlocks

< >

( )

Auto blocks que executam a geração de texto para imagem e imagem para imagem usando FLUX.3. O prompt passa primeiro pelo prompt upsampler; remova a etapa prompt_upsampler para codificá-lo como fornecido.

Fluxos de trabalho suportados:

  • text2image: requer prompt
  • image_conditioned: requer prompt, image

Componentes: prompt_upsampler (Qwen3_5ForConditionalGeneration): O prompt upsampler. prompt_upsampler_processor (AutoProcessor): Seu processor. text_encoder (Qwen3VLForConditionalGeneration) tokenizer (AutoProcessor) image_processor (Flux3ImageProcessor) vae (AutoencoderKLFlux2) transformer (Flux3Transformer2DModel) scheduler (FlowMatchEulerDiscreteScheduler) guider (ClassifierFreeGuidance)

Entradas: prompt (str): A instrução de edição a ser expandida para a legenda completa (uma por chamada). image (Image | list, opcional): A(s) imagem(ns) de referência da edição, no máximo 10; as mesmas que o pipeline recebe. boxes (list, opcional): Caixas de layout, cada uma {‘id’, ‘desc’, ‘from’, ‘src_bbox’, ‘tgt_bbox’} com as caixas como [y_min, x_min, y_max, x_max] em 0-1: ‘from’: ‘target’ com tgt_bbox adiciona um elemento ali, ‘from’: ‘ref_image_0’, … com src_bbox e tgt_bbox move um de uma imagem de referência. max_new_tokens (int, opcional, padrão 3584): O número máximo de tokens que o upsampler pode gerar para a legenda. negative_prompt (str, opcional): O prompt que não deve guiar a geração max_sequence_length (int, opcional, padrão 8192): Número máximo de tokens do prompt; prompts mais longos são truncados. text_encoder_out_layers (tuple, opcional, padrão (4, 8, 12, 16, 20, 24, 28, 32)): Índices das camadas ocultas do text-encoder cujos estados são empilhados para formar os embeddings de texto num_images_per_prompt (int, opcional, padrão 1): O número de imagens a gerar por prompt. image_cond_latents (list, opcional): Latents empacotados normalizados das imagens de referência, um tensor de forma (B, C, height_i//16, width_i//16) por imagem height (int, opcional, padrão None ou 1024, dependendo do fluxo de trabalho): A altura em pixels da imagem gerada; padrão para a própria altura da primeira imagem de referência width (int, opcional, padrão None ou 1024, dependendo do fluxo de trabalho): A largura em pixels da imagem gerada; padrão para a própria largura da primeira imagem de referência reference_crop (list | NoneType, opcional): Por referência, a caixa da referência dentro do seu canvas com padding ou None, da etapa de pré-processamento latents (Tensor): Latents ruidosos pré-gerados para a geração de imagem. generator (Generator, opcional): Gerador do Torch para geração determinística. num_inference_steps (int): O número de etapas de remoção de ruído. timesteps (Tensor): Timesteps para o processo de remoção de ruído. (sobrepõe num_inference_steps quando fornecido) sigmas (list, opcional): Sigmas personalizados para o processo de remoção de ruído. (sobrepõe num_inference_steps quando fornecido) *denoiser_input_fields (None,opcional): entradas condicionais do modelo para o denoiser: por exemplo, prompt_embeds, negative_prompt_embeds, etc. attention_kwargs (dict,opcional): Kwargs adicionais para os processadores de atenção. output_type (str,opcional*, padrão pil): Formato de saída: ‘pil’, ‘np’, ‘pt’.

Saídas: images (list): Imagens geradas. latents (Tensor): Latentes dessonificados.

Flux3DistilledAutoBlocks

classe diffusers.Flux3DistilledAutoBlocks

< >

( )

Auto blocks que executam a geração de texto para imagem e imagem para imagem usando o modelo FLUX.3 destilado por etapas (16 etapas, sem classifier-free guidance). O prompt passa primeiro pelo prompt upsampler; remova a etapa prompt_upsampler para codificá-lo como fornecido.

Fluxos de trabalho suportados:

  • text2image: requer prompt
  • image_conditioned: requer prompt, image

Componentes: prompt_upsampler (Qwen3_5ForConditionalGeneration): O prompt upsampler. prompt_upsampler_processor (AutoProcessor): Seu processador. text_encoder (Qwen3VLForConditionalGeneration) tokenizer (AutoProcessor) image_processor (Flux3ImageProcessor) vae (AutoencoderKLFlux2) transformer (Flux3Transformer2DModel) scheduler (FlowMatchEulerDiscreteScheduler)

Entradas: prompt (str): A instrução de edição a ser expandida para a legenda completa (uma por chamada). image (Image | list, opcional): A(s) imagem(ns) de referência da edição, no máximo 10; as mesmas que o pipeline recebe. boxes (list, opcional): Caixas de layout, cada uma {‘id’, ‘desc’, ‘from’, ‘src_bbox’, ‘tgt_bbox’} com as caixas como [y_min, x_min, y_max, x_max] em 0-1: ‘from’: ‘target’ com tgt_bbox adiciona um elemento ali, ‘from’: ‘ref_image_0’, … com src_bbox e tgt_bbox move um de uma imagem de referência. max_new_tokens (int, opcional, padrão 3584): O número máximo de tokens que o upsampler pode gerar para a legenda. max_sequence_length (int, opcional, padrão 8192): Número máximo de tokens do prompt; prompts mais longos são truncados. text_encoder_out_layers (tuple, opcional, padrão (4, 8, 12, 16, 20, 24, 28, 32)): Índices das camadas ocultas do text-encoder cujos estados são empilhados para formar os text embeddings num_images_per_prompt (int, opcional, padrão 1): O número de imagens a serem geradas por prompt. image_cond_latents (list, opcional): Latents empacotados normalizados das imagens de referência, um tensor de forma (B, C, height_i//16, width_i//16) por imagem height (int, opcional, padrão None ou 1024, dependendo do workflow): A altura em pixels da imagem gerada; padrão para a própria altura da primeira imagem de referência width (int, opcional, padrão None ou 1024, dependendo do workflow): A largura em pixels da imagem gerada; padrão para a própria largura da primeira imagem de referência reference_crop (list | NoneType, opcional): Por referência, a caixa da referência dentro do seu canvas com padding ou None, da etapa de pré-processamento latents (Tensor): Latents ruidosos pré-gerados para a geração de imagem. generator (Generator, opcional): Gerador do Torch para geração determinística. num_inference_steps (int): O número de etapas de remoção de ruído. timesteps (Tensor): Timesteps para o processo de remoção de ruído. (sobrepõe num_inference_steps quando fornecido) sigmas (list, opcional): Sigmas personalizados para o processo de remoção de ruído. (sobrepõe num_inference_steps quando fornecido) *denoiser_input_fields (None,opcional): entradas condicionais do modelo para o denoiser: por exemplo, prompt_embeds, negative_prompt_embeds, etc. output_type (str,opcional*, padrão pil): Formato de saída: ‘pil’, ‘np’, ‘pt’.

Saídas: images (list): Imagens geradas. latents (Tensor): Latentes dessonificados.

Flux3DistilledModularPipeline

classe diffusers.Flux3DistilledModularPipeline

< >

( blocks: diffusers.modular_pipelines.modular_pipeline.ModularPipelineBlocks | None = Nonepretrained_model_name_or_path: str | os.PathLike | None = Nonecomponents_manager: diffusers.modular_pipelines.components_manager.ComponentsManager | None = Nonecollection: str | None = Noneworkflow: str | None = Nonemodular_config_dict: dict[str, typing.Any] | None = Noneconfig_dict: dict[str, typing.Any] | None = None**kwargs )

Uma ModularPipeline para o modelo FLUX.3 com destilação de etapas (16 etapas, sem classifier-free guidance).

Update on GitHub