snow · 2026.5.19 14:00 · 조회 5
Stable Diffusion XL 설치 및 사용 가이드 (Mac)
개요
이 가이드는 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_end와denoising_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
참고 링크
- Hugging Face diffusers SDXL 공식 문서
- Metal Performance Shaders (MPS) 최적화 가이드
- stabilityai/stable-diffusion-xl-base-1.0 (Hugging Face)
- stabilityai/stable-diffusion-xl-refiner-1.0 (Hugging Face)
- stabilityai/sdxl-turbo (Hugging Face)
- Apple ml-stable-diffusion (Core ML 방식)
- AUTOMATIC1111 WebUI Apple Silicon 설치 위키
댓글
아직 댓글이 없습니다.
댓글을 작성하려면 로그인이 필요합니다.