Utilizzo della diffusione stabile con Core ML su Apple Silicon
'Utilizzo di Core ML su Apple Silicon'
Grazie agli ingegneri di Apple, ora puoi eseguire Stable Diffusion su Apple Silicon utilizzando Core ML!
Questo repository Apple fornisce script di conversione e codice di inferenza basato su 🧨 Diffusers, e noi lo adoriamo! Per rendertelo il più semplice possibile, abbiamo convertito noi stessi i pesi e abbiamo messo le versioni Core ML dei modelli nell’Hugging Face Hub.
Aggiornamento: alcune settimane dopo la scrittura di questo post abbiamo creato un’app Swift nativa che puoi utilizzare per eseguire Stable Diffusion senza sforzo sul tuo hardware. Abbiamo rilasciato un’app nello Store di Mac App Store, così come il codice sorgente per consentire ad altri progetti di utilizzarla.
Il resto di questo post ti guida su come utilizzare i pesi convertiti nel tuo codice o convertire pesi aggiuntivi tu stesso.
- Apprendimento profondo con le proteine
- Da GPT2 a Stable Diffusion Hugging Face arriva alla comunità di Elixir
- Illustrazione dell’apprendimento per rinforzo da feedback umano (RLHF)
Checkpoint disponibili
I checkpoint ufficiali di Stable Diffusion sono già stati convertiti e sono pronti per l’uso:
- Stable Diffusion v1.4: originale convertito
- Stable Diffusion v1.5: originale convertito
- Stable Diffusion v2 base: originale convertito
- Stable Diffusion v2.1 base: originale convertito
Core ML supporta tutte le unità di calcolo disponibili sul tuo dispositivo: CPU, GPU e Neural Engine di Apple (NE). È anche possibile per Core ML eseguire diverse porzioni del modello su diversi dispositivi per massimizzare le prestazioni.
Esistono diverse varianti di ciascun modello che possono produrre prestazioni diverse a seconda dell’hardware utilizzato. Ti consigliamo di provarli e di scegliere quello che funziona meglio nel tuo sistema. Continua a leggere per i dettagli.
Note sulle prestazioni
Ci sono diverse varianti per modello:
- “Attivazione” originale vs “split_einsum”. Queste sono due implementazioni alternative dei blocchi di attivazione critici.
split_einsum
è stata precedentemente introdotta da Apple ed è compatibile con tutte le unità di calcolo (CPU, GPU e Neural Engine di Apple).originale
, d’altra parte, è compatibile solo con CPU e GPU. Tuttavia,originale
può essere più veloce displit_einsum
su alcuni dispositivi, quindi prova entrambi! - Modelli “ML Packages” vs “Compiled”. Il primo è adatto per l’inferenza in Python, mentre la versione
compiled
è necessaria per il codice Swift. I modellicompiled
nell’Hugging Face Hub suddividono i pesi del grande modello UNet in diversi file per la compatibilità con i dispositivi iOS e iPadOS. Questo corrisponde all’opzione di conversione--chunk-unet
.
Al momento della stesura di questo articolo, abbiamo ottenuto i migliori risultati sul mio MacBook Pro (M1 Max, 32 core GPU, 64 GB) utilizzando la seguente combinazione:
- Attivazione
originale
. - Tutte le unità di calcolo
all
(vedi la sezione successiva per i dettagli). - macOS Ventura 13.1 Beta 4 (22C5059b).
Con questi parametri, ci sono voluti 18 secondi per generare un’immagine con la versione Core ML di Stable Diffusion v1.4 🤯.
⚠️ Nota
Sono state introdotte diverse migliorie a Core ML in macOS Ventura 13.1, e sono richieste dall’implementazione di Apple. Potresti ottenere immagini nere e tempi molto più lenti se utilizzi versioni precedenti di macOS.
Ogni repository del modello è organizzato in una struttura ad albero che fornisce queste diverse varianti:
coreml-stable-diffusion-v1-4
├── README.md
├── originale
│ ├── compiled
│ └── packages
└── split_einsum
├── compiled
└── packages
Puoi scaricare e utilizzare la variante di cui hai bisogno come mostrato di seguito.
Inferenza Core ML in Python
Prerequisiti
pip install huggingface_hub
pip install git+https://github.com/apple/ml-stable-diffusion
Scarica i checkpoint del modello
Per eseguire l’inferenza in Python, devi utilizzare una delle versioni memorizzate nelle cartelle packages
, perché quelle compilati sono compatibili solo con Swift. Puoi scegliere se desideri utilizzare gli stili di attenzione originale
o split_einsum
.
Ecco come scaricare la variante di attenzione originale
dal Hub:
from huggingface_hub import snapshot_download
from pathlib import Path
repo_id = "apple/coreml-stable-diffusion-v1-4"
variant = "original/packages"
model_path = Path("./models") / (repo_id.split("/")[-1] + "_" + variant.replace("/", "_"))
snapshot_download(repo_id, allow_patterns=f"{variant}/*", local_dir=model_path, local_dir_use_symlinks=False)
print(f"Modello scaricato in {model_path}")
Il codice sopra metterà il modello scaricato all’interno di una cartella chiamata models
.
Inferenza
Una volta scaricato uno snapshot del modello, il modo più semplice per eseguire l’inferenza sarebbe quello di utilizzare lo script Python di Apple.
python -m python_coreml_stable_diffusion.pipeline --prompt "una foto di un astronauta che cavalca un cavallo su Marte" -i models/coreml-stable-diffusion-v1-4_original_packages -o </percorso/dell/immagine/di/uscita> --compute-unit ALL --seed 93
<output-mlpackages-directory>
dovrebbe puntare al checkpoint scaricato nel passaggio precedente, e --compute-unit
indica l’hardware che si desidera utilizzare per l’inferenza. Deve essere una delle seguenti opzioni: ALL
, CPU_AND_GPU
, CPU_ONLY
, CPU_AND_NE
. È possibile specificare anche un percorso di output opzionale e un seed per la riproducibilità.
Lo script di inferenza assume la versione originale del modello Stable Diffusion, archiviata nell’Hub come CompVis/stable-diffusion-v1-4
. Se si utilizza un altro modello, è necessario specificare il suo ID dell’Hub nel comando di inferenza, utilizzando l’opzione --model-version
. Questo funziona sia per i modelli già supportati, sia per i modelli personalizzati che si sono addestrati o raffinati.
Per Stable Diffusion 1.5 (ID dell’Hub: runwayml/stable-diffusion-v1-5
):
python -m python_coreml_stable_diffusion.pipeline --prompt "una foto di un astronauta che cavalca un cavallo su Marte" --compute-unit ALL -o output --seed 93 -i models/coreml-stable-diffusion-v1-5_original_packages --model-version runwayml/stable-diffusion-v1-5
Per Stable Diffusion 2 base (ID dell’Hub: stabilityai/stable-diffusion-2-base
):
python -m python_coreml_stable_diffusion.pipeline --prompt "una foto di un astronauta che cavalca un cavallo su Marte" --compute-unit ALL -o output --seed 93 -i models/coreml-stable-diffusion-2-base_original_packages --model-version stabilityai/stable-diffusion-2-base
Inferenza Core ML in Swift
Eseguire l’inferenza in Swift è leggermente più veloce rispetto a Python, perché i modelli sono già compilati nel formato mlmodelc
. Questo sarà evidente all’avvio dell’app quando il modello viene caricato, ma non dovrebbe essere evidente se si eseguono diverse generazioni successivamente.
Download
Per eseguire l’inferenza in Swift sul tuo Mac, è necessario una delle versioni compilate
del checkpoint. Ti consigliamo di scaricarle in locale utilizzando un codice Python simile a quello mostrato sopra, ma utilizzando una delle varianti compilate
:
from huggingface_hub import snapshot_download
from pathlib import Path
repo_id = "apple/coreml-stable-diffusion-v1-4"
variant = "original/compiled"
model_path = Path("./models") / (repo_id.split("/")[-1] + "_" + variant.replace("/", "_"))
snapshot_download(repo_id, allow_patterns=f"{variant}/*", local_dir=model_path, local_dir_use_symlinks=False)
print(f"Modello scaricato in {model_path}")
Inferenza
Per eseguire l’inferenza, clona il repository di Apple:
git clone https://github.com/apple/ml-stable-diffusion
cd ml-stable-diffusion
E quindi utilizza lo strumento da linea di comando di Apple utilizzando le funzionalità di Swift Package Manager:
swift run StableDiffusionSample --resource-path modelli/coreml-stable-diffusion-v1-4_originale_compilati --compute-units tutti "una foto di un astronauta che cavalca un cavallo su Marte"
Devi specificare in --resource-path
uno dei checkpoint scaricati nel passaggio precedente, quindi assicurati che contenga pacchetti Core ML compilati con l’estensione .mlmodelc
. Il valore di --compute-units
deve essere uno di questi: tutti
, soloCPU
, CPUeGPU
, CPUeNeuralEngine
.
Per ulteriori dettagli, consulta le istruzioni nel repository di Apple.
Porta il tuo Modello
Se hai creato i tuoi modelli compatibili con Stable Diffusion (ad esempio, se hai utilizzato Dreambooth, Inversione Testuale o fine-tuning), devi convertire i modelli tu stesso. Fortunatamente, Apple fornisce uno script di conversione che ti consente di farlo.
Per questa attività, ti consigliamo di seguire queste istruzioni.
Passaggi Successivi
Siamo davvero entusiasti delle opportunità che questo porta e non vediamo l’ora di vedere cosa la comunità può creare da qui. Alcune idee potenziali sono:
- App native di alta qualità per Mac, iPhone e iPad.
- Portare ulteriori scheduler in Swift, per inferenze ancora più veloci.
- Pipeline e attività aggiuntive.
- Esplorare tecniche di quantizzazione e ulteriori ottimizzazioni.
Non vediamo l’ora di vedere cosa creerai!