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 est un modèle d’images de Pruna AI basé sur MiniMax-H3, destiné à la génération d’images à partir de texte et à l’édition d’images par instructions. Vous pouvez trouver le point de contrôle sur 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]

Chaque requête passe d'abord par le prompt upsampler. Avec chaque composant sur l'accélérateur, le pipeline nécessite environ 101 Go en bfloat16 à 8 mégapixels, les exemples utilisent donc le déchargement automatique : le ComponentsManager déplace chaque composant sur l'accélérateur lorsqu'un bloc en a besoin, et le pipeline s'exécute sur un GPU de 80 Go.

Composants

ComposantClasse
transformerMiniMaxH3Transformer3DModel
text_encoderQwen3VLForConditionalGeneration (Qwen3-VL-4B)
text_connectorPH3ImageTextConnector
vaeAutoencoderKLPH3Image
tokenizer, processorLe tokenizer de l'encodeur de texte, et un Qwen3VLProcessor avec le processeur d'images de MiniMax-H3
scheduler, audio_schedulerMiniMaxH3Scheduler
prompt_upsampler, prompt_upsampler_processorQwen3_5ForConditionalGeneration (basé sur Qwen3.5-9B) et son processeur

Flux de travail

Le flux de travail est sélectionné sur l'entrée image :

  • text2image génère à partir de prompt. height et width sont par défaut 2912 et sont arrondis aux multiples de 32. Le modèle fonctionne le mieux à 8 mégapixels, par exemple 2912x2912, 3872x2176 ou 2176x3872.
  • image_conditioned modifie image selon l’instruction contenue dans prompt et fonctionne de manière optimale à 4 ou 8 mégapixels. L’image est encodée à environ vision_pixels (un mégapixel) pour l’encodeur de texte et à sa propre taille pour le VAE, mise à l’échelle vers le haut jusqu’à reference_min_pixels (un mégapixel) ou vers le bas jusqu’à reference_max_pixels (huit mégapixels) si elle se situe en dehors de cette plage. En l’absence de height et width, la modification est générée à la taille de la première image, qui est mise à l’échelle vers le haut jusqu’à canvas_min_pixels (quatre mégapixels) si elle est plus petite. Les valeurs transmises pour height et width, arrondies aux multiples de 32, modifient le canevas mais pas les images. image peut également être une liste d’au plus 8 images : la première est modifiée et les autres servent de références, comme <Picture 2>, <Picture 3> et ainsi de suite.

Échantillonnage supérieur des prompts

P-H3-Image est conçu pour générer des prompts complets plutôt que de courtes requêtes, le pipeline exécute donc d'abord l'amplificateur de prompt sur chaque requête. Il analyse la requête puis rédige le prompt : un prompt texte-vers-image détaillé pour le ratio d'aspect de height et width, ou, lors d'une édition, un brief indiquant ce qu'il faut conserver et ce qu'il faut modifier dans les images. Le prompt rédigé est renvoyé en tant que sortie prompt.

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

max_new_tokens limite le raisonnement et le prompt ensemble, avec 1024 jetons par défaut pour le texte-vers-image et 1536 pour les modifications. Si l’upsampler ne renvoie pas un prompt utilisable, le pipeline lève une erreur au lieu de le rendre.

Pour afficher prompt tel quel, retirez l'étape des blocs. Le bloc retiré s'exécute également de manière autonome, par exemple pour afficher le prompt à un utilisateur avant son rendu :

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]

Sans cette étape, un prompt d’édition, quelle que soit la forme écrite par l’upsampler, le bref en six sections ou un paragraphe commençant par Edit <Picture 1>., est encodé tel quel ; toute autre instruction reçoit ce préfixe.

Échantillonnage

  • Les 8 étapes s'exécutent sur les sample_sigmas du point de contrôle. Passez sigmas pour utiliser une autre grille.
  • Le modèle est distillé avec guidage, il n'y a donc ni guideur, ni negative_prompt, ni guidance_scale.

PH3ImageModularPipeline

classe 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 pour P-H3-Image, un modèle d’image basé sur MiniMax-H3, pour la génération d’images à partir de texte (text2image) et l’édition basée sur des instructions (image_conditioned).

L'image est une seule trame latente, débruitée dans une séquence compacte unique avec deux latents audio qui sont jetés.

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

classe diffusers.PH3ImageBlocks

< >

( )

Blocs de pipeline modulaires pour P-H3-Image : text2image, et édition basée sur des instructions (image_conditioned) lorsque image est transmis. prompt passe d'abord par le prompt upsampler ; retirez l'étape prompt_upsampler pour le rendre tel quel.

Workflows pris en charge :

  • text2image : nécessite prompt
  • image_conditioned : nécessite prompt, image

Composants : image_processor (VaeImageProcessor) prompt_upsampler (Qwen3_5ForConditionalGeneration) : Le upsampler de prompt. prompt_upsampler_processor (AutoProcessor) : Son processeur. text_encoder (Qwen3VLForConditionalGeneration) text_connector (PH3ImageTextConnector) tokenizer (Qwen2Tokenizer) processor (Qwen3VLProcessor) vae (AutoencoderKLPH3Image) scheduler (MiniMaxH3Scheduler) audio_scheduler (MiniMaxH3Scheduler) transformer (MiniMaxH3Transformer3DModel)

Configurations : reference_min_pixels (par défaut : 1048576) reference_max_pixels (par défaut : 8388608) canvas_min_pixels (par défaut : 4194304) vision_pixels (par défaut : 1000000) sample_sigmas (par défaut : [1.0, 0.984753, 0.967905, 0.951688, 0.925372, 0.881923, 0.810083, 0.528718, 0.0]) : la grille d'échantillonnage du point de contrôle, utilisée lorsque sigmas n'est pas transmis.

Entrées : image (Image | list, facultatif) : L’image à éditer, ou une liste d’au plus 8 images : la première est éditée, les autres servent de références. height (int, facultatif) : Hauteur de l’image générée en pixels, arrondie à un multiple de 32. La valeur par défaut est 2912 pour text2image, ce qui fonctionne le mieux à 8 mégapixels. Pour une édition, la valeur par défaut est la taille de la première image, au minimum canvas_min_pixels, et fonctionne le mieux à 4 ou 8 mégapixels. width (int, facultatif) : Largeur de l’image générée en pixels, arrondie à un multiple de 32. La valeur par défaut est 2912 pour text2image, ce qui fonctionne le mieux à 8 mégapixels. Pour une édition, la valeur par défaut est la taille de la première image, au minimum canvas_min_pixels, et fonctionne le mieux à 4 ou 8 mégapixels. prompt (str) : Le prompt, ou l’instruction d’édition lorsque image est transmis. Une seule chaîne de caractères. max_new_tokens (int, facultatif, valeur par défaut 1536 ou 1024, selon le flux de travail) : Le nombre maximal de jetons que l’upsampler peut générer, son raisonnement inclus. vision_images (list, facultatif) : Les images de l’édition redimensionnées pour l’encodeur de texte, l’image à éditer en premier. reference_images (list, facultatif) : Les images de l’édition redimensionnées pour le VAE, l’image à éditer en premier. condition_latents (list, facultatif) : Les latents de conditionnement des images de l’édition. Leurs formes définissent la géométrie des blocs de référence. generator (Generator, facultatif) : Le générateur de la requête. Le bruit de conditionnement est d’abord tiré de celui-ci, un tirage par condition, avant le bruit des lignes générées. latents (Tensor) : Bruit d’image pré-généré de forme (1, latent_channels, 1, latent_height, latent_width), utilisé à la place du tirage. sigmas (list, facultatif) : Une grille d’échantillonnage personnalisée, strictement décroissante et se terminant à 0. La valeur par défaut est sample_sigmas du point de contrôle. *denoiser_input_fields (None,facultatif) : La description structurelle de la séquence compacte que le transformer lit par nom : token_tags, position_ids et les trois tenseurs d’indices de lignes. attention_kwargs (dict,facultatif) : Arguments supplémentaires pour les processeurs d’attention. output_type (str,facultatif*, valeur par défaut pil) : Format de sortie : ‘pil’, ‘np’, ‘pt’.

Sorties : images (list) : Images générées.

PH3ImageTextConnector

classe diffusers.PH3ImageTextConnector

< >

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

Paramètres

  • hidden_state_indices (tuple[int, ...], par défaut (13, 19, 25, 31, 36)) — Entrées des hidden_states du codeur de texte qui sont lues, selon la numérotation de output_hidden_states (0 correspond à la sortie des embeddings, i à la sortie de la couche décodeur i, et la dernière à l’état caché final normalisé).
  • text_hidden_size (int, par défaut 2560) — La taille cachée de l'encodeur de texte.
  • out_channels (int, par défaut 5120) — Le nombre de canaux du conditionnement que le transformer de MiniMax-H3 lit.

Cartographie les états cachés de l’encodeur de texte Qwen3-VL de P-H3-Image vers la condition de texte que son transformateur lit.

Les états cachés listés dans hidden_state_indices sont concaténés, standardisés, projetés linéairement puis déstandardisés. Le premier jeton est un puits d'attention avec le même conditionnement pour chaque invite, il est donc remplacé par sink_embedding.

forward

< >

( hidden_states: tuple ) → torch.Tensor

Paramètres

  • hidden_states (tuple[torch.Tensor, ...]) — Les états cachés de l'encodeur de texte, tels que renvoyés par output_hidden_states=True : un tenseur de forme (batch_size, num_tokens, text_hidden_size) par entrée.

Retourne

torch.Tensor

le conditionnement, de forme (batch_size, num_tokens, out_channels), dans le dtype des paramètres du connecteur.

Update on GitHub