yushuang88's picture
Upload folder using huggingface_hub
e5a6e71 verified
Raw History Blame Contribute Delete
3.97 kB
"""OneScience installer preflight and independent structural checks; no formal weights."""
import ast
import importlib
import json
import os
import shutil
import time
import torch
from torch.utils.data import DataLoader
from common import (ROOT, Trajectories, Windows, build_model, device, load_config,
output_dir, parser, provenance, save_json, setup, validate)
from train import train_batch
def main():
args = parser(__doc__).parse_args()
cfg = load_config(args.config)
setup(cfg["seed"])
target_device = device()
for module in ("onescience", "torch", "numpy", "h5py", "yaml", "matplotlib"):
importlib.import_module(module)
print("DEPENDENCY_OK " + module, flush=True)
for path in ROOT.rglob("*.py"):
ast.parse(path.read_text())
for command in ("sbatch", "squeue", "sacct"):
assert shutil.which(command), command
datasets = {split: Trajectories(cfg, split) for split in cfg["data"]["expected_counts"]}
out = output_dir(cfg)
save_json(out / "dataset_validation.json", {s: d.metadata for s, d in datasets.items()})
model = build_model(cfg, target_device)
sample = datasets["train"].values[0, :6].unsqueeze(0).to(target_device)
model.eval()
with torch.no_grad():
initial = sample[:, 0]
predicted = model(initial)
assert predicted.shape == initial.shape
assert torch.isfinite(predicted).all()
assert predicted[:, 0].min() >= 0
drift = (predicted.double().sum((-2, -1)) - initial.double().sum((-2, -1))).abs()
scale = initial.double().abs().sum((-2, -1)).clamp_min(1.0)
assert (drift / scale).max() < 2e-6
# A uniform state remains uniform for all learned transport plans.
uniform = torch.ones_like(initial)
assert torch.allclose(model(uniform), uniform, atol=2e-6)
# Every channel conserves its sum for arbitrary signed momentum.
random_state = torch.rand_like(initial)
random_state[:, 1:] -= 0.5
result = model(random_state)
random_drift = (result.double().sum((-2, -1)) - random_state.double().sum((-2, -1))).abs()
assert (random_drift / random_state.double().abs().sum((-2, -1)).clamp_min(1)).max() < 2e-6
print("STRUCTURE_OK forward, positivity, uniform state, per-channel conservation", flush=True)
model.train()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1e-2)
first, terminal = train_batch(model, sample, optimizer, 5)
assert any(p.grad is not None for p in model.parameters())
validation = validate(model, DataLoader(Windows(datasets["val"], 5), batch_size=2), target_device)
assert validation["mse"] >= 0
# Independent stop-gradient check on an explicit two-state feedback graph.
x = sample[:, 0].detach().requires_grad_(True)
intermediate = model(x)
final = model(intermediate.detach())
assert torch.autograd.grad(final.sum(), x, allow_unused=True)[0] is None
props = torch.cuda.get_device_properties(target_device)
result = {"status": "passed", "preflight_passed": True, "execution_readiness": "ready",
"evidence": {"preflight": {"status": "passed"}}, "installer_reason": "preflight_validation",
"execution_channel": "local_slurm", "provenance": provenance(),
"gpu_memory_gb": props.total_memory / 2**30,
"model_parameters": sum(p.numel() for p in model.parameters()),
"structural_checks": ["shape", "finite", "positivity", "uniform_state", "conservation", "detached_feedback"],
"real_data_train_batch_loss": {"step1": first, "step5": terminal},
"real_data_validation": validation,
"formal_training_completed": False, "formal_weights_written": False}
save_json(out / "preflight_validation.json", result)
print("PREFLIGHT_PASSED " + json.dumps(result), flush=True)
if __name__ == "__main__":
main()