본문 바로가기

development/머신러닝 운영

🐳 Stable Diffusion API Docker 패키징: 로컬 모델 조립 → 컨테이너화까지

Stable Diffusion 모델 구성요소를 로컬에서 조립한 다음, 이를 Docker 기반 API 서버로 패키징한 과정을 정리했다.

 

작업 배경

앞선 포스팅에서 from_pretrained() 없이 로컬에 저장된 모델 구성 요소들만으로 Stable Diffusion 파이프라인을 조립했다. 그리고 이후에는 이 모델들을 EFS에 저장하고 API 서버에서 직접 로딩하는 구조로 개선했다.

 

이제 남은 건 이 환경을 실제 운영에 적합한 형태로 포장하는 일. 즉, Docker 컨테이너로 패키징해서 어디서든 실행 가능하게 만드는 것이었다.


Dockerfile 구성

패키징 대상은 다음과 같다:

  • FastAPI 기반 API 서버 코드 (main.py)
  • Stable Diffusion 구성 요소를 로드하는 로직
  • requirements.txt에 정의된 Python 패키지

Dockerfile은 CUDA 지원 PyTorch 공식 이미지를 베이스로 사용했다:

FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime

WORKDIR /app

RUN apt-get update && apt-get install -y \
    git \
    wget \
    curl \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY main.py .

EXPOSE 8000

CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

💡 PyTorch, CUDA, FastAPI, diffusers, transformers 등이 requirements에 포함되어 있음


requirements.txt 주요 구성

torch==2.2.2
diffusers==0.34.0
transformers==4.54.1
fastapi==0.104.1
uvicorn[standard]==0.24.0
huggingface_hub==0.34.3
accelerate==1.9.0
Pillow==10.1.0
python-multipart==0.0.6

모두 테스트된 안정 버전으로, docker 이미지 빌드 시 직접 캐시 없이 설치된다.


 Docker Compose 구성

version: '3.8'

services:
  stable-diffusion-api:
    build: .
    ports:
      - "8000:8000"
    environment:
      - CUDA_VISIBLE_DEVICES=0
    runtime: nvidia
    volumes:
      - /mnt/efs/saved_sd15:/mnt/efs/saved_sd15
    restart: unless-stopped
  1. runtime: nvidia → GPU 사용을 위한 설정
  2. /mnt/efs/saved_sd15 → 로컬 저장 대신 EFS 경로를 컨테이너 안에 마운트
  3. CUDA_VISIBLE_DEVICES=0 → 특정 GPU만 사용하도록 설정

 실행 결과 & 효과

  1. 컨테이너는 FastAPI 서버로 잘 실행되며 Swagger UI를 통해 API 테스트 가능
  2. EFS에 저장된 모델 구성 요소를 정상적으로 불러옴
  3. 별도 모델 다운로드 없이 API 동작까지 평균 2~3초 이내 응답 확인

전체 구조 요약

[ EFS 저장 모델 구성 요소 ]
          ▲
          │ (volumes 마운트)
          ▼
[ Docker 컨테이너 실행 ]
  └── main.py에서 /mnt/efs/saved_sd15 경로 참조
  └── FastAPI + Uvicorn으로 API 실행

이제는 어디서든 docker-compose up --build 한 번이면 Stable Diffusion 서버를 띄울 수 있게 된 셈이다.


 컨테이너 실행 & 모델 세팅

컨테이너 실행 방법, 모델 구성요소 다운로드 스크립트, requirements.txt 등은 아래 레포지토리에 정리해두었습니다:

👉 GitHub 레포 바로가기
(실행 가이드와 예제 curl 명령까지 포함되어 있어 바로 테스트 가능합니다.)


정리

  1. Stable Diffusion 모델 구성요소를 사전에 저장하고
  2. EFS를 통해 경량화된 컨테이너에 연결한 뒤
  3. FastAPI 기반으로 패키징해서 컨테이너 하나로 배포 가능하게 구성

실제 운영 환경에서도 깔끔하게 재현 가능하며, CI/CD나 Cloud Run 같은 배포 자동화에 활용하기 좋은 형태가 되었다.


다음에는 EBS 용량 최소화와 gp3 전환 작업이 예정되어있습니다~
Stable Diffusion 모델 파이프라인 구성 관련해서 새로운 아이디어가 있다면 언제든지 댓글로 남겨주세요!