snow · 2026.5.18 00:00 · 조회 3

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

Stable Diffusion

개요

이 가이드는 Apple Silicon(M1/M2/M3/M4) Mac에서 Stable Diffusion 3.5를 HuggingFace diffusers 라이브러리를 이용해 설치하고 로컬에서 실행하는 방법을 설명한다. Mac은 CUDA GPU가 없으므로 Apple의 Metal Performance Shaders(MPS) 백엔드를 통해 GPU 가속을 활용한다.

참고: SD 3.5 Large(8.1B)는 대용량 모델이라 Mac 통합 메모리 32GB 이상을 권장한다. 메모리가 부족한 경우 SD 3.5 Medium(2.5B) 사용을 권장한다.


사전 요구사항

하드웨어

  • Apple Silicon Mac (M1 / M2 / M3 / M4 계열)
  • 통합 메모리: SD 3.5 Medium — 최소 16GB (권장 24GB), SD 3.5 Large — 32GB 이상
  • 저장 공간: SD 3.5 Large 약 18GB, Medium 약 7GB

소프트웨어

  • macOS 12.6 이상 (macOS 13.0 이상 권장)
  • Python 3.9 이상 (arm64 네이티브 버전)
  • PyTorch 2.0 이상

Python 설치 확인

Homebrew로 설치한 Python 또는 공식 python.org arm64 인스톨러를 사용해야 한다. Rosetta(x86 에뮬레이션)로 실행되는 Python은 MPS 가속이 불가능하다.

# Python 아키텍처 확인 (arm64 여야 함)
python3 -c "import platform; print(platform.machine())"
# 출력: arm64

HuggingFace 토큰 발급

SD 3.5 모델은 HuggingFace에서 라이선스에 동의한 후 다운로드할 수 있다.

  1. HuggingFace에 회원가입 또는 로그인
  2. 사용할 모델 페이지 접속 후 라이선스 동의:
  3. Settings → Access Tokens에서 Read 권한 토큰 발급
  4. 터미널에서 토큰 설정:
pip install huggingface_hub
huggingface-cli login
# 프롬프트에 토큰 붙여넣기

설치 방법

1. 가상 환경 생성 (권장)

python3 -m venv sd35-env
source sd35-env/bin/activate

2. PyTorch 설치

# PyTorch (MPS 지원 포함)
pip install torch torchvision torchaudio

3. diffusers 및 의존성 설치

pip install -U diffusers transformers accelerate safetensors

4. 설치 확인

import torch
print(torch.__version__)
print("MPS 사용 가능:", torch.backends.mps.is_available())

Apple Silicon MPS 설정

Mac에서는 .to("cuda") 대신 .to("mps")를 사용한다. MPS 백엔드는 Apple의 Metal 프레임워크를 통해 Mac GPU를 활용한다.

import torch

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

MPS를 사용할 때 torch.bfloat16 대신 torch.float16을 사용해야 한다. Mac MPS 백엔드는 bfloat16을 완전히 지원하지 않는 경우가 있다.


기본 이미지 생성

SD 3.5 Medium (메모리 절약형 권장)

import torch
from diffusers import StableDiffusion3Pipeline

pipe = StableDiffusion3Pipeline.from_pretrained(
    "stabilityai/stable-diffusion-3.5-medium",
    torch_dtype=torch.float16,
)
pipe = pipe.to("mps")

# 메모리가 64GB 미만이면 반드시 활성화
pipe.enable_attention_slicing()

prompt = "A serene mountain landscape at golden hour, photorealistic, 8k"
negative_prompt = "blurry, low quality, distorted"

image = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=40,
    guidance_scale=4.5,
    height=1024,
    width=1024,
).images[0]

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

SD 3.5 Large Turbo (4스텝 고속 생성)

import torch
from diffusers import StableDiffusion3Pipeline

pipe = StableDiffusion3Pipeline.from_pretrained(
    "stabilityai/stable-diffusion-3.5-large-turbo",
    torch_dtype=torch.float16,
)
pipe = pipe.to("mps")
pipe.enable_attention_slicing()

prompt = "A futuristic city at night, neon lights, cinematic"

# Turbo 모델은 4스텝, guidance_scale=1.0 사용
image = pipe(
    prompt=prompt,
    num_inference_steps=4,
    guidance_scale=1.0,
).images[0]

image.save("turbo_output.png")

파라미터 조절

파라미터기본값설명
num_inference_stepsMedium: 40, Large: 28, Turbo: 4생성 스텝 수. 높을수록 품질 향상, 속도 감소
guidance_scale3.5~4.5프롬프트 충실도. 높을수록 프롬프트에 충실 (Turbo는 1.0)
height / width1024출력 해상도. 64의 배수여야 함
negative_promptNone제외할 요소를 지정하는 역프롬프트
num_images_per_prompt1Mac MPS에서는 배치 생성 오류 가능성이 있어 1 권장
# 다양한 해상도 예시
image = pipe(
    prompt="portrait of a woman, studio lighting",
    num_inference_steps=40,
    guidance_scale=4.0,
    height=1152,
    width=896,  # 세로형 (포트레이트)
).images[0]

메모리 최적화

Attention Slicing (필수)

메모리 64GB 미만 Mac에서는 반드시 활성화한다. 성능을 약 20% 향상시키고 메모리 스와핑을 방지한다.

pipe.enable_attention_slicing()

T5 텍스트 인코더 비활성화

T5-xxl 텍스트 인코더는 많은 메모리를 차지한다. 간단한 프롬프트에서는 비활성화해도 품질 차이가 크지 않다.

pipe = StableDiffusion3Pipeline.from_pretrained(
    "stabilityai/stable-diffusion-3.5-medium",
    torch_dtype=torch.float16,
    text_encoder_3=None,   # T5-xxl 비활성화
    tokenizer_3=None,
)
pipe = pipe.to("mps")

CPU 오프로딩

메모리가 부족한 경우 모델의 일부를 CPU RAM으로 오프로드한다. 속도는 느려지지만 메모리 초과를 방지할 수 있다.

pipe.enable_model_cpu_offload()
# 주의: enable_model_cpu_offload()와 .to("mps")는 함께 사용하지 않는다

자주 발생하는 오류 해결

오류: NotImplementedError: The operator 'aten::...' is not currently implemented for the MPS device

MPS에서 지원되지 않는 연산자 사용 시 발생한다.

# PyTorch 최신 버전으로 업데이트
pip install --upgrade torch torchvision torchaudio

그래도 해결되지 않으면 CPU 폴백을 설정한다:

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

오류: 배치 생성 시 크래시 또는 오류

Mac MPS에서는 num_images_per_prompt > 1 배치 생성이 불안정하다. 반복문으로 대체한다:

images = []
for i in range(4):
    img = pipe(prompt=prompt, num_inference_steps=40).images[0]
    img.save(f"output_{i}.png")
    images.append(img)

오류: bfloat16 관련 오류

torch_dtype=torch.bfloat16 대신 torch.float16을 사용한다:

pipe = StableDiffusion3Pipeline.from_pretrained(
    "stabilityai/stable-diffusion-3.5-medium",
    torch_dtype=torch.float16,  # bfloat16 아닌 float16
)

처음 실행이 두 번째보다 결과가 다를 때 (PyTorch 구버전)

PyTorch 1.13을 사용 중이라면 워밍업 패스를 한 번 실행한다:

# 워밍업 (결과 버림)
_ = pipe(prompt, num_inference_steps=1)

# 실제 생성
image = pipe(prompt, num_inference_steps=40).images[0]

참고 링크

댓글

아직 댓글이 없습니다.

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