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.

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 di split_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 modelli compiled 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!