Présentation du modèle
Flux.3 Image Klein, publié par Black Forest Labs, propose deux checkpoints : un modèle de base et un checkpoint distillé. Le checkpoint distillé crée une image de 1024 × 1024 pixels en environ deux secondes sur un GPU Nvidia H100, grâce à 16 pas d’inférence et à l’utilisation du type bfloat16 pour les composants. Le modèle supporte le texte‑à‑image, le multi‑référence image‑to‑image et le contrôle de mise en page via des boîtes englobantes.
Architecture modulaire et quantifications
Le pipeline est fourni sous forme de ModularPipeline de la bibliothèque Diffusers, ce qui permet d’extraire ou d’ajouter des blocs (transformer, VAE, guider). Le transformeur peut être chargé en trois formats : bf16, fp8r (row‑wise FP8) et nvfp4. Les formats quantifiés se chargent avec from_single_file, réduisant ainsi l’empreinte mémoire et rendant le modèle exploitable sur des GPU plus modestes. Le VAE reste en bf16, tandis que le reste du pipeline utilise torch.bfloat16 ou torch.float32 selon les besoins.
from diffusers import ModularPipeline
pipe = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein")
pipe.load_components(dtype=torch.bfloat16)
pipe.to("cuda")Pour le fine‑tuning, Black Forest Labs fournit des scripts LoRA qui n’ajustent qu’une petite fraction des poids, limitant le coût de calcul et la consommation de stockage.
Performances et scénarios d’utilisation
Le checkpoint distillé génère 1024 × 1024 en 2 s à 16 pas, alors que le checkpoint de base nécessite 50 pas avec guidance classifier‑free, ce qui augmente le temps de génération mais offre plus de contrôle. Les utilisateurs peuvent modifier la résolution ou le nombre de pas via les arguments height, width ou num_inference_steps. Le système accepte également des références d’image multiples ; chaque référence est identifiée dans le prompt par <ref_image_0>, <ref_image_1>, etc., et les régions sont décrites par un JSON contenant id, bbox (normalisé 0‑1000) et desc. Cette approche permet des compositions précises, comme placer un renard sur un banc ou repositionner un personnage dans une scène.
prompt = (
"The fox from sitting on the wooden bench from in a snowy setting."
)
combined = pipe(prompt=prompt, image=[red_fox, bench], output="images")[0]
combined.save("combined.png")Pour les éditions, chaque région indique son origine (src_bbox) et sa destination (tgt_bbox), ce qui permet de déplacer ou de verrouiller des éléments sans altérer le reste de l’image.
Limites et perspectives
Le modèle dépend fortement d’un GPU haut de gamme pour atteindre les deux secondes annoncées ; sur des cartes moins puissantes, les formats quantifiés fp8r ou nvfp4 sont requis, mais ils peuvent introduire une perte de précision perceptible dans les textures fines. Le checkpoint de base, bien que plus flexible, reste coûteux en temps de calcul (50 pas). De plus, la normalisation des boîtes à l’échelle 0‑1000 impose une conversion manuelle lorsqu’on travaille avec des résolutions non carrées. Enfin, la documentation ne fournit pas de métriques d’évaluation (FID, CLIPScore), ce qui complique la comparaison objective avec d’autres modèles de diffusion.