Add Stop-A: offered-L-C-A convergence early-stop for replay
Phase 2 of the two-stop work. The L-C-A vector is a deterministic function of the trace's offered metadata, so the convergence of prefix-vs-full L-C-A (the paper's Fig. 9 curve) can be computed up front rather than monitored live, with identical result and no per-request overhead. - lca.find_convergence_prefix: earliest arrival-ordered prefix whose L and A family similarities reach tau and the slow C family reaches the stricter tau_c for stable_checks consecutive checkpoints. Self-similarity uses the raw log-feature vector (same window -> identical per-dim spread; RobustScaler is reserved for the cross-window Stop-C). If C never converges it reports the full set, which is the C-gate: no early stop on a cold/under-warmed cache. The checkpoint sims double as Phase 3 calibration data. - spec.AdaptiveStopSpec (trace.adaptive_stop), disabled by default until the thresholds are calibrated, so existing studies are unaffected. - worker._adaptive_replay_set truncates each probe's replay to the convergence prefix and records a certificate (converged, fraction, family similarity) into probe history and probe_details. Offered request_rate at the threshold is unchanged; only wall-clock replay shrinks. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,7 @@ from aituner.harness import (
|
||||
from aituner.lca import (
|
||||
build_study_workload_profile,
|
||||
build_workload_profile,
|
||||
find_convergence_prefix,
|
||||
profile_similarity,
|
||||
resolve_length_mode,
|
||||
similarity_report,
|
||||
@@ -38,6 +39,7 @@ from aituner.llm import _extract_response_text, build_prompt, parse_proposal_tex
|
||||
from aituner.search import ThresholdProbe, binary_search_max_feasible
|
||||
from aituner.slo import RequestOutcome, evaluate_request, summarize_evaluations
|
||||
from aituner.spec import (
|
||||
AdaptiveStopSpec,
|
||||
ConfigPatch,
|
||||
LLMEndpointSpec,
|
||||
Proposal,
|
||||
@@ -49,6 +51,7 @@ from aituner.spec import (
|
||||
from aituner.store import StudyStore
|
||||
from aituner.trace import load_trace_requests, summarize_window
|
||||
from aituner.worker import (
|
||||
_adaptive_replay_set,
|
||||
_best_feasible_probe_record,
|
||||
_latency_summary,
|
||||
_run_one_request,
|
||||
@@ -327,6 +330,134 @@ class CoreFlowTests(unittest.TestCase):
|
||||
)["workload_lca_profile"]
|
||||
self.assertNotIn("vector", legacy)
|
||||
|
||||
def _steady_requests(self, count: int, *, input_tokens: int = 100) -> list:
|
||||
return [
|
||||
TraceRequest(
|
||||
row_id=f"r{i}",
|
||||
arrival_s=float(i),
|
||||
sampling_u=1.0,
|
||||
body={},
|
||||
prompt_tokens_hint=input_tokens,
|
||||
completion_tokens_hint=16,
|
||||
metadata={"hash_ids": None},
|
||||
)
|
||||
for i in range(count)
|
||||
]
|
||||
|
||||
def _conv_window(self) -> WindowRecord:
|
||||
return WindowRecord(
|
||||
window_id="conv",
|
||||
trace_path=Path("trace.jsonl"),
|
||||
trace_type="chat",
|
||||
window_start=0.0,
|
||||
window_end=0.0,
|
||||
source_payload={"block_size": 64},
|
||||
)
|
||||
|
||||
def test_convergence_prefix_stops_early_on_stationary_trace(self) -> None:
|
||||
requests = self._steady_requests(60)
|
||||
point = find_convergence_prefix(
|
||||
requests,
|
||||
self._conv_window(),
|
||||
gpu_count=1,
|
||||
length_mode="total",
|
||||
tau=0.9,
|
||||
tau_c=0.9,
|
||||
stable_checks=3,
|
||||
max_checks=20,
|
||||
min_fraction=0.1,
|
||||
)
|
||||
self.assertTrue(point.converged)
|
||||
# A stationary workload should be trustworthy well before the full window.
|
||||
self.assertLess(point.stop_index, len(requests))
|
||||
self.assertLess(point.fraction, 1.0)
|
||||
self.assertTrue(point.checks)
|
||||
|
||||
def test_convergence_prefix_waits_when_cache_warms_late(self) -> None:
|
||||
window = self._conv_window()
|
||||
# First half: no prefix reuse. Second half: every request reuses block 1,
|
||||
# so the C dimension only stabilizes once the reuse regime is exercised.
|
||||
requests = []
|
||||
for i in range(30):
|
||||
requests.append(
|
||||
TraceRequest(
|
||||
row_id=f"cold{i}",
|
||||
arrival_s=float(i),
|
||||
sampling_u=1.0,
|
||||
body={},
|
||||
prompt_tokens_hint=640,
|
||||
completion_tokens_hint=16,
|
||||
metadata={"hash_ids": [10_000 + i]},
|
||||
)
|
||||
)
|
||||
for i in range(30):
|
||||
requests.append(
|
||||
TraceRequest(
|
||||
row_id=f"warm{i}",
|
||||
arrival_s=float(30 + i),
|
||||
sampling_u=1.0,
|
||||
body={},
|
||||
prompt_tokens_hint=640,
|
||||
completion_tokens_hint=16,
|
||||
metadata={"hash_ids": [1, 2, 3, 4, 5]},
|
||||
)
|
||||
)
|
||||
point = find_convergence_prefix(
|
||||
requests,
|
||||
window,
|
||||
gpu_count=1,
|
||||
length_mode="total",
|
||||
tau=0.9,
|
||||
tau_c=0.95,
|
||||
stable_checks=2,
|
||||
max_checks=20,
|
||||
min_fraction=0.1,
|
||||
)
|
||||
# The C family similarity must be low while only the cold half is seen.
|
||||
early = [c for c in point.checks if c["fraction"] <= 0.4]
|
||||
self.assertTrue(early)
|
||||
self.assertTrue(any(c["family_similarity"]["C"] < 0.9 for c in early))
|
||||
|
||||
def test_adaptive_replay_set_truncates_only_when_enabled(self) -> None:
|
||||
from types import SimpleNamespace
|
||||
|
||||
requests = self._steady_requests(60)
|
||||
window = self._conv_window()
|
||||
enabled_study = SimpleNamespace(
|
||||
trace=SimpleNamespace(
|
||||
adaptive_stop=AdaptiveStopSpec(
|
||||
enabled=True,
|
||||
tau=0.9,
|
||||
tau_c=0.9,
|
||||
stable_checks=3,
|
||||
max_checks=20,
|
||||
min_fraction=0.1,
|
||||
),
|
||||
request_mode="chat",
|
||||
),
|
||||
hardware=SimpleNamespace(gpu_count=1),
|
||||
)
|
||||
replay, certificate = _adaptive_replay_set(
|
||||
requests, study=enabled_study, window=window
|
||||
)
|
||||
self.assertIsNotNone(certificate)
|
||||
self.assertTrue(certificate["enabled"])
|
||||
self.assertEqual(len(replay), certificate["stop_index"])
|
||||
self.assertLessEqual(len(replay), len(requests))
|
||||
|
||||
disabled_study = SimpleNamespace(
|
||||
trace=SimpleNamespace(
|
||||
adaptive_stop=AdaptiveStopSpec(enabled=False),
|
||||
request_mode="chat",
|
||||
),
|
||||
hardware=SimpleNamespace(gpu_count=1),
|
||||
)
|
||||
passthrough, no_cert = _adaptive_replay_set(
|
||||
requests, study=disabled_study, window=window
|
||||
)
|
||||
self.assertIsNone(no_cert)
|
||||
self.assertEqual(len(passthrough), len(requests))
|
||||
|
||||
def test_lca_similarity_matrix_separates_different_profiles(self) -> None:
|
||||
window = WindowRecord(
|
||||
window_id="base",
|
||||
|
||||
Reference in New Issue
Block a user