diff options
| author | YurenHao0426 <Blackhao0426@gmail.com> | 2026-07-27 14:36:08 -0500 |
|---|---|---|
| committer | YurenHao0426 <Blackhao0426@gmail.com> | 2026-07-27 14:36:08 -0500 |
| commit | 08554657946e54d8d908a2866e82504e9b194617 (patch) | |
| tree | fe4b854785a8b71d5a68b39bb804f19819faabae | |
| parent | 113abad636b4e14f963ab0243b5839ca19386d9b (diff) | |
analysis: retain ResNet selector failures
| -rw-r--r-- | RESNET_CROSSOVER.md | 3 | ||||
| -rw-r--r-- | experiments/analyze_resnet_crossover_p1.py | 47 |
2 files changed, 39 insertions, 11 deletions
diff --git a/RESNET_CROSSOVER.md b/RESNET_CROSSOVER.md index bcb9fad..126c051 100644 --- a/RESNET_CROSSOVER.md +++ b/RESNET_CROSSOVER.md @@ -78,7 +78,8 @@ Select maximum best validation accuracy, then a finite final loss, then the lower rate. If every candidate is nonfinite, select the lowest rate and retain all failures. The selected rate is copied without depth-specific tuning to ResNet-20/32/56. R1 development records are not primary panel -cells. +cells. A timeout or nonzero exit has a manifest, ranks after every finite +candidate, and does not make the registry disappear. ## R2 complete 27-cell validation panel diff --git a/experiments/analyze_resnet_crossover_p1.py b/experiments/analyze_resnet_crossover_p1.py index 6fe34c9..72a46e6 100644 --- a/experiments/analyze_resnet_crossover_p1.py +++ b/experiments/analyze_resnet_crossover_p1.py @@ -91,7 +91,30 @@ def audit_job(job, expected_source): hardware = manifest["hardware_lock"] assert hardware["physical_gpu_index"] in (5, 7) assert hardware["physical_gpu_uuid"] - assert manifest["status"] == "completed" + common = { + "method": job["method"], + "rate": job["rate"], + "experiment_name": job["experiment_name"], + "manifest": os.path.relpath(manifest_path, ROOT), + "status": manifest["status"], + "output_sha256": manifest["output_sha256"], + "driver_wall_seconds": manifest["driver_wall_seconds"], + "physical_gpu_index": hardware["physical_gpu_index"], + "physical_gpu_uuid": hardware["physical_gpu_uuid"], + } + if manifest["status"] != "completed": + assert manifest["status"] in { + "timeout", "nonzero_exit", "missing_output"} + return { + **common, + "finite": False, + "best_validation_accuracy": None, + "final_validation_accuracy": None, + "final_validation_loss": None, + "best_epoch": None, + "epochs_completed": None, + "all_training_losses_finite": False, + } assert manifest["output_exists"] is True assert manifest["output_sha256"] == sha256(job["output"]) record = read_json(job["output"]) @@ -115,21 +138,25 @@ def audit_job(job, expected_source): "sdil": "kp_traffic", }[job["method"]] assert record["args"]["mode"] == expected_mode + metrics = history_metrics(record, job["method"]) return { - "method": job["method"], - "rate": job["rate"], - "experiment_name": job["experiment_name"], - "manifest": os.path.relpath(manifest_path, ROOT), - "output_sha256": manifest["output_sha256"], - "driver_wall_seconds": manifest["driver_wall_seconds"], - **history_metrics(record, job["method"]), + **common, + "finite": ( + metrics["all_training_losses_finite"] + and math.isfinite(metrics["final_validation_loss"])), + **metrics, } def choose(candidates): return max(candidates, key=lambda row: ( - row["best_validation_accuracy"], - int(math.isfinite(row["final_validation_loss"])), + int(row["finite"]), + ( + row["best_validation_accuracy"] + if row["best_validation_accuracy"] is not None else -math.inf), + int( + row["final_validation_loss"] is not None + and math.isfinite(row["final_validation_loss"])), -row["rate"], )) |
