SDXL en 4 étapes avec Latent Consistency LoRAs

SDXL en 4 étapes avec une Cohérence Latente et les LoRAs

Les modèles de cohérence latente (LCM) sont une façon de réduire le nombre d’étapes nécessaires pour générer une image avec Stable Diffusion (ou SDXL) en distillant le modèle original dans une autre version qui nécessite moins d’étapes (4 à 8 au lieu des 25 à 50 originales). La distillation est une sorte de procédure d’entraînement qui tente de reproduire les résultats d’un modèle source en utilisant un nouveau modèle. Le modèle distillé peut être conçu pour être plus petit (c’est le cas de DistilBERT ou du récemment sorti Distil-Whisper) ou, dans ce cas, nécessiter moins d’étapes pour s’exécuter. C’est généralement un processus long et coûteux qui nécessite énormément de données, de la patience et quelques GPU.

Eh bien, c’était le statu quo avant aujourd’hui !

Nous sommes ravis d’annoncer une nouvelle méthode qui peut essentiellement rendre Stable Diffusion et SDXL plus rapides, comme s’ils avaient été distillés en utilisant le processus LCM ! Comment vous semble-t-il de faire fonctionner n’importe quel modèle SDXL en environ 1 seconde au lieu de 7 sur un 3090, ou 10 fois plus rapidement sur un Mac ? Lisez la suite pour plus de détails !

Contenu

Aperçu de la méthode

Alors, quel est le truc ? Pour la distillation de cohérence latente, chaque modèle doit être distillé séparément. L’idée principale avec LCM LoRA est de former juste un petit nombre d’adaptateurs, connus sous le nom de couches LoRA, au lieu du modèle complet. Les LoRAs résultants peuvent ensuite être appliqués à n’importe quelle version ajustée du modèle sans avoir à les distiller séparément. Si vous êtes impatient de voir à quoi cela ressemble en pratique, passez directement à la section suivante pour jouer avec le code d’inférence. Si vous souhaitez entraîner vos propres LoRAs, voici le processus que vous utiliseriez :

  1. Sélectionnez un modèle d’enseignant disponible dans le Hub. Par exemple, vous pouvez utiliser SDXL (de base), ou toute version affinée ou rêvée que vous aimez.
  2. Entraînez un LCM LoRA sur le modèle. LoRA est une méthode d’affinage performante et économique, ou PEFT, beaucoup moins coûteuse à réaliser que l’affinage complet du modèle. Pour plus de détails sur le PEFT, veuillez consulter cet article de blog ou la documentation LoRA des diffuseurs.
  3. Utilisez le LoRA avec n’importe quel modèle de diffusion SDXL et le planificateur LCM ; et voilà ! Vous obtenez une inférence de haute qualité en quelques étapes seulement.

Pour plus de détails sur le processus, veuillez télécharger notre article.

Pourquoi est-ce important ?

L’inférence rapide de Stable Diffusion et SDXL permet de nouvelles utilisations et flux de travail. En voici quelques-unes :

  • Accessibilité : les outils de génération peuvent être utilisés efficacement par un plus grand nombre de personnes, même si elles n’ont pas accès au matériel le plus récent.
  • Itération plus rapide : obtenez plus d’images et de variantes en une fraction du temps ! C’est idéal pour les artistes et les chercheurs, que ce soit pour un usage personnel ou commercial.
  • Les charges de travail de production peuvent être exécutées sur différents accélératrices, y compris les CPU.
  • Services de génération d’images moins chers.

Pour vous donner une idée de la différence de vitesse dont nous parlons, générer une seule image de 1024×1024 sur un Mac M1 avec SDXL (de base) prend environ une minute. En utilisant le LCM LoRA, nous obtenons d’excellents résultats en seulement ~6s (4 étapes). C’est une dizaine de fois plus rapide et ne pas avoir à attendre les résultats change la donne. En utilisant un 4090, nous obtenons une réponse presque instantanée (moins de 1s). Cela ouvre la voie à l’utilisation de SDXL dans des applications où des événements en temps réel sont requis.

Inférence rapide avec SDXL LCM LoRAs

La version de diffusers publiée aujourd’hui facilite grandement l’utilisation de LCM LoRAs :

from diffusers import DiffusionPipeline, LCMScheduler
import torch

model_id = "stabilityai/stable-diffusion-xl-base-1.0"
lcm_lora_id = "latent-consistency/lcm-lora-sdxl"

pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")
pipe.load_lora_weights(lcm_lora_id)
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.to(device="cuda", dtype=torch.float16)

prompt = "photographie en gros plan d'un vieil homme debout sous la pluie, dans une rue éclairée par des lampadaires, leica 35mm summilux"

images = pipe(prompt=prompt, num_inference_steps=4, guidance_scale=1).images[0]

Notez comment le code :

  • Instancie un pipeline de diffusion standard avec le modèle de base SDXL 1.0.
  • Applique le LCM LoRA.
  • Change le planificateur pour le LCMScheduler, qui est celui utilisé dans les modèles de consistance latente.
  • C’est tout !

Cela aboutira à l’image en pleine résolution suivante :

SDXL en 4 étapes avec LCM LoRAImage générée avec SDXL en 4 étapes en utilisant un LCM LoRA.

Comparaison de qualité

Voyons comment le nombre d’étapes influence la qualité de génération. Le code suivant générera des images avec de 1 à 8 étapes d’inférence au total :

images = []
for steps in range(8):
    generator = torch.Generator(device=pipe.device).manual_seed(1337)
    image = pipe(
        prompt=prompt,
        num_inference_steps=steps+1,
        guidance_scale=1,
        generator=generator,
    ).images[0]
    images.append(image)

Voici les 8 images affichées dans une grille :

LCM LoRA générations avec 1 à 8 étapes Générations LCM LoRA avec 1 à 8 étapes.

Comme prévu, en utilisant seulement 1 étape, on obtient une forme approximative sans caractéristiques discernables et sans texture. Cependant, les résultats s’améliorent rapidement et sont généralement très satisfaisants en seulement 4 à 6 étapes. Personnellement, je trouve que l’image à 8 étapes dans le test précédent est un peu trop saturée et “cartoonesque” à mon goût, donc je choisirais probablement entre celles à 5 et 6 étapes dans cet exemple. La génération est si rapide que vous pouvez créer plusieurs variantes différentes en utilisant seulement 4 étapes, puis sélectionner celles que vous aimez et itérer en utilisant quelques étapes supplémentaires et des directives affinées si nécessaire.

Échelle d’orientation et directives négatives

Notez que dans les exemples précédents, nous avons utilisé une guidance_scale de 1, ce qui la désactive efficacement. Cela fonctionne bien pour la plupart des directives et c’est plus rapide, mais cela ignore les directives négatives. Vous pouvez également essayer d’utiliser des directives négatives en fournissant une échelle d’orientation entre 1 et 2 – nous avons constaté que les valeurs plus élevées ne fonctionnent pas.

Qualité par rapport à SDXL de base

Comment cela se compare-t-il à la pipeline SDXL standard en termes de qualité ? Voyons un exemple !

Nous pouvons rapidement revenir à une pipeline SDXL standard en déchargeant les poids de LoRA et en passant au planificateur par défaut :

from diffusers import EulerDiscreteSchedulerpipe.unload_lora_weights()pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config)

Ensuite, nous pouvons exécuter l’inférence comme d’habitude pour SDXL. Nous allons rassembler les résultats en utilisant un nombre variable d’étapes :

images = []for steps in (1, 4, 8, 15, 20, 25, 30, 50):    generator = torch.Generator(device=pipe.device).manual_seed(1337)    image = pipe(        prompt=prompt,        num_inference_steps=steps,        generator=generator,    ).images[0]    images.append(image)

Résultats SDXL pour différentes étapes d'inférence Résultats de la pipeline SDXL (même directive et même graine aléatoire), en utilisant 1, 4, 8, 15, 20, 25, 30 et 50 étapes.

Comme vous pouvez le constater, les images dans cet exemple sont pratiquement inutiles jusqu’à ~20 étapes (deuxième rangée), et la qualité augmente encore de manière significative avec plus d’étapes. Les détails dans l’image finale sont incroyables, mais il a fallu 50 étapes pour y arriver.

LCM LoRAs avec d’autres modèles

Cette technique fonctionne également pour n’importe quel autre modèle SDXL ou modèle de diffusion stable fine-tuné. Pour le démontrer, voyons comment exécuter l’inférence sur collage-diffusion, un modèle fine-tuné à partir de Diffusion Stable v1.5 en utilisant Dreambooth.

Le code est similaire à celui que nous avons vu dans les exemples précédents. Nous chargeons le modèle fine-tuné, puis le LCM LoRA adapté à Diffusion Stable v1.5.

from diffusers import DiffusionPipeline, LCMSchedulerimport torchmodel_id = "wavymulder/collage-diffusion"lcm_lora_id = "latent-consistency/lcm-lora-sdv1-5"pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)pipe.load_lora_weights(lcm_lora_id)pipe.to(device="cuda", dtype=torch.float16)prompt = "style de collage : enfant assis regardant le ciel nocturne, plein d'étoiles"generator = torch.Generator(device=pipe.device).manual_seed(1337)images = pipe(    prompt=prompt,    generator=generator,    negative_prompt=negative_prompt,    num_inference_steps=4,    guidance_scale=1,).images[0]images

Technique LCM LoRA avec un modèle Dreambooth Stable Diffusion v1.5, permettant une inférence en 4 étapes.Technique LCM LoRA avec un modèle Dreambooth Stable Diffusion v1.5, permettant une inférence en 4 étapes.

Intégration complète des diffuseurs

L’intégration de LCM dans les diffuseurs permet de profiter de nombreuses fonctionnalités et workflows faisant partie de la boîte à outils des diffuseurs. Par exemple:

  • Prise en charge mps prête à l’emploi pour les Mac avec Apple Silicon.
  • Optimisations de la mémoire et des performances telles que l’attention flash ou torch.compile().
  • Stratégies supplémentaires d’économie de mémoire pour les environnements avec une faible RAM, y compris le transfert du modèle.
  • Workflows tels que ControlNet ou image-vers-image.
  • Scripts d’entraînement et de réglage fin.

Benchmarks

Cette section n’a pas vocation à être exhaustive, mais illustrative de la vitesse de génération que nous atteignons sur différents ordinateurs. Soulignons une fois de plus combien il est libérateur d’explorer aussi facilement la génération d’images.

Ces tests ont été effectués avec une taille de lot de 1 dans tous les cas, en utilisant ce script par Sayak Paul.

Pour les cartes avec beaucoup de capacité, comme l’A100, les performances augmentent significativement lors de la génération de plusieurs images à la fois, ce qui est généralement le cas pour les charges de travail de production.

LCM LoRAs et modèles publiés aujourd’hui

Bonus : Combinez les LCM LoRAs avec les LCM SDXL LoRAs régulières

En utilisant l’intégration des diffuseurs + PEFT, vous pouvez combiner les LCM LoRAs avec les SDXL LoRAs régulières, leur donnant le super pouvoir d’exécuter une inférence LCM en seulement 4 étapes.

Ici, nous allons combiner le LoRA CiroN2022/toy_face avec le LCM LoRA:

from diffusers import DiffusionPipeline, LCMSchedulerimport torchmodel_id = "stabilityai/stable-diffusion-xl-base-1.0"lcm_lora_id = "latent-consistency/lcm-lora-sdxl"pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)pipe.load_lora_weights(lcm_lora_id)pipe.load_lora_weights("CiroN2022/toy-face", weight_name="toy_face_sdxl.safetensors", adapter_name="toy")pipe.set_adapters(["lora", "toy"], adapter_weights=[1.0, 0.8])pipe.to(device="cuda", dtype=torch.float16)prompt = "un homme toy_face"negative_prompt = "flou, basse qualité, rendu, 3D, sur-saturé"images = pipe(    prompt=prompt,    negative_prompt=negative_prompt,    num_inference_steps=4,    guidance_scale=0.5,).images[0]images

Combinaison des LoRAs pour une inférence rapideLes LoRAs standard et LCM combinés pour une inférence rapide (4 étapes).

Besoin d’idées pour explorer certains LoRAs? Consultez notre espace LoRA the Explorer (version LCM) pour tester les créations étonnantes de la communauté et vous inspirer!

Comment entraîner des modèles LCM et LoRAs

Dans le cadre de la sortie de la bibliothèque diffusers aujourd’hui, nous proposons des scripts de formation et de mise au point développés en collaboration avec les auteurs de l’équipe LCM. Ils permettent aux utilisateurs de :

  • Effectuer une distillation complète du modèle Stable Diffusion ou SDXL sur de grands ensembles de données tels que Laion.
  • Former des LCM LoRAs, ce qui est un processus beaucoup plus facile. Comme nous l’avons montré dans cet article, cela permet également d’exécuter une inférence rapide avec Stable Diffusion, sans avoir à passer par un entraînement de distillation.

Pour plus de détails, veuillez consulter les instructions pour SDXL ou Stable Diffusion dans le dépôt.

Nous espérons que ces scripts inspireront la communauté à essayer leurs propres ajustements fins. S’il vous plaît, faites-nous savoir si vous les utilisez pour vos projets!

Ressources

Crédits

Le travail incroyable sur les modèles de cohérence latente a été réalisé par l’équipe LCM, assurez-vous de consulter leur code, leur rapport et leur article. Ce projet est une collaboration entre l’équipe diffusers, l’équipe LCM et le contributeur de la communauté Daniel Gu. Nous croyons que cela témoigne du pouvoir de l’intelligence artificielle en code source ouvert, pierre angulaire qui permet aux chercheurs, praticiens et bricoleurs d’explorer de nouvelles idées et de collaborer. Nous aimerions également remercier @madebyollin pour leurs contributions continues à la communauté, y compris l’autoencodeur float16 que nous utilisons dans nos scripts d’entraînement.

We will continue to update IPGirl; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI

L'avenir de l'IA Exploration de la prochaine génération de modèles génératifs.

Qu'est-ce que l'IA générative est actuellement capable de faire et quels sont les défis actuels qu'elle doit surmonte...

AI

Les chercheurs de Microsoft présentent InstructDiffusion un cadre d'IA unificateur et générique pour aligner les tâches de vision par ordinateur avec les instructions humaines.

Dans une avancée révolutionnaire vers des modèles de vision généralistes adaptables, des chercheurs du Microsoft Rese...

AI

Financement dans les Startups d'IA Numéro de Septembre-1 ConverSight, Voxel, AI21 et Gesund

Dans le paysage en constante évolution de la technologie, l’Intelligence Artificielle (IA) se présente comme un...

AI

Comment pouvons-nous anticiper notre relation avec l'IA ?

L'interaction entre l'homme et l'IA à l'étape actuelle ou post-AGI est toujours sujet à débat. Que vous soyez du côté...

AI

Éthique de l'IA générative

Avec tout le tumulte entourant l'intelligence artificielle générative (IA), il y a de plus en plus de questions sans ...