# AI 전문가 양성 과정 - GPU 지원 Docker 이미지
# NVIDIA CUDA 기반의 딥러닝 개발 환경을 제공합니다.

FROM nvidia/cuda:11.8-devel-ubuntu20.04

# 시간대 설정 (대화형 프롬프트 방지)
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul

# 작업 디렉토리 설정
WORKDIR /app

# 시스템 패키지 업데이트 및 Python 설치
RUN apt-get update && apt-get install -y \
    python3.9 \
    python3.9-dev \
    python3-pip \
    python3.9-venv \
    git \
    wget \
    curl \
    build-essential \
    pkg-config \
    libffi-dev \
    libssl-dev \
    libxml2-dev \
    libxslt1-dev \
    libjpeg-dev \
    libpng-dev \
    libfreetype6-dev \
    zlib1g-dev \
    libblas-dev \
    liblapack-dev \
    libhdf5-dev \
    libcupti-dev \
    gfortran \
    graphviz \
    htop \
    nvtop \
    && rm -rf /var/lib/apt/lists/*

# Python을 python3.9로 링크
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.9 1
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1

# pip 업그레이드
RUN python -m pip install --upgrade pip setuptools wheel

# CUDA 및 GPU 관련 환경변수 설정
ENV CUDA_HOME=/usr/local/cuda
ENV PATH=$CUDA_HOME/bin:$PATH
ENV LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
ENV NVIDIA_VISIBLE_DEVICES=all
ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility

# 기본 Python 패키지 설치 (레이어 캐싱 최적화)
COPY requirements.txt .
RUN pip install -r requirements.txt

# GPU 지원 딥러닝 프레임워크 설치
RUN pip install \
    # PyTorch GPU 버전
    torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 \
    # TensorFlow GPU 버전  
    tensorflow[and-cuda]==2.13.* \
    # JAX GPU 버전
    "jax[cuda11_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html \
    # 기타 GPU 가속 라이브러리
    cupy-cuda11x \
    rapids-singlecell \
    # GPU 모니터링
    pynvml \
    gpustat

# Jupyter 및 개발 도구 설치
RUN pip install \
    # Jupyter 관련
    jupyter \
    jupyterlab \
    ipywidgets \
    jupyter-contrib-nbextensions \
    jupyterlab-git \
    # 개발 도구
    black \
    isort \
    flake8 \
    mypy \
    pytest \
    pre-commit \
    # 시각화 라이브러리
    plotly \
    bokeh \
    dash \
    tensorboard \
    # NLP 라이브러리 (GPU 지원)
    transformers[torch] \
    datasets \
    accelerate \
    bitsandbytes \
    # MLOps 도구
    mlflow \
    wandb \
    clearml \
    # 기타 유용한 라이브러리
    python-dotenv \
    requests \
    beautifulsoup4 \
    schedule \
    tqdm

# 추가 딥러닝 라이브러리 설치
RUN pip install \
    # Computer Vision
    opencv-python \
    albumentations \
    timm \
    detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu118/torch1.13/index.html \
    # NLP 고급 라이브러리
    sentence-transformers \
    spacy \
    nltk \
    # 강화학습
    stable-baselines3 \
    gymnasium \
    # 그래프 신경망
    torch-geometric \
    dgl-cu118 \
    # 시계열 분석
    sktime \
    darts

# 프로젝트 파일 복사
COPY . .

# 스크립트 파일에 실행 권한 부여
RUN chmod +x scripts/*.sh || true

# 환경변수 설정
ENV PYTHONPATH=/app
ENV JUPYTER_ENABLE_LAB=yes
ENV JUPYTER_TOKEN=ai_course_token

# Jupyter Lab 확장 설치 및 빌드
RUN jupyter labextension install @jupyter-widgets/jupyterlab-manager --no-build && \
    jupyter lab build --minimize=False

# spaCy 모델 다운로드
RUN python -m spacy download en_core_web_sm

# NLTK 데이터 다운로드
RUN python -c "import nltk; nltk.download('punkt'); nltk.download('stopwords')"

# GPU 메모리 사용 최적화를 위한 설정
ENV TF_FORCE_GPU_ALLOW_GROWTH=true
ENV TF_GPU_MEMORY_GROWTH=true

# 포트 노출
EXPOSE 8888 8000 5000 6006

# GPU 상태 확인을 위한 헬스체크 스크립트 생성
RUN echo '#!/bin/bash\n\
nvidia-smi\n\
python -c "import torch; print(f\"PyTorch CUDA available: {torch.cuda.is_available()}\"); print(f\"CUDA devices: {torch.cuda.device_count()}\")" \n\
python -c "import tensorflow as tf; print(f\"TensorFlow GPU devices: {len(tf.config.list_physical_devices(\"GPU\"))}\")"\n\
curl -f http://localhost:8888/lab || exit 1' > /gpu_health_check.sh && \
chmod +x /gpu_health_check.sh

# GPU 시작 스크립트 생성
RUN echo '#!/bin/bash\n\
echo "🚀 Starting AI Course GPU Environment..."\n\
echo "========================================"\n\
echo "GPU Information:"\n\
nvidia-smi\n\
echo "========================================"\n\
echo "PyTorch CUDA Status:"\n\
python -c "import torch; print(f\"CUDA Available: {torch.cuda.is_available()}\"); print(f\"CUDA Version: {torch.version.cuda}\"); print(f\"GPU Count: {torch.cuda.device_count()}\")"\n\
echo "========================================"\n\
echo "TensorFlow GPU Status:"\n\
python -c "import tensorflow as tf; print(f\"GPU Available: {len(tf.config.list_physical_devices(\"GPU\")) > 0}\"); print(f\"GPU Devices: {tf.config.list_physical_devices(\"GPU\")}\")" \n\
echo "========================================"\n\
echo "Starting Jupyter Lab on http://localhost:8888"\n\
echo "Token: ai_course_token"\n\
exec jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --token=ai_course_token' > /start_gpu.sh && \
chmod +x /start_gpu.sh

# 개발용 시작 명령어 (GPU 확인 후 Jupyter Lab 실행)
CMD ["/start_gpu.sh"]

# 헬스체크 추가
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
    CMD /gpu_health_check.sh 