MR-GNF: Britain-Centric Euro-Atlantic Weather Forecasting

MR-GNF is a lightweight regional graph neural weather forecasting model for the UK–Ireland sector and its surrounding Euro-Atlantic context. The model performs one-step atmospheric prediction and supports multi-step forecasting through autoregressive rollout.

This Hugging Face repository contains the released model checkpoints and the minimum code and static artifacts needed to load them. The complete training, data-preparation, and evaluation pipeline is available in the full MR-GNF project repository.

The model accompanies the paper:

Andrii Shchur and Inna Skarga-Bandurova, “MR-GNF: Multi-Resolution Graph Neural Forecasting on Ellipsoidal Meshes for Efficient Regional Weather Prediction.”
arXiv:2603.13563

Available checkpoints

Checkpoint Description
mr-gnf-general Main checkpoint for forecasting the complete supported atmospheric state.
mr-gnf-wind Checkpoint fine-tuned for 10 m wind components: u10@sfc and v10@sfc.
mr-gnf-precipitation Checkpoint fine-tuned for total precipitation: tp_log@sfc.

The wind and precipitation checkpoints are optional specialist models. During composed inference, their predictions can replace the corresponding channels produced by the general model before the next autoregressive step.

Repository files

File Description
mr-gnf-general Main all-variable model checkpoint.
mr-gnf-wind Wind-specialist checkpoint.
mr-gnf-precipitation Precipitation-specialist checkpoint.
UK_graph_static_from_stats_vgeo_aligned Static graph artifact required by the dataloader and model.
UK_geo_pos_static.npz Geographic coordinates for the regular UK-centred output grid.
stats_025deg_1980_2013.npz Channel order and normalization statistics derived from the 1980–2013 training period.
unified_graph_weather_dataloader.py Dataset and Lightning data-module implementation for graph shards.
unified_graph_weather_model.py General MR-GNF model definition.
unified_graph_weather_model_uv10.py Wind-specialist model definition.
unified_graph_weather_model_tp.py Precipitation-specialist model definition.

Time-dependent meteorological input shards are not included in this model repository.

Installation

A CUDA-enabled PyTorch environment is recommended.

pip install torch lightning numpy huggingface_hub
pip install torch-geometric triton

Install versions of PyTorch, CUDA, PyTorch Geometric, and Triton that are mutually compatible with your system.

Download the model repository

from huggingface_hub import snapshot_download

repo_dir = snapshot_download(
    repo_id="YOUR_HF_USERNAME/YOUR_MODEL_REPOSITORY"
)

print(repo_dir)

Replace YOUR_HF_USERNAME/YOUR_MODEL_REPOSITORY with the published Hugging Face repository identifier.

Input requirements

The dataloader expects monthly graph shards such as:

graph_2024-01.pt
graph_2024-02.pt
...

A batch is returned as:

(x_all, geo, pos2d), y_all

with the principal tensors arranged as:

x_all: [batch, input_steps, channels, nodes]
y_all: [batch, forecast_steps, channels, nodes]

Input shards must preserve the channel ordering, node ordering, normalization, and temporal cadence used during training. The channel order stored in the shard metadata is authoritative.

Load the general model

import sys
from pathlib import Path

import torch

REPO_DIR = Path("/path/to/downloaded/model-repository")
SHARDS_ROOT = Path("/path/to/monthly-graph-shards")

sys.path.insert(0, str(REPO_DIR))

from unified_graph_weather_dataloader import GraphWeatherDataModule
from unified_graph_weather_model import UnifiedGraphWeatherGATLightning

STATIC_GRAPH = REPO_DIR / "UK_graph_static_from_stats_vgeo_aligned"
GENERAL_CKPT = REPO_DIR / "mr-gnf-general"

DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")


def load_checkpoint(model, checkpoint_path: Path):
    checkpoint = torch.load(checkpoint_path, map_location="cpu")
    state_dict = checkpoint.get("state_dict", checkpoint)

    # These graph-dependent buffers are rebuilt from the supplied static graph.
    state_dict = {
        key: value
        for key, value in state_dict.items()
        if not (key.endswith("edge_src") or key.endswith("edge_dst"))
    }

    missing, unexpected = model.load_state_dict(state_dict, strict=False)
    print("Missing keys:", missing)
    print("Unexpected keys:", unexpected)


dm = GraphWeatherDataModule(
    shards_root_train=str(SHARDS_ROOT),
    shards_root_val=str(SHARDS_ROOT),
    years_train=range(2024, 2025),
    years_val=range(2024, 2025),
    static_graph_npz=str(STATIC_GRAPH),
    force_tin_tout=None,
    dtype_out="float32",
    shuffle_within_file_train=False,
    shuffle_within_file_val=False,
    batch_size_train=1,
    batch_size_val=1,
    num_workers=0,
    pin_memory=DEVICE.type == "cuda",
    persistent_workers=False,
    device="cuda" if DEVICE.type == "cuda" else "cpu",
)

dm.setup()

model = UnifiedGraphWeatherGATLightning(
    C=dm.C,
    Tin=dm.Tin,
    Tout=1,
    edge_index_base=dm.edge_index_base,
    N_mesh=dm.N_mesh,
    embed_dim=192,
    blocks=4,
    heads_v=4,
    heads_xy=4,
    attn_drop_xy=0.0,
    lr=3e-4,
    weight_decay=1e-4,
    loss="mse",
).to(DEVICE).eval()

load_checkpoint(model, GENERAL_CKPT)

The expected missing keys are the graph-dependent buffers regenerated from the supplied static graph:

net.edge_src
net.edge_dst

Unexpected missing parameters or unexpected checkpoint keys should be investigated before inference.

Run one-step inference

val_loader = dm.val_dataloader()
(x_all, geo, pos2d), _ = next(iter(val_loader))

x_all = x_all.to(DEVICE)
geo = geo.to(DEVICE)
pos2d = pos2d.to(DEVICE)

steps = torch.zeros(x_all.shape[0], device=DEVICE)

with torch.inference_mode():
    with torch.autocast(
        device_type=DEVICE.type,
        dtype=torch.bfloat16,
        enabled=DEVICE.type == "cuda",
    ):
        prediction = model.net(
            (x_all, geo, pos2d),
            diffusion_step=steps,
        )

print(prediction.shape)
# [batch, 1, channels, nodes]

For an autoregressive forecast, append the predicted state to the input sequence, remove the oldest input step, and call the model again.

Load the specialist models

The specialist checkpoints use the same static graph and input tensors as the general model. They also require the original channel order.

from unified_graph_weather_model_uv10 import WindUV10Lightning
from unified_graph_weather_model_tp import PrecipTPLightning

channel_order = dm.channel_order

wind_model = WindUV10Lightning(
    C=dm.C,
    Tin=dm.Tin,
    Tout=1,
    edge_index_base=dm.edge_index_base,
    N_mesh=dm.N_mesh,
    embed_dim=192,
    blocks=4,
    heads_v=4,
    heads_xy=4,
    attn_drop_xy=0.0,
    lr=1e-3,
    weight_decay=1e-4,
    loss_components=1.0,
    loss_magnitude=0.0,
    loss_direction=0.0,
    robust_loss=False,
    chan_u_name="u10@sfc",
    chan_v_name="v10@sfc",
    channel_order=channel_order,
    diffusion_max_step=0,
).to(DEVICE).eval()

precip_model = PrecipTPLightning(
    C=dm.C,
    Tin=dm.Tin,
    Tout=1,
    edge_index_base=dm.edge_index_base,
    N_mesh=dm.N_mesh,
    embed_dim=192,
    blocks=4,
    heads_v=4,
    heads_xy=4,
    attn_drop_xy=0.0,
    lr=3e-4,
    weight_decay=1e-4,
    diffusion_max_step=0,
    channel_order=channel_order,
).to(DEVICE).eval()

load_checkpoint(wind_model, REPO_DIR / "mr-gnf-wind")
load_checkpoint(precip_model, REPO_DIR / "mr-gnf-precipitation")

The wind model outputs the two near-surface wind channels. The precipitation model outputs the precipitation channel. Their outputs can be inserted into the general model prediction before continuing an autoregressive rollout.

Normalization

stats_025deg_1980_2013.npz contains the channel order, mean, and standard deviation used for normalization.

import numpy as np

stats = np.load(REPO_DIR / "stats_025deg_1980_2013.npz", allow_pickle=True)
channel_order = stats["order"].tolist()
mean = stats["mean"]
std = stats["std"]

physical_values = normalized_values * std + mean

Precipitation is represented in log space and can be converted back with:

precipitation = np.maximum(np.expm1(tp_log), 0.0)

Intended use

This release is intended for research and reproducibility work on short-range regional weather forecasting over the UK–Ireland and surrounding Euro-Atlantic sector.

It is not an operational warning system and should not replace forecasts or warnings issued by national meteorological services.

Citation

Please cite the associated paper when using the model or artifacts:

@misc{shchur2026mrgnf,
  title         = {MR-GNF: Multi-Resolution Graph Neural Forecasting on Ellipsoidal Meshes for Efficient Regional Weather Prediction},
  author        = {Andrii Shchur and Inna Skarga-Bandurova},
  year          = {2026},
  eprint        = {2603.13563},
  archivePrefix = {arXiv},
  primaryClass  = {cs.LG},
  doi           = {10.48550/arXiv.2603.13563},
  url           = {https://arxiv.org/abs/2603.13563}
}

Paper: https://arxiv.org/abs/2603.13563

Full project repository: https://github.com/AndriiShchur/MR-GNF

License

The model and accompanying code are released under the MIT License. The underlying meteorological data may be subject to separate terms and licenses.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Paper for anshchkse/MR-GNF-Britain-Centric-Euro-Atlantic