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 가상 환경 생성

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

diffusers 및 의존 패키지 설치

1# PyTorch (MPS 지원 버전, Apple Silicon용)2pip install torch torchvision torchaudio3 4# diffusers 핵심 패키지 설치5pip install diffusers transformers accelerate safetensors6 7# 선택: 프로그레스바 표시8pip install tqdm

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


2단계: Apple Silicon MPS 설정 확인

1import torch2 3# MPS 가용 여부 확인4print("MPS 사용 가능:", torch.backends.mps.is_available())5print("MPS 빌드됨:", torch.backends.mps.is_built())6 7# 디바이스 설정8device = "mps" if torch.backends.mps.is_available() else "cpu"9print(f"사용 디바이스: {device}")

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


3단계: Base 모델 단독 사용

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

1import torch2from diffusers import DiffusionPipeline3 4# Base 모델 로드 (최초 실행 시 자동 다운로드 ~7GB)5pipe = DiffusionPipeline.from_pretrained(6    "stabilityai/stable-diffusion-xl-base-1.0",7    torch_dtype=torch.float16,8    variant="fp16",9    use_safetensors=True,10)11 12# MPS 디바이스로 이동13pipe = pipe.to("mps")14 15# 메모리 최적화 (Apple Silicon 권장)16pipe.enable_attention_slicing()17 18# 이미지 생성19prompt = "a majestic lion sitting on a rock, golden hour lighting, photorealistic, 8k"20negative_prompt = "blurry, low quality, distorted, ugly"21 22image = pipe(23    prompt=prompt,24    negative_prompt=negative_prompt,25    num_inference_steps=30,26    guidance_scale=7.5,27).images[0]28 29image.save("output_base.png")30print("이미지 저장 완료: output_base.png")

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

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

1import torch2from diffusers import DiffusionPipeline3 4# Base 모델 로드5base = DiffusionPipeline.from_pretrained(6    "stabilityai/stable-diffusion-xl-base-1.0",7    torch_dtype=torch.float16,8    variant="fp16",9    use_safetensors=True,10)11base.to("mps")12base.enable_attention_slicing()13 14# Refiner 모델 로드15refiner = DiffusionPipeline.from_pretrained(16    "stabilityai/stable-diffusion-xl-refiner-1.0",17    text_encoder_2=base.text_encoder_2,  # Base의 텍스트 인코더 재사용으로 메모리 절약18    vae=base.vae,19    torch_dtype=torch.float16,20    variant="fp16",21    use_safetensors=True,22)23refiner.to("mps")24refiner.enable_attention_slicing()25 26prompt = "a serene Japanese garden with cherry blossoms, koi pond, mist, cinematic"27negative_prompt = "blurry, ugly, low quality"28 29# 1단계: Base로 노이즈 있는 잠재 표현 생성 (denoising_end=0.8: 80%까지만 처리)30latent = base(31    prompt=prompt,32    negative_prompt=negative_prompt,33    num_inference_steps=40,34    denoising_end=0.8,35    output_type="latent",36).images37 38# 2단계: Refiner로 나머지 20% 디노이징 (디테일 강화)39image = refiner(40    prompt=prompt,41    negative_prompt=negative_prompt,42    num_inference_steps=40,43    denoising_start=0.8,44    image=latent,45).images[0]46 47image.save("output_base_refiner.png")48print("이미지 저장 완료: output_base_refiner.png")

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


5단계: SDXL Turbo 사용법

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

1import torch2from diffusers import AutoPipelineForText2Image3 4# Turbo 모델 로드5pipe = AutoPipelineForText2Image.from_pretrained(6    "stabilityai/sdxl-turbo",7    torch_dtype=torch.float16,8    variant="fp16",9)10pipe.to("mps")11pipe.enable_attention_slicing()12 13prompt = "a futuristic city at night, neon lights, cyberpunk style"14 15# Turbo: num_inference_steps=1, guidance_scale=0.0 설정 필수16image = pipe(17    prompt=prompt,18    num_inference_steps=1,19    guidance_scale=0.0,  # Turbo는 CFG 없이 동작20).images[0]21 22image.save("output_turbo.png")23print("Turbo 이미지 저장 완료: output_turbo.png")

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


메모리 최적화 팁

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

1# 1. Attention Slicing: 어텐션 연산을 나눠 처리해 메모리 절약 (약 20% 성능 향상)2pipe.enable_attention_slicing()3 4# 2. VAE Tiling: 대형 이미지 생성 시 VAE 연산을 타일로 분할5pipe.enable_vae_tiling()6 7# 3. 모델 CPU 오프로드: 사용하지 않는 모델 컴포넌트를 CPU로 이동8pipe.enable_model_cpu_offload()9 10# 4. fp16 사용: float32 대비 메모리 절반 사용11# (from_pretrained 시 torch_dtype=torch.float16 지정)12 13# 5. 사용 후 캐시 비우기14import gc15gc.collect()16torch.mps.empty_cache()

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


자주 발생하는 오류 해결

RuntimeError: MPS backend out of memory

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

1# 해결 방법 1: 캐시 비우기 후 재시도2import gc, torch3gc.collect()4torch.mps.empty_cache()5 6# 해결 방법 2: Attention Slicing 활성화7pipe.enable_attention_slicing(1)  # 슬라이스 크기 1 (최대 절약)8 9# 해결 방법 3: CPU 오프로드 사용10pipe.enable_model_cpu_offload()

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

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

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

또는 코드 내에서:

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

배치 생성 시 크래시

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

1# 권장하지 않음2images = pipe(prompt, num_images_per_prompt=4).images3 4# 권장: 반복문으로 개별 생성5images = []6for i in range(4):7    img = pipe(prompt).images[0]8    images.append(img)

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

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

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

참고 링크

댓글

아직 댓글이 없습니다.

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