Four Score & 7

This commit is contained in:
firestar5683
2026-09-04 22:47:02 -05:00
parent 53e5c5246d
commit de9cb64165
7 changed files with 28 additions and 27 deletions
+5 -5
View File
@@ -851,18 +851,19 @@ def _isolate_next_model_artifact_load() -> int:
def _load_model_lab_models(cam_w: int, cam_h: int, lateral_id: str, longitudinal_id: str,
version: str, CP=None, demo: bool = False) -> tuple[ModelState, ModelState] | None:
lateral_version: str, longitudinal_version: str,
CP=None, demo: bool = False) -> tuple[ModelState, ModelState] | None:
try:
if not demo:
wait_for_external_gpu_power_ready(CP)
_set_hcq_wait_timeout(BIG_MODEL_LOAD_WAIT_TIMEOUT_MS)
wait_usbgpu_link()
_isolate_next_model_artifact_load()
lateral = _load_model_lab_model(cam_w, cam_h, lateral_id, version)
lateral = _load_model_lab_model(cam_w, cam_h, lateral_id, lateral_version)
lateral.warmup()
evicted = _isolate_next_model_artifact_load()
cloudlog.info(f"Model Laboratory isolated {evicted} realized buffer UOps before loading the second model")
longitudinal = _load_model_lab_model(cam_w, cam_h, longitudinal_id, version)
longitudinal = _load_model_lab_model(cam_w, cam_h, longitudinal_id, longitudinal_version)
longitudinal.warmup()
return lateral, longitudinal
except Exception:
@@ -906,8 +907,6 @@ def _model_lab_runtime_request(params: Params, chestnut_ready: bool) -> tuple[di
return config, f"{role} model {model_id} has no precompiled AMD artifact in the manifest"
if not model_accelerator_artifact_installed(model_id):
return config, f"{role} model {model_id} AMD artifact is not installed by Model Manager"
if versions[lateral_id] != versions[longitudinal_id]:
return config, "the two models must use the same behavior version"
return config, None
@@ -1038,6 +1037,7 @@ def main(demo=False):
lateral_id,
longitudinal_id,
versions[lateral_id],
versions[longitudinal_id],
CP,
demo,
)
@@ -21,10 +21,10 @@ class FakeParams:
self.values[key] = value
def test_runtime_request_accepts_only_two_ready_small_same_version_models(tmp_path, monkeypatch):
def test_runtime_request_accepts_two_ready_small_mixed_version_models(tmp_path, monkeypatch):
config = {"enabled": True, "lateralModel": "lat", "longitudinalModel": "long"}
params = FakeParams(config)
(tmp_path / ".model_versions.json").write_text(json.dumps({"lat": "v15", "long": "v15"}))
(tmp_path / ".model_versions.json").write_text(json.dumps({"lat": "v15", "long": "v9"}))
(tmp_path / "lat_driving_tinygrad.pkl").write_bytes(b"lat")
(tmp_path / "long_driving_tinygrad.pkl").write_bytes(b"long")
monkeypatch.setattr(modeld, "MODELS_PATH", tmp_path)
@@ -53,9 +53,12 @@ def test_runtime_request_revalidates_hardware_version_and_size(tmp_path, monkeyp
monkeypatch.setattr(modeld, "model_accelerator_artifact_installed", lambda _model_id: True)
assert "Chestnut" in modeld._model_lab_runtime_request(params, chestnut_ready=False)[1]
assert "same behavior version" in modeld._model_lab_runtime_request(params, chestnut_ready=True)[1]
assert modeld._model_lab_runtime_request(params, chestnut_ready=True)[1] is None
(tmp_path / ".model_versions.json").write_text(json.dumps({"lat": "v15", "long": "v15"}))
(tmp_path / ".model_versions.json").write_text(json.dumps({"lat": "v15", "long": "v7"}))
assert "compatible small model" in modeld._model_lab_runtime_request(params, chestnut_ready=True)[1]
(tmp_path / ".model_versions.json").write_text(json.dumps({"lat": "v15", "long": "v9"}))
monkeypatch.setattr(
modeld,
"load_model_artifact_metadata",
@@ -127,7 +130,7 @@ def test_model_lab_loads_and_warms_both_amd_models_before_returning(monkeypatch)
lambda _w, _h, model_id, version: calls.append(("load", model_id, version)) or FakeModel(model_id),
)
pair = modeld._load_model_lab_models(1928, 1208, "lat", "long", "v15", "car-params")
pair = modeld._load_model_lab_models(1928, 1208, "lat", "long", "v15", "v9", "car-params")
assert [model.model_id for model in pair] == ["lat", "long"]
assert calls == [
@@ -138,7 +141,7 @@ def test_model_lab_loads_and_warms_both_amd_models_before_returning(monkeypatch)
("load", "lat", "v15"),
("warmup", "lat"),
"isolate_buffers",
("load", "long", "v15"),
("load", "long", "v9"),
("warmup", "long"),
"close_cache",
("timeout", modeld.BIG_MODEL_RUN_WAIT_TIMEOUT_MS),
-4
View File
@@ -124,10 +124,6 @@ def validate_model_lab_selection(
if require_installed and not bool(model.get("modelLabArtifactInstalled", False)):
return f"{role} model '{model_id}' has not downloaded its precompiled AMD artifact."
lateral_version = str(catalog[lateral_id].get("version") or "").strip()
longitudinal_version = str(catalog[longitudinal_id].get("version") or "").strip()
if lateral_version != longitudinal_version:
return "Choose models from the same behavior version; the longitudinal planner currently has one shared version contract."
return None
+2 -3
View File
@@ -56,7 +56,6 @@ def test_config_normalization_is_closed_by_default():
(True, {"lat": _catalog_model(small=False), "long": _catalog_model()}, "lat", "long", "Chestnut-class"),
(True, {"lat": _catalog_model(artifact_available=False), "long": _catalog_model()}, "lat", "long", "no precompiled AMD"),
(True, {"lat": _catalog_model(artifact_installed=False), "long": _catalog_model()}, "lat", "long", "not downloaded"),
(True, {"lat": _catalog_model("v15"), "long": _catalog_model("v9")}, "lat", "long", "same behavior version"),
],
)
def test_selection_validation_rejects_unsafe_pairs(chestnut_ready, catalog, lateral, longitudinal, expected):
@@ -68,8 +67,8 @@ def test_selection_validation_rejects_unsafe_pairs(chestnut_ready, catalog, late
assert expected in error
def test_selection_validation_accepts_distinct_ready_small_same_version_models():
catalog = {"lat": _catalog_model(), "long": _catalog_model()}
def test_selection_validation_accepts_distinct_ready_small_mixed_version_models():
catalog = {"lat": _catalog_model("v15"), "long": _catalog_model("v9")}
assert validate_model_lab_selection(
{"enabled": True, "lateralModel": "lat", "longitudinalModel": "long"},
catalog,
@@ -35,7 +35,7 @@ function candidateModels(role) {
if (role !== "longitudinal") return ready
const lateral = modelById(state.configuration.lateralModel)
if (!lateral) return ready
return ready.filter(model => model.value !== lateral.value && model.version === lateral.version)
return ready.filter(model => model.value !== lateral.value)
}
function selectionError() {
@@ -51,7 +51,6 @@ function selectionError() {
if (!lateral.modelLabArtifactInstalled || !longitudinal.modelLabArtifactInstalled) {
return "Prepare both precompiled AMD artifacts first."
}
if (lateral.version !== longitudinal.version) return "Both models must use the same behavior version."
return ""
}
@@ -78,8 +77,7 @@ function applyPayload(payload) {
}
if (!modelById(state.configuration.longitudinalModel) && ready.length > 1) {
state.configuration.longitudinalModel = ready.find(model => (
model.value !== state.configuration.lateralModel &&
model.version === modelById(state.configuration.lateralModel)?.version
model.value !== state.configuration.lateralModel
))?.value || ""
}
}
@@ -178,7 +176,7 @@ function bindControls() {
state.configuration.lateralModel = event.target.value
const long = modelById(state.configuration.longitudinalModel)
const lat = modelById(event.target.value)
if (long && lat && (long.value === lat.value || long.version !== lat.version)) {
if (long && lat && long.value === lat.value) {
state.configuration.longitudinalModel = candidateModels("longitudinal")[0]?.value || ""
if (longitudinal) longitudinal.value = state.configuration.longitudinalModel
}
@@ -1854,13 +1854,17 @@ def test_model_laboratory_api_uses_installed_models_and_enforces_hardware_size_v
assert params.values["Model"] == params.values["DrivingModel"] == "lat"
assert params.values["ModelVersion"] == params.values["DrivingModelVersion"] == "v15"
mismatched = client.put("/api/model-laboratory", json={
mixed_version = client.put("/api/model-laboratory", json={
"enabled": True,
"lateralModel": "lat",
"longitudinalModel": "old",
})
assert mismatched.status_code == 409
assert "same behavior version" in mismatched.get_json()["error"]
assert mixed_version.status_code == 200
assert params.values["ModelLabConfig"] == {
"enabled": True,
"lateralModel": "lat",
"longitudinalModel": "old",
}
oversized = client.put("/api/model-laboratory", json={
"enabled": True,
@@ -119,6 +119,7 @@ def test_model_laboratory_frontend_exposes_guards_and_role_copy():
assert "model.modelLabArtifactInstalled" in source
assert "Nothing is compiled on the comma" in source
assert "run every camera frame on Chestnut's AMD GPU" in source
assert 'lateral.version !== longitudinal.version' in source
assert 'lateral.value === longitudinal.value' in source
assert 'lateral.version !== longitudinal.version' not in source
assert "Path shape, curvature, lane geometry" in source
assert "Speed, acceleration, stopping, leads" in source