perf: 멀티스테이지 빌드로 이미지 슬림화
- 런타임 이미지에서 컴파일러 툴체인(build-essential/git) 제외 - triton 제거(추론엔 불필요, torch.compile 전용) - 미사용 gruut 언어팩(es/de/fr) 제거 - 슬림화 후 한/영 모델 로드 검증 단계 추가
This commit is contained in:
47
Dockerfile
47
Dockerfile
@@ -1,4 +1,5 @@
|
|||||||
FROM python:3.11-slim
|
# ---------- 빌더 단계 ----------
|
||||||
|
FROM python:3.11-slim AS builder
|
||||||
|
|
||||||
ENV PYTHONUNBUFFERED=1 \
|
ENV PYTHONUNBUFFERED=1 \
|
||||||
PIP_NO_CACHE_DIR=1 \
|
PIP_NO_CACHE_DIR=1 \
|
||||||
@@ -13,25 +14,53 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
RUN mkdir -p /models/nltk_data
|
RUN mkdir -p /models/nltk_data
|
||||||
|
|
||||||
# Blackwell(sm_120, RTX 5050/5070Ti) 지원 torch cu128 휠
|
# Blackwell(sm_120) 지원 torch cu128 휠
|
||||||
# (파일 의존성이 없어 constraints/requirements 수정 시에도 캐시 유지)
|
|
||||||
RUN pip install torch==2.11.0 torchaudio==2.11.0 \
|
RUN pip install torch==2.11.0 torchaudio==2.11.0 \
|
||||||
--index-url https://download.pytorch.org/whl/cu128
|
--index-url https://download.pytorch.org/whl/cu128
|
||||||
|
|
||||||
COPY constraints.txt requirements.txt ./
|
COPY constraints.txt requirements.txt ./
|
||||||
|
|
||||||
# 나머지 의존성 (정확한 버전 고정)
|
|
||||||
RUN pip install -c constraints.txt -r requirements.txt
|
RUN pip install -c constraints.txt -r requirements.txt
|
||||||
|
|
||||||
# MeloTTS(순수 파이썬) 벤더링: 검증된 호스트 사본을 그대로 설치
|
# MeloTTS(순수 파이썬) 벤더링
|
||||||
# (PyPI 미배포 0.1.2 + gradio/tensorboard 등 불필요 의존성 회피)
|
|
||||||
COPY vendor/melo /usr/local/lib/python3.11/site-packages/melo
|
COPY vendor/melo /usr/local/lib/python3.11/site-packages/melo
|
||||||
|
|
||||||
# 한국어/영어 모델 및 부가 데이터 사전 다운로드 (첫 요청 지연 제거)
|
# 한국어/영어 모델 사전 다운로드
|
||||||
# (app/frontend COPY 보다 앞: 앱 코드만 바뀌어도 재-워밍업하지 않도록)
|
|
||||||
COPY warmup.py ./
|
COPY warmup.py ./
|
||||||
RUN python warmup.py
|
RUN python warmup.py
|
||||||
|
|
||||||
|
# 슬림화: 추론에 불필요한 패키지 제거
|
||||||
|
# - triton: torch.compile 전용(우리는 eager 추론이라 불필요)
|
||||||
|
# - gruut 미사용 언어(es/de/fr): 영어만 사용
|
||||||
|
RUN pip uninstall -y triton 2>/dev/null || true \
|
||||||
|
&& rm -rf /usr/local/lib/python3.11/site-packages/gruut_lang_es \
|
||||||
|
/usr/local/lib/python3.11/site-packages/gruut_lang_de \
|
||||||
|
/usr/local/lib/python3.11/site-packages/gruut_lang_fr \
|
||||||
|
/usr/local/lib/python3.11/site-packages/gruut_lang_es-*.dist-info \
|
||||||
|
/usr/local/lib/python3.11/site-packages/gruut_lang_de-*.dist-info \
|
||||||
|
/usr/local/lib/python3.11/site-packages/gruut_lang_fr-*.dist-info \
|
||||||
|
&& find /usr/local/lib/python3.11/site-packages -name "__pycache__" -type d -prune -exec rm -rf {} + 2>/dev/null || true
|
||||||
|
|
||||||
|
# 슬림화 후에도 한/영 모델이 정상 로드되는지 검증
|
||||||
|
RUN python -c "from melo.api import TTS; TTS('KR', device='cpu'); TTS('EN', device='cpu'); print('slim import ok')"
|
||||||
|
|
||||||
|
# ---------- 런타임 단계 ----------
|
||||||
|
FROM python:3.11-slim AS runtime
|
||||||
|
|
||||||
|
ENV PYTHONUNBUFFERED=1 \
|
||||||
|
HF_HOME=/models \
|
||||||
|
NLTK_DATA=/models/nltk_data \
|
||||||
|
HF_HUB_DISABLE_TELEMETRY=1
|
||||||
|
|
||||||
|
# 런타임 필수 라이브러리만 (컴파일러 툴체인 제외)
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
ffmpeg libsndfile1 libgomp1 ca-certificates \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
|
||||||
|
COPY --from=builder /usr/local/bin /usr/local/bin
|
||||||
|
COPY --from=builder /models /models
|
||||||
|
|
||||||
COPY app ./app
|
COPY app ./app
|
||||||
COPY frontend ./frontend
|
COPY frontend ./frontend
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user