snow · 2026.5.19 14:00 · 조회 5

Stable Diffusion XL 설치 및 사용 가이드 (Mac)

Stable Diffusion

개요

이 가이드는 Apple Silicon(M1/M2/M3/M4) Mac에서 Hugging Face diffusers 라이브러리를 이용해 Stable Diffusion XL(SDXL)을 설치하고 실행하는 방법을 안내한다. PyTorch의 MPS(Metal Performance Shaders) 백엔드를 통해 Mac GPU를 활용하므로 별도의 NVIDIA GPU 없이도 이미지를 생성할 수 있다.


사전 요구사항

  • 하드웨어: Apple Silicon Mac (M1 이상 권장) — Intel Mac은 CPU 전용으로 동작하며 속도가 매우 느림
  • macOS: 12.3 (Monterey) 이상
  • RAM: 최소 16GB 권장 (8GB에서도 동작하나 메모리 스왑 발생 가능)
  • Python: 3.9 이상
  • 저장 공간: Base 모델 ~7GB, Refiner 모델 ~7GB (총 약 14GB 이상)

1단계: 환경 설정

Python 가상 환경 생성

# 가상 환경 생성 및 활성화
python3 -m venv sdxl-env
source sdxl-env/bin/activate

diffusers 및 의존 패키지 설치

# PyTorch (MPS 지원 버전, Apple Silicon용)
pip install torch torchvision torchaudio

# diffusers 핵심 패키지 설치
pip install diffusers transformers accelerate safetensors

# 선택: 프로그레스바 표시
pip install tqdm

참고: Apple Silicon Mac용 PyTorch는 별도 CUDA 버전 없이 기본 pip 설치만으로 MPS를 지원한다.


2단계: Apple Silicon MPS 설정 확인

import torch

# MPS 가용 여부 확인
print("MPS 사용 가능:", torch.backends.mps.is_available())
print("MPS 빌드됨:", torch.backends.mps.is_built())

# 디바이스 설정
device = "mps" if torch.backends.mps.is_available() else "cpu"
print(f"사용 디바이스: {device}")

MPS가 활성화되어 있으면 MPS 사용 가능: True가 출력된다.


3단계: Base 모델 단독 사용

Base 모델만으로도 충분한 품질의 이미지를 생성할 수 있다. 메모리가 부족한 환경에서 추천하는 방법이다.

import torch
from diffusers import DiffusionPipeline

# Base 모델 로드 (최초 실행 시 자동 다운로드 ~7GB)
pipe = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)

# MPS 디바이스로 이동
pipe = pipe.to("mps")

# 메모리 최적화 (Apple Silicon 권장)
pipe.enable_attention_slicing()

# 이미지 생성
prompt = "a majestic lion sitting on a rock, golden hour lighting, photorealistic, 8k"
negative_prompt = "blurry, low quality, distorted, ugly"

image = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=30,
    guidance_scale=7.5,
).images[0]

image.save("output_base.png")
print("이미지 저장 완료: output_base.png")

4단계: Base + Refiner 2단계 파이프라인

최고 품질의 이미지를 원할 때 사용하는 방법이다. Base가 전체 구조를 잡고 Refiner가 디테일을 다듬는다.

import torch
from diffusers import DiffusionPipeline

# Base 모델 로드
base = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
base.to("mps")
base.enable_attention_slicing()

# Refiner 모델 로드
refiner = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0",
    text_encoder_2=base.text_encoder_2,  # Base의 텍스트 인코더 재사용으로 메모리 절약
    vae=base.vae,
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True,
)
refiner.to("mps")
refiner.enable_attention_slicing()

prompt = "a serene Japanese garden with cherry blossoms, koi pond, mist, cinematic"
negative_prompt = "blurry, ugly, low quality"

# 1단계: Base로 노이즈 있는 잠재 표현 생성 (denoising_end=0.8: 80%까지만 처리)
latent = base(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=40,
    denoising_end=0.8,
    output_type="latent",
).images

# 2단계: Refiner로 나머지 20% 디노이징 (디테일 강화)
image = refiner(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=40,
    denoising_start=0.8,
    image=latent,
).images[0]

image.save("output_base_refiner.png")
print("이미지 저장 완료: output_base_refiner.png")

: denoising_enddenoising_start를 같은 값(여기서는 0.8)으로 맞춰 두 단계가 연결되도록 한다.


5단계: SDXL Turbo 사용법

SDXL Turbo는 단 1스텝으로 이미지를 생성하는 증류 모델이다. 실시간 프리뷰나 빠른 프로토타이핑에 적합하다.

import torch
from diffusers import AutoPipelineForText2Image

# Turbo 모델 로드
pipe = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/sdxl-turbo",
    torch_dtype=torch.float16,
    variant="fp16",
)
pipe.to("mps")
pipe.enable_attention_slicing()

prompt = "a futuristic city at night, neon lights, cyberpunk style"

# Turbo: num_inference_steps=1, guidance_scale=0.0 설정 필수
image = pipe(
    prompt=prompt,
    num_inference_steps=1,
    guidance_scale=0.0,  # Turbo는 CFG 없이 동작
).images[0]

image.save("output_turbo.png")
print("Turbo 이미지 저장 완료: output_turbo.png")

주의: SDXL Turbo는 guidance_scale=0.0으로 설정해야 하며, negative prompt를 사용하지 않는다.


메모리 최적화 팁

Apple Silicon Mac은 CPU와 GPU가 통합 메모리를 공유하기 때문에 메모리 관리가 중요하다.

# 1. Attention Slicing: 어텐션 연산을 나눠 처리해 메모리 절약 (약 20% 성능 향상)
pipe.enable_attention_slicing()

# 2. VAE Tiling: 대형 이미지 생성 시 VAE 연산을 타일로 분할
pipe.enable_vae_tiling()

# 3. 모델 CPU 오프로드: 사용하지 않는 모델 컴포넌트를 CPU로 이동
pipe.enable_model_cpu_offload()

# 4. fp16 사용: float32 대비 메모리 절반 사용
# (from_pretrained 시 torch_dtype=torch.float16 지정)

# 5. 사용 후 캐시 비우기
import gc
gc.collect()
torch.mps.empty_cache()

16GB RAM 이하: Base 단독 사용 + enable_attention_slicing() + enable_model_cpu_offload() 조합을 권장한다.


자주 발생하는 오류 해결

RuntimeError: MPS backend out of memory

메모리 부족 오류. 다음 순서로 시도한다.

# 해결 방법 1: 캐시 비우기 후 재시도
import gc, torch
gc.collect()
torch.mps.empty_cache()

# 해결 방법 2: Attention Slicing 활성화
pipe.enable_attention_slicing(1)  # 슬라이스 크기 1 (최대 절약)

# 해결 방법 3: CPU 오프로드 사용
pipe.enable_model_cpu_offload()

NotImplementedError: The operator ... is not currently implemented for the MPS device

특정 PyTorch 연산이 MPS에서 미지원될 때 발생한다. CPU 폴백으로 우회한다.

# 환경 변수로 MPS 폴백 활성화
export PYTORCH_ENABLE_MPS_FALLBACK=1
python your_script.py

또는 코드 내에서:

import os
os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1"

배치 생성 시 크래시

MPS에서는 여러 이미지를 배치로 한꺼번에 생성하면 불안정할 수 있다. 반복문으로 한 장씩 생성한다.

# 권장하지 않음
images = pipe(prompt, num_images_per_prompt=4).images

# 권장: 반복문으로 개별 생성
images = []
for i in range(4):
    img = pipe(prompt).images[0]
    images.append(img)

모델 다운로드 느림 또는 중단

Hugging Face Hub에서 모델을 받을 때 속도가 느리거나 중단되면 huggingface-cli로 이어받기를 시도한다.

pip install huggingface_hub
huggingface-cli download stabilityai/stable-diffusion-xl-base-1.0 --local-dir ./sdxl-base

참고 링크

댓글

아직 댓글이 없습니다.

댓글을 작성하려면 로그인이 필요합니다.