| from __future__ import annotations | |
| import argparse | |
| from dataclasses import asdict | |
| from .controller import TrainerConfig, fit_controller | |
| from .benchmarks import run_benchmark_suite | |
| from .gui import launch_runtime_gui | |
| from .smoke import run_tinygrad_gate_demo | |
| def build_parser() -> argparse.ArgumentParser: | |
| parser = argparse.ArgumentParser(prog="openpeer-trainer") | |
| sub = parser.add_subparsers(dest="command", required=True) | |
| demo = sub.add_parser("demo", help="run the tinygrad gate-controller smoke demo") | |
| demo.add_argument("--steps", type=int, default=80) | |
| demo.add_argument("--batch-size", type=int, default=64) | |
| demo.add_argument("--seed", type=int, default=0) | |
| demo.add_argument("--target-accuracy", type=float, default=0.99) | |
| fit = sub.add_parser("fit", help="fit an ntkmirror controller on a frozen causal LM") | |
| fit.add_argument("--model", default="OpenPeerAI/OpenPeerLLM") | |
| fit.add_argument("--fallback-model", default="sshleifer/tiny-gpt2") | |
| fit.add_argument("--train-jsonl") | |
| fit.add_argument("--out", default="runs/openpeer_controller.pt") | |
| fit.add_argument("--gates", type=int, default=512) | |
| fit.add_argument("--steps", type=int, default=40) | |
| fit.add_argument("--demo-mode", action="store_true") | |
| bench = sub.add_parser("bench", help="run local gate-controller benchmarks and generate charts") | |
| bench.add_argument("--steps", type=int, nargs="+", default=[20, 40, 80, 120]) | |
| bench.add_argument("--batch-size", type=int, default=64) | |
| bench.add_argument("--seed", type=int, default=0) | |
| bench.add_argument("--output-dir", default="artifacts/benchmarks") | |
| bench.add_argument("--target-accuracy", type=float, default=0.99) | |
| gui = sub.add_parser("gui", help="launch the runtime GUI") | |
| return parser | |
| def main(argv: list[str] | None = None) -> int: | |
| parser = build_parser() | |
| args = parser.parse_args(argv) | |
| if args.command == "demo": | |
| result = run_tinygrad_gate_demo(steps=args.steps, batch_size=args.batch_size, seed=args.seed, target_accuracy=args.target_accuracy) | |
| print("tinygrad gate demo") | |
| print(f"initial_accuracy={result.initial_accuracy:.3f}") | |
| print(f"final_accuracy={result.final_accuracy:.3f}") | |
| print(f"final_loss={result.final_loss:.4f}") | |
| print(f"target_accuracy={result.target_accuracy:.3f}") | |
| print(f"reached_target={result.reached_target}") | |
| print(f"trained_steps={result.trained_steps}") | |
| print(f"learned_gate_sample={result.learned_gate_sample}") | |
| return 0 | |
| if args.command == "bench": | |
| result = run_benchmark_suite( | |
| step_counts=args.steps, | |
| batch_size=args.batch_size, | |
| seed=args.seed, | |
| output_dir=args.output_dir, | |
| target_accuracy=args.target_accuracy, | |
| ) | |
| print(f"benchmarks_csv={result.csv_path}") | |
| print(f"charts={result.chart_paths}") | |
| return 0 | |
| if args.command == "gui": | |
| return launch_runtime_gui() | |
| config = TrainerConfig( | |
| model_name=args.model, | |
| fallback_model_name=args.fallback_model, | |
| train_jsonl=args.train_jsonl, | |
| out_path=args.out, | |
| gates=args.gates, | |
| steps=args.steps, | |
| demo_mode=args.demo_mode, | |
| ) | |
| output_path = fit_controller(config) | |
| print(f"saved_controller={output_path}") | |
| print(f"config={asdict(config)}") | |
| return 0 | |
| if __name__ == "__main__": | |
| raise SystemExit(main()) | |