diff --git a/docker/gpu-rocm/.dockerignore b/docker/gpu-rocm/.dockerignore new file mode 100644 index 00000000..8592ec75 --- /dev/null +++ b/docker/gpu-rocm/.dockerignore @@ -0,0 +1,40 @@ +# Version control +.git + +# Python +__pycache__ +*.pyc +*.pyo +*.pyd +.Python +*.py[cod] +*$py.class +.pytest_cache +.coverage +.coveragerc + +# Environment +# .env +.venv* +env/ +venv/ +ENV/ + +# IDE +.idea +.vscode +*.swp +*.swo + +# Project specific +examples/ +Kokoro-82M/ +ui/ +tests/ +*.md +*.txt +!requirements.txt + +# Docker +Dockerfile* +docker-compose* diff --git a/docker/gpu-rocm/Dockerfile b/docker/gpu-rocm/Dockerfile new file mode 100644 index 00000000..1c45c113 --- /dev/null +++ b/docker/gpu-rocm/Dockerfile @@ -0,0 +1,68 @@ +FROM --platform=$BUILDPLATFORM rocm/pytorch:latest + +# Set non-interactive frontend +ENV DEBIAN_FRONTEND=noninteractive + +# Install Python and other dependencies +RUN apt-get update && apt-get install -y \ + python3.10 \ + python3-venv \ + espeak-ng \ + espeak-ng-data \ + git \ + libsndfile1 \ + curl \ + ffmpeg \ + g++ \ + && apt-get clean && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /usr/share/espeak-ng-data \ + && ln -s /usr/lib/*/espeak-ng-data/* /usr/share/espeak-ng-data/ + +# Install UV using the installer script +RUN curl -LsSf https://astral.sh/uv/install.sh | sh && \ + mv /root/.local/bin/uv /usr/local/bin/ && \ + mv /root/.local/bin/uvx /usr/local/bin/ + +# Create non-root user and set up directories and permissions +RUN useradd -m -u 1001 appuser && \ + mkdir -p /app/api/src/models/v1_0 && \ + chown -R appuser:appuser /app + +USER appuser +WORKDIR /app + +# Copy dependency files +COPY --chown=appuser:appuser pyproject.toml ./pyproject.toml + +ENV PHONEMIZER_ESPEAK_PATH=/usr/bin \ + PHONEMIZER_ESPEAK_DATA=/usr/share/espeak-ng-data \ + ESPEAK_DATA_PATH=/usr/share/espeak-ng-data + +# Install dependencies with GPU extras (using cache mounts) +RUN --mount=type=cache,target=/root/.cache/uv \ + uv venv --python 3.10 && \ + uv sync --extra gpu + +# Copy project files including models +COPY --chown=appuser:appuser api ./api +COPY --chown=appuser:appuser web ./web +COPY --chown=appuser:appuser docker/scripts/ ./ +RUN chmod +x ./entrypoint.sh + + +# Set all environment variables in one go +ENV PYTHONUNBUFFERED=1 \ + PYTHONPATH=/app:/app/api \ + PATH="/app/.venv/bin:$PATH" \ + UV_LINK_MODE=copy \ + USE_GPU=true + +ENV DOWNLOAD_MODEL=true +# Download model if enabled +RUN if [ "$DOWNLOAD_MODEL" = "true" ]; then \ + python download_model.py --output api/src/models/v1_0; \ + fi + +ENV DEVICE="gpu" +# Run FastAPI server through entrypoint.sh +CMD ["./entrypoint.sh"] diff --git a/docker/gpu-rocm/docker-compose.yml b/docker/gpu-rocm/docker-compose.yml new file mode 100644 index 00000000..07edd92c --- /dev/null +++ b/docker/gpu-rocm/docker-compose.yml @@ -0,0 +1,45 @@ +name: kokoro-tts-gpu-rocm +services: + kokoro-tts: + # image: ghcr.io/remsky/kokoro-fastapi-gpu:v${VERSION} + build: + context: ../.. + dockerfile: docker/gpu-rocm/Dockerfile + volumes: + - ../../api:/app/api + user: "1001:1001" # Ensure container runs as UID 1001 (appuser) + ports: + - "8880:8880" + environment: + - PYTHONPATH=/app:/app/api + - USE_GPU=true + - PYTHONUNBUFFERED=1 + cap_add: + - SYS_PTRACE + security_opt: + - seccomp=unconfined + devices: + - /dev/kfd + - /dev/dri + group_add: + - video + # ipc: host + shm_size: 8g + + # # Gradio UI service + # gradio-ui: + # image: ghcr.io/remsky/kokoro-fastapi-ui:v${VERSION} + # # Uncomment below to build from source instead of using the released image + # # build: + # # context: ../../ui + # ports: + # - "7860:7860" + # volumes: + # - ../../ui/data:/app/ui/data + # - ../../ui/app.py:/app/app.py # Mount app.py for hot reload + # environment: + # - GRADIO_WATCH=1 # Enable hot reloading + # - PYTHONUNBUFFERED=1 # Ensure Python output is not buffered + # - DISABLE_LOCAL_SAVING=false # Set to 'true' to disable local saving and hide file view + # - API_HOST=kokoro-tts # Set TTS service URL + # - API_PORT=8880 # Set TTS service PORT