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๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด๋ ์ด๋ฏธ ์ง์๋๋ ๋ชจ๋ธ๊ณผ ์ฌ์ฉ์๊ฐ ์ง์ ํ์ตํ๊ฑฐ๋ ํ์ธํ๋ํ ์ฌ์ฉ์ ์ง์ ๋ชจ๋ธ์ ์ ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, runwayml/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 runwayml/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 ์ฑ์ ๊ตฌ์ถํ๋ ๋ฐ ๊ฐ์ฅ ์ ํฉํ ์๋ฃจ์
์ด๋ผ๊ณ ํ๋จํ๋ค๋ฉด, ์ด ๊ฐ์ด๋์ ๋๋จธ์ง ๋ถ๋ถ์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ํ ์ ์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ด ๋ฌด์์ ๋น๋ํ ์ง ๊ธฐ๋๋ฉ๋๋ค. :)