From 90f168f63d8da131fc564ab9166bb370b57f868b Mon Sep 17 00:00:00 2001 From: Fireblade2534 Date: Fri, 7 Feb 2025 18:30:59 +0000 Subject: [PATCH] fixed some problems in the build system and model download system --- api/src/core/paths.py | 2 +- api/src/inference/kokoro_v1.py | 3 ++- api/src/inference/model_manager.py | 14 +++++++++++++- api/src/main.py | 11 ----------- docker/cpu/Dockerfile | 8 +++++--- docker/gpu/Dockerfile | 8 +++++--- docker/scripts/download_model.py | 1 - docker/scripts/entrypoint.sh | 4 ++-- 8 files changed, 28 insertions(+), 23 deletions(-) diff --git a/api/src/core/paths.py b/api/src/core/paths.py index a534764..1891851 100644 --- a/api/src/core/paths.py +++ b/api/src/core/paths.py @@ -41,7 +41,7 @@ async def _find_file( if filter_fn is None or filter_fn(full_path): return full_path - raise RuntimeError(f"File not found: {filename} in paths: {search_paths}") + raise FileNotFoundError(f"File not found: {filename} in paths: {search_paths}") async def _scan_directories( diff --git a/api/src/inference/kokoro_v1.py b/api/src/inference/kokoro_v1.py index b36978e..b3525a6 100644 --- a/api/src/inference/kokoro_v1.py +++ b/api/src/inference/kokoro_v1.py @@ -60,7 +60,8 @@ class KokoroV1(BaseModelBackend): model=self._model, # Pass our model directly device=self._device # Match our device setting ) - + except FileNotFoundError as e: + raise e except Exception as e: raise RuntimeError(f"Failed to load Kokoro model: {e}") diff --git a/api/src/inference/model_manager.py b/api/src/inference/model_manager.py index 80c03f8..bb55c55 100644 --- a/api/src/inference/model_manager.py +++ b/api/src/inference/model_manager.py @@ -81,7 +81,17 @@ class ModelManager: logger.info(f"Warmup completed in {ms}ms") return self._device, "kokoro_v1", len(voices) - + except FileNotFoundError as e: + logger.error(""" +Model files not found! You need to download the Kokoro V1 model: + +1. Download model using the script: + python docker/scripts/download_model.py --output api/src/models/v1_0 + +2. Or set environment variable in docker-compose: + DOWNLOAD_MODEL=true +""") + exit(0) except Exception as e: raise RuntimeError(f"Warmup failed: {e}") @@ -112,6 +122,8 @@ class ModelManager: try: await self._backend.load_model(path) + except FileNotFoundError as e: + raise e except Exception as e: raise RuntimeError(f"Failed to load model: {e}") diff --git a/api/src/main.py b/api/src/main.py index 5e6a32c..41b2f84 100644 --- a/api/src/main.py +++ b/api/src/main.py @@ -62,18 +62,7 @@ async def lifespan(app: FastAPI): # Initialize model with warmup and get status device, model, voicepack_count = await model_manager\ .initialize_with_warmup(voice_manager) - - except FileNotFoundError: - logger.error(""" -Model files not found! You need to download the Kokoro V1 model: -1. Download model using the script: - python docker/scripts/download_model.py --version v1_0 --output api/src/models/v1_0 - -2. Or set environment variable in docker-compose: - DOWNLOAD_MODEL=true -""") - raise except Exception as e: logger.error(f"Failed to initialize model: {e}") raise diff --git a/docker/cpu/Dockerfile b/docker/cpu/Dockerfile index 781b251..9788cf8 100644 --- a/docker/cpu/Dockerfile +++ b/docker/cpu/Dockerfile @@ -37,7 +37,8 @@ RUN --mount=type=cache,target=/root/.cache/uv \ # Copy project files including models COPY --chown=appuser:appuser api ./api COPY --chown=appuser:appuser web ./web -COPY --chown=appuser:appuser docker/scripts/download_model.* ./ +COPY --chown=appuser:appuser docker/scripts/ ./ +RUN chmod +x ./entrypoint.sh # Set environment variables ENV PYTHONUNBUFFERED=1 \ @@ -54,5 +55,6 @@ RUN if [ "$DOWNLOAD_MODEL" = "true" ]; then \ python download_model.py --output api/src/models/v1_0; \ fi -# Run FastAPI server -CMD ["uv", "run", "python", "-m", "uvicorn", "api.src.main:app", "--host", "0.0.0.0", "--port", "8880", "--log-level", "debug"] \ No newline at end of file +ENV DEVICE="cpu" +# Run FastAPI server through entrypoint.sh +CMD ["./entrypoint.sh"] \ No newline at end of file diff --git a/docker/gpu/Dockerfile b/docker/gpu/Dockerfile index 10bb4b8..2360b82 100644 --- a/docker/gpu/Dockerfile +++ b/docker/gpu/Dockerfile @@ -38,7 +38,8 @@ RUN --mount=type=cache,target=/root/.cache/uv \ # Copy project files including models and sync again COPY --chown=appuser:appuser api ./api COPY --chown=appuser:appuser web ./web -COPY --chown=appuser:appuser docker/scripts/download_model.* ./ +COPY --chown=appuser:appuser docker/scripts/ ./ +RUN chmod +x ./entrypoint.sh RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --extra gpu @@ -57,5 +58,6 @@ RUN if [ "$DOWNLOAD_MODEL" = "true" ]; then \ python download_model.py --output api/src/models/v1_0; \ fi -# Run FastAPI server -CMD ["uv", "run", "python", "-m", "uvicorn", "api.src.main:app", "--host", "0.0.0.0", "--port", "8880", "--log-level", "debug"] +ENV DEVICE="gpu" +# Run FastAPI server through entrypoint.sh +CMD ["./entrypoint.sh"] diff --git a/docker/scripts/download_model.py b/docker/scripts/download_model.py index af10058..c406a17 100644 --- a/docker/scripts/download_model.py +++ b/docker/scripts/download_model.py @@ -3,7 +3,6 @@ import json import os -import shutil from pathlib import Path from urllib.request import urlretrieve diff --git a/docker/scripts/entrypoint.sh b/docker/scripts/entrypoint.sh index 446ddff..ca72910 100644 --- a/docker/scripts/entrypoint.sh +++ b/docker/scripts/entrypoint.sh @@ -2,7 +2,7 @@ set -e if [ "$DOWNLOAD_MODEL" = "true" ]; then - python docker/scripts/download_model.py --output api/src/models/v1_0 + python download_model.py --output api/src/models/v1_0 fi -exec uv run python -m uvicorn api.src.main:app --host 0.0.0.0 --port 8880 --log-level debug \ No newline at end of file +exec uv run --extra $DEVICE python -m uvicorn api.src.main:app --host 0.0.0.0 --port 8880 --log-level debug \ No newline at end of file