train_run: --set KEY=VALUE overrides for Ultralytics train arguments, recorded in the ledger
CI / ledger-and-tools (push) Successful in 19s

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
GotthardGandClaude Fable 5.1 committed 2026-09-28 21:01:34 +02:00
1 parent ed208bff95
commit 1bdf1fc6b1
1 file changed
+16 -4
+16 -4
View File
@@ -171,6 +171,8 @@ def main(argv=None) -> int:
ap.add_argument("--baseline", default=None, help="gold report to gate against (default: the active model's)")
ap.add_argument("--no-promote", action="store_true", help="gate, but leave production.json alone")
ap.add_argument("--skip-train", action="store_true", help="reuse runs/<id>/ultralytics/train/weights/best.pt")
ap.add_argument("--set", nargs="*", default=[], metavar="KEY=VALUE",
help="override any Ultralytics train argument, e.g. fliplr=0 mask_ratio=1 overlap_mask=true; recorded in the ledger")
args = ap.parse_args(argv)
run = ledger.load(args.run_id)
@@ -179,8 +181,17 @@ def main(argv=None) -> int:
data_yaml = resolved_yaml(run_dir, ds)
names = [v for _, v in sorted(json.loads((ds / "source.json").read_text())["classes"].items(), key=lambda kv: int(kv[0]))] \
if (ds / "source.json").exists() else ["loop_all", "pin", "crystal", "loop_face", "ice", "needle"]
overrides: Dict[str, Any] = {}
for kv in args.set or []:
if "=" not in kv:
raise SystemExit(f"--set expects KEY=VALUE, got {kv!r}")
k, v = kv.split("=", 1)
try:
overrides[k] = json.loads(v.lower() if v.lower() in ("true", "false") else v)
except json.JSONDecodeError:
overrides[k] = v
hyper = {"epochs": args.epochs, "patience": args.patience, "imgsz": args.imgsz, "batch": args.batch,
"device": args.device, "overlap_mask": False, **AUGMENT}
"device": args.device, "overlap_mask": False, **AUGMENT, **overrides}
ledger.set_status(args.run_id, "training", note="train_run.py", kv={
"hyperparams": hyper, "host": socket.gethostname(), "started": datetime.now().isoformat(timespec="seconds")})
@@ -188,9 +199,10 @@ def main(argv=None) -> int:
if not args.skip_train:
from ultralytics import YOLO
model = YOLO(base_weights_path(run["base_weights"]))
model.train(data=str(data_yaml), epochs=args.epochs, patience=args.patience, imgsz=args.imgsz,
batch=args.batch, device=args.device, workers=args.workers, overlap_mask=False,
project=str(run_dir / "ultralytics"), name="train", exist_ok=True, amp=False, **AUGMENT)
train_kwargs = dict(epochs=args.epochs, patience=args.patience, imgsz=args.imgsz, batch=args.batch,
device=args.device, workers=args.workers, overlap_mask=False, amp=False, **AUGMENT)
train_kwargs.update(overrides) # --set wins over the recipe
model.train(data=str(data_yaml), project=str(run_dir / "ultralytics"), name="train", exist_ok=True, **train_kwargs)
if not best.exists():
ledger.set_status(args.run_id, "aborted", note=f"no best.pt at {best}")
return 1