개요

AI 비디오 생성 모델인 Open-Sora를 실제 운영 환경에서 사용하기 위해서는 복잡한 환경 설정이 필요합니다. 이번 포스트에서는 Open-Sora를 Docker 컨테이너로 완벽하게 패키징하는 방법을 상세히 분석해보겠습니다.

Docker 환경의 필요성

왜 Docker인가?

Open-Sora는 다음과 같은 복잡한 환경 요구사항을 가지고 있습니다:

  • CUDA 12.2.2: 최신 GPU 가속 지원
  • Python 3.10: 특정 파이썬 버전 의존성
  • PyTorch 2.4.0+: 딥러닝 프레임워크
  • Flash Attention: 메모리 최적화 라이브러리
  • 다양한 ML 라이브러리들: 버전 호환성 중요

Docker를 사용하면 이러한 복잡한 환경을 일관되게 재현할 수 있습니다.

Dockerfile 상세 분석

1. 기본 이미지 선택

# Build arguments
ARG CUDA_VERSION=12.2.2
ARG UBUNTU_VERSION=22.04
ARG PYTHON_VERSION=3.10

FROM nvidia/cuda:${CUDA_VERSION}-cudnn8-devel-ubuntu${UBUNTU_VERSION}

핵심 선택 이유:

  • NVIDIA CUDA 12.2.2: 최신 GPU 기능 활용
  • cuDNN 8: 딥러닝 연산 최적화
  • Ubuntu 22.04 LTS: 안정성과 장기 지원
  • 개발 이미지: 컴파일 도구 포함

2. 환경 변수 최적화

# GPU 메모리 관리 최적화
ENV PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:8,expandable_segments:True,garbage_collection_threshold:0.95
ENV CUDA_LAUNCH_BLOCKING=1
ENV PYTORCH_NO_CUDA_MEMORY_CACHING=1
ENV CUDA_MEMORY_FRACTION=0.4

# 병렬 처리 최적화
ENV OMP_NUM_THREADS=1
ENV MKL_NUM_THREADS=1

# NCCL 분산 처리 설정
ENV NCCL_DEBUG=INFO
ENV NCCL_IB_DISABLE=1
ENV NCCL_P2P_DISABLE=1
ENV NCCL_SOCKET_IFNAME=eth0
ENV NCCL_BLOCKING_WAIT=1

각 환경 변수의 역할:

GPU 메모리 관리

  • PYTORCH_CUDA_ALLOC_CONF: PyTorch CUDA 메모리 할당 전략
    • max_split_size_mb:8: 메모리 분할 크기 제한
    • expandable_segments:True: 동적 메모리 확장
    • garbage_collection_threshold:0.95: 가비지 컬렉션 임계값
  • CUDA_MEMORY_FRACTION=0.4: GPU 메모리 사용률 40%로 제한

성능 최적화

  • OMP_NUM_THREADS=1: OpenMP 스레드 수 제한 (GPU 우선)
  • MKL_NUM_THREADS=1: Intel MKL 스레드 수 제한

분산 처리 (NCCL)

  • NCCL_DEBUG=INFO: 통신 디버그 정보 출력
  • NCCL_IB_DISABLE=1: InfiniBand 비활성화
  • NCCL_P2P_DISABLE=1: P2P 통신 비활성화

3. 시스템 패키지 설치

# 한국 미러 서버 설정 (속도 최적화)
RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list && \
    sed -i 's/security.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list

# 필수 시스템 패키지 설치
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    git \
    wget \
    curl \
    python3.10 \
    python3.10-dev \
    python3.10-venv \
    python3-pip \
    build-essential \
    ninja-build \
    cmake \
    libgl1-mesa-glx \
    libglib2.0-0 \
    && rm -rf /var/lib/apt/lists/*

최적화 포인트:

  • 한국 미러 서버: 다운로드 속도 향상
  • –no-install-recommends: 최소 설치로 이미지 크기 감소
  • apt 캐시 정리: 이미지 크기 최적화

4. Python 환경 설정

# Python 심볼릭 링크 생성
RUN ln -s /usr/bin/python3.10 /usr/bin/python

# 최신 pip 설치
RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10

# 빌드 도구 설치
RUN pip install --no-cache-dir \
    packaging \
    setuptools>=64.0.0 \
    wheel \
    ninja \
    cmake \
    scikit-build \
    build

핵심 의존성 설치 전략

1. PyTorch 우선 설치

# 빌드 환경 변수 설정
ENV MAX_JOBS=1
ENV CMAKE_BUILD_PARALLEL_LEVEL=1
ENV FORCE_CUDA=1
ENV TORCH_CUDA_ARCH_LIST="8.0;8.6;9.0"

# PyTorch 먼저 설치 (의존성 충돌 방지)
RUN pip install --no-cache-dir \
    torch>=2.4.0 \
    torchvision \
    torchaudio \
    --extra-index-url https://download.pytorch.org/whl/cu121

핵심 전략:

  • PyTorch 우선: 다른 라이브러리의 기반
  • CUDA 아키텍처 지정: GPU 최적화
  • 병렬 빌드 제한: 메모리 부족 방지

2. 고성능 라이브러리 설치

# Triton 컴파일러
RUN pip install --no-cache-dir triton==3.0.0

# 메모리 최적화 어텐션
RUN pip install --no-cache-dir xformers==0.0.27.post2 --no-build-isolation

# Flash Attention 2
RUN pip install --no-cache-dir \
    flash-attn==2.2.3.post2 \
    --no-build-isolation \
    --config-settings="--global-option=build_ext" \
    --config-settings="--global-option=-j1" \
    --no-deps

설치 옵션 설명:

  • --no-build-isolation: 빌드 시간 단축
  • --no-deps: 의존성 충돌 방지
  • -j1: 단일 스레드 컴파일 (메모리 절약)

Docker Compose 구성

services:
  opensora:
    tty: true
    image: opensora:latest
    build:
      context: .
      dockerfile: Dockerfile
    container_name: opensora
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=compute,utility
    volumes:
      - ./:/workspace
      - ./ckpts:/workspace/ckpts
      - ./samples:/workspace/samples
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    command: /bin/bash

핵심 구성 요소

GPU 접근 설정

environment:
  - NVIDIA_VISIBLE_DEVICES=all
  - NVIDIA_DRIVER_CAPABILITIES=compute,utility

리소스 예약

deploy:
  resources:
    reservations:
      devices:
        - driver: nvidia
          count: all
          capabilities: [gpu]

볼륨 마운트 전략

volumes:
  - ./:/workspace           # 전체 소스 코드
  - ./ckpts:/workspace/ckpts    # 모델 체크포인트 (분리)
  - ./samples:/workspace/samples # 생성 결과물 (분리)

장점:

  • 데이터 영속성: 컨테이너 재시작해도 데이터 보존
  • 성능: 체크포인트와 결과물 분리로 I/O 최적화
  • 개발 편의성: 실시간 코드 수정 반영

빌드 및 실행 최적화

1. 다단계 빌드 최적화

# 디버그 검증 단계
RUN python --version && pip --version
RUN python -c "import torch; print('PyTorch version:', torch.__version__); print('CUDA available:', torch.cuda.is_available())"
RUN python -c "import flash_attn; print('Flash Attention version:', flash_attn.__version__)"

2. 작업 디렉토리 설정

WORKDIR /workspace

# requirements.txt 복사 및 설치
COPY requirements.txt .
RUN pip install -r requirements.txt

# 필요 디렉토리 생성
RUN mkdir -p /workspace/ckpts /workspace/samples

성능 튜닝 가이드

1. 메모리 최적화

# 메모리 사용량 모니터링
docker stats opensora

# GPU 메모리 확인
docker exec opensora nvidia-smi

2. 빌드 시간 단축

# 병렬 빌드 (메모리 충분한 경우)
export DOCKER_BUILDKIT=1
docker build --build-arg MAX_JOBS=4 .

# 캐시 활용
docker build --cache-from opensora:latest .

3. 네트워크 최적화

# 다운로드 재시도 설정
RUN echo 'Acquire::Retries "3";' > /etc/apt/apt.conf.d/80-retries && \
    echo 'Acquire::http::Timeout "120";' >> /etc/apt/apt.conf.d/80-retries

문제 해결 가이드

1. CUDA 메모리 부족

증상: CUDA out of memory 에러

해결책:

ENV PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:4,garbage_collection_threshold:0.9
ENV CUDA_MEMORY_FRACTION=0.3

2. 빌드 시간 초과

증상: Flash Attention 빌드 중 타임아웃

해결책:

ENV MAX_JOBS=1
ENV CMAKE_BUILD_PARALLEL_LEVEL=1

3. 권한 문제

증상: 파일 쓰기 권한 없음

해결책:

# docker-compose.yml
user: "${UID}:${GID}"

실제 운영 팁

1. 이미지 크기 최적화

# 멀티 스테이지 빌드
FROM nvidia/cuda:12.2.2-cudnn8-devel-ubuntu22.04 AS builder
# 빌드 단계...

FROM nvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04
# 런타임 단계...

2. 보안 강화

# 비root 사용자 생성
RUN useradd -m -s /bin/bash opensora
USER opensora

3. 모니터링 추가

# docker-compose.yml
logging:
  driver: "json-file"
  options:
    max-size: "100m"
    max-file: "3"

결론

Open-Sora의 Docker 환경 구성은 단순한 컨테이너화를 넘어서 성능 최적화운영 안정성을 고려한 설계입니다.

핵심 포인트:

  • 계층적 설치 전략: PyTorch → 최적화 라이브러리 → 애플리케이션
  • 메모리 관리: CUDA 메모리 할당과 가비지 컬렉션 최적화
  • 한국 환경 최적화: 로컬 미러 서버 활용
  • 분산 처리 준비: NCCL 설정으로 멀티 GPU 지원

이러한 설계 원칙을 이해하면 다른 AI 모델의 Docker 환경 구성에도 응용할 수 있습니다. 다음 포스트에서는 Open-Sora의 핵심 모델 아키텍처를 자세히 살펴보겠습니다.


이 글이 도움이 되셨다면 공유해주세요! 궁금한 점이 있으시면 댓글로 남겨주시기 바랍니다.