Diffusers documentation
P-H3-Image
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
| Composant | Classe |
|---|---|
transformer | MiniMaxH3Transformer3DModel |
text_encoder | Qwen3VLForConditionalGeneration (Qwen3-VL-4B) |
text_connector | PH3ImageTextConnector |
vae | AutoencoderKLPH3Image |
tokenizer, processor | Le tokenizer de l'encodeur de texte, et un Qwen3VLProcessor avec le processeur d'images de MiniMax-H3 |
scheduler, audio_scheduler | MiniMaxH3Scheduler |
prompt_upsampler, prompt_upsampler_processor | Qwen3_5ForConditionalGeneration (basé sur Qwen3.5-9B) et son processeur |
Flux de travail
Le flux de travail est sélectionné sur l'entrée image :
text2imagegénère à partir deprompt.heightetwidthsont 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_conditionedmodifieimageselon l’instruction contenue danspromptet fonctionne de manière optimale à 4 ou 8 mégapixels. L’image est encodée à environvision_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 deheightetwidth, 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 pourheightetwidth, arrondies aux multiples de 32, modifient le canevas mais pas les images.imagepeut é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_sigmasdu point de contrôle. Passezsigmaspour utiliser une autre grille. - Le modèle est distillé avec guidage, il n'y a donc ni guideur, ni
negative_prompt, niguidance_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 )
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
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écessitepromptimage_conditioned: nécessiteprompt,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
< source >( 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 deshidden_statesdu codeur de texte qui sont lues, selon la numérotation deoutput_hidden_states(0correspond à la sortie des embeddings,ià la sortie de la couche décodeuri, et la dernière à l’état caché final normalisé). - text_hidden_size (
int, par défaut2560) — La taille cachée de l'encodeur de texte. - out_channels (
int, par défaut5120) — 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
< source >( 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 paroutput_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.