# Cara menjalankan Stable Diffusion dengan Core ML

[Core ML](https://developer.apple.com/documentation/coreml) adalah format model dan pustaka machine learning yang didukung oleh framework Apple. Jika Anda tertarik menjalankan model Stable Diffusion di dalam aplikasi macOS atau iOS/iPadOS Anda, panduan ini akan menunjukkan cara mengonversi checkpoint PyTorch yang ada ke format Core ML dan menggunakannya untuk inferensi dengan Python atau Swift.

Model Core ML dapat memanfaatkan semua mesin komputasi yang tersedia di perangkat Apple: CPU, GPU, dan Apple Neural Engine (atau ANE, akselerator yang dioptimalkan untuk tensor dan tersedia di Mac dengan Apple Silicon serta iPhone/iPad modern). Tergantung pada model dan perangkat tempat model tersebut dijalankan, Core ML juga dapat mencampur dan mencocokkan mesin komputasi, sehingga sebagian dari model mungkin berjalan di CPU sementara bagian lainnya berjalan di GPU, misalnya.

> [!TIP]
> Anda juga dapat menjalankan basis kode Python `diffusers` pada Mac Apple Silicon menggunakan akselerator `mps` bawaan PyTorch. Pendekatan ini dijelaskan secara mendalam dalam [panduan mps](mps), tetapi tidak kompatibel dengan aplikasi native.

## Stable Diffusion Core ML Checkpoints

Bobot Stable Diffusion (atau checkpoint) disimpan dalam format PyTorch, sehingga Anda perlu mengonversinya ke format Core ML sebelum dapat menggunakannya di dalam aplikasi native.

Untungnya, para insinyur Apple mengembangkan [alat konversi](https://github.com/apple/ml-stable-diffusion#-converting-models-to-core-ml) yang berbasis pada `diffusers` untuk mengonversi checkpoint PyTorch ke Core ML.

Sebelum Anda mengonversi model, luangkan waktu sejenak untuk menjelajahi Hugging Face Hub – kemungkinan besar model yang Anda minati sudah tersedia dalam format Core ML:

- organisasi [Apple](https://huggingface.co/apple) mencakup Stable Diffusion versi 1.4, 1.5, 2.0 base, dan 2.1 base
- [coreml community](https://huggingface.co/coreml-community) mencakup model yang telah ditala ulang secara khusus
- gunakan [filter](https://huggingface.co/models?pipeline_tag=text-to-image&library=coreml&p=2&sort=likes) ini untuk mengembalikan semua checkpoint Core ML yang tersedia

Jika Anda tidak dapat menemukan model yang Anda minati, kami merekomendasikan Anda untuk mengikuti instruksi [Converting Models to Core ML](https://github.com/apple/ml-stable-diffusion#-converting-models-to-core-ml) dari Apple.

## Memilih Varian Core ML yang Akan Digunakan

Model Stable Diffusion dapat dikonversi ke berbagai varian Core ML yang ditujukan untuk tujuan yang berbeda:

- Jenis blok perhatian yang digunakan. Operasi perhatian digunakan untuk "memperhatikan" hubungan antara area-area yang berbeda dalam representasi gambar dan untuk memahami bagaimana representasi gambar dan teks saling terkait. Perhatian bersifat intensif dalam komputasi dan memori, sehingga terdapat berbagai implementasi yang mempertimbangkan karakteristik perangkat keras dari perangkat yang berbeda. Untuk model Stable Diffusion Core ML, terdapat dua varian perhatian:
    * `split_einsum` ([diintroduksi oleh Apple](https://machinelearning.apple.com/research/neural-engine-transformers)) dioptimalkan untuk perangkat ANE, yang tersedia di iPhone, iPad, dan komputer seri M modern.
    * "original" attention (implementasi dasar yang digunakan di `diffusers`) hanya kompatibel dengan CPU/GPU dan tidak dengan ANE. Menjalankan model Anda di CPU + GPU menggunakan attention `original` bisa *lebih cepat* daripada ANE. Lihat [benchmark kinerja ini](https://huggingface.co/blog/fast-mac-diffusers#performance-benchmarks) serta beberapa [pengukuran tambahan yang disediakan oleh komunitas](https://github.com/huggingface/swift-coreml-diffusers/issues/31) untuk detail lebih lanjut.

- Framework inferensi yang didukung.
    * `packages` cocok untuk inferensi Python. Ini dapat digunakan untuk menguji model Core ML yang telah dikonversi sebelum mencoba mengintegrasikannya ke dalam aplikasi native, atau jika Anda ingin mengeksplorasi performa Core ML tetapi tidak perlu mendukung aplikasi native. Misalnya, aplikasi dengan antarmuka web dapat dengan sempurna menggunakan backend Core ML Python.
    * Model `compiled` diperlukan untuk kode Swift. Model `compiled` di Hub membagi bobot model UNet yang besar ke dalam beberapa file untuk kompatibilitas dengan perangkat iOS dan iPadOS. Hal ini sesuai dengan opsi konversi [`--chunk-unet`](https://github.com/apple/ml-stable-diffusion#-converting-models-to-core-ml). Jika Anda ingin mendukung aplikasi native, Anda perlu memilih varian `compiled`.

Model-model Core ML Stable Diffusion resmi [models](https://huggingface.co/apple/coreml-stable-diffusion-v1-4/tree/main) mencakup varian berikut, tetapi versi komunitas mungkin bervariasi:

```
coreml-stable-diffusion-v1-4
├── README.md
├── original
│   ├── compiled
│   └── packages
└── split_einsum
    ├── compiled
    └── packages
```

Anda dapat mengunduh dan menggunakan varian yang Anda butuhkan seperti yang ditunjukkan di bawah ini.

## Inferensi Core ML di Python

Instal pustaka berikut untuk menjalankan inferensi Core ML di Python:

```bash
pip install huggingface_hub
pip install git+https://github.com/apple/ml-stable-diffusion
```

### Unduh Poin Pemeriksaan Model

Untuk menjalankan inferensi di Python, gunakan salah satu versi yang disimpan di folder `packages` karena versi `compiled` hanya kompatibel dengan Swift. Anda dapat memilih apakah ingin menggunakan perhatian `original` atau `split_einsum`.

Berikut cara mengunduh varian `original` attention dari Hub ke direktori bernama `models`:

```Python
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"Model downloaded at {model_path}")
```

### Inferensi[[python-inference]]

Setelah Anda mengunduh snapshot model, Anda dapat mengujinya menggunakan skrip Python dari Apple.

```shell
python -m python_coreml_stable_diffusion.pipeline --prompt "a photo of an astronaut riding a horse on mars" -i ./models/coreml-stable-diffusion-v1-4_original_packages/original/packages -o </path/to/output/image> --compute-unit CPU_AND_GPU --seed 93
```

Lewati jalur checkpoint yang diunduh dengan flag `-i` ke skrip. `--compute-unit` menunjukkan perangkat keras yang ingin Anda izinkan untuk inferensi. Ini harus salah satu dari opsi berikut: `ALL`, `CPU_AND_GPU`, `CPU_ONLY`, `CPU_AND_NE`. Anda juga dapat menyediakan jalur output opsional, dan seed untuk reproduktibilitas.

Skrip inferensi mengasumsikan Anda menggunakan versi asli dari model Stable Diffusion, `CompVis/stable-diffusion-v1-4`. Jika Anda menggunakan model lain, Anda *harus* menentukan id Hub-nya di baris perintah inferensi, menggunakan opsi `--model-version`. Ini berlaku untuk model yang sudah didukung serta model kustom yang Anda latih atau fine-tune sendiri.

Sebagai contoh, jika Anda ingin menggunakan [`stable-diffusion-v1-5/stable-diffusion-v1-5`](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5):

```shell
python -m python_coreml_stable_diffusion.pipeline --prompt "a photo of an astronaut riding a horse on mars" --compute-unit ALL -o output --seed 93 -i models/coreml-stable-diffusion-v1-5_original_packages --model-version stable-diffusion-v1-5/stable-diffusion-v1-5
```

## Inferensi Core ML dalam Swift

Menjalankan inferensi dalam Swift sedikit lebih cepat daripada dalam Python karena model sudah dikompilasi dalam format `mlmodelc`. Hal ini terasa saat aplikasi dimulai ketika model dimuat, tetapi seharusnya tidak terasa jika Anda menjalankan beberapa generasi setelahnya.

### Unduh

Untuk menjalankan inferensi dalam Swift di Mac Anda, Anda memerlukan salah satu versi checkpoint `compiled`. Kami merekomendasikan Anda mengunduhnya secara lokal menggunakan kode Python yang mirip dengan contoh sebelumnya, tetapi dengan salah satu varian `compiled`:

```Python
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"Model downloaded at {model_path}")
```

### Inferensi[[swift-inference]]

Untuk menjalankan inferensi, silakan klon repositori Apple:

```bash
git clone https://github.com/apple/ml-stable-diffusion
cd ml-stable-diffusion
```

Lalu gunakan alat baris perintah Apple, [Swift Package Manager](https://www.swift.org/package-manager/#):

```bash
swift run StableDiffusionSample --resource-path models/coreml-stable-diffusion-v1-4_original_compiled --compute-units all "a photo of an astronaut riding a horse on mars"
```

Anda harus menentukan salah satu checkpoint yang diunduh pada langkah sebelumnya di `--resource-path`, jadi pastikan checkpoint tersebut berisi bundle Core ML yang dikompilasi dengan ekstensi `.mlmodelc`. Nilai `--compute-units` harus salah satu dari nilai berikut: `all`, `cpuOnly`, `cpuAndGPU`, `cpuAndNeuralEngine`.

Untuk detail lebih lanjut, silakan merujuk pada [instruksi di repo Apple](https://github.com/apple/ml-stable-diffusion).

## Fitur Diffusers yang Didukung

Model Core ML dan kode inferensi tidak mendukung banyak fitur, opsi, dan fleksibilitas dari 🧨 Diffusers. Berikut adalah beberapa batasan yang perlu diperhatikan:

- Model Core ML hanya cocok untuk inferensi. Model ini tidak dapat digunakan untuk pelatihan atau penyesuaian halus (fine-tuning).
- Hanya dua scheduler yang telah dipindahkan ke Swift, yaitu scheduler default yang digunakan oleh Stable Diffusion dan `DPMSolverMultistepScheduler`, yang kami pindahkan ke Swift dari implementasi `diffusers` kami. Kami merekomendasikan Anda menggunakan `DPMSolverMultistepScheduler`, karena scheduler ini menghasilkan kualitas yang sama dalam sekitar setengah jumlah langkah.
- Prompt negatif, skala panduan bebas klasifikator, dan tugas gambar-ke-gambar tersedia dalam kode inferensi. Fitur lanjutan seperti panduan kedalaman, ControlNet, dan pengatur skala laten belum tersedia.

Repo [konversi dan inferensi](https://github.com/apple/ml-stable-diffusion) Apple serta repo [swift-coreml-diffusers](https://github.com/huggingface/swift-coreml-diffusers) kami sendiri dimaksudkan sebagai demonstrasi teknologi untuk memungkinkan pengembang lain membangun di atasnya.

Jika Anda merasa sangat terdorong oleh fitur yang hilang, silakan buka permintaan fitur atau, lebih baik lagi, PR kontribusi 🙂.

## Aplikasi Swift Diffusers Native

Salah satu cara mudah untuk menjalankan Stable Diffusion di perangkat Apple Anda sendiri adalah dengan menggunakan [repo Swift open-source kami](https://github.com/huggingface/swift-coreml-diffusers), yang didasarkan pada `diffusers` dan repo konversi serta inferensi Apple. Anda dapat mempelajari kodenya, mengompilasi dengan [Xcode](https://developer.apple.com/xcode/), dan menyesuaikannya untuk kebutuhan Anda sendiri. Untuk kenyamanan Anda, juga tersedia [aplikasi Mac standalone di App Store](https://apps.apple.com/app/diffusers/id1666309574), sehingga Anda dapat mencobanya tanpa harus berurusan dengan kode atau IDE. Jika Anda seorang developer dan telah menentukan bahwa Core ML adalah solusi terbaik untuk membangun aplikasi Stable Diffusion Anda, maka Anda dapat menggunakan sisa panduan ini untuk memulai proyek Anda. Kami tidak sabar melihat apa yang akan Anda bangun 🙂.

