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
- Perché questo è importante
- Inferenza rapida con SDXL LCM LoRAs
- Benchmarks
- LCM LoRAs e modelli rilasciati oggi
- Bonus: Combinare LCM LoRAs con LCM LoRAs SDXL regolari
- Come addestrare LCM LoRAs
- Risorse
- Crediti
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:
- Auricolari per Monitorare il Cervello e il Corpo
- Entra in un mondo di Samurai e Demoni Giovedì di GFN porta il gioco di Capcom ‘Onimusha Warlords’ sul Cloud
- 11 idee personalizzate di GPT per fare soldi sul GPT Store di OpenAI
- Seleziona un modello di insegnante disponibile dall’Hub. Ad esempio, puoi utilizzare SDXL (base), o qualsiasi versione ottimizzata o dreamboothed che preferisci.
- 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.
- 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:
Immagine 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 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 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
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
-
Collezione di modelli di coerenza latente LoRAs
latent-consistency/lcm-lora-sdxl
. LCM LoRA per base SDXL 1.0, come visto negli esempi sopra.latent-consistency/lcm-lora-sdv1-5
. LCM LoRA per Stable Diffusion 1.5.latent-consistency/lcm-lora-ssd-1b
. LCM LoRA persegmind/SSD-1B
, un modello SDXL distillato che è il 50% più piccolo e il 60% più veloce dell’originale SDXL.
-
latent-consistency/lcm-sdxl
. Modello di coerenza completamente raffinato derivato da base SDXL 1.0. -
latent-consistency/lcm-ssd-1b
. Modello di coerenza completamente raffinato derivato dasegmind/SSD-1B
.
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
LoRAs 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
-
Página del proyecto de Modelos de Consistencia Latente page, documento.
-
Demos
-
PEFT: introducción, repositorio
-
Scripts de entrenamiento
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.