Questo articolo fornisce una guida per la distribuzione del modello Stable Diffusion, un popolare modello di generazione di immagini, su Google Cloud utilizzando Vertex AI. La guida tratta l'installazione e il download dei pesi, TorchServe per la distribuzione, il server TorchServe distribuito su un endpoint Vertex e il salvataggio automatico della cronologia delle immagini su GCS.
Introduzione
Stable Diffusion è un modello di generazione di immagini. È stato reso disponibile nel 2022 e ha guadagnato popolarità grazie alla sua capacità di generare immagini di alta qualità a partire da descrizioni testuali. Come altri modelli di generazione di immagini, come Dall-E, Stable Diffusion utilizza tecniche di apprendimento automatico per generare immagini in base a un dato input.
Moët Hennessy, la divisione vini e liquori del conglomerato del lusso LVMH, gestisce un portafoglio di oltre 26 marchi iconici come Moët & Chandon, Hennessy e Veuve Clicquot. Moët Hennessy ha collaborato con Artefact per studiare il potenziale utilizzo di tecnologie all'avanguardia nella generazione di contenuti di marketing. Con un'attenzione particolare alla privacy e alla sicurezza, il team ha deciso di esplorare l'implementazione di Stable Diffusion su Google Cloud Platform (GCP) per consentire a Moët Hennessy di mettere a punto ed eseguire il modello all'interno della propria infrastruttura, fornendo un'esperienza senza soluzione di continuità dalla messa a punto del modello all'esposizione delle API.
Prima di iniziare, è importante notare che questo articolo presuppone una conoscenza preliminare di Google Cloud Platform (GCP) e in particolare di Vertex AI. Ciò include concetti quali il registro dei modelli e gli endpoint Vertex. Inoltre, per seguire alcuni passaggi è necessario avere una precedente esperienza con Docker. Se non si ha familiarità con questi concetti, si consiglia di familiarizzare con essi prima di procedere.
Inoltre, per scaricare i pesi di Stable Diffusion è necessario avere un account huggingface; se non lo avete già, potete crearlo facilmente sul sito web di huggingface.
Detto questo, iniziamo!
Installazione e download dei pesi
Vi consiglio di clonare ilrepository github che ho preparato per seguire i passi dell'articolo.
È sempre importante creare un ambiente virtuale per installare i pacchetti. Personalmente, uso anaconda e installo il file requirements.txt con ogni dipendenza:
conda attivare stable_diffusion
pip install -r src/requisiti.txt
Ora siete pronti per scaricare i pesi di Stable Diffusion; in questo articolo utilizzeremo Stable Diffusion 1.5. È necessario accettare la licenza nella pagina del modello, altrimenti si verificheranno errori durante il download dei pesi del modello.
Andate al vostro account → impostazioni → token di accesso → nuovo token (accesso in lettura)

È possibile aggiungere il token come variabile d'ambiente. Personalmente, consiglio di usare un file .env e di caricare la variabile d'ambiente usando la libreria python-dotenv.
Si deve navigare in `src/stable_diffusion` ed eseguire:
Questo scaricherà i pesi all'interno
Struttura Torchserve
Torchserve è un framework per servire i modelli PyTorch. Permette di distribuire i modelli PyTorch in un ambiente di produzione e fornisce funzionalità come il versioning dei modelli e il servizio multi-modello. È stato progettato per essere facile da usare e consente di concentrarsi sulla costruzione e sulla distribuzione dei modelli, piuttosto che preoccuparsi dell'infrastruttura.
1. Creazione di un gestore che rispetti il formato TorchServe
Un gestore personalizzato è una classe Python che definisce come preelaborare i dati di input, come eseguire il modello e come postelaborare l'output. Per creare un gestore personalizzato per il proprio modello, è necessario creare una classe Python che segua il formato di TorchServe.
Un gestore personalizzato per Stable Diffusion è già presente nel repository di TorchServe. Ma l'endpoint Vertex si aspetta un formato specifico per le richieste, quindi è necessario adattare il metodo preprocess() del gestore per tener conto del formato Vertex. È possibile utilizzare la versione modificata del gestore, denominata `stable_diffusion_handler.py`, presente nel repository github di questo articolo.
2. Creazione del file .mar
Una volta creato il gestore personalizzato, è necessario impacchettarlo insieme a tutte le dipendenze e al modello stesso in un file .mar usando lo strumento model-archiver. Lo strumento model-archiver è uno strumento a riga di comando che consente di impacchettare il modello, il gestore e le dipendenze in un unico file.
Questo creerà un file .mar chiamato output.mar che contiene il modello, il gestore e le dipendenze.
Potrebbe essere necessario modificare il percorso in base alla posizione dei file sul computer:
-nome modello stable-diffusion
-versione 1.0
-handler stable_diffusion/stable_diffusion_handler.py
-percorso di esportazione stable_diffusion/model-store
-extra-files stable_diffusion/external_files
3. Esecuzione del server TorchServe
Una volta creato il file .mar, è possibile avviare il server TorchServe utilizzando il comando torchserve. Per farlo, è necessario eseguire il seguente comando:
- avvio
- ts-config=config.properties
- models=stable-diffusion.mar
- model-store=stable_diffusion/model-store
Il file config.properties consente di specificare le configurazioni del server TorchServe, come la porta per l'inferenza, i controlli sanitari, il numero di lavoratori, ecc.
ATTENZIONE: tutti gli script devono essere eseguiti nel luogo in cui si trova il file per evitare errori di percorso.
Eseguire il server TorchServe in locale
È importante testare il codice in locale prima di iniziare la distribuzione in dockerizzazione; ho già preparato uno script bash che creerà il file .mar e avvierà il server TorchServe.
È possibile eseguirlo con :
È necessario attendere qualche minuto affinché il server si inizializzi e il worker carichi il modello; è possibile iniziare a eseguire l'inferenza se viene visualizzato il seguente log:
org.pytorch.serve.wlm.WorkerThread- W-9000-stable-diffusion_1.0
Cambio di stato WORKER_STARTED -> WORKER_MODEL_LOADED
Si può quindi usare il codice seguente per fare richieste di inferenza al modello:
prompt = "la foto di un astronauta che cavalca un cavallo su Marte".
URL = "http://localhost:7080/predictions/stable-diffusion"
response = requests.post(URL, data=prompt)
È possibile verificare che il server abbia ricevuto la richiesta esaminando i log del server:
MODEL_LOG - Il backend ha ricevuto l'inferenza a: 1672929343
Stable Diffusion richiede una GPU per funzionare correttamente, quindi per il momento non si avrà alcun output. È possibile fermare il server torchserve con `torhcserve -stop`.
Dockerizzare torchserve
Il server TorchServe funziona localmente, ma per distribuire Stable Diffusion su Vertex AI è necessario dockerizzarlo. Ciò significa creare un'immagine Docker che contenga il modello, il gestore personalizzato e tutte le dipendenze necessarie. Si tratta semplicemente di tutti i passaggi che abbiamo fatto sopra all'interno di un file Docker.
Fortunatamente, è già preparato e pronto all'uso qui : Dockerfile.
È importante eseguire il contenitore in locale per verificare che funzioni correttamente. Lo costruirò localmente, ma è possibile costruirlo con cloud build ed eseguirlo sulla propria macchina.
Costruire l'immagine in locale (è necessario che il demone Docker sia in esecuzione):
La creazione dell'immagine richiede dai 20 ai 30 minuti; la fase di creazione è lunga perché i pesi del modello devono essere copiati all'interno dell'immagine prima di essere impacchettati dall'archivio dei modelli.
È possibile eseguire un container docker e ascoltare sulla porta 7080 con:
Per verificare che tutto funzioni correttamente, si può aspettare che il worker abbia caricato il modello ed eseguire lo stesso codice di inferenza di prima, dato che stiamo usando la stessa porta 7080.
Distribuzione su Vertex AI
Ora che il file Docker è pronto e funzionante, dobbiamo:
Questo è esattamente ciò che farà lo script bash deploy.sh, che può essere eseguito con:
L'installazione richiede circa 1 ora con una buona velocità di internet:
Dopo che il modello è stato collegato con successo all'endpoint, si può interrogare l'endpoint con il codice seguente:
NOME_PROGETTO = ""
REGIONE = ""
ENDPOINT_ID = ""
aip.init(progetto=NOME PROGETTO, località=REGIONE)
endpoint = aip.Endpoint(endpoint_name=ENDPOINT_ID)
text_input = """Una bottiglia di cognac invecchiato ed esclusivo
si trova su una superficie riflettente, di fronte a un bar vivace,
iperdettagliato, 4K, bokeh"".
def query_endpoint(endpoint, text_input):
payload = {“data”: text_input}
response = endpoint.predict(instances=[payload])
return response

Una bottiglia di cognac invecchiato ed esclusivo si trova su una superficie riflettente, di fronte a un bar vivace, iperdettagliato, 4K, bokeh - Diffusione stabile 1.5
L'inferenza dovrebbe richiedere tra i 10 e i 15 secondi su una GPU T4. È possibile migliorare la velocità scegliendo una GPU migliore, oppure modificando la variabile ACCELERATOR_TYPE all'interno di deploy.sh.
Opzionale: se le dimensioni dell'immagine sono troppo grandi per l'endpoint o se si desidera memorizzare la cronologia delle immagini.
È possibile che si voglia tenere traccia della cronologia delle immagini o che si verifichino errori dovuti al limite di dimensione di 1,5 MB per la risposta dell'endpoint. In questo caso, si consiglia di utilizzare il metodo post-process del gestore per salvare l'immagine all'interno di GCS e restituire solo il percorso GCS dell'immagine.
Fortunatamente, ho già preparato un gestore che fa proprio questo, passando da stable_diffusion_handler.py a stable_diffusion_handler_gcs.py.
ATTENZIONE: Prima di eseguire l'installazione client con il nuovo gestore, è necessario:
Conclusione
In questo articolo viene fornita una guida completa per l'implementazione del modello Stable Diffusion su Google Cloud Platform utilizzando Vertex AI.
La guida comprendeva passaggi essenziali quali:
È importante ricordare che, sebbene Vertex endpoint possa essere una soluzione efficace, non supporta il ridimensionamento a 0 istanze, il che potrebbe comportare un aumento dei costi poiché la GPU rimane in uso.
Inoltre, una volta completata l'implementazione del modello di diffusione stabile, stiamo esplorando ulteriori possibilità, come la messa a punto del modello su prodotti specifici di Moet Hennessy, per migliorare ulteriormente le capacità del modello.