Diffusers documentation

FLUX 3 Image Klein

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.43.0).
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