Una guida completa alla diffusione stabile distillata: implementata con Gradio
In questo tutorial esploreremo la versione distillata di Stable Diffusion (SD) attraverso una guida approfondita, questo tutorial include anche l'uso di Gradio per dare vita al modello. Il nostro viaggio inizia con la comprensione della versione distillata della conoscenza della diffusione stabile e del suo significato.
Inoltre, proveremo a scomporre l'architettura del modello come spiegato nel documento di ricerca associato.
Il coinvolgimento con la demo del codice fornirà una conoscenza pratica dell'utilizzo del modello, contribuendo a un'esperienza di apprendimento a tutto tondo. Ti invitiamo inoltre a consultare i nostri post precedenti sul blog sulla diffusione stabile se sei interessato a saperne di più sul modello base sottostante.
Introduzione
I modelli SD sono uno dei modelli open source più famosi in generale, anche se soprattutto per le loro capacità nella generazione di testo in immagini. SD ha dimostrato capacità eccezionali ed è stato una spina dorsale in diverse applicazioni per la generazione di testo e immagini. I modelli SD sono modelli di diffusione latente, le operazioni di diffusione in questi modelli vengono svolte in uno spazio semanticamente compresso. All'interno di un modello SD, una U-Net esegue un campionamento iterativo per rimuovere gradualmente il rumore da un codice latente generato casualmente. Questo processo è supportato sia da un codificatore di testo che da un decodificatore di immagini, che lavorano in collaborazione per generare immagini in linea con le descrizioni di testo fornite o le istruzioni. Tuttavia, questo processo diventa computazionalmente costoso e spesso ne ostacola l’utilizzo. Per affrontare il problema sono stati introdotti numerosi approcci.
Lo studio dei modelli di diffusione ha sbloccato il potenziale di compressione dell'architettura classica per ottenere un modello più piccolo e più veloce. La ricerca condotta per ottenere una versione distillata di SD, riduce le fasi di campionamento e applica la quantizzazione della rete senza modificare le architetture originali. Questo processo ha dimostrato una maggiore efficienza. Questo modello di versione distillata ne dimostra l’efficacia, anche con vincoli di risorse. Con soli 13 giorni A100 e un piccolo set di dati, questi modelli compatti si sono rivelati in grado di imitare efficacemente i modelli di diffusione stabile (SDM) originali. Dato il costo associato all’addestramento degli SDM dal punto zero, che supera i 6.000 giorni A100 e coinvolge 2.000 milioni di coppie, la ricerca mostra che la compressione di rete emerge come un approccio particolarmente conveniente quando si costruiscono modelli di diffusione compatti e versatili.
Fonte
Prerequisiti
Conoscenze di base del machine learning:
Comprensione delle reti neurali, in particolare dei modelli di diffusione.
Familiarità con concetti come spazio latente e generazione di immagini.
Requisiti hardware:
Una macchina con una GPU (abilitata per NVIDIA CUDA) per un'inferenza più rapida (ad esempio, A100, H100 o almeno una GPU della serie RTX 20xx/30xx).
Configurazione dell'ambiente:
Accesso a
Jupyter Notebook
o qualsiasi IDE (ad esempio, VS Code, PyCharm).-
Familiarità di base con gli ambienti virtuali (ad esempio,
venv
,conda
) per evitare conflitti. Checkpoint del modello preaddestrato:
Accesso ai punti di controllo del modello SD distillati da piattaforme come Hugging Face Model Hub.
Cos'è la diffusione stabile distillata?
La diffusione stabile appartiene ai modelli di deep learning chiamati modelli di diffusione. Questo modello di diffusione da testo a immagine di grandi dimensioni (T2I) funziona rimuovendo il rumore dai dati rumorosi e randomizzati. I modelli SD vengono generalmente addestrati su miliardi di set di dati di immagini e sono addestrati a generare nuovi dati da ciò che hanno appreso durante l'addestramento del modello.
Il concetto di diffusione inizia con l'aggiunta di rumore casuale a un'immagine, supponiamo che l'immagine sia l'immagine di un gatto. A poco a poco, aggiungendo rumore all'immagine, l'immagine si trasforma in un'immagine estremamente sfocata che non può essere ulteriormente riconosciuta. Questa si chiama diffusione diretta.
Fonte
Poi arriva la parte più importante, la diffusione inversa. In questo caso, l'immagine originale viene ripristinata rimuovendo il rumore in modo iterativo. Per eseguire la diffusione inversa, è essenziale comprendere la quantità di rumore introdotta in un'immagine. Ciò comporta l'addestramento di un modello di rete neurale profonda per prevedere il rumore aggiunto, denominato predittore del rumore in Diffusione stabile. Il predittore del rumore assume la forma di un modello U-Net.
Il passaggio iniziale prevede la creazione di un'immagine casuale e l'utilizzo di un predittore di rumore per prevedere il rumore all'interno di tale immagine. Successivamente, sottraiamo questo rumore stimato dall'immagine originale e questo processo viene ripetuto iterativamente. Dopo alcune iterazioni, il risultato è un'immagine che rappresenta un gatto o un cane.
Fonte
Tuttavia, questo processo non è un processo efficiente e per accelerare il processo viene introdotto il modello di diffusione latente. La diffusione stabile funziona come un modello di diffusione latente. Invece di lavorare all’interno dello spazio dell’immagine ad alta dimensione, inizialmente comprime l’immagine in uno spazio latente. Questo spazio latente è 48 volte più piccolo, con il vantaggio di elaborare un numero significativamente inferiore di numeri. Questo è il motivo delle sue prestazioni notevolmente più veloci. La diffusione stabile utilizza una tecnica chiamata Variational Autoencoder o rete neurale VAE. Questo VAE è composto da due parti: un codificatore e un decodificatore. Il codificatore comprime l'immagine in un'immagine di dimensione inferiore e il decodificatore ripristina l'immagine.
Durante l'addestramento, invece di generare immagini rumorose, il modello genera tensore nello spazio latente. Invece di introdurre rumore direttamente in un'immagine, la diffusione stabile interrompe l'immagine nello spazio latente con rumore latente. Questo approccio è scelto per la sua efficienza, poiché operare nello spazio latente più piccolo si traduce in un processo notevolmente più veloce.
Tuttavia, qui stiamo parlando di immagini ora, la domanda è: da dove viene il testo dell'immagine?
Negli SDM, un prompt di testo viene passato a un tokenizzatore per convertire il prompt in token o numeri. I token sono valori numerici che rappresentano le parole e vengono utilizzati dal computer per comprendere queste parole. Ciascuno di questi token viene quindi convertito in un vettore di 768 valori chiamato incorporamento. Successivamente, questi incorporamenti vengono elaborati dal trasformatore di testo. Alla fine l'uscita dei trasformatori viene inviata al Noise Predictor U-Net.
Fonte
Il modello SD avvia un tensore casuale nello spazio latente, questo tensore casuale può essere controllato dal seme del generatore di numeri casuali. Questo rumore è l'immagine nello spazio latente. Il predittore del rumore prende in considerazione questa immagine rumorosa latente e il prompt e prevede il rumore nello spazio latente (tensore 4x64x64).
Inoltre, questo rumore latente viene sottratto all'immagine latente per generare la nuova immagine latente. Questi passaggi vengono ripetuti e possono essere regolati tramite i passaggi di campionamento. Successivamente, il decodificatore VAE converte l'immagine latente in spazio pixel, generando l'immagine allineata al prompt.
Nel complesso, il modello di diffusione latente combina elementi di probabilità, modellazione generativa e processi di diffusione per creare un quadro per la generazione di dati complessi e realistici da uno spazio latente.
L'uso della diffusione stabile può essere computazionalmente costoso in quanto comporta la rimozione del rumore latente in modo iterativo per generare un'immagine. Per ridurre la complessità del modello, viene introdotto il modello Distilled Stable Diffusion di Nota AI. Questa versione distillata semplifica UNet rimuovendo alcuni blocchi residui e di attenzione di SDM, con una conseguente riduzione del 51% delle dimensioni del modello e un miglioramento del 43% della latenza su CPU/GPU. Questo lavoro è stato in grado di ottenere risultati maggiori pur rispettando il budget.
Come discusso nel documento di ricerca, Negli SDM distillati dalla conoscenza, U-Net è semplificata, che è la parte più intensiva dal punto di vista computazionale del sistema. La U-Net, incorporata da testo e informazioni in fasi temporali, passa attraverso fasi di denoising per generare rappresentazioni latenti. I calcoli per passo in U-Net sono ulteriormente ridotti al minimo, risultando in un modello più efficiente. L'architettura del modello ottenuto comprimendo SDM-v1 è mostrata nell'immagine sottostante.
Immagine dal documento di ricerca originale
Demo del codice
Fare clic sul collegamento fornito in questo articolo e accedere al notebook distilled_stable_diffusion.ipynb. Seguire i passaggi per eseguire il notebook.
Iniziamo installando le librerie richieste. Oltre alle librerie DSD installeremo anche Gradio.
!pip install --quiet git+https://github.com/huggingface/diffusers.git@d420d71398d9c5a8d9a5f95ba2bdb6fe3d8ae31f
!pip install --quiet ipython-autotime
!pip install --quiet transformers==4.34.1 accelerate==0.24.0 safetensors==0.4.0
!pip install --quiet ipyplot
!pip install gradio
%load_ext autotime
Successivamente, costruiremo la pipeline, genereremo la prima immagine e salveremo l'immagine generata.
# Import the necessary libraries
from diffusers import StableDiffusionXLPipeline
import torch
import ipyplot
import gradio as gr
pipe = StableDiffusionXLPipeline.from_pretrained("segmind/SSD-1B", torch_dtype=torch.float16, use_safetensors=True, variant="fp16")
pipe.to("cuda")
prompt = "an orange cat staring off with pretty eyes, Striking image, 8K, Desktop background, Immensely sharp."
neg_prompt = "ugly, poorly Rendered face, low resolution, poorly drawn feet, poorly drawn face, out of frame, extra limbs, disfigured, deformed, body out of frame, blurry, bad composition, blurred, watermark, grainy, signature, cut off, mutation"
image = pipe(prompt=prompt, negative_prompt=neg_prompt).images[0]
image.save("test.jpg")
ipyplot.plot_images([image],img_width=400)
Risultato immagine
Il codice sopra importa la classe "StableDiffusionXLPipeline" dal modulo "diffusers". Dopo aver importato le librerie necessarie, creeremo un'istanza della classe "StableDiffusionXLPipeline" denominata "pipe". Successivamente, caricheremo il modello pre-addestrato denominato "segmind/SSD-1B" nella pipeline. Il modello è configurato per utilizzare la precisione in virgola mobile a 16 bit specificata nell'argomento dtype e i tensori sicuri sono abilitati. La variante è impostata su “fp16”. Poiché utilizzeremo la "GPU", sposteremo la pipeline sul dispositivo CUDA per un calcolo più rapido.
Miglioriamo ulteriormente il codice, regolando la scala di guida, che influisce sulle istruzioni sulla generazione dell'immagine. In questo caso, è impostato su 7,5. Il parametro 'num_inference_steps' è impostato su 30, questo numero indica i passaggi da eseguire durante il processo di generazione dell'immagine.
allimages = pipe(prompt=prompt, negative_prompt=neg_prompt,guidance_scale=7.5,num_inference_steps=30,num_images_per_prompt=2).images
Crea la tua interfaccia utente Web utilizzando Gradio
Gradio fornisce il metodo più rapido per mostrare il tuo modello di machine learning attraverso un'interfaccia web intuitiva, consentendo l'accessibilità a chiunque. Impariamo come creare una semplice interfaccia utente utilizzando Gradio.
Definire una funzione per generare le immagini che utilizzeremo per costruire l'interfaccia gradio.
def gen_image(text, neg_prompt):
return pipe(text,
negative_prompt=neg_prompt,
guidance_scale=7.5,
num_inference_steps=30).images[0]
Successivamente, lo snippet di codice utilizza la libreria Gradio per creare una semplice interfaccia web per generare immagini generate dall'intelligenza artificiale utilizzando una funzione chiamata gen_image
.
txt = gr.Textbox(label="prompt")
txt_2 = gr.Textbox(label="neg_prompt")
Due caselle di testo (txt
e txt_2
) sono definite utilizzando la classe gr.Textbox
. Queste caselle di testo fungono da campi di input in cui gli utenti possono inserire dati di testo. Questi campi vengono utilizzati per inserire il prompt e il prompt negativo.
#Gradio Interface Configuration
demo = gr.Interface(fn=gen_image, inputs=[txt, txt_2], outputs="image", title="Generate A.I. image using Distill Stable Diffusion😁")
demo.launch(share=True)
- Specificare innanzitutto la funzione
gen_image
come funzione da eseguire quando l'interfaccia riceve input. - Definisce i componenti di input per l'interfaccia, ovvero le due caselle di testo per il prompt e il prompt negativo (
txt
etxt_2
). outputs="image"
: genera l'output dell'immagine e imposta il titolo dell'interfacciatitle="Genera immagine A.I. utilizzando Distill Stable Diffusion😁"
- Il metodo
launch
viene chiamato per avviare l'interfaccia Gradio. Il parametroshare=True
indica che l'interfaccia dovrebbe essere resa condivisibile, consentendo ad altri di accedervi e utilizzarla.
In sintesi, questo codice configura un'interfaccia Gradio con due caselle di testo per l'input dell'utente, la collega a una funzione (gen_image
) per l'elaborazione, specifica che l'output è un'immagine e avvia l'interfaccia per la condivisione. Possiamo inserire suggerimenti e suggerimenti negativi nelle caselle di testo per generare immagini generate dall'intelligenza artificiale attraverso la funzione fornita.
Il modello SSD-1B
Recentemente, Segmind ha lanciato il modello di base open source, SSD-1B, e ha affermato di essere il modello di diffusione testo-immagine più veloce. Sviluppato come parte della serie di distillazione, SSD-1B mostra una riduzione delle dimensioni del 50% e un aumento della velocità del 60% rispetto al modello SDXL 1.0. Nonostante questi miglioramenti, c'è solo un compromesso marginale nella qualità dell'immagine rispetto a SDXL 1.0. Inoltre, il modello SSD-1B ha ottenuto una licenza commerciale, offrendo ad aziende e sviluppatori l'opportunità di incorporare questa tecnologia all'avanguardia nelle loro offerte.
Questo modello è la versione distillata dell'SDXL e ha dimostrato di generare immagini di qualità superiore più velocemente e allo stesso tempo convenienti.
La NotaAI/bk-sdm-small
Un'altra versione distillata di SD da Nota AI è molto comune per le generazioni T2I. Il modello di diffusione stabile distillata dalla conoscenza rimossa dai blocchi (BK-SDM) rappresenta una versione strutturalmente semplificata di SDM, progettata per un'efficiente sintesi testo-immagine per scopi generali. La sua architettura prevede (i) l'eliminazione di più blocchi residui e di attenzione da U-Net of Stable Diffusion v1.4 e (ii) il pre-allenamento tramite distillazione utilizzando solo 0,22 milioni di coppie LAION, ovvero meno dello 0,1% del set di addestramento completo. Nonostante l’utilizzo di risorse significativamente limitate nella formazione, questo modello compatto dimostra la capacità di imitare l’SDM originale attraverso l’efficace trasferimento delle conoscenze.
La versione Distilled è davvero veloce?
Ora, sorge la domanda: queste versioni distillate di SD sono davvero veloci e c'è solo un modo per scoprirlo.
In questa valutazione, valuteremo quattro modelli appartenenti alla famiglia della diffusione. Utilizzeremo segmind/SSD-1B, Stabilityai/stable-diffusion-xl-base-1.0, nota-ai/bk-sdm-small, CompVis/stable-diffusion-v1-4 per il nostro scopo di valutazione. Non esitate a fare clic sul collegamento per un'analisi comparativa dettagliata su SSD-1B e SDXL.
Carichiamo tutti i modelli e confrontiamoli:
import torch
import time
import ipyplot
from diffusers import StableDiffusionPipeline, StableDiffusionXLPipeline, DiffusionPipeline
Nello snippet di codice seguente utilizzeremo 4 diversi modelli preaddestrati della famiglia Stable Diffusion e creeremo una pipeline per la sintesi da testo a immagine.
#text-to-image synthesis pipeline using the "bk-sdm-small" model from nota-ai
distilled = StableDiffusionPipeline.from_pretrained(
"nota-ai/bk-sdm-small", torch_dtype=torch.float16, use_safetensors=True,
).to("cuda")
#text-to-image synthesis pipeline using the "stable-diffusion-v1-4" model from CompVis
original = StableDiffusionPipeline.from_pretrained(
"CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16, use_safetensors=True,
).to("cuda")
#text-to-image synthesis pipeline using the original "stable-diffusion-xl-base-1.0" model from stabilityai
SDXL_Original = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16,
use_safetensors=True, variant="fp16"
).to("cuda")
#text-to-image synthesis pipeline using the original "SSD-1B" model from segmind
ssd_1b = StableDiffusionXLPipeline.from_pretrained(
"segmind/SSD-1B", torch_dtype=torch.float16, use_safetensors=True,
variant="fp16"
).to("cuda")
Una volta caricato il modello e create le pipeline, utilizzeremo questi modelli per generare alcune immagini e verificare il tempo di inferenza per ciascuno dei modelli. Tieni presente che tutte le pipeline del modello non dovrebbero essere incluse in una singola cella, altrimenti si potrebbero riscontrare problemi di memoria.
Modello
Tempo di inferenza
stabilitàai/diffusione-stabile-xl-base-1.0
82212,8 ms
segmind/SSD-1B
59382,0 ms
CompVis/diffusione-stabile-v1-4
15356,6 ms
nota-ai/bk-sdm-small
10027,1 ms
Il modello bk-sdm-small ha impiegato il minor tempo di inferenza, inoltre il modello è stato in grado di generare immagini di alta qualità.
stabilitàai/diffusione-stabile-xl-base-1.0
segmind/SSD-1B
CompVis/diffusione-stabile-v1-4
nota-ai/bk-sdm-small
Considerazioni conclusive
In questo articolo, abbiamo fornito una panoramica concisa del modello di diffusione stabile ed esplorato il concetto di diffusione stabile distillata. La diffusione stabile (SD) emerge come una potente tecnica per generare nuove immagini attraverso istruzioni semplici. Inoltre, abbiamo esaminato quattro modelli della famiglia SD, evidenziando che il modello bk-sdm-small ha dimostrato il tempo di inferenza più breve. Ciò mostra quanto siano efficienti i modelli KD rispetto al modello originale.
È anche importante riconoscere che esistono alcune limitazioni del modello distillato. In primo luogo, non raggiunge un fotorealismo impeccabile e la resa leggibile del testo va oltre le sue attuali capacità. Inoltre, di fronte a compiti complessi che richiedono una comprensione compositiva, le prestazioni del modello potrebbero diminuire. Inoltre, le rappresentazioni facciali e umane generali potrebbero non essere generate in modo accurato. È fondamentale notare che i dati di addestramento del modello consistono principalmente in sottotitoli in inglese, il che può comportare una riduzione dell’efficacia se applicati ad altre lingue.
Inoltre, va notato che nessuno dei modelli qui impiegati dovrebbe essere utilizzato per la generazione di immagini inquietanti, angoscianti o offensive. Uno dei principali vantaggi derivanti dalla distillazione di questi modelli ad alte prestazioni consente di ridurre significativamente i requisiti di calcolo generando immagini di alta qualità.
Riferimenti
- Diffusione stabile
- Inferenza con SSD 1B: un modello distillato Stable Diffusion XL più piccolo del 50% e più veloce del 60%
- Annuncio di SSD-1B: un salto di qualità nell'efficiente generazione T2I
- Condutture di diffusione stabile
- Inferenza sulla diffusione stabile distillata
- nota-ai/bk-sdm-small
- stabilitàai/diffusione-stabile-xl-base-1.0
- BK-SDM: una versione leggera, veloce ed economica della diffusione stabile