NeuralGCM / scripts /prepare_static_data.py
yzt15806542928's picture
Upload folder using huggingface_hub
f4a39ee verified
Raw
History Blame Contribute Delete
2.85 kB
#!/usr/bin/env python3
"""Extract official NeuralGCM static fields from released checkpoints."""
from __future__ import annotations
import argparse
import pickle
try:
from common import PROJECT_ROOT, load_config, resolve_path
except ModuleNotFoundError: # supports ``python -m scripts.prepare_static_data``
from scripts.common import PROJECT_ROOT, load_config, resolve_path
STATIC_VARIABLES = ("geopotential_at_surface", "land_sea_mask")
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--config", default=str(PROJECT_ROOT / "conf/config.yaml"))
parser.add_argument(
"--mode",
action="append",
dest="modes",
help="profile to extract; repeat for multiple profiles (default: all)",
)
parser.add_argument(
"--overwrite",
action="store_true",
help="replace an existing profile static NetCDF",
)
args = parser.parse_args()
config = load_config(args.config)
profiles = config["model"]["profiles"]
static_files = config["data"].get("static_files", {})
modes = args.modes or list(profiles)
import xarray as xr
for mode in modes:
if mode not in profiles:
raise ValueError(f"Unknown model profile {mode!r}")
if mode not in static_files:
raise ValueError(f"data.static_files has no path for {mode!r}")
checkpoint_path = resolve_path(
profiles[mode]["official_reference"], args.config
)
output_path = resolve_path(static_files[mode], args.config)
if output_path.exists() and not args.overwrite:
print(f"Static fields already exist: {output_path}")
continue
with checkpoint_path.open("rb") as handle:
payload = pickle.load(handle)
if not isinstance(payload, dict) or "aux_ds_dict" not in payload:
raise ValueError(
f"{checkpoint_path} is missing the official aux_ds_dict"
)
source = xr.Dataset.from_dict(payload["aux_ds_dict"])
missing = [name for name in STATIC_VARIABLES if name not in source]
if missing:
raise ValueError(
f"{checkpoint_path} is missing static variables {missing}"
)
static = source[list(STATIC_VARIABLES)]
static.attrs.update(
{
"source": str(checkpoint_path),
"neuralgcm_profile": mode,
"synthetic": "false",
}
)
output_path.parent.mkdir(parents=True, exist_ok=True)
static.to_netcdf(output_path)
print(
f"Extracted {mode} static fields to {output_path}: "
f"longitude={static.sizes['longitude']}, "
f"latitude={static.sizes['latitude']}"
)
if __name__ == "__main__":
main()