Skip to content

First experiment

Start with an existing paired raster export containing ten GEO bands, ERA5 context, SAR targets, split manifests, and stats.json. The dataset guide explains data access. If you have source observations instead, export them first.

Replace /path/to/geo_sar below with the export root. A Hugging Face metadata catalog alone is not a training root.

Inspect a batch

from geo2wf.config import compose_config, instantiate_datamodule

config = compose_config([
    "data=geo_sar_common10_era5",
    "model=deterministic_residual",
    "data.root=/path/to/geo_sar",
    "data.stats_file=/path/to/geo_sar/stats.json",
    "data.loader.num_workers=0",
])
datamodule = instantiate_datamodule(config)
datamodule.setup("fit")
print(datamodule.data_spec)
batch = next(iter(datamodule.train_dataloader()))
for key in ("condition", "target", "condition_mask", "target_mask"):
    print(key, tuple(batch[key].shape))

The default ERA5 condition has 23 channels before model-specific masks and helpers. The data contract describes each field.

Run one training and validation batch

WANDB_DISABLED=true uv run geo2wf-train \
  data=geo_sar_common10_era5 model=deterministic_residual \
  data.root=/path/to/geo_sar \
  data.stats_file=/path/to/geo_sar/stats.json \
  data.loader.num_workers=0 \
  trainer.accelerator=cpu trainer.devices=1 \
  trainer.max_epochs=1 \
  trainer.limit_train_batches=1 trainer.limit_val_batches=1 \
  trainer.enable_checkpointing=false

The printed run directory under logs/ contains resolved-config.yaml, run-manifest.json, and metrics/metrics.csv. Check that train/loss and val/loss are finite. This checks local data/model compatibility; it does not reproduce the paper's trained models. Continue with training and checkpoints.