Buckets:
Core ML ile Stable Diffusion'ı nasıl çalıştırılır
Core ML, Apple framework'leri tarafından desteklenen model biçimi ve makine öğrenme kütüphanesidir. Stable Diffusion modellerini macOS veya iOS/iPadOS uygulamalarınızın içinde çalıştırmakla ilgileniyorsanız, bu kılavuz mevcut PyTorch checkpoint'lerini Core ML biçimine dönüştürmenizi ve bunları Python veya Swift ile çıkarım (inference) için kullanmanızı gösterecektir.
Core ML modelleri, Apple cihazlarında kullanılabilen tüm hesaplama motorlarından yararlanabilir: CPU, GPU ve Apple Neural Engine (veya ANE, Apple Silicon Mac'lerde ve modern iPhone/iPad'lerde bulunan, tensörler için optimize edilmiş bir hızlandırıcı). Modelin ve çalıştığı cihazın türüne bağlı olarak Core ML, hesaplama motorlarını karıştırıp eşleştirebilir; örneğin modelin bazı bölümleri CPU'da çalışırken diğerleri GPU'da çalışabilir.
diffusersPython kod tabanını, PyTorch’a yerleşik olanmpshızlandırıcısını kullanarak Apple Silicon Mac’lerde de çalıştırabilirsiniz. Bu yaklaşım mps kılavuzunda ayrıntılı olarak açıklanmıştır ancak yerel uygulamalarla uyumlu değildir.
Stable Diffusion Core ML Kontrol Noktaları
Stable Diffusion ağırlıkları (veya checkpoint'leri) PyTorch biçiminde saklanır, bu nedenle bunları yerel uygulamalarda kullanabilmemiz için önce Core ML biçimine dönüştürmeniz gerekir.
Neyse ki Apple mühendisleri, PyTorch kontrol noktalarını Core ML'ye dönüştürmek için diffusers tabanlı bir dönüştürme aracı geliştirdi.
Ancak bir modeli dönüştürmeden önce, Hugging Face Hub'ı keşfetmek için bir an ayırın – ilgilendiğiniz modelin büyük olasılıkla zaten Core ML biçiminde mevcut olması:
- Apple kuruluşu Stable Diffusion 1.4, 1.5, 2.0 base ve 2.1 base sürümlerini içerir
- coreml topluluğu özel olarak ince ayarlanmış modeller içerir
- tüm mevcut Core ML denetim noktalarını döndürmek için bu filtreyi kullanın
İlgilendiğiniz modeli bulamıyorsanız, Apple'ın Modelleri Core ML'e Dönüştürme talimatlarını izlemenizi öneririz.
Kullanılacak Core ML Varyantını Seçme
Stable Diffusion modelleri, farklı amaçlara yönelik farklı Core ML varyantlarına dönüştürülebilir:
Kullanılan dikkat bloğu türü. Dikkat işlemi, görüntü temsillerindeki farklı bölgeler arasındaki ilişkiye "dikkat vermek" ve görüntü ile metin temsillerinin nasıl ilişkili olduğunu anlamak için kullanılır. Dikkat, hesaplama ve bellek açısından yoğun olduğundan, farklı cihazların donanım özelliklerini göz önünde bulunduran farklı uygulamalar mevcuttur. Core ML Stable Diffusion modelleri için iki dikkat varyantı vardır:
split_einsum(Apple tarafından tanıtıldı) modern iPhone, iPad ve M serisi bilgisayarlarda bulunan ANE cihazları için optimize edilmiştir.- "Orijinal" dikkat (dikkat) (
diffusersiçinde kullanılan temel uygulama) yalnızca CPU/GPU ile uyumludur, ANE ile değil.originaldikkatini kullanarak modelinizi CPU + GPU üzerinde çalıştırmak, ANE'ye kıyasla hızlı olabilir. Ek ayrıntılar için bu performans kıyaslamasına ve topluluğun sağladığı bazı ek ölçümlere de bakın.
Desteklenen çıkarım çerçevesi.
packages, Python ile çıkarım için uygundur. Dönüştürülen Core ML modellerini yerel uygulamaların içine entegre etmeye çalışmadan önce test etmek veya Core ML performansını keşfetmek istiyorsanız ancak yerel uygulamaları desteklemeniz gerekmiyorsa bunu kullanabilirsiniz. Örneğin, web arayüzüne sahip bir uygulama, Python tabanlı bir Core ML arka ucunu sorunsuz bir şekilde kullanabilir.- Swift kodu için
compiledmodeller gereklidir. Hub’dakicompiledmodeller, büyük UNet model ağırlıklarını iOS ve iPadOS cihazlarıyla uyumluluk için birkaç dosyaya böler. Bu,--chunk-unetdönüştürme seçeneğine karşılık gelir. Yerel uygulamaları desteklemek istiyorsanızcompiledvaryantını seçmeniz gerekir.
Resmi Core ML Stable Diffusion modelleri bu varyantları içerir, ancak topluluk modelleri farklılık gösterebilir:
coreml-stable-diffusion-v1-4
├── README.md
├── original
│ ├── compiled
│ └── packages
└── split_einsum
├── compiled
└── packages
Aşağıda gösterildiği gibi ihtiyacınız olan varyantı indirip kullanabilirsiniz.
Python'da Core ML Çıkarımı
Python'da Core ML çıkarımını çalıştırmak için aşağıdaki kütüphaneleri yükleyin:
pip install huggingface_hub
pip install git+https://github.com/apple/ml-stable-diffusion
Model Kontrol Noktalarını İndirin
Python'da çıkarım (inference) çalıştırmak için compiled olanların yalnızca Swift ile uyumlu olması nedeniyle packages klasörlerinde saklanan sürümlerden birini kullanın. original veya split_einsum dikkatini (attention) kullanmak isteyip istemediğinizi seçebilirsiniz.
Hub'dan original dikkat varyantını models adlı bir dizine indirmek için:
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}")
Çıkarım[[python-inference]]
Modelin bir anlık görüntüsünü indirdikten sonra, Apple'ın Python betiğini kullanarak test edebilirsiniz.
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
İndirilen checkpoint dosyasının yolunu betiğe -i bayrağıyla iletin. --compute-unit, çıkarım için izin vermek istediğiniz donanımı belirtir. Aşağıdaki seçeneklerden biri olmalıdır: ALL, CPU_AND_GPU, CPU_ONLY, CPU_AND_NE. Ayrıca isteğe bağlı bir çıktı yolu ve yeniden üretilebilirlik için bir tohum (seed) da sağlayabilirsiniz.
Çıkarım betiği, Stable Diffusion modelinin orijinal sürümünü, CompVis/stable-diffusion-v1-4 kullandığınızı varsayar. Başka bir model kullanıyorsanız, --model-version seçeneğini kullanarak çıkarım komut satırında Hub kimliğini belirtmeniz gerekir. Bu, zaten desteklenen modeller için de kendinizin eğittiği veya ince ayarladığı özel modeller için de geçerlidir.
Örneğin, stable-diffusion-v1-5/stable-diffusion-v1-5 kullanmak istiyorsanız:
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
Swift'te Core ML çıkarımı
Swift'te çıkarım (inference) çalıştırma, modellerin zaten mlmodelc biçiminde derlenmiş olması nedeniyle Python'dan biraz daha hızlıdır. Bu fark, modelin yüklendiği uygulama açılışında belirgin olabilir; ancak ardından birkaç üretim (generation) çalıştırırsanız fark edilmeyecek kadar azdır.
İndir
Mac'inizde Swift ile çıkarım (inference) çalıştırmak için compiled kontrol noktası sürümlerinden birine ihtiyacınız var. Önceki örneğe benzer Python kodu kullanarak bunları yerel olarak indirmenizi öneririz, ancak compiled varyantlarından birini kullanın:
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}")
Çıkarım[[swift-inference]]
Çıkarım (inference) çalıştırmak için lütfen Apple'ın deposunu klonlayın:
git clone https://github.com/apple/ml-stable-diffusion
cd ml-stable-diffusion
Ve ardından Apple'ın komut satır aracını, Swift Package Manager'i kullanın:
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"
Önceki adımda indirilen kontrol noktalarından birini --resource-path içinde belirtmeniz gerekir, bu nedenle .mlmodelc uzantılı derlenmiş Core ML demetlerini içerdiğinden emin olun. --compute-units değeri şu değerlerden biri olmalıdır: all, cpuOnly, cpuAndGPU, cpuAndNeuralEngine.
Daha fazla ayrıntı için lütfen Apple'ın deposundaki talimatlara başvurun.
Desteklenen Diffusers Özellikleri
Core ML modelleri ve çıkarım kodu, 🧨 Diffusers'ın birçok özelliğini, seçeneğini ve esnekliğini desteklemez. Aklınızda bulundurmanız gereken sınırlamaların bazıları şunlardır:
- Core ML modelleri yalnızca çıkarım (inference) için uygundur. Eğitim veya ince ayar (fine-tuning) için kullanılamazlar.
- Sadece iki zamanlayıcı Swift'e taşındı: Stable Diffusion tarafından kullanılan varsayılan zamanlayıcı ve
diffusersuygulamasımızdan Swift'e taşıdığımızDPMSolverMultistepScheduler. Yaklaşık yarıda bir adımda aynı kaliteyi ürettiği içinDPMSolverMultistepSchedulerkullanmanızı öneririz. - Negatif istemler, sınıflandırıcı-ücretsiz yönlendirme ölçeği ve görüntüden görüntüye görevler çıkarım kodunda kullanılabilir. Derinlik yönlendirmesi, ControlNet ve gizli yükselticiler gibi gelişmiş özellikler henüz mevcut değil.
Apple'ın çevirme ve çıkarım deposu ile kendi swift-coreml-diffusers depolarımız, diğer geliştiricilerin üzerine inşa edebilmesi için teknoloji gösterimi olarak tasarlanmıştır.
Eksik özellikler konusunda güçlü bir görüşe sahipseniz, lütfen bir özellik isteği açmaktan veya daha iyisi, bir katkı PR'ı göndermekten çekinmeyin 🙂.
Yerel Diffusers Swift uygulaması
Kendi Apple donanımınızda Stable Diffusion'u çalıştırmak için kolay bir yol, diffusers ve Apple'ın dönüştürme ve çıkarım deposu üzerine kurulu açık kaynaklı Swift depomuzu kullanmaktır. Kodu inceleyebilir, Xcode ile derleyebilir ve kendi ihtiyaçlarınıza göre uyarlayabilirsiniz. Kolaylığınız için, kodla veya IDE ile uğraşmadan deneme yapabileceğiniz bir de App Store'da bağımsız Mac uygulaması bulunmaktadır. Bir geliştiriciyseniz ve Stable Diffusion uygulamanızı oluşturmak için Core ML'in en iyi çözüm olduğuna karar verdiyseniz, projenize başlamak için bu kılavuzun geri kalanını kullanabilirsiniz. Ne inşa edeceğinizi görmek için sabırsızlanıyoruz 🙂.
Xet Storage Details
- Size:
- 12.3 kB
- Xet hash:
- 3768461ced766d4953d7bbb5bf5eba991e90f7687ce0ec385ecf5b27003292ae
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.