개요
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의 핵심 모델 아키텍처를 자세히 살펴보겠습니다.
이 글이 도움이 되셨다면 공유해주세요! 궁금한 점이 있으시면 댓글로 남겨주시기 바랍니다.