Core ML๋ก Stable Diffusion์ ์คํํ๋ ๋ฐฉ๋ฒ
Core ML์ Apple ํ๋ ์์ํฌ์์ ์ง์ํ๋ ๋ชจ๋ธ ํ์ ๋ฐ ๋จธ์ ๋ฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. macOS ๋๋ iOS/iPadOS ์ฑ ๋ด์์ Stable Diffusion ๋ชจ๋ธ์ ์คํํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ, ์ด ๊ฐ์ด๋์์๋ ๊ธฐ์กด PyTorch ์ฒดํฌํฌ์ธํธ๋ฅผ Core ML ํ์์ผ๋ก ๋ณํํ๊ณ ์ด๋ฅผ Python ๋๋ Swift๋ก ์ถ๋ก ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
Core ML ๋ชจ๋ธ์ Apple ๊ธฐ๊ธฐ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์ปดํจํ ์์ง๋ค, ์ฆ CPU, GPU, Apple Neural Engine(๋๋ Apple Silicon Mac ๋ฐ ์ต์ iPhone/iPad์์ ์ฌ์ฉํ ์ ์๋ ํ ์ ์ต์ ํ ๊ฐ์๊ธฐ์ธ ANE)์ ํ์ฉํ ์ ์์ต๋๋ค. ๋ชจ๋ธ๊ณผ ์คํ ์ค์ธ ๊ธฐ๊ธฐ์ ๋ฐ๋ผ Core ML์ ์ปดํจํ ์์ง๋ ํผํฉํ์ฌ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ์๋ฅผ ๋ค์ด ๋ชจ๋ธ์ ์ผ๋ถ๊ฐ CPU์์ ์คํ๋๋ ๋ฐ๋ฉด ๋ค๋ฅธ ๋ถ๋ถ์ GPU์์ ์คํ๋ ์ ์์ต๋๋ค.
PyTorch์ ๋ด์ฅ๋ mps ๊ฐ์๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ Apple Silicon Macs์์ diffusers Python ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์คํํ ์๋ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ [mps ๊ฐ์ด๋]์ ์์ธํ ์ค๋ช
๋์ด ์์ง๋ง ๋ค์ดํฐ๋ธ ์ฑ๊ณผ ํธํ๋์ง ์์ต๋๋ค.
Stable Diffusion Core ML ์ฒดํฌํฌ์ธํธ
Stable Diffusion ๊ฐ์ค์น(๋๋ ์ฒดํฌํฌ์ธํธ)๋ PyTorch ํ์์ผ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋ค์ดํฐ๋ธ ์ฑ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Core ML ํ์์ผ๋ก ๋ณํํด์ผ ํฉ๋๋ค.
๋คํํ๋ Apple ์์ง๋์ด๋ค์ด diffusers๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ณํ ํด์ ๊ฐ๋ฐํ์ฌ PyTorch ์ฒดํฌํฌ์ธํธ๋ฅผ Core ML๋ก ๋ณํํ ์ ์์ต๋๋ค.
๋ชจ๋ธ์ ๋ณํํ๊ธฐ ์ ์ ์ ์ ์๊ฐ์ ๋ด์ด Hugging Face Hub๋ฅผ ์ดํด๋ณด์ธ์. ๊ด์ฌ ์๋ ๋ชจ๋ธ์ด ์ด๋ฏธ Core ML ํ์์ผ๋ก ์ ๊ณต๋๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค:
- Apple organization์๋ Stable Diffusion ๋ฒ์ 1.4, 1.5, 2.0 base ๋ฐ 2.1 base๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
- coreml organization์๋ ์ปค์คํ DreamBooth๊ฐ ์ ์ฉ๋๊ฑฐ๋, ํ์ธํ๋๋ ๋ชจ๋ธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์ด ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ Core ML ์ฒดํฌํฌ์ธํธ๋ค์ ๋ฐํํฉ๋๋ค.
์ํ๋ ๋ชจ๋ธ์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ Apple์ ๋ชจ๋ธ์ Core ML๋ก ๋ณํํ๊ธฐ ์ง์นจ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฌ์ฉํ Core ML ๋ณํ(Variant) ์ ํํ๊ธฐ
Stable Diffusion ๋ชจ๋ธ์ ๋ค์ํ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ค๋ฅธ Core ML ๋ณํ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค:
์ฌ์ฉ๋๋ ์ดํ ์ ๋ธ๋ก ์ ํ. ์ดํ ์ ์ฐ์ฐ์ ์ด๋ฏธ์ง ํํ์ ์ฌ๋ฌ ์์ญ ๊ฐ์ ๊ด๊ณ์ '์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ ' ์ด๋ฏธ์ง์ ํ ์คํธ ํํ์ด ์ด๋ป๊ฒ ์ฐ๊ด๋์ด ์๋์ง ์ดํดํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ดํ ์ ์ฐ์ฐ์ ์ปดํจํ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ง์ฝ์ ์ด๋ฏ๋ก ๋ค์ํ ์ฅ์น์ ํ๋์จ์ด ํน์ฑ์ ๊ณ ๋ คํ ๋ค์ํ ๊ตฌํ์ด ์กด์ฌํฉ๋๋ค. Core ML Stable Diffusion ๋ชจ๋ธ์ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ์ฃผ์ ๋ณํ์ด ์์ต๋๋ค:
split_einsum(Apple์์ ๋์ ์ ์ต์ iPhone, iPad ๋ฐ M ์๋ฆฌ์ฆ ์ปดํจํฐ์์ ์ฌ์ฉํ ์ ์๋ ANE ์ฅ์น์ ์ต์ ํ๋์ด ์์ต๋๋ค.- "์๋ณธ" ์ดํ
์
(
diffusers์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ๊ตฌํ)๋ CPU/GPU์๋ง ํธํ๋๋ฉฐ ANE์๋ ํธํ๋์ง ์์ต๋๋ค. "์๋ณธ" ์ดํ ์ ์ ์ฌ์ฉํ์ฌ CPU + GPU์์ ๋ชจ๋ธ์ ์คํํ๋ ๊ฒ์ด ANE๋ณด๋ค ๋ ๋น ๋ฅผ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ์ฑ๋ฅ ๋ฒค์น๋งํฌ์ ์ปค๋ฎค๋ํฐ์์ ์ ๊ณตํ๋ ์ผ๋ถ ์ถ๊ฐ ์ธก์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ง์๋๋ ์ถ๋ก ํ๋ ์์ํฌ
packages๋ Python ์ถ๋ก ์ ์ ํฉํฉ๋๋ค. ๋ค์ดํฐ๋ธ ์ฑ์ ํตํฉํ๊ธฐ ์ ์ ๋ณํ๋ Core ML ๋ชจ๋ธ์ ํ ์คํธํ๊ฑฐ๋, Core ML ์ฑ๋ฅ์ ์๊ณ ์ถ์ง๋ง ๋ค์ดํฐ๋ธ ์ฑ์ ์ง์ํ ํ์๋ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์น UI๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ Python Core ML ๋ฐฑ์๋๋ฅผ ์๋ฒฝํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.- Swift ์ฝ๋์๋
์ปดํ์ผ๋๋ชจ๋ธ์ด ํ์ํฉ๋๋ค. Hub์์ปดํ์ผ๋๋ชจ๋ธ์ iOS ๋ฐ iPadOS ๊ธฐ๊ธฐ์์ ํธํ์ฑ์ ์ํด ํฐ UNet ๋ชจ๋ธ ๊ฐ์ค์น๋ฅผ ์ฌ๋ฌ ํ์ผ๋ก ๋ถํ ํฉ๋๋ค. ์ด๋--chunk-unet๋ณํ ์ต์ ์ ํด๋นํฉ๋๋ค. ๋ค์ดํฐ๋ธ ์ฑ์ ์ง์ํ๋ ค๋ฉด์ปดํ์ผ๋๋ณํ์ ์ ํํด์ผ ํฉ๋๋ค.
๊ณต์ Core ML Stable Diffusion ๋ชจ๋ธ์๋ ์ด๋ฌํ ๋ณํ์ด ํฌํจ๋์ด ์์ง๋ง ์ปค๋ฎค๋ํฐ ๋ฒ์ ์ ๋ค๋ฅผ ์ ์์ต๋๋ค:
coreml-stable-diffusion-v1-4
โโโ README.md
โโโ original
โ โโโ compiled
โ โโโ packages
โโโ split_einsum
โโโ compiled
โโโ packages
์๋์ ๊ฐ์ด ํ์ํ ๋ณํ์ ๋ค์ด๋ก๋ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Python์์ Core ML ์ถ๋ก
Python์์ Core ML ์ถ๋ก ์ ์คํํ๋ ค๋ฉด ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ์ธ์:
pip install huggingface_hub
pip install git+https://github.com/apple/ml-stable-diffusion
๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ ๋ค์ด๋ก๋ํ๊ธฐ
์ปดํ์ผ๋ ๋ฒ์ ์ Swift์๋ง ํธํ๋๋ฏ๋ก Python์์ ์ถ๋ก ์ ์คํํ๋ ค๋ฉด packages ํด๋์ ์ ์ฅ๋ ๋ฒ์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ธ์. ์๋ณธ ๋๋ split_einsum ์ดํ
์
์ค ์ด๋ ๊ฒ์ ์ฌ์ฉํ ์ง ์ ํํ ์ ์์ต๋๋ค.
๋ค์์ Hub์์ 'models'๋ผ๋ ๋๋ ํ ๋ฆฌ๋ก 'original' ์ดํ ์ ๋ณํ์ ๋ค์ด๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค:
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}")
์ถ๋ก [[python-inference]]
๋ชจ๋ธ์ snapshot์ ๋ค์ด๋ก๋ํ ํ์๋ Apple์ Python ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธํ ์ ์์ต๋๋ค.
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 -o </path/to/output/image> --compute-unit CPU_AND_GPU --seed 93
<output-mlpackages-directory>๋ ์ ๋จ๊ณ์์ ๋ค์ด๋ก๋ํ ์ฒดํฌํฌ์ธํธ๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํ๋ฉฐ, --compute-unit์ ์ถ๋ก ์ ํ์ฉํ ํ๋์จ์ด๋ฅผ ๋ํ๋
๋๋ค. ์ด๋ ๋ค์ ์ต์
์ค ํ๋์ด์ด์ผ ํฉ๋๋ค: ALL, CPU_AND_GPU, CPU_ONLY, CPU_AND_NE. ์ ํ์ ์ถ๋ ฅ ๊ฒฝ๋ก์ ์ฌํ์ฑ์ ์ํ ์๋๋ฅผ ์ ๊ณตํ ์๋ ์์ต๋๋ค.
์ถ๋ก ์คํฌ๋ฆฝํธ์์๋ Stable Diffusion ๋ชจ๋ธ์ ์๋ ๋ฒ์ ์ธ CompVis/stable-diffusion-v1-4๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ถ๋ก ๋ช
๋ น์ค์์ --model-version ์ต์
์ ์ฌ์ฉํ์ฌ ํด๋น ํ๋ธ ID๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด๋ ์ด๋ฏธ ์ง์๋๋ ๋ชจ๋ธ๊ณผ ์ฌ์ฉ์๊ฐ ์ง์ ํ์ตํ๊ฑฐ๋ ํ์ธํ๋ํ ์ฌ์ฉ์ ์ง์ ๋ชจ๋ธ์ ์ ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, 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
Swift์์ Core ML ์ถ๋ก ํ๊ธฐ
Swift์์ ์ถ๋ก ์ ์คํํ๋ ๊ฒ์ ๋ชจ๋ธ์ด ์ด๋ฏธ mlmodelc ํ์์ผ๋ก ์ปดํ์ผ๋์ด ์๊ธฐ ๋๋ฌธ์ Python๋ณด๋ค ์ฝ๊ฐ ๋น ๋ฆ
๋๋ค. ์ด๋ ์ฑ์ด ์์๋ ๋ ๋ชจ๋ธ์ด ๋ถ๋ฌ์์ง๋ ๊ฒ์ด ๋์ ๋์ง๋ง, ์ดํ ์ฌ๋ฌ ๋ฒ ์คํํ๋ฉด ๋์ ๋์ง ์์ ๊ฒ์
๋๋ค.
๋ค์ด๋ก๋
Mac์์ Swift์์ ์ถ๋ก ์ ์คํํ๋ ค๋ฉด ์ปดํ์ผ๋ ์ฒดํฌํฌ์ธํธ ๋ฒ์ ์ค ํ๋๊ฐ ํ์ํฉ๋๋ค. ์ด์ ์์ ์ ์ ์ฌํ์ง๋ง ์ปดํ์ผ๋ ๋ณํ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ 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}")
์ถ๋ก [[swift-inference]]
์ถ๋ก ์ ์คํํ๊ธฐ ์ํด์, Apple์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ณต์ ํ์ธ์:
git clone https://github.com/apple/ml-stable-diffusion
cd ml-stable-diffusion
๊ทธ ๋ค์ Apple์ ๋ช ๋ น์ด ๋๊ตฌ์ธ Swift ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํฉ๋๋ค:
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"
--resource-path์ ์ด์ ๋จ๊ณ์์ ๋ค์ด๋ก๋ํ ์ฒดํฌํฌ์ธํธ ์ค ํ๋๋ฅผ ์ง์ ํด์ผ ํ๋ฏ๋ก ํ์ฅ์๊ฐ .mlmodelc์ธ ์ปดํ์ผ๋ Core ML ๋ฒ๋ค์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ์๊ธฐ ๋ฐ๋๋๋ค. --compute-units๋ ๋ค์ ๊ฐ ์ค ํ๋์ด์ด์ผ ํฉ๋๋ค: all, cpuOnly, cpuAndGPU, cpuAndNeuralEngine.
์์ธํ ๋ด์ฉ์ Apple์ ๋ฆฌํฌ์งํ ๋ฆฌ ์์ ์ง์นจ์ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
์ง์๋๋ Diffusers ๊ธฐ๋ฅ
Core ML ๋ชจ๋ธ๊ณผ ์ถ๋ก ์ฝ๋๋ ๐งจ Diffusers์ ๋ง์ ๊ธฐ๋ฅ, ์ต์ ๋ฐ ์ ์ฐ์ฑ์ ์ง์ํ์ง ์์ต๋๋ค. ๋ค์์ ์ ์ํด์ผ ํ ๋ช ๊ฐ์ง ์ ํ ์ฌํญ์ ๋๋ค:
- Core ML ๋ชจ๋ธ์ ์ถ๋ก ์๋ง ์ ํฉํฉ๋๋ค. ํ์ต์ด๋ ํ์ธํ๋์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Swift์ ํฌํ
๋ ์ค์ผ์ค๋ฌ๋ Stable Diffusion์์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ค์ผ์ค๋ฌ์
diffusers๊ตฌํ์์ Swift๋ก ํฌํ ํDPMSolverMultistepScheduler๋ ๊ฐ๋ฟ์ ๋๋ค. ์ด๋ค ์ค ์ฝ ์ ๋ฐ์ ์คํ ์ผ๋ก ๋์ผํ ํ์ง์ ์์ฑํ๋DPMSolverMultistepScheduler๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. - ์ถ๋ก ์ฝ๋์์ ๋ค๊ฑฐํฐ๋ธ ํ๋กฌํํธ, classifier-free guidance scale ๋ฐ image-to-image ์์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. depth guidance, ControlNet, latent upscalers์ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์์ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
Apple์ ๋ณํ ๋ฐ ์ถ๋ก ๋ฆฌํฌ์งํ ๋ฆฌ์ ์์ฒด swift-coreml-diffusers ๋ฆฌํฌ์งํ ๋ฆฌ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๊ตฌ์ถํ ์ ์๋ ๊ธฐ์ ์ ์ธ ๋ฐ๋ชจ์ ๋๋ค.
๋๋ฝ๋ ๊ธฐ๋ฅ์ด ์๋ค๊ณ ์๊ฐ๋๋ฉด ์ธ์ ๋ ์ง ๊ธฐ๋ฅ์ ์์ฒญํ๊ฑฐ๋, ๋ ์ข์ ๋ฐฉ๋ฒ์ ๊ธฐ์ฌ PR์ ์ด์ด์ฃผ์ธ์. :)
๋ค์ดํฐ๋ธ Diffusers Swift ์ฑ
์์ฒด Apple ํ๋์จ์ด์์ Stable Diffusion์ ์คํํ๋ ์ฌ์ด ๋ฐฉ๋ฒ ์ค ํ๋๋ diffusers์ Apple์ ๋ณํ ๋ฐ ์ถ๋ก ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์์ฒด ์คํ ์์ค Swift ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์ฝ๋๋ฅผ ๊ณต๋ถํ๊ณ Xcode๋ก ์ปดํ์ผํ์ฌ ํ์์ ๋ง๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค. ํธ์๋ฅผ ์ํด ์ฑ์คํ ์ด์ ๋
๋ฆฝํ Mac ์ฑ๋ ์์ผ๋ฏ๋ก ์ฝ๋๋ IDE๋ฅผ ๋ค๋ฃจ์ง ์๊ณ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ก์ Core ML์ด Stable Diffusion ์ฑ์ ๊ตฌ์ถํ๋ ๋ฐ ๊ฐ์ฅ ์ ํฉํ ์๋ฃจ์
์ด๋ผ๊ณ ํ๋จํ๋ค๋ฉด, ์ด ๊ฐ์ด๋์ ๋๋จธ์ง ๋ถ๋ถ์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ํ ์ ์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ด ๋ฌด์์ ๋น๋ํ ์ง ๊ธฐ๋๋ฉ๋๋ค. :)