sachin sharma
commited on
Commit
·
8cbad39
1
Parent(s):
da2b98d
fix circular deps issue
Browse files- app/api/routes/prediction.py +1 -1
- app/core/app.py +2 -15
- app/core/logging.py +16 -39
app/api/routes/prediction.py
CHANGED
|
@@ -4,7 +4,7 @@ from fastapi import APIRouter, Depends
|
|
| 4 |
|
| 5 |
from app.api.controllers import PredictionController
|
| 6 |
from app.api.models import ImageRequest, PredictionResponse
|
| 7 |
-
from app.core.
|
| 8 |
from app.services.base import InferenceService
|
| 9 |
|
| 10 |
router = APIRouter()
|
|
|
|
| 4 |
|
| 5 |
from app.api.controllers import PredictionController
|
| 6 |
from app.api.models import ImageRequest, PredictionResponse
|
| 7 |
+
from app.core.dependencies import get_inference_service
|
| 8 |
from app.services.base import InferenceService
|
| 9 |
|
| 10 |
router = APIRouter()
|
app/core/app.py
CHANGED
|
@@ -9,7 +9,7 @@ from pydantic import Field
|
|
| 9 |
from pydantic_settings import BaseSettings
|
| 10 |
|
| 11 |
from app.core.logging import logger
|
| 12 |
-
from app.
|
| 13 |
from app.services.inference import ResNetInferenceService
|
| 14 |
from app.api.routes import prediction
|
| 15 |
|
|
@@ -29,19 +29,6 @@ class Settings(BaseSettings):
|
|
| 29 |
|
| 30 |
settings = Settings()
|
| 31 |
|
| 32 |
-
_inference_service: Optional[InferenceService] = None
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
def get_inference_service() -> Optional[InferenceService]:
|
| 36 |
-
"""Get inference service for dependency injection."""
|
| 37 |
-
return _inference_service
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
def _set_inference_service(service: InferenceService) -> None:
|
| 41 |
-
"""Set inference service. Called internally during startup."""
|
| 42 |
-
global _inference_service
|
| 43 |
-
_inference_service = service
|
| 44 |
-
|
| 45 |
|
| 46 |
@asynccontextmanager
|
| 47 |
async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
|
|
@@ -55,7 +42,7 @@ async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
|
|
| 55 |
# Replace ResNetInferenceService with your own implementation
|
| 56 |
service = ResNetInferenceService(model_name="microsoft/resnet-18")
|
| 57 |
await service.load_model()
|
| 58 |
-
|
| 59 |
|
| 60 |
logger.info("Startup completed successfully")
|
| 61 |
|
|
|
|
| 9 |
from pydantic_settings import BaseSettings
|
| 10 |
|
| 11 |
from app.core.logging import logger
|
| 12 |
+
from app.core.dependencies import set_inference_service
|
| 13 |
from app.services.inference import ResNetInferenceService
|
| 14 |
from app.api.routes import prediction
|
| 15 |
|
|
|
|
| 29 |
|
| 30 |
settings = Settings()
|
| 31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
|
| 33 |
@asynccontextmanager
|
| 34 |
async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
|
|
|
|
| 42 |
# Replace ResNetInferenceService with your own implementation
|
| 43 |
service = ResNetInferenceService(model_name="microsoft/resnet-18")
|
| 44 |
await service.load_model()
|
| 45 |
+
set_inference_service(service)
|
| 46 |
|
| 47 |
logger.info("Startup completed successfully")
|
| 48 |
|
app/core/logging.py
CHANGED
|
@@ -1,49 +1,26 @@
|
|
| 1 |
-
"""
|
| 2 |
-
Logging configuration for the application.
|
| 3 |
-
"""
|
| 4 |
|
| 5 |
import logging
|
| 6 |
import sys
|
| 7 |
-
from typing import Optional
|
| 8 |
|
| 9 |
-
from app.core.config import settings
|
| 10 |
|
|
|
|
|
|
|
|
|
|
| 11 |
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
@staticmethod
|
| 16 |
-
def setup_logging(
|
| 17 |
-
logger_name: Optional[str] = None,
|
| 18 |
-
level: Optional[str] = None,
|
| 19 |
-
format_string: Optional[str] = None
|
| 20 |
-
) -> logging.Logger:
|
| 21 |
-
"""Set up and configure a logger."""
|
| 22 |
-
logger = logging.getLogger(logger_name or settings.app_name)
|
| 23 |
-
|
| 24 |
-
# Avoid duplicate handlers
|
| 25 |
-
if logger.handlers:
|
| 26 |
-
return logger
|
| 27 |
-
|
| 28 |
-
# Set level
|
| 29 |
-
log_level = getattr(logging, (level or "INFO").upper())
|
| 30 |
-
logger.setLevel(log_level)
|
| 31 |
-
|
| 32 |
-
# Create console handler
|
| 33 |
-
handler = logging.StreamHandler(sys.stdout)
|
| 34 |
-
handler.setLevel(log_level)
|
| 35 |
-
|
| 36 |
-
# Create formatter
|
| 37 |
-
formatter = logging.Formatter(
|
| 38 |
-
format_string or "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
| 39 |
-
)
|
| 40 |
-
handler.setFormatter(formatter)
|
| 41 |
|
| 42 |
-
|
| 43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
|
| 45 |
-
|
| 46 |
|
| 47 |
|
| 48 |
-
|
| 49 |
-
logger = LoggerSetup.setup_logging()
|
|
|
|
| 1 |
+
"""Logging configuration."""
|
|
|
|
|
|
|
| 2 |
|
| 3 |
import logging
|
| 4 |
import sys
|
|
|
|
| 5 |
|
|
|
|
| 6 |
|
| 7 |
+
def setup_logging(logger_name: str = "ML Inference Service") -> logging.Logger:
|
| 8 |
+
"""Setup and configure logger."""
|
| 9 |
+
logger = logging.getLogger(logger_name)
|
| 10 |
|
| 11 |
+
if logger.handlers:
|
| 12 |
+
return logger
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
|
| 14 |
+
logger.setLevel(logging.INFO)
|
| 15 |
+
handler = logging.StreamHandler(sys.stdout)
|
| 16 |
+
handler.setLevel(logging.INFO)
|
| 17 |
+
formatter = logging.Formatter(
|
| 18 |
+
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
| 19 |
+
)
|
| 20 |
+
handler.setFormatter(formatter)
|
| 21 |
+
logger.addHandler(handler)
|
| 22 |
|
| 23 |
+
return logger
|
| 24 |
|
| 25 |
|
| 26 |
+
logger = setup_logging()
|
|
|