matalee/hpce-dev
0
1from __future__ import annotations2"""3모델 워밍업 — 기동 시 전 시나리오의 Model intent를 학습·MLflow 등록(없으면).4 5배포 후 시나리오별 첫 설문 제출 없이도 모델이 준비되도록 한다.6멱등적: 레지스트리에 이미 있으면 load만(재학습 X) → 재시작 시 비용 거의 없음.7"""8import logging9import time10 11from core.engines import available_scenarios, config, get_engine12 13logger = logging.getLogger(__name__)14 15 16def warmup_models() -> dict[str, int]:17 """전 시나리오의 Model intent를 load-or-train으로 준비한다.18 19 레지스트리에 이미 있으면 load만 하므로 멱등적이며, best-effort로 동작해20 개별 intent 준비 실패는 경고 로그만 남기고 건너뛴다.21 22 Returns:23 scenario_id → 준비된 모델 수 매핑.24 """25 t0 = time.time()26 result: dict[str, int] = {}27 for sid in available_scenarios():28 try:29 m = config.get_model_spec(sid)30 except (KeyError, FileNotFoundError):31 continue32 td = m.get("training_data", {})33 if not td:34 continue35 eng = get_engine(sid)36 ok = 037 for iid in td:38 try:39 eng.model_predict(iid, {}) # _load_or_train 트리거 (없으면 학습·등록)40 ok += 141 except Exception as e: # noqa: BLE001 — 워밍업은 best-effort42 logger.warning("warmup %s/%s 실패: %s", sid, iid, e)43 result[sid] = ok44 logger.info("warmup %s: model intents %d개 준비", sid, ok)45 logger.info("warmup 완료 (%.1fs): %s", time.time() - t0, result)46 return result47 