Generazione di immagini con diffusione stabile e OnnxStream sul Raspberry Pi |  di Pye Sone Kyaw |  Gennaio 2024

 | Intelligenza-Artificiale

Scopri come utilizzare OnnxStream per generare immagini con Stable Diffusion XL Turbo sul Raspberry Pi!

Immagini generate utilizzando SDXL Turbo sul Raspberry Pi, ciascuna impiegando circa 3 minuti | Fonte: Autore

Nel mio ultimo articolo ho spiegato come eseguire modelli linguistici di grandi dimensioni e modelli di linguaggio visivo sul Raspberry Pi. Questa volta, invece di LLM e VLM, eseguiremo un modello di generazione di immagini: Diffusione stabile XL (SDXL) Turbo – sul Raspberry Pi 5. È un’altra impresa che sembra impossibile, ma esistono meraviglie open source e l’esecuzione di un modello SDXL Turbo su un ambiente con risorse molto limitate è una di queste.

OnnxStream è un progetto open source creato da Vito Plantamura con l’intenzione originale di eseguire Stable Diffusion 1.5 (SD1.5) su un Raspberry Pi Zero 2 riducendo al minimo il consumo di memoria il più possibile, anche se a costo di una maggiore latenza/throughput di inferenza.

Al momento in cui scrivo, è stato ampliato per supportare non solo Stable Diffusion 1.5 ma anche Stable Diffusion XL 1.0 Base (SDXL) e Stable Diffusion XL Turbo 1.0. Non entrerò nei dettagli su come esattamente questa straordinaria impresa sia stata raggiunta dal Repositorio GitHub lo spiega già molto bene.

Invece, passiamo direttamente a farlo funzionare.

Tutto ciò di cui hai bisogno è quanto segue:

  • Raspberry Pi 5 — O Raspberry Pi 4 o qualsiasi altro Raspberry Pi, aspettati solo che sia più lento
  • Scheda SD: minimo 16 GB, con Raspbian o qualche distribuzione Linux già configurata. I pesi della SDXL Turbo si aggirano intorno agli 8GB.
  • Una connessione Internet
Immagini generate in un unico passaggio di diffusione sul Raspberry Pi | Fonte: Autore

Le istruzioni qui provengono dal repository GitHub, ma le analizzerò e le spiegherò un po’ di più.

1. Creazione di XNNPack

Per prima cosa dobbiamo installare XNNPackche è una libreria di Google che fornisce “operatori di inferenza di reti neurali in virgola mobile ad alta efficienza”. Ma non possiamo semplicemente ottenere l’ultima versione in caso di modifiche importanti. Invece, otterremo la versione che il creatore di OnnxStream ha verificato funzionante al momento della scrittura. In un terminale, esegui:

git clone https://github.com/google/XNNPACK.git
cd XNNPACK
git checkout 579de32260742a24166ecd13213d2e60af862675
mkdir build
cd build
cmake -DXNNPACK_BUILD_TESTS=OFF -DXNNPACK_BUILD_BENCHMARKS=OFF ..
cmake --build . --config Release

La creazione di XNNPack richiederà un paio di minuti. Vai a prendere un caffè o qualcosa del genere.

2. Creazione di OnnxStream

Successivamente, dobbiamo creare OnnxStream. In un terminale, esegui:

git clone https://github.com/vitoplantamura/OnnxStream.git
cd OnnxStream
cd src
mkdir build
cd build
cmake -DMAX_SPEED=ON -DXNNPACK_DIR=<DIRECTORY_WHERE_XNNPACK_WAS_CLONED> ..
cmake --build . --config Release

Assicurati di sostituire con il percorso in cui è stato clonato XNNPack (non la cartella di build). Nel mio caso, era in /home/admin/XNNPACK/.

3. Download dei pesi del modello

Ora dobbiamo scaricare i pesi del modello per SDXL Turbo. In un terminale, esegui:

git lfs install
git clone --depth=1 https://huggingface.co/AeroX2/stable-diffusion-xl-turbo-1.0-onnxstream

Se non hai ancora installato git-lfs, fallo prima. Ciò richiederà ancora più tempo rispetto al passaggio precedente poiché i pesi del modello sono piuttosto grandi. Vai a pranzare!

Puoi anche eseguire gli altri due modelli supportati: Stable Diffusion 1.5 e Stable Diffusion XL 1.0 Base scaricando i relativi pesi dai collegamenti forniti in Repository GitHub di OnnxStream. Assicurati che la tua scheda SD abbia spazio sufficiente se stai scaricando tutti questi modelli!

Una volta fatto, il gioco è fatto! Siamo pronti per generare immagini su un Raspberry Pi!

Per generare immagini, esegui il blocco di codice seguente:

cd ~/OnnxStream/src/build/
./sd --turbo --models-path /home/admin/stable-diffusion-xl-turbo-1.0-onnxstream --prompt "An astronaut riding a horse on Mars" --steps 1 --output astronaut.png

Sostituisci il prompt con ciò che desideri generare. Sto semplicemente usando il classico prompt degli astronauti qui. Ho impostato i passaggi solo su 1 poiché SDXL Turbo non ha bisogno di molti passaggi per generare un’immagine di bell’aspetto.

Ci sono anche altri argomenti che puoi passare, come ad esempio — neg-prompt per prompt negativi (SDXL Turbo non supporta prompt negativi ma puoi usarlo per gli altri due modelli), — step per impostare il numero di passaggi generativi e — seed per impostare il seme casuale.

Gli argomenti richiesti cambieranno in base al tipo di modello utilizzato, quindi dai un’occhiata Repository GitHub di OnnxStream per l’elenco completo degli argomenti da passare se stai utilizzando qualcosa di diverso da SDXL Turbo.

Dovresti ottenere un output come questo | Fonte: Autore

Come puoi vedere nell’immagine sopra, sul Raspberry Pi 5, ogni fase di diffusione richiede circa 1 minuto e, in totale, con pre-elaborazione e decodifica, ci vogliono circa 3 minuti per generare una singola immagine.

Immagine con rispettivamente 1, 2, 5 e 10 passaggi, utilizzando lo stesso seed e prompt | Fonte: Autore

Ecco un confronto e una progressione dello stesso prompt con lo stesso seed dal passaggio 1 al 10. Puoi vedere che anche con un singolo passaggio di perfezionamento, l’immagine generata è già davvero ben fatta. Ciò è in contrasto con SDXL o SD1.5 che richiedono parecchi passaggi per raggiungere quella qualità.

Dato che ci vogliono almeno un paio di minuti per generare un’immagine, la questione dei casi d’uso diventa implacabile.

Scatto obbligatorio del mio Raspberry Pi 5 | Fonte: Autore

Il caso d’uso più ovvio e divertente per me è una cornice digitale in continua evoluzione che genererà una nuova immagine ogni pochi minuti. In realtà esiste un proiettare lungo questa tangente che utilizza OnnxStream, di rvdveen su GitHub, dove utilizza OnnxStream su un Raspberry Pi Zero 2 W per generare immagini per articoli di notizie e mostrarle su una cornice fotografica utilizzando un display e-ink. Ci vogliono circa 5 ore per generare un’immagine sul Pi Zero 2 W con quello che dovrebbe essere SD1.5, ma ehi, non è che tu abbia bisogno di una cornice digitale per cambiare ciò che viene mostrato in tempo reale.

O forse vuoi semplicemente il tuo generatore di immagini ospitato localmente in grado di produrre immagini di qualità decente senza monopolizzare i principali dispositivi di elaborazione sulla tua rete.

Divertiti a giocare con SDXL Turbo sul Raspberry Pi!

Disclaimer: Non ho alcuna affiliazione con OnnxStream o StabilityAI. Tutti i punti di vista e le opinioni sono miei e non rappresentano alcuna organizzazione.

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *