File size: 3,043 Bytes
e41bef1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/env python3
"""Run the three Phase 2.1A v2 Robometer-Low-LoRA seeds serially with resume."""

from __future__ import annotations

import argparse
import subprocess
import sys
from pathlib import Path


ROOT = Path(__file__).resolve().parents[1]
TRAINER = ROOT / "scripts" / "train_phase21a_robometer_low_lora.py"
def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--output-root", type=Path, required=True)
    parser.add_argument("--snapshot", type=Path, required=True)
    parser.add_argument(
        "--manifest",
        type=Path,
        default=ROOT / "manifests" / "phase2_remediation_pairs_v1.jsonl",
    )
    parser.add_argument(
        "--processed-root",
        type=Path,
        default=ROOT / "artifacts" / "data_views" / "phase1_official" / "processed_datasets",
    )
    parser.add_argument("--seeds", type=int, nargs="+", default=[7, 17, 27])
    parser.add_argument("--optimizer-steps", type=int, default=3000)
    parser.add_argument("--micro-batch-pairs", type=int, default=32)
    parser.add_argument("--gradient-accumulation", type=int, default=2)
    parser.add_argument("--lora-lr", type=float, default=2.0e-6)
    parser.add_argument("--head-lr", type=float, default=1.0e-4)
    parser.add_argument("--checkpoint-every", type=int, default=250)
    parser.add_argument("--eval-every", type=int, default=250)
    parser.add_argument("--eval-micro-batch-pairs", type=int, default=32)
    parser.add_argument("--early-stop-min-steps", type=int, default=1000)
    parser.add_argument("--early-stop-patience-evals", type=int, default=4)
    parser.add_argument("--early-stop-min-delta", type=float, default=5.0e-3)
    args = parser.parse_args()
    for seed in args.seeds:
        output = args.output_root / f"seed_{seed}"
        if (output / "summary.json").is_file():
            continue
        command = [
            sys.executable,
            str(TRAINER),
            "--snapshot", str(args.snapshot),
            "--manifest", str(args.manifest),
            "--processed-root", str(args.processed_root),
            "--seed", str(seed),
            "--optimizer-steps", str(args.optimizer_steps),
            "--micro-batch-pairs", str(args.micro_batch_pairs),
            "--gradient-accumulation", str(args.gradient_accumulation),
            "--lora-lr", str(args.lora_lr),
            "--head-lr", str(args.head_lr),
            "--checkpoint-every", str(args.checkpoint_every),
            "--eval-every", str(args.eval_every),
            "--eval-micro-batch-pairs", str(args.eval_micro_batch_pairs),
            "--early-stop-min-steps", str(args.early_stop_min_steps),
            "--early-stop-patience-evals", str(args.early_stop_patience_evals),
            "--early-stop-min-delta", str(args.early_stop_min_delta),
            "--output-dir", str(output),
        ]
        if (output / "latest_training_state.pt").is_file():
            command.append("--resume")
        subprocess.run(command, check=True)


if __name__ == "__main__":
    main()