Stable diffusion XL
Stable Diffusion XL์ Dustin Podell, Zion English, Kyle Lacey, Andreas Blattmann, Tim Dockhorn, Jonas Mรผller, Joe Penna, Robin Rombach์ ์ํด SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis์์ ์ ์๋์์ต๋๋ค.
๋ ผ๋ฌธ ์ด๋ก์ ๋ค์์ ๋ฐ๋ฆ ๋๋ค:
text-to-image์ latent diffusion ๋ชจ๋ธ์ธ SDXL์ ์๊ฐํฉ๋๋ค. ์ด์ ๋ฒ์ ์ Stable Diffusion๊ณผ ๋น๊ตํ๋ฉด, SDXL์ ์ธ ๋ฐฐ ๋ํฐ ๊ท๋ชจ์ UNet ๋ฐฑ๋ณธ์ ํฌํจํฉ๋๋ค: ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ์ ์ฆ๊ฐ๋ ๋ง์ attention ๋ธ๋ญ์ ์ฌ์ฉํ๊ณ ๋ ํฐ cross-attention context๋ฅผ SDXL์ ๋ ๋ฒ์งธ ํ ์คํธ ์ธ์ฝ๋์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค์ค ์ข ํก๋น์ ๋ค์์ ์๋ก์ด conditioning ๋ฐฉ๋ฒ์ ๊ตฌ์ฑํ์ต๋๋ค. ๋ํ ํ์ ์์ ํ๋ image-to-image ๊ธฐ์ ์ ์ฌ์ฉํจ์ผ๋ก์จ SDXL์ ์ํด ์์ฑ๋ ์๊ฐ์ ํ์ง์ ํฅ์ํ๊ธฐ ์ํด ์ ์ ๋ ๋ชจ๋ธ์ ์๊ฐํฉ๋๋ค. SDXL์ ์ด์ ๋ฒ์ ์ Stable Diffusion๋ณด๋ค ์ฑ๋ฅ์ด ํฅ์๋์๊ณ , ์ด๋ฌํ black-box ์ต์ ์ด๋ฏธ์ง ์์ฑ์์ ๊ฒฝ์๋ ฅ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฌ์ฑํ์ต๋๋ค.
ํ
- Stable Diffusion XL์ ํนํ 786๊ณผ 1024์ฌ์ด์ ์ด๋ฏธ์ง์ ์ ์๋ํฉ๋๋ค.
- Stable Diffusion XL์ ์๋์ ๊ฐ์ด ํ์ต๋ ๊ฐ ํ ์คํธ ์ธ์ฝ๋์ ๋ํด ์๋ก ๋ค๋ฅธ ํ๋กฌํํธ๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค. ๋์ผํ ํ๋กฌํํธ์ ๋ค๋ฅธ ๋ถ๋ถ์ ํ ์คํธ ์ธ์ฝ๋์ ์ ๋ฌํ ์๋ ์์ต๋๋ค.
- Stable Diffusion XL ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ ์๋์ ๋ณด์ฌ์ง๋ฏ์ด ์ ์ ๊ธฐ(refiner)๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ํฅ์๋ ์ ์์ต๋๋ค.
์ด์ฉ๊ฐ๋ฅํ ์ฒดํฌํฌ์ธํธ:
- Text-to-Image (1024x1024 ํด์๋): [
StableDiffusionXLPipeline
]์ ์ฌ์ฉํ stabilityai/stable-diffusion-xl-base-1.0 - Image-to-Image / ์ ์ ๊ธฐ(refiner) (1024x1024 ํด์๋): [
StableDiffusionXLImg2ImgPipeline
]๋ฅผ ์ฌ์ฉํ stabilityai/stable-diffusion-xl-refiner-1.0
์ฌ์ฉ ์์
SDXL์ ์ฌ์ฉํ๊ธฐ ์ ์ transformers
, accelerate
, safetensors
์ invisible_watermark
๋ฅผ ์ค์นํ์ธ์.
๋ค์๊ณผ ๊ฐ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ ์ ์์ต๋๋ค:
pip install transformers
pip install accelerate
pip install safetensors
pip install invisible-watermark>=0.2.0
์ํฐ๋ง์ปค
Stable Diffusion XL๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋ ์ํฐ๋งํฌ๊ฐ ๋ณด์ด์ง ์๋๋ก ์ถ๊ฐํ๋ ๊ฒ์ ๊ถ์ฅํ๋๋ฐ, ์ด๋ ๋ค์ด์คํธ๋ฆผ(downstream) ์ดํ๋ฆฌ์ผ์ด์ ์์ ๊ธฐ๊ณ์ ํฉ์ฑ๋์๋์ง๋ฅผ ์๋ณํ๋๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ ค๋ฉด invisible_watermark ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ค์นํด์ฃผ์ธ์:
pip install invisible-watermark>=0.2.0
invisible-watermark
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์น๋๋ฉด ์ํฐ๋ง์ปค๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋ ๊ฒ์
๋๋ค.
์์ฑ ๋๋ ์์ ํ๊ฒ ์ด๋ฏธ์ง๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ท์ ์ด ์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ํฐ๋ง์ปค๋ฅผ ๋นํ์ฑํํ ์ ์์ต๋๋ค:
pipe = StableDiffusionXLPipeline.from_pretrained(..., add_watermarker=False)
Text-to-Image
text-to-image๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ด SDXL์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
from diffusers import StableDiffusionXLPipeline
import torch
pipe = StableDiffusionXLPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipe.to("cuda")
prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
image = pipe(prompt=prompt).images[0]
Image-to-image
image-to-image๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ด SDXL์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
import torch
from diffusers import StableDiffusionXLImg2ImgPipeline
from diffusers.utils import load_image
pipe = StableDiffusionXLImg2ImgPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-refiner-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipe = pipe.to("cuda")
url = "https://huggingface.co/datasets/patrickvonplaten/images/resolve/main/aa_xl/000000009.png"
init_image = load_image(url).convert("RGB")
prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt, image=init_image).images[0]
์ธํ์ธํ
inpainting๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ด SDXL์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
import torch
from diffusers import StableDiffusionXLInpaintPipeline
from diffusers.utils import load_image
pipe = StableDiffusionXLInpaintPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipe.to("cuda")
img_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png"
mask_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png"
init_image = load_image(img_url).convert("RGB")
mask_image = load_image(mask_url).convert("RGB")
prompt = "A majestic tiger sitting on a bench"
image = pipe(prompt=prompt, image=init_image, mask_image=mask_image, num_inference_steps=50, strength=0.80).images[0]
์ด๋ฏธ์ง ๊ฒฐ๊ณผ๋ฌผ์ ์ ์ ํ๊ธฐ
base ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ์์, StableDiffusion-XL ๋ํ ๊ณ ์ฃผํ ํ์ง์ ํฅ์์ํค๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ฎ์ ๋ ธ์ด์ฆ ๋จ๊ณ ์ด๋ฏธ์ง๋ฅผ ์ ๊ฑฐํ๋๋ฐ ํนํ๋ refiner ์ฒดํฌํฌ์ธํธ๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค. ์ด refiner ์ฒดํฌํฌ์ธํธ๋ ์ด๋ฏธ์ง ํ์ง์ ํฅ์์ํค๊ธฐ ์ํด base ์ฒดํฌํฌ์ธํธ๋ฅผ ์คํํ ํ "๋ ๋ฒ์งธ ๋จ๊ณ" ํ์ดํ๋ผ์ธ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
refiner๋ฅผ ์ฌ์ฉํ ๋, ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค
- 1.) base ๋ชจ๋ธ๊ณผ refiner์ ์ฌ์ฉํ๋๋ฐ, ์ด๋ Denoisers์ ์์๋ธ์ ์ํ ์ฒซ ๋ฒ์งธ ์ ์๋ eDiff-I๋ฅผ ์ฌ์ฉํ๊ฑฐ๋
- 2.) base ๋ชจ๋ธ์ ๊ฑฐ์น ํ SDEdit ๋ฐฉ๋ฒ์ผ๋ก ๋จ์ํ๊ฒ refiner๋ฅผ ์คํ์ํฌ ์ ์์ต๋๋ค.
์ฐธ๊ณ : SD-XL base์ refiner๋ฅผ ์์๋ธ๋ก ์ฌ์ฉํ๋ ์์ด๋์ด๋ ์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ์๋ค์ด ์ฒ์์ผ๋ก ์ ์ํ์ผ๋ฉฐ, ์ด๋ ๋ค์๊ณผ ๊ฐ์ diffusers
๋ฅผ ๊ตฌํํ๋ ๋ฐ๋ ๋์์ ์ฃผ์
จ์ต๋๋ค.
1.) Denoisers์ ์์๋ธ
base์ refiner ๋ชจ๋ธ์ denoiser์ ์์๋ธ๋ก ์ฌ์ฉํ ๋, base ๋ชจ๋ธ์ ๊ณ ์ฃผํ diffusion ๋จ๊ณ๋ฅผ ์ํ ์ ๋ฌธ๊ฐ์ ์ญํ ์ ํด์ผํ๊ณ , refiner๋ ๋ฎ์ ๋ ธ์ด์ฆ diffusion ๋จ๊ณ๋ฅผ ์ํ ์ ๋ฌธ๊ฐ์ ์ญํ ์ ํด์ผ ํฉ๋๋ค.
2.)์ ๋นํด 1.)์ ์ฅ์ ์ ์ ์ฒด์ ์ผ๋ก denoising ๋จ๊ณ๊ฐ ๋ ํ์ํ๋ฏ๋ก ์๋๊ฐ ํจ์ฌ ๋ ๋นจ๋ผ์ง๋๋ค. ๋จ์ ์ base ๋ชจ๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฌํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ์ฌ์ ํ ๋ ธ์ด์ฆ๊ฐ ์ฌํ๊ฒ ์ ๊ฑฐ๋ฉ๋๋ค.
base ๋ชจ๋ธ๊ณผ refiner๋ฅผ denoiser์ ์์๋ธ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๊ฐ ๊ณ ๋
ธ์ด์ฆ(high-nosise) (์ฆ base ๋ชจ๋ธ)์ ์ ๋
ธ์ด์ฆ (์ฆ refiner ๋ชจ๋ธ)์ ๋
ธ์ด์ฆ๋ฅผ ์ ๊ฑฐํ๋ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผํ๋ ํ์์คํ
์ ๊ธฐ๊ฐ์ ์ ์ํด์ผ ํฉ๋๋ค.
base ๋ชจ๋ธ์ denoising_end
์ refiner ๋ชจ๋ธ์ denoising_start
๋ฅผ ์ฌ์ฉํด ๊ฐ๊ฒฉ์ ์ ํฉ๋๋ค.
denoising_end
์ denoising_start
๋ชจ๋ 0๊ณผ 1์ฌ์ด์ ์ค์ ๊ฐ์ผ๋ก ์ ๋ฌ๋์ด์ผ ํฉ๋๋ค.
์ ๋ฌ๋๋ฉด ๋
ธ์ด์ฆ ์ ๊ฑฐ์ ๋๊ณผ ์์์ ๋ชจ๋ธ ์ค์ผ์ค์ ์ํด ์ ์๋ ์ด์ฐ์ (discrete) ์๊ฐ ๊ฐ๊ฒฉ์ ๋น์จ๋ก ์ ์๋ฉ๋๋ค.
๋
ธ์ด์ฆ ์ ๊ฑฐ ๋จ๊ณ์ ์๋ ๋ชจ๋ธ์ด ํ์ต๋ ๋ถ์ฐ์์ ์ธ ์๊ฐ ๊ฐ๊ฒฉ๊ณผ ์ ์ธ๋ fractional cutoff์ ์ํด ๊ฒฐ์ ๋๋ฏ๋ก '๊ฐ๋' ๋ํ ์ ์ธ๋ ๊ฒฝ์ฐ ์ด ๊ฐ์ด '๊ฐ๋'๋ฅผ ์ฌ์ ์ํฉ๋๋ค.
์์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ์ฐ์ , ๋ ๊ฐ์ ํ์ดํ๋ผ์ธ์ ๊ฐ์ ธ์ต๋๋ค. ํ ์คํธ ์ธ์ฝ๋์ variational autoencoder๋ ๋์ผํ๋ฏ๋ก refiner๋ฅผ ์ํด ๋ค์ ๋ถ๋ฌ์ค์ง ์์๋ ๋ฉ๋๋ค.
from diffusers import DiffusionPipeline
import torch
base = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipe.to("cuda")
refiner = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-refiner-1.0",
text_encoder_2=base.text_encoder_2,
vae=base.vae,
torch_dtype=torch.float16,
use_safetensors=True,
variant="fp16",
)
refiner.to("cuda")
์ด์ ์ถ๋ก ๋จ๊ณ์ ์์ ๊ณ ๋ ธ์ด์ฆ์์ ๋ ธ์ด์ฆ๋ฅผ ์ ๊ฑฐํ๋ ๋จ๊ณ(์ฆ base ๋ชจ๋ธ)๋ฅผ ๊ฑฐ์ณ ์คํ๋๋ ์ง์ ์ ์ ์ํฉ๋๋ค.
n_steps = 40
high_noise_frac = 0.8
Stable Diffusion XL base ๋ชจ๋ธ์ ํ์์คํ
0-999์ ํ์ต๋๋ฉฐ Stable Diffusion XL refiner๋ ํฌ๊ด์ ์ธ ๋ฎ์ ๋
ธ์ด์ฆ ํ์์คํ
์ธ 0-199์ base ๋ชจ๋ธ๋ก ๋ถํฐ ํ์ธํ๋๋์ด, ์ฒซ 800 ํ์์คํ
(๋์ ๋
ธ์ด์ฆ)์ base ๋ชจ๋ธ์ ์ฌ์ฉํ๊ณ ๋ง์ง๋ง 200 ํ์
์คํ
(๋ฎ์ ๋
ธ์ด์ฆ)์์ refiner๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์, high_noise_frac
๋ 0.8๋ก ์ค์ ํ๊ณ , ๋ชจ๋ 200-999 ์คํ
(๋
ธ์ด์ฆ ์ ๊ฑฐ ํ์์คํ
์ ์ฒซ 80%)์ base ๋ชจ๋ธ์ ์ํด ์ํ๋๋ฉฐ 0-199 ์คํ
(๋
ธ์ด์ฆ ์ ๊ฑฐ ํ์์คํ
์ ๋ง์ง๋ง 20%)์ refiner ๋ชจ๋ธ์ ์ํด ์ํ๋ฉ๋๋ค.
๊ธฐ์ตํ์ธ์, ๋ ธ์ด์ฆ ์ ๊ฑฐ ์ ์ฐจ๋ ๋์ ๊ฐ(๋์ ๋ ธ์ด์ฆ) ํ์์คํ ์์ ์์๋๊ณ , ๋ฎ์ ๊ฐ (๋ฎ์ ๋ ธ์ด์ฆ) ํ์์คํ ์์ ๋๋ฉ๋๋ค.
์ด์ ๋ ํ์ดํ๋ผ์ธ์ ์คํํด๋ด
์๋ค. denoising_end
๊ณผ denoising_start
๋ฅผ ๊ฐ์ ๊ฐ์ผ๋ก ์ค์ ํ๊ณ num_inference_steps
๋ ์์๋ก ์ ์งํฉ๋๋ค. ๋ํ base ๋ชจ๋ธ์ ์ถ๋ ฅ์ ์ ์ฌ ๊ณต๊ฐ์ ์์ด์ผ ํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์:
prompt = "A majestic lion jumping from a big stone at night"
image = base(
prompt=prompt,
num_inference_steps=n_steps,
denoising_end=high_noise_frac,
output_type="latent",
).images
image = refiner(
prompt=prompt,
num_inference_steps=n_steps,
denoising_start=high_noise_frac,
image=image,
).images[0]
์ด๋ฏธ์ง๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋์ผํ 40 ๋จ๊ณ์์ base ๋ชจ๋ธ์ ์คํํ๋ค๋ฉด, ์ด๋ฏธ์ง์ ๋ํ ์ผ(์: ์ฌ์์ ๋๊ณผ ์ฝ)์ด ๋จ์ด์ก์ ๊ฒ์ ๋๋ค:
์์๋ธ ๋ฐฉ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์ค์ผ์ค๋ฌ์์ ์ ์๋ํฉ๋๋ค!
2.) ๋ ธ์ด์ฆ๊ฐ ์์ ํ ์ ๊ฑฐ๋ ๊ธฐ๋ณธ ์ด๋ฏธ์ง์์ ์ด๋ฏธ์ง ์ถ๋ ฅ์ ์ ์ ํ๊ธฐ
์ผ๋ฐ์ ์ธ [StableDiffusionImg2ImgPipeline
] ๋ฐฉ์์์, ๊ธฐ๋ณธ ๋ชจ๋ธ์์ ์์ฑ๋ ์์ ํ ๋
ธ์ด์ฆ๊ฐ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง๋ refiner checkpoint๋ฅผ ์ฌ์ฉํด ๋ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํด, ๋ณดํต์ "base" text-to-image ํ์ดํ๋ผ์ธ์ ์ํ ํ์ image-to-image ํ์ดํ๋ผ์ธ์ผ๋ก์จ refiner๋ฅผ ์คํ์ํฌ ์ ์์ต๋๋ค. base ๋ชจ๋ธ์ ์ถ๋ ฅ์ ์ ์ฌ ๊ณต๊ฐ์ ๋จ๊ฒจ๋ ์ ์์ต๋๋ค.
from diffusers import DiffusionPipeline
import torch
pipe = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipe.to("cuda")
refiner = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-refiner-1.0",
text_encoder_2=pipe.text_encoder_2,
vae=pipe.vae,
torch_dtype=torch.float16,
use_safetensors=True,
variant="fp16",
)
refiner.to("cuda")
prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
image = pipe(prompt=prompt, output_type="latent" if use_refiner else "pil").images[0]
image = refiner(prompt=prompt, image=image[None, :]).images[0]
refiner๋ ๋ํ ์ธํ์ธํ
์ค์ ์ ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋์ ๋ณด์ฌ์ง๋ฏ์ด [StableDiffusionXLInpaintPipeline
] ํด๋์ค๋ฅผ ์ฌ์ฉํด์ ๋ง๋ค์ด๋ณด์ธ์.
Denoiser ์์๋ธ ์ค์ ์์ ์ธํ์ธํ ์ refiner๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์์ ์ํํ๋ฉด ๋ฉ๋๋ค:
from diffusers import StableDiffusionXLInpaintPipeline
from diffusers.utils import load_image
pipe = StableDiffusionXLInpaintPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipe.to("cuda")
refiner = StableDiffusionXLInpaintPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-refiner-1.0",
text_encoder_2=pipe.text_encoder_2,
vae=pipe.vae,
torch_dtype=torch.float16,
use_safetensors=True,
variant="fp16",
)
refiner.to("cuda")
img_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png"
mask_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png"
init_image = load_image(img_url).convert("RGB")
mask_image = load_image(mask_url).convert("RGB")
prompt = "A majestic tiger sitting on a bench"
num_inference_steps = 75
high_noise_frac = 0.7
image = pipe(
prompt=prompt,
image=init_image,
mask_image=mask_image,
num_inference_steps=num_inference_steps,
denoising_start=high_noise_frac,
output_type="latent",
).images
image = refiner(
prompt=prompt,
image=image,
mask_image=mask_image,
num_inference_steps=num_inference_steps,
denoising_start=high_noise_frac,
).images[0]
์ผ๋ฐ์ ์ธ SDE ์ค์ ์์ ์ธํ์ธํ
์ refiner๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด, denoising_end
์ denoising_start
๋ฅผ ์ ๊ฑฐํ๊ณ refiner์ ์ถ๋ก ๋จ๊ณ์ ์๋ฅผ ์ ๊ฒ ์ ํํ์ธ์.
๋จ๋ ์ฒดํฌํฌ์ธํธ ํ์ผ / ์๋์ ํ์ผ ํ์์ผ๋ก ๋ถ๋ฌ์ค๊ธฐ
[~diffusers.loaders.FromSingleFileMixin.from_single_file
]๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์๋์ ํ์ผ ํ์์ diffusers
ํ์์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค:
from diffusers import StableDiffusionXLPipeline, StableDiffusionXLImg2ImgPipeline
import torch
pipe = StableDiffusionXLPipeline.from_single_file(
"./sd_xl_base_1.0.safetensors", torch_dtype=torch.float16
)
pipe.to("cuda")
refiner = StableDiffusionXLImg2ImgPipeline.from_single_file(
"./sd_xl_refiner_1.0.safetensors", torch_dtype=torch.float16
)
refiner.to("cuda")
๋ชจ๋ธ offloading์ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ต์ ํํ๊ธฐ
out-of-memory ์๋ฌ๊ฐ ๋๋ค๋ฉด, [StableDiffusionXLPipeline.enable_model_cpu_offload
]์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
- pipe.to("cuda")
+ pipe.enable_model_cpu_offload()
๊ทธ๋ฆฌ๊ณ
- refiner.to("cuda")
+ refiner.enable_model_cpu_offload()
torch.compile
๋ก ์ถ๋ก ์๋๋ฅผ ์ฌ๋ฆฌ๊ธฐ
torch.compile
๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ถ๋ก ์๋๋ฅผ ์ฌ๋ฆด ์ ์์ต๋๋ค. ์ด๋ ca. 20% ์๋ ํฅ์์ด ๋ฉ๋๋ค.
+ pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)
+ refiner.unet = torch.compile(refiner.unet, mode="reduce-overhead", fullgraph=True)
torch < 2.0
์ผ ๋ ์คํํ๊ธฐ
์ฐธ๊ณ Stable Diffusion XL์ torch
๊ฐ 2.0 ๋ฒ์ ๋ฏธ๋ง์์ ์คํ์ํค๊ณ ์ถ์ ๋, xformers ์ดํ
์
์ ์ฌ์ฉํด์ฃผ์ธ์:
pip install xformers
+pipe.enable_xformers_memory_efficient_attention()
+refiner.enable_xformers_memory_efficient_attention()
StableDiffusionXLPipeline
[[autodoc]] StableDiffusionXLPipeline - all - call
StableDiffusionXLImg2ImgPipeline
[[autodoc]] StableDiffusionXLImg2ImgPipeline - all - call
StableDiffusionXLInpaintPipeline
[[autodoc]] StableDiffusionXLInpaintPipeline - all - call
๊ฐ ํ ์คํธ ์ธ์ฝ๋์ ๋ค๋ฅธ ํ๋กฌํํธ๋ฅผ ์ ๋ฌํ๊ธฐ
Stable Diffusion XL๋ ๋ ๊ฐ์ ํ
์คํธ ์ธ์ฝ๋์ ํ์ต๋์์ต๋๋ค. ๊ธฐ๋ณธ ๋์์ ๊ฐ ํ๋กฌํํธ์ ๋์ผํ ํ๋กฌํํธ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ถ ์ฌ์ฉ์๊ฐ ํ์ง์ ํฅ์์ํฌ ์ ์๋ค๊ณ ์ง์ ํ ๊ฒ์ฒ๋ผ ํ
์คํธ ์ธ์ฝ๋๋ง๋ค ๋ค๋ฅธ ํ๋กฌํํธ๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ ค๋ฉด, prompt_2
์ negative_prompt_2
๋ฅผ prompt
์ negative_prompt
์ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํจ์ผ๋ก์จ, ์๋์ ํ๋กฌํํธ๋ค(prompt
)๊ณผ ๋ถ์ ํ๋กฌํํธ๋ค(negative_prompt
)๋ฅผ ํ
์คํธ ์ธ์ฝ๋
์ ์ ๋ฌํ ๊ฒ์
๋๋ค.(๊ณต์ SDXL 0.9/1.0์ OpenAI CLIP-ViT/L-14์์ ๋ณผ ์ ์์ต๋๋ค.) ๊ทธ๋ฆฌ๊ณ prompt_2
์ negative_prompt_2
๋ text_encoder_2
์ ์ ๋ฌ๋ฉ๋๋ค.(๊ณต์ SDXL 0.9/1.0์ OpenCLIP-ViT/bigG-14์์ ๋ณผ ์ ์์ต๋๋ค.)
from diffusers import StableDiffusionXLPipeline
import torch
pipe = StableDiffusionXLPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-0.9", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
pipe.to("cuda")
# OAI CLIP-ViT/L-14์ prompt๊ฐ ์ ๋ฌ๋ฉ๋๋ค
prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
# OpenCLIP-ViT/bigG-14์ prompt_2๊ฐ ์ ๋ฌ๋ฉ๋๋ค
prompt_2 = "monet painting"
image = pipe(prompt=prompt, prompt_2=prompt_2).images[0]