Diffusers documentation

DiffusionGemma

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

DiffusionGemma

DiffusionGemma é um modelo de linguagem encoder-decoder de difusão em blocos. Um encoder causal lê o prompt limpo (e quaisquer blocos gerados anteriormente) para um cache KV, e um decoder bidirecional remove o ruído de uma “tela” de tamanho fixo com canvas_length tokens, fazendo cross-attention para esse cache. A geração alterna um loop autoregressivo externo sobre as telas com um loop interno de remoção de ruído, em que cada etapa amostra tokens candidatos, confirma os mais confiantes via BlockRefinementScheduler em modo de corrupção uniforme e re-aplica ruído aos demais. O próprio modelo está em transformers como DiffusionGemmaForBlockDiffusion; o checkpoint publicado é google/diffusiongemma-26B-A4B-it.

Uso

import torch
from transformers import AutoProcessor, DiffusionGemmaForBlockDiffusion

from diffusers import BlockRefinementScheduler, DiffusionGemmaPipeline

model_id = "google/diffusiongemma-26B-A4B-it"
model = DiffusionGemmaForBlockDiffusion.from_pretrained(model_id, dtype=torch.bfloat16, device_map="auto")
processor = AutoProcessor.from_pretrained(model_id)
scheduler = BlockRefinementScheduler()

pipe = DiffusionGemmaPipeline(model=model, scheduler=scheduler, processor=processor)
pipe.model.model.decoder = torch.compile(pipe.model.model.decoder, mode="reduce-overhead", fullgraph=True)
output = pipe(
    prompt="Why is the sky blue?",
    gen_length=256,
    num_inference_steps=48,
    cache_implementation="static",
)
print(output.texts[0])

num_inference_steps é o número de etapas de remoção de ruído por canvas (48 corresponde ao checkpoint publicado); menos etapas são mais rápidas, mas de menor qualidade. cache_implementation="static" permite que o decodificador seja compilado com torch.compile usando cudagraphs (veja Cache estático e compilação); remova ambos para uma execução mais simples com cache dinâmico.

Para entradas de múltiplas rodadas ou multimodais, passe uma conversa bruta messages em vez de prompt. Trata-se de uma lista de dicts {"role", "content"} no formato de chat usual, que o processador executa por meio do seu modelo de chat:

messages = [
    {"role": "user", "content": "Why is the sky blue?"},
]
# or with an image:
messages = [
    {
        "role": "user",
        "content": [
            {"type": "image", "image": image},
            {"type": "text", "text": "Describe this image."},
        ],
    },
]
output = pipe(messages=messages, gen_length=256)

Para um turno de usuário único, você pode omitir messages e passar uma image junto com o prompt; o processador a converte automaticamente nos inputs de imagem do modelo.

Agendadores

O scheduler é o sampler que remove o ruído de cada canvas e é intercambiável: troque-o para alterar a estratégia de amostragem sem tocar em mais nada. Três schedulers estão disponíveis:

  • BlockRefinementScheduler (padrão): confirma os tokens mais confiantes a cada etapa (acima de threshold, além de uma cota uniforme por etapa) e re-aplica ruído aos demais. editing_threshold permite, adicionalmente, reeditar tokens já confirmados.
  • DiscreteDDIMScheduler: amostra cada posição da posterior discreta exata do processo de corrupção uniforme (D3PM). Ele é livre de parâmetros e o passo final compromete deterministicamente os tokens previstos.
  • EntropyBoundScheduler: confirma as posições de menor entropia cuja entropia conjunta permanece abaixo de entropy_bound, de modo que tokens aproximadamente independentes sejam aceitos juntos. Ele anela sua temperatura de amostragem de t_max (0.8) no primeiro passo até t_min (0.4) no último, correspondendo ao amostrador do checkpoint liberado.
from diffusers import DiscreteDDIMScheduler, EntropyBoundScheduler

pipe.scheduler = DiscreteDDIMScheduler()
# or: pipe.scheduler = EntropyBoundScheduler(entropy_bound=0.1)
output = pipe(prompt="Why is the sky blue?", gen_length=256, num_inference_steps=48)
print(output.texts[0])

Os parâmetros de amostragem específicos do agendador (o threshold/top_k de refinamento de bloco, o limite de entropia, …) são definidos na configuração do agendador:

from diffusers import BlockRefinementScheduler

pipe.scheduler = BlockRefinementScheduler.from_config(pipe.scheduler.config, threshold=0.9)

EntropyBoundScheduler reduz gradualmente a temperatura de amostragem (t_max/t_min) internamente ao longo das etapas de desnívelamento; DiscreteDDIMScheduler e BlockRefinementScheduler usam a temperature plana passada para o pipeline (0.0 para greedy).

Amostragem preditor-corretor

DiscreteDDIMScheduler suporta o preditor-corretor leave-one-out de Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation. Ele refina o canvas com corrector_steps varreduras de Gibbs que reamostram as posições de menor confiança a partir da condicional de uma coordenada da marginal ruidosa, o que mantém essa marginal invariante e melhora a geração sem custo adicional de treinamento. Ele funciona diretamente no checkpoint liberado: para difusão uniforme, o denoiser e a posterior leave-one-out são intercambiáveis em forma fechada, de modo que o corretor recupera as quantidades leave-one-out de que precisa sem qualquer re-treinamento.

As varreduras do corretor são incorporadas ao orçamento de num_inference_steps em vez de serem adicionadas por cima: o pipeline executa menos etapas do preditor e gasta os forwards liberados nos corretores, de modo que o número total de forwards do modelo permanece num_inference_steps e o custo do preditor-corretor é o mesmo que o da amostragem ancestral simples.

from diffusers import DiscreteDDIMScheduler

pipe.scheduler = DiscreteDDIMScheduler(corrector_steps=2, corrector_k=12)
output = pipe(prompt="Why is the sky blue?", gen_length=256, num_inference_steps=48)
print(output.texts[0])

Adaptadores PEFT

O denoiser é um modelo do 🤗 Transformers, portanto os adaptadores são carregados por meio de sua integração nativa PEFT, em vez da API load_lora_weights do diffusers. Como essa integração é agnóstica em relação ao tipo de adaptador, as mesmas chamadas carregam LoRA, DoRA ou qualquer outro adaptador PEFT (por exemplo, a saída do SFTTrainer do TRL). Gerencie os adaptadores diretamente no componente do modelo:

pipe.model.load_adapter("path/to/adapter", adapter_name="sft")  # LoRA, DoRA, ...
pipe.model.set_adapter("sft")
output = pipe(prompt="Why is the sky blue?", gen_length=256)

pipe.model.disable_adapters()  # run the base model
pipe.model.delete_adapter("sft")

Os adaptadores permanecem ativos e não mesclados: o DiffusionGemma vincula os pesos base do codificador e do decodificador, portanto, fundir um adaptador neles corromperia ambos os ramos.

Cache estático e compilação

O pipeline pré-preenche o codificador uma vez por bloco em um cache reutilizável (um DynamicCache por padrão). Passar cache_implementation="static" usa um StaticCache de forma fixa em vez disso, cujas formas permitem torch.compile o decodificador com cudagraphs para um aumento adicional de velocidade (o pipeline marca cada etapa e clona os logits para que a memória dos cudagraphs não seja sobrescrita); este é o setup mostrado em Uso. Remova tanto a chamada torch.compile quanto cache_implementation="static" para uma execução mais simples com cache dinâmico.

Parada adaptativa

Um bloco geralmente converge antes que todos os num_inference_steps sejam utilizados, portanto, por padrão, o pipeline congela cada exemplo do lote uma vez que sua previsão de argmax está estável por stability_threshold passos e sua entropia média por token fica abaixo de confidence_threshold (0.005, o valor usado pelo checkpoint liberado). O loop de desruidamento termina quando todos os exemplos são congelados. Isso reduz aproximadamente pela metade o número de forwards do decodificador com qualidade equivalente e é o principal fator de throughput. Passe confidence_threshold=None para sempre executar todos os num_inference_steps:

output = pipe(prompt="Why is the sky blue?", gen_length=256, confidence_threshold=None)  # disable adaptive stopping

Callbacks

Os callbacks são executados após cada etapa de remoção de ruído. Passe callback_on_step_end_tensor_inputs para selecionar quais tensores são incluídos em callback_kwargs; canvas (os tokens do bloco atual) e logits estão disponíveis. Retorne {"canvas": ...} do callback para substituir o canvas.

def on_step_end(pipe, step, timestep, callback_kwargs):
    canvas = callback_kwargs["canvas"]
    # Inspect or modify `canvas` here.
    return {"canvas": canvas}


out = pipe(
    prompt="Why is the sky blue?",
    callback_on_step_end=on_step_end,
    callback_on_step_end_tensor_inputs=["canvas"],
)

DiffusionGemmaPipeline

classe diffusers.DiffusionGemmaPipeline

< >

( model: Anyscheduler: BlockRefinementScheduler | DiscreteDDIMScheduler | EntropyBoundSchedulerprocessor: Any )

Parâmetros

Pipeline para geração de texto por difusão em blocos do DiffusionGemma.

DiffusionGemma é um modelo encoder-decoder de difusão por blocos: um encoder causal lê o prompt limpo (e quaisquer blocos gerados anteriormente) para um cache KV, e um decoder bidirecional remove o ruído de uma “tela” de tamanho fixo com canvas_length tokens, fazendo cross-attention para esse cache. A geração alterna um loop externo autoregressivo sobre as telas com um loop interno de remoção de ruído, em que cada etapa amostra tokens candidatos, confirma os mais confiantes via BlockRefinementScheduler (modo de corrupção uniforme, mask_token_id=None) e re-introduz ruído nos demais.

O modelo deve ser uma instância de DiffusionGemmaForBlockDiffusion que exponha forward(input_ids, decoder_input_ids=..., self_conditioning_logits=..., ...) e retorne logits com a forma [batch, canvas_length, vocab_size] sobre o canvas. Consulte o cartão do modelo em https://huggingface.co/google/diffusiongemma-26B-A4B-it.

__call__

< >

( prompt: str | list[str] | None = Nonemessages: list[dict] | None = Noneimage: Any | list[Any] | None = Noneadd_generation_prompt: bool = Truegen_length: int = 256num_inference_steps: int = 48temperature: float = 0.0cache_implementation: str | None = Noneeos_early_stop: bool = Trueeos_token_id: int | None = Nonestability_threshold: int = 1confidence_threshold: float | None = 0.005generator: torch.Generator | None = Noneoutput_type: str = 'text'return_dict: bool = Truecallback_on_step_end: Callable[[Any, int, int, dict], dict] | PipelineCallback | MultiPipelineCallbacks | None = Nonecallback_on_step_end_tensor_inputs: list[str] | None = None ) → DiffusionGemmaPipelineOutput or tuple

Parâmetros

  • prompt (str or List[str], optional) — Prompt text, wrapped in a chat template and tokenized by the processor. Provide either this or messages.
  • messages (List[Dict], opcional) — Uma conversa de chat bruta para codificar, por exemplo, [{"role": "user", "content": "Hello"}] ou uma conversa de múltiplas rodadas / multimodal. Use isso em vez de prompt para qualquer coisa além de uma única rodada do usuário.
  • image (PIL.Image.Image ou List, opcional) — Imagem(ns) para combinar com prompt para geração multimodal; o processador as converte nas entradas de imagem do modelo. Para layouts mais ricos, coloque o conteúdo da imagem diretamente em messages.
  • add_generation_prompt (bool, padrão True) — Se deve adicionar o prompt de geração ao aplicar o modelo de chat.
  • gen_length (int, padrão 256) — Número de tokens a serem gerados, arredondado para cima até um múltiplo do canvas_length do modelo.
  • num_inference_steps (int, padrão 48) — Número de etapas de desruidamento por tela.
  • temperature (float, padrão 0.0) — Temperatura de amostragem para DiscreteDDIMScheduler/BlockRefinementScheduler (0.0 é guloso); EntropyBoundScheduler ignora esse parâmetro e ajusta a própria temperatura. Outros parâmetros de amostragem (por exemplo, top_k, threshold, t_min/t_max) fazem parte da configuração do scheduler; defina-os no scheduler, por exemplo, pipe.scheduler = BlockRefinementScheduler.from_config(pipe.scheduler.config, top_k=...).
  • cache_implementation (str, opcional) — Defina como "static" para pré-preencher o codificador uma vez por bloco em um StaticCache persistente e executar o decodificador contra ele com formas fixas, em vez de re-codificar a sequência completa a cada etapa. As formas fixas também permitem compilar o decodificador, por exemplo, pipe.model.model.decoder = torch.compile(pipe.model.model.decoder, fullgraph=True).
  • eos_early_stop (bool, padrão True) — Se deve parar de gerar mais quadros assim que todas as sequências emitirem EOS.
  • eos_token_id (int, opcional) — ID do token EOS para parada antecipada. Usa o tokenizer do processador como alternativa.
  • stability_threshold (int, padrão 1) — Número de passos consecutivos em que a previsão argmax de um exemplo deve permanecer inalterada para que esse exemplo seja considerado estável. Usado apenas quando confidence_threshold está definido.
  • confidence_threshold (float, opcional, padrão 0.005) — Congela cada exemplo quando ele está estável (veja stability_threshold) e a entropia média por token dos logits de previsão com a forma do agendador estiver abaixo desse valor. O loop de desruidamento do bloco termina quando todos os exemplos estão congelados. Acelera a geração com qualidade equivalente; o padrão corresponde ao checkpoint liberado. Defina como None para sempre executar todos os num_inference_steps.
  • generator (torch.Generator, opcional) — Gera números aleatórios para amostragem.
  • output_type (str, padrão "text") — "text" decodifica sequências em strings (requer um processador); "seq" retorna apenas IDs de tokens.
  • return_dict (bool, padrão True) — Se deve retornar um DiffusionGemmaPipelineOutput em vez de uma tupla.
  • callback_on_step_end (Callable ou PipelineCallback, opcional) — Callback executado após cada etapa de remoção de ruído com a assinatura callback_on_step_end(self, step, timestep, callback_kwargs). Chaves de tensor permitidas: canvas, logits.
  • callback_on_step_end_tensor_inputs (List[str], opcional) — Chaves de tensor para passar ao callback.

Os IDs dos tokens gerados (sequences) e, para output_type="text", os texts decodificados.

Gere texto com difusão em blocos.

Exemplos:

>>> import torch
>>> from transformers import AutoProcessor, DiffusionGemmaForBlockDiffusion
>>> from diffusers import BlockRefinementScheduler, DiffusionGemmaPipeline

>>> model_id = "google/diffusiongemma-26B-A4B-it"
>>> model = DiffusionGemmaForBlockDiffusion.from_pretrained(model_id, dtype=torch.bfloat16, device_map="auto")
>>> processor = AutoProcessor.from_pretrained(model_id)
>>> scheduler = BlockRefinementScheduler()

>>> pipe = DiffusionGemmaPipeline(model=model, scheduler=scheduler, processor=processor)
>>> output = pipe(prompt="Why is the sky blue?", gen_length=256)
>>> print(output.texts[0])

DiffusionGemmaPipelineOutput

classe diffusers.DiffusionGemmaPipelineOutput

< >

( sequences: torch.LongTensortexts: list[str] | None = None )

Parâmetros

  • sequences (torch.LongTensor de forma (batch_size, gen_length)) — Os IDs dos tokens gerados (o prompt é removido).
  • texts (list[str], opcional) — O texto decodificado, uma string por sequência. Definido apenas para output_type="text".

Classe de saída para geração por difusão em blocos do DiffusionGemma.

Update on GitHub