Diffusers documentation
P-H3-Image
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
| Componente | Clase |
|---|---|
transformer | MiniMaxH3Transformer3DModel |
text_encoder | Qwen3VLForConditionalGeneration (Qwen3-VL-4B) |
text_connector | PH3ImageTextConnector |
vae | AutoencoderKLPH3Image |
tokenizer, processor | El tokenizador del codificador de texto y un Qwen3VLProcessor con el procesador de imágenes de MiniMax-H3 |
scheduler, audio_scheduler | MiniMaxH3Scheduler |
prompt_upsampler, prompt_upsampler_processor | Qwen3_5ForConditionalGeneration (basado en Qwen3.5-9B) y su procesador |
Flujos de trabajo
El flujo de trabajo se selecciona en la entrada image:
text2imagegenera a partir deprompt.heightywidthtienen 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_conditionededitaimagesegún la instrucción enprompty funciona mejor con 4 o 8 megapíxeles. La imagen se codifica a unosvision_pixels(un megapíxel) para el codificador de texto y a su propio tamaño para el VAE, escalándose hacia arriba hastareference_min_pixels(un megapíxel) o hacia abajo hastareference_max_pixels(ocho megapíxeles) si está fuera de ese rango. Sinheightywidth, la edición se genera con el tamaño de la primera imagen, que se escala hacia arriba hastacanvas_min_pixels(cuatro megapíxeles) si es más pequeña. Si se pasanheightywidth, redondeados a múltiplos de 32, cambian el lienzo pero no las imágenes.imagetambié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_sigmasdel checkpoint. Pasasigmaspara usar otra cuadrícula. - El modelo está destilado con guía, por lo que no hay un guionista,
negative_promptniguidance_scale.
PH3ImageModularPipeline
clase diffusers.PH3ImageModularPipeline
< source >( 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
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: requierepromptimage_conditioned: requiereprompt,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
< source >( 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 dehidden_statesdel codificador de texto se leen, según la numeración deoutput_hidden_states(0es la salida de la incrustación,ila salida de la capa decodificadorai, y la última el estado oculto final normalizado). - text_hidden_size (
int, por defecto2560) — El tamaño oculto del codificador de texto. - out_channels (
int, por defecto5120) — 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
< source >( hidden_states: tuple ) → torch.Tensor
Parámetros
- hidden_states (
tuple[torch.Tensor, ...]) — Los estados ocultos del codificador de texto, tal como los devuelveoutput_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.