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 가상 환경 생성
1# 가상 환경 생성 및 활성화2python3 -m venv sdxl-env3source sdxl-env/bin/activatediffusers 및 의존 패키지 설치
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_end와denoising_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참고 링크
- 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 설치 위키
댓글
아직 댓글이 없습니다.
댓글을 작성하려면 로그인이 필요합니다.