Leggi il nostro articolo su

class="img-responsive

.

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 create -n stable_diffusion - no-default-packages python=3.8 -y
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)

Accedere al proprio 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:

python download_model.py

Questo scaricherà i pesi all'interno

`src/stable_diffusion/external_files/model_weights`.

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:

torch-model-archiver
-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:

torcia
- 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 :


bash serve_locally.sh

È 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:

2023-01-05T15:34:52,842 [DEBUG] W-9000-stable-diffusion_1.0
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:

importare le richieste
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:

2023-01-05T15:35:43,765 [INFO ] W-9000-stable-diffusion_1.0-stdout
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):

build -t serve_sd .

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:

docker run -p 7080:7080 serve_sd

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:

  • Creare l'immagine utilizzando Cloud Build all'interno del registro dei container di Google (gcr).
  • Caricare l'immagine del modello personalizzato all'interno del registro dei modelli Vertex AI.

  • Creare un endpoint Vertex AI
  • Collegare il modello all'endpoint

Questo è esattamente ciò che farà lo script bash deploy.sh, che può essere eseguito con:

bash deploy.sh

L'installazione richiede circa 1 ora con una buona velocità di internet:

  • L'invio degli 8 GB di pesi del modello a Cloud Build può richiedere da pochi minuti a ore, a seconda della velocità di internet.
  • La costruzione dell'immagine richiede circa 20 minuti

  • Il caricamento del modello richiede circa 5 minuti

  • La creazione dell'endpoint richiede circa 5 minuti

  • Il collegamento del modello all'endpoint richiede da 30 a 40 minuti.

Dopo che il modello è stato collegato con successo all'endpoint, si può interrogare l'endpoint con il codice seguente:

da google.cloud import aiplatform as aip

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

immagine = query_endpoint(endpoint, text_input)
class="img-responsive

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:

  • Creare un bucket GCS per memorizzare le immagini

  • Modificare il nome del nuovo bucket GCS e della cartella all'interno di src/stable_diffusion/external_files/config.py

  • Modificare l'account di servizio utilizzato dall'endpoint all'interno del file deploy.sh. È necessario un account di servizio con autorizzazioni GCS OWNER.

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:

  • Utilizzo di TorchServe per la distribuzione
  • Creazione e modifica di un gestore personalizzato per la Diffusione stabile
  • Distribuzione del modello tramite il registro dei modelli Vertex e gli endpoint Vertex

È 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.

class="img-responsive

Medium Blog di Artefact.

Questo articolo è stato pubblicato inizialmente su Medium.com.
Seguiteci sul nostro blog Medium!