Diffusers documentation
Cara menjalankan Stable Diffusion dengan Core ML
Cara menjalankan Stable Diffusion dengan Core ML
Core ML 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.
Anda juga dapat menjalankan basis kode Python
diffuserspada Mac Apple Silicon menggunakan akseleratormpsbawaan PyTorch. Pendekatan ini dijelaskan secara mendalam dalam panduan 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 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 mencakup Stable Diffusion versi 1.4, 1.5, 2.0 base, dan 2.1 base
- coreml community mencakup model yang telah ditala ulang secara khusus
- gunakan filter 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 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) dioptimalkan untuk perangkat ANE, yang tersedia di iPhone, iPad, dan komputer seri M modern.- “Attention” asli (implementasi dasar yang digunakan di
diffusers) hanya kompatibel dengan CPU/GPU dan tidak dengan ANE. Menjalankan model Anda di CPU + GPU menggunakan attentionoriginalbisa lebih cepat daripada ANE. Lihat benchmark kinerja ini serta beberapa pengukuran tambahan yang disediakan oleh komunitas untuk detail lebih lanjut.
Framework inferensi yang didukung.
packagescocok 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
compileddiperlukan untuk kode Swift. Modelcompileddi 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. Jika Anda ingin mendukung aplikasi native, Anda perlu memilih variancompiled.
Model-model Core ML Stable Diffusion resmi models mencakup varian berikut, tetapi versi komunitas mungkin bervariasi:
coreml-stable-diffusion-v1-4
├── README.md
├── original
│ ├── compiled
│ └── packages
└── split_einsum
├── compiled
└── packagesAnda 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:
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:
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
Setelah Anda mengunduh snapshot model, Anda dapat mengujinya menggunakan skrip Python dari Apple.
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:
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:
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
Untuk menjalankan inferensi, silakan klon repositori Apple:
git clone https://github.com/apple/ml-stable-diffusion
cd ml-stable-diffusionLalu gunakan alat baris perintah Apple, Swift Package Manager:
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.
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 implementasidiffuserskami. Kami merekomendasikan Anda menggunakanDPMSolverMultistepScheduler, 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 Apple serta repo 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, yang didasarkan pada diffusers dan repo konversi serta inferensi Apple. Anda dapat mempelajari kodenya, mengompilasi dengan Xcode, dan menyesuaikannya untuk kebutuhan Anda sendiri. Untuk kenyamanan Anda, tersedia juga aplikasi Mac standalone di App Store, sehingga Anda dapat mencobanya tanpa perlu 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 🙂.