Download scripts/inference.py from OneScience-Group/Spherical-Fourier-Neural-Operators: direct link, hf CLI and curl.
- Browser
- Download file 2.05 kB
-
https://huggingface.co/OneScience-Group/Spherical-Fourier-Neural-Operators/resolve/main/scripts/inference.py
- Command line
-
hf download hf://OneScience-Group/Spherical-Fourier-Neural-Operators/scripts/inference.py
-
curl -L -o inference.py https://huggingface.co/OneScience-Group/Spherical-Fourier-Neural-Operators/resolve/main/scripts/inference.py
2.05 kB
| """Load an SFNO smoke checkpoint and run autoregressive inference.""" | |
| import argparse | |
| import json | |
| import sys | |
| from pathlib import Path | |
| import torch | |
| ROOT = Path(__file__).resolve().parents[1] | |
| LOCAL_DEPS = ROOT / ".deps" | |
| if LOCAL_DEPS.is_dir(): | |
| sys.path.insert(0, str(LOCAL_DEPS)) | |
| sys.path.insert(0, str(ROOT)) | |
| from model.config import load_config | |
| from model.fake_spherical_data import make_fake_spherical_sequence | |
| from model.sfno_adapter import OfficialSFNOAdapter | |
| def main() -> None: | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("--checkpoint", type=Path, default=ROOT / "weight" / "model.pth") | |
| parser.add_argument("--output-dir", type=Path, default=ROOT / "result") | |
| args = parser.parse_args() | |
| result_dir = args.output_dir | |
| result_dir.mkdir(parents=True, exist_ok=True) | |
| checkpoint = torch.load(args.checkpoint, map_location="cpu", weights_only=True) | |
| config_path = result_dir / "checkpoint_config.json" | |
| config_path.write_text(json.dumps(checkpoint["config"], indent=2) + "\n") | |
| config = load_config(config_path) | |
| model = OfficialSFNOAdapter(config) | |
| model.load_state_dict(checkpoint["model"]) | |
| model.eval() | |
| fields = make_fake_spherical_sequence( | |
| config.timesteps, config.channels, config.nlat, config.nlon, config.seed | |
| )["fields"] | |
| state = fields[0:1] | |
| target = fields[1 : config.rollout_steps + 1] | |
| forecasts = [] | |
| with torch.inference_mode(): | |
| for _ in range(config.rollout_steps): | |
| state = model(state) | |
| forecasts.append(state) | |
| prediction = torch.cat(forecasts, dim=0) | |
| torch.save(prediction, result_dir / "prediction.pt") | |
| torch.save(target, result_dir / "target.pt") | |
| summary = { | |
| "prediction_shape": list(prediction.shape), | |
| "target_shape": list(target.shape), | |
| "finite": bool(torch.isfinite(prediction).all()), | |
| } | |
| (result_dir / "inference.json").write_text(json.dumps(summary, indent=2) + "\n") | |
| print(json.dumps(summary, indent=2)) | |
| if __name__ == "__main__": | |
| main() | |