| """ |
| scripts/download_models.py |
| Fix #7 — Pre-bakes all model weights into the local HuggingFace cache. |
| Run once before first launch (or bake into Dockerfile RUN step): |
| python scripts/download_models.py |
| """ |
|
|
| import logging |
| logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") |
| logger = logging.getLogger("model_downloader") |
|
|
|
|
| MODELS = [ |
| |
| ("question-answering", "deepset/bert-base-cased-squad2", "English BERT QA"), |
| ("question-answering", "deepset/xlm-roberta-base-squad2", "Multilingual XLM-RoBERTa QA"), |
| ("text-classification", "nlptown/bert-base-multilingual-uncased-sentiment", "5-class sentiment"), |
| ("zero-shot-classification", "cross-encoder/nli-deberta-v3-small", "Intent router NLI"), |
| ("text2text-generation", "google/flan-t5-base", "Generative fallback (Flan-T5)"), |
| ] |
|
|
| SENTENCE_TRANSFORMERS = [ |
| "sentence-transformers/all-MiniLM-L6-v2", |
| ] |
|
|
|
|
| def download_hf_pipelines(): |
| from transformers import pipeline |
| for task, model_id, desc in MODELS: |
| logger.info("Downloading %-50s [%s]", model_id, desc) |
| try: |
| _ = pipeline(task, model=model_id, tokenizer=model_id) |
| logger.info(" ✓ %s cached", model_id) |
| except Exception as e: |
| logger.error(" ✗ Failed to download %s: %s", model_id, e) |
|
|
|
|
| def download_sentence_transformers(): |
| try: |
| from sentence_transformers import SentenceTransformer |
| except ImportError: |
| logger.warning("sentence-transformers not installed — skipping embedder download") |
| return |
| for model_id in SENTENCE_TRANSFORMERS: |
| logger.info("Downloading %-50s [RAG embedder]", model_id) |
| try: |
| _ = SentenceTransformer(model_id) |
| logger.info(" ✓ %s cached", model_id) |
| except Exception as e: |
| logger.error(" ✗ Failed to download %s: %s", model_id, e) |
|
|
|
|
| def install_playwright_browser(): |
| import subprocess, sys |
| logger.info("Installing Playwright Chromium browser…") |
| try: |
| subprocess.run( |
| [sys.executable, "-m", "playwright", "install", "chromium", "--with-deps"], |
| check=True |
| ) |
| logger.info(" ✓ Chromium installed") |
| except Exception as e: |
| logger.warning(" Playwright browser install failed (optional): %s", e) |
|
|
|
|
| if __name__ == "__main__": |
| import argparse |
| parser = argparse.ArgumentParser(description="Pre-download all model weights") |
| parser.add_argument("--skip-playwright", action="store_true") |
| args = parser.parse_args() |
|
|
| logger.info("=" * 60) |
| logger.info(" ecom-qa-bert Model Pre-download") |
| logger.info("=" * 60) |
|
|
| download_hf_pipelines() |
| download_sentence_transformers() |
|
|
| if not args.skip_playwright: |
| install_playwright_browser() |
|
|
| logger.info("=" * 60) |
| logger.info(" All models downloaded. Cold-start overhead eliminated.") |
| logger.info("=" * 60) |
|
|