Diffusers documentation
P-H3-Image
P-H3-Image
P-H3-Image é um modelo de imagem da Pruna AI baseado no MiniMax-H3, para geração de imagens a partir de texto e edição de imagens baseada em instruções. Você pode encontrar o checkpoint em 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 solicitação passa primeiro pelo prompt upsampler. Com todos os componentes no acelerador, o pipeline precisa de cerca de 101 GB em bfloat16 a 8 megapixels, portanto os exemplos usam offloading automático: o ComponentsManager move cada componente para o acelerador quando um bloco precisa dele, e o pipeline é executado em uma GPU de 80 GB.
Componentes
| Componente | Classe |
|---|---|
transformer | MiniMaxH3Transformer3DModel |
text_encoder | Qwen3VLForConditionalGeneration (Qwen3-VL-4B) |
text_connector | PH3ImageTextConnector |
vae | AutoencoderKLPH3Image |
tokenizer, processor | O tokenizer do codificador de texto e um Qwen3VLProcessor com o processador de imagens do MiniMax-H3 |
scheduler, audio_scheduler | MiniMaxH3Scheduler |
prompt_upsampler, prompt_upsampler_processor | Qwen3_5ForConditionalGeneration (baseado no Qwen3.5-9B) e seu processador |
Fluxos de trabalho
O workflow é selecionado na entrada image:
text2imagegera a partir deprompt.heightewidthtêm valores padrão de 2912 e são arredondados para múltiplos de 32. O modelo funciona melhor em 8 megapixels, por exemplo, 2912x2912, 3872x2176 ou 2176x3872.image_conditionededitaimagecom base na instrução emprompte funciona melhor em 4 ou 8 megapixels. A imagem é codificada em aproximadamentevision_pixels(um megapixel) para o codificador de texto e em seu próprio tamanho para o VAE, sendo ampliada parareference_min_pixels(um megapixel) ou reduzida parareference_max_pixels(oito megapixels) quando estiver fora dessa faixa. Semheightewidth, a edição é gerada no tamanho da primeira imagem, que é ampliada paracanvas_min_pixels(quatro megapixels) se for menor. Ao passarheightewidth, arredondados para múltiplos de 32, a tela é alterada, mas não as imagens.imagetambém pode ser uma lista de até 8 imagens: a primeira é editada e as demais são referências, como<Picture 2>,<Picture 3>e assim por diante.
Ampliação de prompt
P-H3-Image é projetado para renderizar prompts completos, em vez de solicitações curtas, portanto o pipeline executa o prompt upsampler primeiro em cada solicitação. Ele analisa a solicitação e, em seguida, escreve o prompt: um prompt detalhado de texto para imagem para a proporção de aspecto de height e width, ou, ao editar, um resumo do que manter e do que alterar nas imagens. O prompt que ele escreveu retorna como a saída prompt.
out = pipe(prompt=prompt, height=3360, width=2496, output=["images", "prompt"])
print(out["prompt"])max_new_tokens limita o raciocínio e o prompt juntos, com 1024 tokens para texto-para-imagem e 1536 para edições por padrão. Se o upsampler não retornar um prompt utilizável, o pipeline levanta um erro em vez de renderizá-lo.
Para renderizar prompt como fornecido, remova o passo dos blocos. O bloco removido também é executado de forma independente, por exemplo, para exibir o prompt a um usuário antes de renderizá-lo:
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]Sem o passo, um prompt de edição em qualquer forma que o upsampler escreva, o resumo de seis seções ou um parágrafo que começa com Edit <Picture 1>., é codificado como escrito; qualquer outra instrução recebe esse prefixo.
Amostragem
- Os 8 passos são executados sobre os
sample_sigmasdo checkpoint. Passesigmaspara usar outra grade. - O modelo é destilado por orientação, portanto não há um guia,
negative_promptouguidance_scale.
PH3ImageModularPipeline
classe 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 )
Uma ModularPipeline para P-H3-Image, um modelo de imagem baseado no MiniMax-H3, para geração de imagem a partir de texto (text2image) e
edição baseada em instruções (image_conditioned).
A imagem é um único quadro latente, desruidado em uma sequência empacotada com dois latentes de áudio que são descartados.
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
Blocos de pipeline modulares para P-H3-Image: text2image e edição baseada em instruções (image_conditioned) quando image é passado. prompt passa primeiro pelo prompt upsampler; remova a etapa prompt_upsampler para renderizá-lo
como fornecido.
Fluxos de trabalho suportados:
text2image: requerpromptimage_conditioned: requerprompt,image
Componentes:
image_processor (VaeImageProcessor) prompt_upsampler (Qwen3_5ForConditionalGeneration): O upsampler do prompt. prompt_upsampler_processor (AutoProcessor): Seu processador. text_encoder
(Qwen3VLForConditionalGeneration) text_connector (PH3ImageTextConnector) tokenizer (Qwen2Tokenizer)
processor (Qwen3VLProcessor) vae (AutoencoderKLPH3Image) scheduler (MiniMaxH3Scheduler) audio_scheduler
(MiniMaxH3Scheduler) transformer (MiniMaxH3Transformer3DModel)
Configs:
reference_min_pixels (padrão: 1048576) reference_max_pixels (padrão: 8388608) canvas_min_pixels (padrão:
4194304) vision_pixels (padrão: 1000000) sample_sigmas (padrão: [1.0, 0.984753, 0.967905, 0.951688,
0.925372, 0.881923, 0.810083, 0.528718, 0.0]): A grade de amostragem do checkpoint, usada quando sigmas não é
passado.
Entradas:
image (Image | list, opcional):
A imagem a ser editada, ou uma lista de no máximo 8 imagens: a primeira é editada, as demais são referências.
height (int, opcional):
Altura da imagem gerada em pixels, arredondada para um múltiplo de 32. O padrão é 2912 para text2image,
que funciona melhor em 8 megapixels. Uma edição usa o tamanho da primeira imagem como padrão, no mínimo canvas_min_pixels, e funciona melhor em 4 ou 8 megapixels.
width (int, opcional):
Largura da imagem gerada em pixels, arredondada para um múltiplo de 32. O padrão é 2912 para text2image,
que funciona melhor em 8 megapixels. Uma edição usa o tamanho da primeira imagem como padrão, no mínimo canvas_min_pixels, e funciona melhor em 4 ou 8 megapixels.
prompt (str):
O prompt, ou a instrução de edição quando image é passado. Uma única string.
max_new_tokens (int, opcional, padrão 1536 ou 1024, dependendo do fluxo de trabalho):
O número máximo de tokens que o upsampler pode gerar, incluindo seu raciocínio.
vision_images (list, opcional):
As imagens da edição redimensionadas para o codificador de texto, com a imagem a ser editada em primeiro lugar.
reference_images (list, opcional):
As imagens da edição redimensionadas para o VAE, com a imagem a ser editada em primeiro lugar.
condition_latents (list, opcional):
Os latentes de condicionamento das imagens da edição. Suas formas definem a geometria dos blocos de referência.
generator (Generator, opcional):
O gerador da solicitação. O ruído de condicionamento é extraído dele primeiro, uma extração por condição,
antes do ruído das linhas geradas.
latents (Tensor):
Ruído de imagem pré-gerado com a forma (1, latent_channels, 1, latent_height, latent_width), usado no lugar
da extração.
sigmas (list, opcional):
Uma grade de amostragem personalizada, estritamente decrescente e terminando em 0. O padrão é o sample_sigmas do checkpoint.
*denoiser_input_fields (None,opcional):
A descrição estrutural da sequência empacotada que o transformer lê por nome: token_tags, position_ids e os três tensores de índice de linha.
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:
imagens (list):
Imagens geradas.
PH3ImageTextConnector
classe 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, ...], padrão(13, 19, 25, 31, 36)) — Quais entradas doshidden_statesdo codificador de texto são lidas, na numeração deoutput_hidden_states(0é a saída de incorporação,ié a saída da camada de decodificadori, e a última é o estado oculto final normalizado). - text_hidden_size (
int, padrão2560) — O tamanho oculto do codificador de texto. - out_channels (
int, padrão5120) — O número de canais do transformador de condicionamento do MiniMax-H3.
Mapeia os estados ocultos do codificador de texto Qwen3-VL do P-H3-Image para a condição de texto que seu transformer lê.
Os estados ocultos listados em hidden_state_indices são concatenados, padronizados, projetados linearmente e
despadronizados. O primeiro token é um attention sink com a mesma condição para todos os prompts, portanto é substituído
por sink_embedding.
forward
< source >( hidden_states: tuple ) → torch.Tensor
Parâmetros
- hidden_states (
tuple[torch.Tensor, ...]) — Os estados ocultos do codificador de texto, conforme retornados poroutput_hidden_states=True: um tensor de forma(batch_size, num_tokens, text_hidden_size)por entrada.
Retorna
torch.Tensor
o condicionamento, de forma (batch_size, num_tokens, out_channels), no dtype dos
parâmetros do conector.