feat: make model age admission-only
This commit is contained in:
@@ -74,7 +74,7 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
parser.add_argument(
|
||||
"--recent-model-reserve-slots",
|
||||
type=int,
|
||||
default=int(os.getenv("MODELHUB_RECENT_MODEL_RESERVE_SLOTS", "10")),
|
||||
default=int(os.getenv("MODELHUB_RECENT_MODEL_RESERVE_SLOTS", "5")),
|
||||
help=argparse.SUPPRESS,
|
||||
)
|
||||
parser.add_argument(
|
||||
@@ -83,12 +83,6 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
default=int(os.getenv("MODELHUB_RECENT_MODEL_DAYS", "7")),
|
||||
help=argparse.SUPPRESS,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--dynamic-old-model-cleanup-reserve-slots",
|
||||
type=int,
|
||||
default=int(os.getenv("MODELHUB_DYNAMIC_OLD_MODEL_CLEANUP_RESERVE_SLOTS", "5")),
|
||||
help=argparse.SUPPRESS,
|
||||
)
|
||||
parser.add_argument("--disable-candidate-preflight", action="store_true", help=argparse.SUPPRESS)
|
||||
parser.add_argument("--llm-classifier-endpoint", default=os.getenv("MODELHUB_LLM_CLASSIFIER_ENDPOINT"), help=argparse.SUPPRESS)
|
||||
parser.add_argument("--llm-classifier-model", default=os.getenv("MODELHUB_LLM_CLASSIFIER_MODEL"), help=argparse.SUPPRESS)
|
||||
@@ -245,33 +239,11 @@ def _build_modelhub_client(base_args: argparse.Namespace) -> ModelHubClientPool:
|
||||
clients,
|
||||
capacity_probe_interval_cycles=max(0, int(getattr(base_args, "capacity_probe_interval_cycles", 3) or 0)),
|
||||
capacity_state_path=Path(getattr(base_args, "capacity_state_path", DEFAULT_CAPACITY_STATE_PATH)),
|
||||
recent_model_reserve_slots=max(0, int(getattr(base_args, "recent_model_reserve_slots", 10) or 0)),
|
||||
recent_model_reserve_slots=max(0, int(getattr(base_args, "recent_model_reserve_slots", 5) or 0)),
|
||||
recent_model_days=max(1, int(getattr(base_args, "recent_model_days", 7) or 7)),
|
||||
)
|
||||
|
||||
|
||||
def resolve_age_cleanup_policy(
|
||||
base_args: argparse.Namespace,
|
||||
*,
|
||||
initial_cleanup_pending: bool,
|
||||
) -> tuple[str, int]:
|
||||
"""Reserve ten slots initially, then use a five-slot cleanup hysteresis."""
|
||||
initial_reserve_slots = max(
|
||||
0,
|
||||
int(getattr(base_args, "recent_model_reserve_slots", 10) or 0),
|
||||
)
|
||||
dynamic_reserve_slots = min(
|
||||
initial_reserve_slots,
|
||||
max(
|
||||
0,
|
||||
int(getattr(base_args, "dynamic_old_model_cleanup_reserve_slots", 5) or 0),
|
||||
),
|
||||
)
|
||||
if initial_cleanup_pending:
|
||||
return "initial", initial_reserve_slots
|
||||
return "dynamic", dynamic_reserve_slots
|
||||
|
||||
|
||||
def _persist_architecture_blacklist(
|
||||
report: dict[str, Any],
|
||||
*,
|
||||
@@ -554,7 +526,6 @@ def run_poll_loop(
|
||||
submitted_total = 0
|
||||
cycles = 0
|
||||
stopped_reason = "max_cycles_reached"
|
||||
initial_age_cleanup_pending = True
|
||||
pending_architecture_cleanup = False
|
||||
last_cleaned_architecture_blocks: set[str] = set()
|
||||
|
||||
@@ -645,14 +616,9 @@ def run_poll_loop(
|
||||
)
|
||||
if active_architecture_block_keys - last_cleaned_architecture_blocks:
|
||||
pending_architecture_cleanup = True
|
||||
age_cleanup_mode, age_cleanup_reserve_slots = resolve_age_cleanup_policy(
|
||||
base_args,
|
||||
initial_cleanup_pending=initial_age_cleanup_pending,
|
||||
)
|
||||
log(
|
||||
f"[queue-cleanup] mode={'architecture_dynamic' if architecture_only_cleanup else age_cleanup_mode} "
|
||||
f"reserve_recent_slots={age_cleanup_reserve_slots} "
|
||||
f"recent_days={max(1, int(getattr(base_args, 'recent_model_days', 7) or 7))}"
|
||||
"[queue-cleanup] age_cleanup=disabled_admission_only "
|
||||
f"deterministic_cleanup={'architecture_only' if architecture_only_cleanup else 'full'}"
|
||||
)
|
||||
cleanup_summary = cleanup_certain_oom_tasks(
|
||||
modelhub_client,
|
||||
@@ -672,7 +638,6 @@ def run_poll_loop(
|
||||
)
|
||||
),
|
||||
architecture_only=architecture_only_cleanup,
|
||||
age_reserved_slots=age_cleanup_reserve_slots,
|
||||
log=log,
|
||||
)
|
||||
policy_cancelled_recorded = outcome_tracker.mark_policy_cancellations(
|
||||
@@ -697,9 +662,13 @@ def run_poll_loop(
|
||||
"mode": (
|
||||
"architecture_dynamic"
|
||||
if architecture_only_cleanup
|
||||
else age_cleanup_mode
|
||||
else "deterministic_full"
|
||||
),
|
||||
"ageCleanupMode": "admission_only",
|
||||
"ageReservedSlots": max(
|
||||
0,
|
||||
int(getattr(base_args, "recent_model_reserve_slots", 5) or 0),
|
||||
),
|
||||
"ageReservedSlots": age_cleanup_reserve_slots,
|
||||
"ageQueueThresholds": cleanup_summary["oldModelQueueThresholds"],
|
||||
"activeScanned": cleanup_summary["activeScanned"],
|
||||
"certainOomCount": cleanup_summary["certainOomCount"],
|
||||
@@ -715,8 +684,6 @@ def run_poll_loop(
|
||||
"stopErrorCount": len(cleanup_summary["stopErrors"]),
|
||||
}
|
||||
)
|
||||
if not architecture_only_cleanup:
|
||||
initial_age_cleanup_pending = False
|
||||
pending_architecture_cleanup = False
|
||||
last_cleaned_architecture_blocks = active_architecture_block_keys
|
||||
except Exception as exc:
|
||||
|
||||
Reference in New Issue
Block a user