retinopath-api / startup.py
narasimha01tm's picture
Upload folder using huggingface_hub
4b79c44 verified
#!/usr/bin/env python3
"""
startup.py β€” Downloads model weights from HuggingFace then starts FastAPI.
Models are hosted at: https://huggingface.co/narasimha01tm/retinopath
Override URLs via environment variables if needed:
MODEL_IMAGE_URL β€” URL for dr_model_best.keras
MODEL_CLINICAL_URL β€” URL for dr_clinical_model.joblib
MODEL_SCALER_URL β€” URL for dr_scaler.joblib
"""
import os
import sys
from pathlib import Path
MODELS_DIR = Path(__file__).parent / "models"
MODELS_DIR.mkdir(exist_ok=True)
HF_BASE = "https://huggingface.co/narasimha01tm/retinopath/resolve/main"
DOWNLOADS = [
("MODEL_IMAGE_URL", "dr_model_best.keras", f"{HF_BASE}/dr_model_best.keras"),
("MODEL_CLINICAL_URL", "dr_clinical_model.joblib", f"{HF_BASE}/dr_clinical_model.joblib"),
("MODEL_SCALER_URL", "dr_scaler.joblib", f"{HF_BASE}/dr_scaler.joblib"),
]
def download(url: str, dest: Path):
import urllib.request, shutil
print(f"⬇️ Downloading {dest.name} ...", flush=True)
with urllib.request.urlopen(url, timeout=300) as response, open(dest, "wb") as f:
shutil.copyfileobj(response, f)
print(f"βœ… Saved {dest.name} ({dest.stat().st_size / 1e6:.1f} MB)", flush=True)
if __name__ == "__main__":
for env_var, filename, default_url in DOWNLOADS:
url = os.environ.get(env_var, default_url)
dest = MODELS_DIR / filename
if dest.exists():
print(f"βœ”οΈ {filename} already present ({dest.stat().st_size / 1e6:.1f} MB)")
else:
try:
download(url, dest)
except Exception as e:
print(f"⚠️ Could not download {filename}: {e}")
# Hand off to uvicorn
port = os.environ.get("PORT", "7860")
print(f"\nπŸš€ Starting FastAPI on port {port}...", flush=True)
os.execvp("uvicorn", ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", port])