Fastfill-test / code /fastfill /v2 /tests /test_evaluation_failure_latency.py
XXXpilar's picture
FastFill v4 base (step 6552): LoRA adapter, geometry heads, tokenizer, training code, predict.py
e6f80f3 verified
Raw History Blame Contribute Delete
3.93 kB
"""Failed checkpoint generations remain in the measured latency population."""
from copy import deepcopy
import json
from types import SimpleNamespace
import time
import pytest
from fastfill.v2 import evaluate
from fastfill.v2.tests.test_runtime import condition, layout
def dataset(path):
row = {"schema_version": "fastfill.v2", "condition": condition(), "target": layout(),
"validity": {"position": [[True] * 3], "size": [[True] * 3], "yaw": [True]},
"provenance": {"source": "synthetic", "house_id": "h", "scene_id": "one", "split": "test"}}
rows = [row, {**deepcopy(row), "provenance": {**row["provenance"], "scene_id": "two"}}]
path.write_text("".join(json.dumps(sample) + "\n" for sample in rows))
@pytest.mark.parametrize("failure", ["generation", "schema"])
def test_failed_generation_or_schema_time_is_retained_in_all_request_latency(tmp_path, monkeypatch, failure):
data = tmp_path / "requests.jsonl"
dataset(data)
monkeypatch.setattr(evaluate, "load_model", lambda *a, **k: SimpleNamespace(config=SimpleNamespace(backbone="tiny")))
monkeypatch.setattr(evaluate, "load_tokenizer", lambda *a, **k: object())
calls = 0
def generate(*_args, **_kwargs):
nonlocal calls
calls += 1
if calls == 2:
time.sleep(.025)
if failure == "generation":
raise ValueError("generation failed after work")
return {"schema_version": "fastfill.v2", "objects": []}
return layout()
monkeypatch.setattr(evaluate, "predict_layout", generate)
output = tmp_path / "evaluation"
report = evaluate.run_evaluation(data, output, checkpoint=tmp_path / "mock.pt")
outcomes = [json.loads(line) for line in (output / "outcomes.jsonl").read_text().splitlines()]
assert report["requests"] == 2 and report["inference_failed_requests"] == 1
assert outcomes[1]["fastfill_latency_ms"] >= 20.
assert outcomes[1]["fastfill_latency_status"] == "failure"
assert outcomes[0]["fastfill_latency_status"] == "success"
assert report["latency_ms"]["fastfill_observed_requests"] == 2
assert report["latency_ms"]["fastfill_by_outcome"]["failure"]["requests"] == 1
assert report["latency_ms"]["fastfill_by_outcome"]["success"]["requests"] == 1
assert report["latency_ms"]["fastfill_p95"] >= 19.
def test_supplied_predictions_do_not_invent_generation_latency(tmp_path):
data, predictions = tmp_path / "requests.jsonl", tmp_path / "predictions.jsonl"
dataset(data)
predictions.write_text(json.dumps(layout()) + "\n" + '{"bad":true}\n')
output = tmp_path / "evaluation"
report = evaluate.run_evaluation(data, output, predictions=predictions)
outcomes = [json.loads(line) for line in (output / "outcomes.jsonl").read_text().splitlines()]
assert all(row["fastfill_latency_ms"] is None for row in outcomes)
assert all(row["fastfill_latency_status"] == "unobserved" for row in outcomes)
assert report["latency_ms"]["fastfill_observed_requests"] == 0
assert report["latency_ms"]["fastfill_p95"] is None
def test_requests_over_the_object_budget_are_counted_as_over_capacity(tmp_path, monkeypatch):
from fastfill.v2.batch import collate_samples
data = tmp_path / "requests.jsonl"
dataset(data)
monkeypatch.setattr(evaluate, "load_model", lambda *a, **k: SimpleNamespace(config=SimpleNamespace(backbone="tiny")))
monkeypatch.setattr(evaluate, "load_tokenizer", lambda *a, **k: object())
def generate(model, tokenizer, condition, *args, **kwargs): # the real budget check, here of a 0-object model
collate_samples([{"condition": condition}], tokenizer, max_objects=0)
monkeypatch.setattr(evaluate, "predict_layout", generate)
report = evaluate.run_evaluation(data, tmp_path / "evaluation", checkpoint=tmp_path / "mock.pt")
assert report["inference_failed_requests"] == report["over_capacity_requests"] == 2