ML research control plane connecting ml-experiment-scaffold (template), gpu-server-test-suite (preflight), and llm-wiki (knowledge) into a unified experiment lifecycle. Manages experiment instances, model registry, cloud training, and W&B sync.
Makefile (orchestrator)
├── scripts/new_experiment.py → copies scaffold into experiments/
├── scripts/preflight.py → shells out to gpu-server-test-suite
├── src/ml_lab/config_validator.py → validates configs before training
├── scripts/register_model.py → appends to registry/models.jsonl
├── scripts/cross_compare.py → generates leaderboard from registry
├── scripts/sync_wandb.py → WSL-based offline W&B sync
├── scripts/research_to_wiki.py → pushes findings to llm-wiki
└── cloud/launch.py → rsync + SSH cloud orchestrator
make preflight— GPU health checkmake new-experiment NAME=<name>— init from scaffold- Edit configs, run
make validate-config EXP=<name> make train EXP=<name>(local) ormake cloud-train EXP=<name> PROVIDER=runpodmake eval EXP=<name>— lm-eval benchmarksmake register EXP=<name>— add to model registrymake publish EXP=<name>— sync W&B + push to llm-wiki
- Experiments live in
experiments/YYYY-MM-<name>/— never modify scaffold directly - Model registry is append-only JSONL — never delete entries
- W&B must use
WANDB_MODE=offlinelocally (Device Guard),onlineon cloud - Config validator catches: fp8 training, bf16=False, seq_length>2048 without DeepSpeed
- Cloud training uses rsync + SSH — same configs as local, different compute
make test # Unit tests
make lint # Ruff check + format
make new-experiment NAME=test # Init experiment
make validate-config EXP=<name> # Validate configs
make train EXP=<name> # Preflight + train
make register EXP=<name> # Register model
make leaderboard # Cross-experiment comparison
make sync-wandb # Sync offline W&B runs- Tests in
tests/— all run without GPU pytest tests/ -v --tb=short- Test new scripts by creating a mock experiment in tmp_path
from __future__ import annotationsin every modulelogging.getLogger(__name__)— neverprint()in library code- Type hints on all public functions
- Ruff for lint/format, line length 100