SDXL in 4 passaggi con Latent Consistency LoRAs

SDXL in 4 passaggi con Latente Coerenza LoRAs

I modelli di coerenza latente (LCM) sono un modo per ridurre il numero di passaggi necessari per generare un’immagine con Stable Diffusion (o SDXL) distillando il modello originale in un’altra versione che richiede meno passaggi (da 4 a 8 anziché 25 a 50). La distillazione è un tipo di procedura di addestramento che cerca di replicare le uscite di un modello di origine utilizzando un nuovo modello. Il modello distillato può essere progettato per essere più piccolo (come nel caso di DistilBERT o del recentemente rilasciato Distil-Whisper) o, in questo caso, richiedere meno passaggi per essere eseguito. Di solito è un processo lungo e costoso che richiede enormi quantità di dati, pazienza e qualche GPU.

Bene, questo era lo status quo fino ad oggi!

Siamo lieti di annunciare un nuovo metodo che può rendere essenzialmente Stable Diffusion e SDXL più veloci, come se fossero stati distillati utilizzando il processo LCM! Come vi suona l’idea di eseguire qualsiasi modello SDXL in circa 1 secondo anziché 7 su una 3090, o 10 volte più veloce su Mac? Continuate a leggere per i dettagli!

Contenuti

Panoramica del metodo

Allora, qual è il trucco? Per la distillazione della coerenza latente, ogni modello deve essere distillato separatamente. L’idea principale con LCM LoRA è quella di addestrare solo un piccolo numero di adattatori, conosciuti come strati LoRA, invece dell’intero modello. I LoRA risultanti possono quindi essere applicati a qualsiasi versione del modello sottoposto a fine-tuning senza doverli distillare separatamente. Se siete impazienti di vedere come funziona questo in pratica, passate alla sezione successiva per provare il codice di inferenza. Se volete addestrare i vostri LoRA, questo è il processo che dovreste seguire:

  1. Seleziona un modello di insegnante disponibile dall’Hub. Ad esempio, puoi utilizzare SDXL (base), o qualsiasi versione ottimizzata o dreamboothed che preferisci.
  2. Allenare un LCM LoRA sul modello. LoRA è un tipo di ottimizzazione di prestazioni efficiente, o PEFT, che è molto più economico da realizzare rispetto all’ottimizzazione completa del modello. Per ulteriori dettagli su PEFT, consulta questo post del blog o la documentazione diffusori LoRA.
  3. Utilizza il LoRA con qualsiasi modello di diffusione SDXL e il programmatore LCM; bingo! Ottieni l’infrazione di alta qualità in pochi semplici passi.

Per ulteriori dettagli sul processo, scarica il nostro articolo.

Perché è importante?

Un’infrazione rapida della diffusione stabile e SDXL consente nuovi casi d’uso e flussi di lavoro. Alcuni esempi sono:

  • Accessibilità: gli strumenti generativi possono essere utilizzati in modo efficace da più persone, anche se non hanno accesso all’hardware più recente.
  • Iterazione più veloce: ottieni più immagini e varianti multiple in una frazione del tempo! Questo è fantastico per artisti e ricercatori, sia per uso personale che commerciale.
  • È possibile eseguire carichi di lavoro di produzione su diversi acceleratori, inclusi i processori.
  • Servizi di generazione di immagini più economici.

Per valutare la differenza di velocità di cui stiamo parlando, la generazione di un singolo’immagine 1024×1024 su un Mac M1 con SDXL (base) richiede circa un minuto. Utilizzando il LCM LoRA, otteniamo ottimi risultati in soli ~6s (4 passaggi). Questo è un ordine di grandezza più veloce e non dover aspettare i risultati è un cambiamento di gioco. Utilizzando un 4090, otteniamo una risposta quasi istantanea (meno di 1s). Questo sblocca l’uso di SDXL in applicazioni in cui gli eventi in tempo reale sono un requisito.

Infrazione rapida con SDXL LCM LoRA

La versione di diffusers rilasciata oggi rende molto facile utilizzare 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.load_lora_weights(lcm_lora_id)pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)pipe.to(device="cuda", dtype=torch.float16)prompt = "fotografia ravvicinata di un vecchio in piedi sotto la pioggia di notte, in una strada illuminata da lampioni, leica 35mm summilux"images = pipe(    prompt=prompt,    num_inference_steps=4,    guidance_scale=1,).images[0]

Nota come il codice:

  • Istanzia una pipeline di diffusione standard con il modello SDXL 1.0 base.
  • Applica il LCM LoRA.
  • Cambia il programmatore con LCMScheduler, che è quello utilizzato nei modelli di coerenza latenti.
  • E questo è tutto!

Ciò produrrà l’immagine ad alta risoluzione seguente:

SDXL in 4 passaggi con LCM LoRAImmagine generata con SDXL in 4 passaggi utilizzando un LCM LoRA.

Confronto di qualità

Vediamo come il numero di passaggi influisce sulla qualità di generazione. Il seguente codice genererà immagini con un totale di 1 a 8 passaggi di infrazione:

images = []
per 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)

Queste sono le 8 immagini visualizzate in una griglia:

Generazioni LCM LoRA da 1 a 8 passaggiGenerazioni LCM LoRA da 1 a 8 passaggi

Come ci si può aspettare, utilizzando solo 1 passaggio si ottiene una forma approssimativa senza caratteristiche discernibili e senza texture. Tuttavia, i risultati migliorano rapidamente e sono generalmente molto soddisfacenti già dopo 4 o 6 passaggi. Personalmente, trovo che l’immagine a 8 passaggi nel test precedente sia un po’ troppo saturata e “cartoon” per i miei gusti, quindi probabilmente sceglierei tra quelle a 5 e 6 passaggi in questo esempio. La generazione è così veloce che puoi creare diverse varianti utilizzando solo 4 passaggi, e poi selezionare quelle che ti piacciono e iterare utilizzando un paio di passaggi in più e prompt raffinati se necessario.

Guidance Scale e Negative Prompts

Notevole che negli esempi precedenti abbiamo utilizzato una guidance_scale di 1, che la disabilita effettivamente. Questo funziona bene per la maggior parte dei prompt ed è il più veloce, ma ignora i negative prompts. Puoi anche esplorare l’uso di negative prompts fornendo una scala di guida tra 1 e 2 – abbiamo scoperto che valori più elevati non funzionano.

Qualità rispetto a SDXL base

Come si confronta questo con la pipeline SDXL standard in termini di qualità? Vediamo un esempio!

Puoi rapidamente ripristinare la nostra pipeline a una pipeline SDXL standard scaricando i pesi di LoRA e passando allo scheduler predefinito:

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

Quindi possiamo eseguire l’inferenza come al solito per SDXL. Raccoglieremo i risultati utilizzando un numero variabile di passaggi:

images = []per 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)

Risultati SDXL per vari passaggi di inferenzaRisultati pipeline SDXL (stesso prompt e seed casuale), utilizzando 1, 4, 8, 15, 20, 25, 30 e 50 passaggi.

Come puoi vedere, le immagini in questo esempio sono praticamente inutilizzabili fino a ~20 passaggi (seconda riga), e la qualità aumenta ancora notevolmente con più passaggi. I dettagli nell’immagine finale sono incredibili, ma ci sono voluti 50 passaggi per arrivarci.

LCM LoRA con altri modelli

Questa tecnica funziona anche per qualsiasi altro modello SDXL o modello Stable Diffusion. Per dimostrarlo, vediamo come eseguire l’inferenza su collage-diffusion, un modello preaddestrato da Stable Diffusion v1.5 utilizzando Dreambooth.

Il codice è simile a quello che abbiamo visto negli esempi precedenti. Carichiamo il modello preaddestrato e poi LCM LoRA adatto per Stable Diffusion 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 = "collage style kid sits looking at the night sky, full of stars"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

LCM LoRA technique with a Dreambooth Stable Diffusion v1.5 model, allowing 4-step inference.Tecnica LCM LoRA con il modello Dreambooth Stable Diffusion v1.5, che consente un’elaborazione a 4 passi.

Integrazione completa dei diffusori

L’integrazione di LCM nei diffusori consente di sfruttare molte funzioni e flussi di lavoro che fanno parte della cassetta degli attrezzi dei diffusori. Ad esempio:

  • Supporto mps pronto all’uso per Mac con Apple Silicon.
  • Ottimizzazioni di memoria e prestazioni come l’attention flash o torch.compile().
  • Strategie aggiuntive di risparmio di memoria per ambienti a bassa RAM, inclusa l’esternalizzazione del modello.
  • Flussi di lavoro come ControlNet o image-to-image.
  • Script di formazione e afiinamento.

Benchmark

Questa sezione non ha la pretesa di essere esaustiva, ma illustra la velocità di generazione che raggiungiamo su diversi computer. Sottolineamo ancora una volta quanto sia liberatorio esplorare la generazione di immagini in modo così facile.

Questi test sono stati eseguiti con una dimensione del batch pari a 1 in tutti i casi, utilizzando questo script di Sayak Paul.

Per schede con molta capacità, come A100, le prestazioni aumentano significativamente quando si generano più immagini contemporaneamente, il che è di solito il caso per i carichi di lavoro di produzione.

LCM LoRA e Modelli rilasciati oggi

Bonus: Combina LCM LoRAs con SDXL LoRAs regulares

Usando la integración de difusores + PEFT, puedes combinar LCM LoRAs con SDXL LoRAs regulares, dándoles el superpoder de ejecutar inferencia LCM en solo 4 pasos.

Aquí vamos a combinar el LoRA CiroN2022/toy_face con el LoRA LCM:

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 hombre con cara de juguete"negative_prompt = "borroso, baja calidad, renderizado, 3D, sobresaturado"images = pipe(    prompt=prompt,    negative_prompt=negative_prompt,    num_inference_steps=4,    guidance_scale=0.5,).images[0]images

Combinación de LoRAs para una inferencia rápidaLoRAs estándar y LCM combinados para una inferencia rápida (4 pasos).

¿Necesitas ideas para explorar algunos LoRAs? ¡Consulta nuestro espacio experimental LoRA the Explorer (versión LCM) para probar creaciones increíbles de la comunidad e inspirarte!

Cómo entrenar modelos y LoRAs LCM

Como parte del lanzamiento de diffusers hoy, proporcionamos scripts de entrenamiento y ajuste fino desarrollados en colaboración con los autores del equipo LCM. Permiten a los usuarios:

  • Realizar la destilación de modelos completos de Stable Diffusion o SDXL en conjuntos de datos grandes como Laion.
  • Entrenar LCM LoRAs, que es un proceso mucho más fácil. Como hemos mostrado en este post, también permite ejecutar una inferencia rápida con Stable Diffusion, sin tener que pasar por el entrenamiento de destilación.

Para obtener más detalles, consulta las instrucciones para SDXL o Stable Diffusion en el repositorio.

Esperamos que estos scripts inspiren a la comunidad a probar sus propios ajustes finos. ¡Por favor, avísanos si los utilizas para tus proyectos!

Recursos

Crediti

Il fantastico lavoro sui Modelli di Consistenza Latenti è stato svolto dal Team LCM, assicurati di controllare il loro codice, il loro report e il loro paper. Questo progetto è una collaborazione tra il team diffusers, il team LCM e il contributore della comunità Daniel Gu. Crediamo che questo sia una testimonianza del potere abilitante dell’intelligenza artificiale open source, la pietra angolare che permette ai ricercatori, ai praticanti e ai smanettoni di esplorare nuove idee e collaborare. Vorremmo anche ringraziare @madebyollin per i loro continui contributi alla comunità, inclusa l’autocoder float16 che utilizziamo nei nostri script di addestramento.