Diffusers documentation

P-H3-Image

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

P-H3-Image

P-H3-Image es un modelo de imágenes de Pruna AI basado en MiniMax-H3, para la generación de imágenes a partir de texto y la edición de imágenes basada en instrucciones. Puedes encontrar el checkpoint en PrunaAI/P-H3-Image.

import torch
from diffusers import ComponentsManager, ModularPipeline

manager = ComponentsManager()
manager.enable_auto_cpu_offload(device="cuda")  # or "mps", "xpu"

pipe = ModularPipeline.from_pretrained("PrunaAI/P-H3-Image", components_manager=manager)
pipe.load_components(dtype=torch.bfloat16)

prompt = (
    "A German Expressionist oil painting of a Berlin street at night in the manner of Ernst Ludwig Kirchner, "
    "with gaunt figures hurrying past a glowing gas lamp."
)
image = pipe(prompt=prompt, height=3360, width=2496, generator=torch.Generator().manual_seed(3), output="images")[0]
edited = pipe(prompt="let it snow on the street", image=image, output="images")[0]

Cada solicitud pasa primero por el prompt upsampler. Con cada componente en el acelerador, el pipeline necesita aproximadamente 101 GB en bfloat16 a 8 megapíxeles, por lo que los ejemplos usan auto offloading: el ComponentsManager mueve cada componente al acelerador cuando un bloque lo necesita, y el pipeline se ejecuta en una GPU de 80 GB.

Componentes

ComponenteClase
transformerMiniMaxH3Transformer3DModel
text_encoderQwen3VLForConditionalGeneration (Qwen3-VL-4B)
text_connectorPH3ImageTextConnector
vaeAutoencoderKLPH3Image
tokenizer, processorEl tokenizador del codificador de texto y un Qwen3VLProcessor con el procesador de imágenes de MiniMax-H3
scheduler, audio_schedulerMiniMaxH3Scheduler
prompt_upsampler, prompt_upsampler_processorQwen3_5ForConditionalGeneration (basado en Qwen3.5-9B) y su procesador

Flujos de trabajo

El flujo de trabajo se selecciona en la entrada image:

  • text2image genera a partir de prompt. height y width tienen un valor predeterminado de 2912 y se redondean a múltiplos de 32. El modelo funciona mejor con 8 megapíxeles, por ejemplo 2912x2912, 3872x2176 o 2176x3872.
  • image_conditioned edita image según la instrucción en prompt y funciona mejor con 4 o 8 megapíxeles. La imagen se codifica a unos vision_pixels (un megapíxel) para el codificador de texto y a su propio tamaño para el VAE, escalándose hacia arriba hasta reference_min_pixels (un megapíxel) o hacia abajo hasta reference_max_pixels (ocho megapíxeles) si está fuera de ese rango. Sin height y width, la edición se genera con el tamaño de la primera imagen, que se escala hacia arriba hasta canvas_min_pixels (cuatro megapíxeles) si es más pequeña. Si se pasan height y width, redondeados a múltiplos de 32, cambian el lienzo pero no las imágenes. image también puede ser una lista de hasta 8 imágenes: la primera se edita y las demás son referencias, como <Picture 2>, <Picture 3> y así sucesivamente.

Ampliación de prompts

P-H3-Image está diseñado para renderizar prompts completos en lugar de solicitudes cortas, por lo que la pipeline ejecuta primero el prompt upsampler en cada solicitud. Reflexiona sobre la solicitud y luego escribe el prompt: un prompt detallado de texto a imagen para la relación de aspecto de height y width, o, al editar, un breve de qué conservar y qué cambiar en las imágenes. El prompt que escribió se devuelve como la salida prompt.

out = pipe(prompt=prompt, height=3360, width=2496, output=["images", "prompt"])
print(out["prompt"])

max_new_tokens limita el razonamiento y el prompt juntos, con un valor predeterminado de 1024 tokens para texto a imagen y 1536 para ediciones. Si el amplificador no devuelve un prompt utilizable, la canalización lanza un error en lugar de renderizarlo.

Para renderizar prompt tal como se indica, extrae el paso de los bloques. El bloque extraído también se ejecuta de forma independiente, por ejemplo, para mostrar el prompt a un usuario antes de renderizarlo:

manager = ComponentsManager()
manager.enable_auto_cpu_offload(device="cuda")

blocks = ModularPipeline.from_pretrained("PrunaAI/P-H3-Image").blocks
upsampler_block = blocks.sub_blocks.pop("prompt_upsampler")

upsampler = upsampler_block.init_pipeline("PrunaAI/P-H3-Image", components_manager=manager)
upsampler.load_components(dtype=torch.bfloat16)
upsampled = upsampler(prompt=prompt, height=3360, width=2496, output="prompt")

pipe = blocks.init_pipeline("PrunaAI/P-H3-Image", components_manager=manager)
pipe.load_components(dtype=torch.bfloat16)
image = pipe(prompt=upsampled, height=3360, width=2496, output="images")[0]

Sin el paso, un prompt de edición en cualquiera de las dos formas que escribe el upsampler, el breve de seis secciones o un párrafo que comienza con Edit <Picture 1>., se codifica tal como está escrito; cualquier otra instrucción recibe ese prefijo.

Muestreo

  • Los 8 pasos se ejecutan sobre sample_sigmas del checkpoint. Pasa sigmas para usar otra cuadrícula.
  • El modelo está destilado con guía, por lo que no hay un guionista, negative_prompt ni guidance_scale.

PH3ImageModularPipeline

clase diffusers.PH3ImageModularPipeline

< >

( 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 )

Un ModularPipeline para P-H3-Image, un modelo de imágenes basado en MiniMax-H3, para texto a imagen (text2image) y edición basada en instrucciones (image_conditioned).

La imagen es un único marco latente, desruidado en una secuencia empaquetada con dos latentes de audio que se descartan.

import torch
from diffusers import ComponentsManager, ModularPipeline

manager = ComponentsManager()
manager.enable_auto_cpu_offload(device="cuda")

pipe = ModularPipeline.from_pretrained("PrunaAI/P-H3-Image", components_manager=manager)
pipe.load_components(dtype=torch.bfloat16)
prompt = (
    "A German Expressionist oil painting of a Berlin street at night in the manner of Ernst Ludwig Kirchner, "
    "with gaunt figures hurrying past a glowing gas lamp."
)
image = pipe(prompt=prompt, height=3360, width=2496, output="images")[0]

PH3ImageBlocks

clase diffusers.PH3ImageBlocks

< >

( )

Bloques de pipeline modulares para P-H3-Image: text2image y edición basada en instrucciones (image_conditioned) cuando se pasa image. prompt pasa primero por el prompt upsampler; elimina el paso prompt_upsampler para renderizarlo tal como se proporciona.

Flujos de trabajo admitidos:

  • text2image: requiere prompt
  • image_conditioned: requiere prompt, image

Componentes: image_processor (VaeImageProcessor) prompt_upsampler (Qwen3_5ForConditionalGeneration): El amplificador de prompts. prompt_upsampler_processor (AutoProcessor): Su procesador. text_encoder (Qwen3VLForConditionalGeneration) text_connector (PH3ImageTextConnector) tokenizer (Qwen2Tokenizer) processor (Qwen3VLProcessor) vae (AutoencoderKLPH3Image) scheduler (MiniMaxH3Scheduler) audio_scheduler (MiniMaxH3Scheduler) transformer (MiniMaxH3Transformer3DModel)

Configuraciones: reference_min_pixels (predeterminado: 1048576) reference_max_pixels (predeterminado: 8388608) canvas_min_pixels (predeterminado: 4194304) vision_pixels (predeterminado: 1000000) sample_sigmas (predeterminado: [1.0, 0.984753, 0.967905, 0.951688, 0.925372, 0.881923, 0.810083, 0.528718, 0.0]): La cuadrícula de muestreo del checkpoint, utilizada cuando no se pasa sigmas.

Entradas: image (Image | list, opcional): La imagen a editar, o una lista de un máximo de 8 imágenes: la primera se edita y las demás son referencias. height (int, opcional): Altura de la imagen generada en píxeles, redondeada a un múltiplo de 32. El valor predeterminado para text2image es 2912, que funciona mejor a 8 megapíxeles. Una edición usa por defecto el tamaño de la primera imagen, al menos canvas_min_pixels, y funciona mejor a 4 u 8 megapíxeles. width (int, opcional): Ancho de la imagen generada en píxeles, redondeado a un múltiplo de 32. El valor predeterminado para text2image es 2912, que funciona mejor a 8 megapíxeles. Una edición usa por defecto el tamaño de la primera imagen, al menos canvas_min_pixels, y funciona mejor a 4 u 8 megapíxeles. prompt (str): El prompt, o la instrucción de edición cuando se pasa image. Una sola cadena. max_new_tokens (int, opcional, predeterminado a 1536 o 1024, según el flujo de trabajo): El número máximo de tokens que puede generar el amplificador, incluida su razonamiento. vision_images (list, opcional): Las imágenes de la edición redimensionadas para el codificador de texto, con la imagen a editar primero. reference_images (list, opcional): Las imágenes de la edición redimensionadas para el VAE, con la imagen a editar primero. condition_latents (list, opcional): Los latentes de condicionamiento de las imágenes de la edición. Sus formas definen la geometría de los bloques de referencia. generator (Generator, opcional): El generador de la solicitud. El ruido de condicionamiento se extrae de él primero, una extracción por condición, antes del ruido de las filas generadas. latents (Tensor): Ruido de imagen pregenerado de forma (1, latent_channels, 1, latent_height, latent_width), usado en lugar de la extracción. sigmas (list, opcional): Una cuadrícula de muestreo personalizada, estrictamente decreciente y que termina en 0. El valor predeterminado es sample_sigmas del checkpoint. *denoiser_input_fields (None,opcional): La descripción estructural de la secuencia empaquetada que el transformer lee por nombre: token_tags, position_ids y los tres tensores de índice de fila. attention_kwargs (dict,opcional): Kwargs adicionales para los procesadores de atención. output_type (str,opcional*, predeterminado a pil): Formato de salida: ‘pil’, ‘np’, ‘pt’.

Salidas: images (list): Imágenes generadas.

PH3ImageTextConnector

clase diffusers.PH3ImageTextConnector

< >

( hidden_state_indices: tuple = (13, 19, 25, 31, 36)text_hidden_size: int = 2560out_channels: int = 5120 )

Parámetros

  • hidden_state_indices (tuple[int, ...], por defecto (13, 19, 25, 31, 36)) — Qué entradas de hidden_states del codificador de texto se leen, según la numeración de output_hidden_states (0 es la salida de la incrustación, i la salida de la capa decodificadora i, y la última el estado oculto final normalizado).
  • text_hidden_size (int, por defecto 2560) — El tamaño oculto del codificador de texto.
  • out_channels (int, por defecto 5120) — El número de canales que lee el transformer de condicionamiento de MiniMax-H3.

Mapea los estados ocultos del codificador de texto Qwen3-VL de P-H3-Image a la condición de texto que lee su transformer.

Los estados ocultos enumerados en hidden_state_indices se concatenan, estandarizan, proyectan linealmente y desestandarizan. El primer token es un sumidero de atención con el mismo condicionamiento para cada prompt, por lo que se reemplaza por sink_embedding.

forward

< >

( hidden_states: tuple ) → torch.Tensor

Parámetros

  • hidden_states (tuple[torch.Tensor, ...]) — Los estados ocultos del codificador de texto, tal como los devuelve output_hidden_states=True: un tensor de forma (batch_size, num_tokens, text_hidden_size) por entrada.

Devuelve

torch.Tensor

la señal de condicionamiento, de forma (batch_size, num_tokens, out_channels), en el dtype de los parámetros del conector.

Update on GitHub