From 6301adb96baf9cf50eca81785ef086c0168a46d6 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 13:39:12 +0000 Subject: [PATCH 01/88] first attempt at implementing aggregate loss --- .../training/config/temporal_downscaler.yaml | 17 ++ .../src/anemoi/training/losses/__init__.py | 2 + .../src/anemoi/training/losses/aggregate.py | 107 ++++++++++ .../tests/unit/losses/test_aggregate_loss.py | 195 ++++++++++++++++++ 4 files changed, 321 insertions(+) create mode 100644 training/src/anemoi/training/losses/aggregate.py create mode 100644 training/tests/unit/losses/test_aggregate_loss.py diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index 2717f69856..c53b642851 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -23,3 +23,20 @@ diagnostics: plot: callbacks: [] callbacks: [] + +training: + training_loss: + datasets: + data: + _target_: anemoi.training.losses.CombinedLoss + loss_weights: [1.0, 1.0] + losses: + - _target_: anemoi.training.losses.MSELoss + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False + - _target_: anemoi.training.losses.AggregateLossWrapper + aggregation_types: [mean, diff] + loss_fn: + _target_: anemoi.training.losses.MSELoss + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False diff --git a/training/src/anemoi/training/losses/__init__.py b/training/src/anemoi/training/losses/__init__.py index 902b178836..224fa56904 100644 --- a/training/src/anemoi/training/losses/__init__.py +++ b/training/src/anemoi/training/losses/__init__.py @@ -7,6 +7,7 @@ # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. +from .aggregate import AggregateLossWrapper from .combined import CombinedLoss from .huber import HuberLoss from .kcrps import AlmostFairKernelCRPS @@ -26,6 +27,7 @@ from .weighted_mse import WeightedMSELoss __all__ = [ + "AggregateLossWrapper", "AlmostFairKernelCRPS", "CombinedLoss", "FourierCorrelationLoss", diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py new file mode 100644 index 0000000000..730f5cb791 --- /dev/null +++ b/training/src/anemoi/training/losses/aggregate.py @@ -0,0 +1,107 @@ +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING + +import torch +from torch.distributed.distributed_c10d import ProcessGroup + +from anemoi.training.losses.base import BaseLoss + +if TYPE_CHECKING: + pass + +LOGGER = logging.getLogger(__name__) + + +class AggregateLossWrapper(BaseLoss): + """Wraps a base loss and applies it to time-aggregated predictions. + + For each aggregation type in ``aggregation_types``, the wrapper + transforms ``pred`` (shape ``(bs, time, ens, latlon, nvar)``) and + ``target`` (shape ``(bs, time, latlon, nvar)``) before delegating to + the inner ``loss_fn``. Supported aggregation types: + + - ``"diff"`` – temporal differences (``pred[:, 1:] - pred[:, :-1]``) + - ``"mean"``, ``"min"``, ``"max"`` – reduction over the time dimension + """ + + def __init__( + self, + aggregation_types: list[str], + loss_fn: BaseLoss, + ignore_nans: bool = False, + ) -> None: + super().__init__(ignore_nans=ignore_nans) + self.aggregation_types = aggregation_types + self.loss_fn = loss_fn + + def forward( + self, + pred: torch.Tensor, + target: torch.Tensor, + squash: bool = True, + *, + scaler_indices: tuple[int, ...] | None = None, + without_scalers: list[str] | list[int] | None = None, + grid_shard_slice: slice | None = None, + group: ProcessGroup | None = None, + squash_mode: str = "avg", + **kwargs, + ) -> torch.Tensor: + """Compute the aggregate loss over all aggregation types. + + Parameters + ---------- + pred : torch.Tensor + Prediction tensor, shape ``(bs, time, ens, latlon, nvar)``. + target : torch.Tensor + Target tensor, shape ``(bs, time, latlon, nvar)``. + squash : bool, optional + Average the variable dimension, by default ``True``. + scaler_indices : tuple[int, ...] | None, optional + Indices to subset the scaler, by default ``None``. + without_scalers : list[str] | list[int] | None, optional + Scalers to exclude, by default ``None``. + grid_shard_slice : slice | None, optional + Grid shard slice, by default ``None``. + group : ProcessGroup | None, optional + Distributed group for reduction, by default ``None``. + squash_mode : str, optional + Variable-dimension reduction mode, by default ``"avg"``. + + Returns + ------- + torch.Tensor + Accumulated loss across all aggregation types. + """ + loss = torch.zeros(1, dtype=pred.dtype, device=pred.device, requires_grad=False) + + shared_kwargs = dict( + squash=squash, + scaler_indices=scaler_indices, + without_scalers=without_scalers, + grid_shard_slice=grid_shard_slice, + group=group, + squash_mode=squash_mode, + **kwargs, + ) + + for agg_op in self.aggregation_types: + if agg_op == "diff": + pred_agg = pred[:, 1:, ...] - pred[:, :-1, ...] # (bs, time-1, ens, latlon, nvar) + target_agg = target[:, 1:, ...] - target[:, :-1, ...] # (bs, time-1, latlon, nvar) + elif agg_op in {"mean", "min", "max"}: + agg_fn = getattr(torch, agg_op) + pred_agg = agg_fn(pred, dim=1) # (bs, ens, latlon, nvar) + target_agg = agg_fn(target, dim=1) # (bs, latlon, nvar) + if agg_op in {"max", "min"}: + pred_agg = pred_agg[0] # discard indices + target_agg = target_agg[0] + else: + msg = f"Unknown aggregation type '{agg_op}'. Supported: 'diff', 'mean', 'min', 'max'." + raise ValueError(msg) + + loss = loss + self.loss_fn(pred_agg, target_agg, **shared_kwargs) + + return loss \ No newline at end of file diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py new file mode 100644 index 0000000000..effd886cdd --- /dev/null +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -0,0 +1,195 @@ +# (C) Copyright 2026 Anemoi contributors. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities +# granted to it by virtue of its status as an intergovernmental organisation +# nor does it submit to any jurisdiction. + +import pytest +import torch + +from anemoi.training.losses.aggregate import AggregateLossWrapper +from anemoi.training.losses.base import BaseLoss +from anemoi.training.losses.base import FunctionalLoss +from anemoi.training.utils.enums import TensorDim + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +class MAELossFn(FunctionalLoss): + """Minimal MAE-style functional loss for testing.""" + + def calculate_difference(self, pred: torch.Tensor, target: torch.Tensor) -> torch.Tensor: + return torch.abs(pred - target) + + +def _make_loss() -> FunctionalLoss: + """Return an MAE loss with a unit grid scaler (4 grid points).""" + loss = MAELossFn() + loss.add_scaler(TensorDim.GRID, torch.ones(4), name="unit_grid") + return loss + + +# Shapes used throughout: (bs=1, time=3, ens=1, latlon=4, nvar=2) +BS, TIME, ENS, LATLON, NVAR = 1, 3, 1, 4, 2 + + +@pytest.fixture +def pred() -> torch.Tensor: + return torch.rand(BS, TIME, ENS, LATLON, NVAR) + + +@pytest.fixture +def target() -> torch.Tensor: + return torch.rand(BS, TIME, LATLON, NVAR) + + +# --------------------------------------------------------------------------- +# Construction +# --------------------------------------------------------------------------- + +def test_is_base_loss() -> None: + wrapper = AggregateLossWrapper(["mean"], _make_loss()) + assert isinstance(wrapper, BaseLoss) + + +def test_stores_loss_fn_and_agg_types() -> None: + inner = _make_loss() + wrapper = AggregateLossWrapper(["mean", "diff"], inner) + assert wrapper.loss_fn is inner + assert wrapper.aggregation_types == ["mean", "diff"] + + +# --------------------------------------------------------------------------- +# Output shape / type +# --------------------------------------------------------------------------- + +@pytest.mark.parametrize("agg_op", ["mean", "min", "max", "diff"]) +def test_returns_scalar_tensor(agg_op: str, pred: torch.Tensor, target: torch.Tensor) -> None: + wrapper = AggregateLossWrapper([agg_op], _make_loss()) + result = wrapper(pred, target) + assert isinstance(result, torch.Tensor) + assert result.numel() == 1 + + +def test_multiple_agg_ops_return_scalar(pred: torch.Tensor, target: torch.Tensor) -> None: + wrapper = AggregateLossWrapper(["mean", "max", "diff"], _make_loss()) + result = wrapper(pred, target) + assert result.numel() == 1 + + +# --------------------------------------------------------------------------- +# Empty aggregation list +# --------------------------------------------------------------------------- + +def test_empty_aggregation_returns_zero(pred: torch.Tensor, target: torch.Tensor) -> None: + wrapper = AggregateLossWrapper([], _make_loss()) + result = wrapper(pred, target) + assert torch.allclose(result, torch.zeros(1)) + + +# --------------------------------------------------------------------------- +# Correctness: perfect predictions yield zero loss +# --------------------------------------------------------------------------- + +@pytest.mark.parametrize("agg_op", ["mean", "min", "max", "diff"]) +def test_zero_loss_for_perfect_predictions(agg_op: str) -> None: + x = torch.rand(BS, TIME, ENS, LATLON, NVAR) + # target matches pred (broadcast ens dimension away) + perfect_target = x[:, :, 0, :, :] # (bs, time, latlon, nvar) + wrapper = AggregateLossWrapper([agg_op], _make_loss()) + result = wrapper(x, perfect_target) + assert torch.allclose(result, torch.zeros(1), atol=1e-6), f"{agg_op}: expected zero loss for perfect predictions" + + +# --------------------------------------------------------------------------- +# Correctness: accumulation across multiple aggregation types +# --------------------------------------------------------------------------- + +def test_loss_accumulates_across_agg_ops(pred: torch.Tensor, target: torch.Tensor) -> None: + """Combined wrapper loss equals sum of individual wrapper losses.""" + inner = _make_loss() + + wrapper_mean = AggregateLossWrapper(["mean"], inner) + wrapper_diff = AggregateLossWrapper(["diff"], inner) + wrapper_both = AggregateLossWrapper(["mean", "diff"], inner) + + loss_mean = wrapper_mean(pred, target) + loss_diff = wrapper_diff(pred, target) + loss_both = wrapper_both(pred, target) + + assert torch.allclose(loss_both, loss_mean + loss_diff, atol=1e-6) + + +# --------------------------------------------------------------------------- +# Correctness: "diff" aggregation uses temporal differences +# --------------------------------------------------------------------------- + +def test_diff_aggregation_computes_temporal_differences() -> None: + """The diff wrapper should apply loss on (pred[:,1:]-pred[:,:-1]) vs (target[:,1:]-target[:,:-1]).""" + inner = _make_loss() + + pred = torch.rand(BS, TIME, ENS, LATLON, NVAR) + target = torch.rand(BS, TIME, LATLON, NVAR) + + pred_diff = pred[:, 1:, ...] - pred[:, :-1, ...] + target_diff = target[:, 1:, ...] - target[:, :-1, ...] + + wrapper_diff = AggregateLossWrapper(["diff"], inner) + expected = inner(pred_diff, target_diff) + result = wrapper_diff(pred, target) + + assert torch.allclose(result, expected, atol=1e-6) + + +# --------------------------------------------------------------------------- +# Correctness: "mean"/"min"/"max" aggregation reduces over time dim +# --------------------------------------------------------------------------- + +@pytest.mark.parametrize("agg_op", ["mean", "min", "max"]) +def test_reduction_aggregation_reduces_time_dim(agg_op: str) -> None: + inner = _make_loss() + pred = torch.rand(BS, TIME, ENS, LATLON, NVAR) + target = torch.rand(BS, TIME, LATLON, NVAR) + + agg_fn = getattr(torch, agg_op) + pred_agg = agg_fn(pred, dim=1) + target_agg = agg_fn(target, dim=1) + if agg_op in {"min", "max"}: + pred_agg = pred_agg[0] + target_agg = target_agg[0] + + expected = inner(pred_agg, target_agg) + result = AggregateLossWrapper([agg_op], inner)(pred, target) + + assert torch.allclose(result, expected, atol=1e-6) + + +# --------------------------------------------------------------------------- +# Unknown aggregation type raises ValueError +# --------------------------------------------------------------------------- + +def test_unknown_agg_op_raises(pred: torch.Tensor, target: torch.Tensor) -> None: + wrapper = AggregateLossWrapper(["sum"], _make_loss()) + with pytest.raises(ValueError, match="Unknown aggregation type"): + wrapper(pred, target) + + +# --------------------------------------------------------------------------- +# ignore_nans flag is forwarded to BaseLoss +# --------------------------------------------------------------------------- + +def test_ignore_nans_flag() -> None: + wrapper = AggregateLossWrapper(["mean"], _make_loss(), ignore_nans=True) + assert wrapper.avg_function is torch.nanmean + assert wrapper.sum_function is torch.nansum + + +def test_default_no_ignore_nans() -> None: + wrapper = AggregateLossWrapper(["mean"], _make_loss()) + assert wrapper.avg_function is torch.mean + assert wrapper.sum_function is torch.sum From b83e921e80239040ec743671c71d1b03a0135185 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:45:08 +0000 Subject: [PATCH 02/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/src/anemoi/training/losses/aggregate.py | 5 +---- training/tests/unit/losses/test_aggregate_loss.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 730f5cb791..155c2dcc60 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -1,15 +1,12 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING import torch from torch.distributed.distributed_c10d import ProcessGroup from anemoi.training.losses.base import BaseLoss -if TYPE_CHECKING: - pass LOGGER = logging.getLogger(__name__) @@ -104,4 +101,4 @@ def forward( loss = loss + self.loss_fn(pred_agg, target_agg, **shared_kwargs) - return loss \ No newline at end of file + return loss diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index effd886cdd..1c9ea44df7 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -15,11 +15,11 @@ from anemoi.training.losses.base import FunctionalLoss from anemoi.training.utils.enums import TensorDim - # --------------------------------------------------------------------------- # Helpers # --------------------------------------------------------------------------- + class MAELossFn(FunctionalLoss): """Minimal MAE-style functional loss for testing.""" @@ -52,6 +52,7 @@ def target() -> torch.Tensor: # Construction # --------------------------------------------------------------------------- + def test_is_base_loss() -> None: wrapper = AggregateLossWrapper(["mean"], _make_loss()) assert isinstance(wrapper, BaseLoss) @@ -68,6 +69,7 @@ def test_stores_loss_fn_and_agg_types() -> None: # Output shape / type # --------------------------------------------------------------------------- + @pytest.mark.parametrize("agg_op", ["mean", "min", "max", "diff"]) def test_returns_scalar_tensor(agg_op: str, pred: torch.Tensor, target: torch.Tensor) -> None: wrapper = AggregateLossWrapper([agg_op], _make_loss()) @@ -86,6 +88,7 @@ def test_multiple_agg_ops_return_scalar(pred: torch.Tensor, target: torch.Tensor # Empty aggregation list # --------------------------------------------------------------------------- + def test_empty_aggregation_returns_zero(pred: torch.Tensor, target: torch.Tensor) -> None: wrapper = AggregateLossWrapper([], _make_loss()) result = wrapper(pred, target) @@ -96,6 +99,7 @@ def test_empty_aggregation_returns_zero(pred: torch.Tensor, target: torch.Tensor # Correctness: perfect predictions yield zero loss # --------------------------------------------------------------------------- + @pytest.mark.parametrize("agg_op", ["mean", "min", "max", "diff"]) def test_zero_loss_for_perfect_predictions(agg_op: str) -> None: x = torch.rand(BS, TIME, ENS, LATLON, NVAR) @@ -110,6 +114,7 @@ def test_zero_loss_for_perfect_predictions(agg_op: str) -> None: # Correctness: accumulation across multiple aggregation types # --------------------------------------------------------------------------- + def test_loss_accumulates_across_agg_ops(pred: torch.Tensor, target: torch.Tensor) -> None: """Combined wrapper loss equals sum of individual wrapper losses.""" inner = _make_loss() @@ -129,6 +134,7 @@ def test_loss_accumulates_across_agg_ops(pred: torch.Tensor, target: torch.Tenso # Correctness: "diff" aggregation uses temporal differences # --------------------------------------------------------------------------- + def test_diff_aggregation_computes_temporal_differences() -> None: """The diff wrapper should apply loss on (pred[:,1:]-pred[:,:-1]) vs (target[:,1:]-target[:,:-1]).""" inner = _make_loss() @@ -150,6 +156,7 @@ def test_diff_aggregation_computes_temporal_differences() -> None: # Correctness: "mean"/"min"/"max" aggregation reduces over time dim # --------------------------------------------------------------------------- + @pytest.mark.parametrize("agg_op", ["mean", "min", "max"]) def test_reduction_aggregation_reduces_time_dim(agg_op: str) -> None: inner = _make_loss() @@ -173,6 +180,7 @@ def test_reduction_aggregation_reduces_time_dim(agg_op: str) -> None: # Unknown aggregation type raises ValueError # --------------------------------------------------------------------------- + def test_unknown_agg_op_raises(pred: torch.Tensor, target: torch.Tensor) -> None: wrapper = AggregateLossWrapper(["sum"], _make_loss()) with pytest.raises(ValueError, match="Unknown aggregation type"): @@ -183,6 +191,7 @@ def test_unknown_agg_op_raises(pred: torch.Tensor, target: torch.Tensor) -> None # ignore_nans flag is forwarded to BaseLoss # --------------------------------------------------------------------------- + def test_ignore_nans_flag() -> None: wrapper = AggregateLossWrapper(["mean"], _make_loss(), ignore_nans=True) assert wrapper.avg_function is torch.nanmean From 6377c1abdf9e27f70e1d71ad74ce8fa5844d8b04 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 13:53:07 +0000 Subject: [PATCH 03/88] tidy up doc string --- training/src/anemoi/training/losses/aggregate.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 155c2dcc60..0886b6e696 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -14,13 +14,10 @@ class AggregateLossWrapper(BaseLoss): """Wraps a base loss and applies it to time-aggregated predictions. - For each aggregation type in ``aggregation_types``, the wrapper - transforms ``pred`` (shape ``(bs, time, ens, latlon, nvar)``) and - ``target`` (shape ``(bs, time, latlon, nvar)``) before delegating to - the inner ``loss_fn``. Supported aggregation types: + Supported aggregation types: - ``"diff"`` – temporal differences (``pred[:, 1:] - pred[:, :-1]``) - - ``"mean"``, ``"min"``, ``"max"`` – reduction over the time dimension + - ``"mean"``, ``"min"``, ``"max"`` – applied over the time window """ def __init__( From 3b8769b99363daafc34bb4b04ec0beb9d16a573c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:53:47 +0000 Subject: [PATCH 04/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/src/anemoi/training/losses/aggregate.py | 1 - 1 file changed, 1 deletion(-) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 0886b6e696..7e0ed70138 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -7,7 +7,6 @@ from anemoi.training.losses.base import BaseLoss - LOGGER = logging.getLogger(__name__) From eef75dd865a9c5d3cee1f87fe013e50319bd0050 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 15:06:38 +0000 Subject: [PATCH 05/88] fix tests --- .../src/anemoi/training/losses/aggregate.py | 11 ++- training/src/anemoi/training/losses/base.py | 4 + .../tests/unit/losses/test_aggregate_loss.py | 82 ++++++++++++++++++- 3 files changed, 89 insertions(+), 8 deletions(-) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 0886b6e696..75731e1658 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -87,11 +87,14 @@ def forward( target_agg = target[:, 1:, ...] - target[:, :-1, ...] # (bs, time-1, latlon, nvar) elif agg_op in {"mean", "min", "max"}: agg_fn = getattr(torch, agg_op) - pred_agg = agg_fn(pred, dim=1) # (bs, ens, latlon, nvar) - target_agg = agg_fn(target, dim=1) # (bs, latlon, nvar) + pred_result = agg_fn(pred, dim=1, keepdim=True) + target_result = agg_fn(target, dim=1, keepdim=True) if agg_op in {"max", "min"}: - pred_agg = pred_agg[0] # discard indices - target_agg = target_agg[0] + pred_agg = pred_result.values # (bs, 1, ens, latlon, nvar) + target_agg = target_result.values # (bs, 1, latlon, nvar) + else: + pred_agg = pred_result # (bs, 1, ens, latlon, nvar) + target_agg = target_result # (bs, 1, latlon, nvar) else: msg = f"Unknown aggregation type '{agg_op}'. Supported: 'diff', 'mean', 'min', 'max'." raise ValueError(msg) diff --git a/training/src/anemoi/training/losses/base.py b/training/src/anemoi/training/losses/base.py index bd923d69f8..c2a8fdf8f8 100644 --- a/training/src/anemoi/training/losses/base.py +++ b/training/src/anemoi/training/losses/base.py @@ -339,6 +339,10 @@ def forward( Weighted loss """ is_sharded = grid_shard_slice is not None + # When target has one fewer dimension than pred, insert the ensemble dim so + # broadcasting aligns (bs, t, 1, latlon, nvar) against (bs, t, ens, latlon, nvar). + if target.ndim == pred.ndim - 1: + target = target.unsqueeze(TensorDim.ENSEMBLE_DIM) out = self.calculate_difference(pred, target) out = self.scale(out, scaler_indices, without_scalers=without_scalers, grid_shard_slice=grid_shard_slice) return self.reduce(out, squash, group=group if is_sharded else None, squash_mode=squash_mode) diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index 1c9ea44df7..77af9c2893 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -13,6 +13,7 @@ from anemoi.training.losses.aggregate import AggregateLossWrapper from anemoi.training.losses.base import BaseLoss from anemoi.training.losses.base import FunctionalLoss +from anemoi.training.losses.kcrps import AlmostFairKernelCRPS from anemoi.training.utils.enums import TensorDim # --------------------------------------------------------------------------- @@ -34,8 +35,17 @@ def _make_loss() -> FunctionalLoss: return loss +def _make_crps_loss() -> AlmostFairKernelCRPS: + """Return an AlmostFairKernelCRPS loss with a unit grid scaler (4 grid points).""" + loss = AlmostFairKernelCRPS(no_autocast=False) + loss.add_scaler(TensorDim.GRID, torch.ones(4), name="unit_grid") + return loss + + # Shapes used throughout: (bs=1, time=3, ens=1, latlon=4, nvar=2) BS, TIME, ENS, LATLON, NVAR = 1, 3, 1, 4, 2 +# CRPS requires ens > 1 +ENS_CRPS = 3 @pytest.fixture @@ -164,11 +174,14 @@ def test_reduction_aggregation_reduces_time_dim(agg_op: str) -> None: target = torch.rand(BS, TIME, LATLON, NVAR) agg_fn = getattr(torch, agg_op) - pred_agg = agg_fn(pred, dim=1) - target_agg = agg_fn(target, dim=1) + pred_result = agg_fn(pred, dim=1, keepdim=True) + target_result = agg_fn(target, dim=1, keepdim=True) if agg_op in {"min", "max"}: - pred_agg = pred_agg[0] - target_agg = target_agg[0] + pred_agg = pred_result.values + target_agg = target_result.values + else: + pred_agg = pred_result + target_agg = target_result expected = inner(pred_agg, target_agg) result = AggregateLossWrapper([agg_op], inner)(pred, target) @@ -176,6 +189,67 @@ def test_reduction_aggregation_reduces_time_dim(agg_op: str) -> None: assert torch.allclose(result, expected, atol=1e-6) +# --------------------------------------------------------------------------- +# CRPS tests +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize("agg_op", ["mean", "min", "max", "diff"]) +def test_crps_returns_scalar_tensor(agg_op: str) -> None: + """AggregateLossWrapper with AlmostFairKernelCRPS should return a scalar for each agg type.""" + pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) + target = torch.rand(BS, TIME, LATLON, NVAR) + wrapper = AggregateLossWrapper([agg_op], _make_crps_loss()) + result = wrapper(pred, target) + assert isinstance(result, torch.Tensor) + assert result.numel() == 1 + + +def test_crps_multiple_agg_ops_return_scalar() -> None: + """Multiple aggregation types should accumulate into a single scalar.""" + pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) + target = torch.rand(BS, TIME, LATLON, NVAR) + wrapper = AggregateLossWrapper(["mean", "diff"], _make_crps_loss()) + result = wrapper(pred, target) + assert result.numel() == 1 + + +def test_crps_loss_accumulates_across_agg_ops() -> None: + """Combined CRPS wrapper loss equals sum of individual wrapper losses.""" + inner = _make_crps_loss() + pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) + target = torch.rand(BS, TIME, LATLON, NVAR) + + loss_mean = AggregateLossWrapper(["mean"], inner)(pred, target) + loss_diff = AggregateLossWrapper(["diff"], inner)(pred, target) + loss_both = AggregateLossWrapper(["mean", "diff"], inner)(pred, target) + + assert torch.allclose(loss_both, loss_mean + loss_diff, atol=1e-6) + + +@pytest.mark.parametrize("agg_op", ["mean", "min", "max"]) +def test_crps_reduction_reduces_time_dim(agg_op: str) -> None: + """CRPS wrapper with time-reduction passes keepdim=True aggregated tensors to inner loss.""" + inner = _make_crps_loss() + pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) + target = torch.rand(BS, TIME, LATLON, NVAR) + + agg_fn = getattr(torch, agg_op) + pred_result = agg_fn(pred, dim=1, keepdim=True) + target_result = agg_fn(target, dim=1, keepdim=True) + if agg_op in {"min", "max"}: + pred_agg = pred_result.values + target_agg = target_result.values + else: + pred_agg = pred_result + target_agg = target_result + + expected = inner(pred_agg, target_agg, squash_mode="avg") + result = AggregateLossWrapper([agg_op], inner)(pred, target) + + assert torch.allclose(result, expected, atol=1e-6) + + # --------------------------------------------------------------------------- # Unknown aggregation type raises ValueError # --------------------------------------------------------------------------- From febab8542fff2a250d518e2d26adeb7a7346f7ad Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:09:44 +0000 Subject: [PATCH 06/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/src/anemoi/training/losses/aggregate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 0db9d697f8..b4aa83b73e 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -89,10 +89,10 @@ def forward( pred_result = agg_fn(pred, dim=1, keepdim=True) target_result = agg_fn(target, dim=1, keepdim=True) if agg_op in {"max", "min"}: - pred_agg = pred_result.values # (bs, 1, ens, latlon, nvar) + pred_agg = pred_result.values # (bs, 1, ens, latlon, nvar) target_agg = target_result.values # (bs, 1, latlon, nvar) else: - pred_agg = pred_result # (bs, 1, ens, latlon, nvar) + pred_agg = pred_result # (bs, 1, ens, latlon, nvar) target_agg = target_result # (bs, 1, latlon, nvar) else: msg = f"Unknown aggregation type '{agg_op}'. Supported: 'diff', 'mean', 'min', 'max'." From ebd75f9abf3521b8460331ab28d77e7ffbca6914 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 15:35:39 +0000 Subject: [PATCH 07/88] update schema --- training/src/anemoi/training/losses/aggregate.py | 9 ++++++--- training/src/anemoi/training/schemas/training.py | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 0db9d697f8..a1a617b259 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -1,12 +1,15 @@ from __future__ import annotations import logging +from typing import TYPE_CHECKING import torch -from torch.distributed.distributed_c10d import ProcessGroup from anemoi.training.losses.base import BaseLoss +if TYPE_CHECKING: + from torch.distributed.distributed_c10d import ProcessGroup + LOGGER = logging.getLogger(__name__) @@ -15,8 +18,8 @@ class AggregateLossWrapper(BaseLoss): Supported aggregation types: - - ``"diff"`` – temporal differences (``pred[:, 1:] - pred[:, :-1]``) - - ``"mean"``, ``"min"``, ``"max"`` – applied over the time window + - ``"diff"`` - temporal differences (``pred[:, 1:] - pred[:, :-1]``) + - ``"mean"``, ``"min"``, ``"max"`` - applied over the time window """ def __init__( diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 20268c2fc9..dad840a945 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -254,6 +254,7 @@ class ImplementedLossesUsingBaseLossSchema(StrEnum): logcosh = "anemoi.training.losses.LogCoshLoss" huber = "anemoi.training.losses.HuberLoss" combined = "anemoi.training.losses.combined.CombinedLoss" + aggregate = "anemoi.training.losses.AggregateLossWrapper" fcl = "anemoi.training.losses.spectral.FourierCorrelationLoss" lsd = "anemoi.training.losses.spectral.LogSpectralDistance" logfft2d = "anemoi.training.losses.spectral.LogFFT2Distance" @@ -306,6 +307,18 @@ class HuberLossSchema(BaseLossSchema): "Threshold for Huber loss." +class AggregateLossWrapperSchema(BaseModel): + target_: Literal["anemoi.training.losses.AggregateLossWrapper"] = Field(..., alias="_target_") + aggregation_types: list[Literal["diff", "mean", "min", "max"]] = Field(min_length=1) + "Aggregation operations to apply over the time dimension before computing the loss." + loss_fn: BaseLossSchema + "Inner loss function applied to each aggregated output." + scalers: list[str] = Field(default_factory=list) + "Scalers to include in loss calculation." + ignore_nans: bool = False + "Allow nans in the loss and apply methods ignoring nans for measuring the loss." + + class SpectralLossSchema(BaseLossSchema): """Spectral loss class.""" @@ -319,7 +332,7 @@ class Config(BaseModel.Config): class CombinedLossSchema(BaseLossSchema): - losses: list[BaseLossSchema | SpectralLossSchema] = Field(min_length=1) + losses: list[BaseLossSchema | SpectralLossSchema | AggregateLossWrapperSchema] = Field(min_length=1) "Losses to combine, can be any of the normal losses." loss_weights: list[int | float] | None = None "Weightings of losses, if not set, all losses are weighted equally." @@ -349,6 +362,7 @@ def check_length_of_weights_and_losses(self) -> Self: LossSchemas = ( BaseLossSchema | HuberLossSchema + | AggregateLossWrapperSchema | CombinedLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema From 63a0ff704028f2f3037aec0f029c856f6ddd71c4 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 15:50:59 +0000 Subject: [PATCH 08/88] update name --- .../training/config/temporal_downscaler.yaml | 4 +- .../src/anemoi/training/losses/__init__.py | 4 +- .../src/anemoi/training/losses/aggregate.py | 14 +++--- .../tests/unit/losses/test_aggregate_loss.py | 48 +++++++++---------- 4 files changed, 36 insertions(+), 34 deletions(-) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index c53b642851..e7b3fdac0e 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -34,8 +34,8 @@ training: - _target_: anemoi.training.losses.MSELoss scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] ignore_nans: False - - _target_: anemoi.training.losses.AggregateLossWrapper - aggregation_types: [mean, diff] + - _target_: anemoi.training.losses.TimeAggregateLossWrapper + time_aggregation_types: [mean, diff] loss_fn: _target_: anemoi.training.losses.MSELoss scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] diff --git a/training/src/anemoi/training/losses/__init__.py b/training/src/anemoi/training/losses/__init__.py index 224fa56904..4556bfab2a 100644 --- a/training/src/anemoi/training/losses/__init__.py +++ b/training/src/anemoi/training/losses/__init__.py @@ -7,7 +7,7 @@ # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. -from .aggregate import AggregateLossWrapper +from .aggregate import TimeAggregateLossWrapper from .combined import CombinedLoss from .huber import HuberLoss from .kcrps import AlmostFairKernelCRPS @@ -27,7 +27,7 @@ from .weighted_mse import WeightedMSELoss __all__ = [ - "AggregateLossWrapper", + "TimeAggregateLossWrapper", "AlmostFairKernelCRPS", "CombinedLoss", "FourierCorrelationLoss", diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 41509c53d7..b742df6c9e 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -13,10 +13,10 @@ LOGGER = logging.getLogger(__name__) -class AggregateLossWrapper(BaseLoss): +class TimeAggregateLossWrapper(BaseLoss): """Wraps a base loss and applies it to time-aggregated predictions. - Supported aggregation types: + Supported time aggregation types: - ``"diff"`` - temporal differences (``pred[:, 1:] - pred[:, :-1]``) - ``"mean"``, ``"min"``, ``"max"`` - applied over the time window @@ -24,12 +24,12 @@ class AggregateLossWrapper(BaseLoss): def __init__( self, - aggregation_types: list[str], + time_aggregation_types: list[str], loss_fn: BaseLoss, ignore_nans: bool = False, ) -> None: super().__init__(ignore_nans=ignore_nans) - self.aggregation_types = aggregation_types + self.time_aggregation_types = time_aggregation_types self.loss_fn = loss_fn def forward( @@ -45,7 +45,7 @@ def forward( squash_mode: str = "avg", **kwargs, ) -> torch.Tensor: - """Compute the aggregate loss over all aggregation types. + """Compute the time aggregate loss over all time aggregation types. Parameters ---------- @@ -71,6 +71,8 @@ def forward( torch.Tensor Accumulated loss across all aggregation types. """ + + assert pred.shape[1] > 1, "TimeAggregateLossWrapper requires an output time dimension of size > 1 for aggregation." loss = torch.zeros(1, dtype=pred.dtype, device=pred.device, requires_grad=False) shared_kwargs = dict( @@ -83,7 +85,7 @@ def forward( **kwargs, ) - for agg_op in self.aggregation_types: + for agg_op in self.time_aggregation_types: if agg_op == "diff": pred_agg = pred[:, 1:, ...] - pred[:, :-1, ...] # (bs, time-1, ens, latlon, nvar) target_agg = target[:, 1:, ...] - target[:, :-1, ...] # (bs, time-1, latlon, nvar) diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index 77af9c2893..25d7c9928a 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -10,7 +10,7 @@ import pytest import torch -from anemoi.training.losses.aggregate import AggregateLossWrapper +from anemoi.training.losses.aggregate import TimeAggregateLossWrapper from anemoi.training.losses.base import BaseLoss from anemoi.training.losses.base import FunctionalLoss from anemoi.training.losses.kcrps import AlmostFairKernelCRPS @@ -64,15 +64,15 @@ def target() -> torch.Tensor: def test_is_base_loss() -> None: - wrapper = AggregateLossWrapper(["mean"], _make_loss()) + wrapper = TimeAggregateLossWrapper(["mean"], _make_loss()) assert isinstance(wrapper, BaseLoss) def test_stores_loss_fn_and_agg_types() -> None: inner = _make_loss() - wrapper = AggregateLossWrapper(["mean", "diff"], inner) + wrapper = TimeAggregateLossWrapper(["mean", "diff"], inner) assert wrapper.loss_fn is inner - assert wrapper.aggregation_types == ["mean", "diff"] + assert wrapper.time_aggregation_types == ["mean", "diff"] # --------------------------------------------------------------------------- @@ -82,14 +82,14 @@ def test_stores_loss_fn_and_agg_types() -> None: @pytest.mark.parametrize("agg_op", ["mean", "min", "max", "diff"]) def test_returns_scalar_tensor(agg_op: str, pred: torch.Tensor, target: torch.Tensor) -> None: - wrapper = AggregateLossWrapper([agg_op], _make_loss()) + wrapper = TimeAggregateLossWrapper([agg_op], _make_loss()) result = wrapper(pred, target) assert isinstance(result, torch.Tensor) assert result.numel() == 1 def test_multiple_agg_ops_return_scalar(pred: torch.Tensor, target: torch.Tensor) -> None: - wrapper = AggregateLossWrapper(["mean", "max", "diff"], _make_loss()) + wrapper = TimeAggregateLossWrapper(["mean", "max", "diff"], _make_loss()) result = wrapper(pred, target) assert result.numel() == 1 @@ -100,7 +100,7 @@ def test_multiple_agg_ops_return_scalar(pred: torch.Tensor, target: torch.Tensor def test_empty_aggregation_returns_zero(pred: torch.Tensor, target: torch.Tensor) -> None: - wrapper = AggregateLossWrapper([], _make_loss()) + wrapper = TimeAggregateLossWrapper([], _make_loss()) result = wrapper(pred, target) assert torch.allclose(result, torch.zeros(1)) @@ -115,13 +115,13 @@ def test_zero_loss_for_perfect_predictions(agg_op: str) -> None: x = torch.rand(BS, TIME, ENS, LATLON, NVAR) # target matches pred (broadcast ens dimension away) perfect_target = x[:, :, 0, :, :] # (bs, time, latlon, nvar) - wrapper = AggregateLossWrapper([agg_op], _make_loss()) + wrapper = TimeAggregateLossWrapper([agg_op], _make_loss()) result = wrapper(x, perfect_target) assert torch.allclose(result, torch.zeros(1), atol=1e-6), f"{agg_op}: expected zero loss for perfect predictions" # --------------------------------------------------------------------------- -# Correctness: accumulation across multiple aggregation types +# Correctness: accumulation across multiple time aggregation types # --------------------------------------------------------------------------- @@ -129,9 +129,9 @@ def test_loss_accumulates_across_agg_ops(pred: torch.Tensor, target: torch.Tenso """Combined wrapper loss equals sum of individual wrapper losses.""" inner = _make_loss() - wrapper_mean = AggregateLossWrapper(["mean"], inner) - wrapper_diff = AggregateLossWrapper(["diff"], inner) - wrapper_both = AggregateLossWrapper(["mean", "diff"], inner) + wrapper_mean = TimeAggregateLossWrapper(["mean"], inner) + wrapper_diff = TimeAggregateLossWrapper(["diff"], inner) + wrapper_both = TimeAggregateLossWrapper(["mean", "diff"], inner) loss_mean = wrapper_mean(pred, target) loss_diff = wrapper_diff(pred, target) @@ -155,7 +155,7 @@ def test_diff_aggregation_computes_temporal_differences() -> None: pred_diff = pred[:, 1:, ...] - pred[:, :-1, ...] target_diff = target[:, 1:, ...] - target[:, :-1, ...] - wrapper_diff = AggregateLossWrapper(["diff"], inner) + wrapper_diff = TimeAggregateLossWrapper(["diff"], inner) expected = inner(pred_diff, target_diff) result = wrapper_diff(pred, target) @@ -184,7 +184,7 @@ def test_reduction_aggregation_reduces_time_dim(agg_op: str) -> None: target_agg = target_result expected = inner(pred_agg, target_agg) - result = AggregateLossWrapper([agg_op], inner)(pred, target) + result = TimeAggregateLossWrapper([agg_op], inner)(pred, target) assert torch.allclose(result, expected, atol=1e-6) @@ -196,10 +196,10 @@ def test_reduction_aggregation_reduces_time_dim(agg_op: str) -> None: @pytest.mark.parametrize("agg_op", ["mean", "min", "max", "diff"]) def test_crps_returns_scalar_tensor(agg_op: str) -> None: - """AggregateLossWrapper with AlmostFairKernelCRPS should return a scalar for each agg type.""" + """TimeAggregateLossWrapper with AlmostFairKernelCRPS should return a scalar for each agg type.""" pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) target = torch.rand(BS, TIME, LATLON, NVAR) - wrapper = AggregateLossWrapper([agg_op], _make_crps_loss()) + wrapper = TimeAggregateLossWrapper([agg_op], _make_crps_loss()) result = wrapper(pred, target) assert isinstance(result, torch.Tensor) assert result.numel() == 1 @@ -209,7 +209,7 @@ def test_crps_multiple_agg_ops_return_scalar() -> None: """Multiple aggregation types should accumulate into a single scalar.""" pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) target = torch.rand(BS, TIME, LATLON, NVAR) - wrapper = AggregateLossWrapper(["mean", "diff"], _make_crps_loss()) + wrapper = TimeAggregateLossWrapper(["mean", "diff"], _make_crps_loss()) result = wrapper(pred, target) assert result.numel() == 1 @@ -220,9 +220,9 @@ def test_crps_loss_accumulates_across_agg_ops() -> None: pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) target = torch.rand(BS, TIME, LATLON, NVAR) - loss_mean = AggregateLossWrapper(["mean"], inner)(pred, target) - loss_diff = AggregateLossWrapper(["diff"], inner)(pred, target) - loss_both = AggregateLossWrapper(["mean", "diff"], inner)(pred, target) + loss_mean = TimeAggregateLossWrapper(["mean"], inner)(pred, target) + loss_diff = TimeAggregateLossWrapper(["diff"], inner)(pred, target) + loss_both = TimeAggregateLossWrapper(["mean", "diff"], inner)(pred, target) assert torch.allclose(loss_both, loss_mean + loss_diff, atol=1e-6) @@ -245,7 +245,7 @@ def test_crps_reduction_reduces_time_dim(agg_op: str) -> None: target_agg = target_result expected = inner(pred_agg, target_agg, squash_mode="avg") - result = AggregateLossWrapper([agg_op], inner)(pred, target) + result = TimeAggregateLossWrapper([agg_op], inner)(pred, target) assert torch.allclose(result, expected, atol=1e-6) @@ -256,7 +256,7 @@ def test_crps_reduction_reduces_time_dim(agg_op: str) -> None: def test_unknown_agg_op_raises(pred: torch.Tensor, target: torch.Tensor) -> None: - wrapper = AggregateLossWrapper(["sum"], _make_loss()) + wrapper = TimeAggregateLossWrapper(["sum"], _make_loss()) with pytest.raises(ValueError, match="Unknown aggregation type"): wrapper(pred, target) @@ -267,12 +267,12 @@ def test_unknown_agg_op_raises(pred: torch.Tensor, target: torch.Tensor) -> None def test_ignore_nans_flag() -> None: - wrapper = AggregateLossWrapper(["mean"], _make_loss(), ignore_nans=True) + wrapper = TimeAggregateLossWrapper(["mean"], _make_loss(), ignore_nans=True) assert wrapper.avg_function is torch.nanmean assert wrapper.sum_function is torch.nansum def test_default_no_ignore_nans() -> None: - wrapper = AggregateLossWrapper(["mean"], _make_loss()) + wrapper = TimeAggregateLossWrapper(["mean"], _make_loss()) assert wrapper.avg_function is torch.mean assert wrapper.sum_function is torch.sum From af56b79833830dba6539af4dbb194b908e6b0646 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:52:03 +0000 Subject: [PATCH 09/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/src/anemoi/training/losses/__init__.py | 2 +- training/src/anemoi/training/losses/aggregate.py | 5 +++-- training/tests/unit/losses/test_aggregate_loss.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/training/src/anemoi/training/losses/__init__.py b/training/src/anemoi/training/losses/__init__.py index 4556bfab2a..83a9a88e5f 100644 --- a/training/src/anemoi/training/losses/__init__.py +++ b/training/src/anemoi/training/losses/__init__.py @@ -27,7 +27,6 @@ from .weighted_mse import WeightedMSELoss __all__ = [ - "TimeAggregateLossWrapper", "AlmostFairKernelCRPS", "CombinedLoss", "FourierCorrelationLoss", @@ -43,6 +42,7 @@ "RMSELoss", "SpectralCRPSLoss", "SpectralL2Loss", + "TimeAggregateLossWrapper", "WeightedMSELoss", "get_loss_function", ] diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index b742df6c9e..a8946f6b89 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -71,8 +71,9 @@ def forward( torch.Tensor Accumulated loss across all aggregation types. """ - - assert pred.shape[1] > 1, "TimeAggregateLossWrapper requires an output time dimension of size > 1 for aggregation." + assert ( + pred.shape[1] > 1 + ), "TimeAggregateLossWrapper requires an output time dimension of size > 1 for aggregation." loss = torch.zeros(1, dtype=pred.dtype, device=pred.device, requires_grad=False) shared_kwargs = dict( diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index 25d7c9928a..834ed6dcdc 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -267,7 +267,7 @@ def test_unknown_agg_op_raises(pred: torch.Tensor, target: torch.Tensor) -> None def test_ignore_nans_flag() -> None: - wrapper = TimeAggregateLossWrapper(["mean"], _make_loss(), ignore_nans=True) + wrapper = TimeAggregateLossWrapper(["mean"], _make_loss(), ignore_nans=True) assert wrapper.avg_function is torch.nanmean assert wrapper.sum_function is torch.nansum From d7432728d5ca9562876167c50b6d498912696c9f Mon Sep 17 00:00:00 2001 From: Mariana Clare <31656450+mc4117@users.noreply.github.com> Date: Thu, 23 Apr 2026 18:49:44 +0200 Subject: [PATCH 10/88] Rename AggregateLossWrapper to TimeAggregateLossWrapper --- training/src/anemoi/training/schemas/training.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index dad840a945..153320b8d2 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -254,7 +254,7 @@ class ImplementedLossesUsingBaseLossSchema(StrEnum): logcosh = "anemoi.training.losses.LogCoshLoss" huber = "anemoi.training.losses.HuberLoss" combined = "anemoi.training.losses.combined.CombinedLoss" - aggregate = "anemoi.training.losses.AggregateLossWrapper" + aggregate = "anemoi.training.losses.TimeAggregateLossWrapper" fcl = "anemoi.training.losses.spectral.FourierCorrelationLoss" lsd = "anemoi.training.losses.spectral.LogSpectralDistance" logfft2d = "anemoi.training.losses.spectral.LogFFT2Distance" @@ -307,12 +307,12 @@ class HuberLossSchema(BaseLossSchema): "Threshold for Huber loss." -class AggregateLossWrapperSchema(BaseModel): - target_: Literal["anemoi.training.losses.AggregateLossWrapper"] = Field(..., alias="_target_") - aggregation_types: list[Literal["diff", "mean", "min", "max"]] = Field(min_length=1) - "Aggregation operations to apply over the time dimension before computing the loss." +class TimeAggregateLossWrapperSchema(BaseModel): + target_: Literal["anemoi.training.losses.TimeAggregateLossWrapper"] = Field(..., alias="_target_") + time_aggregation_types: list[Literal["diff", "mean", "min", "max"]] = Field(min_length=1) + "Time Aggregation operations to apply over the time dimension before computing the loss." loss_fn: BaseLossSchema - "Inner loss function applied to each aggregated output." + "Inner loss function applied to each time aggregated output." scalers: list[str] = Field(default_factory=list) "Scalers to include in loss calculation." ignore_nans: bool = False From aa68344586f86d9fa89365813c931b3e17a6400f Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 16:57:53 +0000 Subject: [PATCH 11/88] fix schema --- training/src/anemoi/training/schemas/training.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 153320b8d2..2eaa94ef91 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -332,7 +332,7 @@ class Config(BaseModel.Config): class CombinedLossSchema(BaseLossSchema): - losses: list[BaseLossSchema | SpectralLossSchema | AggregateLossWrapperSchema] = Field(min_length=1) + losses: list[BaseLossSchema | SpectralLossSchema | TimeAggregateLossWrapperSchema] = Field(min_length=1) "Losses to combine, can be any of the normal losses." loss_weights: list[int | float] | None = None "Weightings of losses, if not set, all losses are weighted equally." @@ -362,7 +362,7 @@ def check_length_of_weights_and_losses(self) -> Self: LossSchemas = ( BaseLossSchema | HuberLossSchema - | AggregateLossWrapperSchema + | TimeAggregateLossWrapperSchema | CombinedLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema From 3746fb36b43d5d47ef677dbd4c383632e8901914 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 17:07:11 +0000 Subject: [PATCH 12/88] fix schema and add restriction --- .../training/config/temporal_downscaler.yaml | 2 +- .../config/temporal_downscaler_ensemble.yaml | 27 ++++++++ .../src/anemoi/training/schemas/training.py | 2 - .../unit/schemas/test_training_schemas.py | 61 ++++++++++++++++++- 4 files changed, 88 insertions(+), 4 deletions(-) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index e7b3fdac0e..13736f5fc5 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -28,7 +28,7 @@ training: training_loss: datasets: data: - _target_: anemoi.training.losses.CombinedLoss + _target_: anemoi.training.losses.combined.CombinedLoss loss_weights: [1.0, 1.0] losses: - _target_: anemoi.training.losses.MSELoss diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index 8baf76b729..931f28b907 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -41,3 +41,30 @@ model: training: ensemble_size_per_device: 2 + training_loss: + datasets: + data: + _target_: anemoi.training.losses.combined.CombinedLoss + loss_weights: [1.0, 0.5] + scalers: [] + losses: + - _target_: anemoi.training.losses.MultiscaleLossWrapper + loss_matrices_path: ${system.input.loss_matrices_path} + loss_matrices: [null] + weights: [1.0] + keep_batch_sharded: ${model.keep_batch_sharded} + per_scale_loss: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + no_autocast: True + alpha: 0.95 + - _target_: anemoi.training.losses.TimeAggregateLossWrapper + time_aggregation_types: [mean, diff] + scalers: [] + loss_fn: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + no_autocast: True + alpha: 0.95 diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 2eaa94ef91..850cf1704b 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -254,7 +254,6 @@ class ImplementedLossesUsingBaseLossSchema(StrEnum): logcosh = "anemoi.training.losses.LogCoshLoss" huber = "anemoi.training.losses.HuberLoss" combined = "anemoi.training.losses.combined.CombinedLoss" - aggregate = "anemoi.training.losses.TimeAggregateLossWrapper" fcl = "anemoi.training.losses.spectral.FourierCorrelationLoss" lsd = "anemoi.training.losses.spectral.LogSpectralDistance" logfft2d = "anemoi.training.losses.spectral.LogFFT2Distance" @@ -362,7 +361,6 @@ def check_length_of_weights_and_losses(self) -> Self: LossSchemas = ( BaseLossSchema | HuberLossSchema - | TimeAggregateLossWrapperSchema | CombinedLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py index ab7bed2a9b..075fad4419 100644 --- a/training/tests/unit/schemas/test_training_schemas.py +++ b/training/tests/unit/schemas/test_training_schemas.py @@ -7,7 +7,66 @@ # granted to it by virtue of its status as an intergovernmental organisation # nor does it submit to any jurisdiction. -from anemoi.training.schemas.training import OptimizerSchema +import pytest +from pydantic import TypeAdapter, ValidationError + +from anemoi.training.schemas.training import CombinedLossSchema, LossSchemas, OptimizerSchema + + +_AGGREGATE_LOSS_CFG = { + "_target_": "anemoi.training.losses.TimeAggregateLossWrapper", + "time_aggregation_types": ["mean", "diff"], + "loss_fn": { + "_target_": "anemoi.training.losses.MSELoss", + "scalers": ["node_weights"], + }, + "scalers": [], +} + +_MSE_CFG = { + "_target_": "anemoi.training.losses.MSELoss", + "scalers": ["node_weights"], +} + + +def test_optimizer_schema_allows_extra_keys() -> None: + """Test that the OptimizerSchema allows extra keys.""" + # Explicitly test for the issue present in (anemoi-core/#885)[https://github.com/ecmwf/anemoi-core/pull/885] + optimizer_config = { + "_target_": "torch.optim.AdamW", + "lr": 0.001, + "weight_decay": 0.01, + "extra_key": "extra_value", # This key is not defined in the schema + } + optimizer_schema = OptimizerSchema(**optimizer_config) + assert optimizer_schema.target_ == "torch.optim.AdamW" + assert optimizer_schema.lr == 0.001 + assert optimizer_schema.weight_decay == 0.01 + assert optimizer_schema.extra_key == "extra_value" + + model_dump = optimizer_schema.model_dump(by_alias=True) + assert model_dump["_target_"] == "torch.optim.AdamW" + assert model_dump["lr"] == 0.001 + assert model_dump["weight_decay"] == 0.01 + assert model_dump["extra_key"] == "extra_value" + + +def test_time_aggregate_loss_rejected_as_standalone() -> None: + """TimeAggregateLossWrapper must not be usable as a top-level training loss.""" + ta = TypeAdapter(LossSchemas) + with pytest.raises(ValidationError): + ta.validate_python(_AGGREGATE_LOSS_CFG) + + +def test_time_aggregate_loss_accepted_inside_combined_loss() -> None: + """TimeAggregateLossWrapper must be valid as a child of CombinedLoss.""" + combined_cfg = { + "_target_": "anemoi.training.losses.combined.CombinedLoss", + "scalers": [], + "losses": [_MSE_CFG, _AGGREGATE_LOSS_CFG], + } + schema = CombinedLossSchema(**combined_cfg) + assert len(schema.losses) == 2 def test_optimizer_schema_allows_extra_keys() -> None: From fd948376b55769dded65b4d114d95e66b75adb1e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 17:07:57 +0000 Subject: [PATCH 13/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/tests/unit/schemas/test_training_schemas.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py index 075fad4419..0407680e1d 100644 --- a/training/tests/unit/schemas/test_training_schemas.py +++ b/training/tests/unit/schemas/test_training_schemas.py @@ -8,10 +8,12 @@ # nor does it submit to any jurisdiction. import pytest -from pydantic import TypeAdapter, ValidationError - -from anemoi.training.schemas.training import CombinedLossSchema, LossSchemas, OptimizerSchema +from pydantic import TypeAdapter +from pydantic import ValidationError +from anemoi.training.schemas.training import CombinedLossSchema +from anemoi.training.schemas.training import LossSchemas +from anemoi.training.schemas.training import OptimizerSchema _AGGREGATE_LOSS_CFG = { "_target_": "anemoi.training.losses.TimeAggregateLossWrapper", From e137d26878aeed71ff4c8e9e56e3c5e5aadc100f Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 17:15:32 +0000 Subject: [PATCH 14/88] fix configs --- .../src/anemoi/training/config/temporal_downscaler.yaml | 6 +++--- .../training/config/temporal_downscaler_ensemble.yaml | 6 ++---- training/src/anemoi/training/schemas/training.py | 4 ---- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index 13736f5fc5..1772bdc7f0 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -35,8 +35,8 @@ training: scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] ignore_nans: False - _target_: anemoi.training.losses.TimeAggregateLossWrapper - time_aggregation_types: [mean, diff] + time_aggregation_types: [mean, max, min, diff] loss_fn: _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index 931f28b907..5037e75965 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -45,8 +45,7 @@ training: datasets: data: _target_: anemoi.training.losses.combined.CombinedLoss - loss_weights: [1.0, 0.5] - scalers: [] + loss_weights: [1.0, 1.0] losses: - _target_: anemoi.training.losses.MultiscaleLossWrapper loss_matrices_path: ${system.input.loss_matrices_path} @@ -60,8 +59,7 @@ training: no_autocast: True alpha: 0.95 - _target_: anemoi.training.losses.TimeAggregateLossWrapper - time_aggregation_types: [mean, diff] - scalers: [] + time_aggregation_types: [mean, max, min, diff] loss_fn: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 850cf1704b..22e1a96db6 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -312,10 +312,6 @@ class TimeAggregateLossWrapperSchema(BaseModel): "Time Aggregation operations to apply over the time dimension before computing the loss." loss_fn: BaseLossSchema "Inner loss function applied to each time aggregated output." - scalers: list[str] = Field(default_factory=list) - "Scalers to include in loss calculation." - ignore_nans: bool = False - "Allow nans in the loss and apply methods ignoring nans for measuring the loss." class SpectralLossSchema(BaseLossSchema): From 913bad378a451d61efdf29121c19cb93236fba12 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 17:16:43 +0000 Subject: [PATCH 15/88] rm unnecessary test --- .../unit/schemas/test_training_schemas.py | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py index 075fad4419..7202e637a3 100644 --- a/training/tests/unit/schemas/test_training_schemas.py +++ b/training/tests/unit/schemas/test_training_schemas.py @@ -29,28 +29,6 @@ } -def test_optimizer_schema_allows_extra_keys() -> None: - """Test that the OptimizerSchema allows extra keys.""" - # Explicitly test for the issue present in (anemoi-core/#885)[https://github.com/ecmwf/anemoi-core/pull/885] - optimizer_config = { - "_target_": "torch.optim.AdamW", - "lr": 0.001, - "weight_decay": 0.01, - "extra_key": "extra_value", # This key is not defined in the schema - } - optimizer_schema = OptimizerSchema(**optimizer_config) - assert optimizer_schema.target_ == "torch.optim.AdamW" - assert optimizer_schema.lr == 0.001 - assert optimizer_schema.weight_decay == 0.01 - assert optimizer_schema.extra_key == "extra_value" - - model_dump = optimizer_schema.model_dump(by_alias=True) - assert model_dump["_target_"] == "torch.optim.AdamW" - assert model_dump["lr"] == 0.001 - assert model_dump["weight_decay"] == 0.01 - assert model_dump["extra_key"] == "extra_value" - - def test_time_aggregate_loss_rejected_as_standalone() -> None: """TimeAggregateLossWrapper must not be usable as a top-level training loss.""" ta = TypeAdapter(LossSchemas) From 7583dff7b6a8fbad79c4a775218f82dad4d07e8c Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 17:36:05 +0000 Subject: [PATCH 16/88] fix failing tests --- training/src/anemoi/training/schemas/training.py | 8 +++++++- training/tests/unit/schemas/test_training_schemas.py | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 22e1a96db6..fc5c9d0a40 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -336,11 +336,17 @@ class CombinedLossSchema(BaseLossSchema): @classmethod def add_empty_scalers(cls, losses: Any) -> Any: """Add empty scalers to loss functions, as scalers can be set at top level.""" + from omegaconf import DictConfig from omegaconf.omegaconf import open_dict for loss in losses: + if "TimeAggregateLossWrapper" in loss.get("_target_", ""): + continue # TimeAggregateLossWrapperSchema has no scalers field if "scalers" not in loss: - with open_dict(loss): + if isinstance(loss, DictConfig): + with open_dict(loss): + loss["scalers"] = [] + else: loss["scalers"] = [] return losses diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py index 76424a230b..566a1ad73f 100644 --- a/training/tests/unit/schemas/test_training_schemas.py +++ b/training/tests/unit/schemas/test_training_schemas.py @@ -22,7 +22,6 @@ "_target_": "anemoi.training.losses.MSELoss", "scalers": ["node_weights"], }, - "scalers": [], } _MSE_CFG = { From e79539838ff2c3e56ec0f360251f339895b7e12a Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 18:29:45 +0000 Subject: [PATCH 17/88] fix integration test --- training/src/anemoi/training/schemas/training.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index fc5c9d0a40..b6fdb7a2af 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -310,7 +310,7 @@ class TimeAggregateLossWrapperSchema(BaseModel): target_: Literal["anemoi.training.losses.TimeAggregateLossWrapper"] = Field(..., alias="_target_") time_aggregation_types: list[Literal["diff", "mean", "min", "max"]] = Field(min_length=1) "Time Aggregation operations to apply over the time dimension before computing the loss." - loss_fn: BaseLossSchema + loss_fn: AlmostFairKernelCRPSSchema | KernelCRPSSchema | HuberLossSchema | BaseLossSchema "Inner loss function applied to each time aggregated output." @@ -327,11 +327,18 @@ class Config(BaseModel.Config): class CombinedLossSchema(BaseLossSchema): - losses: list[BaseLossSchema | SpectralLossSchema | TimeAggregateLossWrapperSchema] = Field(min_length=1) + scalers: list[str] = Field(default_factory=list) # type: ignore[assignment] + "Scalers to include in loss calculation. Defaults to empty (scalers applied per inner loss)." + losses: list[HuberLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema | SpectralLossSchema | TimeAggregateLossWrapperSchema | MultiScaleLossSchema | BaseLossSchema] = Field(min_length=1) "Losses to combine, can be any of the normal losses." loss_weights: list[int | float] | None = None "Weightings of losses, if not set, all losses are weighted equally." + class Config(BaseModel.Config): + """Allow extra fields from Hydra config merging (e.g. leftover fields from a replaced loss type).""" + + extra = "ignore" + @field_validator("losses", mode="before") @classmethod def add_empty_scalers(cls, losses: Any) -> Any: @@ -340,8 +347,9 @@ def add_empty_scalers(cls, losses: Any) -> Any: from omegaconf.omegaconf import open_dict for loss in losses: - if "TimeAggregateLossWrapper" in loss.get("_target_", ""): - continue # TimeAggregateLossWrapperSchema has no scalers field + target = loss.get("_target_", "") + if "TimeAggregateLossWrapper" in target or "MultiscaleLossWrapper" in target: + continue # these schemas have no scalers field if "scalers" not in loss: if isinstance(loss, DictConfig): with open_dict(loss): From 3cb9aeefe4a3ea8ddb3e60e086c0c0d645f5b57e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 18:30:38 +0000 Subject: [PATCH 18/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/src/anemoi/training/schemas/training.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index b6fdb7a2af..fbddd0176f 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -329,7 +329,15 @@ class Config(BaseModel.Config): class CombinedLossSchema(BaseLossSchema): scalers: list[str] = Field(default_factory=list) # type: ignore[assignment] "Scalers to include in loss calculation. Defaults to empty (scalers applied per inner loss)." - losses: list[HuberLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema | SpectralLossSchema | TimeAggregateLossWrapperSchema | MultiScaleLossSchema | BaseLossSchema] = Field(min_length=1) + losses: list[ + HuberLossSchema + | AlmostFairKernelCRPSSchema + | KernelCRPSSchema + | SpectralLossSchema + | TimeAggregateLossWrapperSchema + | MultiScaleLossSchema + | BaseLossSchema + ] = Field(min_length=1) "Losses to combine, can be any of the normal losses." loss_weights: list[int | float] | None = None "Weightings of losses, if not set, all losses are weighted equally." From 0110498a81f38fb1f58d4b8c1657353bea67f43a Mon Sep 17 00:00:00 2001 From: Mariana Clare <31656450+mc4117@users.noreply.github.com> Date: Thu, 23 Apr 2026 20:31:27 +0200 Subject: [PATCH 19/88] Remove extra Config class from training schema --- training/src/anemoi/training/schemas/training.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index fbddd0176f..26458d8514 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -342,11 +342,6 @@ class CombinedLossSchema(BaseLossSchema): loss_weights: list[int | float] | None = None "Weightings of losses, if not set, all losses are weighted equally." - class Config(BaseModel.Config): - """Allow extra fields from Hydra config merging (e.g. leftover fields from a replaced loss type).""" - - extra = "ignore" - @field_validator("losses", mode="before") @classmethod def add_empty_scalers(cls, losses: Any) -> Any: From 8a8a78890a2250530d9f425ecd64bef600db55ed Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 23 Apr 2026 22:04:55 +0000 Subject: [PATCH 20/88] different approach --- .../training/config/temporal_downscaler.yaml | 29 +++++----- .../config/temporal_downscaler_ensemble.yaml | 53 +++++++++++-------- .../training/config/training/ensemble.yaml | 6 ++- .../anemoi/training/config/training/lam.yaml | 6 ++- .../training/config/training/multi.yaml | 6 ++- .../training/config/training/single.yaml | 6 ++- .../training/config/training/stretched.yaml | 6 ++- .../src/anemoi/training/schemas/training.py | 34 ++++++------ .../src/anemoi/training/train/methods/base.py | 28 +++++++++- .../unit/schemas/test_training_schemas.py | 48 +++++++++-------- 10 files changed, 140 insertions(+), 82 deletions(-) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index 1772bdc7f0..69f34f4bd1 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -27,16 +27,19 @@ diagnostics: training: training_loss: datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - loss_weights: [1.0, 1.0] - losses: - - _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False - - _target_: anemoi.training.losses.TimeAggregateLossWrapper - time_aggregation_types: [mean, max, min, diff] - loss_fn: - _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False + data: # user-defined key in data + # loss class to initialise + _target_: anemoi.training.losses.MSELoss + # Scalers to include in loss calculation + # A selection of available scalers are listed in training/scalers. + # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded + # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False + time_aggregate_loss: + time_aggregation_types: [mean, max, min, diff] + weight: 1.0 + loss_fn: + _target_: anemoi.training.losses.MSELoss + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index 5037e75965..52c8855c8a 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -43,26 +43,33 @@ training: ensemble_size_per_device: 2 training_loss: datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - loss_weights: [1.0, 1.0] - losses: - - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - weights: [1.0] - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - no_autocast: True - alpha: 0.95 - - _target_: anemoi.training.losses.TimeAggregateLossWrapper - time_aggregation_types: [mean, max, min, diff] - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - no_autocast: True - alpha: 0.95 + data: # user-defined key in data + # loss class to initialise, can be anything subclassing torch.nn.Module + _target_: anemoi.training.losses.MultiscaleLossWrapper + loss_matrices_path: ${system.input.loss_matrices_path} + loss_matrices: [null] + weights: [1.0] + + keep_batch_sharded: ${model.keep_batch_sharded} + + per_scale_loss: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + + # Scalers to include in loss calculation + # A selection of available scalers are listed in training/scalers. + # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded + # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. + # scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] + ignore_nans: False + no_autocast: True + alpha: 0.95 + time_aggregate_loss: + time_aggregation_types: [mean, max, min, diff] + weight: 1.0 + loss_fn: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + no_autocast: True + alpha: 0.95 diff --git a/training/src/anemoi/training/config/training/ensemble.yaml b/training/src/anemoi/training/config/training/ensemble.yaml index cdd7402375..48df5496ec 100644 --- a/training/src/anemoi/training/config/training/ensemble.yaml +++ b/training/src/anemoi/training/config/training/ensemble.yaml @@ -56,7 +56,11 @@ strategy: # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False - +# Optional time-aggregate loss added alongside the main training loss. +# When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) +# and evaluates a loss on them, weighted by `weight`. +# Only valid if the number of time steps is greater than 1. +time_aggregate_loss: null # loss function for the model # To train without multiscale loss, set it to the desired loss directly training_loss: diff --git a/training/src/anemoi/training/config/training/lam.yaml b/training/src/anemoi/training/config/training/lam.yaml index 18d3ca7026..f4fbba3d4b 100644 --- a/training/src/anemoi/training/config/training/lam.yaml +++ b/training/src/anemoi/training/config/training/lam.yaml @@ -52,7 +52,11 @@ strategy: # see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False - +# Optional time-aggregate loss added alongside the main training loss. +# When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) +# and evaluates a loss on them, weighted by `weight`. +# Only valid if the number of time steps is greater than 1. +time_aggregate_loss: null # loss function for the model training_loss: datasets: diff --git a/training/src/anemoi/training/config/training/multi.yaml b/training/src/anemoi/training/config/training/multi.yaml index f3ba7ef957..0223fbbff5 100644 --- a/training/src/anemoi/training/config/training/multi.yaml +++ b/training/src/anemoi/training/config/training/multi.yaml @@ -61,7 +61,11 @@ max_steps: 150000 submodules_to_freeze: [] - +# Optional time-aggregate loss added alongside the main training loss. +# When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) +# and evaluates a loss on them, weighted by `weight`. +# Only valid if the number of time steps is greater than 1. +time_aggregate_loss: null # Dataset-specific loss and metrics configuration training_loss: datasets: diff --git a/training/src/anemoi/training/config/training/single.yaml b/training/src/anemoi/training/config/training/single.yaml index c3109dca6a..29ddedc885 100644 --- a/training/src/anemoi/training/config/training/single.yaml +++ b/training/src/anemoi/training/config/training/single.yaml @@ -51,7 +51,11 @@ strategy: # see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False - +# Optional time-aggregate loss added alongside the main training loss. +# When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) +# and evaluates a loss on them, weighted by `weight`. +# Only valid if the number of time steps is greater than 1. +time_aggregate_loss: null # loss function for the model training_loss: datasets: diff --git a/training/src/anemoi/training/config/training/stretched.yaml b/training/src/anemoi/training/config/training/stretched.yaml index e5863c0cc8..ac3743cd13 100644 --- a/training/src/anemoi/training/config/training/stretched.yaml +++ b/training/src/anemoi/training/config/training/stretched.yaml @@ -53,7 +53,11 @@ strategy: # see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False - +# Optional time-aggregate loss added alongside the main training loss. +# When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) +# and evaluates a loss on them, weighted by `weight`. +# Only valid if the number of time steps is greater than 1. +time_aggregate_loss: null # loss function for the model training_loss: datasets: diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 26458d8514..f7ed4f7931 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -306,12 +306,21 @@ class HuberLossSchema(BaseLossSchema): "Threshold for Huber loss." -class TimeAggregateLossWrapperSchema(BaseModel): - target_: Literal["anemoi.training.losses.TimeAggregateLossWrapper"] = Field(..., alias="_target_") +class TimeAggregateLossConfigSchema(BaseModel): + """Config-level schema for the time-aggregate loss. + + This is set at the training level (``training.time_aggregate_loss``) + rather than inside a loss union. The training loop wraps the inner + ``loss_fn`` in a ``TimeAggregateLossWrapper`` and adds the result + (scaled by ``weight``) to the main training loss. + """ + time_aggregation_types: list[Literal["diff", "mean", "min", "max"]] = Field(min_length=1) - "Time Aggregation operations to apply over the time dimension before computing the loss." + "Time aggregation operations to apply over the time dimension before computing the loss." + weight: NonNegativeFloat = 1.0 + "Weight of the time-aggregate loss relative to the main training loss." loss_fn: AlmostFairKernelCRPSSchema | KernelCRPSSchema | HuberLossSchema | BaseLossSchema - "Inner loss function applied to each time aggregated output." + "Inner loss function applied to each time-aggregated output." class SpectralLossSchema(BaseLossSchema): @@ -327,17 +336,7 @@ class Config(BaseModel.Config): class CombinedLossSchema(BaseLossSchema): - scalers: list[str] = Field(default_factory=list) # type: ignore[assignment] - "Scalers to include in loss calculation. Defaults to empty (scalers applied per inner loss)." - losses: list[ - HuberLossSchema - | AlmostFairKernelCRPSSchema - | KernelCRPSSchema - | SpectralLossSchema - | TimeAggregateLossWrapperSchema - | MultiScaleLossSchema - | BaseLossSchema - ] = Field(min_length=1) + losses: list[BaseLossSchema | SpectralLossSchema] = Field(min_length=1) "Losses to combine, can be any of the normal losses." loss_weights: list[int | float] | None = None "Weightings of losses, if not set, all losses are weighted equally." @@ -350,9 +349,6 @@ def add_empty_scalers(cls, losses: Any) -> Any: from omegaconf.omegaconf import open_dict for loss in losses: - target = loss.get("_target_", "") - if "TimeAggregateLossWrapper" in target or "MultiscaleLossWrapper" in target: - continue # these schemas have no scalers field if "scalers" not in loss: if isinstance(loss, DictConfig): with open_dict(loss): @@ -454,6 +450,8 @@ class BaseTrainingSchema(BaseModel): "Config for stochastic weight averaging." training_loss: DatasetDict[LossSchemas] "Training loss configuration." + time_aggregate_loss: TimeAggregateLossConfigSchema | None = None + "Optional time-aggregate loss added alongside the main training loss." loss_gradient_scaling: bool = False "Dynamic rescaling of the loss gradient. Not yet tested." scalers: DatasetDict[dict[str, ScalerSchema]] diff --git a/training/src/anemoi/training/train/methods/base.py b/training/src/anemoi/training/train/methods/base.py index 18bdf0adcb..cd390fd044 100644 --- a/training/src/anemoi/training/train/methods/base.py +++ b/training/src/anemoi/training/train/methods/base.py @@ -20,6 +20,7 @@ import pytorch_lightning as pl import torch from hydra.utils import instantiate +from omegaconf import DictConfig from omegaconf import OmegaConf from timm.scheduler.scheduler import Scheduler as TimmScheduler from torch_geometric.data import HeteroData @@ -32,6 +33,7 @@ from anemoi.models.interface import AnemoiModelInterface from anemoi.models.utils.config import get_multiple_datasets_config from anemoi.training.losses import get_loss_function +from anemoi.training.losses.aggregate import TimeAggregateLossWrapper from anemoi.training.losses.base import BaseLoss from anemoi.training.losses.loss import get_metric_ranges from anemoi.training.losses.scaler_tensor import grad_scaler @@ -274,6 +276,23 @@ def __init__( data_indices[dataset_name], ) + # Build optional time-aggregate loss + self.time_aggregate_loss = torch.nn.ModuleDict() + self.time_aggregate_loss_weight: dict[str, float] = {} + if config.training.time_aggregate_loss is not None: + ta_cfg = config.training.time_aggregate_loss + for dataset_name in self.target_dataset_names: + inner_loss = get_loss_function( + DictConfig(ta_cfg.loss_fn), + self.scalers[dataset_name], + data_indices[dataset_name], + ) + self.time_aggregate_loss[dataset_name] = TimeAggregateLossWrapper( + time_aggregation_types=list(ta_cfg.time_aggregation_types), + loss_fn=inner_loss, + ) + self.time_aggregate_loss_weight[dataset_name] = float(ta_cfg.weight) + if config.training.loss_gradient_scaling: # Multi-dataset: register hook for each loss for loss_fn in self.loss.values(): @@ -611,7 +630,14 @@ def _compute_loss( grid_shard_shapes=self.grid_shard_shapes[dataset_name], ) - return loss(y_pred, y, **loss_kwargs) + total_loss = loss(y_pred, y, **loss_kwargs) + + # Add optional time-aggregate loss + if dataset_name in self.time_aggregate_loss: + ta_loss = self.time_aggregate_loss[dataset_name](y_pred, y, **loss_kwargs) + total_loss = total_loss + self.time_aggregate_loss_weight[dataset_name] * ta_loss + + return total_loss def _compute_metrics( self, diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py index 566a1ad73f..66c38167dc 100644 --- a/training/tests/unit/schemas/test_training_schemas.py +++ b/training/tests/unit/schemas/test_training_schemas.py @@ -8,44 +8,48 @@ # nor does it submit to any jurisdiction. import pytest -from pydantic import TypeAdapter from pydantic import ValidationError -from anemoi.training.schemas.training import CombinedLossSchema -from anemoi.training.schemas.training import LossSchemas from anemoi.training.schemas.training import OptimizerSchema +from anemoi.training.schemas.training import TimeAggregateLossConfigSchema -_AGGREGATE_LOSS_CFG = { - "_target_": "anemoi.training.losses.TimeAggregateLossWrapper", + +_TIME_AGG_CFG = { "time_aggregation_types": ["mean", "diff"], + "weight": 0.5, "loss_fn": { "_target_": "anemoi.training.losses.MSELoss", "scalers": ["node_weights"], }, } -_MSE_CFG = { - "_target_": "anemoi.training.losses.MSELoss", - "scalers": ["node_weights"], -} +def test_time_aggregate_loss_config_valid() -> None: + """TimeAggregateLossConfigSchema accepts a valid config.""" + schema = TimeAggregateLossConfigSchema(**_TIME_AGG_CFG) + assert schema.time_aggregation_types == ["mean", "diff"] + assert schema.weight == 0.5 + + +def test_time_aggregate_loss_config_default_weight() -> None: + """Weight defaults to 1.0 when not specified.""" + cfg = {k: v for k, v in _TIME_AGG_CFG.items() if k != "weight"} + schema = TimeAggregateLossConfigSchema(**cfg) + assert schema.weight == 1.0 -def test_time_aggregate_loss_rejected_as_standalone() -> None: - """TimeAggregateLossWrapper must not be usable as a top-level training loss.""" - ta = TypeAdapter(LossSchemas) + +def test_time_aggregate_loss_config_invalid_agg_type() -> None: + """Unknown aggregation type is rejected.""" + cfg = {**_TIME_AGG_CFG, "time_aggregation_types": ["sum"]} with pytest.raises(ValidationError): - ta.validate_python(_AGGREGATE_LOSS_CFG) + TimeAggregateLossConfigSchema(**cfg) -def test_time_aggregate_loss_accepted_inside_combined_loss() -> None: - """TimeAggregateLossWrapper must be valid as a child of CombinedLoss.""" - combined_cfg = { - "_target_": "anemoi.training.losses.combined.CombinedLoss", - "scalers": [], - "losses": [_MSE_CFG, _AGGREGATE_LOSS_CFG], - } - schema = CombinedLossSchema(**combined_cfg) - assert len(schema.losses) == 2 +def test_time_aggregate_loss_config_empty_agg_types() -> None: + """Empty aggregation list is rejected (min_length=1).""" + cfg = {**_TIME_AGG_CFG, "time_aggregation_types": []} + with pytest.raises(ValidationError): + TimeAggregateLossConfigSchema(**cfg) def test_optimizer_schema_allows_extra_keys() -> None: From d1cb0407dc6a40a926c999dad5a631ade5bcbf51 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 22:05:39 +0000 Subject: [PATCH 21/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../anemoi/training/config/temporal_downscaler_ensemble.yaml | 2 +- training/src/anemoi/training/config/training/ensemble.yaml | 2 +- training/src/anemoi/training/config/training/lam.yaml | 2 +- training/src/anemoi/training/config/training/multi.yaml | 2 +- training/src/anemoi/training/config/training/single.yaml | 2 +- training/src/anemoi/training/config/training/stretched.yaml | 2 +- training/tests/unit/schemas/test_training_schemas.py | 1 - 7 files changed, 6 insertions(+), 7 deletions(-) diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index 52c8855c8a..11bfc6df10 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -63,7 +63,7 @@ training: # scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] ignore_nans: False no_autocast: True - alpha: 0.95 + alpha: 0.95 time_aggregate_loss: time_aggregation_types: [mean, max, min, diff] weight: 1.0 diff --git a/training/src/anemoi/training/config/training/ensemble.yaml b/training/src/anemoi/training/config/training/ensemble.yaml index 48df5496ec..0735ba229a 100644 --- a/training/src/anemoi/training/config/training/ensemble.yaml +++ b/training/src/anemoi/training/config/training/ensemble.yaml @@ -58,7 +58,7 @@ loss_gradient_scaling: False # Optional time-aggregate loss added alongside the main training loss. # When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) -# and evaluates a loss on them, weighted by `weight`. +# and evaluates a loss on them, weighted by `weight`. # Only valid if the number of time steps is greater than 1. time_aggregate_loss: null # loss function for the model diff --git a/training/src/anemoi/training/config/training/lam.yaml b/training/src/anemoi/training/config/training/lam.yaml index f4fbba3d4b..9062a1fb79 100644 --- a/training/src/anemoi/training/config/training/lam.yaml +++ b/training/src/anemoi/training/config/training/lam.yaml @@ -54,7 +54,7 @@ strategy: loss_gradient_scaling: False # Optional time-aggregate loss added alongside the main training loss. # When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) -# and evaluates a loss on them, weighted by `weight`. +# and evaluates a loss on them, weighted by `weight`. # Only valid if the number of time steps is greater than 1. time_aggregate_loss: null # loss function for the model diff --git a/training/src/anemoi/training/config/training/multi.yaml b/training/src/anemoi/training/config/training/multi.yaml index 0223fbbff5..7301a947f2 100644 --- a/training/src/anemoi/training/config/training/multi.yaml +++ b/training/src/anemoi/training/config/training/multi.yaml @@ -63,7 +63,7 @@ max_steps: 150000 submodules_to_freeze: [] # Optional time-aggregate loss added alongside the main training loss. # When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) -# and evaluates a loss on them, weighted by `weight`. +# and evaluates a loss on them, weighted by `weight`. # Only valid if the number of time steps is greater than 1. time_aggregate_loss: null # Dataset-specific loss and metrics configuration diff --git a/training/src/anemoi/training/config/training/single.yaml b/training/src/anemoi/training/config/training/single.yaml index 29ddedc885..cbc5a6d9f8 100644 --- a/training/src/anemoi/training/config/training/single.yaml +++ b/training/src/anemoi/training/config/training/single.yaml @@ -53,7 +53,7 @@ strategy: loss_gradient_scaling: False # Optional time-aggregate loss added alongside the main training loss. # When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) -# and evaluates a loss on them, weighted by `weight`. +# and evaluates a loss on them, weighted by `weight`. # Only valid if the number of time steps is greater than 1. time_aggregate_loss: null # loss function for the model diff --git a/training/src/anemoi/training/config/training/stretched.yaml b/training/src/anemoi/training/config/training/stretched.yaml index ac3743cd13..f0d1862606 100644 --- a/training/src/anemoi/training/config/training/stretched.yaml +++ b/training/src/anemoi/training/config/training/stretched.yaml @@ -55,7 +55,7 @@ strategy: loss_gradient_scaling: False # Optional time-aggregate loss added alongside the main training loss. # When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) -# and evaluates a loss on them, weighted by `weight`. +# and evaluates a loss on them, weighted by `weight`. # Only valid if the number of time steps is greater than 1. time_aggregate_loss: null # loss function for the model diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py index 66c38167dc..94dab39d60 100644 --- a/training/tests/unit/schemas/test_training_schemas.py +++ b/training/tests/unit/schemas/test_training_schemas.py @@ -13,7 +13,6 @@ from anemoi.training.schemas.training import OptimizerSchema from anemoi.training.schemas.training import TimeAggregateLossConfigSchema - _TIME_AGG_CFG = { "time_aggregation_types": ["mean", "diff"], "weight": 0.5, From 459d117a5d5049b4e1b8455176f4e4763de5b179 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 24 Apr 2026 06:59:12 +0000 Subject: [PATCH 22/88] fix tests --- training/tests/unit/train/test_methods.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/training/tests/unit/train/test_methods.py b/training/tests/unit/train/test_methods.py index 7d5ee62106..22a6659ce8 100644 --- a/training/tests/unit/train/test_methods.py +++ b/training/tests/unit/train/test_methods.py @@ -240,6 +240,7 @@ def test_base_compute_loss_forwards_standard_loss_kwargs() -> None: shard_shapes = [(1, 1, 1, 2, 3), (1, 1, 1, 2, 3)] module.loss = {"data": loss} + module.time_aggregate_loss = {} module.model_comm_group = group module.model_comm_group_size = 2 module.grid_dim = -2 @@ -275,6 +276,7 @@ def test_base_compute_loss_forwards_sharding_metadata_when_requested() -> None: shard_shapes = [(1, 1, 1, 2, 3), (1, 1, 1, 2, 3)] module.loss = {"data": loss} + module.time_aggregate_loss = {} module.model_comm_group = group module.model_comm_group_size = 2 module.grid_dim = -2 @@ -325,6 +327,7 @@ def test_base_compute_loss_forwards_shard_layout_to_combined_multiscale_loss( combined_loss = CombinedLoss(multiscale_loss) module.loss = {"data": combined_loss} + module.time_aggregate_loss = {} module.model_comm_group = group module.model_comm_group_size = 2 module.grid_dim = -2 From e043045f7379a7657bd7ff911945aaf06cf6558a Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 24 Apr 2026 08:22:21 +0000 Subject: [PATCH 23/88] update tests --- training/src/anemoi/training/schemas/training.py | 12 ++++++------ training/src/anemoi/training/train/methods/base.py | 9 +++++++-- training/tests/unit/losses/test_aggregate_loss.py | 13 +++---------- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index f7ed4f7931..1e428fa3bd 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -301,11 +301,6 @@ def validate_weights_length(cls, v: list[float], info: Any) -> list[float]: return v -class HuberLossSchema(BaseLossSchema): - delta: float = 1.0 - "Threshold for Huber loss." - - class TimeAggregateLossConfigSchema(BaseModel): """Config-level schema for the time-aggregate loss. @@ -319,10 +314,15 @@ class TimeAggregateLossConfigSchema(BaseModel): "Time aggregation operations to apply over the time dimension before computing the loss." weight: NonNegativeFloat = 1.0 "Weight of the time-aggregate loss relative to the main training loss." - loss_fn: AlmostFairKernelCRPSSchema | KernelCRPSSchema | HuberLossSchema | BaseLossSchema + loss_fn: AlmostFairKernelCRPSSchema | KernelCRPSSchema | BaseLossSchema "Inner loss function applied to each time-aggregated output." +class HuberLossSchema(BaseLossSchema): + delta: float = 1.0 + "Threshold for Huber loss." + + class SpectralLossSchema(BaseLossSchema): """Spectral loss class.""" diff --git a/training/src/anemoi/training/train/methods/base.py b/training/src/anemoi/training/train/methods/base.py index cd390fd044..2e9861ace1 100644 --- a/training/src/anemoi/training/train/methods/base.py +++ b/training/src/anemoi/training/train/methods/base.py @@ -33,7 +33,6 @@ from anemoi.models.interface import AnemoiModelInterface from anemoi.models.utils.config import get_multiple_datasets_config from anemoi.training.losses import get_loss_function -from anemoi.training.losses.aggregate import TimeAggregateLossWrapper from anemoi.training.losses.base import BaseLoss from anemoi.training.losses.loss import get_metric_ranges from anemoi.training.losses.scaler_tensor import grad_scaler @@ -280,6 +279,8 @@ def __init__( self.time_aggregate_loss = torch.nn.ModuleDict() self.time_aggregate_loss_weight: dict[str, float] = {} if config.training.time_aggregate_loss is not None: + from anemoi.training.losses.aggregate import TimeAggregateLossWrapper + ta_cfg = config.training.time_aggregate_loss for dataset_name in self.target_dataset_names: inner_loss = get_loss_function( @@ -634,7 +635,11 @@ def _compute_loss( # Add optional time-aggregate loss if dataset_name in self.time_aggregate_loss: - ta_loss = self.time_aggregate_loss[dataset_name](y_pred, y, **loss_kwargs) + ta_kwargs = { + "grid_shard_slice": grid_shard_slice, + "group": self.model_comm_group, + } + ta_loss = self.time_aggregate_loss[dataset_name](y_pred, y, **ta_kwargs) total_loss = total_loss + self.time_aggregate_loss_weight[dataset_name] * ta_loss return total_loss diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index 834ed6dcdc..cfd6aed221 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -12,8 +12,8 @@ from anemoi.training.losses.aggregate import TimeAggregateLossWrapper from anemoi.training.losses.base import BaseLoss -from anemoi.training.losses.base import FunctionalLoss from anemoi.training.losses.kcrps import AlmostFairKernelCRPS +from anemoi.training.losses.mae import MAELoss from anemoi.training.utils.enums import TensorDim # --------------------------------------------------------------------------- @@ -21,16 +21,9 @@ # --------------------------------------------------------------------------- -class MAELossFn(FunctionalLoss): - """Minimal MAE-style functional loss for testing.""" - - def calculate_difference(self, pred: torch.Tensor, target: torch.Tensor) -> torch.Tensor: - return torch.abs(pred - target) - - -def _make_loss() -> FunctionalLoss: +def _make_loss() -> MAELoss: """Return an MAE loss with a unit grid scaler (4 grid points).""" - loss = MAELossFn() + loss = MAELoss() loss.add_scaler(TensorDim.GRID, torch.ones(4), name="unit_grid") return loss From 5756e88cf556c506a1a2b0fd8a3df3274c9692eb Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 24 Apr 2026 09:32:51 +0000 Subject: [PATCH 24/88] fix schema --- training/src/anemoi/training/schemas/training.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 1e428fa3bd..698511db8a 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -314,7 +314,7 @@ class TimeAggregateLossConfigSchema(BaseModel): "Time aggregation operations to apply over the time dimension before computing the loss." weight: NonNegativeFloat = 1.0 "Weight of the time-aggregate loss relative to the main training loss." - loss_fn: AlmostFairKernelCRPSSchema | KernelCRPSSchema | BaseLossSchema + loss_fn: BaseLossSchema | AlmostFairKernelCRPSSchema | MultiScaleLossSchema "Inner loss function applied to each time-aggregated output." From d12f4466a5285ad96310044c727a71a89f4c4877 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 24 Apr 2026 09:38:54 +0000 Subject: [PATCH 25/88] update schema --- training/src/anemoi/training/schemas/training.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 698511db8a..b30f8a1eaa 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -314,7 +314,7 @@ class TimeAggregateLossConfigSchema(BaseModel): "Time aggregation operations to apply over the time dimension before computing the loss." weight: NonNegativeFloat = 1.0 "Weight of the time-aggregate loss relative to the main training loss." - loss_fn: BaseLossSchema | AlmostFairKernelCRPSSchema | MultiScaleLossSchema + loss_fn: BaseLossSchema | MultiScaleLossSchema "Inner loss function applied to each time-aggregated output." From cb276f4617298b5b4d281dec9963da5eac90b061 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 24 Apr 2026 10:35:30 +0000 Subject: [PATCH 26/88] making time aggregate losses work for multi datasets --- .../training/config/temporal_downscaler.yaml | 14 ++++++++------ .../config/temporal_downscaler_ensemble.yaml | 19 +++++++++++-------- .../src/anemoi/training/schemas/training.py | 4 ++-- .../src/anemoi/training/train/methods/base.py | 9 ++++++++- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index 69f34f4bd1..094ba83a4c 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -37,9 +37,11 @@ training: scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] ignore_nans: False time_aggregate_loss: - time_aggregation_types: [mean, max, min, diff] - weight: 1.0 - loss_fn: - _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False + datasets: + data: # user-defined key in data + time_aggregation_types: [mean, max, min, diff] + weight: 1.0 + loss_fn: + _target_: anemoi.training.losses.MSELoss + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index 11bfc6df10..5f4629591a 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -29,6 +29,7 @@ system: graph: graph_anemoi_new.pt dataset: aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51 loss_matrices_path: null + output: hardware: accelerator: auto num_gpus_per_ensemble: 1 @@ -65,11 +66,13 @@ training: no_autocast: True alpha: 0.95 time_aggregate_loss: - time_aggregation_types: [mean, max, min, diff] - weight: 1.0 - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - no_autocast: True - alpha: 0.95 + datasets: + data: # user-defined key in data + time_aggregation_types: [mean, max, min, diff] + weight: 1.0 + loss_fn: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + no_autocast: True + alpha: 0.95 diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index b30f8a1eaa..f955046032 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -450,8 +450,8 @@ class BaseTrainingSchema(BaseModel): "Config for stochastic weight averaging." training_loss: DatasetDict[LossSchemas] "Training loss configuration." - time_aggregate_loss: TimeAggregateLossConfigSchema | None = None - "Optional time-aggregate loss added alongside the main training loss." + time_aggregate_loss: DatasetDict[TimeAggregateLossConfigSchema] | None = None + "Optional per-dataset time-aggregate loss added alongside the main training loss." loss_gradient_scaling: bool = False "Dynamic rescaling of the loss gradient. Not yet tested." scalers: DatasetDict[dict[str, ScalerSchema]] diff --git a/training/src/anemoi/training/train/methods/base.py b/training/src/anemoi/training/train/methods/base.py index 2e9861ace1..2ee967e1dc 100644 --- a/training/src/anemoi/training/train/methods/base.py +++ b/training/src/anemoi/training/train/methods/base.py @@ -281,8 +281,11 @@ def __init__( if config.training.time_aggregate_loss is not None: from anemoi.training.losses.aggregate import TimeAggregateLossWrapper - ta_cfg = config.training.time_aggregate_loss + ta_datasets = config.training.time_aggregate_loss.datasets for dataset_name in self.target_dataset_names: + if dataset_name not in ta_datasets: + continue + ta_cfg = ta_datasets[dataset_name] inner_loss = get_loss_function( DictConfig(ta_cfg.loss_fn), self.scalers[dataset_name], @@ -639,6 +642,10 @@ def _compute_loss( "grid_shard_slice": grid_shard_slice, "group": self.model_comm_group, } + if pred_layout is not None: + ta_kwargs["pred_layout"] = pred_layout + if target_layout is not None: + ta_kwargs["target_layout"] = target_layout ta_loss = self.time_aggregate_loss[dataset_name](y_pred, y, **ta_kwargs) total_loss = total_loss + self.time_aggregate_loss_weight[dataset_name] * ta_loss From e9e84760e2f501fb6f94cba8308fae4548ea19e4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:36:11 +0000 Subject: [PATCH 27/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/src/anemoi/training/config/temporal_downscaler.yaml | 2 +- .../anemoi/training/config/temporal_downscaler_ensemble.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index 094ba83a4c..a4b0e60f2f 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -38,7 +38,7 @@ training: ignore_nans: False time_aggregate_loss: datasets: - data: # user-defined key in data + data: # user-defined key in data time_aggregation_types: [mean, max, min, diff] weight: 1.0 loss_fn: diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index 5f4629591a..f56eea6319 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -67,7 +67,7 @@ training: alpha: 0.95 time_aggregate_loss: datasets: - data: # user-defined key in data + data: # user-defined key in data time_aggregation_types: [mean, max, min, diff] weight: 1.0 loss_fn: From e89565c175f8fd3fd5614dd2ac21afc0c36614fe Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 24 Apr 2026 11:36:56 +0000 Subject: [PATCH 28/88] update losses in config --- training/src/anemoi/training/config/temporal_downscaler.yaml | 2 +- .../anemoi/training/config/temporal_downscaler_ensemble.yaml | 3 +-- training/src/anemoi/training/schemas/training.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index 094ba83a4c..8ca645e7d1 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -43,5 +43,5 @@ training: weight: 1.0 loss_fn: _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + scalers: ['pressure_level', 'general_variable', 'node_weights'] ignore_nans: False diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index 5f4629591a..ab5821c856 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -29,7 +29,6 @@ system: graph: graph_anemoi_new.pt dataset: aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51 loss_matrices_path: null - output: hardware: accelerator: auto num_gpus_per_ensemble: 1 @@ -72,7 +71,7 @@ training: weight: 1.0 loss_fn: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] ignore_nans: False no_autocast: True alpha: 0.95 diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index f955046032..729201748c 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -314,7 +314,7 @@ class TimeAggregateLossConfigSchema(BaseModel): "Time aggregation operations to apply over the time dimension before computing the loss." weight: NonNegativeFloat = 1.0 "Weight of the time-aggregate loss relative to the main training loss." - loss_fn: BaseLossSchema | MultiScaleLossSchema + loss_fn: BaseLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema | MultiScaleLossSchema "Inner loss function applied to each time-aggregated output." From f445b211bc604c4405d4a12d90a3c240dfc707e9 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 27 Apr 2026 19:19:23 +0000 Subject: [PATCH 29/88] different approach adding loss folders --- .../training/config/losses/ensemble.yaml | 16 +++++ .../config/losses/ensemble_combined.yaml | 25 +++++++ .../anemoi/training/config/losses/single.yaml | 10 +++ .../config/losses/single_combined.yaml | 16 +++++ .../training/config/temporal_downscaler.yaml | 31 +-------- .../config/temporal_downscaler_ensemble.yaml | 67 +++++++------------ .../training/config/training/diffusion.yaml | 13 +--- .../training/config/training/ensemble.yaml | 62 ++--------------- .../anemoi/training/config/training/lam.yaml | 18 +---- .../config/training/losses/combined.yaml | 15 +++++ .../config/training/losses/default.yaml | 9 +++ .../training/config/training/multi.yaml | 6 +- .../training/config/training/single.yaml | 18 +---- .../training/config/training/stretched.yaml | 18 +---- training/src/anemoi/training/losses/loss.py | 6 ++ .../src/anemoi/training/schemas/training.py | 26 +++---- .../src/anemoi/training/train/methods/base.py | 37 +--------- .../unit/schemas/test_training_schemas.py | 20 ++---- training/tests/unit/train/test_methods.py | 3 - 19 files changed, 157 insertions(+), 259 deletions(-) create mode 100644 training/src/anemoi/training/config/losses/ensemble.yaml create mode 100644 training/src/anemoi/training/config/losses/ensemble_combined.yaml create mode 100644 training/src/anemoi/training/config/losses/single.yaml create mode 100644 training/src/anemoi/training/config/losses/single_combined.yaml create mode 100644 training/src/anemoi/training/config/training/losses/combined.yaml create mode 100644 training/src/anemoi/training/config/training/losses/default.yaml diff --git a/training/src/anemoi/training/config/losses/ensemble.yaml b/training/src/anemoi/training/config/losses/ensemble.yaml new file mode 100644 index 0000000000..7f55d98ae9 --- /dev/null +++ b/training/src/anemoi/training/config/losses/ensemble.yaml @@ -0,0 +1,16 @@ +# @package training.training_loss +datasets: + data: + _target_: anemoi.training.losses.MultiscaleLossWrapper + loss_matrices_path: ${system.input.loss_matrices_path} + loss_matrices: [null] + weights: [1.0] + + keep_batch_sharded: ${model.keep_batch_sharded} + + per_scale_loss: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + no_autocast: True + alpha: 0.95 diff --git a/training/src/anemoi/training/config/losses/ensemble_combined.yaml b/training/src/anemoi/training/config/losses/ensemble_combined.yaml new file mode 100644 index 0000000000..11e593bb2e --- /dev/null +++ b/training/src/anemoi/training/config/losses/ensemble_combined.yaml @@ -0,0 +1,25 @@ +datasets: + data: + _target_: anemoi.training.losses.combined.CombinedLoss + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + losses: + - _target_: anemoi.training.losses.MultiscaleLossWrapper + loss_matrices_path: ${system.input.loss_matrices_path} + loss_matrices: [null] + weights: [1.0] + keep_batch_sharded: ${model.keep_batch_sharded} + per_scale_loss: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + no_autocast: True + alpha: 0.95 + - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper + time_aggregation_types: [mean, max, min, diff] + loss_fn: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] + ignore_nans: False + no_autocast: True + alpha: 0.95 diff --git a/training/src/anemoi/training/config/losses/single.yaml b/training/src/anemoi/training/config/losses/single.yaml new file mode 100644 index 0000000000..c7e25379ac --- /dev/null +++ b/training/src/anemoi/training/config/losses/single.yaml @@ -0,0 +1,10 @@ +# @package training.training_loss +datasets: + data: + _target_: anemoi.training.losses.MSELoss + # Scalers to include in loss calculation + # A selection of available scalers are listed in training/scalers. + # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded + # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False diff --git a/training/src/anemoi/training/config/losses/single_combined.yaml b/training/src/anemoi/training/config/losses/single_combined.yaml new file mode 100644 index 0000000000..d48c1f9cc0 --- /dev/null +++ b/training/src/anemoi/training/config/losses/single_combined.yaml @@ -0,0 +1,16 @@ +# @package training.training_loss +datasets: + data: + _target_: anemoi.training.losses.combined.CombinedLoss + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False + losses: + - _target_: anemoi.training.losses.MSELoss + scalers: ['*'] + ignore_nans: False + - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper + time_aggregation_types: [mean, max, min, diff] + loss_fn: + _target_: anemoi.training.losses.MSELoss + scalers: ['pressure_level', 'general_variable', 'node_weights'] + ignore_nans: False diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index f27a8c71d0..f9f9cee002 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -7,41 +7,12 @@ defaults: - model: graphtransformer - task: temporal_downscaler - training: single +- override training/losses: combined - _self_ config_validation: True -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# system: -# hardware: -# num_gpus_per_node: 1 - diagnostics: plot: callbacks: [] callbacks: [] - -training: - training_loss: - datasets: - data: # user-defined key in data - # loss class to initialise - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False - time_aggregate_loss: - datasets: - data: # user-defined key in data - time_aggregation_types: [mean, max, min, diff] - weight: 1.0 - loss_fn: - _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'node_weights'] - ignore_nans: False diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index d7a8592e6c..bf7fbf24b2 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -7,18 +7,11 @@ defaults: - model: graphtransformer_ens - task: temporal_downscaler - training: ensemble +- override training/losses: combined - _self_ config_validation: True -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# system: -# hardware: -# num_gpus_per_node: 1 - diagnostics: plot: callbacks: [] @@ -41,37 +34,29 @@ model: training: ensemble_size_per_device: 2 - training_loss: - datasets: - data: # user-defined key in data - # loss class to initialise, can be anything subclassing torch.nn.Module - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - weights: [1.0] - - keep_batch_sharded: ${model.keep_batch_sharded} - - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - # scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - no_autocast: True - alpha: 0.95 - time_aggregate_loss: + losses: datasets: - data: # user-defined key in data - time_aggregation_types: [mean, max, min, diff] - weight: 1.0 - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - no_autocast: True - alpha: 0.95 + data: + _target_: anemoi.training.losses.combined.CombinedLoss + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + losses: + - _target_: anemoi.training.losses.MultiscaleLossWrapper + loss_matrices_path: ${system.input.loss_matrices_path} + loss_matrices: [null] + weights: [1.0] + keep_batch_sharded: ${model.keep_batch_sharded} + per_scale_loss: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + no_autocast: True + alpha: 0.95 + - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper + time_aggregation_types: [mean, max, min, diff] + loss_fn: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] + ignore_nans: False + no_autocast: True + alpha: 0.95 diff --git a/training/src/anemoi/training/config/training/diffusion.yaml b/training/src/anemoi/training/config/training/diffusion.yaml index 89ab0acf46..fa9cc3fb6b 100644 --- a/training/src/anemoi/training/config/training/diffusion.yaml +++ b/training/src/anemoi/training/config/training/diffusion.yaml @@ -1,6 +1,7 @@ --- defaults: - scalers: global + - losses: default - optimization: default # resume or fork a training from a checkpoint last.ckpt or specified in system.input.warm_start @@ -58,18 +59,10 @@ strategy: # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False -# loss function for the model -training_loss: +losses: datasets: - data: # user-defined key in data - # loss class to initialise + data: _target_: anemoi.training.losses.WeightedMSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False # Validation metrics calculation, # This may be a list, in which case all metrics will be calculated diff --git a/training/src/anemoi/training/config/training/ensemble.yaml b/training/src/anemoi/training/config/training/ensemble.yaml index 0735ba229a..b304a04378 100644 --- a/training/src/anemoi/training/config/training/ensemble.yaml +++ b/training/src/anemoi/training/config/training/ensemble.yaml @@ -1,6 +1,7 @@ --- defaults: - scalers: global + - losses: default - optimization: default # resume or fork a training from a checkpoint last.ckpt or specified in system.input.warm_start @@ -56,48 +57,29 @@ strategy: # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False -# Optional time-aggregate loss added alongside the main training loss. -# When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) -# and evaluates a loss on them, weighted by `weight`. -# Only valid if the number of time steps is greater than 1. -time_aggregate_loss: null -# loss function for the model -# To train without multiscale loss, set it to the desired loss directly -training_loss: +losses: datasets: - data: # user-defined key in data - # loss class to initialise, can be anything subclassing torch.nn.Module + data: _target_: anemoi.training.losses.MultiscaleLossWrapper loss_matrices_path: ${system.input.loss_matrices_path} loss_matrices: [null] weights: [1.0] - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - # scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] ignore_nans: False no_autocast: True alpha: 0.95 - - # Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated +# This may be a list, in which case all metrics will be calculated # and logged according to their name. # These metrics are calculated in the output model space, and thus # have undergone postprocessing. validation_metrics: datasets: - data: # user-defined key in data - # loss class to initialise, can be anything subclassing torch.nn.Module + data: fkcrps: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS scalers: ['node_weights', 'time_steps'] @@ -116,49 +98,20 @@ validation_metrics: per_scale_loss: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS scalers: ['node_weights', 'time_steps'] - - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - # scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] ignore_nans: False no_autocast: True alpha: 1.0 - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - variable_groups: datasets: - data: # user-defined key in data + data: default: sfc pl: param: [q, t, u, v, w, z] metrics: datasets: - data: # user-defined key in data + data: - z_500 - t_850 - u_850 @@ -168,7 +121,6 @@ metrics: max_epochs: null max_steps: 150000 - submodules_to_freeze: [] # if using torch compile, how many times a certain block of code will be recompiled in response to different inputs. diff --git a/training/src/anemoi/training/config/training/lam.yaml b/training/src/anemoi/training/config/training/lam.yaml index 9062a1fb79..4f0530bcde 100644 --- a/training/src/anemoi/training/config/training/lam.yaml +++ b/training/src/anemoi/training/config/training/lam.yaml @@ -1,6 +1,7 @@ --- defaults: - scalers: lam + - losses: default - optimization: default # resume or fork a training from a checkpoint last.ckpt or specified in system.input.warm_start @@ -52,23 +53,6 @@ strategy: # see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False -# Optional time-aggregate loss added alongside the main training loss. -# When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) -# and evaluates a loss on them, weighted by `weight`. -# Only valid if the number of time steps is greater than 1. -time_aggregate_loss: null -# loss function for the model -training_loss: - datasets: - data: # user-defined key in data - # loss class to initialise - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers/scalers.yaml - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False # Validation metrics calculation, # This may be a list, in which case all metrics will be calculated diff --git a/training/src/anemoi/training/config/training/losses/combined.yaml b/training/src/anemoi/training/config/training/losses/combined.yaml new file mode 100644 index 0000000000..4599d51685 --- /dev/null +++ b/training/src/anemoi/training/config/training/losses/combined.yaml @@ -0,0 +1,15 @@ +datasets: + data: + _target_: anemoi.training.losses.combined.CombinedLoss + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False + losses: + - _target_: anemoi.training.losses.MSELoss + scalers: ['*'] + ignore_nans: False + - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper + time_aggregation_types: [mean, max, min, diff] + loss_fn: + _target_: anemoi.training.losses.MSELoss + scalers: ['pressure_level', 'general_variable', 'node_weights'] + ignore_nans: False diff --git a/training/src/anemoi/training/config/training/losses/default.yaml b/training/src/anemoi/training/config/training/losses/default.yaml new file mode 100644 index 0000000000..d2ddccb98c --- /dev/null +++ b/training/src/anemoi/training/config/training/losses/default.yaml @@ -0,0 +1,9 @@ +datasets: + data: + _target_: anemoi.training.losses.MSELoss + # Scalers to include in loss calculation + # A selection of available scalers are listed in training/scalers. + # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded + # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False diff --git a/training/src/anemoi/training/config/training/multi.yaml b/training/src/anemoi/training/config/training/multi.yaml index 7301a947f2..ab09299411 100644 --- a/training/src/anemoi/training/config/training/multi.yaml +++ b/training/src/anemoi/training/config/training/multi.yaml @@ -1,6 +1,7 @@ --- defaults: - scalers: multi + - losses: default - optimization: default # resume or fork a training from a checkpoint last.ckpt or specified in hardware.files.warm_start @@ -61,11 +62,6 @@ max_steps: 150000 submodules_to_freeze: [] -# Optional time-aggregate loss added alongside the main training loss. -# When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) -# and evaluates a loss on them, weighted by `weight`. -# Only valid if the number of time steps is greater than 1. -time_aggregate_loss: null # Dataset-specific loss and metrics configuration training_loss: datasets: diff --git a/training/src/anemoi/training/config/training/single.yaml b/training/src/anemoi/training/config/training/single.yaml index cbc5a6d9f8..8b025de3d7 100644 --- a/training/src/anemoi/training/config/training/single.yaml +++ b/training/src/anemoi/training/config/training/single.yaml @@ -1,6 +1,7 @@ --- defaults: - scalers: global + - losses: default - optimization: default # resume or fork a training from a checkpoint last.ckpt or specified in system.input.warm_start @@ -51,23 +52,8 @@ strategy: # see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False -# Optional time-aggregate loss added alongside the main training loss. -# When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) -# and evaluates a loss on them, weighted by `weight`. -# Only valid if the number of time steps is greater than 1. -time_aggregate_loss: null # loss function for the model -training_loss: - datasets: - data: # user-defined key in data - # loss class to initialise - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False + # Validation metrics calculation, # This may be a list, in which case all metrics will be calculated diff --git a/training/src/anemoi/training/config/training/stretched.yaml b/training/src/anemoi/training/config/training/stretched.yaml index f0d1862606..260a6d1a17 100644 --- a/training/src/anemoi/training/config/training/stretched.yaml +++ b/training/src/anemoi/training/config/training/stretched.yaml @@ -1,6 +1,7 @@ --- defaults: - scalers: stretched + - losses: default - optimization: default # resume or fork a training from a checkpoint last.ckpt or specified in system.input.warm_start @@ -53,23 +54,6 @@ strategy: # see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False -# Optional time-aggregate loss added alongside the main training loss. -# When set, the wrapper computes time-aggregated predictions (e.g. diff, mean) -# and evaluates a loss on them, weighted by `weight`. -# Only valid if the number of time steps is greater than 1. -time_aggregate_loss: null -# loss function for the model -training_loss: - datasets: - data: # user-defined key in data - # loss class to initialise - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers/scalers.yaml - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False # Validation metrics calculation, # This may be a list, in which case all metrics will be calculated diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py index 30fece0786..d427d5f92b 100644 --- a/training/src/anemoi/training/losses/loss.py +++ b/training/src/anemoi/training/losses/loss.py @@ -28,6 +28,7 @@ METRIC_RANGE_DTYPE = dict[str, list[int]] NESTED_LOSSES = ["anemoi.training.losses.MultiscaleLossWrapper"] +WRAPPED_LOSSES = ["anemoi.training.losses.aggregate.TimeAggregateLossWrapper"] LOGGER = logging.getLogger(__name__) @@ -141,6 +142,11 @@ def get_loss_function( per_scale_loss = get_loss_function(OmegaConf.create(per_scale_loss_config), scalers, data_indices) return instantiate(loss_config, per_scale_loss=per_scale_loss, **kwargs) + if "_target_" in loss_config and loss_config["_target_"] in WRAPPED_LOSSES: + inner_loss_config = loss_config.pop("loss_fn") + inner_loss = get_loss_function(OmegaConf.create(inner_loss_config), scalers, data_indices) + return instantiate(loss_config, loss_fn=inner_loss, **kwargs) + if scalers is None: scalers = {} diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 729201748c..34c9681318 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -301,20 +301,13 @@ def validate_weights_length(cls, v: list[float], info: Any) -> list[float]: return v -class TimeAggregateLossConfigSchema(BaseModel): - """Config-level schema for the time-aggregate loss. - - This is set at the training level (``training.time_aggregate_loss``) - rather than inside a loss union. The training loop wraps the inner - ``loss_fn`` in a ``TimeAggregateLossWrapper`` and adds the result - (scaled by ``weight``) to the main training loss. - """ +class TimeAggregateLossWrapperSchema(BaseModel): + """Schema for TimeAggregateLossWrapper used inside CombinedLoss.""" + target_: Literal["anemoi.training.losses.aggregate.TimeAggregateLossWrapper"] = Field(..., alias="_target_") time_aggregation_types: list[Literal["diff", "mean", "min", "max"]] = Field(min_length=1) "Time aggregation operations to apply over the time dimension before computing the loss." - weight: NonNegativeFloat = 1.0 - "Weight of the time-aggregate loss relative to the main training loss." - loss_fn: BaseLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema | MultiScaleLossSchema + loss_fn: BaseLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema "Inner loss function applied to each time-aggregated output." @@ -336,7 +329,7 @@ class Config(BaseModel.Config): class CombinedLossSchema(BaseLossSchema): - losses: list[BaseLossSchema | SpectralLossSchema] = Field(min_length=1) + losses: list[BaseLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema | SpectralLossSchema | TimeAggregateLossWrapperSchema | MultiScaleLossSchema] = Field(min_length=1) "Losses to combine, can be any of the normal losses." loss_weights: list[int | float] | None = None "Weightings of losses, if not set, all losses are weighted equally." @@ -349,6 +342,10 @@ def add_empty_scalers(cls, losses: Any) -> Any: from omegaconf.omegaconf import open_dict for loss in losses: + # TimeAggregateLossWrapper and MultiscaleLossWrapper don't have top-level scalers + target = loss.get("_target_", "") if isinstance(loss, (dict, DictConfig)) else "" + if "TimeAggregateLossWrapper" in target or "MultiscaleLossWrapper" in target: + continue if "scalers" not in loss: if isinstance(loss, DictConfig): with open_dict(loss): @@ -375,6 +372,7 @@ def check_length_of_weights_and_losses(self) -> Self: | KernelCRPSSchema | SpectralLossSchema | MultiScaleLossSchema + | TimeAggregateLossWrapperSchema ) @@ -448,10 +446,8 @@ class BaseTrainingSchema(BaseModel): "Strategy to use." swa: SWA = Field(default_factory=SWA) "Config for stochastic weight averaging." - training_loss: DatasetDict[LossSchemas] + losses: DatasetDict[LossSchemas] "Training loss configuration." - time_aggregate_loss: DatasetDict[TimeAggregateLossConfigSchema] | None = None - "Optional per-dataset time-aggregate loss added alongside the main training loss." loss_gradient_scaling: bool = False "Dynamic rescaling of the loss gradient. Not yet tested." scalers: DatasetDict[dict[str, ScalerSchema]] diff --git a/training/src/anemoi/training/train/methods/base.py b/training/src/anemoi/training/train/methods/base.py index 2ee967e1dc..c6f4ce907c 100644 --- a/training/src/anemoi/training/train/methods/base.py +++ b/training/src/anemoi/training/train/methods/base.py @@ -220,7 +220,7 @@ def __init__( self.metrics = torch.nn.ModuleDict() dataset_variable_groups = get_multiple_datasets_config(self.config.training.variable_groups) - loss_configs = get_multiple_datasets_config(config.training.training_loss) + loss_configs = get_multiple_datasets_config(config.training.losses) scalers_configs = get_multiple_datasets_config(config.training.scalers) val_metrics_configs = get_multiple_datasets_config(config.training.validation_metrics) metrics_to_log = get_multiple_datasets_config(config.training.metrics) @@ -275,28 +275,6 @@ def __init__( data_indices[dataset_name], ) - # Build optional time-aggregate loss - self.time_aggregate_loss = torch.nn.ModuleDict() - self.time_aggregate_loss_weight: dict[str, float] = {} - if config.training.time_aggregate_loss is not None: - from anemoi.training.losses.aggregate import TimeAggregateLossWrapper - - ta_datasets = config.training.time_aggregate_loss.datasets - for dataset_name in self.target_dataset_names: - if dataset_name not in ta_datasets: - continue - ta_cfg = ta_datasets[dataset_name] - inner_loss = get_loss_function( - DictConfig(ta_cfg.loss_fn), - self.scalers[dataset_name], - data_indices[dataset_name], - ) - self.time_aggregate_loss[dataset_name] = TimeAggregateLossWrapper( - time_aggregation_types=list(ta_cfg.time_aggregation_types), - loss_fn=inner_loss, - ) - self.time_aggregate_loss_weight[dataset_name] = float(ta_cfg.weight) - if config.training.loss_gradient_scaling: # Multi-dataset: register hook for each loss for loss_fn in self.loss.values(): @@ -636,19 +614,6 @@ def _compute_loss( total_loss = loss(y_pred, y, **loss_kwargs) - # Add optional time-aggregate loss - if dataset_name in self.time_aggregate_loss: - ta_kwargs = { - "grid_shard_slice": grid_shard_slice, - "group": self.model_comm_group, - } - if pred_layout is not None: - ta_kwargs["pred_layout"] = pred_layout - if target_layout is not None: - ta_kwargs["target_layout"] = target_layout - ta_loss = self.time_aggregate_loss[dataset_name](y_pred, y, **ta_kwargs) - total_loss = total_loss + self.time_aggregate_loss_weight[dataset_name] * ta_loss - return total_loss def _compute_metrics( diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py index 94dab39d60..f6919677ea 100644 --- a/training/tests/unit/schemas/test_training_schemas.py +++ b/training/tests/unit/schemas/test_training_schemas.py @@ -11,11 +11,11 @@ from pydantic import ValidationError from anemoi.training.schemas.training import OptimizerSchema -from anemoi.training.schemas.training import TimeAggregateLossConfigSchema +from anemoi.training.schemas.training import TimeAggregateLossWrapperSchema _TIME_AGG_CFG = { + "_target_": "anemoi.training.losses.aggregate.TimeAggregateLossWrapper", "time_aggregation_types": ["mean", "diff"], - "weight": 0.5, "loss_fn": { "_target_": "anemoi.training.losses.MSELoss", "scalers": ["node_weights"], @@ -24,31 +24,23 @@ def test_time_aggregate_loss_config_valid() -> None: - """TimeAggregateLossConfigSchema accepts a valid config.""" - schema = TimeAggregateLossConfigSchema(**_TIME_AGG_CFG) + """TimeAggregateLossWrapperSchema accepts a valid config.""" + schema = TimeAggregateLossWrapperSchema(**_TIME_AGG_CFG) assert schema.time_aggregation_types == ["mean", "diff"] - assert schema.weight == 0.5 - - -def test_time_aggregate_loss_config_default_weight() -> None: - """Weight defaults to 1.0 when not specified.""" - cfg = {k: v for k, v in _TIME_AGG_CFG.items() if k != "weight"} - schema = TimeAggregateLossConfigSchema(**cfg) - assert schema.weight == 1.0 def test_time_aggregate_loss_config_invalid_agg_type() -> None: """Unknown aggregation type is rejected.""" cfg = {**_TIME_AGG_CFG, "time_aggregation_types": ["sum"]} with pytest.raises(ValidationError): - TimeAggregateLossConfigSchema(**cfg) + TimeAggregateLossWrapperSchema(**cfg) def test_time_aggregate_loss_config_empty_agg_types() -> None: """Empty aggregation list is rejected (min_length=1).""" cfg = {**_TIME_AGG_CFG, "time_aggregation_types": []} with pytest.raises(ValidationError): - TimeAggregateLossConfigSchema(**cfg) + TimeAggregateLossWrapperSchema(**cfg) def test_optimizer_schema_allows_extra_keys() -> None: diff --git a/training/tests/unit/train/test_methods.py b/training/tests/unit/train/test_methods.py index 22a6659ce8..7d5ee62106 100644 --- a/training/tests/unit/train/test_methods.py +++ b/training/tests/unit/train/test_methods.py @@ -240,7 +240,6 @@ def test_base_compute_loss_forwards_standard_loss_kwargs() -> None: shard_shapes = [(1, 1, 1, 2, 3), (1, 1, 1, 2, 3)] module.loss = {"data": loss} - module.time_aggregate_loss = {} module.model_comm_group = group module.model_comm_group_size = 2 module.grid_dim = -2 @@ -276,7 +275,6 @@ def test_base_compute_loss_forwards_sharding_metadata_when_requested() -> None: shard_shapes = [(1, 1, 1, 2, 3), (1, 1, 1, 2, 3)] module.loss = {"data": loss} - module.time_aggregate_loss = {} module.model_comm_group = group module.model_comm_group_size = 2 module.grid_dim = -2 @@ -327,7 +325,6 @@ def test_base_compute_loss_forwards_shard_layout_to_combined_multiscale_loss( combined_loss = CombinedLoss(multiscale_loss) module.loss = {"data": combined_loss} - module.time_aggregate_loss = {} module.model_comm_group = group module.model_comm_group_size = 2 module.grid_dim = -2 From 59c0e116ee75408abf4c9c61610cd72daf5955c0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 19:23:04 +0000 Subject: [PATCH 30/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/src/anemoi/training/schemas/training.py | 9 ++++++++- training/src/anemoi/training/train/methods/base.py | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 63ee0927bb..2813873ddd 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -328,7 +328,14 @@ class Config(BaseModel.Config): class CombinedLossSchema(BaseLossSchema): - losses: list[BaseLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema | SpectralLossSchema | TimeAggregateLossWrapperSchema | MultiScaleLossSchema] = Field(min_length=1) + losses: list[ + BaseLossSchema + | AlmostFairKernelCRPSSchema + | KernelCRPSSchema + | SpectralLossSchema + | TimeAggregateLossWrapperSchema + | MultiScaleLossSchema + ] = Field(min_length=1) "Losses to combine, can be any of the normal losses." loss_weights: list[int | float] | None = None "Weightings of losses, if not set, all losses are weighted equally." diff --git a/training/src/anemoi/training/train/methods/base.py b/training/src/anemoi/training/train/methods/base.py index c6f4ce907c..fa6b572301 100644 --- a/training/src/anemoi/training/train/methods/base.py +++ b/training/src/anemoi/training/train/methods/base.py @@ -20,7 +20,6 @@ import pytorch_lightning as pl import torch from hydra.utils import instantiate -from omegaconf import DictConfig from omegaconf import OmegaConf from timm.scheduler.scheduler import Scheduler as TimmScheduler from torch_geometric.data import HeteroData From 6cb6e8791fde1c2fe8127ebd4d61f621e62a62dd Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 27 Apr 2026 19:30:13 +0000 Subject: [PATCH 31/88] rename losses --- .../src/anemoi/training/config/temporal_downscaler.yaml | 2 +- .../training/config/temporal_downscaler_ensemble.yaml | 4 ++-- .../src/anemoi/training/config/training/diffusion.yaml | 4 ++-- training/src/anemoi/training/config/training/ensemble.yaml | 4 ++-- training/src/anemoi/training/config/training/lam.yaml | 2 +- training/src/anemoi/training/config/training/multi.yaml | 2 +- training/src/anemoi/training/config/training/single.yaml | 2 +- .../src/anemoi/training/config/training/stretched.yaml | 2 +- .../training/{losses => training_loss}/combined.yaml | 0 .../config/training/{losses => training_loss}/default.yaml | 0 training/src/anemoi/training/schemas/training.py | 2 +- training/src/anemoi/training/train/methods/base.py | 7 ++----- 12 files changed, 14 insertions(+), 17 deletions(-) rename training/src/anemoi/training/config/training/{losses => training_loss}/combined.yaml (100%) rename training/src/anemoi/training/config/training/{losses => training_loss}/default.yaml (100%) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index f9f9cee002..79d74c2dd4 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -7,7 +7,7 @@ defaults: - model: graphtransformer - task: temporal_downscaler - training: single -- override training/losses: combined +- override training/training_loss: combined - _self_ config_validation: True diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index bf7fbf24b2..54757ad895 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -7,7 +7,7 @@ defaults: - model: graphtransformer_ens - task: temporal_downscaler - training: ensemble -- override training/losses: combined +- override training/training_loss: combined - _self_ config_validation: True @@ -34,7 +34,7 @@ model: training: ensemble_size_per_device: 2 - losses: + training_loss: datasets: data: _target_: anemoi.training.losses.combined.CombinedLoss diff --git a/training/src/anemoi/training/config/training/diffusion.yaml b/training/src/anemoi/training/config/training/diffusion.yaml index 41a81e6290..a736794eeb 100644 --- a/training/src/anemoi/training/config/training/diffusion.yaml +++ b/training/src/anemoi/training/config/training/diffusion.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: global - - losses: default + - training_loss: default - optimization: default - weight_averaging: null @@ -54,7 +54,7 @@ strategy: # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False -losses: +training_loss: datasets: data: _target_: anemoi.training.losses.WeightedMSELoss diff --git a/training/src/anemoi/training/config/training/ensemble.yaml b/training/src/anemoi/training/config/training/ensemble.yaml index 9e0620945a..cce0fa1272 100644 --- a/training/src/anemoi/training/config/training/ensemble.yaml +++ b/training/src/anemoi/training/config/training/ensemble.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: global - - losses: default + - training_loss: default - optimization: default - weight_averaging: null @@ -51,7 +51,7 @@ strategy: # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False -losses: +training_loss: datasets: data: _target_: anemoi.training.losses.MultiscaleLossWrapper diff --git a/training/src/anemoi/training/config/training/lam.yaml b/training/src/anemoi/training/config/training/lam.yaml index d67567508f..79b0804982 100644 --- a/training/src/anemoi/training/config/training/lam.yaml +++ b/training/src/anemoi/training/config/training/lam.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: lam - - losses: default + - training_loss: default - optimization: default - weight_averaging: null diff --git a/training/src/anemoi/training/config/training/multi.yaml b/training/src/anemoi/training/config/training/multi.yaml index 21a5eb8991..3168a0e767 100644 --- a/training/src/anemoi/training/config/training/multi.yaml +++ b/training/src/anemoi/training/config/training/multi.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: multi - - losses: default + - training_loss: default - optimization: default - weight_averaging: null diff --git a/training/src/anemoi/training/config/training/single.yaml b/training/src/anemoi/training/config/training/single.yaml index de800c2c38..ce90715716 100644 --- a/training/src/anemoi/training/config/training/single.yaml +++ b/training/src/anemoi/training/config/training/single.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: global - - losses: default + - training_loss: default - optimization: default - weight_averaging: null diff --git a/training/src/anemoi/training/config/training/stretched.yaml b/training/src/anemoi/training/config/training/stretched.yaml index 21ee343490..1f37f3523e 100644 --- a/training/src/anemoi/training/config/training/stretched.yaml +++ b/training/src/anemoi/training/config/training/stretched.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: stretched - - losses: default + - training_loss: default - optimization: default - weight_averaging: null diff --git a/training/src/anemoi/training/config/training/losses/combined.yaml b/training/src/anemoi/training/config/training/training_loss/combined.yaml similarity index 100% rename from training/src/anemoi/training/config/training/losses/combined.yaml rename to training/src/anemoi/training/config/training/training_loss/combined.yaml diff --git a/training/src/anemoi/training/config/training/losses/default.yaml b/training/src/anemoi/training/config/training/training_loss/default.yaml similarity index 100% rename from training/src/anemoi/training/config/training/losses/default.yaml rename to training/src/anemoi/training/config/training/training_loss/default.yaml diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 63ee0927bb..85a7c5b771 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -443,7 +443,7 @@ class BaseTrainingSchema(BaseModel): "Config for gradient clipping." strategy: StrategySchemas "Strategy to use." - losses: DatasetDict[LossSchemas] + training_loss: DatasetDict[LossSchemas] "Training loss configuration." weight_averaging: WeightAveragingSchema | None = Field(default=None) "Config for weight averaging (SWA or EMA). Set to null to disable." diff --git a/training/src/anemoi/training/train/methods/base.py b/training/src/anemoi/training/train/methods/base.py index c6f4ce907c..18bdf0adcb 100644 --- a/training/src/anemoi/training/train/methods/base.py +++ b/training/src/anemoi/training/train/methods/base.py @@ -20,7 +20,6 @@ import pytorch_lightning as pl import torch from hydra.utils import instantiate -from omegaconf import DictConfig from omegaconf import OmegaConf from timm.scheduler.scheduler import Scheduler as TimmScheduler from torch_geometric.data import HeteroData @@ -220,7 +219,7 @@ def __init__( self.metrics = torch.nn.ModuleDict() dataset_variable_groups = get_multiple_datasets_config(self.config.training.variable_groups) - loss_configs = get_multiple_datasets_config(config.training.losses) + loss_configs = get_multiple_datasets_config(config.training.training_loss) scalers_configs = get_multiple_datasets_config(config.training.scalers) val_metrics_configs = get_multiple_datasets_config(config.training.validation_metrics) metrics_to_log = get_multiple_datasets_config(config.training.metrics) @@ -612,9 +611,7 @@ def _compute_loss( grid_shard_shapes=self.grid_shard_shapes[dataset_name], ) - total_loss = loss(y_pred, y, **loss_kwargs) - - return total_loss + return loss(y_pred, y, **loss_kwargs) def _compute_metrics( self, From fd08cc41e5561e9bbf959bd461db3bea422e8c25 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 27 Apr 2026 19:31:34 +0000 Subject: [PATCH 32/88] rm folder --- .../training/config/losses/ensemble.yaml | 16 ------------ .../config/losses/ensemble_combined.yaml | 25 ------------------- .../anemoi/training/config/losses/single.yaml | 10 -------- .../config/losses/single_combined.yaml | 16 ------------ 4 files changed, 67 deletions(-) delete mode 100644 training/src/anemoi/training/config/losses/ensemble.yaml delete mode 100644 training/src/anemoi/training/config/losses/ensemble_combined.yaml delete mode 100644 training/src/anemoi/training/config/losses/single.yaml delete mode 100644 training/src/anemoi/training/config/losses/single_combined.yaml diff --git a/training/src/anemoi/training/config/losses/ensemble.yaml b/training/src/anemoi/training/config/losses/ensemble.yaml deleted file mode 100644 index 7f55d98ae9..0000000000 --- a/training/src/anemoi/training/config/losses/ensemble.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# @package training.training_loss -datasets: - data: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - weights: [1.0] - - keep_batch_sharded: ${model.keep_batch_sharded} - - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - no_autocast: True - alpha: 0.95 diff --git a/training/src/anemoi/training/config/losses/ensemble_combined.yaml b/training/src/anemoi/training/config/losses/ensemble_combined.yaml deleted file mode 100644 index 11e593bb2e..0000000000 --- a/training/src/anemoi/training/config/losses/ensemble_combined.yaml +++ /dev/null @@ -1,25 +0,0 @@ -datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - losses: - - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - weights: [1.0] - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - no_autocast: True - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: [mean, max, min, diff] - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - no_autocast: True - alpha: 0.95 diff --git a/training/src/anemoi/training/config/losses/single.yaml b/training/src/anemoi/training/config/losses/single.yaml deleted file mode 100644 index c7e25379ac..0000000000 --- a/training/src/anemoi/training/config/losses/single.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# @package training.training_loss -datasets: - data: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False diff --git a/training/src/anemoi/training/config/losses/single_combined.yaml b/training/src/anemoi/training/config/losses/single_combined.yaml deleted file mode 100644 index d48c1f9cc0..0000000000 --- a/training/src/anemoi/training/config/losses/single_combined.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# @package training.training_loss -datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False - losses: - - _target_: anemoi.training.losses.MSELoss - scalers: ['*'] - ignore_nans: False - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: [mean, max, min, diff] - loss_fn: - _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'node_weights'] - ignore_nans: False From c98565ee41905466c5b398b4be178c90179a7e33 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 27 Apr 2026 19:35:39 +0000 Subject: [PATCH 33/88] update configs --- .../training/config/temporal_downscaler.yaml | 8 +++ .../config/temporal_downscaler_ensemble.yaml | 8 +++ .../training/config/training/diffusion.yaml | 12 +++- .../training/config/training/ensemble.yaml | 55 +++++++++++++++++-- 4 files changed, 76 insertions(+), 7 deletions(-) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index 79d74c2dd4..cb406973c0 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -12,6 +12,14 @@ defaults: config_validation: True +### This file is for local experimentation. +## When you commit your changes, assign the new features and keywords +## to the correct defaults. +# For example to change from default GPU count: +# system: +# hardware: +# num_gpus_per_node: 1 + diagnostics: plot: callbacks: [] diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index 54757ad895..c2fa0b6b52 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -12,6 +12,14 @@ defaults: config_validation: True +### This file is for local experimentation. +## When you commit your changes, assign the new features and keywords +## to the correct defaults. +# For example to change from default GPU count: +# system: +# hardware: +# num_gpus_per_node: 1 + diagnostics: plot: callbacks: [] diff --git a/training/src/anemoi/training/config/training/diffusion.yaml b/training/src/anemoi/training/config/training/diffusion.yaml index a736794eeb..13a3f2120b 100644 --- a/training/src/anemoi/training/config/training/diffusion.yaml +++ b/training/src/anemoi/training/config/training/diffusion.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: global - - training_loss: default + - training_loss: default - optimization: default - weight_averaging: null @@ -54,10 +54,18 @@ strategy: # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False +# loss function for the model training_loss: datasets: - data: + data: # user-defined key in data + # loss class to initialise _target_: anemoi.training.losses.WeightedMSELoss + # Scalers to include in loss calculation + # A selection of available scalers are listed in training/scalers. + # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded + # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] + ignore_nans: False # Validation metrics calculation, # This may be a list, in which case all metrics will be calculated diff --git a/training/src/anemoi/training/config/training/ensemble.yaml b/training/src/anemoi/training/config/training/ensemble.yaml index cce0fa1272..f6a23cb4a8 100644 --- a/training/src/anemoi/training/config/training/ensemble.yaml +++ b/training/src/anemoi/training/config/training/ensemble.yaml @@ -51,29 +51,44 @@ strategy: # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False + +# loss function for the model +# To train without multiscale loss, set it to the desired loss directly training_loss: datasets: - data: + data: # user-defined key in data + # loss class to initialise, can be anything subclassing torch.nn.Module _target_: anemoi.training.losses.MultiscaleLossWrapper loss_matrices_path: ${system.input.loss_matrices_path} loss_matrices: [null] weights: [1.0] + keep_batch_sharded: ${model.keep_batch_sharded} + per_scale_loss: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + + # Scalers to include in loss calculation + # A selection of available scalers are listed in training/scalers. + # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded + # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. + # scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] ignore_nans: False no_autocast: True alpha: 0.95 + + # Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated +# This may be a list, in which case all metrics will be calculated # and logged according to their name. # These metrics are calculated in the output model space, and thus # have undergone postprocessing. validation_metrics: datasets: - data: + data: # user-defined key in data + # loss class to initialise, can be anything subclassing torch.nn.Module fkcrps: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS scalers: ['node_weights', 'time_steps'] @@ -92,20 +107,49 @@ validation_metrics: per_scale_loss: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS scalers: ['node_weights', 'time_steps'] + + # Scalers to include in loss calculation + # A selection of available scalers are listed in training/scalers. + # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded + # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. + # scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] ignore_nans: False no_autocast: True alpha: 1.0 + +# Variable groups definition for scaling +# The variable level scaling methods are defined under training/scalers +# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. +# Variables are assigned to a group by their param if contained in the metadata, else by their name. + +# If more complex grouping is required, groups can be defined as a dictionary, such that all +# keys must be evaluate to True. +# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level +# you can write the following: +# variable_groups: +# default: sfc +# pl: +# is_pressure_level: True +# See `anemoi.transform.variables.Variable` for the available metadata. +# Note that the former formulation of +# : +# variable_groups: +# default: sfc +# pl: [q, t, u, v, w, z] +# +# still works + variable_groups: datasets: - data: + data: # user-defined key in data default: sfc pl: param: [q, t, u, v, w, z] metrics: datasets: - data: + data: # user-defined key in data - z_500 - t_850 - u_850 @@ -115,6 +159,7 @@ metrics: max_epochs: null max_steps: 150000 + submodules_to_freeze: [] # if using torch compile, how many times a certain block of code will be recompiled in response to different inputs. From c9d77486a9d2c808896a1698e0768385b6d820d1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 19:36:21 +0000 Subject: [PATCH 34/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/src/anemoi/training/config/training/diffusion.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/training/src/anemoi/training/config/training/diffusion.yaml b/training/src/anemoi/training/config/training/diffusion.yaml index 13a3f2120b..850962577e 100644 --- a/training/src/anemoi/training/config/training/diffusion.yaml +++ b/training/src/anemoi/training/config/training/diffusion.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: global - - training_loss: default + - training_loss: default - optimization: default - weight_averaging: null From 9d5cc64425a709e9766569b07000d64e1b34b0df Mon Sep 17 00:00:00 2001 From: Mariana Clare <31656450+mc4117@users.noreply.github.com> Date: Mon, 27 Apr 2026 21:36:35 +0200 Subject: [PATCH 35/88] Clean up single.yaml by removing loss functions comments Removed commented-out section for loss functions in single.yaml. --- training/src/anemoi/training/config/training/single.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/training/src/anemoi/training/config/training/single.yaml b/training/src/anemoi/training/config/training/single.yaml index ce90715716..ab42e7ba03 100644 --- a/training/src/anemoi/training/config/training/single.yaml +++ b/training/src/anemoi/training/config/training/single.yaml @@ -40,8 +40,6 @@ strategy: num_gpus_per_model: ${system.hardware.num_gpus_per_model} read_group_size: ${dataloader.read_group_size} -# loss functions - # dynamic rescaling of the loss gradient # see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 # don't enable this by default until it's been tested and proven beneficial From 63900530ae3509b96fe47e5827c66a3568a307a9 Mon Sep 17 00:00:00 2001 From: Mariana Clare <31656450+mc4117@users.noreply.github.com> Date: Mon, 27 Apr 2026 21:37:41 +0200 Subject: [PATCH 36/88] Remove commented-out loss function section Removed commented-out section for loss function in single.yaml --- training/src/anemoi/training/config/training/single.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/training/src/anemoi/training/config/training/single.yaml b/training/src/anemoi/training/config/training/single.yaml index ab42e7ba03..4afecc6952 100644 --- a/training/src/anemoi/training/config/training/single.yaml +++ b/training/src/anemoi/training/config/training/single.yaml @@ -44,8 +44,6 @@ strategy: # see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False -# loss function for the model - # Validation metrics calculation, # This may be a list, in which case all metrics will be calculated From 3ad6f9e75ccd12a8a55c08e286cfa6088adbd49c Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 27 Apr 2026 19:46:08 +0000 Subject: [PATCH 37/88] ensemle loss --- .../training/config/temporal_downscaler.yaml | 2 +- .../config/temporal_downscaler_ensemble.yaml | 28 +---------------- .../training/config/training/diffusion.yaml | 2 +- .../training/config/training/ensemble.yaml | 31 +------------------ .../anemoi/training/config/training/lam.yaml | 2 +- .../training/config/training/multi.yaml | 2 +- .../training/config/training/single.yaml | 2 +- .../training/config/training/stretched.yaml | 2 +- .../training/training_loss/ensemble.yaml | 13 ++++++++ .../training_loss/ensemble_combined.yaml | 25 +++++++++++++++ .../{default.yaml => single.yaml} | 0 .../{combined.yaml => single_combined.yaml} | 0 12 files changed, 46 insertions(+), 63 deletions(-) create mode 100644 training/src/anemoi/training/config/training/training_loss/ensemble.yaml create mode 100644 training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml rename training/src/anemoi/training/config/training/training_loss/{default.yaml => single.yaml} (100%) rename training/src/anemoi/training/config/training/training_loss/{combined.yaml => single_combined.yaml} (100%) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index cb406973c0..d0ee2cc197 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -7,7 +7,7 @@ defaults: - model: graphtransformer - task: temporal_downscaler - training: single -- override training/training_loss: combined +- override training/training_loss: single_combined - _self_ config_validation: True diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index c2fa0b6b52..d52938e349 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -7,7 +7,7 @@ defaults: - model: graphtransformer_ens - task: temporal_downscaler - training: ensemble -- override training/training_loss: combined +- override training/training_loss: ensemble_combined - _self_ config_validation: True @@ -42,29 +42,3 @@ model: training: ensemble_size_per_device: 2 - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - losses: - - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - weights: [1.0] - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - no_autocast: True - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: [mean, max, min, diff] - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - no_autocast: True - alpha: 0.95 diff --git a/training/src/anemoi/training/config/training/diffusion.yaml b/training/src/anemoi/training/config/training/diffusion.yaml index 13a3f2120b..cacbccc5eb 100644 --- a/training/src/anemoi/training/config/training/diffusion.yaml +++ b/training/src/anemoi/training/config/training/diffusion.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: global - - training_loss: default + - training_loss: single - optimization: default - weight_averaging: null diff --git a/training/src/anemoi/training/config/training/ensemble.yaml b/training/src/anemoi/training/config/training/ensemble.yaml index f6a23cb4a8..cb0f155922 100644 --- a/training/src/anemoi/training/config/training/ensemble.yaml +++ b/training/src/anemoi/training/config/training/ensemble.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: global - - training_loss: default + - training_loss: ensemble - optimization: default - weight_averaging: null @@ -51,35 +51,6 @@ strategy: # don't enable this by default until it's been tested and proven beneficial loss_gradient_scaling: False - -# loss function for the model -# To train without multiscale loss, set it to the desired loss directly -training_loss: - datasets: - data: # user-defined key in data - # loss class to initialise, can be anything subclassing torch.nn.Module - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - weights: [1.0] - - keep_batch_sharded: ${model.keep_batch_sharded} - - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - # scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - no_autocast: True - alpha: 0.95 - - - # Validation metrics calculation, # This may be a list, in which case all metrics will be calculated # and logged according to their name. diff --git a/training/src/anemoi/training/config/training/lam.yaml b/training/src/anemoi/training/config/training/lam.yaml index 79b0804982..967ce8a315 100644 --- a/training/src/anemoi/training/config/training/lam.yaml +++ b/training/src/anemoi/training/config/training/lam.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: lam - - training_loss: default + - training_loss: single - optimization: default - weight_averaging: null diff --git a/training/src/anemoi/training/config/training/multi.yaml b/training/src/anemoi/training/config/training/multi.yaml index 3168a0e767..6cec1d1382 100644 --- a/training/src/anemoi/training/config/training/multi.yaml +++ b/training/src/anemoi/training/config/training/multi.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: multi - - training_loss: default + - training_loss: single - optimization: default - weight_averaging: null diff --git a/training/src/anemoi/training/config/training/single.yaml b/training/src/anemoi/training/config/training/single.yaml index ce90715716..9b273e760d 100644 --- a/training/src/anemoi/training/config/training/single.yaml +++ b/training/src/anemoi/training/config/training/single.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: global - - training_loss: default + - training_loss: single - optimization: default - weight_averaging: null diff --git a/training/src/anemoi/training/config/training/stretched.yaml b/training/src/anemoi/training/config/training/stretched.yaml index 1f37f3523e..f746738518 100644 --- a/training/src/anemoi/training/config/training/stretched.yaml +++ b/training/src/anemoi/training/config/training/stretched.yaml @@ -1,7 +1,7 @@ --- defaults: - scalers: stretched - - training_loss: default + - training_loss: single - optimization: default - weight_averaging: null diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble.yaml new file mode 100644 index 0000000000..fa370f7dd0 --- /dev/null +++ b/training/src/anemoi/training/config/training/training_loss/ensemble.yaml @@ -0,0 +1,13 @@ +datasets: + data: + _target_: anemoi.training.losses.MultiscaleLossWrapper + loss_matrices_path: ${system.input.loss_matrices_path} + loss_matrices: [null] + weights: [1.0] + keep_batch_sharded: ${model.keep_batch_sharded} + per_scale_loss: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + no_autocast: True + alpha: 0.95 diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml new file mode 100644 index 0000000000..11e593bb2e --- /dev/null +++ b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml @@ -0,0 +1,25 @@ +datasets: + data: + _target_: anemoi.training.losses.combined.CombinedLoss + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + losses: + - _target_: anemoi.training.losses.MultiscaleLossWrapper + loss_matrices_path: ${system.input.loss_matrices_path} + loss_matrices: [null] + weights: [1.0] + keep_batch_sharded: ${model.keep_batch_sharded} + per_scale_loss: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] + ignore_nans: False + no_autocast: True + alpha: 0.95 + - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper + time_aggregation_types: [mean, max, min, diff] + loss_fn: + _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] + ignore_nans: False + no_autocast: True + alpha: 0.95 diff --git a/training/src/anemoi/training/config/training/training_loss/default.yaml b/training/src/anemoi/training/config/training/training_loss/single.yaml similarity index 100% rename from training/src/anemoi/training/config/training/training_loss/default.yaml rename to training/src/anemoi/training/config/training/training_loss/single.yaml diff --git a/training/src/anemoi/training/config/training/training_loss/combined.yaml b/training/src/anemoi/training/config/training/training_loss/single_combined.yaml similarity index 100% rename from training/src/anemoi/training/config/training/training_loss/combined.yaml rename to training/src/anemoi/training/config/training/training_loss/single_combined.yaml From ba4aeeedfcca48d20082b119038549852facd1bf Mon Sep 17 00:00:00 2001 From: mc4117 Date: Tue, 28 Apr 2026 05:41:40 +0000 Subject: [PATCH 38/88] fix integration --- training/tests/integration/conftest.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/training/tests/integration/conftest.py b/training/tests/integration/conftest.py index 2a692aa956..d0dbb801c2 100644 --- a/training/tests/integration/conftest.py +++ b/training/tests/integration/conftest.py @@ -256,12 +256,25 @@ def handle_truncation_matrices(cfg: DictConfig, get_test_data: GetTestData) -> D training_losses_cfg = get_multiple_datasets_config(cfg.training.training_loss) for dataset_name, training_loss_cfg in training_losses_cfg.items(): - for file in training_loss_cfg.loss_matrices: - if file is not None: - tmp_path_loss_matrices = get_test_data(url_loss_matrices + file) + # Collect all loss configs that may have loss_matrices (MultiscaleLossWrapper). + # They can appear directly or nested inside a CombinedLoss's losses list. + loss_cfgs_to_check = [] + if "loss_matrices" in training_loss_cfg: + loss_cfgs_to_check.append(training_loss_cfg) + elif "losses" in training_loss_cfg: + for sub_loss in training_loss_cfg.losses: + if "loss_matrices" in sub_loss: + loss_cfgs_to_check.append(sub_loss) + + for loss_cfg in loss_cfgs_to_check: + for file in loss_cfg.loss_matrices: + if file is not None: + tmp_path_loss_matrices = get_test_data(url_loss_matrices + file) + if tmp_path_loss_matrices is not None: + loss_cfg.loss_matrices_path = str(Path(tmp_path_loss_matrices).parent) + if tmp_path_loss_matrices is not None: cfg.system.input.loss_matrices_path = Path(tmp_path_loss_matrices).parent - training_loss_cfg.loss_matrices_path = str(Path(tmp_path_loss_matrices).parent) cfg.training.validation_metrics.datasets[dataset_name].multiscale.loss_matrices_path = str( Path(tmp_path_loss_matrices).parent, From 3d2317006c54eff46c48168ba93b26414ebe3576 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Tue, 28 Apr 2026 05:46:31 +0000 Subject: [PATCH 39/88] fix pre commit --- training/tests/integration/conftest.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/training/tests/integration/conftest.py b/training/tests/integration/conftest.py index d0dbb801c2..c1ea5a3705 100644 --- a/training/tests/integration/conftest.py +++ b/training/tests/integration/conftest.py @@ -250,21 +250,22 @@ def lam_config_with_graph( return cfg, urls +def _get_loss_cfgs_with_matrices(training_loss_cfg: DictConfig) -> list[DictConfig]: + """Extract loss configs that have loss_matrices, handling both direct and CombinedLoss cases.""" + if "loss_matrices" in training_loss_cfg: + return [training_loss_cfg] + if "losses" in training_loss_cfg: + return [sub_loss for sub_loss in training_loss_cfg.losses if "loss_matrices" in sub_loss] + return [] + + def handle_truncation_matrices(cfg: DictConfig, get_test_data: GetTestData) -> DictConfig: url_loss_matrices = cfg.system.input.loss_matrices_path tmp_path_loss_matrices = None training_losses_cfg = get_multiple_datasets_config(cfg.training.training_loss) for dataset_name, training_loss_cfg in training_losses_cfg.items(): - # Collect all loss configs that may have loss_matrices (MultiscaleLossWrapper). - # They can appear directly or nested inside a CombinedLoss's losses list. - loss_cfgs_to_check = [] - if "loss_matrices" in training_loss_cfg: - loss_cfgs_to_check.append(training_loss_cfg) - elif "losses" in training_loss_cfg: - for sub_loss in training_loss_cfg.losses: - if "loss_matrices" in sub_loss: - loss_cfgs_to_check.append(sub_loss) + loss_cfgs_to_check = _get_loss_cfgs_with_matrices(training_loss_cfg) for loss_cfg in loss_cfgs_to_check: for file in loss_cfg.loss_matrices: From 3b0d59e3fd0d23b90196afd7a84e7ab13f5ec58d Mon Sep 17 00:00:00 2001 From: mc4117 Date: Tue, 28 Apr 2026 07:38:17 +0000 Subject: [PATCH 40/88] fix integration tests --- training/src/anemoi/training/losses/aggregate.py | 2 +- training/src/anemoi/training/losses/loss.py | 4 ++-- training/src/anemoi/training/losses/utils.py | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index a8946f6b89..f31c7aea15 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -74,7 +74,7 @@ def forward( assert ( pred.shape[1] > 1 ), "TimeAggregateLossWrapper requires an output time dimension of size > 1 for aggregation." - loss = torch.zeros(1, dtype=pred.dtype, device=pred.device, requires_grad=False) + loss = torch.tensor(0.0, dtype=pred.dtype, device=pred.device, requires_grad=False) shared_kwargs = dict( squash=squash, diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py index d427d5f92b..e1f5be0ee3 100644 --- a/training/src/anemoi/training/losses/loss.py +++ b/training/src/anemoi/training/losses/loss.py @@ -140,12 +140,12 @@ def get_loss_function( if "_target_" in loss_config and loss_config["_target_"] in NESTED_LOSSES: per_scale_loss_config = loss_config.pop("per_scale_loss") per_scale_loss = get_loss_function(OmegaConf.create(per_scale_loss_config), scalers, data_indices) - return instantiate(loss_config, per_scale_loss=per_scale_loss, **kwargs) + return instantiate(loss_config, per_scale_loss=per_scale_loss) if "_target_" in loss_config and loss_config["_target_"] in WRAPPED_LOSSES: inner_loss_config = loss_config.pop("loss_fn") inner_loss = get_loss_function(OmegaConf.create(inner_loss_config), scalers, data_indices) - return instantiate(loss_config, loss_fn=inner_loss, **kwargs) + return instantiate(loss_config, loss_fn=inner_loss) if scalers is None: scalers = {} diff --git a/training/src/anemoi/training/losses/utils.py b/training/src/anemoi/training/losses/utils.py index 0285c35461..e5043bf05b 100644 --- a/training/src/anemoi/training/losses/utils.py +++ b/training/src/anemoi/training/losses/utils.py @@ -13,6 +13,7 @@ import logging from typing import TYPE_CHECKING +from anemoi.training.losses.aggregate import TimeAggregateLossWrapper from anemoi.training.losses.combined import CombinedLoss from anemoi.training.losses.multiscale import MultiscaleLossWrapper from anemoi.training.losses.variable_mapper import LossVariableMapper @@ -64,6 +65,9 @@ def print_variable_scaling(loss: BaseLoss, data_indices: IndexCollection) -> dic if isinstance(loss, MultiscaleLossWrapper): return print_variable_scaling(loss.loss, data_indices) + if isinstance(loss, TimeAggregateLossWrapper): + return print_variable_scaling(loss.loss_fn, data_indices) + if isinstance(loss, LossVariableMapper): subset_vars = enumerate(loss.predicted_variables) # LossVariableMapper forwards scalers to its inner loss, so get scaling from there From 426891ea12941ea4f4c697a99806d89d86f27e89 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Tue, 28 Apr 2026 14:56:52 +0000 Subject: [PATCH 41/88] revert change to base loss --- training/src/anemoi/training/losses/base.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/training/src/anemoi/training/losses/base.py b/training/src/anemoi/training/losses/base.py index c2a8fdf8f8..bd923d69f8 100644 --- a/training/src/anemoi/training/losses/base.py +++ b/training/src/anemoi/training/losses/base.py @@ -339,10 +339,6 @@ def forward( Weighted loss """ is_sharded = grid_shard_slice is not None - # When target has one fewer dimension than pred, insert the ensemble dim so - # broadcasting aligns (bs, t, 1, latlon, nvar) against (bs, t, ens, latlon, nvar). - if target.ndim == pred.ndim - 1: - target = target.unsqueeze(TensorDim.ENSEMBLE_DIM) out = self.calculate_difference(pred, target) out = self.scale(out, scaler_indices, without_scalers=without_scalers, grid_shard_slice=grid_shard_slice) return self.reduce(out, squash, group=group if is_sharded else None, squash_mode=squash_mode) From 938430234fd08a1fdc974dfc5f494949d9b98357 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Tue, 28 Apr 2026 15:34:05 +0000 Subject: [PATCH 42/88] fix failing test --- training/tests/unit/losses/test_aggregate_loss.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index cfd6aed221..535f8357eb 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -98,21 +98,6 @@ def test_empty_aggregation_returns_zero(pred: torch.Tensor, target: torch.Tensor assert torch.allclose(result, torch.zeros(1)) -# --------------------------------------------------------------------------- -# Correctness: perfect predictions yield zero loss -# --------------------------------------------------------------------------- - - -@pytest.mark.parametrize("agg_op", ["mean", "min", "max", "diff"]) -def test_zero_loss_for_perfect_predictions(agg_op: str) -> None: - x = torch.rand(BS, TIME, ENS, LATLON, NVAR) - # target matches pred (broadcast ens dimension away) - perfect_target = x[:, :, 0, :, :] # (bs, time, latlon, nvar) - wrapper = TimeAggregateLossWrapper([agg_op], _make_loss()) - result = wrapper(x, perfect_target) - assert torch.allclose(result, torch.zeros(1), atol=1e-6), f"{agg_op}: expected zero loss for perfect predictions" - - # --------------------------------------------------------------------------- # Correctness: accumulation across multiple time aggregation types # --------------------------------------------------------------------------- From 89818665079f43d036425bba3c5800305f4a3f87 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Wed, 29 Apr 2026 07:11:21 +0000 Subject: [PATCH 43/88] update documentation --- training/docs/modules/losses.rst | 57 ++++++++++++++++++++++++++++++++ training/docs/modules/tasks.rst | 3 ++ 2 files changed, 60 insertions(+) diff --git a/training/docs/modules/losses.rst b/training/docs/modules/losses.rst index ebec34847d..5926db3d08 100644 --- a/training/docs/modules/losses.rst +++ b/training/docs/modules/losses.rst @@ -81,6 +81,63 @@ deterministic: _target_: anemoi.training.losses.kcrps.KernelCRPSLoss # loss function kwargs here +*************************** + Time Aggregate Loss Functions +*************************** + +A key challenge in temporal downscaling is **temporal consistency**: the +model must produce output sequences that are internally coherent over +time, not just accurate at each individual step. This is especially +critical for variables like precipitation (``tp``, ``cp``) whose +statistics (totals, extremes, and temporal gradients) matter as much as +instantaneous values. + +:class:`~anemoi.training.losses.aggregate.TimeAggregateLossWrapper` +addresses this by applying a base loss function to *time-aggregated* +versions of the prediction and target, rather than step-by-step. The +following aggregations are supported: + +.. list-table:: + :widths: 15 85 + :header-rows: 1 + + - - Aggregation + - Description + + - - ``mean`` + - Mean over the output time window — penalises bias in the + temporal average. + + - - ``max`` + - Maximum over the output time window — penalises errors in peak + values. + + - - ``min`` + - Minimum over the output time window — penalises errors in + minimum values. + + - - ``diff`` + - Consecutive step-to-step differences + (``pred[:, 1:] - pred[:, :-1]``) — penalises unrealistic + temporal transitions and discontinuities. + +The wrapper accumulates the specified loss function evaluated on each aggregation in +turn and returns the sum. Because the ``time_steps`` scaler is +intentionally excluded from the inner ``loss_fn`` (temporal aggregation +collapses the time dimension), only spatial and variable scalers should +be listed there. + +.. note:: + + ``TimeAggregateLossWrapper`` requires an output time dimension + greater than one, as it is not + meaningful for single-step tasks. + +We strongly recommend using the time aggregate loss when training any +temporal downscaler. The pre-built config variants ``single_combined`` +and ``ensemble_combined`` combine it with the primary loss inside a +:class:`~anemoi.training.losses.combined.CombinedLoss`. + *************************** Multiscale Loss Functions *************************** diff --git a/training/docs/modules/tasks.rst b/training/docs/modules/tasks.rst index 79fcff8643..c9a1060ae6 100644 --- a/training/docs/modules/tasks.rst +++ b/training/docs/modules/tasks.rst @@ -155,6 +155,9 @@ Example: ``input_timestep="6H"``, ``output_timestep="3H"``, ``output_left_boundary=True`` produces output offsets ``[0H, 3H]`` and input offsets ``[0H, 6H]``. +We strongly recommend using the time aggregate loss when training any +temporal downscaler. + .. automodule:: anemoi.training.tasks.temporal_downscaling :members: :no-undoc-members: From 009e07f98d4c1d2968545930135bd882ff848aff Mon Sep 17 00:00:00 2001 From: Vera <121622878+VeraChristina@users.noreply.github.com> Date: Fri, 1 May 2026 12:56:58 +0100 Subject: [PATCH 44/88] feat: add BaseLossWrapper as transparent loss wrapper base class (#1082) ## Description Make the aggregate loss wrapper "transparent", i.e. share scalers with the inner loss and delegate metadata and scaler handling methods. Add a BaseLossWrapper to make the transparent loss wrapping the default for nested wrappers. --- .../training_loss/ensemble_combined.yaml | 2 +- .../training_loss/single_combined.yaml | 2 +- .../src/anemoi/training/losses/aggregate.py | 11 +++-- training/src/anemoi/training/losses/base.py | 47 +++++++++++++++++++ training/src/anemoi/training/losses/loss.py | 11 ++++- .../src/anemoi/training/losses/multiscale.py | 21 ++------- training/src/anemoi/training/losses/utils.py | 11 ++--- .../anemoi/training/losses/variable_mapper.py | 25 ++-------- .../src/anemoi/training/schemas/training.py | 38 +++++++++++++-- .../tests/unit/losses/test_aggregate_loss.py | 4 +- 10 files changed, 111 insertions(+), 61 deletions(-) diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml index 11e593bb2e..900d9cdd09 100644 --- a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml +++ b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml @@ -16,10 +16,10 @@ datasets: no_autocast: True alpha: 0.95 - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper + scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] time_aggregation_types: [mean, max, min, diff] loss_fn: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] ignore_nans: False no_autocast: True alpha: 0.95 diff --git a/training/src/anemoi/training/config/training/training_loss/single_combined.yaml b/training/src/anemoi/training/config/training/training_loss/single_combined.yaml index 4599d51685..cf18e68746 100644 --- a/training/src/anemoi/training/config/training/training_loss/single_combined.yaml +++ b/training/src/anemoi/training/config/training/training_loss/single_combined.yaml @@ -8,8 +8,8 @@ datasets: scalers: ['*'] ignore_nans: False - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper + scalers: ['pressure_level', 'general_variable', 'node_weights'] time_aggregation_types: [mean, max, min, diff] loss_fn: _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'node_weights'] ignore_nans: False diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index f31c7aea15..5e2d2484fb 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -5,15 +5,17 @@ import torch -from anemoi.training.losses.base import BaseLoss +from anemoi.training.losses.base import BaseLossWrapper if TYPE_CHECKING: from torch.distributed.distributed_c10d import ProcessGroup + from anemoi.training.losses.base import BaseLoss + LOGGER = logging.getLogger(__name__) -class TimeAggregateLossWrapper(BaseLoss): +class TimeAggregateLossWrapper(BaseLossWrapper): """Wraps a base loss and applies it to time-aggregated predictions. Supported time aggregation types: @@ -28,9 +30,8 @@ def __init__( loss_fn: BaseLoss, ignore_nans: bool = False, ) -> None: - super().__init__(ignore_nans=ignore_nans) + super().__init__(loss=loss_fn, ignore_nans=ignore_nans) self.time_aggregation_types = time_aggregation_types - self.loss_fn = loss_fn def forward( self, @@ -104,6 +105,6 @@ def forward( msg = f"Unknown aggregation type '{agg_op}'. Supported: 'diff', 'mean', 'min', 'max'." raise ValueError(msg) - loss = loss + self.loss_fn(pred_agg, target_agg, **shared_kwargs) + loss = loss + self.loss(pred_agg, target_agg, **shared_kwargs) return loss diff --git a/training/src/anemoi/training/losses/base.py b/training/src/anemoi/training/losses/base.py index bd923d69f8..2c020110a8 100644 --- a/training/src/anemoi/training/losses/base.py +++ b/training/src/anemoi/training/losses/base.py @@ -14,6 +14,7 @@ from abc import abstractmethod from collections.abc import Iterator from enum import StrEnum +from typing import Any from typing import ClassVar import torch @@ -277,6 +278,52 @@ def forward( """ +class BaseLossWrapper(BaseLoss): + """Transparent wrapper around a single inner loss. + + By default, all scaler and metadata methods are delegated to the + wrapped loss so that the wrapper behaves as if it *were* the inner + loss from the perspective of ``CombinedLoss`` and the scaler + machinery. Subclasses only need to override ``forward``. + """ + + def __init__(self, loss: BaseLoss, **kwargs: Any) -> None: + super().__init__(**kwargs) + if not isinstance(loss, BaseLoss): + msg = f"Invalid loss type provided: {type(loss)}. Expected BaseLoss." + raise TypeError(msg) + self.loss = loss + # Share the inner loss's scaler so that scaler additions/updates + # applied to this wrapper are visible to the actual loss computation. + self.scaler = self.loss.scaler + self.supports_sharding = getattr(self.loss, "supports_sharding", True) + + # -- scaler delegation -------------------------------------------------- + + @functools.wraps(ScaleTensor.add_scaler) + def add_scaler(self, dimension: int | tuple[int], scaler: torch.Tensor, *, name: str | None = None) -> None: + self.loss.add_scaler(dimension=dimension, scaler=scaler, name=name) + + @functools.wraps(ScaleTensor.update_scaler) + def update_scaler(self, name: str, scaler: torch.Tensor, *, override: bool = False) -> None: + self.loss.update_scaler(name=name, scaler=scaler, override=override) + + @functools.wraps(ScaleTensor.has_scaler_for_dim) + def has_scaler_for_dim(self, dim: TensorDim) -> bool: + return self.loss.has_scaler_for_dim(dim=dim) + + # -- metadata delegation ------------------------------------------------ + + @property + def needs_shard_layout_info(self) -> bool: + """Delegate to the wrapped loss.""" + return getattr(self.loss, "needs_shard_layout_info", False) + + def iter_leaf_losses(self) -> Iterator["BaseLoss"]: + """Yield leaf losses from the wrapped loss.""" + yield from self.loss.iter_leaf_losses() + + class FunctionalLoss(BaseLoss): """Loss which a user can subclass and provide `calculate_difference`. diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py index e1f5be0ee3..30e1abeb4b 100644 --- a/training/src/anemoi/training/losses/loss.py +++ b/training/src/anemoi/training/losses/loss.py @@ -145,7 +145,16 @@ def get_loss_function( if "_target_" in loss_config and loss_config["_target_"] in WRAPPED_LOSSES: inner_loss_config = loss_config.pop("loss_fn") inner_loss = get_loss_function(OmegaConf.create(inner_loss_config), scalers, data_indices) - return instantiate(loss_config, loss_fn=inner_loss) + wrapper = instantiate(loss_config, loss_fn=inner_loss) + # Apply any scalers specified on the wrapper itself (delegated to the inner loss). + if scalers_to_include and scalers: + resolved = ( + [s for s in scalers if f"!{s}" not in scalers_to_include] + if "*" in scalers_to_include + else list(scalers_to_include) + ) + _apply_scalers(wrapper, resolved, scalers, data_indices) + return wrapper if scalers is None: scalers = {} diff --git a/training/src/anemoi/training/losses/multiscale.py b/training/src/anemoi/training/losses/multiscale.py index 46a7890e5e..dbf5f5aa6d 100644 --- a/training/src/anemoi/training/losses/multiscale.py +++ b/training/src/anemoi/training/losses/multiscale.py @@ -21,11 +21,12 @@ from anemoi.models.layers.graph_provider import ProjectionGraphProvider from anemoi.models.layers.sparse_projector import SparseProjector from anemoi.training.losses.base import BaseLoss +from anemoi.training.losses.base import BaseLossWrapper LOGGER = logging.getLogger(__name__) -class MultiscaleLossWrapper(BaseLoss): +class MultiscaleLossWrapper(BaseLossWrapper): name: str = "MultiscaleLossWrapper" @@ -59,7 +60,7 @@ def __init__( autocast : bool Whether to use automatic mixed precision for the projections """ - super().__init__() + super().__init__(loss=per_scale_loss) self.smoothing_matrices = self._load_smoothing_matrices(loss_matrices_path, loss_matrices) self.num_scales = len(self.smoothing_matrices) @@ -67,8 +68,6 @@ def __init__( len(weights) == self.num_scales ), f"Number of weights ({len(weights)}) must match number of scales ({self.num_scales})" self.weights = weights - self.loss = per_scale_loss - self.scaler = self.loss.scaler self.keep_batch_sharded = keep_batch_sharded self.supports_sharding = True self.mloss = None @@ -84,20 +83,6 @@ def needs_shard_layout_info(self) -> bool: """ return self.keep_batch_sharded - def update_scaler(self, name: str, scaler: torch.Tensor, *, override: bool = False) -> None: - """Update the scaler values for the internal loss. - - Parameters - ---------- - name : str - Name of the scaler to update - scaler : torch.Tensor - New scaler values - override : bool, optional - Whether to override existing scaler values, by default False - """ - self.loss.update_scaler(name=name, scaler=scaler, override=override) - def _load_smoothing_matrices( self, loss_matrices_path: Path | str, diff --git a/training/src/anemoi/training/losses/utils.py b/training/src/anemoi/training/losses/utils.py index e5043bf05b..340a9591c9 100644 --- a/training/src/anemoi/training/losses/utils.py +++ b/training/src/anemoi/training/losses/utils.py @@ -13,9 +13,8 @@ import logging from typing import TYPE_CHECKING -from anemoi.training.losses.aggregate import TimeAggregateLossWrapper +from anemoi.training.losses.base import BaseLossWrapper from anemoi.training.losses.combined import CombinedLoss -from anemoi.training.losses.multiscale import MultiscaleLossWrapper from anemoi.training.losses.variable_mapper import LossVariableMapper from anemoi.training.utils.enums import TensorDim @@ -62,16 +61,12 @@ def print_variable_scaling(loss: BaseLoss, data_indices: IndexCollection) -> dic variable_scaling[f"{base_key}{suffix}"] = print_variable_scaling(sub_loss, data_indices) return variable_scaling - if isinstance(loss, MultiscaleLossWrapper): - return print_variable_scaling(loss.loss, data_indices) - - if isinstance(loss, TimeAggregateLossWrapper): - return print_variable_scaling(loss.loss_fn, data_indices) - if isinstance(loss, LossVariableMapper): subset_vars = enumerate(loss.predicted_variables) # LossVariableMapper forwards scalers to its inner loss, so get scaling from there scaler_source = loss.loss.scaler + elif isinstance(loss, BaseLossWrapper): + return print_variable_scaling(loss.loss, data_indices) else: subset_vars = enumerate(data_indices.model.output.name_to_index.keys()) scaler_source = loss.scaler diff --git a/training/src/anemoi/training/losses/variable_mapper.py b/training/src/anemoi/training/losses/variable_mapper.py index 55c7ab074c..4cafba754c 100644 --- a/training/src/anemoi/training/losses/variable_mapper.py +++ b/training/src/anemoi/training/losses/variable_mapper.py @@ -17,6 +17,7 @@ from anemoi.models.data_indices.collection import IndexCollection from anemoi.training.losses.base import BaseLoss +from anemoi.training.losses.base import BaseLossWrapper from anemoi.training.losses.scaler_tensor import ScaleTensor from anemoi.training.utils.enums import TensorDim from anemoi.training.utils.index_space import IndexSpace @@ -24,7 +25,7 @@ LOGGER = logging.getLogger(__name__) -class LossVariableMapper(BaseLoss): +class LossVariableMapper(BaseLossWrapper): """Loss wrapper to filter variables to compute the loss on.""" def __init__( @@ -52,18 +53,9 @@ def __init__( target_variables, ), "predicted and target variables must have the same length for loss computation" - super().__init__() + super().__init__(loss=loss) self._loss_scaler_specification = {} - if not isinstance(loss, BaseLoss): - msg = f"Invalid loss type provided: {type(loss)}. Expected BaseLoss." - raise TypeError(msg) - self.loss = loss - if hasattr(self.loss, "scaler"): - # Share the inner loss scaler so scaler membership and updates remain visible - # to training/task utilities that inspect `loss.scaler`. - self.scaler = self.loss.scaler - self.supports_sharding = getattr(self.loss, "supports_sharding", False) self.predicted_variables = list(predicted_variables) if predicted_variables is not None else None self.target_variables = list(target_variables) if target_variables is not None else None self.data_indices: IndexCollection | None = None @@ -72,11 +64,6 @@ def __init__( if data_indices is not None: self.set_data_indices(data_indices) - @property - def needs_shard_layout_info(self) -> bool: - """Whether the wrapped loss requires explicit shard-layout metadata.""" - return getattr(self.loss, "needs_shard_layout_info", False) - def _get_predicted_indices_for_scaler_variable_axis(self, variable_size: int) -> list[int] | None: if variable_size == 1: # Broadcast scalers do not need filtering. @@ -155,15 +142,11 @@ def add_scaler(self, dimension: int | tuple[int], scaler: torch.Tensor, *, name: @functools.wraps(ScaleTensor.update_scaler) def update_scaler(self, name: str, scaler: torch.Tensor, *, override: bool = False) -> None: # Keep update behavior consistent with add_scaler for VARIABLE-axis scalers. - if hasattr(self.loss, "scaler") and name in self.loss.scaler.tensors: + if name in self.loss.scaler.tensors: dimension = self.loss.scaler.tensors[name][0] scaler = self._filter_variable_axis_scaler(dimension, scaler) self.loss.update_scaler(name=name, scaler=scaler, override=override) - @functools.wraps(ScaleTensor.has_scaler_for_dim) - def has_scaler_for_dim(self, dim: TensorDim) -> bool: - return self.loss.has_scaler_for_dim(dim=dim) - @staticmethod def _to_layout(layout: IndexSpace | str, *, layout_name: str) -> IndexSpace: if isinstance(layout, IndexSpace): diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 4b6271a1e6..763c6c20d2 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -291,6 +291,23 @@ class MultiScaleLossSchema(BaseModel): keep_batch_sharded: bool loss_matrices_path: str | None = None loss_matrices: list[str | None] + scalers: list[str] | None = None + "Scalers to apply to the wrapped loss (delegated to inner per_scale_loss)." + + @field_validator("per_scale_loss", mode="before") + @classmethod + def add_empty_scalers_to_inner(cls, v: Any) -> Any: + """Inject empty scalers for inner loss; scalers flow through the wrapper.""" + if isinstance(v, dict) and "scalers" not in v: + v["scalers"] = [] + else: + from omegaconf import DictConfig + from omegaconf.omegaconf import open_dict + + if isinstance(v, DictConfig) and "scalers" not in v: + with open_dict(v): + v["scalers"] = [] + return v @field_validator("weights") @classmethod @@ -308,6 +325,23 @@ class TimeAggregateLossWrapperSchema(BaseModel): "Time aggregation operations to apply over the time dimension before computing the loss." loss_fn: BaseLossSchema | AlmostFairKernelCRPSSchema | KernelCRPSSchema "Inner loss function applied to each time-aggregated output." + scalers: list[str] | None = None + "Scalers to apply to the wrapped loss (delegated to inner loss_fn)." + + @field_validator("loss_fn", mode="before") + @classmethod + def add_empty_scalers_to_inner(cls, v: Any) -> Any: + """Inject empty scalers for inner loss; scalers flow through the wrapper.""" + if isinstance(v, dict) and "scalers" not in v: + v["scalers"] = [] + else: + from omegaconf import DictConfig + from omegaconf.omegaconf import open_dict + + if isinstance(v, DictConfig) and "scalers" not in v: + with open_dict(v): + v["scalers"] = [] + return v class HuberLossSchema(BaseLossSchema): @@ -348,10 +382,6 @@ def add_empty_scalers(cls, losses: Any) -> Any: from omegaconf.omegaconf import open_dict for loss in losses: - # TimeAggregateLossWrapper and MultiscaleLossWrapper don't have top-level scalers - target = loss.get("_target_", "") if isinstance(loss, (dict, DictConfig)) else "" - if "TimeAggregateLossWrapper" in target or "MultiscaleLossWrapper" in target: - continue if "scalers" not in loss: if isinstance(loss, DictConfig): with open_dict(loss): diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index 535f8357eb..eed8c9ac46 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -61,10 +61,10 @@ def test_is_base_loss() -> None: assert isinstance(wrapper, BaseLoss) -def test_stores_loss_fn_and_agg_types() -> None: +def test_stores_loss_and_agg_types() -> None: inner = _make_loss() wrapper = TimeAggregateLossWrapper(["mean", "diff"], inner) - assert wrapper.loss_fn is inner + assert wrapper.loss is inner assert wrapper.time_aggregation_types == ["mean", "diff"] From d246cec06534b1f7b50b27f54aa7d8b9035cd5c5 Mon Sep 17 00:00:00 2001 From: Simon Lang Date: Fri, 1 May 2026 15:08:32 +0000 Subject: [PATCH 45/88] preserve inner loss squash mode when defaults are used ; use amin amax --- .../src/anemoi/training/losses/aggregate.py | 28 +++++------ .../tests/unit/losses/test_aggregate_loss.py | 47 ++++++++++++------- 2 files changed, 44 insertions(+), 31 deletions(-) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 5e2d2484fb..2f03958ce0 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -43,7 +43,7 @@ def forward( without_scalers: list[str] | list[int] | None = None, grid_shard_slice: slice | None = None, group: ProcessGroup | None = None, - squash_mode: str = "avg", + squash_mode: str | None = None, **kwargs, ) -> torch.Tensor: """Compute the time aggregate loss over all time aggregation types. @@ -64,8 +64,8 @@ def forward( Grid shard slice, by default ``None``. group : ProcessGroup | None, optional Distributed group for reduction, by default ``None``. - squash_mode : str, optional - Variable-dimension reduction mode, by default ``"avg"``. + squash_mode : str | None, optional + Variable-dimension reduction mode. If omitted, the wrapped loss default is used. Returns ------- @@ -83,24 +83,24 @@ def forward( without_scalers=without_scalers, grid_shard_slice=grid_shard_slice, group=group, - squash_mode=squash_mode, **kwargs, ) + if squash_mode is not None: + shared_kwargs["squash_mode"] = squash_mode for agg_op in self.time_aggregation_types: if agg_op == "diff": pred_agg = pred[:, 1:, ...] - pred[:, :-1, ...] # (bs, time-1, ens, latlon, nvar) target_agg = target[:, 1:, ...] - target[:, :-1, ...] # (bs, time-1, latlon, nvar) - elif agg_op in {"mean", "min", "max"}: - agg_fn = getattr(torch, agg_op) - pred_result = agg_fn(pred, dim=1, keepdim=True) - target_result = agg_fn(target, dim=1, keepdim=True) - if agg_op in {"max", "min"}: - pred_agg = pred_result.values # (bs, 1, ens, latlon, nvar) - target_agg = target_result.values # (bs, 1, latlon, nvar) - else: - pred_agg = pred_result # (bs, 1, ens, latlon, nvar) - target_agg = target_result # (bs, 1, latlon, nvar) + elif agg_op == "mean": + pred_agg = torch.mean(pred, dim=1, keepdim=True) # (bs, 1, ens, latlon, nvar) + target_agg = torch.mean(target, dim=1, keepdim=True) # (bs, 1, latlon, nvar) + elif agg_op == "min": + pred_agg = torch.amin(pred, dim=1, keepdim=True) # (bs, 1, ens, latlon, nvar) + target_agg = torch.amin(target, dim=1, keepdim=True) # (bs, 1, latlon, nvar) + elif agg_op == "max": + pred_agg = torch.amax(pred, dim=1, keepdim=True) # (bs, 1, ens, latlon, nvar) + target_agg = torch.amax(target, dim=1, keepdim=True) # (bs, 1, latlon, nvar) else: msg = f"Unknown aggregation type '{agg_op}'. Supported: 'diff', 'mean', 'min', 'max'." raise ValueError(msg) diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index eed8c9ac46..a159d19204 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -151,15 +151,15 @@ def test_reduction_aggregation_reduces_time_dim(agg_op: str) -> None: pred = torch.rand(BS, TIME, ENS, LATLON, NVAR) target = torch.rand(BS, TIME, LATLON, NVAR) - agg_fn = getattr(torch, agg_op) - pred_result = agg_fn(pred, dim=1, keepdim=True) - target_result = agg_fn(target, dim=1, keepdim=True) - if agg_op in {"min", "max"}: - pred_agg = pred_result.values - target_agg = target_result.values + if agg_op == "min": + pred_agg = torch.amin(pred, dim=1, keepdim=True) + target_agg = torch.amin(target, dim=1, keepdim=True) + elif agg_op == "max": + pred_agg = torch.amax(pred, dim=1, keepdim=True) + target_agg = torch.amax(target, dim=1, keepdim=True) else: - pred_agg = pred_result - target_agg = target_result + pred_agg = torch.mean(pred, dim=1, keepdim=True) + target_agg = torch.mean(target, dim=1, keepdim=True) expected = inner(pred_agg, target_agg) result = TimeAggregateLossWrapper([agg_op], inner)(pred, target) @@ -212,22 +212,35 @@ def test_crps_reduction_reduces_time_dim(agg_op: str) -> None: pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) target = torch.rand(BS, TIME, LATLON, NVAR) - agg_fn = getattr(torch, agg_op) - pred_result = agg_fn(pred, dim=1, keepdim=True) - target_result = agg_fn(target, dim=1, keepdim=True) - if agg_op in {"min", "max"}: - pred_agg = pred_result.values - target_agg = target_result.values + if agg_op == "min": + pred_agg = torch.amin(pred, dim=1, keepdim=True) + target_agg = torch.amin(target, dim=1, keepdim=True) + elif agg_op == "max": + pred_agg = torch.amax(pred, dim=1, keepdim=True) + target_agg = torch.amax(target, dim=1, keepdim=True) else: - pred_agg = pred_result - target_agg = target_result + pred_agg = torch.mean(pred, dim=1, keepdim=True) + target_agg = torch.mean(target, dim=1, keepdim=True) - expected = inner(pred_agg, target_agg, squash_mode="avg") + expected = inner(pred_agg, target_agg) result = TimeAggregateLossWrapper([agg_op], inner)(pred, target) assert torch.allclose(result, expected, atol=1e-6) +def test_crps_wrapper_forwards_explicit_squash_mode() -> None: + inner = _make_crps_loss() + pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) + target = torch.rand(BS, TIME, LATLON, NVAR) + pred_mean = torch.mean(pred, dim=1, keepdim=True) + target_mean = torch.mean(target, dim=1, keepdim=True) + + expected = inner(pred_mean, target_mean, squash_mode="avg") + result = TimeAggregateLossWrapper(["mean"], inner)(pred, target, squash_mode="avg") + + assert torch.allclose(result, expected, atol=1e-6) + + # --------------------------------------------------------------------------- # Unknown aggregation type raises ValueError # --------------------------------------------------------------------------- From 8b6773238d1cdc70501baf31d56ce2aac141ab02 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 8 May 2026 14:41:39 +0000 Subject: [PATCH 46/88] change loss calculation --- .github/CODEOWNERS | 0 .github/dependabot.yml | 0 .github/labeler.yml | 0 .github/pull_request_template.md | 0 .github/workflows/inactivity-bot.yml | 0 .github/workflows/integration-tests-hpc.yml | 0 .github/workflows/pr-conventional-commit.yml | 0 .github/workflows/pr-label-ats.yml | 0 .../pr-label-conventional-commits.yml | 0 .github/workflows/pr-label-file-based.yml | 0 .github/workflows/pr-label-public.yml | 0 .github/workflows/pr-release.yml | 0 .github/workflows/push-to-private.yml | 0 .github/workflows/python-publish.yml | 0 .github/workflows/python-pull-request.yml | 0 .github/workflows/readthedocs-pr-update.yml | 0 .github/workflows/release-please.yml | 0 .gitignore | 0 .isort.cfg | 0 .pre-commit-config.yaml | 0 .release-please-config.json | 0 .release-please-manifest.json | 0 CONTRIBUTORS.md | 0 LICENCES/APPLE_ML_ACKNOWLEDGEMENTS | 0 LICENCES/APPLE_ML_ADEMAMIX_LICENSE | 0 LICENSE | 0 NOTICE.md | 0 README.md | 0 graphs/.gitattributes | 0 graphs/.gitignore | 0 graphs/.readthedocs.yaml | 0 graphs/CHANGELOG.md | 0 graphs/CONTRIBUTORS.md | 0 graphs/LICENSE | 0 graphs/README.md | 0 graphs/docs/Makefile | 0 graphs/docs/_static/cutoff.jpg | Bin graphs/docs/_static/enc_proc_dec.png | Bin graphs/docs/_static/graph_configurations.png | Bin graphs/docs/_static/hetero_data_graph.txt | 0 graphs/docs/_static/logo.png | Bin graphs/docs/_static/multi_scale_edges.svg | 0 graphs/docs/_static/processor.html | 0 graphs/docs/_static/style.css | 0 graphs/docs/_static/trinodes.png | Bin graphs/docs/_templates/.gitkeep | 0 graphs/docs/cli/introduction.rst | 0 graphs/docs/conf.py | 0 graphs/docs/contributing.rst | 0 graphs/docs/graphs/edge_attributes.rst | 0 graphs/docs/graphs/edges.rst | 0 graphs/docs/graphs/edges/cutoff.rst | 0 graphs/docs/graphs/edges/knn.rst | 0 graphs/docs/graphs/edges/multi_scale.rst | 0 .../docs/graphs/edges/tri_refined_edges.csv | 0 graphs/docs/graphs/introduction.rst | 0 graphs/docs/graphs/node_attributes.rst | 0 .../anemoi_dataset_attribute.rst | 0 .../graphs/node_attributes/area_masks.rst | 0 .../node_attributes/boolean_operations.rst | 0 .../docs/graphs/node_attributes/weights.rst | 0 graphs/docs/graphs/node_coordinates.rst | 0 .../node_coordinates/anemoi_dataset.rst | 0 .../docs/graphs/node_coordinates/healpix.csv | 0 .../docs/graphs/node_coordinates/healpix.rst | 0 .../graphs/node_coordinates/hex_refined.csv | 0 .../hex_refined_icosahedron.rst | 0 .../graphs/node_coordinates/icon_mesh.rst | 0 .../graphs/node_coordinates/latlon_arrays.rst | 0 .../docs/graphs/node_coordinates/npz_file.rst | 0 .../node_coordinates/reduced_gaussian.rst | 0 .../graphs/node_coordinates/text_file.rst | 0 .../graphs/node_coordinates/tri_nodes.csv | 0 .../tri_refined_icosahedron.rst | 0 .../graphs/node_coordinates/xarray_file.rst | 0 graphs/docs/graphs/post_processor.rst | 0 .../yaml/attributes_boolean_operation.yaml | 0 .../yaml/attributes_cosine_lat_weighted.yaml | 0 .../yaml/attributes_custom_area_weights.yaml | 0 .../docs/graphs/yaml/attributes_cutout.yaml | 0 graphs/docs/graphs/yaml/attributes_grids.yaml | 0 .../attributes_isolatitude_area_weights.yaml | 0 .../docs/graphs/yaml/attributes_lam_mask.yaml | 0 ...attributes_masked_planar_area_weights.yaml | 0 .../yaml/attributes_nonmissingzarr.yaml | 0 .../graphs/yaml/attributes_nonzerozarr.yaml | 0 .../yaml/attributes_planar_area_weights.yaml | 0 .../attributes_spherical_area_weights.yaml | 0 .../yaml/attributes_uniform_weights.yaml | 0 graphs/docs/index.rst | 0 graphs/docs/installing.rst | 0 graphs/docs/modules/edge_attributes.rst | 0 graphs/docs/modules/edge_builder.rst | 0 graphs/docs/modules/graph_creator.rst | 0 graphs/docs/modules/graph_inspector.rst | 0 graphs/docs/modules/node_attributes.rst | 0 graphs/docs/modules/node_builder.rst | 0 graphs/docs/modules/post_processor.rst | 0 graphs/docs/modules/schemas.rst | 0 graphs/docs/overview.rst | 0 graphs/docs/usage/create_sparse_matrices.rst | 0 graphs/docs/usage/getting_started.rst | 0 graphs/docs/usage/limited_area.rst | 0 graphs/docs/usage/schemas/global.excalidraw | 0 graphs/docs/usage/schemas/global.png | Bin .../usage/schemas/global_wo-proc.excalidraw | 0 graphs/docs/usage/schemas/global_wo-proc.png | Bin graphs/docs/usage/yaml/cutout_zarr.yaml | 0 graphs/docs/usage/yaml/global.txt | 0 graphs/docs/usage/yaml/global.yaml | 0 graphs/docs/usage/yaml/global_with-attrs.txt | 0 graphs/docs/usage/yaml/global_with-attrs.yaml | 0 graphs/docs/usage/yaml/global_wo-proc.png | Bin graphs/docs/usage/yaml/global_wo-proc.txt | 0 graphs/docs/usage/yaml/global_wo-proc.yaml | 0 .../usage/yaml/lam_nodes_wo_boundary.yaml | 0 .../docs/usage/yaml/limited_area_nodes.yaml | 0 graphs/docs/usage/yaml/nodes.yaml | 0 graphs/docs/usage/yaml/nodes_with-attrs.yaml | 0 graphs/docs/usage/yaml/sparse_matrices.yaml | 0 graphs/pyproject.toml | 0 graphs/src/anemoi/graphs/__init__.py | 0 graphs/src/anemoi/graphs/__main__.py | 0 graphs/src/anemoi/graphs/commands/__init__.py | 0 graphs/src/anemoi/graphs/commands/create.py | 0 graphs/src/anemoi/graphs/commands/describe.py | 0 .../graphs/commands/export_to_sparse.py | 0 graphs/src/anemoi/graphs/commands/inspect.py | 0 graphs/src/anemoi/graphs/create.py | 0 graphs/src/anemoi/graphs/describe.py | 0 graphs/src/anemoi/graphs/edges/__init__.py | 0 graphs/src/anemoi/graphs/edges/attributes.py | 0 .../anemoi/graphs/edges/builders/__init__.py | 0 .../src/anemoi/graphs/edges/builders/base.py | 0 .../anemoi/graphs/edges/builders/cutoff.py | 0 .../anemoi/graphs/edges/builders/healpix.py | 0 .../src/anemoi/graphs/edges/builders/icon.py | 0 .../src/anemoi/graphs/edges/builders/knn.py | 0 .../anemoi/graphs/edges/builders/masking.py | 0 .../graphs/edges/builders/multi_scale.py | 0 graphs/src/anemoi/graphs/edges/directional.py | 0 graphs/src/anemoi/graphs/export.py | 0 graphs/src/anemoi/graphs/generate/__init__.py | 0 graphs/src/anemoi/graphs/generate/healpix.py | 0 .../anemoi/graphs/generate/hex_icosahedron.py | 0 .../src/anemoi/graphs/generate/icon_mesh.py | 0 graphs/src/anemoi/graphs/generate/masks.py | 0 .../graphs/generate/multi_scale_edges.py | 0 .../src/anemoi/graphs/generate/transforms.py | 0 .../anemoi/graphs/generate/tri_icosahedron.py | 0 graphs/src/anemoi/graphs/generate/utils.py | 0 graphs/src/anemoi/graphs/inspect.py | 0 graphs/src/anemoi/graphs/nodes/__init__.py | 0 .../graphs/nodes/attributes/__init__.py | 0 .../graphs/nodes/attributes/area_weights.py | 0 .../nodes/attributes/base_attributes.py | 0 .../graphs/nodes/attributes/boolean_op.py | 0 .../anemoi/graphs/nodes/attributes/masks.py | 0 .../anemoi/graphs/nodes/builders/__init__.py | 0 .../src/anemoi/graphs/nodes/builders/base.py | 0 .../anemoi/graphs/nodes/builders/from_file.py | 0 .../graphs/nodes/builders/from_healpix.py | 0 .../anemoi/graphs/nodes/builders/from_icon.py | 0 .../nodes/builders/from_reduced_gaussian.py | 0 .../builders/from_refined_icosahedron.py | 0 .../graphs/nodes/builders/from_vectors.py | 0 graphs/src/anemoi/graphs/normalise.py | 0 graphs/src/anemoi/graphs/plotting/__init__.py | 0 graphs/src/anemoi/graphs/plotting/displots.py | 0 .../graphs/plotting/interactive_2d_html.py | 0 .../graphs/plotting/interactive_3d.html.jinja | 0 .../graphs/plotting/interactive_3d_html.py | 0 graphs/src/anemoi/graphs/plotting/prepare.py | 0 .../src/anemoi/graphs/processors/__init__.py | 0 .../anemoi/graphs/processors/post_process.py | 0 graphs/src/anemoi/graphs/schemas/__init__.py | 0 .../src/anemoi/graphs/schemas/base_graph.py | 0 .../graphs/schemas/edge_attributes_schemas.py | 0 .../src/anemoi/graphs/schemas/edge_schemas.py | 0 .../graphs/schemas/node_attributes_schemas.py | 0 .../src/anemoi/graphs/schemas/node_schemas.py | 0 graphs/src/anemoi/graphs/schemas/normalise.py | 0 .../anemoi/graphs/schemas/post_processors.py | 0 graphs/src/anemoi/graphs/utils.py | 0 graphs/tests/conftest.py | 0 graphs/tests/edges/test_cutoff.py | 0 graphs/tests/edges/test_direction.py | 0 graphs/tests/edges/test_edge_attributes.py | 0 graphs/tests/edges/test_healpix_multiscale.py | 0 graphs/tests/edges/test_icon_edges.py | 0 graphs/tests/edges/test_knn.py | 0 graphs/tests/edges/test_multiscale_edges.py | 0 graphs/tests/generate/test_mask_builder.py | 0 graphs/tests/generate/test_transforms.py | 0 graphs/tests/nodes/attributes/test_base.py | 0 .../attributes/test_boolean_operations.py | 0 graphs/tests/nodes/attributes/test_masks.py | 0 graphs/tests/nodes/attributes/test_weights.py | 0 graphs/tests/nodes/test_anemoi_dataset.py | 0 graphs/tests/nodes/test_arrays.py | 0 graphs/tests/nodes/test_cutout_nodes.py | 0 graphs/tests/nodes/test_from_xarray.py | 0 graphs/tests/nodes/test_healpix.py | 0 graphs/tests/nodes/test_hex_nodes.py | 0 graphs/tests/nodes/test_icon_nodes.py | 0 graphs/tests/nodes/test_npz.py | 0 graphs/tests/nodes/test_reduced_gaussian.py | 0 graphs/tests/nodes/test_tri_nodes.py | 0 graphs/tests/processors/test_post_process.py | 0 graphs/tests/test_create.py | 0 graphs/tests/test_normaliser.py | 0 graphs/tests/test_utils.py | 0 models/.gitattributes | 0 models/.gitignore | 0 models/.readthedocs.yaml | 0 models/CHANGELOG.md | 0 models/CONTRIBUTORS.md | 0 models/LICENSE | 0 models/README.md | 0 models/docs/Makefile | 0 .../_static/anemoi-models_schematic.drawio | 0 .../docs/_static/anemoi-models_schematic.png | Bin models/docs/_static/data_indices.drawio | 0 models/docs/_static/data_indices.png | Bin models/docs/_static/logo.png | Bin .../_static/preprocessing_remapper_atanh.png | Bin .../_static/preprocessing_remapper_boxcox.png | Bin .../_static/preprocessing_remapper_power.png | Bin models/docs/_static/style.css | 0 models/docs/_templates/.gitkeep | 0 models/docs/cli/migration.rst | 0 models/docs/conf.py | 0 models/docs/contributing.rst | 0 models/docs/create-migrations.rst | 0 models/docs/index.rst | 0 models/docs/introduction/installing.rst | 0 models/docs/introduction/overview.rst | 0 models/docs/modules/activations.rst | 0 models/docs/modules/data_indices.rst | 0 models/docs/modules/distributed.rst | 0 models/docs/modules/interface.rst | 0 models/docs/modules/layers.rst | 0 models/docs/modules/migrations.rst | 0 models/docs/modules/models.rst | 0 models/docs/modules/normalization.rst | 0 models/docs/modules/preprocessing.rst | 0 models/docs/modules/residual.rst | 0 models/docs/modules/schemas.rst | 0 models/docs/usage/create_model.rst | 0 models/pyproject.toml | 0 models/pytest.ini | 0 models/src/anemoi/models/__init__.py | 0 models/src/anemoi/models/__main__.py | 0 models/src/anemoi/models/commands/__init__.py | 0 models/src/anemoi/models/commands/hello.py | 0 .../src/anemoi/models/commands/migration.py | 0 .../anemoi/models/data_indices/__init__.py | 0 .../anemoi/models/data_indices/collection.py | 0 .../src/anemoi/models/data_indices/index.py | 0 .../src/anemoi/models/data_indices/tensor.py | 0 .../src/anemoi/models/distributed/__init__.py | 0 .../models/distributed/balanced_partition.py | 0 models/src/anemoi/models/distributed/graph.py | 0 .../anemoi/models/distributed/khop_edges.py | 0 .../anemoi/models/distributed/primitives.py | 0 .../src/anemoi/models/distributed/shapes.py | 0 .../anemoi/models/distributed/transformer.py | 0 models/src/anemoi/models/distributed/utils.py | 0 .../src/anemoi/models/interface/__init__.py | 0 models/src/anemoi/models/layers/__init__.py | 0 .../src/anemoi/models/layers/activations.py | 0 models/src/anemoi/models/layers/attention.py | 0 models/src/anemoi/models/layers/block.py | 0 models/src/anemoi/models/layers/bounding.py | 0 models/src/anemoi/models/layers/conv.py | 0 models/src/anemoi/models/layers/diffusion.py | 0 models/src/anemoi/models/layers/ensemble.py | 0 models/src/anemoi/models/layers/graph.py | 0 .../anemoi/models/layers/graph_provider.py | 0 models/src/anemoi/models/layers/mapper.py | 0 models/src/anemoi/models/layers/mlp.py | 0 .../src/anemoi/models/layers/normalization.py | 0 models/src/anemoi/models/layers/processor.py | 0 models/src/anemoi/models/layers/residual.py | 0 .../anemoi/models/layers/sparse_projector.py | 0 .../anemoi/models/layers/spectral_helpers.py | 0 .../models/layers/spectral_transforms.py | 0 models/src/anemoi/models/layers/utils.py | 0 .../src/anemoi/models/migrations/__init__.py | 0 .../src/anemoi/models/migrations/migrator.py | 0 .../migrations/scripts/1755530253_initial.py | 0 .../scripts/1762857427_deprecate_eda.py | 0 .../scripts/1762857428_chunking_fix.py | 0 .../1763479917_hardware_schema_update.py | 0 .../scripts/1763479918_refactor_mapper.py | 0 .../1767108147_move_to_multiple_datasets.py | 0 ...3048851_fuse_multiple_perdataset_graphs.py | 0 ...76237003_rename_swa_to_weight_averaging.py | 0 .../anemoi/models/migrations/setup_context.py | 0 models/src/anemoi/models/models/__init__.py | 0 .../src/anemoi/models/models/autoencoder.py | 0 models/src/anemoi/models/models/base.py | 0 .../diffusion_encoder_processor_decoder.py | 0 .../models/encoder_processor_decoder.py | 0 .../models/ens_encoder_processor_decoder.py | 0 .../src/anemoi/models/models/hierarchical.py | 0 .../models/models/hierarchical_autoencoder.py | 0 .../anemoi/models/preprocessing/__init__.py | 0 .../anemoi/models/preprocessing/imputer.py | 0 .../anemoi/models/preprocessing/mappings.py | 0 .../anemoi/models/preprocessing/normalizer.py | 0 .../models/preprocessing/postprocessor.py | 0 .../anemoi/models/preprocessing/remapper.py | 0 models/src/anemoi/models/samplers/__init__.py | 0 .../models/samplers/diffusion_samplers.py | 0 models/src/anemoi/models/schemas/__init__.py | 0 .../models/schemas/common_components.py | 0 .../anemoi/models/schemas/data_processor.py | 0 models/src/anemoi/models/schemas/decoder.py | 0 models/src/anemoi/models/schemas/encoder.py | 0 models/src/anemoi/models/schemas/models.py | 0 models/src/anemoi/models/schemas/processor.py | 0 models/src/anemoi/models/schemas/residual.py | 0 models/src/anemoi/models/triton/gt.py | 0 models/src/anemoi/models/triton/utils.py | 0 models/src/anemoi/models/utils/__init__.py | 0 models/src/anemoi/models/utils/compile.py | 0 models/src/anemoi/models/utils/config.py | 0 models/tests/conftest.py | 0 models/tests/data_indices/test_collection.py | 0 .../tests/data_indices/test_data_indices.py | 0 .../tests/distributed/balanced_partition.py | 0 .../integration/triton/test_triton_gt.py | 0 .../layers/block/test_block_graphconv.py | 0 .../block/test_block_graphtransformer.py | 0 .../layers/block/test_block_pointwise.py | 0 .../layers/block/test_block_transformer.py | 0 .../block/test_block_transformermapper.py | 0 .../tests/layers/mapper/test_base_mapper.py | 0 .../layers/mapper/test_graphconv_mapper.py | 0 .../mapper/test_graphtransformer_mapper.py | 0 .../layers/mapper/test_pointwise_mapper.py | 0 .../layers/mapper/test_transformer_mapper.py | 0 .../layers/processor/test_base_processor.py | 0 .../processor/test_graphconv_processor.py | 0 .../test_graphtransformer_processor.py | 0 .../processor/test_pointwise_processor.py | 0 .../processor/test_transformer_processor.py | 0 models/tests/layers/test_activations.py | 0 models/tests/layers/test_attention.py | 0 models/tests/layers/test_bounding.py | 0 .../layers/test_grad_checkpoint_wiring.py | 0 models/tests/layers/test_graph.py | 0 models/tests/layers/test_layer_utils.py | 0 models/tests/layers/test_mlp.py | 0 models/tests/layers/test_noise_embeddings.py | 0 models/tests/layers/test_residual.py | 0 models/tests/layers/test_sht.py | 0 models/tests/migrations/conftest.py | 0 .../migrations/1750840837_add_foo.py | 0 .../migrations/1750841219_add_bar.py | 0 .../migrations/1750859824_add_baz.py | 0 .../migrations/1750859905_rename_baz.py | 0 .../migrations/migrations/1751895180_final.py | 0 .../migrations/1751895203_recent.py | 0 .../tests/migrations/test_migration_order.py | 0 models/tests/migrations/test_migrations.py | 0 .../test_diffusion_sampling_pipeline.py | 0 .../tests/models/test_diffusion_tendency.py | 0 models/tests/models/test_models.py | 0 models/tests/preprocessing/test_mappings.py | 0 .../tests/preprocessing/test_postprocessor.py | 0 .../test_preprocessor_imputer.py | 0 .../test_preprocessor_normalizer.py | 0 .../test_preprocessor_remapper.py | 0 .../preprocessing/test_stepwise_processors.py | 0 .../tests/samplers/test_diffusion_samplers.py | 0 .../schemas/test_data_processors_schemas.py | 0 .../test_model_schemas_pointwise_mappers.py | 0 models/tests/utils/test_compile.py | 0 training/.gitattributes | 0 training/.gitignore | 0 training/.readthedocs.yaml | 0 training/CHANGELOG.md | 0 training/CONTRIBUTORS.md | 0 training/LICENSE | 0 training/README.md | 0 training/docs/Makefile | 0 training/docs/_static/logo.png | Bin training/docs/_static/style.css | 0 training/docs/_templates/.gitkeep | 0 training/docs/adrs/adr-001.md | 0 training/docs/adrs/adr-002.md | 0 training/docs/adrs/template.md | 0 training/docs/checkpoint_integration.rst | 0 .../checkpoint_pipeline_configuration.rst | 0 training/docs/checkpoint_troubleshooting.rst | 0 training/docs/conf.py | 0 training/docs/contributing.rst | 0 .../global-sliding-window-attention.png | Bin .../images/gnn-encoder-decoder-multimesh.jpg | Bin .../docs/images/mlflow/mlflow_compare.png | Bin .../docs/images/mlflow/mlflow_constant.png | Bin .../docs/images/mlflow/mlflow_resumed_run.png | Bin training/docs/images/mlflow/mlflow_run.png | Bin training/docs/images/mlflow/mlflow_server.png | Bin training/docs/images/model_sharding.png | Bin .../multi-dataset/downscaling-multi.png | Bin .../docs/images/multi-dataset/lam-multi.png | Bin .../images/multi-dataset/prog-forc-diag.png | Bin .../mem-snapshot-1-mapper-chunk.png | Bin .../mem-snapshot-4-mapper-chunks.png | Bin .../performance-flowchart.png | Bin .../profiler/anemoi_profiler_architecture.png | Bin .../anemoi_profiler_benchmark_profiler.png | Bin .../profiler/anemoi_profiler_config.png | Bin .../profiler/anemoi_profiler_high_level.png | Bin .../anemoi_profiler_mlflow_integration.png | Bin .../anemoi_profiler_mlflow_integration_2.png | Bin .../anemoi_profiler_mlflow_integration_3.png | Bin .../profiler/anemoi_profiler_speed_report.png | Bin .../anemoi_profiler_speedreport_diagram.png | Bin .../anemoi_profiler_training_rates.png | Bin .../anemoi_profiler_validation_rates.png | Bin .../images/profiler/example_memory_report.png | Bin .../profiler/example_memory_timeline.png | Bin .../images/profiler/example_model_summary.png | Bin .../profiler/example_model_summary_2.png | Bin .../images/profiler/example_system_report.png | Bin .../images/profiler/example_time_report.png | Bin .../images/profiler/idle_time_breakdown.png | Bin .../images/profiler/kernel_breakdown_dfs.png | Bin .../profiler/kernel_breakdown_plots.png | Bin .../profiler/memory_snapshot_diagram.png | Bin .../profiler/memory_snapshot_output.png | Bin .../images/profiler/temporal_breakdown.png | Bin training/docs/images/transformer-block.png | Bin training/docs/index.rst | 0 training/docs/introduction/installing.rst | 0 training/docs/introduction/overview.rst | 0 training/docs/modules/data.rst | 0 training/docs/modules/diagnostics.rst | 0 training/docs/modules/losses.rst | 0 training/docs/modules/optimization.rst | 0 training/docs/modules/schemas.rst | 0 training/docs/modules/strategy.rst | 0 training/docs/modules/tasks.rst | 0 training/docs/modules/train.rst | 0 training/docs/troubleshooting.rst | 0 training/docs/user-guide/basic-set-up.rst | 0 training/docs/user-guide/benchmarking.rst | 0 training/docs/user-guide/configuring.rst | 0 training/docs/user-guide/distributed.rst | 0 .../docs/user-guide/download-era5-o96.rst | 0 training/docs/user-guide/hydra-intro.rst | 0 training/docs/user-guide/models.rst | 0 training/docs/user-guide/multi-datasets.rst | 0 training/docs/user-guide/overview.rst | 0 .../user-guide/performance-optimisation.rst | 0 training/docs/user-guide/tasks.rst | 0 training/docs/user-guide/tracking.rst | 0 training/docs/user-guide/training-methods.rst | 0 training/docs/user-guide/training.rst | 0 training/docs/user-guide/yaml/dataloader.yaml | 0 .../user-guide/yaml/example_crps_config.yaml | 0 training/pyproject.toml | 0 training/pytest.ini | 0 training/src/anemoi/training/__init__.py | 0 training/src/anemoi/training/__main__.py | 0 .../anemoi/training/checkpoint/__init__.py | 0 .../src/anemoi/training/checkpoint/base.py | 0 .../src/anemoi/training/checkpoint/catalog.py | 0 .../anemoi/training/checkpoint/exceptions.py | 0 .../src/anemoi/training/checkpoint/formats.py | 0 .../anemoi/training/checkpoint/pipeline.py | 0 .../src/anemoi/training/checkpoint/utils.py | 0 .../src/anemoi/training/commands/__init__.py | 0 .../anemoi/training/commands/checkpoint.py | 0 .../src/anemoi/training/commands/config.py | 0 .../src/anemoi/training/commands/mlflow.py | 0 .../src/anemoi/training/commands/profiler.py | 0 .../src/anemoi/training/commands/train.py | 0 .../src/anemoi/training/config/__init__.py | 0 .../anemoi/training/config/autoencoder.yaml | 0 .../src/anemoi/training/config/config.yaml | 0 .../anemoi/training/config/data/multi.yaml | 0 .../src/anemoi/training/config/data/zarr.yaml | 0 .../training/config/dataloader/multi.yaml | 0 .../config/dataloader/native_grid.yaml | 0 .../benchmark_profiler/detailed.yaml | 0 .../benchmark_profiler/simple.yaml | 0 .../diagnostics/callbacks/placeholder.yaml | 0 .../diagnostics/callbacks/rollout_eval.yaml | 0 .../config/diagnostics/evaluation.yaml | 0 .../config/diagnostics/evaluation_ens.yaml | 0 .../config/diagnostics/evaluation_multi.yaml | 0 .../config/diagnostics/log/mlflow.yaml | 0 .../config/diagnostics/log/wandb.yaml | 0 .../config/diagnostics/plot/detailed.yaml | 0 .../config/diagnostics/plot/multi.yaml | 0 .../config/diagnostics/plot/simple.yaml | 0 .../src/anemoi/training/config/diffusion.yaml | 0 .../anemoi/training/config/ensemble_crps.yaml | 0 .../config/graph/encoder_decoder_only.yaml | 0 .../training/config/graph/existing.yaml | 0 .../config/graph/hierarchical_2level.yaml | 0 ...rarchical_2level_encoder_decoder_only.yaml | 0 .../config/graph/hierarchical_3level.yaml | 0 .../training/config/graph/limited_area.yaml | 0 .../anemoi/training/config/graph/multi.yaml | 0 .../training/config/graph/multi_scale.yaml | 0 .../training/config/graph/point_wise.yaml | 0 .../training/config/graph/stretched_grid.yaml | 0 .../anemoi/training/config/hierarchical.yaml | 0 .../config/hierarchical_autoencoder.yaml | 0 training/src/anemoi/training/config/lam.yaml | 0 .../src/anemoi/training/config/model/gnn.yaml | 0 .../config/model/graphtransformer.yaml | 0 .../model/graphtransformer_diffusion.yaml | 0 .../model/graphtransformer_diffusiontend.yaml | 0 .../config/model/graphtransformer_ens.yaml | 0 .../training/config/model/point_wise.yaml | 0 .../training/config/model/transformer.yaml | 0 .../config/model/transformer_diffusion.yaml | 0 .../model/transformer_diffusiontend.yaml | 0 .../config/model/transformer_ens.yaml | 0 .../model/transformer_transformermapper.yaml | 0 .../src/anemoi/training/config/multi.yaml | 0 .../anemoi/training/config/point_wise.yaml | 0 .../src/anemoi/training/config/stretched.yaml | 0 .../training/config/system/example.yaml | 0 .../config/system/hardware/example.yaml | 0 .../config/system/hardware/slurm.yaml | 0 .../training/config/system/input/example.yaml | 0 .../config/system/output/example.yaml | 0 .../anemoi/training/config/system/slurm.yaml | 0 .../training/config/task/autoencoder.yaml | 0 .../training/config/task/forecaster.yaml | 0 .../config/task/temporal_downscaler.yaml | 0 .../training/config/temporal_downscaler.yaml | 0 .../config/temporal_downscaler_ensemble.yaml | 0 .../training/config/training/diffusion.yaml | 0 .../training/config/training/ensemble.yaml | 0 .../anemoi/training/config/training/lam.yaml | 0 .../training/config/training/multi.yaml | 0 .../config/training/optimization/default.yaml | 0 .../lr_scheduler/cosine_scheduler.yaml | 0 .../optimization/optimizer/adamw.yaml | 0 .../optimization/optimizer/ademamix.yaml | 0 .../training/optimization/optimizer/zero.yaml | 0 .../config/training/scalers/global.yaml | 0 .../training/config/training/scalers/lam.yaml | 0 .../config/training/scalers/multi.yaml | 0 .../config/training/scalers/stretched.yaml | 0 .../training/config/training/single.yaml | 0 .../training/config/training/stretched.yaml | 0 .../training/training_loss/ensemble.yaml | 0 .../training_loss/ensemble_combined.yaml | 0 .../config/training/training_loss/single.yaml | 0 .../training_loss/single_combined.yaml | 0 .../config/training/weight_averaging/ema.yaml | 0 .../config/training/weight_averaging/swa.yaml | 0 training/src/anemoi/training/data/__init__.py | 0 .../src/anemoi/training/data/data_reader.py | 0 .../src/anemoi/training/data/datamodule.py | 0 .../src/anemoi/training/data/multidataset.py | 0 .../training/data/relative_time_indices.py | 0 .../anemoi/training/data/usable_indices.py | 0 .../anemoi/training/diagnostics/__init__.py | 0 .../training/diagnostics/benchmark_server.py | 0 .../diagnostics/callbacks/__init__.py | 0 .../diagnostics/callbacks/checkpoint.py | 0 .../diagnostics/callbacks/evaluation.py | 0 .../diagnostics/callbacks/optimiser.py | 0 .../training/diagnostics/callbacks/plot.py | 0 .../diagnostics/callbacks/plot_adapter.py | 0 .../diagnostics/callbacks/plot_ens.py | 0 .../diagnostics/callbacks/profiler.py | 0 .../diagnostics/callbacks/provenance.py | 0 .../training/diagnostics/callbacks/sanity.py | 0 .../diagnostics/callbacks/stopping.py | 0 .../diagnostics/callbacks/weight_averaging.py | 0 .../training/diagnostics/continents.json | 0 .../training/diagnostics/countries.geo.json | 0 .../anemoi/training/diagnostics/focus_area.py | 0 .../src/anemoi/training/diagnostics/logger.py | 0 .../src/anemoi/training/diagnostics/maps.py | 0 .../training/diagnostics/mlflow/__init__.py | 0 .../training/diagnostics/mlflow/azureml.py | 0 .../training/diagnostics/mlflow/logger.py | 0 .../mlflow/system_metrics/cpu_monitor.py | 0 .../mlflow/system_metrics/gpu_monitor.py | 0 .../training/diagnostics/mlflow/utils.py | 0 .../src/anemoi/training/diagnostics/plots.py | 0 .../anemoi/training/diagnostics/profilers.py | 0 .../training/diagnostics/projections.py | 0 .../anemoi/training/distributed/__init__.py | 0 .../src/anemoi/training/distributed/groups.py | 0 .../anemoi/training/distributed/strategy.py | 0 .../src/anemoi/training/losses/__init__.py | 0 .../src/anemoi/training/losses/aggregate.py | 33 +++- training/src/anemoi/training/losses/base.py | 0 .../src/anemoi/training/losses/combined.py | 0 training/src/anemoi/training/losses/huber.py | 0 training/src/anemoi/training/losses/kcrps.py | 1 + .../src/anemoi/training/losses/logcosh.py | 0 training/src/anemoi/training/losses/loss.py | 0 training/src/anemoi/training/losses/mae.py | 0 training/src/anemoi/training/losses/mse.py | 0 .../src/anemoi/training/losses/multiscale.py | 0 training/src/anemoi/training/losses/rmse.py | 0 .../anemoi/training/losses/scaler_tensor.py | 0 .../training/losses/scalers/__init__.py | 0 .../training/losses/scalers/base_scaler.py | 0 .../losses/scalers/loss_weights_mask.py | 0 .../losses/scalers/node_attributes.py | 0 .../anemoi/training/losses/scalers/scalers.py | 0 .../training/losses/scalers/time_step.py | 0 .../training/losses/scalers/variable.py | 0 .../training/losses/scalers/variable_level.py | 0 .../losses/scalers/variable_masking.py | 0 .../losses/scalers/variable_tendency.py | 0 .../src/anemoi/training/losses/spectral.py | 0 training/src/anemoi/training/losses/utils.py | 0 .../anemoi/training/losses/variable_mapper.py | 0 .../anemoi/training/losses/weighted_mse.py | 0 .../anemoi/training/optimizers/AdEMAMix.py | 0 .../src/anemoi/training/schemas/__init__.py | 0 .../anemoi/training/schemas/base_schema.py | 0 training/src/anemoi/training/schemas/data.py | 0 .../src/anemoi/training/schemas/dataloader.py | 0 .../anemoi/training/schemas/diagnostics.py | 0 .../anemoi/training/schemas/schema_utils.py | 0 .../src/anemoi/training/schemas/system.py | 0 training/src/anemoi/training/schemas/tasks.py | 0 .../src/anemoi/training/schemas/training.py | 0 .../src/anemoi/training/tasks/__init__.py | 0 training/src/anemoi/training/tasks/base.py | 0 .../src/anemoi/training/tasks/forecaster.py | 0 .../training/tasks/temporal_downscaler.py | 0 .../src/anemoi/training/tasks/timeless.py | 0 .../src/anemoi/training/train/__init__.py | 0 .../anemoi/training/train/methods/__init__.py | 0 .../src/anemoi/training/train/methods/base.py | 0 .../training/train/methods/diffusion.py | 0 .../anemoi/training/train/methods/ensemble.py | 0 .../anemoi/training/train/methods/single.py | 0 .../src/anemoi/training/train/profiler.py | 0 training/src/anemoi/training/train/train.py | 0 .../src/anemoi/training/utils/__init__.py | 0 .../src/anemoi/training/utils/checkpoint.py | 0 .../anemoi/training/utils/custom_colormaps.py | 0 training/src/anemoi/training/utils/enums.py | 0 .../src/anemoi/training/utils/index_space.py | 0 training/src/anemoi/training/utils/jsonify.py | 0 training/src/anemoi/training/utils/masks.py | 0 .../src/anemoi/training/utils/mlflow_sync.py | 0 training/src/anemoi/training/utils/seeding.py | 0 .../src/anemoi/training/utils/time_indices.py | 0 .../training/utils/variables_metadata.py | 0 .../src/anemoi/training/utils/worker_init.py | 0 .../anemoi_searchpath/__init__.py | 0 .../anemoi_searchpath_plugin.py | 0 training/tests/conftest.py | 0 .../test_cicd_aicon_04_icon-dream_medium.py | 0 .../test_cicd_aicon_04_icon-dream_medium.yaml | 0 .../integration/config/benchmark/base.yaml | 0 .../config/benchmark/diffusiontend.yaml | 0 .../config/benchmark/ensemble_crps.yaml | 0 .../config/benchmark/graphtransformer.yaml | 0 .../integration/config/benchmark/lam.yaml | 0 .../config/benchmark/stretched.yaml | 0 .../config/imputer_modifications.yaml | 0 .../integration/config/test_autoencoder.yaml | 0 .../integration/config/test_diffusion.yaml | 0 .../config/test_ensemble_crps.yaml | 0 .../integration/config/test_filtering.yaml | 0 .../tests/integration/config/test_global.yaml | 0 .../tests/integration/config/test_lam.yaml | 0 .../config/test_multidatasets.yaml | 0 .../integration/config/test_stretched.yaml | 0 .../config/test_temporal_downscaler.yaml | 0 .../test_temporal_downscaler_ensemble.yaml | 0 .../config/testing_modifications.yaml | 0 training/tests/integration/conftest.py | 0 .../schemas/partial_metadata_schema.py | 0 .../integration/scripts/update_slt_configs.py | 0 training/tests/integration/test_benchmark.py | 0 .../tests/integration/test_training_cycle.py | 0 training/tests/unit/checkpoint/conftest.py | 0 training/tests/unit/checkpoint/test_base.py | 0 .../tests/unit/checkpoint/test_catalog.py | 0 .../tests/unit/checkpoint/test_exceptions.py | 0 .../tests/unit/checkpoint/test_formats.py | 0 .../tests/unit/checkpoint/test_pipeline.py | 0 training/tests/unit/checkpoint/test_utils.py | 0 training/tests/unit/commands/test_config.py | 0 training/tests/unit/commands/test_mlflow.py | 0 training/tests/unit/conftest.py | 0 training/tests/unit/data/test_dataset.py | 0 training/tests/unit/data/test_multidataset.py | 0 .../unit/data/test_relative_time_indices.py | 0 .../tests/unit/data/test_usable_indices.py | 0 .../diagnostics/callbacks/test_timelimit.py | 0 .../callbacks/test_variable_order.py | 0 .../callbacks/test_weight_averaging.py | 0 .../mlflow/test_azureml_mlflow_logger.py | 0 .../diagnostics/mlflow/test_mlflow_logger.py | 0 .../diagnostics/mlflow/test_mlflow_utils.py | 0 .../tests/unit/diagnostics/test_callbacks.py | 0 .../tests/unit/diagnostics/test_checkpoint.py | 0 .../tests/unit/diagnostics/test_focus_area.py | 0 .../unit/diagnostics/test_plot_adapters.py | 0 .../diagnostics/test_plotting_callbacks.py | 0 .../test_plotting_ens_callbacks.py | 0 .../unit/diagnostics/test_weightandbiases.py | 0 .../tests/unit/distributed/test_groups.py | 0 .../unit/hydra/test_search_path_plugins.py | 0 .../tests/unit/losses/test_aggregate_loss.py | 159 ++++++++++++++++++ .../tests/unit/losses/test_combined_loss.py | 0 .../tests/unit/losses/test_filtered_loss.py | 0 .../tests/unit/losses/test_loss_function.py | 0 .../tests/unit/losses/test_loss_scaling.py | 0 .../tests/unit/losses/test_multiscale_loss.py | 0 training/tests/unit/losses/test_scaler.py | 0 training/tests/unit/requirements.txt | 0 .../tests/unit/schemas/test_expand_paths.py | 0 .../unit/schemas/test_training_schemas.py | 0 training/tests/unit/tasks/test_autoencoder.py | 0 training/tests/unit/tasks/test_forecaster.py | 0 .../unit/tasks/test_temporal_downscaler.py | 0 .../unit/train/test_checkpoint_loading.py | 0 training/tests/unit/train/test_methods.py | 0 training/tests/unit/train/test_optimizer.py | 0 .../unit/train/test_print_variable_scaling.py | 0 training/tests/unit/train/test_profiler.py | 0 .../tests/unit/train/test_restarting_run.py | 0 training/tests/unit/utils/test_masks.py | 0 training/tests/unit/utils/test_seeding.py | 0 .../tests/unit/utils/test_time_indices.py | 0 .../unit/utils/test_variable_grouping.py | 0 741 files changed, 190 insertions(+), 3 deletions(-) mode change 100644 => 100755 .github/CODEOWNERS mode change 100644 => 100755 .github/dependabot.yml mode change 100644 => 100755 .github/labeler.yml mode change 100644 => 100755 .github/pull_request_template.md mode change 100644 => 100755 .github/workflows/inactivity-bot.yml mode change 100644 => 100755 .github/workflows/integration-tests-hpc.yml mode change 100644 => 100755 .github/workflows/pr-conventional-commit.yml mode change 100644 => 100755 .github/workflows/pr-label-ats.yml mode change 100644 => 100755 .github/workflows/pr-label-conventional-commits.yml mode change 100644 => 100755 .github/workflows/pr-label-file-based.yml mode change 100644 => 100755 .github/workflows/pr-label-public.yml mode change 100644 => 100755 .github/workflows/pr-release.yml mode change 100644 => 100755 .github/workflows/push-to-private.yml mode change 100644 => 100755 .github/workflows/python-publish.yml mode change 100644 => 100755 .github/workflows/python-pull-request.yml mode change 100644 => 100755 .github/workflows/readthedocs-pr-update.yml mode change 100644 => 100755 .github/workflows/release-please.yml mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .isort.cfg mode change 100644 => 100755 .pre-commit-config.yaml mode change 100644 => 100755 .release-please-config.json mode change 100644 => 100755 .release-please-manifest.json mode change 100644 => 100755 CONTRIBUTORS.md mode change 100644 => 100755 LICENCES/APPLE_ML_ACKNOWLEDGEMENTS mode change 100644 => 100755 LICENCES/APPLE_ML_ADEMAMIX_LICENSE mode change 100644 => 100755 LICENSE mode change 100644 => 100755 NOTICE.md mode change 100644 => 100755 README.md mode change 100644 => 100755 graphs/.gitattributes mode change 100644 => 100755 graphs/.gitignore mode change 100644 => 100755 graphs/.readthedocs.yaml mode change 100644 => 100755 graphs/CHANGELOG.md mode change 100644 => 100755 graphs/CONTRIBUTORS.md mode change 100644 => 100755 graphs/LICENSE mode change 100644 => 100755 graphs/README.md mode change 100644 => 100755 graphs/docs/Makefile mode change 100644 => 100755 graphs/docs/_static/cutoff.jpg mode change 100644 => 100755 graphs/docs/_static/enc_proc_dec.png mode change 100644 => 100755 graphs/docs/_static/graph_configurations.png mode change 100644 => 100755 graphs/docs/_static/hetero_data_graph.txt mode change 100644 => 100755 graphs/docs/_static/logo.png mode change 100644 => 100755 graphs/docs/_static/multi_scale_edges.svg mode change 100644 => 100755 graphs/docs/_static/processor.html mode change 100644 => 100755 graphs/docs/_static/style.css mode change 100644 => 100755 graphs/docs/_static/trinodes.png mode change 100644 => 100755 graphs/docs/_templates/.gitkeep mode change 100644 => 100755 graphs/docs/cli/introduction.rst mode change 100644 => 100755 graphs/docs/conf.py mode change 100644 => 100755 graphs/docs/contributing.rst mode change 100644 => 100755 graphs/docs/graphs/edge_attributes.rst mode change 100644 => 100755 graphs/docs/graphs/edges.rst mode change 100644 => 100755 graphs/docs/graphs/edges/cutoff.rst mode change 100644 => 100755 graphs/docs/graphs/edges/knn.rst mode change 100644 => 100755 graphs/docs/graphs/edges/multi_scale.rst mode change 100644 => 100755 graphs/docs/graphs/edges/tri_refined_edges.csv mode change 100644 => 100755 graphs/docs/graphs/introduction.rst mode change 100644 => 100755 graphs/docs/graphs/node_attributes.rst mode change 100644 => 100755 graphs/docs/graphs/node_attributes/anemoi_dataset_attribute.rst mode change 100644 => 100755 graphs/docs/graphs/node_attributes/area_masks.rst mode change 100644 => 100755 graphs/docs/graphs/node_attributes/boolean_operations.rst mode change 100644 => 100755 graphs/docs/graphs/node_attributes/weights.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/anemoi_dataset.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/healpix.csv mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/healpix.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/hex_refined.csv mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/hex_refined_icosahedron.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/icon_mesh.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/latlon_arrays.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/npz_file.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/reduced_gaussian.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/text_file.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/tri_nodes.csv mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/tri_refined_icosahedron.rst mode change 100644 => 100755 graphs/docs/graphs/node_coordinates/xarray_file.rst mode change 100644 => 100755 graphs/docs/graphs/post_processor.rst mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_boolean_operation.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_cosine_lat_weighted.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_custom_area_weights.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_cutout.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_grids.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_isolatitude_area_weights.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_lam_mask.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_masked_planar_area_weights.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_nonmissingzarr.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_nonzerozarr.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_planar_area_weights.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_spherical_area_weights.yaml mode change 100644 => 100755 graphs/docs/graphs/yaml/attributes_uniform_weights.yaml mode change 100644 => 100755 graphs/docs/index.rst mode change 100644 => 100755 graphs/docs/installing.rst mode change 100644 => 100755 graphs/docs/modules/edge_attributes.rst mode change 100644 => 100755 graphs/docs/modules/edge_builder.rst mode change 100644 => 100755 graphs/docs/modules/graph_creator.rst mode change 100644 => 100755 graphs/docs/modules/graph_inspector.rst mode change 100644 => 100755 graphs/docs/modules/node_attributes.rst mode change 100644 => 100755 graphs/docs/modules/node_builder.rst mode change 100644 => 100755 graphs/docs/modules/post_processor.rst mode change 100644 => 100755 graphs/docs/modules/schemas.rst mode change 100644 => 100755 graphs/docs/overview.rst mode change 100644 => 100755 graphs/docs/usage/create_sparse_matrices.rst mode change 100644 => 100755 graphs/docs/usage/getting_started.rst mode change 100644 => 100755 graphs/docs/usage/limited_area.rst mode change 100644 => 100755 graphs/docs/usage/schemas/global.excalidraw mode change 100644 => 100755 graphs/docs/usage/schemas/global.png mode change 100644 => 100755 graphs/docs/usage/schemas/global_wo-proc.excalidraw mode change 100644 => 100755 graphs/docs/usage/schemas/global_wo-proc.png mode change 100644 => 100755 graphs/docs/usage/yaml/cutout_zarr.yaml mode change 100644 => 100755 graphs/docs/usage/yaml/global.txt mode change 100644 => 100755 graphs/docs/usage/yaml/global.yaml mode change 100644 => 100755 graphs/docs/usage/yaml/global_with-attrs.txt mode change 100644 => 100755 graphs/docs/usage/yaml/global_with-attrs.yaml mode change 100644 => 100755 graphs/docs/usage/yaml/global_wo-proc.png mode change 100644 => 100755 graphs/docs/usage/yaml/global_wo-proc.txt mode change 100644 => 100755 graphs/docs/usage/yaml/global_wo-proc.yaml mode change 100644 => 100755 graphs/docs/usage/yaml/lam_nodes_wo_boundary.yaml mode change 100644 => 100755 graphs/docs/usage/yaml/limited_area_nodes.yaml mode change 100644 => 100755 graphs/docs/usage/yaml/nodes.yaml mode change 100644 => 100755 graphs/docs/usage/yaml/nodes_with-attrs.yaml mode change 100644 => 100755 graphs/docs/usage/yaml/sparse_matrices.yaml mode change 100644 => 100755 graphs/pyproject.toml mode change 100644 => 100755 graphs/src/anemoi/graphs/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/__main__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/commands/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/commands/create.py mode change 100644 => 100755 graphs/src/anemoi/graphs/commands/describe.py mode change 100644 => 100755 graphs/src/anemoi/graphs/commands/export_to_sparse.py mode change 100644 => 100755 graphs/src/anemoi/graphs/commands/inspect.py mode change 100644 => 100755 graphs/src/anemoi/graphs/create.py mode change 100644 => 100755 graphs/src/anemoi/graphs/describe.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/attributes.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/builders/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/builders/base.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/builders/cutoff.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/builders/healpix.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/builders/icon.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/builders/knn.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/builders/masking.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/builders/multi_scale.py mode change 100644 => 100755 graphs/src/anemoi/graphs/edges/directional.py mode change 100644 => 100755 graphs/src/anemoi/graphs/export.py mode change 100644 => 100755 graphs/src/anemoi/graphs/generate/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/generate/healpix.py mode change 100644 => 100755 graphs/src/anemoi/graphs/generate/hex_icosahedron.py mode change 100644 => 100755 graphs/src/anemoi/graphs/generate/icon_mesh.py mode change 100644 => 100755 graphs/src/anemoi/graphs/generate/masks.py mode change 100644 => 100755 graphs/src/anemoi/graphs/generate/multi_scale_edges.py mode change 100644 => 100755 graphs/src/anemoi/graphs/generate/transforms.py mode change 100644 => 100755 graphs/src/anemoi/graphs/generate/tri_icosahedron.py mode change 100644 => 100755 graphs/src/anemoi/graphs/generate/utils.py mode change 100644 => 100755 graphs/src/anemoi/graphs/inspect.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/attributes/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/attributes/area_weights.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/attributes/base_attributes.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/attributes/boolean_op.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/attributes/masks.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/builders/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/builders/base.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/builders/from_file.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/builders/from_healpix.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/builders/from_icon.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/builders/from_reduced_gaussian.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/builders/from_refined_icosahedron.py mode change 100644 => 100755 graphs/src/anemoi/graphs/nodes/builders/from_vectors.py mode change 100644 => 100755 graphs/src/anemoi/graphs/normalise.py mode change 100644 => 100755 graphs/src/anemoi/graphs/plotting/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/plotting/displots.py mode change 100644 => 100755 graphs/src/anemoi/graphs/plotting/interactive_2d_html.py mode change 100644 => 100755 graphs/src/anemoi/graphs/plotting/interactive_3d.html.jinja mode change 100644 => 100755 graphs/src/anemoi/graphs/plotting/interactive_3d_html.py mode change 100644 => 100755 graphs/src/anemoi/graphs/plotting/prepare.py mode change 100644 => 100755 graphs/src/anemoi/graphs/processors/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/processors/post_process.py mode change 100644 => 100755 graphs/src/anemoi/graphs/schemas/__init__.py mode change 100644 => 100755 graphs/src/anemoi/graphs/schemas/base_graph.py mode change 100644 => 100755 graphs/src/anemoi/graphs/schemas/edge_attributes_schemas.py mode change 100644 => 100755 graphs/src/anemoi/graphs/schemas/edge_schemas.py mode change 100644 => 100755 graphs/src/anemoi/graphs/schemas/node_attributes_schemas.py mode change 100644 => 100755 graphs/src/anemoi/graphs/schemas/node_schemas.py mode change 100644 => 100755 graphs/src/anemoi/graphs/schemas/normalise.py mode change 100644 => 100755 graphs/src/anemoi/graphs/schemas/post_processors.py mode change 100644 => 100755 graphs/src/anemoi/graphs/utils.py mode change 100644 => 100755 graphs/tests/conftest.py mode change 100644 => 100755 graphs/tests/edges/test_cutoff.py mode change 100644 => 100755 graphs/tests/edges/test_direction.py mode change 100644 => 100755 graphs/tests/edges/test_edge_attributes.py mode change 100644 => 100755 graphs/tests/edges/test_healpix_multiscale.py mode change 100644 => 100755 graphs/tests/edges/test_icon_edges.py mode change 100644 => 100755 graphs/tests/edges/test_knn.py mode change 100644 => 100755 graphs/tests/edges/test_multiscale_edges.py mode change 100644 => 100755 graphs/tests/generate/test_mask_builder.py mode change 100644 => 100755 graphs/tests/generate/test_transforms.py mode change 100644 => 100755 graphs/tests/nodes/attributes/test_base.py mode change 100644 => 100755 graphs/tests/nodes/attributes/test_boolean_operations.py mode change 100644 => 100755 graphs/tests/nodes/attributes/test_masks.py mode change 100644 => 100755 graphs/tests/nodes/attributes/test_weights.py mode change 100644 => 100755 graphs/tests/nodes/test_anemoi_dataset.py mode change 100644 => 100755 graphs/tests/nodes/test_arrays.py mode change 100644 => 100755 graphs/tests/nodes/test_cutout_nodes.py mode change 100644 => 100755 graphs/tests/nodes/test_from_xarray.py mode change 100644 => 100755 graphs/tests/nodes/test_healpix.py mode change 100644 => 100755 graphs/tests/nodes/test_hex_nodes.py mode change 100644 => 100755 graphs/tests/nodes/test_icon_nodes.py mode change 100644 => 100755 graphs/tests/nodes/test_npz.py mode change 100644 => 100755 graphs/tests/nodes/test_reduced_gaussian.py mode change 100644 => 100755 graphs/tests/nodes/test_tri_nodes.py mode change 100644 => 100755 graphs/tests/processors/test_post_process.py mode change 100644 => 100755 graphs/tests/test_create.py mode change 100644 => 100755 graphs/tests/test_normaliser.py mode change 100644 => 100755 graphs/tests/test_utils.py mode change 100644 => 100755 models/.gitattributes mode change 100644 => 100755 models/.gitignore mode change 100644 => 100755 models/.readthedocs.yaml mode change 100644 => 100755 models/CHANGELOG.md mode change 100644 => 100755 models/CONTRIBUTORS.md mode change 100644 => 100755 models/LICENSE mode change 100644 => 100755 models/README.md mode change 100644 => 100755 models/docs/Makefile mode change 100644 => 100755 models/docs/_static/anemoi-models_schematic.drawio mode change 100644 => 100755 models/docs/_static/anemoi-models_schematic.png mode change 100644 => 100755 models/docs/_static/data_indices.drawio mode change 100644 => 100755 models/docs/_static/data_indices.png mode change 100644 => 100755 models/docs/_static/logo.png mode change 100644 => 100755 models/docs/_static/preprocessing_remapper_atanh.png mode change 100644 => 100755 models/docs/_static/preprocessing_remapper_boxcox.png mode change 100644 => 100755 models/docs/_static/preprocessing_remapper_power.png mode change 100644 => 100755 models/docs/_static/style.css mode change 100644 => 100755 models/docs/_templates/.gitkeep mode change 100644 => 100755 models/docs/cli/migration.rst mode change 100644 => 100755 models/docs/conf.py mode change 100644 => 100755 models/docs/contributing.rst mode change 100644 => 100755 models/docs/create-migrations.rst mode change 100644 => 100755 models/docs/index.rst mode change 100644 => 100755 models/docs/introduction/installing.rst mode change 100644 => 100755 models/docs/introduction/overview.rst mode change 100644 => 100755 models/docs/modules/activations.rst mode change 100644 => 100755 models/docs/modules/data_indices.rst mode change 100644 => 100755 models/docs/modules/distributed.rst mode change 100644 => 100755 models/docs/modules/interface.rst mode change 100644 => 100755 models/docs/modules/layers.rst mode change 100644 => 100755 models/docs/modules/migrations.rst mode change 100644 => 100755 models/docs/modules/models.rst mode change 100644 => 100755 models/docs/modules/normalization.rst mode change 100644 => 100755 models/docs/modules/preprocessing.rst mode change 100644 => 100755 models/docs/modules/residual.rst mode change 100644 => 100755 models/docs/modules/schemas.rst mode change 100644 => 100755 models/docs/usage/create_model.rst mode change 100644 => 100755 models/pyproject.toml mode change 100644 => 100755 models/pytest.ini mode change 100644 => 100755 models/src/anemoi/models/__init__.py mode change 100644 => 100755 models/src/anemoi/models/__main__.py mode change 100644 => 100755 models/src/anemoi/models/commands/__init__.py mode change 100644 => 100755 models/src/anemoi/models/commands/hello.py mode change 100644 => 100755 models/src/anemoi/models/commands/migration.py mode change 100644 => 100755 models/src/anemoi/models/data_indices/__init__.py mode change 100644 => 100755 models/src/anemoi/models/data_indices/collection.py mode change 100644 => 100755 models/src/anemoi/models/data_indices/index.py mode change 100644 => 100755 models/src/anemoi/models/data_indices/tensor.py mode change 100644 => 100755 models/src/anemoi/models/distributed/__init__.py mode change 100644 => 100755 models/src/anemoi/models/distributed/balanced_partition.py mode change 100644 => 100755 models/src/anemoi/models/distributed/graph.py mode change 100644 => 100755 models/src/anemoi/models/distributed/khop_edges.py mode change 100644 => 100755 models/src/anemoi/models/distributed/primitives.py mode change 100644 => 100755 models/src/anemoi/models/distributed/shapes.py mode change 100644 => 100755 models/src/anemoi/models/distributed/transformer.py mode change 100644 => 100755 models/src/anemoi/models/distributed/utils.py mode change 100644 => 100755 models/src/anemoi/models/interface/__init__.py mode change 100644 => 100755 models/src/anemoi/models/layers/__init__.py mode change 100644 => 100755 models/src/anemoi/models/layers/activations.py mode change 100644 => 100755 models/src/anemoi/models/layers/attention.py mode change 100644 => 100755 models/src/anemoi/models/layers/block.py mode change 100644 => 100755 models/src/anemoi/models/layers/bounding.py mode change 100644 => 100755 models/src/anemoi/models/layers/conv.py mode change 100644 => 100755 models/src/anemoi/models/layers/diffusion.py mode change 100644 => 100755 models/src/anemoi/models/layers/ensemble.py mode change 100644 => 100755 models/src/anemoi/models/layers/graph.py mode change 100644 => 100755 models/src/anemoi/models/layers/graph_provider.py mode change 100644 => 100755 models/src/anemoi/models/layers/mapper.py mode change 100644 => 100755 models/src/anemoi/models/layers/mlp.py mode change 100644 => 100755 models/src/anemoi/models/layers/normalization.py mode change 100644 => 100755 models/src/anemoi/models/layers/processor.py mode change 100644 => 100755 models/src/anemoi/models/layers/residual.py mode change 100644 => 100755 models/src/anemoi/models/layers/sparse_projector.py mode change 100644 => 100755 models/src/anemoi/models/layers/spectral_helpers.py mode change 100644 => 100755 models/src/anemoi/models/layers/spectral_transforms.py mode change 100644 => 100755 models/src/anemoi/models/layers/utils.py mode change 100644 => 100755 models/src/anemoi/models/migrations/__init__.py mode change 100644 => 100755 models/src/anemoi/models/migrations/migrator.py mode change 100644 => 100755 models/src/anemoi/models/migrations/scripts/1755530253_initial.py mode change 100644 => 100755 models/src/anemoi/models/migrations/scripts/1762857427_deprecate_eda.py mode change 100644 => 100755 models/src/anemoi/models/migrations/scripts/1762857428_chunking_fix.py mode change 100644 => 100755 models/src/anemoi/models/migrations/scripts/1763479917_hardware_schema_update.py mode change 100644 => 100755 models/src/anemoi/models/migrations/scripts/1763479918_refactor_mapper.py mode change 100644 => 100755 models/src/anemoi/models/migrations/scripts/1767108147_move_to_multiple_datasets.py mode change 100644 => 100755 models/src/anemoi/models/migrations/scripts/1773048851_fuse_multiple_perdataset_graphs.py mode change 100644 => 100755 models/src/anemoi/models/migrations/scripts/1776237003_rename_swa_to_weight_averaging.py mode change 100644 => 100755 models/src/anemoi/models/migrations/setup_context.py mode change 100644 => 100755 models/src/anemoi/models/models/__init__.py mode change 100644 => 100755 models/src/anemoi/models/models/autoencoder.py mode change 100644 => 100755 models/src/anemoi/models/models/base.py mode change 100644 => 100755 models/src/anemoi/models/models/diffusion_encoder_processor_decoder.py mode change 100644 => 100755 models/src/anemoi/models/models/encoder_processor_decoder.py mode change 100644 => 100755 models/src/anemoi/models/models/ens_encoder_processor_decoder.py mode change 100644 => 100755 models/src/anemoi/models/models/hierarchical.py mode change 100644 => 100755 models/src/anemoi/models/models/hierarchical_autoencoder.py mode change 100644 => 100755 models/src/anemoi/models/preprocessing/__init__.py mode change 100644 => 100755 models/src/anemoi/models/preprocessing/imputer.py mode change 100644 => 100755 models/src/anemoi/models/preprocessing/mappings.py mode change 100644 => 100755 models/src/anemoi/models/preprocessing/normalizer.py mode change 100644 => 100755 models/src/anemoi/models/preprocessing/postprocessor.py mode change 100644 => 100755 models/src/anemoi/models/preprocessing/remapper.py mode change 100644 => 100755 models/src/anemoi/models/samplers/__init__.py mode change 100644 => 100755 models/src/anemoi/models/samplers/diffusion_samplers.py mode change 100644 => 100755 models/src/anemoi/models/schemas/__init__.py mode change 100644 => 100755 models/src/anemoi/models/schemas/common_components.py mode change 100644 => 100755 models/src/anemoi/models/schemas/data_processor.py mode change 100644 => 100755 models/src/anemoi/models/schemas/decoder.py mode change 100644 => 100755 models/src/anemoi/models/schemas/encoder.py mode change 100644 => 100755 models/src/anemoi/models/schemas/models.py mode change 100644 => 100755 models/src/anemoi/models/schemas/processor.py mode change 100644 => 100755 models/src/anemoi/models/schemas/residual.py mode change 100644 => 100755 models/src/anemoi/models/triton/gt.py mode change 100644 => 100755 models/src/anemoi/models/triton/utils.py mode change 100644 => 100755 models/src/anemoi/models/utils/__init__.py mode change 100644 => 100755 models/src/anemoi/models/utils/compile.py mode change 100644 => 100755 models/src/anemoi/models/utils/config.py mode change 100644 => 100755 models/tests/conftest.py mode change 100644 => 100755 models/tests/data_indices/test_collection.py mode change 100644 => 100755 models/tests/data_indices/test_data_indices.py mode change 100644 => 100755 models/tests/distributed/balanced_partition.py mode change 100644 => 100755 models/tests/integration/triton/test_triton_gt.py mode change 100644 => 100755 models/tests/layers/block/test_block_graphconv.py mode change 100644 => 100755 models/tests/layers/block/test_block_graphtransformer.py mode change 100644 => 100755 models/tests/layers/block/test_block_pointwise.py mode change 100644 => 100755 models/tests/layers/block/test_block_transformer.py mode change 100644 => 100755 models/tests/layers/block/test_block_transformermapper.py mode change 100644 => 100755 models/tests/layers/mapper/test_base_mapper.py mode change 100644 => 100755 models/tests/layers/mapper/test_graphconv_mapper.py mode change 100644 => 100755 models/tests/layers/mapper/test_graphtransformer_mapper.py mode change 100644 => 100755 models/tests/layers/mapper/test_pointwise_mapper.py mode change 100644 => 100755 models/tests/layers/mapper/test_transformer_mapper.py mode change 100644 => 100755 models/tests/layers/processor/test_base_processor.py mode change 100644 => 100755 models/tests/layers/processor/test_graphconv_processor.py mode change 100644 => 100755 models/tests/layers/processor/test_graphtransformer_processor.py mode change 100644 => 100755 models/tests/layers/processor/test_pointwise_processor.py mode change 100644 => 100755 models/tests/layers/processor/test_transformer_processor.py mode change 100644 => 100755 models/tests/layers/test_activations.py mode change 100644 => 100755 models/tests/layers/test_attention.py mode change 100644 => 100755 models/tests/layers/test_bounding.py mode change 100644 => 100755 models/tests/layers/test_grad_checkpoint_wiring.py mode change 100644 => 100755 models/tests/layers/test_graph.py mode change 100644 => 100755 models/tests/layers/test_layer_utils.py mode change 100644 => 100755 models/tests/layers/test_mlp.py mode change 100644 => 100755 models/tests/layers/test_noise_embeddings.py mode change 100644 => 100755 models/tests/layers/test_residual.py mode change 100644 => 100755 models/tests/layers/test_sht.py mode change 100644 => 100755 models/tests/migrations/conftest.py mode change 100644 => 100755 models/tests/migrations/migrations/1750840837_add_foo.py mode change 100644 => 100755 models/tests/migrations/migrations/1750841219_add_bar.py mode change 100644 => 100755 models/tests/migrations/migrations/1750859824_add_baz.py mode change 100644 => 100755 models/tests/migrations/migrations/1750859905_rename_baz.py mode change 100644 => 100755 models/tests/migrations/migrations/1751895180_final.py mode change 100644 => 100755 models/tests/migrations/migrations/1751895203_recent.py mode change 100644 => 100755 models/tests/migrations/test_migration_order.py mode change 100644 => 100755 models/tests/migrations/test_migrations.py mode change 100644 => 100755 models/tests/models/test_diffusion_sampling_pipeline.py mode change 100644 => 100755 models/tests/models/test_diffusion_tendency.py mode change 100644 => 100755 models/tests/models/test_models.py mode change 100644 => 100755 models/tests/preprocessing/test_mappings.py mode change 100644 => 100755 models/tests/preprocessing/test_postprocessor.py mode change 100644 => 100755 models/tests/preprocessing/test_preprocessor_imputer.py mode change 100644 => 100755 models/tests/preprocessing/test_preprocessor_normalizer.py mode change 100644 => 100755 models/tests/preprocessing/test_preprocessor_remapper.py mode change 100644 => 100755 models/tests/preprocessing/test_stepwise_processors.py mode change 100644 => 100755 models/tests/samplers/test_diffusion_samplers.py mode change 100644 => 100755 models/tests/schemas/test_data_processors_schemas.py mode change 100644 => 100755 models/tests/schemas/test_model_schemas_pointwise_mappers.py mode change 100644 => 100755 models/tests/utils/test_compile.py mode change 100644 => 100755 training/.gitattributes mode change 100644 => 100755 training/.gitignore mode change 100644 => 100755 training/.readthedocs.yaml mode change 100644 => 100755 training/CHANGELOG.md mode change 100644 => 100755 training/CONTRIBUTORS.md mode change 100644 => 100755 training/LICENSE mode change 100644 => 100755 training/README.md mode change 100644 => 100755 training/docs/Makefile mode change 100644 => 100755 training/docs/_static/logo.png mode change 100644 => 100755 training/docs/_static/style.css mode change 100644 => 100755 training/docs/_templates/.gitkeep mode change 100644 => 100755 training/docs/adrs/adr-001.md mode change 100644 => 100755 training/docs/adrs/adr-002.md mode change 100644 => 100755 training/docs/adrs/template.md mode change 100644 => 100755 training/docs/checkpoint_integration.rst mode change 100644 => 100755 training/docs/checkpoint_pipeline_configuration.rst mode change 100644 => 100755 training/docs/checkpoint_troubleshooting.rst mode change 100644 => 100755 training/docs/conf.py mode change 100644 => 100755 training/docs/contributing.rst mode change 100644 => 100755 training/docs/images/global-sliding-window-attention.png mode change 100644 => 100755 training/docs/images/gnn-encoder-decoder-multimesh.jpg mode change 100644 => 100755 training/docs/images/mlflow/mlflow_compare.png mode change 100644 => 100755 training/docs/images/mlflow/mlflow_constant.png mode change 100644 => 100755 training/docs/images/mlflow/mlflow_resumed_run.png mode change 100644 => 100755 training/docs/images/mlflow/mlflow_run.png mode change 100644 => 100755 training/docs/images/mlflow/mlflow_server.png mode change 100644 => 100755 training/docs/images/model_sharding.png mode change 100644 => 100755 training/docs/images/multi-dataset/downscaling-multi.png mode change 100644 => 100755 training/docs/images/multi-dataset/lam-multi.png mode change 100644 => 100755 training/docs/images/multi-dataset/prog-forc-diag.png mode change 100644 => 100755 training/docs/images/performance-guide/mem-snapshot-1-mapper-chunk.png mode change 100644 => 100755 training/docs/images/performance-guide/mem-snapshot-4-mapper-chunks.png mode change 100644 => 100755 training/docs/images/performance-guide/performance-flowchart.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_architecture.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_benchmark_profiler.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_config.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_high_level.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_mlflow_integration.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_mlflow_integration_2.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_mlflow_integration_3.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_speed_report.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_speedreport_diagram.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_training_rates.png mode change 100644 => 100755 training/docs/images/profiler/anemoi_profiler_validation_rates.png mode change 100644 => 100755 training/docs/images/profiler/example_memory_report.png mode change 100644 => 100755 training/docs/images/profiler/example_memory_timeline.png mode change 100644 => 100755 training/docs/images/profiler/example_model_summary.png mode change 100644 => 100755 training/docs/images/profiler/example_model_summary_2.png mode change 100644 => 100755 training/docs/images/profiler/example_system_report.png mode change 100644 => 100755 training/docs/images/profiler/example_time_report.png mode change 100644 => 100755 training/docs/images/profiler/idle_time_breakdown.png mode change 100644 => 100755 training/docs/images/profiler/kernel_breakdown_dfs.png mode change 100644 => 100755 training/docs/images/profiler/kernel_breakdown_plots.png mode change 100644 => 100755 training/docs/images/profiler/memory_snapshot_diagram.png mode change 100644 => 100755 training/docs/images/profiler/memory_snapshot_output.png mode change 100644 => 100755 training/docs/images/profiler/temporal_breakdown.png mode change 100644 => 100755 training/docs/images/transformer-block.png mode change 100644 => 100755 training/docs/index.rst mode change 100644 => 100755 training/docs/introduction/installing.rst mode change 100644 => 100755 training/docs/introduction/overview.rst mode change 100644 => 100755 training/docs/modules/data.rst mode change 100644 => 100755 training/docs/modules/diagnostics.rst mode change 100644 => 100755 training/docs/modules/losses.rst mode change 100644 => 100755 training/docs/modules/optimization.rst mode change 100644 => 100755 training/docs/modules/schemas.rst mode change 100644 => 100755 training/docs/modules/strategy.rst mode change 100644 => 100755 training/docs/modules/tasks.rst mode change 100644 => 100755 training/docs/modules/train.rst mode change 100644 => 100755 training/docs/troubleshooting.rst mode change 100644 => 100755 training/docs/user-guide/basic-set-up.rst mode change 100644 => 100755 training/docs/user-guide/benchmarking.rst mode change 100644 => 100755 training/docs/user-guide/configuring.rst mode change 100644 => 100755 training/docs/user-guide/distributed.rst mode change 100644 => 100755 training/docs/user-guide/download-era5-o96.rst mode change 100644 => 100755 training/docs/user-guide/hydra-intro.rst mode change 100644 => 100755 training/docs/user-guide/models.rst mode change 100644 => 100755 training/docs/user-guide/multi-datasets.rst mode change 100644 => 100755 training/docs/user-guide/overview.rst mode change 100644 => 100755 training/docs/user-guide/performance-optimisation.rst mode change 100644 => 100755 training/docs/user-guide/tasks.rst mode change 100644 => 100755 training/docs/user-guide/tracking.rst mode change 100644 => 100755 training/docs/user-guide/training-methods.rst mode change 100644 => 100755 training/docs/user-guide/training.rst mode change 100644 => 100755 training/docs/user-guide/yaml/dataloader.yaml mode change 100644 => 100755 training/docs/user-guide/yaml/example_crps_config.yaml mode change 100644 => 100755 training/pyproject.toml mode change 100644 => 100755 training/pytest.ini mode change 100644 => 100755 training/src/anemoi/training/__init__.py mode change 100644 => 100755 training/src/anemoi/training/__main__.py mode change 100644 => 100755 training/src/anemoi/training/checkpoint/__init__.py mode change 100644 => 100755 training/src/anemoi/training/checkpoint/base.py mode change 100644 => 100755 training/src/anemoi/training/checkpoint/catalog.py mode change 100644 => 100755 training/src/anemoi/training/checkpoint/exceptions.py mode change 100644 => 100755 training/src/anemoi/training/checkpoint/formats.py mode change 100644 => 100755 training/src/anemoi/training/checkpoint/pipeline.py mode change 100644 => 100755 training/src/anemoi/training/checkpoint/utils.py mode change 100644 => 100755 training/src/anemoi/training/commands/__init__.py mode change 100644 => 100755 training/src/anemoi/training/commands/checkpoint.py mode change 100644 => 100755 training/src/anemoi/training/commands/config.py mode change 100644 => 100755 training/src/anemoi/training/commands/mlflow.py mode change 100644 => 100755 training/src/anemoi/training/commands/profiler.py mode change 100644 => 100755 training/src/anemoi/training/commands/train.py mode change 100644 => 100755 training/src/anemoi/training/config/__init__.py mode change 100644 => 100755 training/src/anemoi/training/config/autoencoder.yaml mode change 100644 => 100755 training/src/anemoi/training/config/config.yaml mode change 100644 => 100755 training/src/anemoi/training/config/data/multi.yaml mode change 100644 => 100755 training/src/anemoi/training/config/data/zarr.yaml mode change 100644 => 100755 training/src/anemoi/training/config/dataloader/multi.yaml mode change 100644 => 100755 training/src/anemoi/training/config/dataloader/native_grid.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/benchmark_profiler/detailed.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/benchmark_profiler/simple.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/callbacks/placeholder.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/callbacks/rollout_eval.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/evaluation.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/evaluation_ens.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/evaluation_multi.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/log/mlflow.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/log/wandb.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/plot/detailed.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/plot/multi.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diagnostics/plot/simple.yaml mode change 100644 => 100755 training/src/anemoi/training/config/diffusion.yaml mode change 100644 => 100755 training/src/anemoi/training/config/ensemble_crps.yaml mode change 100644 => 100755 training/src/anemoi/training/config/graph/encoder_decoder_only.yaml mode change 100644 => 100755 training/src/anemoi/training/config/graph/existing.yaml mode change 100644 => 100755 training/src/anemoi/training/config/graph/hierarchical_2level.yaml mode change 100644 => 100755 training/src/anemoi/training/config/graph/hierarchical_2level_encoder_decoder_only.yaml mode change 100644 => 100755 training/src/anemoi/training/config/graph/hierarchical_3level.yaml mode change 100644 => 100755 training/src/anemoi/training/config/graph/limited_area.yaml mode change 100644 => 100755 training/src/anemoi/training/config/graph/multi.yaml mode change 100644 => 100755 training/src/anemoi/training/config/graph/multi_scale.yaml mode change 100644 => 100755 training/src/anemoi/training/config/graph/point_wise.yaml mode change 100644 => 100755 training/src/anemoi/training/config/graph/stretched_grid.yaml mode change 100644 => 100755 training/src/anemoi/training/config/hierarchical.yaml mode change 100644 => 100755 training/src/anemoi/training/config/hierarchical_autoencoder.yaml mode change 100644 => 100755 training/src/anemoi/training/config/lam.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/gnn.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/graphtransformer.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/graphtransformer_diffusion.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/graphtransformer_diffusiontend.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/graphtransformer_ens.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/point_wise.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/transformer.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/transformer_diffusion.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/transformer_diffusiontend.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/transformer_ens.yaml mode change 100644 => 100755 training/src/anemoi/training/config/model/transformer_transformermapper.yaml mode change 100644 => 100755 training/src/anemoi/training/config/multi.yaml mode change 100644 => 100755 training/src/anemoi/training/config/point_wise.yaml mode change 100644 => 100755 training/src/anemoi/training/config/stretched.yaml mode change 100644 => 100755 training/src/anemoi/training/config/system/example.yaml mode change 100644 => 100755 training/src/anemoi/training/config/system/hardware/example.yaml mode change 100644 => 100755 training/src/anemoi/training/config/system/hardware/slurm.yaml mode change 100644 => 100755 training/src/anemoi/training/config/system/input/example.yaml mode change 100644 => 100755 training/src/anemoi/training/config/system/output/example.yaml mode change 100644 => 100755 training/src/anemoi/training/config/system/slurm.yaml mode change 100644 => 100755 training/src/anemoi/training/config/task/autoencoder.yaml mode change 100644 => 100755 training/src/anemoi/training/config/task/forecaster.yaml mode change 100644 => 100755 training/src/anemoi/training/config/task/temporal_downscaler.yaml mode change 100644 => 100755 training/src/anemoi/training/config/temporal_downscaler.yaml mode change 100644 => 100755 training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/diffusion.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/ensemble.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/lam.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/multi.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/optimization/default.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/optimization/lr_scheduler/cosine_scheduler.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/optimization/optimizer/adamw.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/optimization/optimizer/ademamix.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/optimization/optimizer/zero.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/scalers/global.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/scalers/lam.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/scalers/multi.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/scalers/stretched.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/single.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/stretched.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/training_loss/ensemble.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/training_loss/single.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/training_loss/single_combined.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/weight_averaging/ema.yaml mode change 100644 => 100755 training/src/anemoi/training/config/training/weight_averaging/swa.yaml mode change 100644 => 100755 training/src/anemoi/training/data/__init__.py mode change 100644 => 100755 training/src/anemoi/training/data/data_reader.py mode change 100644 => 100755 training/src/anemoi/training/data/datamodule.py mode change 100644 => 100755 training/src/anemoi/training/data/multidataset.py mode change 100644 => 100755 training/src/anemoi/training/data/relative_time_indices.py mode change 100644 => 100755 training/src/anemoi/training/data/usable_indices.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/__init__.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/benchmark_server.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/__init__.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/checkpoint.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/evaluation.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/optimiser.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/plot.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/plot_adapter.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/plot_ens.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/profiler.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/provenance.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/sanity.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/stopping.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/callbacks/weight_averaging.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/continents.json mode change 100644 => 100755 training/src/anemoi/training/diagnostics/countries.geo.json mode change 100644 => 100755 training/src/anemoi/training/diagnostics/focus_area.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/logger.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/maps.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/mlflow/__init__.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/mlflow/azureml.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/mlflow/logger.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/mlflow/system_metrics/cpu_monitor.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/mlflow/system_metrics/gpu_monitor.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/mlflow/utils.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/plots.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/profilers.py mode change 100644 => 100755 training/src/anemoi/training/diagnostics/projections.py mode change 100644 => 100755 training/src/anemoi/training/distributed/__init__.py mode change 100644 => 100755 training/src/anemoi/training/distributed/groups.py mode change 100644 => 100755 training/src/anemoi/training/distributed/strategy.py mode change 100644 => 100755 training/src/anemoi/training/losses/__init__.py mode change 100644 => 100755 training/src/anemoi/training/losses/aggregate.py mode change 100644 => 100755 training/src/anemoi/training/losses/base.py mode change 100644 => 100755 training/src/anemoi/training/losses/combined.py mode change 100644 => 100755 training/src/anemoi/training/losses/huber.py mode change 100644 => 100755 training/src/anemoi/training/losses/kcrps.py mode change 100644 => 100755 training/src/anemoi/training/losses/logcosh.py mode change 100644 => 100755 training/src/anemoi/training/losses/loss.py mode change 100644 => 100755 training/src/anemoi/training/losses/mae.py mode change 100644 => 100755 training/src/anemoi/training/losses/mse.py mode change 100644 => 100755 training/src/anemoi/training/losses/multiscale.py mode change 100644 => 100755 training/src/anemoi/training/losses/rmse.py mode change 100644 => 100755 training/src/anemoi/training/losses/scaler_tensor.py mode change 100644 => 100755 training/src/anemoi/training/losses/scalers/__init__.py mode change 100644 => 100755 training/src/anemoi/training/losses/scalers/base_scaler.py mode change 100644 => 100755 training/src/anemoi/training/losses/scalers/loss_weights_mask.py mode change 100644 => 100755 training/src/anemoi/training/losses/scalers/node_attributes.py mode change 100644 => 100755 training/src/anemoi/training/losses/scalers/scalers.py mode change 100644 => 100755 training/src/anemoi/training/losses/scalers/time_step.py mode change 100644 => 100755 training/src/anemoi/training/losses/scalers/variable.py mode change 100644 => 100755 training/src/anemoi/training/losses/scalers/variable_level.py mode change 100644 => 100755 training/src/anemoi/training/losses/scalers/variable_masking.py mode change 100644 => 100755 training/src/anemoi/training/losses/scalers/variable_tendency.py mode change 100644 => 100755 training/src/anemoi/training/losses/spectral.py mode change 100644 => 100755 training/src/anemoi/training/losses/utils.py mode change 100644 => 100755 training/src/anemoi/training/losses/variable_mapper.py mode change 100644 => 100755 training/src/anemoi/training/losses/weighted_mse.py mode change 100644 => 100755 training/src/anemoi/training/optimizers/AdEMAMix.py mode change 100644 => 100755 training/src/anemoi/training/schemas/__init__.py mode change 100644 => 100755 training/src/anemoi/training/schemas/base_schema.py mode change 100644 => 100755 training/src/anemoi/training/schemas/data.py mode change 100644 => 100755 training/src/anemoi/training/schemas/dataloader.py mode change 100644 => 100755 training/src/anemoi/training/schemas/diagnostics.py mode change 100644 => 100755 training/src/anemoi/training/schemas/schema_utils.py mode change 100644 => 100755 training/src/anemoi/training/schemas/system.py mode change 100644 => 100755 training/src/anemoi/training/schemas/tasks.py mode change 100644 => 100755 training/src/anemoi/training/schemas/training.py mode change 100644 => 100755 training/src/anemoi/training/tasks/__init__.py mode change 100644 => 100755 training/src/anemoi/training/tasks/base.py mode change 100644 => 100755 training/src/anemoi/training/tasks/forecaster.py mode change 100644 => 100755 training/src/anemoi/training/tasks/temporal_downscaler.py mode change 100644 => 100755 training/src/anemoi/training/tasks/timeless.py mode change 100644 => 100755 training/src/anemoi/training/train/__init__.py mode change 100644 => 100755 training/src/anemoi/training/train/methods/__init__.py mode change 100644 => 100755 training/src/anemoi/training/train/methods/base.py mode change 100644 => 100755 training/src/anemoi/training/train/methods/diffusion.py mode change 100644 => 100755 training/src/anemoi/training/train/methods/ensemble.py mode change 100644 => 100755 training/src/anemoi/training/train/methods/single.py mode change 100644 => 100755 training/src/anemoi/training/train/profiler.py mode change 100644 => 100755 training/src/anemoi/training/train/train.py mode change 100644 => 100755 training/src/anemoi/training/utils/__init__.py mode change 100644 => 100755 training/src/anemoi/training/utils/checkpoint.py mode change 100644 => 100755 training/src/anemoi/training/utils/custom_colormaps.py mode change 100644 => 100755 training/src/anemoi/training/utils/enums.py mode change 100644 => 100755 training/src/anemoi/training/utils/index_space.py mode change 100644 => 100755 training/src/anemoi/training/utils/jsonify.py mode change 100644 => 100755 training/src/anemoi/training/utils/masks.py mode change 100644 => 100755 training/src/anemoi/training/utils/mlflow_sync.py mode change 100644 => 100755 training/src/anemoi/training/utils/seeding.py mode change 100644 => 100755 training/src/anemoi/training/utils/time_indices.py mode change 100644 => 100755 training/src/anemoi/training/utils/variables_metadata.py mode change 100644 => 100755 training/src/anemoi/training/utils/worker_init.py mode change 100644 => 100755 training/src/hydra_plugins/anemoi_searchpath/__init__.py mode change 100644 => 100755 training/src/hydra_plugins/anemoi_searchpath/anemoi_searchpath_plugin.py mode change 100644 => 100755 training/tests/conftest.py mode change 100644 => 100755 training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.py mode change 100644 => 100755 training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.yaml mode change 100644 => 100755 training/tests/integration/config/benchmark/base.yaml mode change 100644 => 100755 training/tests/integration/config/benchmark/diffusiontend.yaml mode change 100644 => 100755 training/tests/integration/config/benchmark/ensemble_crps.yaml mode change 100644 => 100755 training/tests/integration/config/benchmark/graphtransformer.yaml mode change 100644 => 100755 training/tests/integration/config/benchmark/lam.yaml mode change 100644 => 100755 training/tests/integration/config/benchmark/stretched.yaml mode change 100644 => 100755 training/tests/integration/config/imputer_modifications.yaml mode change 100644 => 100755 training/tests/integration/config/test_autoencoder.yaml mode change 100644 => 100755 training/tests/integration/config/test_diffusion.yaml mode change 100644 => 100755 training/tests/integration/config/test_ensemble_crps.yaml mode change 100644 => 100755 training/tests/integration/config/test_filtering.yaml mode change 100644 => 100755 training/tests/integration/config/test_global.yaml mode change 100644 => 100755 training/tests/integration/config/test_lam.yaml mode change 100644 => 100755 training/tests/integration/config/test_multidatasets.yaml mode change 100644 => 100755 training/tests/integration/config/test_stretched.yaml mode change 100644 => 100755 training/tests/integration/config/test_temporal_downscaler.yaml mode change 100644 => 100755 training/tests/integration/config/test_temporal_downscaler_ensemble.yaml mode change 100644 => 100755 training/tests/integration/config/testing_modifications.yaml mode change 100644 => 100755 training/tests/integration/conftest.py mode change 100644 => 100755 training/tests/integration/schemas/partial_metadata_schema.py mode change 100644 => 100755 training/tests/integration/scripts/update_slt_configs.py mode change 100644 => 100755 training/tests/integration/test_benchmark.py mode change 100644 => 100755 training/tests/integration/test_training_cycle.py mode change 100644 => 100755 training/tests/unit/checkpoint/conftest.py mode change 100644 => 100755 training/tests/unit/checkpoint/test_base.py mode change 100644 => 100755 training/tests/unit/checkpoint/test_catalog.py mode change 100644 => 100755 training/tests/unit/checkpoint/test_exceptions.py mode change 100644 => 100755 training/tests/unit/checkpoint/test_formats.py mode change 100644 => 100755 training/tests/unit/checkpoint/test_pipeline.py mode change 100644 => 100755 training/tests/unit/checkpoint/test_utils.py mode change 100644 => 100755 training/tests/unit/commands/test_config.py mode change 100644 => 100755 training/tests/unit/commands/test_mlflow.py mode change 100644 => 100755 training/tests/unit/conftest.py mode change 100644 => 100755 training/tests/unit/data/test_dataset.py mode change 100644 => 100755 training/tests/unit/data/test_multidataset.py mode change 100644 => 100755 training/tests/unit/data/test_relative_time_indices.py mode change 100644 => 100755 training/tests/unit/data/test_usable_indices.py mode change 100644 => 100755 training/tests/unit/diagnostics/callbacks/test_timelimit.py mode change 100644 => 100755 training/tests/unit/diagnostics/callbacks/test_variable_order.py mode change 100644 => 100755 training/tests/unit/diagnostics/callbacks/test_weight_averaging.py mode change 100644 => 100755 training/tests/unit/diagnostics/mlflow/test_azureml_mlflow_logger.py mode change 100644 => 100755 training/tests/unit/diagnostics/mlflow/test_mlflow_logger.py mode change 100644 => 100755 training/tests/unit/diagnostics/mlflow/test_mlflow_utils.py mode change 100644 => 100755 training/tests/unit/diagnostics/test_callbacks.py mode change 100644 => 100755 training/tests/unit/diagnostics/test_checkpoint.py mode change 100644 => 100755 training/tests/unit/diagnostics/test_focus_area.py mode change 100644 => 100755 training/tests/unit/diagnostics/test_plot_adapters.py mode change 100644 => 100755 training/tests/unit/diagnostics/test_plotting_callbacks.py mode change 100644 => 100755 training/tests/unit/diagnostics/test_plotting_ens_callbacks.py mode change 100644 => 100755 training/tests/unit/diagnostics/test_weightandbiases.py mode change 100644 => 100755 training/tests/unit/distributed/test_groups.py mode change 100644 => 100755 training/tests/unit/hydra/test_search_path_plugins.py mode change 100644 => 100755 training/tests/unit/losses/test_aggregate_loss.py mode change 100644 => 100755 training/tests/unit/losses/test_combined_loss.py mode change 100644 => 100755 training/tests/unit/losses/test_filtered_loss.py mode change 100644 => 100755 training/tests/unit/losses/test_loss_function.py mode change 100644 => 100755 training/tests/unit/losses/test_loss_scaling.py mode change 100644 => 100755 training/tests/unit/losses/test_multiscale_loss.py mode change 100644 => 100755 training/tests/unit/losses/test_scaler.py mode change 100644 => 100755 training/tests/unit/requirements.txt mode change 100644 => 100755 training/tests/unit/schemas/test_expand_paths.py mode change 100644 => 100755 training/tests/unit/schemas/test_training_schemas.py mode change 100644 => 100755 training/tests/unit/tasks/test_autoencoder.py mode change 100644 => 100755 training/tests/unit/tasks/test_forecaster.py mode change 100644 => 100755 training/tests/unit/tasks/test_temporal_downscaler.py mode change 100644 => 100755 training/tests/unit/train/test_checkpoint_loading.py mode change 100644 => 100755 training/tests/unit/train/test_methods.py mode change 100644 => 100755 training/tests/unit/train/test_optimizer.py mode change 100644 => 100755 training/tests/unit/train/test_print_variable_scaling.py mode change 100644 => 100755 training/tests/unit/train/test_profiler.py mode change 100644 => 100755 training/tests/unit/train/test_restarting_run.py mode change 100644 => 100755 training/tests/unit/utils/test_masks.py mode change 100644 => 100755 training/tests/unit/utils/test_seeding.py mode change 100644 => 100755 training/tests/unit/utils/test_time_indices.py mode change 100644 => 100755 training/tests/unit/utils/test_variable_grouping.py diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS old mode 100644 new mode 100755 diff --git a/.github/dependabot.yml b/.github/dependabot.yml old mode 100644 new mode 100755 diff --git a/.github/labeler.yml b/.github/labeler.yml old mode 100644 new mode 100755 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md old mode 100644 new mode 100755 diff --git a/.github/workflows/inactivity-bot.yml b/.github/workflows/inactivity-bot.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/integration-tests-hpc.yml b/.github/workflows/integration-tests-hpc.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/pr-conventional-commit.yml b/.github/workflows/pr-conventional-commit.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/pr-label-ats.yml b/.github/workflows/pr-label-ats.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/pr-label-conventional-commits.yml b/.github/workflows/pr-label-conventional-commits.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/pr-label-file-based.yml b/.github/workflows/pr-label-file-based.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/pr-label-public.yml b/.github/workflows/pr-label-public.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/pr-release.yml b/.github/workflows/pr-release.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/push-to-private.yml b/.github/workflows/push-to-private.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/python-pull-request.yml b/.github/workflows/python-pull-request.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/readthedocs-pr-update.yml b/.github/workflows/readthedocs-pr-update.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.isort.cfg b/.isort.cfg old mode 100644 new mode 100755 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml old mode 100644 new mode 100755 diff --git a/.release-please-config.json b/.release-please-config.json old mode 100644 new mode 100755 diff --git a/.release-please-manifest.json b/.release-please-manifest.json old mode 100644 new mode 100755 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md old mode 100644 new mode 100755 diff --git a/LICENCES/APPLE_ML_ACKNOWLEDGEMENTS b/LICENCES/APPLE_ML_ACKNOWLEDGEMENTS old mode 100644 new mode 100755 diff --git a/LICENCES/APPLE_ML_ADEMAMIX_LICENSE b/LICENCES/APPLE_ML_ADEMAMIX_LICENSE old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/NOTICE.md b/NOTICE.md old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/graphs/.gitattributes b/graphs/.gitattributes old mode 100644 new mode 100755 diff --git a/graphs/.gitignore b/graphs/.gitignore old mode 100644 new mode 100755 diff --git a/graphs/.readthedocs.yaml b/graphs/.readthedocs.yaml old mode 100644 new mode 100755 diff --git a/graphs/CHANGELOG.md b/graphs/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/graphs/CONTRIBUTORS.md b/graphs/CONTRIBUTORS.md old mode 100644 new mode 100755 diff --git a/graphs/LICENSE b/graphs/LICENSE old mode 100644 new mode 100755 diff --git a/graphs/README.md b/graphs/README.md old mode 100644 new mode 100755 diff --git a/graphs/docs/Makefile b/graphs/docs/Makefile old mode 100644 new mode 100755 diff --git a/graphs/docs/_static/cutoff.jpg b/graphs/docs/_static/cutoff.jpg old mode 100644 new mode 100755 diff --git a/graphs/docs/_static/enc_proc_dec.png b/graphs/docs/_static/enc_proc_dec.png old mode 100644 new mode 100755 diff --git a/graphs/docs/_static/graph_configurations.png b/graphs/docs/_static/graph_configurations.png old mode 100644 new mode 100755 diff --git a/graphs/docs/_static/hetero_data_graph.txt b/graphs/docs/_static/hetero_data_graph.txt old mode 100644 new mode 100755 diff --git a/graphs/docs/_static/logo.png b/graphs/docs/_static/logo.png old mode 100644 new mode 100755 diff --git a/graphs/docs/_static/multi_scale_edges.svg b/graphs/docs/_static/multi_scale_edges.svg old mode 100644 new mode 100755 diff --git a/graphs/docs/_static/processor.html b/graphs/docs/_static/processor.html old mode 100644 new mode 100755 diff --git a/graphs/docs/_static/style.css b/graphs/docs/_static/style.css old mode 100644 new mode 100755 diff --git a/graphs/docs/_static/trinodes.png b/graphs/docs/_static/trinodes.png old mode 100644 new mode 100755 diff --git a/graphs/docs/_templates/.gitkeep b/graphs/docs/_templates/.gitkeep old mode 100644 new mode 100755 diff --git a/graphs/docs/cli/introduction.rst b/graphs/docs/cli/introduction.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/conf.py b/graphs/docs/conf.py old mode 100644 new mode 100755 diff --git a/graphs/docs/contributing.rst b/graphs/docs/contributing.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/edge_attributes.rst b/graphs/docs/graphs/edge_attributes.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/edges.rst b/graphs/docs/graphs/edges.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/edges/cutoff.rst b/graphs/docs/graphs/edges/cutoff.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/edges/knn.rst b/graphs/docs/graphs/edges/knn.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/edges/multi_scale.rst b/graphs/docs/graphs/edges/multi_scale.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/edges/tri_refined_edges.csv b/graphs/docs/graphs/edges/tri_refined_edges.csv old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/introduction.rst b/graphs/docs/graphs/introduction.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_attributes.rst b/graphs/docs/graphs/node_attributes.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_attributes/anemoi_dataset_attribute.rst b/graphs/docs/graphs/node_attributes/anemoi_dataset_attribute.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_attributes/area_masks.rst b/graphs/docs/graphs/node_attributes/area_masks.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_attributes/boolean_operations.rst b/graphs/docs/graphs/node_attributes/boolean_operations.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_attributes/weights.rst b/graphs/docs/graphs/node_attributes/weights.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates.rst b/graphs/docs/graphs/node_coordinates.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/anemoi_dataset.rst b/graphs/docs/graphs/node_coordinates/anemoi_dataset.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/healpix.csv b/graphs/docs/graphs/node_coordinates/healpix.csv old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/healpix.rst b/graphs/docs/graphs/node_coordinates/healpix.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/hex_refined.csv b/graphs/docs/graphs/node_coordinates/hex_refined.csv old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/hex_refined_icosahedron.rst b/graphs/docs/graphs/node_coordinates/hex_refined_icosahedron.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/icon_mesh.rst b/graphs/docs/graphs/node_coordinates/icon_mesh.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/latlon_arrays.rst b/graphs/docs/graphs/node_coordinates/latlon_arrays.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/npz_file.rst b/graphs/docs/graphs/node_coordinates/npz_file.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/reduced_gaussian.rst b/graphs/docs/graphs/node_coordinates/reduced_gaussian.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/text_file.rst b/graphs/docs/graphs/node_coordinates/text_file.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/tri_nodes.csv b/graphs/docs/graphs/node_coordinates/tri_nodes.csv old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/tri_refined_icosahedron.rst b/graphs/docs/graphs/node_coordinates/tri_refined_icosahedron.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/node_coordinates/xarray_file.rst b/graphs/docs/graphs/node_coordinates/xarray_file.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/post_processor.rst b/graphs/docs/graphs/post_processor.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_boolean_operation.yaml b/graphs/docs/graphs/yaml/attributes_boolean_operation.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_cosine_lat_weighted.yaml b/graphs/docs/graphs/yaml/attributes_cosine_lat_weighted.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_custom_area_weights.yaml b/graphs/docs/graphs/yaml/attributes_custom_area_weights.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_cutout.yaml b/graphs/docs/graphs/yaml/attributes_cutout.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_grids.yaml b/graphs/docs/graphs/yaml/attributes_grids.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_isolatitude_area_weights.yaml b/graphs/docs/graphs/yaml/attributes_isolatitude_area_weights.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_lam_mask.yaml b/graphs/docs/graphs/yaml/attributes_lam_mask.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_masked_planar_area_weights.yaml b/graphs/docs/graphs/yaml/attributes_masked_planar_area_weights.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_nonmissingzarr.yaml b/graphs/docs/graphs/yaml/attributes_nonmissingzarr.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_nonzerozarr.yaml b/graphs/docs/graphs/yaml/attributes_nonzerozarr.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_planar_area_weights.yaml b/graphs/docs/graphs/yaml/attributes_planar_area_weights.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_spherical_area_weights.yaml b/graphs/docs/graphs/yaml/attributes_spherical_area_weights.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/graphs/yaml/attributes_uniform_weights.yaml b/graphs/docs/graphs/yaml/attributes_uniform_weights.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/index.rst b/graphs/docs/index.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/installing.rst b/graphs/docs/installing.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/modules/edge_attributes.rst b/graphs/docs/modules/edge_attributes.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/modules/edge_builder.rst b/graphs/docs/modules/edge_builder.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/modules/graph_creator.rst b/graphs/docs/modules/graph_creator.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/modules/graph_inspector.rst b/graphs/docs/modules/graph_inspector.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/modules/node_attributes.rst b/graphs/docs/modules/node_attributes.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/modules/node_builder.rst b/graphs/docs/modules/node_builder.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/modules/post_processor.rst b/graphs/docs/modules/post_processor.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/modules/schemas.rst b/graphs/docs/modules/schemas.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/overview.rst b/graphs/docs/overview.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/create_sparse_matrices.rst b/graphs/docs/usage/create_sparse_matrices.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/getting_started.rst b/graphs/docs/usage/getting_started.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/limited_area.rst b/graphs/docs/usage/limited_area.rst old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/schemas/global.excalidraw b/graphs/docs/usage/schemas/global.excalidraw old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/schemas/global.png b/graphs/docs/usage/schemas/global.png old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/schemas/global_wo-proc.excalidraw b/graphs/docs/usage/schemas/global_wo-proc.excalidraw old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/schemas/global_wo-proc.png b/graphs/docs/usage/schemas/global_wo-proc.png old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/cutout_zarr.yaml b/graphs/docs/usage/yaml/cutout_zarr.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/global.txt b/graphs/docs/usage/yaml/global.txt old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/global.yaml b/graphs/docs/usage/yaml/global.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/global_with-attrs.txt b/graphs/docs/usage/yaml/global_with-attrs.txt old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/global_with-attrs.yaml b/graphs/docs/usage/yaml/global_with-attrs.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/global_wo-proc.png b/graphs/docs/usage/yaml/global_wo-proc.png old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/global_wo-proc.txt b/graphs/docs/usage/yaml/global_wo-proc.txt old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/global_wo-proc.yaml b/graphs/docs/usage/yaml/global_wo-proc.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/lam_nodes_wo_boundary.yaml b/graphs/docs/usage/yaml/lam_nodes_wo_boundary.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/limited_area_nodes.yaml b/graphs/docs/usage/yaml/limited_area_nodes.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/nodes.yaml b/graphs/docs/usage/yaml/nodes.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/nodes_with-attrs.yaml b/graphs/docs/usage/yaml/nodes_with-attrs.yaml old mode 100644 new mode 100755 diff --git a/graphs/docs/usage/yaml/sparse_matrices.yaml b/graphs/docs/usage/yaml/sparse_matrices.yaml old mode 100644 new mode 100755 diff --git a/graphs/pyproject.toml b/graphs/pyproject.toml old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/__init__.py b/graphs/src/anemoi/graphs/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/__main__.py b/graphs/src/anemoi/graphs/__main__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/commands/__init__.py b/graphs/src/anemoi/graphs/commands/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/commands/create.py b/graphs/src/anemoi/graphs/commands/create.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/commands/describe.py b/graphs/src/anemoi/graphs/commands/describe.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/commands/export_to_sparse.py b/graphs/src/anemoi/graphs/commands/export_to_sparse.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/commands/inspect.py b/graphs/src/anemoi/graphs/commands/inspect.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/create.py b/graphs/src/anemoi/graphs/create.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/describe.py b/graphs/src/anemoi/graphs/describe.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/__init__.py b/graphs/src/anemoi/graphs/edges/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/attributes.py b/graphs/src/anemoi/graphs/edges/attributes.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/builders/__init__.py b/graphs/src/anemoi/graphs/edges/builders/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/builders/base.py b/graphs/src/anemoi/graphs/edges/builders/base.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/builders/cutoff.py b/graphs/src/anemoi/graphs/edges/builders/cutoff.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/builders/healpix.py b/graphs/src/anemoi/graphs/edges/builders/healpix.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/builders/icon.py b/graphs/src/anemoi/graphs/edges/builders/icon.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/builders/knn.py b/graphs/src/anemoi/graphs/edges/builders/knn.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/builders/masking.py b/graphs/src/anemoi/graphs/edges/builders/masking.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/builders/multi_scale.py b/graphs/src/anemoi/graphs/edges/builders/multi_scale.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/edges/directional.py b/graphs/src/anemoi/graphs/edges/directional.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/export.py b/graphs/src/anemoi/graphs/export.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/generate/__init__.py b/graphs/src/anemoi/graphs/generate/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/generate/healpix.py b/graphs/src/anemoi/graphs/generate/healpix.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/generate/hex_icosahedron.py b/graphs/src/anemoi/graphs/generate/hex_icosahedron.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/generate/icon_mesh.py b/graphs/src/anemoi/graphs/generate/icon_mesh.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/generate/masks.py b/graphs/src/anemoi/graphs/generate/masks.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/generate/multi_scale_edges.py b/graphs/src/anemoi/graphs/generate/multi_scale_edges.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/generate/transforms.py b/graphs/src/anemoi/graphs/generate/transforms.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/generate/tri_icosahedron.py b/graphs/src/anemoi/graphs/generate/tri_icosahedron.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/generate/utils.py b/graphs/src/anemoi/graphs/generate/utils.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/inspect.py b/graphs/src/anemoi/graphs/inspect.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/__init__.py b/graphs/src/anemoi/graphs/nodes/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/attributes/__init__.py b/graphs/src/anemoi/graphs/nodes/attributes/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/attributes/area_weights.py b/graphs/src/anemoi/graphs/nodes/attributes/area_weights.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/attributes/base_attributes.py b/graphs/src/anemoi/graphs/nodes/attributes/base_attributes.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/attributes/boolean_op.py b/graphs/src/anemoi/graphs/nodes/attributes/boolean_op.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/attributes/masks.py b/graphs/src/anemoi/graphs/nodes/attributes/masks.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/builders/__init__.py b/graphs/src/anemoi/graphs/nodes/builders/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/builders/base.py b/graphs/src/anemoi/graphs/nodes/builders/base.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_file.py b/graphs/src/anemoi/graphs/nodes/builders/from_file.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_healpix.py b/graphs/src/anemoi/graphs/nodes/builders/from_healpix.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_icon.py b/graphs/src/anemoi/graphs/nodes/builders/from_icon.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_reduced_gaussian.py b/graphs/src/anemoi/graphs/nodes/builders/from_reduced_gaussian.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_refined_icosahedron.py b/graphs/src/anemoi/graphs/nodes/builders/from_refined_icosahedron.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_vectors.py b/graphs/src/anemoi/graphs/nodes/builders/from_vectors.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/normalise.py b/graphs/src/anemoi/graphs/normalise.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/plotting/__init__.py b/graphs/src/anemoi/graphs/plotting/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/plotting/displots.py b/graphs/src/anemoi/graphs/plotting/displots.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/plotting/interactive_2d_html.py b/graphs/src/anemoi/graphs/plotting/interactive_2d_html.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/plotting/interactive_3d.html.jinja b/graphs/src/anemoi/graphs/plotting/interactive_3d.html.jinja old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/plotting/interactive_3d_html.py b/graphs/src/anemoi/graphs/plotting/interactive_3d_html.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/plotting/prepare.py b/graphs/src/anemoi/graphs/plotting/prepare.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/processors/__init__.py b/graphs/src/anemoi/graphs/processors/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/processors/post_process.py b/graphs/src/anemoi/graphs/processors/post_process.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/schemas/__init__.py b/graphs/src/anemoi/graphs/schemas/__init__.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/schemas/base_graph.py b/graphs/src/anemoi/graphs/schemas/base_graph.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/schemas/edge_attributes_schemas.py b/graphs/src/anemoi/graphs/schemas/edge_attributes_schemas.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/schemas/edge_schemas.py b/graphs/src/anemoi/graphs/schemas/edge_schemas.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/schemas/node_attributes_schemas.py b/graphs/src/anemoi/graphs/schemas/node_attributes_schemas.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/schemas/node_schemas.py b/graphs/src/anemoi/graphs/schemas/node_schemas.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/schemas/normalise.py b/graphs/src/anemoi/graphs/schemas/normalise.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/schemas/post_processors.py b/graphs/src/anemoi/graphs/schemas/post_processors.py old mode 100644 new mode 100755 diff --git a/graphs/src/anemoi/graphs/utils.py b/graphs/src/anemoi/graphs/utils.py old mode 100644 new mode 100755 diff --git a/graphs/tests/conftest.py b/graphs/tests/conftest.py old mode 100644 new mode 100755 diff --git a/graphs/tests/edges/test_cutoff.py b/graphs/tests/edges/test_cutoff.py old mode 100644 new mode 100755 diff --git a/graphs/tests/edges/test_direction.py b/graphs/tests/edges/test_direction.py old mode 100644 new mode 100755 diff --git a/graphs/tests/edges/test_edge_attributes.py b/graphs/tests/edges/test_edge_attributes.py old mode 100644 new mode 100755 diff --git a/graphs/tests/edges/test_healpix_multiscale.py b/graphs/tests/edges/test_healpix_multiscale.py old mode 100644 new mode 100755 diff --git a/graphs/tests/edges/test_icon_edges.py b/graphs/tests/edges/test_icon_edges.py old mode 100644 new mode 100755 diff --git a/graphs/tests/edges/test_knn.py b/graphs/tests/edges/test_knn.py old mode 100644 new mode 100755 diff --git a/graphs/tests/edges/test_multiscale_edges.py b/graphs/tests/edges/test_multiscale_edges.py old mode 100644 new mode 100755 diff --git a/graphs/tests/generate/test_mask_builder.py b/graphs/tests/generate/test_mask_builder.py old mode 100644 new mode 100755 diff --git a/graphs/tests/generate/test_transforms.py b/graphs/tests/generate/test_transforms.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/attributes/test_base.py b/graphs/tests/nodes/attributes/test_base.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/attributes/test_boolean_operations.py b/graphs/tests/nodes/attributes/test_boolean_operations.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/attributes/test_masks.py b/graphs/tests/nodes/attributes/test_masks.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/attributes/test_weights.py b/graphs/tests/nodes/attributes/test_weights.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/test_anemoi_dataset.py b/graphs/tests/nodes/test_anemoi_dataset.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/test_arrays.py b/graphs/tests/nodes/test_arrays.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/test_cutout_nodes.py b/graphs/tests/nodes/test_cutout_nodes.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/test_from_xarray.py b/graphs/tests/nodes/test_from_xarray.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/test_healpix.py b/graphs/tests/nodes/test_healpix.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/test_hex_nodes.py b/graphs/tests/nodes/test_hex_nodes.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/test_icon_nodes.py b/graphs/tests/nodes/test_icon_nodes.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/test_npz.py b/graphs/tests/nodes/test_npz.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/test_reduced_gaussian.py b/graphs/tests/nodes/test_reduced_gaussian.py old mode 100644 new mode 100755 diff --git a/graphs/tests/nodes/test_tri_nodes.py b/graphs/tests/nodes/test_tri_nodes.py old mode 100644 new mode 100755 diff --git a/graphs/tests/processors/test_post_process.py b/graphs/tests/processors/test_post_process.py old mode 100644 new mode 100755 diff --git a/graphs/tests/test_create.py b/graphs/tests/test_create.py old mode 100644 new mode 100755 diff --git a/graphs/tests/test_normaliser.py b/graphs/tests/test_normaliser.py old mode 100644 new mode 100755 diff --git a/graphs/tests/test_utils.py b/graphs/tests/test_utils.py old mode 100644 new mode 100755 diff --git a/models/.gitattributes b/models/.gitattributes old mode 100644 new mode 100755 diff --git a/models/.gitignore b/models/.gitignore old mode 100644 new mode 100755 diff --git a/models/.readthedocs.yaml b/models/.readthedocs.yaml old mode 100644 new mode 100755 diff --git a/models/CHANGELOG.md b/models/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/models/CONTRIBUTORS.md b/models/CONTRIBUTORS.md old mode 100644 new mode 100755 diff --git a/models/LICENSE b/models/LICENSE old mode 100644 new mode 100755 diff --git a/models/README.md b/models/README.md old mode 100644 new mode 100755 diff --git a/models/docs/Makefile b/models/docs/Makefile old mode 100644 new mode 100755 diff --git a/models/docs/_static/anemoi-models_schematic.drawio b/models/docs/_static/anemoi-models_schematic.drawio old mode 100644 new mode 100755 diff --git a/models/docs/_static/anemoi-models_schematic.png b/models/docs/_static/anemoi-models_schematic.png old mode 100644 new mode 100755 diff --git a/models/docs/_static/data_indices.drawio b/models/docs/_static/data_indices.drawio old mode 100644 new mode 100755 diff --git a/models/docs/_static/data_indices.png b/models/docs/_static/data_indices.png old mode 100644 new mode 100755 diff --git a/models/docs/_static/logo.png b/models/docs/_static/logo.png old mode 100644 new mode 100755 diff --git a/models/docs/_static/preprocessing_remapper_atanh.png b/models/docs/_static/preprocessing_remapper_atanh.png old mode 100644 new mode 100755 diff --git a/models/docs/_static/preprocessing_remapper_boxcox.png b/models/docs/_static/preprocessing_remapper_boxcox.png old mode 100644 new mode 100755 diff --git a/models/docs/_static/preprocessing_remapper_power.png b/models/docs/_static/preprocessing_remapper_power.png old mode 100644 new mode 100755 diff --git a/models/docs/_static/style.css b/models/docs/_static/style.css old mode 100644 new mode 100755 diff --git a/models/docs/_templates/.gitkeep b/models/docs/_templates/.gitkeep old mode 100644 new mode 100755 diff --git a/models/docs/cli/migration.rst b/models/docs/cli/migration.rst old mode 100644 new mode 100755 diff --git a/models/docs/conf.py b/models/docs/conf.py old mode 100644 new mode 100755 diff --git a/models/docs/contributing.rst b/models/docs/contributing.rst old mode 100644 new mode 100755 diff --git a/models/docs/create-migrations.rst b/models/docs/create-migrations.rst old mode 100644 new mode 100755 diff --git a/models/docs/index.rst b/models/docs/index.rst old mode 100644 new mode 100755 diff --git a/models/docs/introduction/installing.rst b/models/docs/introduction/installing.rst old mode 100644 new mode 100755 diff --git a/models/docs/introduction/overview.rst b/models/docs/introduction/overview.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/activations.rst b/models/docs/modules/activations.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/data_indices.rst b/models/docs/modules/data_indices.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/distributed.rst b/models/docs/modules/distributed.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/interface.rst b/models/docs/modules/interface.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/layers.rst b/models/docs/modules/layers.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/migrations.rst b/models/docs/modules/migrations.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/models.rst b/models/docs/modules/models.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/normalization.rst b/models/docs/modules/normalization.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/preprocessing.rst b/models/docs/modules/preprocessing.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/residual.rst b/models/docs/modules/residual.rst old mode 100644 new mode 100755 diff --git a/models/docs/modules/schemas.rst b/models/docs/modules/schemas.rst old mode 100644 new mode 100755 diff --git a/models/docs/usage/create_model.rst b/models/docs/usage/create_model.rst old mode 100644 new mode 100755 diff --git a/models/pyproject.toml b/models/pyproject.toml old mode 100644 new mode 100755 diff --git a/models/pytest.ini b/models/pytest.ini old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/__init__.py b/models/src/anemoi/models/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/__main__.py b/models/src/anemoi/models/__main__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/commands/__init__.py b/models/src/anemoi/models/commands/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/commands/hello.py b/models/src/anemoi/models/commands/hello.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/commands/migration.py b/models/src/anemoi/models/commands/migration.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/data_indices/__init__.py b/models/src/anemoi/models/data_indices/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/data_indices/collection.py b/models/src/anemoi/models/data_indices/collection.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/data_indices/index.py b/models/src/anemoi/models/data_indices/index.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/data_indices/tensor.py b/models/src/anemoi/models/data_indices/tensor.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/distributed/__init__.py b/models/src/anemoi/models/distributed/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/distributed/balanced_partition.py b/models/src/anemoi/models/distributed/balanced_partition.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/distributed/graph.py b/models/src/anemoi/models/distributed/graph.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/distributed/khop_edges.py b/models/src/anemoi/models/distributed/khop_edges.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/distributed/primitives.py b/models/src/anemoi/models/distributed/primitives.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/distributed/shapes.py b/models/src/anemoi/models/distributed/shapes.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/distributed/transformer.py b/models/src/anemoi/models/distributed/transformer.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/distributed/utils.py b/models/src/anemoi/models/distributed/utils.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/interface/__init__.py b/models/src/anemoi/models/interface/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/__init__.py b/models/src/anemoi/models/layers/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/activations.py b/models/src/anemoi/models/layers/activations.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/attention.py b/models/src/anemoi/models/layers/attention.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/block.py b/models/src/anemoi/models/layers/block.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/bounding.py b/models/src/anemoi/models/layers/bounding.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/conv.py b/models/src/anemoi/models/layers/conv.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/diffusion.py b/models/src/anemoi/models/layers/diffusion.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/ensemble.py b/models/src/anemoi/models/layers/ensemble.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/graph.py b/models/src/anemoi/models/layers/graph.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/graph_provider.py b/models/src/anemoi/models/layers/graph_provider.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/mapper.py b/models/src/anemoi/models/layers/mapper.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/mlp.py b/models/src/anemoi/models/layers/mlp.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/normalization.py b/models/src/anemoi/models/layers/normalization.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/processor.py b/models/src/anemoi/models/layers/processor.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/residual.py b/models/src/anemoi/models/layers/residual.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/sparse_projector.py b/models/src/anemoi/models/layers/sparse_projector.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/spectral_helpers.py b/models/src/anemoi/models/layers/spectral_helpers.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/spectral_transforms.py b/models/src/anemoi/models/layers/spectral_transforms.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/layers/utils.py b/models/src/anemoi/models/layers/utils.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/__init__.py b/models/src/anemoi/models/migrations/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/migrator.py b/models/src/anemoi/models/migrations/migrator.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/scripts/1755530253_initial.py b/models/src/anemoi/models/migrations/scripts/1755530253_initial.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/scripts/1762857427_deprecate_eda.py b/models/src/anemoi/models/migrations/scripts/1762857427_deprecate_eda.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/scripts/1762857428_chunking_fix.py b/models/src/anemoi/models/migrations/scripts/1762857428_chunking_fix.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/scripts/1763479917_hardware_schema_update.py b/models/src/anemoi/models/migrations/scripts/1763479917_hardware_schema_update.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/scripts/1763479918_refactor_mapper.py b/models/src/anemoi/models/migrations/scripts/1763479918_refactor_mapper.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/scripts/1767108147_move_to_multiple_datasets.py b/models/src/anemoi/models/migrations/scripts/1767108147_move_to_multiple_datasets.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/scripts/1773048851_fuse_multiple_perdataset_graphs.py b/models/src/anemoi/models/migrations/scripts/1773048851_fuse_multiple_perdataset_graphs.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/scripts/1776237003_rename_swa_to_weight_averaging.py b/models/src/anemoi/models/migrations/scripts/1776237003_rename_swa_to_weight_averaging.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/migrations/setup_context.py b/models/src/anemoi/models/migrations/setup_context.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/models/__init__.py b/models/src/anemoi/models/models/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/models/autoencoder.py b/models/src/anemoi/models/models/autoencoder.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/models/base.py b/models/src/anemoi/models/models/base.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/models/diffusion_encoder_processor_decoder.py b/models/src/anemoi/models/models/diffusion_encoder_processor_decoder.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/models/encoder_processor_decoder.py b/models/src/anemoi/models/models/encoder_processor_decoder.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/models/ens_encoder_processor_decoder.py b/models/src/anemoi/models/models/ens_encoder_processor_decoder.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/models/hierarchical.py b/models/src/anemoi/models/models/hierarchical.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/models/hierarchical_autoencoder.py b/models/src/anemoi/models/models/hierarchical_autoencoder.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/preprocessing/__init__.py b/models/src/anemoi/models/preprocessing/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/preprocessing/imputer.py b/models/src/anemoi/models/preprocessing/imputer.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/preprocessing/mappings.py b/models/src/anemoi/models/preprocessing/mappings.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/preprocessing/normalizer.py b/models/src/anemoi/models/preprocessing/normalizer.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/preprocessing/postprocessor.py b/models/src/anemoi/models/preprocessing/postprocessor.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/preprocessing/remapper.py b/models/src/anemoi/models/preprocessing/remapper.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/samplers/__init__.py b/models/src/anemoi/models/samplers/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/samplers/diffusion_samplers.py b/models/src/anemoi/models/samplers/diffusion_samplers.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/schemas/__init__.py b/models/src/anemoi/models/schemas/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/schemas/common_components.py b/models/src/anemoi/models/schemas/common_components.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/schemas/data_processor.py b/models/src/anemoi/models/schemas/data_processor.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/schemas/decoder.py b/models/src/anemoi/models/schemas/decoder.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/schemas/encoder.py b/models/src/anemoi/models/schemas/encoder.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/schemas/models.py b/models/src/anemoi/models/schemas/models.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/schemas/processor.py b/models/src/anemoi/models/schemas/processor.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/schemas/residual.py b/models/src/anemoi/models/schemas/residual.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/triton/gt.py b/models/src/anemoi/models/triton/gt.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/triton/utils.py b/models/src/anemoi/models/triton/utils.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/utils/__init__.py b/models/src/anemoi/models/utils/__init__.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/utils/compile.py b/models/src/anemoi/models/utils/compile.py old mode 100644 new mode 100755 diff --git a/models/src/anemoi/models/utils/config.py b/models/src/anemoi/models/utils/config.py old mode 100644 new mode 100755 diff --git a/models/tests/conftest.py b/models/tests/conftest.py old mode 100644 new mode 100755 diff --git a/models/tests/data_indices/test_collection.py b/models/tests/data_indices/test_collection.py old mode 100644 new mode 100755 diff --git a/models/tests/data_indices/test_data_indices.py b/models/tests/data_indices/test_data_indices.py old mode 100644 new mode 100755 diff --git a/models/tests/distributed/balanced_partition.py b/models/tests/distributed/balanced_partition.py old mode 100644 new mode 100755 diff --git a/models/tests/integration/triton/test_triton_gt.py b/models/tests/integration/triton/test_triton_gt.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/block/test_block_graphconv.py b/models/tests/layers/block/test_block_graphconv.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/block/test_block_graphtransformer.py b/models/tests/layers/block/test_block_graphtransformer.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/block/test_block_pointwise.py b/models/tests/layers/block/test_block_pointwise.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/block/test_block_transformer.py b/models/tests/layers/block/test_block_transformer.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/block/test_block_transformermapper.py b/models/tests/layers/block/test_block_transformermapper.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/mapper/test_base_mapper.py b/models/tests/layers/mapper/test_base_mapper.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/mapper/test_graphconv_mapper.py b/models/tests/layers/mapper/test_graphconv_mapper.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/mapper/test_graphtransformer_mapper.py b/models/tests/layers/mapper/test_graphtransformer_mapper.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/mapper/test_pointwise_mapper.py b/models/tests/layers/mapper/test_pointwise_mapper.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/mapper/test_transformer_mapper.py b/models/tests/layers/mapper/test_transformer_mapper.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/processor/test_base_processor.py b/models/tests/layers/processor/test_base_processor.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/processor/test_graphconv_processor.py b/models/tests/layers/processor/test_graphconv_processor.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/processor/test_graphtransformer_processor.py b/models/tests/layers/processor/test_graphtransformer_processor.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/processor/test_pointwise_processor.py b/models/tests/layers/processor/test_pointwise_processor.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/processor/test_transformer_processor.py b/models/tests/layers/processor/test_transformer_processor.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/test_activations.py b/models/tests/layers/test_activations.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/test_attention.py b/models/tests/layers/test_attention.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/test_bounding.py b/models/tests/layers/test_bounding.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/test_grad_checkpoint_wiring.py b/models/tests/layers/test_grad_checkpoint_wiring.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/test_graph.py b/models/tests/layers/test_graph.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/test_layer_utils.py b/models/tests/layers/test_layer_utils.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/test_mlp.py b/models/tests/layers/test_mlp.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/test_noise_embeddings.py b/models/tests/layers/test_noise_embeddings.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/test_residual.py b/models/tests/layers/test_residual.py old mode 100644 new mode 100755 diff --git a/models/tests/layers/test_sht.py b/models/tests/layers/test_sht.py old mode 100644 new mode 100755 diff --git a/models/tests/migrations/conftest.py b/models/tests/migrations/conftest.py old mode 100644 new mode 100755 diff --git a/models/tests/migrations/migrations/1750840837_add_foo.py b/models/tests/migrations/migrations/1750840837_add_foo.py old mode 100644 new mode 100755 diff --git a/models/tests/migrations/migrations/1750841219_add_bar.py b/models/tests/migrations/migrations/1750841219_add_bar.py old mode 100644 new mode 100755 diff --git a/models/tests/migrations/migrations/1750859824_add_baz.py b/models/tests/migrations/migrations/1750859824_add_baz.py old mode 100644 new mode 100755 diff --git a/models/tests/migrations/migrations/1750859905_rename_baz.py b/models/tests/migrations/migrations/1750859905_rename_baz.py old mode 100644 new mode 100755 diff --git a/models/tests/migrations/migrations/1751895180_final.py b/models/tests/migrations/migrations/1751895180_final.py old mode 100644 new mode 100755 diff --git a/models/tests/migrations/migrations/1751895203_recent.py b/models/tests/migrations/migrations/1751895203_recent.py old mode 100644 new mode 100755 diff --git a/models/tests/migrations/test_migration_order.py b/models/tests/migrations/test_migration_order.py old mode 100644 new mode 100755 diff --git a/models/tests/migrations/test_migrations.py b/models/tests/migrations/test_migrations.py old mode 100644 new mode 100755 diff --git a/models/tests/models/test_diffusion_sampling_pipeline.py b/models/tests/models/test_diffusion_sampling_pipeline.py old mode 100644 new mode 100755 diff --git a/models/tests/models/test_diffusion_tendency.py b/models/tests/models/test_diffusion_tendency.py old mode 100644 new mode 100755 diff --git a/models/tests/models/test_models.py b/models/tests/models/test_models.py old mode 100644 new mode 100755 diff --git a/models/tests/preprocessing/test_mappings.py b/models/tests/preprocessing/test_mappings.py old mode 100644 new mode 100755 diff --git a/models/tests/preprocessing/test_postprocessor.py b/models/tests/preprocessing/test_postprocessor.py old mode 100644 new mode 100755 diff --git a/models/tests/preprocessing/test_preprocessor_imputer.py b/models/tests/preprocessing/test_preprocessor_imputer.py old mode 100644 new mode 100755 diff --git a/models/tests/preprocessing/test_preprocessor_normalizer.py b/models/tests/preprocessing/test_preprocessor_normalizer.py old mode 100644 new mode 100755 diff --git a/models/tests/preprocessing/test_preprocessor_remapper.py b/models/tests/preprocessing/test_preprocessor_remapper.py old mode 100644 new mode 100755 diff --git a/models/tests/preprocessing/test_stepwise_processors.py b/models/tests/preprocessing/test_stepwise_processors.py old mode 100644 new mode 100755 diff --git a/models/tests/samplers/test_diffusion_samplers.py b/models/tests/samplers/test_diffusion_samplers.py old mode 100644 new mode 100755 diff --git a/models/tests/schemas/test_data_processors_schemas.py b/models/tests/schemas/test_data_processors_schemas.py old mode 100644 new mode 100755 diff --git a/models/tests/schemas/test_model_schemas_pointwise_mappers.py b/models/tests/schemas/test_model_schemas_pointwise_mappers.py old mode 100644 new mode 100755 diff --git a/models/tests/utils/test_compile.py b/models/tests/utils/test_compile.py old mode 100644 new mode 100755 diff --git a/training/.gitattributes b/training/.gitattributes old mode 100644 new mode 100755 diff --git a/training/.gitignore b/training/.gitignore old mode 100644 new mode 100755 diff --git a/training/.readthedocs.yaml b/training/.readthedocs.yaml old mode 100644 new mode 100755 diff --git a/training/CHANGELOG.md b/training/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/training/CONTRIBUTORS.md b/training/CONTRIBUTORS.md old mode 100644 new mode 100755 diff --git a/training/LICENSE b/training/LICENSE old mode 100644 new mode 100755 diff --git a/training/README.md b/training/README.md old mode 100644 new mode 100755 diff --git a/training/docs/Makefile b/training/docs/Makefile old mode 100644 new mode 100755 diff --git a/training/docs/_static/logo.png b/training/docs/_static/logo.png old mode 100644 new mode 100755 diff --git a/training/docs/_static/style.css b/training/docs/_static/style.css old mode 100644 new mode 100755 diff --git a/training/docs/_templates/.gitkeep b/training/docs/_templates/.gitkeep old mode 100644 new mode 100755 diff --git a/training/docs/adrs/adr-001.md b/training/docs/adrs/adr-001.md old mode 100644 new mode 100755 diff --git a/training/docs/adrs/adr-002.md b/training/docs/adrs/adr-002.md old mode 100644 new mode 100755 diff --git a/training/docs/adrs/template.md b/training/docs/adrs/template.md old mode 100644 new mode 100755 diff --git a/training/docs/checkpoint_integration.rst b/training/docs/checkpoint_integration.rst old mode 100644 new mode 100755 diff --git a/training/docs/checkpoint_pipeline_configuration.rst b/training/docs/checkpoint_pipeline_configuration.rst old mode 100644 new mode 100755 diff --git a/training/docs/checkpoint_troubleshooting.rst b/training/docs/checkpoint_troubleshooting.rst old mode 100644 new mode 100755 diff --git a/training/docs/conf.py b/training/docs/conf.py old mode 100644 new mode 100755 diff --git a/training/docs/contributing.rst b/training/docs/contributing.rst old mode 100644 new mode 100755 diff --git a/training/docs/images/global-sliding-window-attention.png b/training/docs/images/global-sliding-window-attention.png old mode 100644 new mode 100755 diff --git a/training/docs/images/gnn-encoder-decoder-multimesh.jpg b/training/docs/images/gnn-encoder-decoder-multimesh.jpg old mode 100644 new mode 100755 diff --git a/training/docs/images/mlflow/mlflow_compare.png b/training/docs/images/mlflow/mlflow_compare.png old mode 100644 new mode 100755 diff --git a/training/docs/images/mlflow/mlflow_constant.png b/training/docs/images/mlflow/mlflow_constant.png old mode 100644 new mode 100755 diff --git a/training/docs/images/mlflow/mlflow_resumed_run.png b/training/docs/images/mlflow/mlflow_resumed_run.png old mode 100644 new mode 100755 diff --git a/training/docs/images/mlflow/mlflow_run.png b/training/docs/images/mlflow/mlflow_run.png old mode 100644 new mode 100755 diff --git a/training/docs/images/mlflow/mlflow_server.png b/training/docs/images/mlflow/mlflow_server.png old mode 100644 new mode 100755 diff --git a/training/docs/images/model_sharding.png b/training/docs/images/model_sharding.png old mode 100644 new mode 100755 diff --git a/training/docs/images/multi-dataset/downscaling-multi.png b/training/docs/images/multi-dataset/downscaling-multi.png old mode 100644 new mode 100755 diff --git a/training/docs/images/multi-dataset/lam-multi.png b/training/docs/images/multi-dataset/lam-multi.png old mode 100644 new mode 100755 diff --git a/training/docs/images/multi-dataset/prog-forc-diag.png b/training/docs/images/multi-dataset/prog-forc-diag.png old mode 100644 new mode 100755 diff --git a/training/docs/images/performance-guide/mem-snapshot-1-mapper-chunk.png b/training/docs/images/performance-guide/mem-snapshot-1-mapper-chunk.png old mode 100644 new mode 100755 diff --git a/training/docs/images/performance-guide/mem-snapshot-4-mapper-chunks.png b/training/docs/images/performance-guide/mem-snapshot-4-mapper-chunks.png old mode 100644 new mode 100755 diff --git a/training/docs/images/performance-guide/performance-flowchart.png b/training/docs/images/performance-guide/performance-flowchart.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_architecture.png b/training/docs/images/profiler/anemoi_profiler_architecture.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_benchmark_profiler.png b/training/docs/images/profiler/anemoi_profiler_benchmark_profiler.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_config.png b/training/docs/images/profiler/anemoi_profiler_config.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_high_level.png b/training/docs/images/profiler/anemoi_profiler_high_level.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_mlflow_integration.png b/training/docs/images/profiler/anemoi_profiler_mlflow_integration.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_mlflow_integration_2.png b/training/docs/images/profiler/anemoi_profiler_mlflow_integration_2.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_mlflow_integration_3.png b/training/docs/images/profiler/anemoi_profiler_mlflow_integration_3.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_speed_report.png b/training/docs/images/profiler/anemoi_profiler_speed_report.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_speedreport_diagram.png b/training/docs/images/profiler/anemoi_profiler_speedreport_diagram.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_training_rates.png b/training/docs/images/profiler/anemoi_profiler_training_rates.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/anemoi_profiler_validation_rates.png b/training/docs/images/profiler/anemoi_profiler_validation_rates.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/example_memory_report.png b/training/docs/images/profiler/example_memory_report.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/example_memory_timeline.png b/training/docs/images/profiler/example_memory_timeline.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/example_model_summary.png b/training/docs/images/profiler/example_model_summary.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/example_model_summary_2.png b/training/docs/images/profiler/example_model_summary_2.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/example_system_report.png b/training/docs/images/profiler/example_system_report.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/example_time_report.png b/training/docs/images/profiler/example_time_report.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/idle_time_breakdown.png b/training/docs/images/profiler/idle_time_breakdown.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/kernel_breakdown_dfs.png b/training/docs/images/profiler/kernel_breakdown_dfs.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/kernel_breakdown_plots.png b/training/docs/images/profiler/kernel_breakdown_plots.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/memory_snapshot_diagram.png b/training/docs/images/profiler/memory_snapshot_diagram.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/memory_snapshot_output.png b/training/docs/images/profiler/memory_snapshot_output.png old mode 100644 new mode 100755 diff --git a/training/docs/images/profiler/temporal_breakdown.png b/training/docs/images/profiler/temporal_breakdown.png old mode 100644 new mode 100755 diff --git a/training/docs/images/transformer-block.png b/training/docs/images/transformer-block.png old mode 100644 new mode 100755 diff --git a/training/docs/index.rst b/training/docs/index.rst old mode 100644 new mode 100755 diff --git a/training/docs/introduction/installing.rst b/training/docs/introduction/installing.rst old mode 100644 new mode 100755 diff --git a/training/docs/introduction/overview.rst b/training/docs/introduction/overview.rst old mode 100644 new mode 100755 diff --git a/training/docs/modules/data.rst b/training/docs/modules/data.rst old mode 100644 new mode 100755 diff --git a/training/docs/modules/diagnostics.rst b/training/docs/modules/diagnostics.rst old mode 100644 new mode 100755 diff --git a/training/docs/modules/losses.rst b/training/docs/modules/losses.rst old mode 100644 new mode 100755 diff --git a/training/docs/modules/optimization.rst b/training/docs/modules/optimization.rst old mode 100644 new mode 100755 diff --git a/training/docs/modules/schemas.rst b/training/docs/modules/schemas.rst old mode 100644 new mode 100755 diff --git a/training/docs/modules/strategy.rst b/training/docs/modules/strategy.rst old mode 100644 new mode 100755 diff --git a/training/docs/modules/tasks.rst b/training/docs/modules/tasks.rst old mode 100644 new mode 100755 diff --git a/training/docs/modules/train.rst b/training/docs/modules/train.rst old mode 100644 new mode 100755 diff --git a/training/docs/troubleshooting.rst b/training/docs/troubleshooting.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/basic-set-up.rst b/training/docs/user-guide/basic-set-up.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/benchmarking.rst b/training/docs/user-guide/benchmarking.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/configuring.rst b/training/docs/user-guide/configuring.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/distributed.rst b/training/docs/user-guide/distributed.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/download-era5-o96.rst b/training/docs/user-guide/download-era5-o96.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/hydra-intro.rst b/training/docs/user-guide/hydra-intro.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/models.rst b/training/docs/user-guide/models.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/multi-datasets.rst b/training/docs/user-guide/multi-datasets.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/overview.rst b/training/docs/user-guide/overview.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/performance-optimisation.rst b/training/docs/user-guide/performance-optimisation.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/tasks.rst b/training/docs/user-guide/tasks.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/tracking.rst b/training/docs/user-guide/tracking.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/training-methods.rst b/training/docs/user-guide/training-methods.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/training.rst b/training/docs/user-guide/training.rst old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/yaml/dataloader.yaml b/training/docs/user-guide/yaml/dataloader.yaml old mode 100644 new mode 100755 diff --git a/training/docs/user-guide/yaml/example_crps_config.yaml b/training/docs/user-guide/yaml/example_crps_config.yaml old mode 100644 new mode 100755 diff --git a/training/pyproject.toml b/training/pyproject.toml old mode 100644 new mode 100755 diff --git a/training/pytest.ini b/training/pytest.ini old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/__init__.py b/training/src/anemoi/training/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/__main__.py b/training/src/anemoi/training/__main__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/checkpoint/__init__.py b/training/src/anemoi/training/checkpoint/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/checkpoint/base.py b/training/src/anemoi/training/checkpoint/base.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/checkpoint/catalog.py b/training/src/anemoi/training/checkpoint/catalog.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/checkpoint/exceptions.py b/training/src/anemoi/training/checkpoint/exceptions.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/checkpoint/formats.py b/training/src/anemoi/training/checkpoint/formats.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/checkpoint/pipeline.py b/training/src/anemoi/training/checkpoint/pipeline.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/checkpoint/utils.py b/training/src/anemoi/training/checkpoint/utils.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/commands/__init__.py b/training/src/anemoi/training/commands/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/commands/checkpoint.py b/training/src/anemoi/training/commands/checkpoint.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/commands/config.py b/training/src/anemoi/training/commands/config.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/commands/mlflow.py b/training/src/anemoi/training/commands/mlflow.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/commands/profiler.py b/training/src/anemoi/training/commands/profiler.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/commands/train.py b/training/src/anemoi/training/commands/train.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/__init__.py b/training/src/anemoi/training/config/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/autoencoder.yaml b/training/src/anemoi/training/config/autoencoder.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/config.yaml b/training/src/anemoi/training/config/config.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/data/multi.yaml b/training/src/anemoi/training/config/data/multi.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/data/zarr.yaml b/training/src/anemoi/training/config/data/zarr.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/dataloader/multi.yaml b/training/src/anemoi/training/config/dataloader/multi.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/dataloader/native_grid.yaml b/training/src/anemoi/training/config/dataloader/native_grid.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/benchmark_profiler/detailed.yaml b/training/src/anemoi/training/config/diagnostics/benchmark_profiler/detailed.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/benchmark_profiler/simple.yaml b/training/src/anemoi/training/config/diagnostics/benchmark_profiler/simple.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/callbacks/placeholder.yaml b/training/src/anemoi/training/config/diagnostics/callbacks/placeholder.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/callbacks/rollout_eval.yaml b/training/src/anemoi/training/config/diagnostics/callbacks/rollout_eval.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/evaluation.yaml b/training/src/anemoi/training/config/diagnostics/evaluation.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/evaluation_ens.yaml b/training/src/anemoi/training/config/diagnostics/evaluation_ens.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/evaluation_multi.yaml b/training/src/anemoi/training/config/diagnostics/evaluation_multi.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/log/mlflow.yaml b/training/src/anemoi/training/config/diagnostics/log/mlflow.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/log/wandb.yaml b/training/src/anemoi/training/config/diagnostics/log/wandb.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/plot/detailed.yaml b/training/src/anemoi/training/config/diagnostics/plot/detailed.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/plot/multi.yaml b/training/src/anemoi/training/config/diagnostics/plot/multi.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diagnostics/plot/simple.yaml b/training/src/anemoi/training/config/diagnostics/plot/simple.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/diffusion.yaml b/training/src/anemoi/training/config/diffusion.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/ensemble_crps.yaml b/training/src/anemoi/training/config/ensemble_crps.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/graph/encoder_decoder_only.yaml b/training/src/anemoi/training/config/graph/encoder_decoder_only.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/graph/existing.yaml b/training/src/anemoi/training/config/graph/existing.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/graph/hierarchical_2level.yaml b/training/src/anemoi/training/config/graph/hierarchical_2level.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/graph/hierarchical_2level_encoder_decoder_only.yaml b/training/src/anemoi/training/config/graph/hierarchical_2level_encoder_decoder_only.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/graph/hierarchical_3level.yaml b/training/src/anemoi/training/config/graph/hierarchical_3level.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/graph/limited_area.yaml b/training/src/anemoi/training/config/graph/limited_area.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/graph/multi.yaml b/training/src/anemoi/training/config/graph/multi.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/graph/multi_scale.yaml b/training/src/anemoi/training/config/graph/multi_scale.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/graph/point_wise.yaml b/training/src/anemoi/training/config/graph/point_wise.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/graph/stretched_grid.yaml b/training/src/anemoi/training/config/graph/stretched_grid.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/hierarchical.yaml b/training/src/anemoi/training/config/hierarchical.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/hierarchical_autoencoder.yaml b/training/src/anemoi/training/config/hierarchical_autoencoder.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/lam.yaml b/training/src/anemoi/training/config/lam.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/gnn.yaml b/training/src/anemoi/training/config/model/gnn.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/graphtransformer.yaml b/training/src/anemoi/training/config/model/graphtransformer.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/graphtransformer_diffusion.yaml b/training/src/anemoi/training/config/model/graphtransformer_diffusion.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/graphtransformer_diffusiontend.yaml b/training/src/anemoi/training/config/model/graphtransformer_diffusiontend.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/graphtransformer_ens.yaml b/training/src/anemoi/training/config/model/graphtransformer_ens.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/point_wise.yaml b/training/src/anemoi/training/config/model/point_wise.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/transformer.yaml b/training/src/anemoi/training/config/model/transformer.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/transformer_diffusion.yaml b/training/src/anemoi/training/config/model/transformer_diffusion.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/transformer_diffusiontend.yaml b/training/src/anemoi/training/config/model/transformer_diffusiontend.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/transformer_ens.yaml b/training/src/anemoi/training/config/model/transformer_ens.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/model/transformer_transformermapper.yaml b/training/src/anemoi/training/config/model/transformer_transformermapper.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/multi.yaml b/training/src/anemoi/training/config/multi.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/point_wise.yaml b/training/src/anemoi/training/config/point_wise.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/stretched.yaml b/training/src/anemoi/training/config/stretched.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/system/example.yaml b/training/src/anemoi/training/config/system/example.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/system/hardware/example.yaml b/training/src/anemoi/training/config/system/hardware/example.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/system/hardware/slurm.yaml b/training/src/anemoi/training/config/system/hardware/slurm.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/system/input/example.yaml b/training/src/anemoi/training/config/system/input/example.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/system/output/example.yaml b/training/src/anemoi/training/config/system/output/example.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/system/slurm.yaml b/training/src/anemoi/training/config/system/slurm.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/task/autoencoder.yaml b/training/src/anemoi/training/config/task/autoencoder.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/task/forecaster.yaml b/training/src/anemoi/training/config/task/forecaster.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/task/temporal_downscaler.yaml b/training/src/anemoi/training/config/task/temporal_downscaler.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/diffusion.yaml b/training/src/anemoi/training/config/training/diffusion.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/ensemble.yaml b/training/src/anemoi/training/config/training/ensemble.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/lam.yaml b/training/src/anemoi/training/config/training/lam.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/multi.yaml b/training/src/anemoi/training/config/training/multi.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/optimization/default.yaml b/training/src/anemoi/training/config/training/optimization/default.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/optimization/lr_scheduler/cosine_scheduler.yaml b/training/src/anemoi/training/config/training/optimization/lr_scheduler/cosine_scheduler.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/optimization/optimizer/adamw.yaml b/training/src/anemoi/training/config/training/optimization/optimizer/adamw.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/optimization/optimizer/ademamix.yaml b/training/src/anemoi/training/config/training/optimization/optimizer/ademamix.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/optimization/optimizer/zero.yaml b/training/src/anemoi/training/config/training/optimization/optimizer/zero.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/scalers/global.yaml b/training/src/anemoi/training/config/training/scalers/global.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/scalers/lam.yaml b/training/src/anemoi/training/config/training/scalers/lam.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/scalers/multi.yaml b/training/src/anemoi/training/config/training/scalers/multi.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/scalers/stretched.yaml b/training/src/anemoi/training/config/training/scalers/stretched.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/single.yaml b/training/src/anemoi/training/config/training/single.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/stretched.yaml b/training/src/anemoi/training/config/training/stretched.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/training_loss/single.yaml b/training/src/anemoi/training/config/training/training_loss/single.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/training_loss/single_combined.yaml b/training/src/anemoi/training/config/training/training_loss/single_combined.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/weight_averaging/ema.yaml b/training/src/anemoi/training/config/training/weight_averaging/ema.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/config/training/weight_averaging/swa.yaml b/training/src/anemoi/training/config/training/weight_averaging/swa.yaml old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/data/__init__.py b/training/src/anemoi/training/data/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/data/data_reader.py b/training/src/anemoi/training/data/data_reader.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/data/datamodule.py b/training/src/anemoi/training/data/datamodule.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/data/multidataset.py b/training/src/anemoi/training/data/multidataset.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/data/relative_time_indices.py b/training/src/anemoi/training/data/relative_time_indices.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/data/usable_indices.py b/training/src/anemoi/training/data/usable_indices.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/__init__.py b/training/src/anemoi/training/diagnostics/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/benchmark_server.py b/training/src/anemoi/training/diagnostics/benchmark_server.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/__init__.py b/training/src/anemoi/training/diagnostics/callbacks/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/checkpoint.py b/training/src/anemoi/training/diagnostics/callbacks/checkpoint.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/evaluation.py b/training/src/anemoi/training/diagnostics/callbacks/evaluation.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/optimiser.py b/training/src/anemoi/training/diagnostics/callbacks/optimiser.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/plot.py b/training/src/anemoi/training/diagnostics/callbacks/plot.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/plot_adapter.py b/training/src/anemoi/training/diagnostics/callbacks/plot_adapter.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/plot_ens.py b/training/src/anemoi/training/diagnostics/callbacks/plot_ens.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/profiler.py b/training/src/anemoi/training/diagnostics/callbacks/profiler.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/provenance.py b/training/src/anemoi/training/diagnostics/callbacks/provenance.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/sanity.py b/training/src/anemoi/training/diagnostics/callbacks/sanity.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/stopping.py b/training/src/anemoi/training/diagnostics/callbacks/stopping.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/callbacks/weight_averaging.py b/training/src/anemoi/training/diagnostics/callbacks/weight_averaging.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/continents.json b/training/src/anemoi/training/diagnostics/continents.json old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/countries.geo.json b/training/src/anemoi/training/diagnostics/countries.geo.json old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/focus_area.py b/training/src/anemoi/training/diagnostics/focus_area.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/logger.py b/training/src/anemoi/training/diagnostics/logger.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/maps.py b/training/src/anemoi/training/diagnostics/maps.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/mlflow/__init__.py b/training/src/anemoi/training/diagnostics/mlflow/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/mlflow/azureml.py b/training/src/anemoi/training/diagnostics/mlflow/azureml.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/mlflow/logger.py b/training/src/anemoi/training/diagnostics/mlflow/logger.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/mlflow/system_metrics/cpu_monitor.py b/training/src/anemoi/training/diagnostics/mlflow/system_metrics/cpu_monitor.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/mlflow/system_metrics/gpu_monitor.py b/training/src/anemoi/training/diagnostics/mlflow/system_metrics/gpu_monitor.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/mlflow/utils.py b/training/src/anemoi/training/diagnostics/mlflow/utils.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/plots.py b/training/src/anemoi/training/diagnostics/plots.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/profilers.py b/training/src/anemoi/training/diagnostics/profilers.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/diagnostics/projections.py b/training/src/anemoi/training/diagnostics/projections.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/distributed/__init__.py b/training/src/anemoi/training/distributed/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/distributed/groups.py b/training/src/anemoi/training/distributed/groups.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/distributed/strategy.py b/training/src/anemoi/training/distributed/strategy.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/__init__.py b/training/src/anemoi/training/losses/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py old mode 100644 new mode 100755 index 2f03958ce0..a8e935f70d --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -6,6 +6,7 @@ import torch from anemoi.training.losses.base import BaseLossWrapper +from anemoi.training.utils.enums import TensorDim if TYPE_CHECKING: from torch.distributed.distributed_c10d import ProcessGroup @@ -77,10 +78,25 @@ def forward( ), "TimeAggregateLossWrapper requires an output time dimension of size > 1 for aggregation." loss = torch.tensor(0.0, dtype=pred.dtype, device=pred.device, requires_grad=False) + # Exclude the TIME scaler from inner loss calls since we iterate per-step + # and apply time weights manually. + without_time = without_scalers or [] + if TensorDim.TIME not in without_time and TensorDim.TIME.value not in without_time: + without_time = list(without_time) + [TensorDim.TIME.value] + + # Extract time weights from the shared scaler (if present) + time_weights = None + for _name, (dims, scaler) in self.loss.scaler.tensors.items(): + if isinstance(dims, int): + dims = (dims,) + if TensorDim.TIME.value in dims or TensorDim.TIME in dims: + time_weights = scaler + break + shared_kwargs = dict( squash=squash, scaler_indices=scaler_indices, - without_scalers=without_scalers, + without_scalers=without_time, grid_shard_slice=grid_shard_slice, group=group, **kwargs, @@ -92,19 +108,30 @@ def forward( if agg_op == "diff": pred_agg = pred[:, 1:, ...] - pred[:, :-1, ...] # (bs, time-1, ens, latlon, nvar) target_agg = target[:, 1:, ...] - target[:, :-1, ...] # (bs, time-1, latlon, nvar) + # Compute loss per diff-step, weighted by time scaler + for step in range(pred_agg.shape[1]): + step_loss = self.loss( + pred_agg[:, step : step + 1, ...], + target_agg[:, step : step + 1, ...], + **shared_kwargs, + ) + if time_weights is not None: + step_loss = step_loss * time_weights[step] + loss = loss + step_loss elif agg_op == "mean": pred_agg = torch.mean(pred, dim=1, keepdim=True) # (bs, 1, ens, latlon, nvar) target_agg = torch.mean(target, dim=1, keepdim=True) # (bs, 1, latlon, nvar) + loss = loss + self.loss(pred_agg, target_agg, **shared_kwargs) elif agg_op == "min": pred_agg = torch.amin(pred, dim=1, keepdim=True) # (bs, 1, ens, latlon, nvar) target_agg = torch.amin(target, dim=1, keepdim=True) # (bs, 1, latlon, nvar) + loss = loss + self.loss(pred_agg, target_agg, **shared_kwargs) elif agg_op == "max": pred_agg = torch.amax(pred, dim=1, keepdim=True) # (bs, 1, ens, latlon, nvar) target_agg = torch.amax(target, dim=1, keepdim=True) # (bs, 1, latlon, nvar) + loss = loss + self.loss(pred_agg, target_agg, **shared_kwargs) else: msg = f"Unknown aggregation type '{agg_op}'. Supported: 'diff', 'mean', 'min', 'max'." raise ValueError(msg) - loss = loss + self.loss(pred_agg, target_agg, **shared_kwargs) - return loss diff --git a/training/src/anemoi/training/losses/base.py b/training/src/anemoi/training/losses/base.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/combined.py b/training/src/anemoi/training/losses/combined.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/huber.py b/training/src/anemoi/training/losses/huber.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/kcrps.py b/training/src/anemoi/training/losses/kcrps.py old mode 100644 new mode 100755 index 5e1fc146bf..f32a1938e6 --- a/training/src/anemoi/training/losses/kcrps.py +++ b/training/src/anemoi/training/losses/kcrps.py @@ -151,6 +151,7 @@ def _kernel_crps(self, preds: torch.Tensor, targets: torch.Tensor, alpha: float var = torch.abs(preds.unsqueeze(dim=-1) - preds.unsqueeze(dim=-2)) diag = torch.eye(ens_size, dtype=torch.bool, device=preds.device) + import ipdb; ipdb.set_trace() err_r = einops.repeat( torch.abs(preds - targets.unsqueeze(dim=-1)), "batch t var latlon ens -> batch t var latlon n ens", diff --git a/training/src/anemoi/training/losses/logcosh.py b/training/src/anemoi/training/losses/logcosh.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/mae.py b/training/src/anemoi/training/losses/mae.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/mse.py b/training/src/anemoi/training/losses/mse.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/multiscale.py b/training/src/anemoi/training/losses/multiscale.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/rmse.py b/training/src/anemoi/training/losses/rmse.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scaler_tensor.py b/training/src/anemoi/training/losses/scaler_tensor.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scalers/__init__.py b/training/src/anemoi/training/losses/scalers/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scalers/base_scaler.py b/training/src/anemoi/training/losses/scalers/base_scaler.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scalers/loss_weights_mask.py b/training/src/anemoi/training/losses/scalers/loss_weights_mask.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scalers/node_attributes.py b/training/src/anemoi/training/losses/scalers/node_attributes.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scalers/scalers.py b/training/src/anemoi/training/losses/scalers/scalers.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scalers/time_step.py b/training/src/anemoi/training/losses/scalers/time_step.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scalers/variable.py b/training/src/anemoi/training/losses/scalers/variable.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scalers/variable_level.py b/training/src/anemoi/training/losses/scalers/variable_level.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scalers/variable_masking.py b/training/src/anemoi/training/losses/scalers/variable_masking.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/scalers/variable_tendency.py b/training/src/anemoi/training/losses/scalers/variable_tendency.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/spectral.py b/training/src/anemoi/training/losses/spectral.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/utils.py b/training/src/anemoi/training/losses/utils.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/variable_mapper.py b/training/src/anemoi/training/losses/variable_mapper.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/losses/weighted_mse.py b/training/src/anemoi/training/losses/weighted_mse.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/optimizers/AdEMAMix.py b/training/src/anemoi/training/optimizers/AdEMAMix.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/schemas/__init__.py b/training/src/anemoi/training/schemas/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/schemas/base_schema.py b/training/src/anemoi/training/schemas/base_schema.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/schemas/data.py b/training/src/anemoi/training/schemas/data.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/schemas/dataloader.py b/training/src/anemoi/training/schemas/dataloader.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/schemas/diagnostics.py b/training/src/anemoi/training/schemas/diagnostics.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/schemas/schema_utils.py b/training/src/anemoi/training/schemas/schema_utils.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/schemas/system.py b/training/src/anemoi/training/schemas/system.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/schemas/tasks.py b/training/src/anemoi/training/schemas/tasks.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/tasks/__init__.py b/training/src/anemoi/training/tasks/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/tasks/base.py b/training/src/anemoi/training/tasks/base.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/tasks/forecaster.py b/training/src/anemoi/training/tasks/forecaster.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/tasks/temporal_downscaler.py b/training/src/anemoi/training/tasks/temporal_downscaler.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/tasks/timeless.py b/training/src/anemoi/training/tasks/timeless.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/train/__init__.py b/training/src/anemoi/training/train/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/train/methods/__init__.py b/training/src/anemoi/training/train/methods/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/train/methods/base.py b/training/src/anemoi/training/train/methods/base.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/train/methods/diffusion.py b/training/src/anemoi/training/train/methods/diffusion.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/train/methods/ensemble.py b/training/src/anemoi/training/train/methods/ensemble.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/train/methods/single.py b/training/src/anemoi/training/train/methods/single.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/train/profiler.py b/training/src/anemoi/training/train/profiler.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/train/train.py b/training/src/anemoi/training/train/train.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/__init__.py b/training/src/anemoi/training/utils/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/checkpoint.py b/training/src/anemoi/training/utils/checkpoint.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/custom_colormaps.py b/training/src/anemoi/training/utils/custom_colormaps.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/enums.py b/training/src/anemoi/training/utils/enums.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/index_space.py b/training/src/anemoi/training/utils/index_space.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/jsonify.py b/training/src/anemoi/training/utils/jsonify.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/masks.py b/training/src/anemoi/training/utils/masks.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/mlflow_sync.py b/training/src/anemoi/training/utils/mlflow_sync.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/seeding.py b/training/src/anemoi/training/utils/seeding.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/time_indices.py b/training/src/anemoi/training/utils/time_indices.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/variables_metadata.py b/training/src/anemoi/training/utils/variables_metadata.py old mode 100644 new mode 100755 diff --git a/training/src/anemoi/training/utils/worker_init.py b/training/src/anemoi/training/utils/worker_init.py old mode 100644 new mode 100755 diff --git a/training/src/hydra_plugins/anemoi_searchpath/__init__.py b/training/src/hydra_plugins/anemoi_searchpath/__init__.py old mode 100644 new mode 100755 diff --git a/training/src/hydra_plugins/anemoi_searchpath/anemoi_searchpath_plugin.py b/training/src/hydra_plugins/anemoi_searchpath/anemoi_searchpath_plugin.py old mode 100644 new mode 100755 diff --git a/training/tests/conftest.py b/training/tests/conftest.py old mode 100644 new mode 100755 diff --git a/training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.py b/training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.py old mode 100644 new mode 100755 diff --git a/training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.yaml b/training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/benchmark/base.yaml b/training/tests/integration/config/benchmark/base.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/benchmark/diffusiontend.yaml b/training/tests/integration/config/benchmark/diffusiontend.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/benchmark/ensemble_crps.yaml b/training/tests/integration/config/benchmark/ensemble_crps.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/benchmark/graphtransformer.yaml b/training/tests/integration/config/benchmark/graphtransformer.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/benchmark/lam.yaml b/training/tests/integration/config/benchmark/lam.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/benchmark/stretched.yaml b/training/tests/integration/config/benchmark/stretched.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/imputer_modifications.yaml b/training/tests/integration/config/imputer_modifications.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/test_autoencoder.yaml b/training/tests/integration/config/test_autoencoder.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/test_diffusion.yaml b/training/tests/integration/config/test_diffusion.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/test_ensemble_crps.yaml b/training/tests/integration/config/test_ensemble_crps.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/test_filtering.yaml b/training/tests/integration/config/test_filtering.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/test_global.yaml b/training/tests/integration/config/test_global.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/test_lam.yaml b/training/tests/integration/config/test_lam.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/test_multidatasets.yaml b/training/tests/integration/config/test_multidatasets.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/test_stretched.yaml b/training/tests/integration/config/test_stretched.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/test_temporal_downscaler.yaml b/training/tests/integration/config/test_temporal_downscaler.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/test_temporal_downscaler_ensemble.yaml b/training/tests/integration/config/test_temporal_downscaler_ensemble.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/config/testing_modifications.yaml b/training/tests/integration/config/testing_modifications.yaml old mode 100644 new mode 100755 diff --git a/training/tests/integration/conftest.py b/training/tests/integration/conftest.py old mode 100644 new mode 100755 diff --git a/training/tests/integration/schemas/partial_metadata_schema.py b/training/tests/integration/schemas/partial_metadata_schema.py old mode 100644 new mode 100755 diff --git a/training/tests/integration/scripts/update_slt_configs.py b/training/tests/integration/scripts/update_slt_configs.py old mode 100644 new mode 100755 diff --git a/training/tests/integration/test_benchmark.py b/training/tests/integration/test_benchmark.py old mode 100644 new mode 100755 diff --git a/training/tests/integration/test_training_cycle.py b/training/tests/integration/test_training_cycle.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/checkpoint/conftest.py b/training/tests/unit/checkpoint/conftest.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/checkpoint/test_base.py b/training/tests/unit/checkpoint/test_base.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/checkpoint/test_catalog.py b/training/tests/unit/checkpoint/test_catalog.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/checkpoint/test_exceptions.py b/training/tests/unit/checkpoint/test_exceptions.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/checkpoint/test_formats.py b/training/tests/unit/checkpoint/test_formats.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/checkpoint/test_pipeline.py b/training/tests/unit/checkpoint/test_pipeline.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/checkpoint/test_utils.py b/training/tests/unit/checkpoint/test_utils.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/commands/test_config.py b/training/tests/unit/commands/test_config.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/commands/test_mlflow.py b/training/tests/unit/commands/test_mlflow.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/conftest.py b/training/tests/unit/conftest.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/data/test_dataset.py b/training/tests/unit/data/test_dataset.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/data/test_multidataset.py b/training/tests/unit/data/test_multidataset.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/data/test_relative_time_indices.py b/training/tests/unit/data/test_relative_time_indices.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/data/test_usable_indices.py b/training/tests/unit/data/test_usable_indices.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/callbacks/test_timelimit.py b/training/tests/unit/diagnostics/callbacks/test_timelimit.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/callbacks/test_variable_order.py b/training/tests/unit/diagnostics/callbacks/test_variable_order.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/callbacks/test_weight_averaging.py b/training/tests/unit/diagnostics/callbacks/test_weight_averaging.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/mlflow/test_azureml_mlflow_logger.py b/training/tests/unit/diagnostics/mlflow/test_azureml_mlflow_logger.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/mlflow/test_mlflow_logger.py b/training/tests/unit/diagnostics/mlflow/test_mlflow_logger.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/mlflow/test_mlflow_utils.py b/training/tests/unit/diagnostics/mlflow/test_mlflow_utils.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/test_callbacks.py b/training/tests/unit/diagnostics/test_callbacks.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/test_checkpoint.py b/training/tests/unit/diagnostics/test_checkpoint.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/test_focus_area.py b/training/tests/unit/diagnostics/test_focus_area.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/test_plot_adapters.py b/training/tests/unit/diagnostics/test_plot_adapters.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/test_plotting_callbacks.py b/training/tests/unit/diagnostics/test_plotting_callbacks.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/test_plotting_ens_callbacks.py b/training/tests/unit/diagnostics/test_plotting_ens_callbacks.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/diagnostics/test_weightandbiases.py b/training/tests/unit/diagnostics/test_weightandbiases.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/distributed/test_groups.py b/training/tests/unit/distributed/test_groups.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/hydra/test_search_path_plugins.py b/training/tests/unit/hydra/test_search_path_plugins.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py old mode 100644 new mode 100755 index a159d19204..3248b20607 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -267,3 +267,162 @@ def test_default_no_ignore_nans() -> None: wrapper = TimeAggregateLossWrapper(["mean"], _make_loss()) assert wrapper.avg_function is torch.mean assert wrapper.sum_function is torch.sum + + +# --------------------------------------------------------------------------- +# Transparent wrapper: scaler delegation +# --------------------------------------------------------------------------- + + +def test_scaler_is_shared_with_inner_loss() -> None: + inner = _make_loss() + wrapper = TimeAggregateLossWrapper(["mean"], inner) + assert wrapper.scaler is inner.scaler + + +def test_add_scaler_reaches_inner_loss() -> None: + inner = MAELoss() + wrapper = TimeAggregateLossWrapper(["mean"], inner) + scaler = torch.ones(NVAR) + wrapper.add_scaler(TensorDim.VARIABLE, scaler, name="var_scaler") + assert inner.scaler.has_scaler_for_dim(TensorDim.VARIABLE) + + +def test_update_scaler_delegates_to_inner_loss() -> None: + inner = _make_loss() + wrapper = TimeAggregateLossWrapper(["mean"], inner) + new_grid = torch.ones(4) * 2.0 + wrapper.update_scaler("unit_grid", new_grid, override=True) + assert torch.allclose(inner.scaler.unit_grid, new_grid) + + +def test_has_scaler_for_dim_delegates() -> None: + inner = _make_loss() + wrapper = TimeAggregateLossWrapper(["mean"], inner) + assert wrapper.has_scaler_for_dim(TensorDim.GRID) is True + assert wrapper.has_scaler_for_dim(TensorDim.VARIABLE) is False + + +# --------------------------------------------------------------------------- +# Transparent wrapper: metadata delegation +# --------------------------------------------------------------------------- + + +def test_supports_sharding_matches_inner() -> None: + inner = _make_loss() + wrapper = TimeAggregateLossWrapper(["mean"], inner) + assert wrapper.supports_sharding == inner.supports_sharding + + +def test_supports_sharding_propagates_false() -> None: + inner = _make_loss() + inner.supports_sharding = False + wrapper = TimeAggregateLossWrapper(["mean"], inner) + assert wrapper.supports_sharding is False + + +def test_needs_shard_layout_info_default_false() -> None: + inner = _make_loss() + wrapper = TimeAggregateLossWrapper(["mean"], inner) + assert wrapper.needs_shard_layout_info is False + + +def test_iter_leaf_losses_yields_inner_leaves() -> None: + inner = _make_loss() + wrapper = TimeAggregateLossWrapper(["mean"], inner) + leaves = list(wrapper.iter_leaf_losses()) + assert leaves == [inner] + assert wrapper not in leaves + + +# --------------------------------------------------------------------------- +# Nested composition: TimeAggregateLossWrapper(MultiscaleLossWrapper(...)) +# --------------------------------------------------------------------------- + + +def _make_multiscale_wrapper(inner: BaseLoss | None = None) -> "MultiscaleLossWrapper": + """Build a single-scale MultiscaleLossWrapper (no smoothing matrices).""" + from anemoi.training.losses.multiscale import MultiscaleLossWrapper + + if inner is None: + inner = _make_loss() + return MultiscaleLossWrapper( + per_scale_loss=inner, + weights=[1.0], + keep_batch_sharded=True, + ) + + +def test_nested_needs_shard_layout_info_propagates() -> None: + ms = _make_multiscale_wrapper() + wrapper = TimeAggregateLossWrapper(["mean"], ms) + # MultiscaleLossWrapper with keep_batch_sharded=True -> needs_shard_layout_info=True + assert wrapper.needs_shard_layout_info is True + + +def test_nested_scaler_shared_through_chain() -> None: + leaf = _make_loss() + ms = _make_multiscale_wrapper(leaf) + wrapper = TimeAggregateLossWrapper(["mean"], ms) + # All three should share the same scaler + assert wrapper.scaler is ms.scaler + assert ms.scaler is leaf.scaler + + +def test_nested_add_scaler_reaches_leaf() -> None: + leaf = MAELoss() + ms = _make_multiscale_wrapper(leaf) + wrapper = TimeAggregateLossWrapper(["mean"], ms) + wrapper.add_scaler(TensorDim.GRID, torch.ones(4), name="grid_w") + assert leaf.scaler.has_scaler_for_dim(TensorDim.GRID) + + +def test_nested_iter_leaf_losses_reaches_innermost() -> None: + leaf = _make_loss() + ms = _make_multiscale_wrapper(leaf) + wrapper = TimeAggregateLossWrapper(["mean"], ms) + # MultiscaleLossWrapper inherits default iter_leaf_losses (yields self), + # so the leaf list should be [ms], not [wrapper] + leaves = list(wrapper.iter_leaf_losses()) + assert wrapper not in leaves + assert ms in leaves + + +# --------------------------------------------------------------------------- +# CombinedLoss integration +# --------------------------------------------------------------------------- + + +def test_combined_loss_scaler_reaches_wrapped_inner() -> None: + from anemoi.training.losses.combined import CombinedLoss + + inner1 = MAELoss() + inner2 = MAELoss() + wrapper = TimeAggregateLossWrapper(["mean"], inner2) + + combined = CombinedLoss( + losses=[ + inner1, + wrapper, + ], + ) + grid_scaler = torch.ones(4) + combined.add_scaler(TensorDim.GRID, grid_scaler, name="node_weights") + + # Both leaf losses should have the scaler + assert inner1.scaler.has_scaler_for_dim(TensorDim.GRID) + assert inner2.scaler.has_scaler_for_dim(TensorDim.GRID) + + +def test_combined_loss_iter_leaf_losses_includes_wrapped() -> None: + from anemoi.training.losses.combined import CombinedLoss + + inner1 = _make_loss() + inner2 = _make_loss() + wrapper = TimeAggregateLossWrapper(["mean"], inner2) + + combined = CombinedLoss(losses=[inner1, wrapper]) + leaves = list(combined.iter_leaf_losses()) + assert inner1 in leaves + assert inner2 in leaves + assert wrapper not in leaves diff --git a/training/tests/unit/losses/test_combined_loss.py b/training/tests/unit/losses/test_combined_loss.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/losses/test_filtered_loss.py b/training/tests/unit/losses/test_filtered_loss.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/losses/test_loss_function.py b/training/tests/unit/losses/test_loss_function.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/losses/test_loss_scaling.py b/training/tests/unit/losses/test_loss_scaling.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/losses/test_multiscale_loss.py b/training/tests/unit/losses/test_multiscale_loss.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/losses/test_scaler.py b/training/tests/unit/losses/test_scaler.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/requirements.txt b/training/tests/unit/requirements.txt old mode 100644 new mode 100755 diff --git a/training/tests/unit/schemas/test_expand_paths.py b/training/tests/unit/schemas/test_expand_paths.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/tasks/test_autoencoder.py b/training/tests/unit/tasks/test_autoencoder.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/tasks/test_forecaster.py b/training/tests/unit/tasks/test_forecaster.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/tasks/test_temporal_downscaler.py b/training/tests/unit/tasks/test_temporal_downscaler.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/train/test_checkpoint_loading.py b/training/tests/unit/train/test_checkpoint_loading.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/train/test_methods.py b/training/tests/unit/train/test_methods.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/train/test_optimizer.py b/training/tests/unit/train/test_optimizer.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/train/test_print_variable_scaling.py b/training/tests/unit/train/test_print_variable_scaling.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/train/test_profiler.py b/training/tests/unit/train/test_profiler.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/train/test_restarting_run.py b/training/tests/unit/train/test_restarting_run.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/utils/test_masks.py b/training/tests/unit/utils/test_masks.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/utils/test_seeding.py b/training/tests/unit/utils/test_seeding.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/utils/test_time_indices.py b/training/tests/unit/utils/test_time_indices.py old mode 100644 new mode 100755 diff --git a/training/tests/unit/utils/test_variable_grouping.py b/training/tests/unit/utils/test_variable_grouping.py old mode 100644 new mode 100755 From 0aaf41c8f4b8d916de64bd342b841a70724fb642 Mon Sep 17 00:00:00 2001 From: Mariana Clare Date: Fri, 8 May 2026 16:48:21 +0200 Subject: [PATCH 47/88] revert change mod --- .github/CODEOWNERS | 0 .github/dependabot.yml | 0 .github/labeler.yml | 0 .github/pull_request_template.md | 0 .github/workflows/inactivity-bot.yml | 0 .github/workflows/integration-tests-hpc.yml | 0 .github/workflows/pr-conventional-commit.yml | 0 .github/workflows/pr-label-ats.yml | 0 .github/workflows/pr-label-conventional-commits.yml | 0 .github/workflows/pr-label-file-based.yml | 0 .github/workflows/pr-label-public.yml | 0 .github/workflows/pr-release.yml | 0 .github/workflows/push-to-private.yml | 0 .github/workflows/python-publish.yml | 0 .github/workflows/python-pull-request.yml | 0 .github/workflows/readthedocs-pr-update.yml | 0 .github/workflows/release-please.yml | 0 .gitignore | 0 .isort.cfg | 0 .pre-commit-config.yaml | 0 .release-please-config.json | 0 .release-please-manifest.json | 0 CONTRIBUTORS.md | 0 LICENCES/APPLE_ML_ACKNOWLEDGEMENTS | 0 LICENCES/APPLE_ML_ADEMAMIX_LICENSE | 0 LICENSE | 0 NOTICE.md | 0 README.md | 0 graphs/.gitattributes | 0 graphs/.gitignore | 0 graphs/.readthedocs.yaml | 0 graphs/CHANGELOG.md | 0 graphs/CONTRIBUTORS.md | 0 graphs/LICENSE | 0 graphs/README.md | 0 graphs/docs/Makefile | 0 graphs/docs/_static/cutoff.jpg | Bin graphs/docs/_static/enc_proc_dec.png | Bin graphs/docs/_static/graph_configurations.png | Bin graphs/docs/_static/hetero_data_graph.txt | 0 graphs/docs/_static/logo.png | Bin graphs/docs/_static/multi_scale_edges.svg | 0 graphs/docs/_static/processor.html | 0 graphs/docs/_static/style.css | 0 graphs/docs/_static/trinodes.png | Bin graphs/docs/_templates/.gitkeep | 0 graphs/docs/cli/introduction.rst | 0 graphs/docs/conf.py | 0 graphs/docs/contributing.rst | 0 graphs/docs/graphs/edge_attributes.rst | 0 graphs/docs/graphs/edges.rst | 0 graphs/docs/graphs/edges/cutoff.rst | 0 graphs/docs/graphs/edges/knn.rst | 0 graphs/docs/graphs/edges/multi_scale.rst | 0 graphs/docs/graphs/edges/tri_refined_edges.csv | 0 graphs/docs/graphs/introduction.rst | 0 graphs/docs/graphs/node_attributes.rst | 0 .../node_attributes/anemoi_dataset_attribute.rst | 0 graphs/docs/graphs/node_attributes/area_masks.rst | 0 .../graphs/node_attributes/boolean_operations.rst | 0 graphs/docs/graphs/node_attributes/weights.rst | 0 graphs/docs/graphs/node_coordinates.rst | 0 .../docs/graphs/node_coordinates/anemoi_dataset.rst | 0 graphs/docs/graphs/node_coordinates/healpix.csv | 0 graphs/docs/graphs/node_coordinates/healpix.rst | 0 graphs/docs/graphs/node_coordinates/hex_refined.csv | 0 .../node_coordinates/hex_refined_icosahedron.rst | 0 graphs/docs/graphs/node_coordinates/icon_mesh.rst | 0 .../docs/graphs/node_coordinates/latlon_arrays.rst | 0 graphs/docs/graphs/node_coordinates/npz_file.rst | 0 .../graphs/node_coordinates/reduced_gaussian.rst | 0 graphs/docs/graphs/node_coordinates/text_file.rst | 0 graphs/docs/graphs/node_coordinates/tri_nodes.csv | 0 .../node_coordinates/tri_refined_icosahedron.rst | 0 graphs/docs/graphs/node_coordinates/xarray_file.rst | 0 graphs/docs/graphs/post_processor.rst | 0 .../graphs/yaml/attributes_boolean_operation.yaml | 0 .../graphs/yaml/attributes_cosine_lat_weighted.yaml | 0 .../graphs/yaml/attributes_custom_area_weights.yaml | 0 graphs/docs/graphs/yaml/attributes_cutout.yaml | 0 graphs/docs/graphs/yaml/attributes_grids.yaml | 0 .../yaml/attributes_isolatitude_area_weights.yaml | 0 graphs/docs/graphs/yaml/attributes_lam_mask.yaml | 0 .../yaml/attributes_masked_planar_area_weights.yaml | 0 .../docs/graphs/yaml/attributes_nonmissingzarr.yaml | 0 graphs/docs/graphs/yaml/attributes_nonzerozarr.yaml | 0 .../graphs/yaml/attributes_planar_area_weights.yaml | 0 .../yaml/attributes_spherical_area_weights.yaml | 0 .../graphs/yaml/attributes_uniform_weights.yaml | 0 graphs/docs/index.rst | 0 graphs/docs/installing.rst | 0 graphs/docs/modules/edge_attributes.rst | 0 graphs/docs/modules/edge_builder.rst | 0 graphs/docs/modules/graph_creator.rst | 0 graphs/docs/modules/graph_inspector.rst | 0 graphs/docs/modules/node_attributes.rst | 0 graphs/docs/modules/node_builder.rst | 0 graphs/docs/modules/post_processor.rst | 0 graphs/docs/modules/schemas.rst | 0 graphs/docs/overview.rst | 0 graphs/docs/usage/create_sparse_matrices.rst | 0 graphs/docs/usage/getting_started.rst | 0 graphs/docs/usage/limited_area.rst | 0 graphs/docs/usage/schemas/global.excalidraw | 0 graphs/docs/usage/schemas/global.png | Bin graphs/docs/usage/schemas/global_wo-proc.excalidraw | 0 graphs/docs/usage/schemas/global_wo-proc.png | Bin graphs/docs/usage/yaml/cutout_zarr.yaml | 0 graphs/docs/usage/yaml/global.txt | 0 graphs/docs/usage/yaml/global.yaml | 0 graphs/docs/usage/yaml/global_with-attrs.txt | 0 graphs/docs/usage/yaml/global_with-attrs.yaml | 0 graphs/docs/usage/yaml/global_wo-proc.png | Bin graphs/docs/usage/yaml/global_wo-proc.txt | 0 graphs/docs/usage/yaml/global_wo-proc.yaml | 0 graphs/docs/usage/yaml/lam_nodes_wo_boundary.yaml | 0 graphs/docs/usage/yaml/limited_area_nodes.yaml | 0 graphs/docs/usage/yaml/nodes.yaml | 0 graphs/docs/usage/yaml/nodes_with-attrs.yaml | 0 graphs/docs/usage/yaml/sparse_matrices.yaml | 0 graphs/pyproject.toml | 0 graphs/src/anemoi/graphs/__init__.py | 0 graphs/src/anemoi/graphs/__main__.py | 0 graphs/src/anemoi/graphs/commands/__init__.py | 0 graphs/src/anemoi/graphs/commands/create.py | 0 graphs/src/anemoi/graphs/commands/describe.py | 0 .../src/anemoi/graphs/commands/export_to_sparse.py | 0 graphs/src/anemoi/graphs/commands/inspect.py | 0 graphs/src/anemoi/graphs/create.py | 0 graphs/src/anemoi/graphs/describe.py | 0 graphs/src/anemoi/graphs/edges/__init__.py | 0 graphs/src/anemoi/graphs/edges/attributes.py | 0 graphs/src/anemoi/graphs/edges/builders/__init__.py | 0 graphs/src/anemoi/graphs/edges/builders/base.py | 0 graphs/src/anemoi/graphs/edges/builders/cutoff.py | 0 graphs/src/anemoi/graphs/edges/builders/healpix.py | 0 graphs/src/anemoi/graphs/edges/builders/icon.py | 0 graphs/src/anemoi/graphs/edges/builders/knn.py | 0 graphs/src/anemoi/graphs/edges/builders/masking.py | 0 .../src/anemoi/graphs/edges/builders/multi_scale.py | 0 graphs/src/anemoi/graphs/edges/directional.py | 0 graphs/src/anemoi/graphs/export.py | 0 graphs/src/anemoi/graphs/generate/__init__.py | 0 graphs/src/anemoi/graphs/generate/healpix.py | 0 .../src/anemoi/graphs/generate/hex_icosahedron.py | 0 graphs/src/anemoi/graphs/generate/icon_mesh.py | 0 graphs/src/anemoi/graphs/generate/masks.py | 0 .../src/anemoi/graphs/generate/multi_scale_edges.py | 0 graphs/src/anemoi/graphs/generate/transforms.py | 0 .../src/anemoi/graphs/generate/tri_icosahedron.py | 0 graphs/src/anemoi/graphs/generate/utils.py | 0 graphs/src/anemoi/graphs/inspect.py | 0 graphs/src/anemoi/graphs/nodes/__init__.py | 0 .../src/anemoi/graphs/nodes/attributes/__init__.py | 0 .../anemoi/graphs/nodes/attributes/area_weights.py | 0 .../graphs/nodes/attributes/base_attributes.py | 0 .../anemoi/graphs/nodes/attributes/boolean_op.py | 0 graphs/src/anemoi/graphs/nodes/attributes/masks.py | 0 graphs/src/anemoi/graphs/nodes/builders/__init__.py | 0 graphs/src/anemoi/graphs/nodes/builders/base.py | 0 .../src/anemoi/graphs/nodes/builders/from_file.py | 0 .../anemoi/graphs/nodes/builders/from_healpix.py | 0 .../src/anemoi/graphs/nodes/builders/from_icon.py | 0 .../graphs/nodes/builders/from_reduced_gaussian.py | 0 .../nodes/builders/from_refined_icosahedron.py | 0 .../anemoi/graphs/nodes/builders/from_vectors.py | 0 graphs/src/anemoi/graphs/normalise.py | 0 graphs/src/anemoi/graphs/plotting/__init__.py | 0 graphs/src/anemoi/graphs/plotting/displots.py | 0 .../anemoi/graphs/plotting/interactive_2d_html.py | 0 .../graphs/plotting/interactive_3d.html.jinja | 0 .../anemoi/graphs/plotting/interactive_3d_html.py | 0 graphs/src/anemoi/graphs/plotting/prepare.py | 0 graphs/src/anemoi/graphs/processors/__init__.py | 0 graphs/src/anemoi/graphs/processors/post_process.py | 0 graphs/src/anemoi/graphs/schemas/__init__.py | 0 graphs/src/anemoi/graphs/schemas/base_graph.py | 0 .../graphs/schemas/edge_attributes_schemas.py | 0 graphs/src/anemoi/graphs/schemas/edge_schemas.py | 0 .../graphs/schemas/node_attributes_schemas.py | 0 graphs/src/anemoi/graphs/schemas/node_schemas.py | 0 graphs/src/anemoi/graphs/schemas/normalise.py | 0 graphs/src/anemoi/graphs/schemas/post_processors.py | 0 graphs/src/anemoi/graphs/utils.py | 0 graphs/tests/conftest.py | 0 graphs/tests/edges/test_cutoff.py | 0 graphs/tests/edges/test_direction.py | 0 graphs/tests/edges/test_edge_attributes.py | 0 graphs/tests/edges/test_healpix_multiscale.py | 0 graphs/tests/edges/test_icon_edges.py | 0 graphs/tests/edges/test_knn.py | 0 graphs/tests/edges/test_multiscale_edges.py | 0 graphs/tests/generate/test_mask_builder.py | 0 graphs/tests/generate/test_transforms.py | 0 graphs/tests/nodes/attributes/test_base.py | 0 .../nodes/attributes/test_boolean_operations.py | 0 graphs/tests/nodes/attributes/test_masks.py | 0 graphs/tests/nodes/attributes/test_weights.py | 0 graphs/tests/nodes/test_anemoi_dataset.py | 0 graphs/tests/nodes/test_arrays.py | 0 graphs/tests/nodes/test_cutout_nodes.py | 0 graphs/tests/nodes/test_from_xarray.py | 0 graphs/tests/nodes/test_healpix.py | 0 graphs/tests/nodes/test_hex_nodes.py | 0 graphs/tests/nodes/test_icon_nodes.py | 0 graphs/tests/nodes/test_npz.py | 0 graphs/tests/nodes/test_reduced_gaussian.py | 0 graphs/tests/nodes/test_tri_nodes.py | 0 graphs/tests/processors/test_post_process.py | 0 graphs/tests/test_create.py | 0 graphs/tests/test_normaliser.py | 0 graphs/tests/test_utils.py | 0 models/.gitattributes | 0 models/.gitignore | 0 models/.readthedocs.yaml | 0 models/CHANGELOG.md | 0 models/CONTRIBUTORS.md | 0 models/LICENSE | 0 models/README.md | 0 models/docs/Makefile | 0 models/docs/_static/anemoi-models_schematic.drawio | 0 models/docs/_static/anemoi-models_schematic.png | Bin models/docs/_static/data_indices.drawio | 0 models/docs/_static/data_indices.png | Bin models/docs/_static/logo.png | Bin .../docs/_static/preprocessing_remapper_atanh.png | Bin .../docs/_static/preprocessing_remapper_boxcox.png | Bin .../docs/_static/preprocessing_remapper_power.png | Bin models/docs/_static/style.css | 0 models/docs/_templates/.gitkeep | 0 models/docs/cli/migration.rst | 0 models/docs/conf.py | 0 models/docs/contributing.rst | 0 models/docs/create-migrations.rst | 0 models/docs/index.rst | 0 models/docs/introduction/installing.rst | 0 models/docs/introduction/overview.rst | 0 models/docs/modules/activations.rst | 0 models/docs/modules/data_indices.rst | 0 models/docs/modules/distributed.rst | 0 models/docs/modules/interface.rst | 0 models/docs/modules/layers.rst | 0 models/docs/modules/migrations.rst | 0 models/docs/modules/models.rst | 0 models/docs/modules/normalization.rst | 0 models/docs/modules/preprocessing.rst | 0 models/docs/modules/residual.rst | 0 models/docs/modules/schemas.rst | 0 models/docs/usage/create_model.rst | 0 models/pyproject.toml | 0 models/pytest.ini | 0 models/src/anemoi/models/__init__.py | 0 models/src/anemoi/models/__main__.py | 0 models/src/anemoi/models/commands/__init__.py | 0 models/src/anemoi/models/commands/hello.py | 0 models/src/anemoi/models/commands/migration.py | 0 models/src/anemoi/models/data_indices/__init__.py | 0 models/src/anemoi/models/data_indices/collection.py | 0 models/src/anemoi/models/data_indices/index.py | 0 models/src/anemoi/models/data_indices/tensor.py | 0 models/src/anemoi/models/distributed/__init__.py | 0 .../anemoi/models/distributed/balanced_partition.py | 0 models/src/anemoi/models/distributed/graph.py | 0 models/src/anemoi/models/distributed/khop_edges.py | 0 models/src/anemoi/models/distributed/primitives.py | 0 models/src/anemoi/models/distributed/shapes.py | 0 models/src/anemoi/models/distributed/transformer.py | 0 models/src/anemoi/models/distributed/utils.py | 0 models/src/anemoi/models/interface/__init__.py | 0 models/src/anemoi/models/layers/__init__.py | 0 models/src/anemoi/models/layers/activations.py | 0 models/src/anemoi/models/layers/attention.py | 0 models/src/anemoi/models/layers/block.py | 0 models/src/anemoi/models/layers/bounding.py | 0 models/src/anemoi/models/layers/conv.py | 0 models/src/anemoi/models/layers/diffusion.py | 0 models/src/anemoi/models/layers/ensemble.py | 0 models/src/anemoi/models/layers/graph.py | 0 models/src/anemoi/models/layers/graph_provider.py | 0 models/src/anemoi/models/layers/mapper.py | 0 models/src/anemoi/models/layers/mlp.py | 0 models/src/anemoi/models/layers/normalization.py | 0 models/src/anemoi/models/layers/processor.py | 0 models/src/anemoi/models/layers/residual.py | 0 models/src/anemoi/models/layers/sparse_projector.py | 0 models/src/anemoi/models/layers/spectral_helpers.py | 0 .../src/anemoi/models/layers/spectral_transforms.py | 0 models/src/anemoi/models/layers/utils.py | 0 models/src/anemoi/models/migrations/__init__.py | 0 models/src/anemoi/models/migrations/migrator.py | 0 .../models/migrations/scripts/1755530253_initial.py | 0 .../migrations/scripts/1762857427_deprecate_eda.py | 0 .../migrations/scripts/1762857428_chunking_fix.py | 0 .../scripts/1763479917_hardware_schema_update.py | 0 .../scripts/1763479918_refactor_mapper.py | 0 .../scripts/1767108147_move_to_multiple_datasets.py | 0 .../1773048851_fuse_multiple_perdataset_graphs.py | 0 .../1776237003_rename_swa_to_weight_averaging.py | 0 .../src/anemoi/models/migrations/setup_context.py | 0 models/src/anemoi/models/models/__init__.py | 0 models/src/anemoi/models/models/autoencoder.py | 0 models/src/anemoi/models/models/base.py | 0 .../models/diffusion_encoder_processor_decoder.py | 0 .../models/models/encoder_processor_decoder.py | 0 .../models/models/ens_encoder_processor_decoder.py | 0 models/src/anemoi/models/models/hierarchical.py | 0 .../models/models/hierarchical_autoencoder.py | 0 models/src/anemoi/models/preprocessing/__init__.py | 0 models/src/anemoi/models/preprocessing/imputer.py | 0 models/src/anemoi/models/preprocessing/mappings.py | 0 .../src/anemoi/models/preprocessing/normalizer.py | 0 .../anemoi/models/preprocessing/postprocessor.py | 0 models/src/anemoi/models/preprocessing/remapper.py | 0 models/src/anemoi/models/samplers/__init__.py | 0 .../anemoi/models/samplers/diffusion_samplers.py | 0 models/src/anemoi/models/schemas/__init__.py | 0 .../src/anemoi/models/schemas/common_components.py | 0 models/src/anemoi/models/schemas/data_processor.py | 0 models/src/anemoi/models/schemas/decoder.py | 0 models/src/anemoi/models/schemas/encoder.py | 0 models/src/anemoi/models/schemas/models.py | 0 models/src/anemoi/models/schemas/processor.py | 0 models/src/anemoi/models/schemas/residual.py | 0 models/src/anemoi/models/triton/gt.py | 0 models/src/anemoi/models/triton/utils.py | 0 models/src/anemoi/models/utils/__init__.py | 0 models/src/anemoi/models/utils/compile.py | 0 models/src/anemoi/models/utils/config.py | 0 models/tests/conftest.py | 0 models/tests/data_indices/test_collection.py | 0 models/tests/data_indices/test_data_indices.py | 0 models/tests/distributed/balanced_partition.py | 0 models/tests/integration/triton/test_triton_gt.py | 0 models/tests/layers/block/test_block_graphconv.py | 0 .../layers/block/test_block_graphtransformer.py | 0 models/tests/layers/block/test_block_pointwise.py | 0 models/tests/layers/block/test_block_transformer.py | 0 .../layers/block/test_block_transformermapper.py | 0 models/tests/layers/mapper/test_base_mapper.py | 0 models/tests/layers/mapper/test_graphconv_mapper.py | 0 .../layers/mapper/test_graphtransformer_mapper.py | 0 models/tests/layers/mapper/test_pointwise_mapper.py | 0 .../tests/layers/mapper/test_transformer_mapper.py | 0 .../tests/layers/processor/test_base_processor.py | 0 .../layers/processor/test_graphconv_processor.py | 0 .../processor/test_graphtransformer_processor.py | 0 .../layers/processor/test_pointwise_processor.py | 0 .../layers/processor/test_transformer_processor.py | 0 models/tests/layers/test_activations.py | 0 models/tests/layers/test_attention.py | 0 models/tests/layers/test_bounding.py | 0 models/tests/layers/test_grad_checkpoint_wiring.py | 0 models/tests/layers/test_graph.py | 0 models/tests/layers/test_layer_utils.py | 0 models/tests/layers/test_mlp.py | 0 models/tests/layers/test_noise_embeddings.py | 0 models/tests/layers/test_residual.py | 0 models/tests/layers/test_sht.py | 0 models/tests/migrations/conftest.py | 0 .../migrations/migrations/1750840837_add_foo.py | 0 .../migrations/migrations/1750841219_add_bar.py | 0 .../migrations/migrations/1750859824_add_baz.py | 0 .../migrations/migrations/1750859905_rename_baz.py | 0 .../tests/migrations/migrations/1751895180_final.py | 0 .../migrations/migrations/1751895203_recent.py | 0 models/tests/migrations/test_migration_order.py | 0 models/tests/migrations/test_migrations.py | 0 .../models/test_diffusion_sampling_pipeline.py | 0 models/tests/models/test_diffusion_tendency.py | 0 models/tests/models/test_models.py | 0 models/tests/preprocessing/test_mappings.py | 0 models/tests/preprocessing/test_postprocessor.py | 0 .../preprocessing/test_preprocessor_imputer.py | 0 .../preprocessing/test_preprocessor_normalizer.py | 0 .../preprocessing/test_preprocessor_remapper.py | 0 .../tests/preprocessing/test_stepwise_processors.py | 0 models/tests/samplers/test_diffusion_samplers.py | 0 .../tests/schemas/test_data_processors_schemas.py | 0 .../schemas/test_model_schemas_pointwise_mappers.py | 0 models/tests/utils/test_compile.py | 0 training/.gitattributes | 0 training/.gitignore | 0 training/.readthedocs.yaml | 0 training/CHANGELOG.md | 0 training/CONTRIBUTORS.md | 0 training/LICENSE | 0 training/README.md | 0 training/docs/Makefile | 0 training/docs/_static/logo.png | Bin training/docs/_static/style.css | 0 training/docs/_templates/.gitkeep | 0 training/docs/adrs/adr-001.md | 0 training/docs/adrs/adr-002.md | 0 training/docs/adrs/template.md | 0 training/docs/checkpoint_integration.rst | 0 training/docs/checkpoint_pipeline_configuration.rst | 0 training/docs/checkpoint_troubleshooting.rst | 0 training/docs/conf.py | 0 training/docs/contributing.rst | 0 .../docs/images/global-sliding-window-attention.png | Bin .../docs/images/gnn-encoder-decoder-multimesh.jpg | Bin training/docs/images/mlflow/mlflow_compare.png | Bin training/docs/images/mlflow/mlflow_constant.png | Bin training/docs/images/mlflow/mlflow_resumed_run.png | Bin training/docs/images/mlflow/mlflow_run.png | Bin training/docs/images/mlflow/mlflow_server.png | Bin training/docs/images/model_sharding.png | Bin .../docs/images/multi-dataset/downscaling-multi.png | Bin training/docs/images/multi-dataset/lam-multi.png | Bin .../docs/images/multi-dataset/prog-forc-diag.png | Bin .../mem-snapshot-1-mapper-chunk.png | Bin .../mem-snapshot-4-mapper-chunks.png | Bin .../performance-guide/performance-flowchart.png | Bin .../profiler/anemoi_profiler_architecture.png | Bin .../profiler/anemoi_profiler_benchmark_profiler.png | Bin .../docs/images/profiler/anemoi_profiler_config.png | Bin .../images/profiler/anemoi_profiler_high_level.png | Bin .../profiler/anemoi_profiler_mlflow_integration.png | Bin .../anemoi_profiler_mlflow_integration_2.png | Bin .../anemoi_profiler_mlflow_integration_3.png | Bin .../profiler/anemoi_profiler_speed_report.png | Bin .../anemoi_profiler_speedreport_diagram.png | Bin .../profiler/anemoi_profiler_training_rates.png | Bin .../profiler/anemoi_profiler_validation_rates.png | Bin .../docs/images/profiler/example_memory_report.png | Bin .../images/profiler/example_memory_timeline.png | Bin .../docs/images/profiler/example_model_summary.png | Bin .../images/profiler/example_model_summary_2.png | Bin .../docs/images/profiler/example_system_report.png | Bin .../docs/images/profiler/example_time_report.png | Bin .../docs/images/profiler/idle_time_breakdown.png | Bin .../docs/images/profiler/kernel_breakdown_dfs.png | Bin .../docs/images/profiler/kernel_breakdown_plots.png | Bin .../images/profiler/memory_snapshot_diagram.png | Bin .../docs/images/profiler/memory_snapshot_output.png | Bin .../docs/images/profiler/temporal_breakdown.png | Bin training/docs/images/transformer-block.png | Bin training/docs/index.rst | 0 training/docs/introduction/installing.rst | 0 training/docs/introduction/overview.rst | 0 training/docs/modules/data.rst | 0 training/docs/modules/diagnostics.rst | 0 training/docs/modules/losses.rst | 0 training/docs/modules/optimization.rst | 0 training/docs/modules/schemas.rst | 0 training/docs/modules/strategy.rst | 0 training/docs/modules/tasks.rst | 0 training/docs/modules/train.rst | 0 training/docs/troubleshooting.rst | 0 training/docs/user-guide/basic-set-up.rst | 0 training/docs/user-guide/benchmarking.rst | 0 training/docs/user-guide/configuring.rst | 0 training/docs/user-guide/distributed.rst | 0 training/docs/user-guide/download-era5-o96.rst | 0 training/docs/user-guide/hydra-intro.rst | 0 training/docs/user-guide/models.rst | 0 training/docs/user-guide/multi-datasets.rst | 0 training/docs/user-guide/overview.rst | 0 .../docs/user-guide/performance-optimisation.rst | 0 training/docs/user-guide/tasks.rst | 0 training/docs/user-guide/tracking.rst | 0 training/docs/user-guide/training-methods.rst | 0 training/docs/user-guide/training.rst | 0 training/docs/user-guide/yaml/dataloader.yaml | 0 .../docs/user-guide/yaml/example_crps_config.yaml | 0 training/pyproject.toml | 0 training/pytest.ini | 0 training/src/anemoi/training/__init__.py | 0 training/src/anemoi/training/__main__.py | 0 training/src/anemoi/training/checkpoint/__init__.py | 0 training/src/anemoi/training/checkpoint/base.py | 0 training/src/anemoi/training/checkpoint/catalog.py | 0 .../src/anemoi/training/checkpoint/exceptions.py | 0 training/src/anemoi/training/checkpoint/formats.py | 0 training/src/anemoi/training/checkpoint/pipeline.py | 0 training/src/anemoi/training/checkpoint/utils.py | 0 training/src/anemoi/training/commands/__init__.py | 0 training/src/anemoi/training/commands/checkpoint.py | 0 training/src/anemoi/training/commands/config.py | 0 training/src/anemoi/training/commands/mlflow.py | 0 training/src/anemoi/training/commands/profiler.py | 0 training/src/anemoi/training/commands/train.py | 0 training/src/anemoi/training/config/__init__.py | 0 .../src/anemoi/training/config/autoencoder.yaml | 0 training/src/anemoi/training/config/config.yaml | 0 training/src/anemoi/training/config/data/multi.yaml | 0 training/src/anemoi/training/config/data/zarr.yaml | 0 .../anemoi/training/config/dataloader/multi.yaml | 0 .../training/config/dataloader/native_grid.yaml | 0 .../diagnostics/benchmark_profiler/detailed.yaml | 0 .../diagnostics/benchmark_profiler/simple.yaml | 0 .../config/diagnostics/callbacks/placeholder.yaml | 0 .../config/diagnostics/callbacks/rollout_eval.yaml | 0 .../training/config/diagnostics/evaluation.yaml | 0 .../training/config/diagnostics/evaluation_ens.yaml | 0 .../config/diagnostics/evaluation_multi.yaml | 0 .../training/config/diagnostics/log/mlflow.yaml | 0 .../training/config/diagnostics/log/wandb.yaml | 0 .../training/config/diagnostics/plot/detailed.yaml | 0 .../training/config/diagnostics/plot/multi.yaml | 0 .../training/config/diagnostics/plot/simple.yaml | 0 training/src/anemoi/training/config/diffusion.yaml | 0 .../src/anemoi/training/config/ensemble_crps.yaml | 0 .../training/config/graph/encoder_decoder_only.yaml | 0 .../src/anemoi/training/config/graph/existing.yaml | 0 .../training/config/graph/hierarchical_2level.yaml | 0 .../hierarchical_2level_encoder_decoder_only.yaml | 0 .../training/config/graph/hierarchical_3level.yaml | 0 .../anemoi/training/config/graph/limited_area.yaml | 0 .../src/anemoi/training/config/graph/multi.yaml | 0 .../anemoi/training/config/graph/multi_scale.yaml | 0 .../anemoi/training/config/graph/point_wise.yaml | 0 .../training/config/graph/stretched_grid.yaml | 0 .../src/anemoi/training/config/hierarchical.yaml | 0 .../training/config/hierarchical_autoencoder.yaml | 0 training/src/anemoi/training/config/lam.yaml | 0 training/src/anemoi/training/config/model/gnn.yaml | 0 .../training/config/model/graphtransformer.yaml | 0 .../config/model/graphtransformer_diffusion.yaml | 0 .../model/graphtransformer_diffusiontend.yaml | 0 .../training/config/model/graphtransformer_ens.yaml | 0 .../anemoi/training/config/model/point_wise.yaml | 0 .../anemoi/training/config/model/transformer.yaml | 0 .../config/model/transformer_diffusion.yaml | 0 .../config/model/transformer_diffusiontend.yaml | 0 .../training/config/model/transformer_ens.yaml | 0 .../config/model/transformer_transformermapper.yaml | 0 training/src/anemoi/training/config/multi.yaml | 0 training/src/anemoi/training/config/point_wise.yaml | 0 training/src/anemoi/training/config/stretched.yaml | 0 .../src/anemoi/training/config/system/example.yaml | 0 .../training/config/system/hardware/example.yaml | 0 .../training/config/system/hardware/slurm.yaml | 0 .../training/config/system/input/example.yaml | 0 .../training/config/system/output/example.yaml | 0 .../src/anemoi/training/config/system/slurm.yaml | 0 .../anemoi/training/config/task/autoencoder.yaml | 0 .../src/anemoi/training/config/task/forecaster.yaml | 0 .../training/config/task/temporal_downscaler.yaml | 0 .../anemoi/training/config/temporal_downscaler.yaml | 0 .../config/temporal_downscaler_ensemble.yaml | 0 .../anemoi/training/config/training/diffusion.yaml | 0 .../anemoi/training/config/training/ensemble.yaml | 0 .../src/anemoi/training/config/training/lam.yaml | 0 .../src/anemoi/training/config/training/multi.yaml | 0 .../config/training/optimization/default.yaml | 0 .../optimization/lr_scheduler/cosine_scheduler.yaml | 0 .../training/optimization/optimizer/adamw.yaml | 0 .../training/optimization/optimizer/ademamix.yaml | 0 .../training/optimization/optimizer/zero.yaml | 0 .../training/config/training/scalers/global.yaml | 0 .../training/config/training/scalers/lam.yaml | 0 .../training/config/training/scalers/multi.yaml | 0 .../training/config/training/scalers/stretched.yaml | 0 .../src/anemoi/training/config/training/single.yaml | 0 .../anemoi/training/config/training/stretched.yaml | 0 .../config/training/training_loss/ensemble.yaml | 0 .../training/training_loss/ensemble_combined.yaml | 0 .../config/training/training_loss/single.yaml | 0 .../training/training_loss/single_combined.yaml | 0 .../config/training/weight_averaging/ema.yaml | 0 .../config/training/weight_averaging/swa.yaml | 0 training/src/anemoi/training/data/__init__.py | 0 training/src/anemoi/training/data/data_reader.py | 0 training/src/anemoi/training/data/datamodule.py | 0 training/src/anemoi/training/data/multidataset.py | 0 .../anemoi/training/data/relative_time_indices.py | 0 training/src/anemoi/training/data/usable_indices.py | 0 .../src/anemoi/training/diagnostics/__init__.py | 0 .../anemoi/training/diagnostics/benchmark_server.py | 0 .../training/diagnostics/callbacks/__init__.py | 0 .../training/diagnostics/callbacks/checkpoint.py | 0 .../training/diagnostics/callbacks/evaluation.py | 0 .../training/diagnostics/callbacks/optimiser.py | 0 .../anemoi/training/diagnostics/callbacks/plot.py | 0 .../training/diagnostics/callbacks/plot_adapter.py | 0 .../training/diagnostics/callbacks/plot_ens.py | 0 .../training/diagnostics/callbacks/profiler.py | 0 .../training/diagnostics/callbacks/provenance.py | 0 .../anemoi/training/diagnostics/callbacks/sanity.py | 0 .../training/diagnostics/callbacks/stopping.py | 0 .../diagnostics/callbacks/weight_averaging.py | 0 .../src/anemoi/training/diagnostics/continents.json | 0 .../anemoi/training/diagnostics/countries.geo.json | 0 .../src/anemoi/training/diagnostics/focus_area.py | 0 training/src/anemoi/training/diagnostics/logger.py | 0 training/src/anemoi/training/diagnostics/maps.py | 0 .../anemoi/training/diagnostics/mlflow/__init__.py | 0 .../anemoi/training/diagnostics/mlflow/azureml.py | 0 .../anemoi/training/diagnostics/mlflow/logger.py | 0 .../mlflow/system_metrics/cpu_monitor.py | 0 .../mlflow/system_metrics/gpu_monitor.py | 0 .../src/anemoi/training/diagnostics/mlflow/utils.py | 0 training/src/anemoi/training/diagnostics/plots.py | 0 .../src/anemoi/training/diagnostics/profilers.py | 0 .../src/anemoi/training/diagnostics/projections.py | 0 .../src/anemoi/training/distributed/__init__.py | 0 training/src/anemoi/training/distributed/groups.py | 0 .../src/anemoi/training/distributed/strategy.py | 0 training/src/anemoi/training/losses/__init__.py | 0 training/src/anemoi/training/losses/aggregate.py | 0 training/src/anemoi/training/losses/base.py | 0 training/src/anemoi/training/losses/combined.py | 0 training/src/anemoi/training/losses/huber.py | 0 training/src/anemoi/training/losses/kcrps.py | 1 - training/src/anemoi/training/losses/logcosh.py | 0 training/src/anemoi/training/losses/loss.py | 0 training/src/anemoi/training/losses/mae.py | 0 training/src/anemoi/training/losses/mse.py | 0 training/src/anemoi/training/losses/multiscale.py | 0 training/src/anemoi/training/losses/rmse.py | 0 .../src/anemoi/training/losses/scaler_tensor.py | 0 .../src/anemoi/training/losses/scalers/__init__.py | 0 .../anemoi/training/losses/scalers/base_scaler.py | 0 .../training/losses/scalers/loss_weights_mask.py | 0 .../training/losses/scalers/node_attributes.py | 0 .../src/anemoi/training/losses/scalers/scalers.py | 0 .../src/anemoi/training/losses/scalers/time_step.py | 0 .../src/anemoi/training/losses/scalers/variable.py | 0 .../training/losses/scalers/variable_level.py | 0 .../training/losses/scalers/variable_masking.py | 0 .../training/losses/scalers/variable_tendency.py | 0 training/src/anemoi/training/losses/spectral.py | 0 training/src/anemoi/training/losses/utils.py | 0 .../src/anemoi/training/losses/variable_mapper.py | 0 training/src/anemoi/training/losses/weighted_mse.py | 0 training/src/anemoi/training/optimizers/AdEMAMix.py | 0 training/src/anemoi/training/schemas/__init__.py | 0 training/src/anemoi/training/schemas/base_schema.py | 0 training/src/anemoi/training/schemas/data.py | 0 training/src/anemoi/training/schemas/dataloader.py | 0 training/src/anemoi/training/schemas/diagnostics.py | 0 .../src/anemoi/training/schemas/schema_utils.py | 0 training/src/anemoi/training/schemas/system.py | 0 training/src/anemoi/training/schemas/tasks.py | 0 training/src/anemoi/training/schemas/training.py | 0 training/src/anemoi/training/tasks/__init__.py | 0 training/src/anemoi/training/tasks/base.py | 0 training/src/anemoi/training/tasks/forecaster.py | 0 .../anemoi/training/tasks/temporal_downscaler.py | 0 training/src/anemoi/training/tasks/timeless.py | 0 training/src/anemoi/training/train/__init__.py | 0 .../src/anemoi/training/train/methods/__init__.py | 0 training/src/anemoi/training/train/methods/base.py | 0 .../src/anemoi/training/train/methods/diffusion.py | 0 .../src/anemoi/training/train/methods/ensemble.py | 0 .../src/anemoi/training/train/methods/single.py | 0 training/src/anemoi/training/train/profiler.py | 0 training/src/anemoi/training/train/train.py | 0 training/src/anemoi/training/utils/__init__.py | 0 training/src/anemoi/training/utils/checkpoint.py | 0 .../src/anemoi/training/utils/custom_colormaps.py | 0 training/src/anemoi/training/utils/enums.py | 0 training/src/anemoi/training/utils/index_space.py | 0 training/src/anemoi/training/utils/jsonify.py | 0 training/src/anemoi/training/utils/masks.py | 0 training/src/anemoi/training/utils/mlflow_sync.py | 0 training/src/anemoi/training/utils/seeding.py | 0 training/src/anemoi/training/utils/time_indices.py | 0 .../src/anemoi/training/utils/variables_metadata.py | 0 training/src/anemoi/training/utils/worker_init.py | 0 .../src/hydra_plugins/anemoi_searchpath/__init__.py | 0 .../anemoi_searchpath/anemoi_searchpath_plugin.py | 0 training/tests/conftest.py | 0 .../aicon/test_cicd_aicon_04_icon-dream_medium.py | 0 .../aicon/test_cicd_aicon_04_icon-dream_medium.yaml | 0 .../tests/integration/config/benchmark/base.yaml | 0 .../integration/config/benchmark/diffusiontend.yaml | 0 .../integration/config/benchmark/ensemble_crps.yaml | 0 .../config/benchmark/graphtransformer.yaml | 0 .../tests/integration/config/benchmark/lam.yaml | 0 .../integration/config/benchmark/stretched.yaml | 0 .../integration/config/imputer_modifications.yaml | 0 .../tests/integration/config/test_autoencoder.yaml | 0 .../tests/integration/config/test_diffusion.yaml | 0 .../integration/config/test_ensemble_crps.yaml | 0 .../tests/integration/config/test_filtering.yaml | 0 training/tests/integration/config/test_global.yaml | 0 training/tests/integration/config/test_lam.yaml | 0 .../integration/config/test_multidatasets.yaml | 0 .../tests/integration/config/test_stretched.yaml | 0 .../config/test_temporal_downscaler.yaml | 0 .../config/test_temporal_downscaler_ensemble.yaml | 0 .../integration/config/testing_modifications.yaml | 0 training/tests/integration/conftest.py | 0 .../integration/schemas/partial_metadata_schema.py | 0 .../tests/integration/scripts/update_slt_configs.py | 0 training/tests/integration/test_benchmark.py | 0 training/tests/integration/test_training_cycle.py | 0 training/tests/unit/checkpoint/conftest.py | 0 training/tests/unit/checkpoint/test_base.py | 0 training/tests/unit/checkpoint/test_catalog.py | 0 training/tests/unit/checkpoint/test_exceptions.py | 0 training/tests/unit/checkpoint/test_formats.py | 0 training/tests/unit/checkpoint/test_pipeline.py | 0 training/tests/unit/checkpoint/test_utils.py | 0 training/tests/unit/commands/test_config.py | 0 training/tests/unit/commands/test_mlflow.py | 0 training/tests/unit/conftest.py | 0 training/tests/unit/data/test_dataset.py | 0 training/tests/unit/data/test_multidataset.py | 0 .../tests/unit/data/test_relative_time_indices.py | 0 training/tests/unit/data/test_usable_indices.py | 0 .../unit/diagnostics/callbacks/test_timelimit.py | 0 .../diagnostics/callbacks/test_variable_order.py | 0 .../diagnostics/callbacks/test_weight_averaging.py | 0 .../mlflow/test_azureml_mlflow_logger.py | 0 .../unit/diagnostics/mlflow/test_mlflow_logger.py | 0 .../unit/diagnostics/mlflow/test_mlflow_utils.py | 0 training/tests/unit/diagnostics/test_callbacks.py | 0 training/tests/unit/diagnostics/test_checkpoint.py | 0 training/tests/unit/diagnostics/test_focus_area.py | 0 .../tests/unit/diagnostics/test_plot_adapters.py | 0 .../unit/diagnostics/test_plotting_callbacks.py | 0 .../unit/diagnostics/test_plotting_ens_callbacks.py | 0 .../tests/unit/diagnostics/test_weightandbiases.py | 0 training/tests/unit/distributed/test_groups.py | 0 .../tests/unit/hydra/test_search_path_plugins.py | 0 training/tests/unit/losses/test_aggregate_loss.py | 0 training/tests/unit/losses/test_combined_loss.py | 0 training/tests/unit/losses/test_filtered_loss.py | 0 training/tests/unit/losses/test_loss_function.py | 0 training/tests/unit/losses/test_loss_scaling.py | 0 training/tests/unit/losses/test_multiscale_loss.py | 0 training/tests/unit/losses/test_scaler.py | 0 training/tests/unit/requirements.txt | 0 training/tests/unit/schemas/test_expand_paths.py | 0 .../tests/unit/schemas/test_training_schemas.py | 0 training/tests/unit/tasks/test_autoencoder.py | 0 training/tests/unit/tasks/test_forecaster.py | 0 .../tests/unit/tasks/test_temporal_downscaler.py | 0 .../tests/unit/train/test_checkpoint_loading.py | 0 training/tests/unit/train/test_methods.py | 0 training/tests/unit/train/test_optimizer.py | 0 .../tests/unit/train/test_print_variable_scaling.py | 0 training/tests/unit/train/test_profiler.py | 0 training/tests/unit/train/test_restarting_run.py | 0 training/tests/unit/utils/test_masks.py | 0 training/tests/unit/utils/test_seeding.py | 0 training/tests/unit/utils/test_time_indices.py | 0 training/tests/unit/utils/test_variable_grouping.py | 0 741 files changed, 1 deletion(-) mode change 100755 => 100644 .github/CODEOWNERS mode change 100755 => 100644 .github/dependabot.yml mode change 100755 => 100644 .github/labeler.yml mode change 100755 => 100644 .github/pull_request_template.md mode change 100755 => 100644 .github/workflows/inactivity-bot.yml mode change 100755 => 100644 .github/workflows/integration-tests-hpc.yml mode change 100755 => 100644 .github/workflows/pr-conventional-commit.yml mode change 100755 => 100644 .github/workflows/pr-label-ats.yml mode change 100755 => 100644 .github/workflows/pr-label-conventional-commits.yml mode change 100755 => 100644 .github/workflows/pr-label-file-based.yml mode change 100755 => 100644 .github/workflows/pr-label-public.yml mode change 100755 => 100644 .github/workflows/pr-release.yml mode change 100755 => 100644 .github/workflows/push-to-private.yml mode change 100755 => 100644 .github/workflows/python-publish.yml mode change 100755 => 100644 .github/workflows/python-pull-request.yml mode change 100755 => 100644 .github/workflows/readthedocs-pr-update.yml mode change 100755 => 100644 .github/workflows/release-please.yml mode change 100755 => 100644 .gitignore mode change 100755 => 100644 .isort.cfg mode change 100755 => 100644 .pre-commit-config.yaml mode change 100755 => 100644 .release-please-config.json mode change 100755 => 100644 .release-please-manifest.json mode change 100755 => 100644 CONTRIBUTORS.md mode change 100755 => 100644 LICENCES/APPLE_ML_ACKNOWLEDGEMENTS mode change 100755 => 100644 LICENCES/APPLE_ML_ADEMAMIX_LICENSE mode change 100755 => 100644 LICENSE mode change 100755 => 100644 NOTICE.md mode change 100755 => 100644 README.md mode change 100755 => 100644 graphs/.gitattributes mode change 100755 => 100644 graphs/.gitignore mode change 100755 => 100644 graphs/.readthedocs.yaml mode change 100755 => 100644 graphs/CHANGELOG.md mode change 100755 => 100644 graphs/CONTRIBUTORS.md mode change 100755 => 100644 graphs/LICENSE mode change 100755 => 100644 graphs/README.md mode change 100755 => 100644 graphs/docs/Makefile mode change 100755 => 100644 graphs/docs/_static/cutoff.jpg mode change 100755 => 100644 graphs/docs/_static/enc_proc_dec.png mode change 100755 => 100644 graphs/docs/_static/graph_configurations.png mode change 100755 => 100644 graphs/docs/_static/hetero_data_graph.txt mode change 100755 => 100644 graphs/docs/_static/logo.png mode change 100755 => 100644 graphs/docs/_static/multi_scale_edges.svg mode change 100755 => 100644 graphs/docs/_static/processor.html mode change 100755 => 100644 graphs/docs/_static/style.css mode change 100755 => 100644 graphs/docs/_static/trinodes.png mode change 100755 => 100644 graphs/docs/_templates/.gitkeep mode change 100755 => 100644 graphs/docs/cli/introduction.rst mode change 100755 => 100644 graphs/docs/conf.py mode change 100755 => 100644 graphs/docs/contributing.rst mode change 100755 => 100644 graphs/docs/graphs/edge_attributes.rst mode change 100755 => 100644 graphs/docs/graphs/edges.rst mode change 100755 => 100644 graphs/docs/graphs/edges/cutoff.rst mode change 100755 => 100644 graphs/docs/graphs/edges/knn.rst mode change 100755 => 100644 graphs/docs/graphs/edges/multi_scale.rst mode change 100755 => 100644 graphs/docs/graphs/edges/tri_refined_edges.csv mode change 100755 => 100644 graphs/docs/graphs/introduction.rst mode change 100755 => 100644 graphs/docs/graphs/node_attributes.rst mode change 100755 => 100644 graphs/docs/graphs/node_attributes/anemoi_dataset_attribute.rst mode change 100755 => 100644 graphs/docs/graphs/node_attributes/area_masks.rst mode change 100755 => 100644 graphs/docs/graphs/node_attributes/boolean_operations.rst mode change 100755 => 100644 graphs/docs/graphs/node_attributes/weights.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/anemoi_dataset.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/healpix.csv mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/healpix.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/hex_refined.csv mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/hex_refined_icosahedron.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/icon_mesh.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/latlon_arrays.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/npz_file.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/reduced_gaussian.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/text_file.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/tri_nodes.csv mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/tri_refined_icosahedron.rst mode change 100755 => 100644 graphs/docs/graphs/node_coordinates/xarray_file.rst mode change 100755 => 100644 graphs/docs/graphs/post_processor.rst mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_boolean_operation.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_cosine_lat_weighted.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_custom_area_weights.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_cutout.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_grids.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_isolatitude_area_weights.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_lam_mask.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_masked_planar_area_weights.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_nonmissingzarr.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_nonzerozarr.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_planar_area_weights.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_spherical_area_weights.yaml mode change 100755 => 100644 graphs/docs/graphs/yaml/attributes_uniform_weights.yaml mode change 100755 => 100644 graphs/docs/index.rst mode change 100755 => 100644 graphs/docs/installing.rst mode change 100755 => 100644 graphs/docs/modules/edge_attributes.rst mode change 100755 => 100644 graphs/docs/modules/edge_builder.rst mode change 100755 => 100644 graphs/docs/modules/graph_creator.rst mode change 100755 => 100644 graphs/docs/modules/graph_inspector.rst mode change 100755 => 100644 graphs/docs/modules/node_attributes.rst mode change 100755 => 100644 graphs/docs/modules/node_builder.rst mode change 100755 => 100644 graphs/docs/modules/post_processor.rst mode change 100755 => 100644 graphs/docs/modules/schemas.rst mode change 100755 => 100644 graphs/docs/overview.rst mode change 100755 => 100644 graphs/docs/usage/create_sparse_matrices.rst mode change 100755 => 100644 graphs/docs/usage/getting_started.rst mode change 100755 => 100644 graphs/docs/usage/limited_area.rst mode change 100755 => 100644 graphs/docs/usage/schemas/global.excalidraw mode change 100755 => 100644 graphs/docs/usage/schemas/global.png mode change 100755 => 100644 graphs/docs/usage/schemas/global_wo-proc.excalidraw mode change 100755 => 100644 graphs/docs/usage/schemas/global_wo-proc.png mode change 100755 => 100644 graphs/docs/usage/yaml/cutout_zarr.yaml mode change 100755 => 100644 graphs/docs/usage/yaml/global.txt mode change 100755 => 100644 graphs/docs/usage/yaml/global.yaml mode change 100755 => 100644 graphs/docs/usage/yaml/global_with-attrs.txt mode change 100755 => 100644 graphs/docs/usage/yaml/global_with-attrs.yaml mode change 100755 => 100644 graphs/docs/usage/yaml/global_wo-proc.png mode change 100755 => 100644 graphs/docs/usage/yaml/global_wo-proc.txt mode change 100755 => 100644 graphs/docs/usage/yaml/global_wo-proc.yaml mode change 100755 => 100644 graphs/docs/usage/yaml/lam_nodes_wo_boundary.yaml mode change 100755 => 100644 graphs/docs/usage/yaml/limited_area_nodes.yaml mode change 100755 => 100644 graphs/docs/usage/yaml/nodes.yaml mode change 100755 => 100644 graphs/docs/usage/yaml/nodes_with-attrs.yaml mode change 100755 => 100644 graphs/docs/usage/yaml/sparse_matrices.yaml mode change 100755 => 100644 graphs/pyproject.toml mode change 100755 => 100644 graphs/src/anemoi/graphs/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/__main__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/commands/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/commands/create.py mode change 100755 => 100644 graphs/src/anemoi/graphs/commands/describe.py mode change 100755 => 100644 graphs/src/anemoi/graphs/commands/export_to_sparse.py mode change 100755 => 100644 graphs/src/anemoi/graphs/commands/inspect.py mode change 100755 => 100644 graphs/src/anemoi/graphs/create.py mode change 100755 => 100644 graphs/src/anemoi/graphs/describe.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/attributes.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/builders/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/builders/base.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/builders/cutoff.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/builders/healpix.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/builders/icon.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/builders/knn.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/builders/masking.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/builders/multi_scale.py mode change 100755 => 100644 graphs/src/anemoi/graphs/edges/directional.py mode change 100755 => 100644 graphs/src/anemoi/graphs/export.py mode change 100755 => 100644 graphs/src/anemoi/graphs/generate/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/generate/healpix.py mode change 100755 => 100644 graphs/src/anemoi/graphs/generate/hex_icosahedron.py mode change 100755 => 100644 graphs/src/anemoi/graphs/generate/icon_mesh.py mode change 100755 => 100644 graphs/src/anemoi/graphs/generate/masks.py mode change 100755 => 100644 graphs/src/anemoi/graphs/generate/multi_scale_edges.py mode change 100755 => 100644 graphs/src/anemoi/graphs/generate/transforms.py mode change 100755 => 100644 graphs/src/anemoi/graphs/generate/tri_icosahedron.py mode change 100755 => 100644 graphs/src/anemoi/graphs/generate/utils.py mode change 100755 => 100644 graphs/src/anemoi/graphs/inspect.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/attributes/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/attributes/area_weights.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/attributes/base_attributes.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/attributes/boolean_op.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/attributes/masks.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/builders/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/builders/base.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/builders/from_file.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/builders/from_healpix.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/builders/from_icon.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/builders/from_reduced_gaussian.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/builders/from_refined_icosahedron.py mode change 100755 => 100644 graphs/src/anemoi/graphs/nodes/builders/from_vectors.py mode change 100755 => 100644 graphs/src/anemoi/graphs/normalise.py mode change 100755 => 100644 graphs/src/anemoi/graphs/plotting/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/plotting/displots.py mode change 100755 => 100644 graphs/src/anemoi/graphs/plotting/interactive_2d_html.py mode change 100755 => 100644 graphs/src/anemoi/graphs/plotting/interactive_3d.html.jinja mode change 100755 => 100644 graphs/src/anemoi/graphs/plotting/interactive_3d_html.py mode change 100755 => 100644 graphs/src/anemoi/graphs/plotting/prepare.py mode change 100755 => 100644 graphs/src/anemoi/graphs/processors/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/processors/post_process.py mode change 100755 => 100644 graphs/src/anemoi/graphs/schemas/__init__.py mode change 100755 => 100644 graphs/src/anemoi/graphs/schemas/base_graph.py mode change 100755 => 100644 graphs/src/anemoi/graphs/schemas/edge_attributes_schemas.py mode change 100755 => 100644 graphs/src/anemoi/graphs/schemas/edge_schemas.py mode change 100755 => 100644 graphs/src/anemoi/graphs/schemas/node_attributes_schemas.py mode change 100755 => 100644 graphs/src/anemoi/graphs/schemas/node_schemas.py mode change 100755 => 100644 graphs/src/anemoi/graphs/schemas/normalise.py mode change 100755 => 100644 graphs/src/anemoi/graphs/schemas/post_processors.py mode change 100755 => 100644 graphs/src/anemoi/graphs/utils.py mode change 100755 => 100644 graphs/tests/conftest.py mode change 100755 => 100644 graphs/tests/edges/test_cutoff.py mode change 100755 => 100644 graphs/tests/edges/test_direction.py mode change 100755 => 100644 graphs/tests/edges/test_edge_attributes.py mode change 100755 => 100644 graphs/tests/edges/test_healpix_multiscale.py mode change 100755 => 100644 graphs/tests/edges/test_icon_edges.py mode change 100755 => 100644 graphs/tests/edges/test_knn.py mode change 100755 => 100644 graphs/tests/edges/test_multiscale_edges.py mode change 100755 => 100644 graphs/tests/generate/test_mask_builder.py mode change 100755 => 100644 graphs/tests/generate/test_transforms.py mode change 100755 => 100644 graphs/tests/nodes/attributes/test_base.py mode change 100755 => 100644 graphs/tests/nodes/attributes/test_boolean_operations.py mode change 100755 => 100644 graphs/tests/nodes/attributes/test_masks.py mode change 100755 => 100644 graphs/tests/nodes/attributes/test_weights.py mode change 100755 => 100644 graphs/tests/nodes/test_anemoi_dataset.py mode change 100755 => 100644 graphs/tests/nodes/test_arrays.py mode change 100755 => 100644 graphs/tests/nodes/test_cutout_nodes.py mode change 100755 => 100644 graphs/tests/nodes/test_from_xarray.py mode change 100755 => 100644 graphs/tests/nodes/test_healpix.py mode change 100755 => 100644 graphs/tests/nodes/test_hex_nodes.py mode change 100755 => 100644 graphs/tests/nodes/test_icon_nodes.py mode change 100755 => 100644 graphs/tests/nodes/test_npz.py mode change 100755 => 100644 graphs/tests/nodes/test_reduced_gaussian.py mode change 100755 => 100644 graphs/tests/nodes/test_tri_nodes.py mode change 100755 => 100644 graphs/tests/processors/test_post_process.py mode change 100755 => 100644 graphs/tests/test_create.py mode change 100755 => 100644 graphs/tests/test_normaliser.py mode change 100755 => 100644 graphs/tests/test_utils.py mode change 100755 => 100644 models/.gitattributes mode change 100755 => 100644 models/.gitignore mode change 100755 => 100644 models/.readthedocs.yaml mode change 100755 => 100644 models/CHANGELOG.md mode change 100755 => 100644 models/CONTRIBUTORS.md mode change 100755 => 100644 models/LICENSE mode change 100755 => 100644 models/README.md mode change 100755 => 100644 models/docs/Makefile mode change 100755 => 100644 models/docs/_static/anemoi-models_schematic.drawio mode change 100755 => 100644 models/docs/_static/anemoi-models_schematic.png mode change 100755 => 100644 models/docs/_static/data_indices.drawio mode change 100755 => 100644 models/docs/_static/data_indices.png mode change 100755 => 100644 models/docs/_static/logo.png mode change 100755 => 100644 models/docs/_static/preprocessing_remapper_atanh.png mode change 100755 => 100644 models/docs/_static/preprocessing_remapper_boxcox.png mode change 100755 => 100644 models/docs/_static/preprocessing_remapper_power.png mode change 100755 => 100644 models/docs/_static/style.css mode change 100755 => 100644 models/docs/_templates/.gitkeep mode change 100755 => 100644 models/docs/cli/migration.rst mode change 100755 => 100644 models/docs/conf.py mode change 100755 => 100644 models/docs/contributing.rst mode change 100755 => 100644 models/docs/create-migrations.rst mode change 100755 => 100644 models/docs/index.rst mode change 100755 => 100644 models/docs/introduction/installing.rst mode change 100755 => 100644 models/docs/introduction/overview.rst mode change 100755 => 100644 models/docs/modules/activations.rst mode change 100755 => 100644 models/docs/modules/data_indices.rst mode change 100755 => 100644 models/docs/modules/distributed.rst mode change 100755 => 100644 models/docs/modules/interface.rst mode change 100755 => 100644 models/docs/modules/layers.rst mode change 100755 => 100644 models/docs/modules/migrations.rst mode change 100755 => 100644 models/docs/modules/models.rst mode change 100755 => 100644 models/docs/modules/normalization.rst mode change 100755 => 100644 models/docs/modules/preprocessing.rst mode change 100755 => 100644 models/docs/modules/residual.rst mode change 100755 => 100644 models/docs/modules/schemas.rst mode change 100755 => 100644 models/docs/usage/create_model.rst mode change 100755 => 100644 models/pyproject.toml mode change 100755 => 100644 models/pytest.ini mode change 100755 => 100644 models/src/anemoi/models/__init__.py mode change 100755 => 100644 models/src/anemoi/models/__main__.py mode change 100755 => 100644 models/src/anemoi/models/commands/__init__.py mode change 100755 => 100644 models/src/anemoi/models/commands/hello.py mode change 100755 => 100644 models/src/anemoi/models/commands/migration.py mode change 100755 => 100644 models/src/anemoi/models/data_indices/__init__.py mode change 100755 => 100644 models/src/anemoi/models/data_indices/collection.py mode change 100755 => 100644 models/src/anemoi/models/data_indices/index.py mode change 100755 => 100644 models/src/anemoi/models/data_indices/tensor.py mode change 100755 => 100644 models/src/anemoi/models/distributed/__init__.py mode change 100755 => 100644 models/src/anemoi/models/distributed/balanced_partition.py mode change 100755 => 100644 models/src/anemoi/models/distributed/graph.py mode change 100755 => 100644 models/src/anemoi/models/distributed/khop_edges.py mode change 100755 => 100644 models/src/anemoi/models/distributed/primitives.py mode change 100755 => 100644 models/src/anemoi/models/distributed/shapes.py mode change 100755 => 100644 models/src/anemoi/models/distributed/transformer.py mode change 100755 => 100644 models/src/anemoi/models/distributed/utils.py mode change 100755 => 100644 models/src/anemoi/models/interface/__init__.py mode change 100755 => 100644 models/src/anemoi/models/layers/__init__.py mode change 100755 => 100644 models/src/anemoi/models/layers/activations.py mode change 100755 => 100644 models/src/anemoi/models/layers/attention.py mode change 100755 => 100644 models/src/anemoi/models/layers/block.py mode change 100755 => 100644 models/src/anemoi/models/layers/bounding.py mode change 100755 => 100644 models/src/anemoi/models/layers/conv.py mode change 100755 => 100644 models/src/anemoi/models/layers/diffusion.py mode change 100755 => 100644 models/src/anemoi/models/layers/ensemble.py mode change 100755 => 100644 models/src/anemoi/models/layers/graph.py mode change 100755 => 100644 models/src/anemoi/models/layers/graph_provider.py mode change 100755 => 100644 models/src/anemoi/models/layers/mapper.py mode change 100755 => 100644 models/src/anemoi/models/layers/mlp.py mode change 100755 => 100644 models/src/anemoi/models/layers/normalization.py mode change 100755 => 100644 models/src/anemoi/models/layers/processor.py mode change 100755 => 100644 models/src/anemoi/models/layers/residual.py mode change 100755 => 100644 models/src/anemoi/models/layers/sparse_projector.py mode change 100755 => 100644 models/src/anemoi/models/layers/spectral_helpers.py mode change 100755 => 100644 models/src/anemoi/models/layers/spectral_transforms.py mode change 100755 => 100644 models/src/anemoi/models/layers/utils.py mode change 100755 => 100644 models/src/anemoi/models/migrations/__init__.py mode change 100755 => 100644 models/src/anemoi/models/migrations/migrator.py mode change 100755 => 100644 models/src/anemoi/models/migrations/scripts/1755530253_initial.py mode change 100755 => 100644 models/src/anemoi/models/migrations/scripts/1762857427_deprecate_eda.py mode change 100755 => 100644 models/src/anemoi/models/migrations/scripts/1762857428_chunking_fix.py mode change 100755 => 100644 models/src/anemoi/models/migrations/scripts/1763479917_hardware_schema_update.py mode change 100755 => 100644 models/src/anemoi/models/migrations/scripts/1763479918_refactor_mapper.py mode change 100755 => 100644 models/src/anemoi/models/migrations/scripts/1767108147_move_to_multiple_datasets.py mode change 100755 => 100644 models/src/anemoi/models/migrations/scripts/1773048851_fuse_multiple_perdataset_graphs.py mode change 100755 => 100644 models/src/anemoi/models/migrations/scripts/1776237003_rename_swa_to_weight_averaging.py mode change 100755 => 100644 models/src/anemoi/models/migrations/setup_context.py mode change 100755 => 100644 models/src/anemoi/models/models/__init__.py mode change 100755 => 100644 models/src/anemoi/models/models/autoencoder.py mode change 100755 => 100644 models/src/anemoi/models/models/base.py mode change 100755 => 100644 models/src/anemoi/models/models/diffusion_encoder_processor_decoder.py mode change 100755 => 100644 models/src/anemoi/models/models/encoder_processor_decoder.py mode change 100755 => 100644 models/src/anemoi/models/models/ens_encoder_processor_decoder.py mode change 100755 => 100644 models/src/anemoi/models/models/hierarchical.py mode change 100755 => 100644 models/src/anemoi/models/models/hierarchical_autoencoder.py mode change 100755 => 100644 models/src/anemoi/models/preprocessing/__init__.py mode change 100755 => 100644 models/src/anemoi/models/preprocessing/imputer.py mode change 100755 => 100644 models/src/anemoi/models/preprocessing/mappings.py mode change 100755 => 100644 models/src/anemoi/models/preprocessing/normalizer.py mode change 100755 => 100644 models/src/anemoi/models/preprocessing/postprocessor.py mode change 100755 => 100644 models/src/anemoi/models/preprocessing/remapper.py mode change 100755 => 100644 models/src/anemoi/models/samplers/__init__.py mode change 100755 => 100644 models/src/anemoi/models/samplers/diffusion_samplers.py mode change 100755 => 100644 models/src/anemoi/models/schemas/__init__.py mode change 100755 => 100644 models/src/anemoi/models/schemas/common_components.py mode change 100755 => 100644 models/src/anemoi/models/schemas/data_processor.py mode change 100755 => 100644 models/src/anemoi/models/schemas/decoder.py mode change 100755 => 100644 models/src/anemoi/models/schemas/encoder.py mode change 100755 => 100644 models/src/anemoi/models/schemas/models.py mode change 100755 => 100644 models/src/anemoi/models/schemas/processor.py mode change 100755 => 100644 models/src/anemoi/models/schemas/residual.py mode change 100755 => 100644 models/src/anemoi/models/triton/gt.py mode change 100755 => 100644 models/src/anemoi/models/triton/utils.py mode change 100755 => 100644 models/src/anemoi/models/utils/__init__.py mode change 100755 => 100644 models/src/anemoi/models/utils/compile.py mode change 100755 => 100644 models/src/anemoi/models/utils/config.py mode change 100755 => 100644 models/tests/conftest.py mode change 100755 => 100644 models/tests/data_indices/test_collection.py mode change 100755 => 100644 models/tests/data_indices/test_data_indices.py mode change 100755 => 100644 models/tests/distributed/balanced_partition.py mode change 100755 => 100644 models/tests/integration/triton/test_triton_gt.py mode change 100755 => 100644 models/tests/layers/block/test_block_graphconv.py mode change 100755 => 100644 models/tests/layers/block/test_block_graphtransformer.py mode change 100755 => 100644 models/tests/layers/block/test_block_pointwise.py mode change 100755 => 100644 models/tests/layers/block/test_block_transformer.py mode change 100755 => 100644 models/tests/layers/block/test_block_transformermapper.py mode change 100755 => 100644 models/tests/layers/mapper/test_base_mapper.py mode change 100755 => 100644 models/tests/layers/mapper/test_graphconv_mapper.py mode change 100755 => 100644 models/tests/layers/mapper/test_graphtransformer_mapper.py mode change 100755 => 100644 models/tests/layers/mapper/test_pointwise_mapper.py mode change 100755 => 100644 models/tests/layers/mapper/test_transformer_mapper.py mode change 100755 => 100644 models/tests/layers/processor/test_base_processor.py mode change 100755 => 100644 models/tests/layers/processor/test_graphconv_processor.py mode change 100755 => 100644 models/tests/layers/processor/test_graphtransformer_processor.py mode change 100755 => 100644 models/tests/layers/processor/test_pointwise_processor.py mode change 100755 => 100644 models/tests/layers/processor/test_transformer_processor.py mode change 100755 => 100644 models/tests/layers/test_activations.py mode change 100755 => 100644 models/tests/layers/test_attention.py mode change 100755 => 100644 models/tests/layers/test_bounding.py mode change 100755 => 100644 models/tests/layers/test_grad_checkpoint_wiring.py mode change 100755 => 100644 models/tests/layers/test_graph.py mode change 100755 => 100644 models/tests/layers/test_layer_utils.py mode change 100755 => 100644 models/tests/layers/test_mlp.py mode change 100755 => 100644 models/tests/layers/test_noise_embeddings.py mode change 100755 => 100644 models/tests/layers/test_residual.py mode change 100755 => 100644 models/tests/layers/test_sht.py mode change 100755 => 100644 models/tests/migrations/conftest.py mode change 100755 => 100644 models/tests/migrations/migrations/1750840837_add_foo.py mode change 100755 => 100644 models/tests/migrations/migrations/1750841219_add_bar.py mode change 100755 => 100644 models/tests/migrations/migrations/1750859824_add_baz.py mode change 100755 => 100644 models/tests/migrations/migrations/1750859905_rename_baz.py mode change 100755 => 100644 models/tests/migrations/migrations/1751895180_final.py mode change 100755 => 100644 models/tests/migrations/migrations/1751895203_recent.py mode change 100755 => 100644 models/tests/migrations/test_migration_order.py mode change 100755 => 100644 models/tests/migrations/test_migrations.py mode change 100755 => 100644 models/tests/models/test_diffusion_sampling_pipeline.py mode change 100755 => 100644 models/tests/models/test_diffusion_tendency.py mode change 100755 => 100644 models/tests/models/test_models.py mode change 100755 => 100644 models/tests/preprocessing/test_mappings.py mode change 100755 => 100644 models/tests/preprocessing/test_postprocessor.py mode change 100755 => 100644 models/tests/preprocessing/test_preprocessor_imputer.py mode change 100755 => 100644 models/tests/preprocessing/test_preprocessor_normalizer.py mode change 100755 => 100644 models/tests/preprocessing/test_preprocessor_remapper.py mode change 100755 => 100644 models/tests/preprocessing/test_stepwise_processors.py mode change 100755 => 100644 models/tests/samplers/test_diffusion_samplers.py mode change 100755 => 100644 models/tests/schemas/test_data_processors_schemas.py mode change 100755 => 100644 models/tests/schemas/test_model_schemas_pointwise_mappers.py mode change 100755 => 100644 models/tests/utils/test_compile.py mode change 100755 => 100644 training/.gitattributes mode change 100755 => 100644 training/.gitignore mode change 100755 => 100644 training/.readthedocs.yaml mode change 100755 => 100644 training/CHANGELOG.md mode change 100755 => 100644 training/CONTRIBUTORS.md mode change 100755 => 100644 training/LICENSE mode change 100755 => 100644 training/README.md mode change 100755 => 100644 training/docs/Makefile mode change 100755 => 100644 training/docs/_static/logo.png mode change 100755 => 100644 training/docs/_static/style.css mode change 100755 => 100644 training/docs/_templates/.gitkeep mode change 100755 => 100644 training/docs/adrs/adr-001.md mode change 100755 => 100644 training/docs/adrs/adr-002.md mode change 100755 => 100644 training/docs/adrs/template.md mode change 100755 => 100644 training/docs/checkpoint_integration.rst mode change 100755 => 100644 training/docs/checkpoint_pipeline_configuration.rst mode change 100755 => 100644 training/docs/checkpoint_troubleshooting.rst mode change 100755 => 100644 training/docs/conf.py mode change 100755 => 100644 training/docs/contributing.rst mode change 100755 => 100644 training/docs/images/global-sliding-window-attention.png mode change 100755 => 100644 training/docs/images/gnn-encoder-decoder-multimesh.jpg mode change 100755 => 100644 training/docs/images/mlflow/mlflow_compare.png mode change 100755 => 100644 training/docs/images/mlflow/mlflow_constant.png mode change 100755 => 100644 training/docs/images/mlflow/mlflow_resumed_run.png mode change 100755 => 100644 training/docs/images/mlflow/mlflow_run.png mode change 100755 => 100644 training/docs/images/mlflow/mlflow_server.png mode change 100755 => 100644 training/docs/images/model_sharding.png mode change 100755 => 100644 training/docs/images/multi-dataset/downscaling-multi.png mode change 100755 => 100644 training/docs/images/multi-dataset/lam-multi.png mode change 100755 => 100644 training/docs/images/multi-dataset/prog-forc-diag.png mode change 100755 => 100644 training/docs/images/performance-guide/mem-snapshot-1-mapper-chunk.png mode change 100755 => 100644 training/docs/images/performance-guide/mem-snapshot-4-mapper-chunks.png mode change 100755 => 100644 training/docs/images/performance-guide/performance-flowchart.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_architecture.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_benchmark_profiler.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_config.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_high_level.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_mlflow_integration.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_mlflow_integration_2.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_mlflow_integration_3.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_speed_report.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_speedreport_diagram.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_training_rates.png mode change 100755 => 100644 training/docs/images/profiler/anemoi_profiler_validation_rates.png mode change 100755 => 100644 training/docs/images/profiler/example_memory_report.png mode change 100755 => 100644 training/docs/images/profiler/example_memory_timeline.png mode change 100755 => 100644 training/docs/images/profiler/example_model_summary.png mode change 100755 => 100644 training/docs/images/profiler/example_model_summary_2.png mode change 100755 => 100644 training/docs/images/profiler/example_system_report.png mode change 100755 => 100644 training/docs/images/profiler/example_time_report.png mode change 100755 => 100644 training/docs/images/profiler/idle_time_breakdown.png mode change 100755 => 100644 training/docs/images/profiler/kernel_breakdown_dfs.png mode change 100755 => 100644 training/docs/images/profiler/kernel_breakdown_plots.png mode change 100755 => 100644 training/docs/images/profiler/memory_snapshot_diagram.png mode change 100755 => 100644 training/docs/images/profiler/memory_snapshot_output.png mode change 100755 => 100644 training/docs/images/profiler/temporal_breakdown.png mode change 100755 => 100644 training/docs/images/transformer-block.png mode change 100755 => 100644 training/docs/index.rst mode change 100755 => 100644 training/docs/introduction/installing.rst mode change 100755 => 100644 training/docs/introduction/overview.rst mode change 100755 => 100644 training/docs/modules/data.rst mode change 100755 => 100644 training/docs/modules/diagnostics.rst mode change 100755 => 100644 training/docs/modules/losses.rst mode change 100755 => 100644 training/docs/modules/optimization.rst mode change 100755 => 100644 training/docs/modules/schemas.rst mode change 100755 => 100644 training/docs/modules/strategy.rst mode change 100755 => 100644 training/docs/modules/tasks.rst mode change 100755 => 100644 training/docs/modules/train.rst mode change 100755 => 100644 training/docs/troubleshooting.rst mode change 100755 => 100644 training/docs/user-guide/basic-set-up.rst mode change 100755 => 100644 training/docs/user-guide/benchmarking.rst mode change 100755 => 100644 training/docs/user-guide/configuring.rst mode change 100755 => 100644 training/docs/user-guide/distributed.rst mode change 100755 => 100644 training/docs/user-guide/download-era5-o96.rst mode change 100755 => 100644 training/docs/user-guide/hydra-intro.rst mode change 100755 => 100644 training/docs/user-guide/models.rst mode change 100755 => 100644 training/docs/user-guide/multi-datasets.rst mode change 100755 => 100644 training/docs/user-guide/overview.rst mode change 100755 => 100644 training/docs/user-guide/performance-optimisation.rst mode change 100755 => 100644 training/docs/user-guide/tasks.rst mode change 100755 => 100644 training/docs/user-guide/tracking.rst mode change 100755 => 100644 training/docs/user-guide/training-methods.rst mode change 100755 => 100644 training/docs/user-guide/training.rst mode change 100755 => 100644 training/docs/user-guide/yaml/dataloader.yaml mode change 100755 => 100644 training/docs/user-guide/yaml/example_crps_config.yaml mode change 100755 => 100644 training/pyproject.toml mode change 100755 => 100644 training/pytest.ini mode change 100755 => 100644 training/src/anemoi/training/__init__.py mode change 100755 => 100644 training/src/anemoi/training/__main__.py mode change 100755 => 100644 training/src/anemoi/training/checkpoint/__init__.py mode change 100755 => 100644 training/src/anemoi/training/checkpoint/base.py mode change 100755 => 100644 training/src/anemoi/training/checkpoint/catalog.py mode change 100755 => 100644 training/src/anemoi/training/checkpoint/exceptions.py mode change 100755 => 100644 training/src/anemoi/training/checkpoint/formats.py mode change 100755 => 100644 training/src/anemoi/training/checkpoint/pipeline.py mode change 100755 => 100644 training/src/anemoi/training/checkpoint/utils.py mode change 100755 => 100644 training/src/anemoi/training/commands/__init__.py mode change 100755 => 100644 training/src/anemoi/training/commands/checkpoint.py mode change 100755 => 100644 training/src/anemoi/training/commands/config.py mode change 100755 => 100644 training/src/anemoi/training/commands/mlflow.py mode change 100755 => 100644 training/src/anemoi/training/commands/profiler.py mode change 100755 => 100644 training/src/anemoi/training/commands/train.py mode change 100755 => 100644 training/src/anemoi/training/config/__init__.py mode change 100755 => 100644 training/src/anemoi/training/config/autoencoder.yaml mode change 100755 => 100644 training/src/anemoi/training/config/config.yaml mode change 100755 => 100644 training/src/anemoi/training/config/data/multi.yaml mode change 100755 => 100644 training/src/anemoi/training/config/data/zarr.yaml mode change 100755 => 100644 training/src/anemoi/training/config/dataloader/multi.yaml mode change 100755 => 100644 training/src/anemoi/training/config/dataloader/native_grid.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/benchmark_profiler/detailed.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/benchmark_profiler/simple.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/callbacks/placeholder.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/callbacks/rollout_eval.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/evaluation.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/evaluation_ens.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/evaluation_multi.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/log/mlflow.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/log/wandb.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/plot/detailed.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/plot/multi.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diagnostics/plot/simple.yaml mode change 100755 => 100644 training/src/anemoi/training/config/diffusion.yaml mode change 100755 => 100644 training/src/anemoi/training/config/ensemble_crps.yaml mode change 100755 => 100644 training/src/anemoi/training/config/graph/encoder_decoder_only.yaml mode change 100755 => 100644 training/src/anemoi/training/config/graph/existing.yaml mode change 100755 => 100644 training/src/anemoi/training/config/graph/hierarchical_2level.yaml mode change 100755 => 100644 training/src/anemoi/training/config/graph/hierarchical_2level_encoder_decoder_only.yaml mode change 100755 => 100644 training/src/anemoi/training/config/graph/hierarchical_3level.yaml mode change 100755 => 100644 training/src/anemoi/training/config/graph/limited_area.yaml mode change 100755 => 100644 training/src/anemoi/training/config/graph/multi.yaml mode change 100755 => 100644 training/src/anemoi/training/config/graph/multi_scale.yaml mode change 100755 => 100644 training/src/anemoi/training/config/graph/point_wise.yaml mode change 100755 => 100644 training/src/anemoi/training/config/graph/stretched_grid.yaml mode change 100755 => 100644 training/src/anemoi/training/config/hierarchical.yaml mode change 100755 => 100644 training/src/anemoi/training/config/hierarchical_autoencoder.yaml mode change 100755 => 100644 training/src/anemoi/training/config/lam.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/gnn.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/graphtransformer.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/graphtransformer_diffusion.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/graphtransformer_diffusiontend.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/graphtransformer_ens.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/point_wise.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/transformer.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/transformer_diffusion.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/transformer_diffusiontend.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/transformer_ens.yaml mode change 100755 => 100644 training/src/anemoi/training/config/model/transformer_transformermapper.yaml mode change 100755 => 100644 training/src/anemoi/training/config/multi.yaml mode change 100755 => 100644 training/src/anemoi/training/config/point_wise.yaml mode change 100755 => 100644 training/src/anemoi/training/config/stretched.yaml mode change 100755 => 100644 training/src/anemoi/training/config/system/example.yaml mode change 100755 => 100644 training/src/anemoi/training/config/system/hardware/example.yaml mode change 100755 => 100644 training/src/anemoi/training/config/system/hardware/slurm.yaml mode change 100755 => 100644 training/src/anemoi/training/config/system/input/example.yaml mode change 100755 => 100644 training/src/anemoi/training/config/system/output/example.yaml mode change 100755 => 100644 training/src/anemoi/training/config/system/slurm.yaml mode change 100755 => 100644 training/src/anemoi/training/config/task/autoencoder.yaml mode change 100755 => 100644 training/src/anemoi/training/config/task/forecaster.yaml mode change 100755 => 100644 training/src/anemoi/training/config/task/temporal_downscaler.yaml mode change 100755 => 100644 training/src/anemoi/training/config/temporal_downscaler.yaml mode change 100755 => 100644 training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/diffusion.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/ensemble.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/lam.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/multi.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/optimization/default.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/optimization/lr_scheduler/cosine_scheduler.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/optimization/optimizer/adamw.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/optimization/optimizer/ademamix.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/optimization/optimizer/zero.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/scalers/global.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/scalers/lam.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/scalers/multi.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/scalers/stretched.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/single.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/stretched.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/training_loss/ensemble.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/training_loss/single.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/training_loss/single_combined.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/weight_averaging/ema.yaml mode change 100755 => 100644 training/src/anemoi/training/config/training/weight_averaging/swa.yaml mode change 100755 => 100644 training/src/anemoi/training/data/__init__.py mode change 100755 => 100644 training/src/anemoi/training/data/data_reader.py mode change 100755 => 100644 training/src/anemoi/training/data/datamodule.py mode change 100755 => 100644 training/src/anemoi/training/data/multidataset.py mode change 100755 => 100644 training/src/anemoi/training/data/relative_time_indices.py mode change 100755 => 100644 training/src/anemoi/training/data/usable_indices.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/__init__.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/benchmark_server.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/__init__.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/checkpoint.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/evaluation.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/optimiser.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/plot.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/plot_adapter.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/plot_ens.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/profiler.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/provenance.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/sanity.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/stopping.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/callbacks/weight_averaging.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/continents.json mode change 100755 => 100644 training/src/anemoi/training/diagnostics/countries.geo.json mode change 100755 => 100644 training/src/anemoi/training/diagnostics/focus_area.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/logger.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/maps.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/mlflow/__init__.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/mlflow/azureml.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/mlflow/logger.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/mlflow/system_metrics/cpu_monitor.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/mlflow/system_metrics/gpu_monitor.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/mlflow/utils.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/plots.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/profilers.py mode change 100755 => 100644 training/src/anemoi/training/diagnostics/projections.py mode change 100755 => 100644 training/src/anemoi/training/distributed/__init__.py mode change 100755 => 100644 training/src/anemoi/training/distributed/groups.py mode change 100755 => 100644 training/src/anemoi/training/distributed/strategy.py mode change 100755 => 100644 training/src/anemoi/training/losses/__init__.py mode change 100755 => 100644 training/src/anemoi/training/losses/aggregate.py mode change 100755 => 100644 training/src/anemoi/training/losses/base.py mode change 100755 => 100644 training/src/anemoi/training/losses/combined.py mode change 100755 => 100644 training/src/anemoi/training/losses/huber.py mode change 100755 => 100644 training/src/anemoi/training/losses/kcrps.py mode change 100755 => 100644 training/src/anemoi/training/losses/logcosh.py mode change 100755 => 100644 training/src/anemoi/training/losses/loss.py mode change 100755 => 100644 training/src/anemoi/training/losses/mae.py mode change 100755 => 100644 training/src/anemoi/training/losses/mse.py mode change 100755 => 100644 training/src/anemoi/training/losses/multiscale.py mode change 100755 => 100644 training/src/anemoi/training/losses/rmse.py mode change 100755 => 100644 training/src/anemoi/training/losses/scaler_tensor.py mode change 100755 => 100644 training/src/anemoi/training/losses/scalers/__init__.py mode change 100755 => 100644 training/src/anemoi/training/losses/scalers/base_scaler.py mode change 100755 => 100644 training/src/anemoi/training/losses/scalers/loss_weights_mask.py mode change 100755 => 100644 training/src/anemoi/training/losses/scalers/node_attributes.py mode change 100755 => 100644 training/src/anemoi/training/losses/scalers/scalers.py mode change 100755 => 100644 training/src/anemoi/training/losses/scalers/time_step.py mode change 100755 => 100644 training/src/anemoi/training/losses/scalers/variable.py mode change 100755 => 100644 training/src/anemoi/training/losses/scalers/variable_level.py mode change 100755 => 100644 training/src/anemoi/training/losses/scalers/variable_masking.py mode change 100755 => 100644 training/src/anemoi/training/losses/scalers/variable_tendency.py mode change 100755 => 100644 training/src/anemoi/training/losses/spectral.py mode change 100755 => 100644 training/src/anemoi/training/losses/utils.py mode change 100755 => 100644 training/src/anemoi/training/losses/variable_mapper.py mode change 100755 => 100644 training/src/anemoi/training/losses/weighted_mse.py mode change 100755 => 100644 training/src/anemoi/training/optimizers/AdEMAMix.py mode change 100755 => 100644 training/src/anemoi/training/schemas/__init__.py mode change 100755 => 100644 training/src/anemoi/training/schemas/base_schema.py mode change 100755 => 100644 training/src/anemoi/training/schemas/data.py mode change 100755 => 100644 training/src/anemoi/training/schemas/dataloader.py mode change 100755 => 100644 training/src/anemoi/training/schemas/diagnostics.py mode change 100755 => 100644 training/src/anemoi/training/schemas/schema_utils.py mode change 100755 => 100644 training/src/anemoi/training/schemas/system.py mode change 100755 => 100644 training/src/anemoi/training/schemas/tasks.py mode change 100755 => 100644 training/src/anemoi/training/schemas/training.py mode change 100755 => 100644 training/src/anemoi/training/tasks/__init__.py mode change 100755 => 100644 training/src/anemoi/training/tasks/base.py mode change 100755 => 100644 training/src/anemoi/training/tasks/forecaster.py mode change 100755 => 100644 training/src/anemoi/training/tasks/temporal_downscaler.py mode change 100755 => 100644 training/src/anemoi/training/tasks/timeless.py mode change 100755 => 100644 training/src/anemoi/training/train/__init__.py mode change 100755 => 100644 training/src/anemoi/training/train/methods/__init__.py mode change 100755 => 100644 training/src/anemoi/training/train/methods/base.py mode change 100755 => 100644 training/src/anemoi/training/train/methods/diffusion.py mode change 100755 => 100644 training/src/anemoi/training/train/methods/ensemble.py mode change 100755 => 100644 training/src/anemoi/training/train/methods/single.py mode change 100755 => 100644 training/src/anemoi/training/train/profiler.py mode change 100755 => 100644 training/src/anemoi/training/train/train.py mode change 100755 => 100644 training/src/anemoi/training/utils/__init__.py mode change 100755 => 100644 training/src/anemoi/training/utils/checkpoint.py mode change 100755 => 100644 training/src/anemoi/training/utils/custom_colormaps.py mode change 100755 => 100644 training/src/anemoi/training/utils/enums.py mode change 100755 => 100644 training/src/anemoi/training/utils/index_space.py mode change 100755 => 100644 training/src/anemoi/training/utils/jsonify.py mode change 100755 => 100644 training/src/anemoi/training/utils/masks.py mode change 100755 => 100644 training/src/anemoi/training/utils/mlflow_sync.py mode change 100755 => 100644 training/src/anemoi/training/utils/seeding.py mode change 100755 => 100644 training/src/anemoi/training/utils/time_indices.py mode change 100755 => 100644 training/src/anemoi/training/utils/variables_metadata.py mode change 100755 => 100644 training/src/anemoi/training/utils/worker_init.py mode change 100755 => 100644 training/src/hydra_plugins/anemoi_searchpath/__init__.py mode change 100755 => 100644 training/src/hydra_plugins/anemoi_searchpath/anemoi_searchpath_plugin.py mode change 100755 => 100644 training/tests/conftest.py mode change 100755 => 100644 training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.py mode change 100755 => 100644 training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.yaml mode change 100755 => 100644 training/tests/integration/config/benchmark/base.yaml mode change 100755 => 100644 training/tests/integration/config/benchmark/diffusiontend.yaml mode change 100755 => 100644 training/tests/integration/config/benchmark/ensemble_crps.yaml mode change 100755 => 100644 training/tests/integration/config/benchmark/graphtransformer.yaml mode change 100755 => 100644 training/tests/integration/config/benchmark/lam.yaml mode change 100755 => 100644 training/tests/integration/config/benchmark/stretched.yaml mode change 100755 => 100644 training/tests/integration/config/imputer_modifications.yaml mode change 100755 => 100644 training/tests/integration/config/test_autoencoder.yaml mode change 100755 => 100644 training/tests/integration/config/test_diffusion.yaml mode change 100755 => 100644 training/tests/integration/config/test_ensemble_crps.yaml mode change 100755 => 100644 training/tests/integration/config/test_filtering.yaml mode change 100755 => 100644 training/tests/integration/config/test_global.yaml mode change 100755 => 100644 training/tests/integration/config/test_lam.yaml mode change 100755 => 100644 training/tests/integration/config/test_multidatasets.yaml mode change 100755 => 100644 training/tests/integration/config/test_stretched.yaml mode change 100755 => 100644 training/tests/integration/config/test_temporal_downscaler.yaml mode change 100755 => 100644 training/tests/integration/config/test_temporal_downscaler_ensemble.yaml mode change 100755 => 100644 training/tests/integration/config/testing_modifications.yaml mode change 100755 => 100644 training/tests/integration/conftest.py mode change 100755 => 100644 training/tests/integration/schemas/partial_metadata_schema.py mode change 100755 => 100644 training/tests/integration/scripts/update_slt_configs.py mode change 100755 => 100644 training/tests/integration/test_benchmark.py mode change 100755 => 100644 training/tests/integration/test_training_cycle.py mode change 100755 => 100644 training/tests/unit/checkpoint/conftest.py mode change 100755 => 100644 training/tests/unit/checkpoint/test_base.py mode change 100755 => 100644 training/tests/unit/checkpoint/test_catalog.py mode change 100755 => 100644 training/tests/unit/checkpoint/test_exceptions.py mode change 100755 => 100644 training/tests/unit/checkpoint/test_formats.py mode change 100755 => 100644 training/tests/unit/checkpoint/test_pipeline.py mode change 100755 => 100644 training/tests/unit/checkpoint/test_utils.py mode change 100755 => 100644 training/tests/unit/commands/test_config.py mode change 100755 => 100644 training/tests/unit/commands/test_mlflow.py mode change 100755 => 100644 training/tests/unit/conftest.py mode change 100755 => 100644 training/tests/unit/data/test_dataset.py mode change 100755 => 100644 training/tests/unit/data/test_multidataset.py mode change 100755 => 100644 training/tests/unit/data/test_relative_time_indices.py mode change 100755 => 100644 training/tests/unit/data/test_usable_indices.py mode change 100755 => 100644 training/tests/unit/diagnostics/callbacks/test_timelimit.py mode change 100755 => 100644 training/tests/unit/diagnostics/callbacks/test_variable_order.py mode change 100755 => 100644 training/tests/unit/diagnostics/callbacks/test_weight_averaging.py mode change 100755 => 100644 training/tests/unit/diagnostics/mlflow/test_azureml_mlflow_logger.py mode change 100755 => 100644 training/tests/unit/diagnostics/mlflow/test_mlflow_logger.py mode change 100755 => 100644 training/tests/unit/diagnostics/mlflow/test_mlflow_utils.py mode change 100755 => 100644 training/tests/unit/diagnostics/test_callbacks.py mode change 100755 => 100644 training/tests/unit/diagnostics/test_checkpoint.py mode change 100755 => 100644 training/tests/unit/diagnostics/test_focus_area.py mode change 100755 => 100644 training/tests/unit/diagnostics/test_plot_adapters.py mode change 100755 => 100644 training/tests/unit/diagnostics/test_plotting_callbacks.py mode change 100755 => 100644 training/tests/unit/diagnostics/test_plotting_ens_callbacks.py mode change 100755 => 100644 training/tests/unit/diagnostics/test_weightandbiases.py mode change 100755 => 100644 training/tests/unit/distributed/test_groups.py mode change 100755 => 100644 training/tests/unit/hydra/test_search_path_plugins.py mode change 100755 => 100644 training/tests/unit/losses/test_aggregate_loss.py mode change 100755 => 100644 training/tests/unit/losses/test_combined_loss.py mode change 100755 => 100644 training/tests/unit/losses/test_filtered_loss.py mode change 100755 => 100644 training/tests/unit/losses/test_loss_function.py mode change 100755 => 100644 training/tests/unit/losses/test_loss_scaling.py mode change 100755 => 100644 training/tests/unit/losses/test_multiscale_loss.py mode change 100755 => 100644 training/tests/unit/losses/test_scaler.py mode change 100755 => 100644 training/tests/unit/requirements.txt mode change 100755 => 100644 training/tests/unit/schemas/test_expand_paths.py mode change 100755 => 100644 training/tests/unit/schemas/test_training_schemas.py mode change 100755 => 100644 training/tests/unit/tasks/test_autoencoder.py mode change 100755 => 100644 training/tests/unit/tasks/test_forecaster.py mode change 100755 => 100644 training/tests/unit/tasks/test_temporal_downscaler.py mode change 100755 => 100644 training/tests/unit/train/test_checkpoint_loading.py mode change 100755 => 100644 training/tests/unit/train/test_methods.py mode change 100755 => 100644 training/tests/unit/train/test_optimizer.py mode change 100755 => 100644 training/tests/unit/train/test_print_variable_scaling.py mode change 100755 => 100644 training/tests/unit/train/test_profiler.py mode change 100755 => 100644 training/tests/unit/train/test_restarting_run.py mode change 100755 => 100644 training/tests/unit/utils/test_masks.py mode change 100755 => 100644 training/tests/unit/utils/test_seeding.py mode change 100755 => 100644 training/tests/unit/utils/test_time_indices.py mode change 100755 => 100644 training/tests/unit/utils/test_variable_grouping.py diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS old mode 100755 new mode 100644 diff --git a/.github/dependabot.yml b/.github/dependabot.yml old mode 100755 new mode 100644 diff --git a/.github/labeler.yml b/.github/labeler.yml old mode 100755 new mode 100644 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md old mode 100755 new mode 100644 diff --git a/.github/workflows/inactivity-bot.yml b/.github/workflows/inactivity-bot.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/integration-tests-hpc.yml b/.github/workflows/integration-tests-hpc.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/pr-conventional-commit.yml b/.github/workflows/pr-conventional-commit.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/pr-label-ats.yml b/.github/workflows/pr-label-ats.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/pr-label-conventional-commits.yml b/.github/workflows/pr-label-conventional-commits.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/pr-label-file-based.yml b/.github/workflows/pr-label-file-based.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/pr-label-public.yml b/.github/workflows/pr-label-public.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/pr-release.yml b/.github/workflows/pr-release.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/push-to-private.yml b/.github/workflows/push-to-private.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/python-pull-request.yml b/.github/workflows/python-pull-request.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/readthedocs-pr-update.yml b/.github/workflows/readthedocs-pr-update.yml old mode 100755 new mode 100644 diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml old mode 100755 new mode 100644 diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/.isort.cfg b/.isort.cfg old mode 100755 new mode 100644 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml old mode 100755 new mode 100644 diff --git a/.release-please-config.json b/.release-please-config.json old mode 100755 new mode 100644 diff --git a/.release-please-manifest.json b/.release-please-manifest.json old mode 100755 new mode 100644 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md old mode 100755 new mode 100644 diff --git a/LICENCES/APPLE_ML_ACKNOWLEDGEMENTS b/LICENCES/APPLE_ML_ACKNOWLEDGEMENTS old mode 100755 new mode 100644 diff --git a/LICENCES/APPLE_ML_ADEMAMIX_LICENSE b/LICENCES/APPLE_ML_ADEMAMIX_LICENSE old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/NOTICE.md b/NOTICE.md old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/graphs/.gitattributes b/graphs/.gitattributes old mode 100755 new mode 100644 diff --git a/graphs/.gitignore b/graphs/.gitignore old mode 100755 new mode 100644 diff --git a/graphs/.readthedocs.yaml b/graphs/.readthedocs.yaml old mode 100755 new mode 100644 diff --git a/graphs/CHANGELOG.md b/graphs/CHANGELOG.md old mode 100755 new mode 100644 diff --git a/graphs/CONTRIBUTORS.md b/graphs/CONTRIBUTORS.md old mode 100755 new mode 100644 diff --git a/graphs/LICENSE b/graphs/LICENSE old mode 100755 new mode 100644 diff --git a/graphs/README.md b/graphs/README.md old mode 100755 new mode 100644 diff --git a/graphs/docs/Makefile b/graphs/docs/Makefile old mode 100755 new mode 100644 diff --git a/graphs/docs/_static/cutoff.jpg b/graphs/docs/_static/cutoff.jpg old mode 100755 new mode 100644 diff --git a/graphs/docs/_static/enc_proc_dec.png b/graphs/docs/_static/enc_proc_dec.png old mode 100755 new mode 100644 diff --git a/graphs/docs/_static/graph_configurations.png b/graphs/docs/_static/graph_configurations.png old mode 100755 new mode 100644 diff --git a/graphs/docs/_static/hetero_data_graph.txt b/graphs/docs/_static/hetero_data_graph.txt old mode 100755 new mode 100644 diff --git a/graphs/docs/_static/logo.png b/graphs/docs/_static/logo.png old mode 100755 new mode 100644 diff --git a/graphs/docs/_static/multi_scale_edges.svg b/graphs/docs/_static/multi_scale_edges.svg old mode 100755 new mode 100644 diff --git a/graphs/docs/_static/processor.html b/graphs/docs/_static/processor.html old mode 100755 new mode 100644 diff --git a/graphs/docs/_static/style.css b/graphs/docs/_static/style.css old mode 100755 new mode 100644 diff --git a/graphs/docs/_static/trinodes.png b/graphs/docs/_static/trinodes.png old mode 100755 new mode 100644 diff --git a/graphs/docs/_templates/.gitkeep b/graphs/docs/_templates/.gitkeep old mode 100755 new mode 100644 diff --git a/graphs/docs/cli/introduction.rst b/graphs/docs/cli/introduction.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/conf.py b/graphs/docs/conf.py old mode 100755 new mode 100644 diff --git a/graphs/docs/contributing.rst b/graphs/docs/contributing.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/edge_attributes.rst b/graphs/docs/graphs/edge_attributes.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/edges.rst b/graphs/docs/graphs/edges.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/edges/cutoff.rst b/graphs/docs/graphs/edges/cutoff.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/edges/knn.rst b/graphs/docs/graphs/edges/knn.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/edges/multi_scale.rst b/graphs/docs/graphs/edges/multi_scale.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/edges/tri_refined_edges.csv b/graphs/docs/graphs/edges/tri_refined_edges.csv old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/introduction.rst b/graphs/docs/graphs/introduction.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_attributes.rst b/graphs/docs/graphs/node_attributes.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_attributes/anemoi_dataset_attribute.rst b/graphs/docs/graphs/node_attributes/anemoi_dataset_attribute.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_attributes/area_masks.rst b/graphs/docs/graphs/node_attributes/area_masks.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_attributes/boolean_operations.rst b/graphs/docs/graphs/node_attributes/boolean_operations.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_attributes/weights.rst b/graphs/docs/graphs/node_attributes/weights.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates.rst b/graphs/docs/graphs/node_coordinates.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/anemoi_dataset.rst b/graphs/docs/graphs/node_coordinates/anemoi_dataset.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/healpix.csv b/graphs/docs/graphs/node_coordinates/healpix.csv old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/healpix.rst b/graphs/docs/graphs/node_coordinates/healpix.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/hex_refined.csv b/graphs/docs/graphs/node_coordinates/hex_refined.csv old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/hex_refined_icosahedron.rst b/graphs/docs/graphs/node_coordinates/hex_refined_icosahedron.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/icon_mesh.rst b/graphs/docs/graphs/node_coordinates/icon_mesh.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/latlon_arrays.rst b/graphs/docs/graphs/node_coordinates/latlon_arrays.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/npz_file.rst b/graphs/docs/graphs/node_coordinates/npz_file.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/reduced_gaussian.rst b/graphs/docs/graphs/node_coordinates/reduced_gaussian.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/text_file.rst b/graphs/docs/graphs/node_coordinates/text_file.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/tri_nodes.csv b/graphs/docs/graphs/node_coordinates/tri_nodes.csv old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/tri_refined_icosahedron.rst b/graphs/docs/graphs/node_coordinates/tri_refined_icosahedron.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/node_coordinates/xarray_file.rst b/graphs/docs/graphs/node_coordinates/xarray_file.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/post_processor.rst b/graphs/docs/graphs/post_processor.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_boolean_operation.yaml b/graphs/docs/graphs/yaml/attributes_boolean_operation.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_cosine_lat_weighted.yaml b/graphs/docs/graphs/yaml/attributes_cosine_lat_weighted.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_custom_area_weights.yaml b/graphs/docs/graphs/yaml/attributes_custom_area_weights.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_cutout.yaml b/graphs/docs/graphs/yaml/attributes_cutout.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_grids.yaml b/graphs/docs/graphs/yaml/attributes_grids.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_isolatitude_area_weights.yaml b/graphs/docs/graphs/yaml/attributes_isolatitude_area_weights.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_lam_mask.yaml b/graphs/docs/graphs/yaml/attributes_lam_mask.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_masked_planar_area_weights.yaml b/graphs/docs/graphs/yaml/attributes_masked_planar_area_weights.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_nonmissingzarr.yaml b/graphs/docs/graphs/yaml/attributes_nonmissingzarr.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_nonzerozarr.yaml b/graphs/docs/graphs/yaml/attributes_nonzerozarr.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_planar_area_weights.yaml b/graphs/docs/graphs/yaml/attributes_planar_area_weights.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_spherical_area_weights.yaml b/graphs/docs/graphs/yaml/attributes_spherical_area_weights.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/graphs/yaml/attributes_uniform_weights.yaml b/graphs/docs/graphs/yaml/attributes_uniform_weights.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/index.rst b/graphs/docs/index.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/installing.rst b/graphs/docs/installing.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/modules/edge_attributes.rst b/graphs/docs/modules/edge_attributes.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/modules/edge_builder.rst b/graphs/docs/modules/edge_builder.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/modules/graph_creator.rst b/graphs/docs/modules/graph_creator.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/modules/graph_inspector.rst b/graphs/docs/modules/graph_inspector.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/modules/node_attributes.rst b/graphs/docs/modules/node_attributes.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/modules/node_builder.rst b/graphs/docs/modules/node_builder.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/modules/post_processor.rst b/graphs/docs/modules/post_processor.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/modules/schemas.rst b/graphs/docs/modules/schemas.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/overview.rst b/graphs/docs/overview.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/create_sparse_matrices.rst b/graphs/docs/usage/create_sparse_matrices.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/getting_started.rst b/graphs/docs/usage/getting_started.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/limited_area.rst b/graphs/docs/usage/limited_area.rst old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/schemas/global.excalidraw b/graphs/docs/usage/schemas/global.excalidraw old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/schemas/global.png b/graphs/docs/usage/schemas/global.png old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/schemas/global_wo-proc.excalidraw b/graphs/docs/usage/schemas/global_wo-proc.excalidraw old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/schemas/global_wo-proc.png b/graphs/docs/usage/schemas/global_wo-proc.png old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/cutout_zarr.yaml b/graphs/docs/usage/yaml/cutout_zarr.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/global.txt b/graphs/docs/usage/yaml/global.txt old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/global.yaml b/graphs/docs/usage/yaml/global.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/global_with-attrs.txt b/graphs/docs/usage/yaml/global_with-attrs.txt old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/global_with-attrs.yaml b/graphs/docs/usage/yaml/global_with-attrs.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/global_wo-proc.png b/graphs/docs/usage/yaml/global_wo-proc.png old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/global_wo-proc.txt b/graphs/docs/usage/yaml/global_wo-proc.txt old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/global_wo-proc.yaml b/graphs/docs/usage/yaml/global_wo-proc.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/lam_nodes_wo_boundary.yaml b/graphs/docs/usage/yaml/lam_nodes_wo_boundary.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/limited_area_nodes.yaml b/graphs/docs/usage/yaml/limited_area_nodes.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/nodes.yaml b/graphs/docs/usage/yaml/nodes.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/nodes_with-attrs.yaml b/graphs/docs/usage/yaml/nodes_with-attrs.yaml old mode 100755 new mode 100644 diff --git a/graphs/docs/usage/yaml/sparse_matrices.yaml b/graphs/docs/usage/yaml/sparse_matrices.yaml old mode 100755 new mode 100644 diff --git a/graphs/pyproject.toml b/graphs/pyproject.toml old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/__init__.py b/graphs/src/anemoi/graphs/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/__main__.py b/graphs/src/anemoi/graphs/__main__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/commands/__init__.py b/graphs/src/anemoi/graphs/commands/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/commands/create.py b/graphs/src/anemoi/graphs/commands/create.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/commands/describe.py b/graphs/src/anemoi/graphs/commands/describe.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/commands/export_to_sparse.py b/graphs/src/anemoi/graphs/commands/export_to_sparse.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/commands/inspect.py b/graphs/src/anemoi/graphs/commands/inspect.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/create.py b/graphs/src/anemoi/graphs/create.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/describe.py b/graphs/src/anemoi/graphs/describe.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/__init__.py b/graphs/src/anemoi/graphs/edges/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/attributes.py b/graphs/src/anemoi/graphs/edges/attributes.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/builders/__init__.py b/graphs/src/anemoi/graphs/edges/builders/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/builders/base.py b/graphs/src/anemoi/graphs/edges/builders/base.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/builders/cutoff.py b/graphs/src/anemoi/graphs/edges/builders/cutoff.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/builders/healpix.py b/graphs/src/anemoi/graphs/edges/builders/healpix.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/builders/icon.py b/graphs/src/anemoi/graphs/edges/builders/icon.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/builders/knn.py b/graphs/src/anemoi/graphs/edges/builders/knn.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/builders/masking.py b/graphs/src/anemoi/graphs/edges/builders/masking.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/builders/multi_scale.py b/graphs/src/anemoi/graphs/edges/builders/multi_scale.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/edges/directional.py b/graphs/src/anemoi/graphs/edges/directional.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/export.py b/graphs/src/anemoi/graphs/export.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/generate/__init__.py b/graphs/src/anemoi/graphs/generate/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/generate/healpix.py b/graphs/src/anemoi/graphs/generate/healpix.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/generate/hex_icosahedron.py b/graphs/src/anemoi/graphs/generate/hex_icosahedron.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/generate/icon_mesh.py b/graphs/src/anemoi/graphs/generate/icon_mesh.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/generate/masks.py b/graphs/src/anemoi/graphs/generate/masks.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/generate/multi_scale_edges.py b/graphs/src/anemoi/graphs/generate/multi_scale_edges.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/generate/transforms.py b/graphs/src/anemoi/graphs/generate/transforms.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/generate/tri_icosahedron.py b/graphs/src/anemoi/graphs/generate/tri_icosahedron.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/generate/utils.py b/graphs/src/anemoi/graphs/generate/utils.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/inspect.py b/graphs/src/anemoi/graphs/inspect.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/__init__.py b/graphs/src/anemoi/graphs/nodes/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/attributes/__init__.py b/graphs/src/anemoi/graphs/nodes/attributes/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/attributes/area_weights.py b/graphs/src/anemoi/graphs/nodes/attributes/area_weights.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/attributes/base_attributes.py b/graphs/src/anemoi/graphs/nodes/attributes/base_attributes.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/attributes/boolean_op.py b/graphs/src/anemoi/graphs/nodes/attributes/boolean_op.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/attributes/masks.py b/graphs/src/anemoi/graphs/nodes/attributes/masks.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/builders/__init__.py b/graphs/src/anemoi/graphs/nodes/builders/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/builders/base.py b/graphs/src/anemoi/graphs/nodes/builders/base.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_file.py b/graphs/src/anemoi/graphs/nodes/builders/from_file.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_healpix.py b/graphs/src/anemoi/graphs/nodes/builders/from_healpix.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_icon.py b/graphs/src/anemoi/graphs/nodes/builders/from_icon.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_reduced_gaussian.py b/graphs/src/anemoi/graphs/nodes/builders/from_reduced_gaussian.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_refined_icosahedron.py b/graphs/src/anemoi/graphs/nodes/builders/from_refined_icosahedron.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/nodes/builders/from_vectors.py b/graphs/src/anemoi/graphs/nodes/builders/from_vectors.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/normalise.py b/graphs/src/anemoi/graphs/normalise.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/plotting/__init__.py b/graphs/src/anemoi/graphs/plotting/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/plotting/displots.py b/graphs/src/anemoi/graphs/plotting/displots.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/plotting/interactive_2d_html.py b/graphs/src/anemoi/graphs/plotting/interactive_2d_html.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/plotting/interactive_3d.html.jinja b/graphs/src/anemoi/graphs/plotting/interactive_3d.html.jinja old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/plotting/interactive_3d_html.py b/graphs/src/anemoi/graphs/plotting/interactive_3d_html.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/plotting/prepare.py b/graphs/src/anemoi/graphs/plotting/prepare.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/processors/__init__.py b/graphs/src/anemoi/graphs/processors/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/processors/post_process.py b/graphs/src/anemoi/graphs/processors/post_process.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/schemas/__init__.py b/graphs/src/anemoi/graphs/schemas/__init__.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/schemas/base_graph.py b/graphs/src/anemoi/graphs/schemas/base_graph.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/schemas/edge_attributes_schemas.py b/graphs/src/anemoi/graphs/schemas/edge_attributes_schemas.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/schemas/edge_schemas.py b/graphs/src/anemoi/graphs/schemas/edge_schemas.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/schemas/node_attributes_schemas.py b/graphs/src/anemoi/graphs/schemas/node_attributes_schemas.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/schemas/node_schemas.py b/graphs/src/anemoi/graphs/schemas/node_schemas.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/schemas/normalise.py b/graphs/src/anemoi/graphs/schemas/normalise.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/schemas/post_processors.py b/graphs/src/anemoi/graphs/schemas/post_processors.py old mode 100755 new mode 100644 diff --git a/graphs/src/anemoi/graphs/utils.py b/graphs/src/anemoi/graphs/utils.py old mode 100755 new mode 100644 diff --git a/graphs/tests/conftest.py b/graphs/tests/conftest.py old mode 100755 new mode 100644 diff --git a/graphs/tests/edges/test_cutoff.py b/graphs/tests/edges/test_cutoff.py old mode 100755 new mode 100644 diff --git a/graphs/tests/edges/test_direction.py b/graphs/tests/edges/test_direction.py old mode 100755 new mode 100644 diff --git a/graphs/tests/edges/test_edge_attributes.py b/graphs/tests/edges/test_edge_attributes.py old mode 100755 new mode 100644 diff --git a/graphs/tests/edges/test_healpix_multiscale.py b/graphs/tests/edges/test_healpix_multiscale.py old mode 100755 new mode 100644 diff --git a/graphs/tests/edges/test_icon_edges.py b/graphs/tests/edges/test_icon_edges.py old mode 100755 new mode 100644 diff --git a/graphs/tests/edges/test_knn.py b/graphs/tests/edges/test_knn.py old mode 100755 new mode 100644 diff --git a/graphs/tests/edges/test_multiscale_edges.py b/graphs/tests/edges/test_multiscale_edges.py old mode 100755 new mode 100644 diff --git a/graphs/tests/generate/test_mask_builder.py b/graphs/tests/generate/test_mask_builder.py old mode 100755 new mode 100644 diff --git a/graphs/tests/generate/test_transforms.py b/graphs/tests/generate/test_transforms.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/attributes/test_base.py b/graphs/tests/nodes/attributes/test_base.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/attributes/test_boolean_operations.py b/graphs/tests/nodes/attributes/test_boolean_operations.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/attributes/test_masks.py b/graphs/tests/nodes/attributes/test_masks.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/attributes/test_weights.py b/graphs/tests/nodes/attributes/test_weights.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/test_anemoi_dataset.py b/graphs/tests/nodes/test_anemoi_dataset.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/test_arrays.py b/graphs/tests/nodes/test_arrays.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/test_cutout_nodes.py b/graphs/tests/nodes/test_cutout_nodes.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/test_from_xarray.py b/graphs/tests/nodes/test_from_xarray.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/test_healpix.py b/graphs/tests/nodes/test_healpix.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/test_hex_nodes.py b/graphs/tests/nodes/test_hex_nodes.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/test_icon_nodes.py b/graphs/tests/nodes/test_icon_nodes.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/test_npz.py b/graphs/tests/nodes/test_npz.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/test_reduced_gaussian.py b/graphs/tests/nodes/test_reduced_gaussian.py old mode 100755 new mode 100644 diff --git a/graphs/tests/nodes/test_tri_nodes.py b/graphs/tests/nodes/test_tri_nodes.py old mode 100755 new mode 100644 diff --git a/graphs/tests/processors/test_post_process.py b/graphs/tests/processors/test_post_process.py old mode 100755 new mode 100644 diff --git a/graphs/tests/test_create.py b/graphs/tests/test_create.py old mode 100755 new mode 100644 diff --git a/graphs/tests/test_normaliser.py b/graphs/tests/test_normaliser.py old mode 100755 new mode 100644 diff --git a/graphs/tests/test_utils.py b/graphs/tests/test_utils.py old mode 100755 new mode 100644 diff --git a/models/.gitattributes b/models/.gitattributes old mode 100755 new mode 100644 diff --git a/models/.gitignore b/models/.gitignore old mode 100755 new mode 100644 diff --git a/models/.readthedocs.yaml b/models/.readthedocs.yaml old mode 100755 new mode 100644 diff --git a/models/CHANGELOG.md b/models/CHANGELOG.md old mode 100755 new mode 100644 diff --git a/models/CONTRIBUTORS.md b/models/CONTRIBUTORS.md old mode 100755 new mode 100644 diff --git a/models/LICENSE b/models/LICENSE old mode 100755 new mode 100644 diff --git a/models/README.md b/models/README.md old mode 100755 new mode 100644 diff --git a/models/docs/Makefile b/models/docs/Makefile old mode 100755 new mode 100644 diff --git a/models/docs/_static/anemoi-models_schematic.drawio b/models/docs/_static/anemoi-models_schematic.drawio old mode 100755 new mode 100644 diff --git a/models/docs/_static/anemoi-models_schematic.png b/models/docs/_static/anemoi-models_schematic.png old mode 100755 new mode 100644 diff --git a/models/docs/_static/data_indices.drawio b/models/docs/_static/data_indices.drawio old mode 100755 new mode 100644 diff --git a/models/docs/_static/data_indices.png b/models/docs/_static/data_indices.png old mode 100755 new mode 100644 diff --git a/models/docs/_static/logo.png b/models/docs/_static/logo.png old mode 100755 new mode 100644 diff --git a/models/docs/_static/preprocessing_remapper_atanh.png b/models/docs/_static/preprocessing_remapper_atanh.png old mode 100755 new mode 100644 diff --git a/models/docs/_static/preprocessing_remapper_boxcox.png b/models/docs/_static/preprocessing_remapper_boxcox.png old mode 100755 new mode 100644 diff --git a/models/docs/_static/preprocessing_remapper_power.png b/models/docs/_static/preprocessing_remapper_power.png old mode 100755 new mode 100644 diff --git a/models/docs/_static/style.css b/models/docs/_static/style.css old mode 100755 new mode 100644 diff --git a/models/docs/_templates/.gitkeep b/models/docs/_templates/.gitkeep old mode 100755 new mode 100644 diff --git a/models/docs/cli/migration.rst b/models/docs/cli/migration.rst old mode 100755 new mode 100644 diff --git a/models/docs/conf.py b/models/docs/conf.py old mode 100755 new mode 100644 diff --git a/models/docs/contributing.rst b/models/docs/contributing.rst old mode 100755 new mode 100644 diff --git a/models/docs/create-migrations.rst b/models/docs/create-migrations.rst old mode 100755 new mode 100644 diff --git a/models/docs/index.rst b/models/docs/index.rst old mode 100755 new mode 100644 diff --git a/models/docs/introduction/installing.rst b/models/docs/introduction/installing.rst old mode 100755 new mode 100644 diff --git a/models/docs/introduction/overview.rst b/models/docs/introduction/overview.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/activations.rst b/models/docs/modules/activations.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/data_indices.rst b/models/docs/modules/data_indices.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/distributed.rst b/models/docs/modules/distributed.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/interface.rst b/models/docs/modules/interface.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/layers.rst b/models/docs/modules/layers.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/migrations.rst b/models/docs/modules/migrations.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/models.rst b/models/docs/modules/models.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/normalization.rst b/models/docs/modules/normalization.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/preprocessing.rst b/models/docs/modules/preprocessing.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/residual.rst b/models/docs/modules/residual.rst old mode 100755 new mode 100644 diff --git a/models/docs/modules/schemas.rst b/models/docs/modules/schemas.rst old mode 100755 new mode 100644 diff --git a/models/docs/usage/create_model.rst b/models/docs/usage/create_model.rst old mode 100755 new mode 100644 diff --git a/models/pyproject.toml b/models/pyproject.toml old mode 100755 new mode 100644 diff --git a/models/pytest.ini b/models/pytest.ini old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/__init__.py b/models/src/anemoi/models/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/__main__.py b/models/src/anemoi/models/__main__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/commands/__init__.py b/models/src/anemoi/models/commands/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/commands/hello.py b/models/src/anemoi/models/commands/hello.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/commands/migration.py b/models/src/anemoi/models/commands/migration.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/data_indices/__init__.py b/models/src/anemoi/models/data_indices/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/data_indices/collection.py b/models/src/anemoi/models/data_indices/collection.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/data_indices/index.py b/models/src/anemoi/models/data_indices/index.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/data_indices/tensor.py b/models/src/anemoi/models/data_indices/tensor.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/distributed/__init__.py b/models/src/anemoi/models/distributed/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/distributed/balanced_partition.py b/models/src/anemoi/models/distributed/balanced_partition.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/distributed/graph.py b/models/src/anemoi/models/distributed/graph.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/distributed/khop_edges.py b/models/src/anemoi/models/distributed/khop_edges.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/distributed/primitives.py b/models/src/anemoi/models/distributed/primitives.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/distributed/shapes.py b/models/src/anemoi/models/distributed/shapes.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/distributed/transformer.py b/models/src/anemoi/models/distributed/transformer.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/distributed/utils.py b/models/src/anemoi/models/distributed/utils.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/interface/__init__.py b/models/src/anemoi/models/interface/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/__init__.py b/models/src/anemoi/models/layers/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/activations.py b/models/src/anemoi/models/layers/activations.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/attention.py b/models/src/anemoi/models/layers/attention.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/block.py b/models/src/anemoi/models/layers/block.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/bounding.py b/models/src/anemoi/models/layers/bounding.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/conv.py b/models/src/anemoi/models/layers/conv.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/diffusion.py b/models/src/anemoi/models/layers/diffusion.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/ensemble.py b/models/src/anemoi/models/layers/ensemble.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/graph.py b/models/src/anemoi/models/layers/graph.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/graph_provider.py b/models/src/anemoi/models/layers/graph_provider.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/mapper.py b/models/src/anemoi/models/layers/mapper.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/mlp.py b/models/src/anemoi/models/layers/mlp.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/normalization.py b/models/src/anemoi/models/layers/normalization.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/processor.py b/models/src/anemoi/models/layers/processor.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/residual.py b/models/src/anemoi/models/layers/residual.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/sparse_projector.py b/models/src/anemoi/models/layers/sparse_projector.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/spectral_helpers.py b/models/src/anemoi/models/layers/spectral_helpers.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/spectral_transforms.py b/models/src/anemoi/models/layers/spectral_transforms.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/layers/utils.py b/models/src/anemoi/models/layers/utils.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/__init__.py b/models/src/anemoi/models/migrations/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/migrator.py b/models/src/anemoi/models/migrations/migrator.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/scripts/1755530253_initial.py b/models/src/anemoi/models/migrations/scripts/1755530253_initial.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/scripts/1762857427_deprecate_eda.py b/models/src/anemoi/models/migrations/scripts/1762857427_deprecate_eda.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/scripts/1762857428_chunking_fix.py b/models/src/anemoi/models/migrations/scripts/1762857428_chunking_fix.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/scripts/1763479917_hardware_schema_update.py b/models/src/anemoi/models/migrations/scripts/1763479917_hardware_schema_update.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/scripts/1763479918_refactor_mapper.py b/models/src/anemoi/models/migrations/scripts/1763479918_refactor_mapper.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/scripts/1767108147_move_to_multiple_datasets.py b/models/src/anemoi/models/migrations/scripts/1767108147_move_to_multiple_datasets.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/scripts/1773048851_fuse_multiple_perdataset_graphs.py b/models/src/anemoi/models/migrations/scripts/1773048851_fuse_multiple_perdataset_graphs.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/scripts/1776237003_rename_swa_to_weight_averaging.py b/models/src/anemoi/models/migrations/scripts/1776237003_rename_swa_to_weight_averaging.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/migrations/setup_context.py b/models/src/anemoi/models/migrations/setup_context.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/models/__init__.py b/models/src/anemoi/models/models/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/models/autoencoder.py b/models/src/anemoi/models/models/autoencoder.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/models/base.py b/models/src/anemoi/models/models/base.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/models/diffusion_encoder_processor_decoder.py b/models/src/anemoi/models/models/diffusion_encoder_processor_decoder.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/models/encoder_processor_decoder.py b/models/src/anemoi/models/models/encoder_processor_decoder.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/models/ens_encoder_processor_decoder.py b/models/src/anemoi/models/models/ens_encoder_processor_decoder.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/models/hierarchical.py b/models/src/anemoi/models/models/hierarchical.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/models/hierarchical_autoencoder.py b/models/src/anemoi/models/models/hierarchical_autoencoder.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/preprocessing/__init__.py b/models/src/anemoi/models/preprocessing/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/preprocessing/imputer.py b/models/src/anemoi/models/preprocessing/imputer.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/preprocessing/mappings.py b/models/src/anemoi/models/preprocessing/mappings.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/preprocessing/normalizer.py b/models/src/anemoi/models/preprocessing/normalizer.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/preprocessing/postprocessor.py b/models/src/anemoi/models/preprocessing/postprocessor.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/preprocessing/remapper.py b/models/src/anemoi/models/preprocessing/remapper.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/samplers/__init__.py b/models/src/anemoi/models/samplers/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/samplers/diffusion_samplers.py b/models/src/anemoi/models/samplers/diffusion_samplers.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/schemas/__init__.py b/models/src/anemoi/models/schemas/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/schemas/common_components.py b/models/src/anemoi/models/schemas/common_components.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/schemas/data_processor.py b/models/src/anemoi/models/schemas/data_processor.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/schemas/decoder.py b/models/src/anemoi/models/schemas/decoder.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/schemas/encoder.py b/models/src/anemoi/models/schemas/encoder.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/schemas/models.py b/models/src/anemoi/models/schemas/models.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/schemas/processor.py b/models/src/anemoi/models/schemas/processor.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/schemas/residual.py b/models/src/anemoi/models/schemas/residual.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/triton/gt.py b/models/src/anemoi/models/triton/gt.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/triton/utils.py b/models/src/anemoi/models/triton/utils.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/utils/__init__.py b/models/src/anemoi/models/utils/__init__.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/utils/compile.py b/models/src/anemoi/models/utils/compile.py old mode 100755 new mode 100644 diff --git a/models/src/anemoi/models/utils/config.py b/models/src/anemoi/models/utils/config.py old mode 100755 new mode 100644 diff --git a/models/tests/conftest.py b/models/tests/conftest.py old mode 100755 new mode 100644 diff --git a/models/tests/data_indices/test_collection.py b/models/tests/data_indices/test_collection.py old mode 100755 new mode 100644 diff --git a/models/tests/data_indices/test_data_indices.py b/models/tests/data_indices/test_data_indices.py old mode 100755 new mode 100644 diff --git a/models/tests/distributed/balanced_partition.py b/models/tests/distributed/balanced_partition.py old mode 100755 new mode 100644 diff --git a/models/tests/integration/triton/test_triton_gt.py b/models/tests/integration/triton/test_triton_gt.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/block/test_block_graphconv.py b/models/tests/layers/block/test_block_graphconv.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/block/test_block_graphtransformer.py b/models/tests/layers/block/test_block_graphtransformer.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/block/test_block_pointwise.py b/models/tests/layers/block/test_block_pointwise.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/block/test_block_transformer.py b/models/tests/layers/block/test_block_transformer.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/block/test_block_transformermapper.py b/models/tests/layers/block/test_block_transformermapper.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/mapper/test_base_mapper.py b/models/tests/layers/mapper/test_base_mapper.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/mapper/test_graphconv_mapper.py b/models/tests/layers/mapper/test_graphconv_mapper.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/mapper/test_graphtransformer_mapper.py b/models/tests/layers/mapper/test_graphtransformer_mapper.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/mapper/test_pointwise_mapper.py b/models/tests/layers/mapper/test_pointwise_mapper.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/mapper/test_transformer_mapper.py b/models/tests/layers/mapper/test_transformer_mapper.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/processor/test_base_processor.py b/models/tests/layers/processor/test_base_processor.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/processor/test_graphconv_processor.py b/models/tests/layers/processor/test_graphconv_processor.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/processor/test_graphtransformer_processor.py b/models/tests/layers/processor/test_graphtransformer_processor.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/processor/test_pointwise_processor.py b/models/tests/layers/processor/test_pointwise_processor.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/processor/test_transformer_processor.py b/models/tests/layers/processor/test_transformer_processor.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/test_activations.py b/models/tests/layers/test_activations.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/test_attention.py b/models/tests/layers/test_attention.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/test_bounding.py b/models/tests/layers/test_bounding.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/test_grad_checkpoint_wiring.py b/models/tests/layers/test_grad_checkpoint_wiring.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/test_graph.py b/models/tests/layers/test_graph.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/test_layer_utils.py b/models/tests/layers/test_layer_utils.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/test_mlp.py b/models/tests/layers/test_mlp.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/test_noise_embeddings.py b/models/tests/layers/test_noise_embeddings.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/test_residual.py b/models/tests/layers/test_residual.py old mode 100755 new mode 100644 diff --git a/models/tests/layers/test_sht.py b/models/tests/layers/test_sht.py old mode 100755 new mode 100644 diff --git a/models/tests/migrations/conftest.py b/models/tests/migrations/conftest.py old mode 100755 new mode 100644 diff --git a/models/tests/migrations/migrations/1750840837_add_foo.py b/models/tests/migrations/migrations/1750840837_add_foo.py old mode 100755 new mode 100644 diff --git a/models/tests/migrations/migrations/1750841219_add_bar.py b/models/tests/migrations/migrations/1750841219_add_bar.py old mode 100755 new mode 100644 diff --git a/models/tests/migrations/migrations/1750859824_add_baz.py b/models/tests/migrations/migrations/1750859824_add_baz.py old mode 100755 new mode 100644 diff --git a/models/tests/migrations/migrations/1750859905_rename_baz.py b/models/tests/migrations/migrations/1750859905_rename_baz.py old mode 100755 new mode 100644 diff --git a/models/tests/migrations/migrations/1751895180_final.py b/models/tests/migrations/migrations/1751895180_final.py old mode 100755 new mode 100644 diff --git a/models/tests/migrations/migrations/1751895203_recent.py b/models/tests/migrations/migrations/1751895203_recent.py old mode 100755 new mode 100644 diff --git a/models/tests/migrations/test_migration_order.py b/models/tests/migrations/test_migration_order.py old mode 100755 new mode 100644 diff --git a/models/tests/migrations/test_migrations.py b/models/tests/migrations/test_migrations.py old mode 100755 new mode 100644 diff --git a/models/tests/models/test_diffusion_sampling_pipeline.py b/models/tests/models/test_diffusion_sampling_pipeline.py old mode 100755 new mode 100644 diff --git a/models/tests/models/test_diffusion_tendency.py b/models/tests/models/test_diffusion_tendency.py old mode 100755 new mode 100644 diff --git a/models/tests/models/test_models.py b/models/tests/models/test_models.py old mode 100755 new mode 100644 diff --git a/models/tests/preprocessing/test_mappings.py b/models/tests/preprocessing/test_mappings.py old mode 100755 new mode 100644 diff --git a/models/tests/preprocessing/test_postprocessor.py b/models/tests/preprocessing/test_postprocessor.py old mode 100755 new mode 100644 diff --git a/models/tests/preprocessing/test_preprocessor_imputer.py b/models/tests/preprocessing/test_preprocessor_imputer.py old mode 100755 new mode 100644 diff --git a/models/tests/preprocessing/test_preprocessor_normalizer.py b/models/tests/preprocessing/test_preprocessor_normalizer.py old mode 100755 new mode 100644 diff --git a/models/tests/preprocessing/test_preprocessor_remapper.py b/models/tests/preprocessing/test_preprocessor_remapper.py old mode 100755 new mode 100644 diff --git a/models/tests/preprocessing/test_stepwise_processors.py b/models/tests/preprocessing/test_stepwise_processors.py old mode 100755 new mode 100644 diff --git a/models/tests/samplers/test_diffusion_samplers.py b/models/tests/samplers/test_diffusion_samplers.py old mode 100755 new mode 100644 diff --git a/models/tests/schemas/test_data_processors_schemas.py b/models/tests/schemas/test_data_processors_schemas.py old mode 100755 new mode 100644 diff --git a/models/tests/schemas/test_model_schemas_pointwise_mappers.py b/models/tests/schemas/test_model_schemas_pointwise_mappers.py old mode 100755 new mode 100644 diff --git a/models/tests/utils/test_compile.py b/models/tests/utils/test_compile.py old mode 100755 new mode 100644 diff --git a/training/.gitattributes b/training/.gitattributes old mode 100755 new mode 100644 diff --git a/training/.gitignore b/training/.gitignore old mode 100755 new mode 100644 diff --git a/training/.readthedocs.yaml b/training/.readthedocs.yaml old mode 100755 new mode 100644 diff --git a/training/CHANGELOG.md b/training/CHANGELOG.md old mode 100755 new mode 100644 diff --git a/training/CONTRIBUTORS.md b/training/CONTRIBUTORS.md old mode 100755 new mode 100644 diff --git a/training/LICENSE b/training/LICENSE old mode 100755 new mode 100644 diff --git a/training/README.md b/training/README.md old mode 100755 new mode 100644 diff --git a/training/docs/Makefile b/training/docs/Makefile old mode 100755 new mode 100644 diff --git a/training/docs/_static/logo.png b/training/docs/_static/logo.png old mode 100755 new mode 100644 diff --git a/training/docs/_static/style.css b/training/docs/_static/style.css old mode 100755 new mode 100644 diff --git a/training/docs/_templates/.gitkeep b/training/docs/_templates/.gitkeep old mode 100755 new mode 100644 diff --git a/training/docs/adrs/adr-001.md b/training/docs/adrs/adr-001.md old mode 100755 new mode 100644 diff --git a/training/docs/adrs/adr-002.md b/training/docs/adrs/adr-002.md old mode 100755 new mode 100644 diff --git a/training/docs/adrs/template.md b/training/docs/adrs/template.md old mode 100755 new mode 100644 diff --git a/training/docs/checkpoint_integration.rst b/training/docs/checkpoint_integration.rst old mode 100755 new mode 100644 diff --git a/training/docs/checkpoint_pipeline_configuration.rst b/training/docs/checkpoint_pipeline_configuration.rst old mode 100755 new mode 100644 diff --git a/training/docs/checkpoint_troubleshooting.rst b/training/docs/checkpoint_troubleshooting.rst old mode 100755 new mode 100644 diff --git a/training/docs/conf.py b/training/docs/conf.py old mode 100755 new mode 100644 diff --git a/training/docs/contributing.rst b/training/docs/contributing.rst old mode 100755 new mode 100644 diff --git a/training/docs/images/global-sliding-window-attention.png b/training/docs/images/global-sliding-window-attention.png old mode 100755 new mode 100644 diff --git a/training/docs/images/gnn-encoder-decoder-multimesh.jpg b/training/docs/images/gnn-encoder-decoder-multimesh.jpg old mode 100755 new mode 100644 diff --git a/training/docs/images/mlflow/mlflow_compare.png b/training/docs/images/mlflow/mlflow_compare.png old mode 100755 new mode 100644 diff --git a/training/docs/images/mlflow/mlflow_constant.png b/training/docs/images/mlflow/mlflow_constant.png old mode 100755 new mode 100644 diff --git a/training/docs/images/mlflow/mlflow_resumed_run.png b/training/docs/images/mlflow/mlflow_resumed_run.png old mode 100755 new mode 100644 diff --git a/training/docs/images/mlflow/mlflow_run.png b/training/docs/images/mlflow/mlflow_run.png old mode 100755 new mode 100644 diff --git a/training/docs/images/mlflow/mlflow_server.png b/training/docs/images/mlflow/mlflow_server.png old mode 100755 new mode 100644 diff --git a/training/docs/images/model_sharding.png b/training/docs/images/model_sharding.png old mode 100755 new mode 100644 diff --git a/training/docs/images/multi-dataset/downscaling-multi.png b/training/docs/images/multi-dataset/downscaling-multi.png old mode 100755 new mode 100644 diff --git a/training/docs/images/multi-dataset/lam-multi.png b/training/docs/images/multi-dataset/lam-multi.png old mode 100755 new mode 100644 diff --git a/training/docs/images/multi-dataset/prog-forc-diag.png b/training/docs/images/multi-dataset/prog-forc-diag.png old mode 100755 new mode 100644 diff --git a/training/docs/images/performance-guide/mem-snapshot-1-mapper-chunk.png b/training/docs/images/performance-guide/mem-snapshot-1-mapper-chunk.png old mode 100755 new mode 100644 diff --git a/training/docs/images/performance-guide/mem-snapshot-4-mapper-chunks.png b/training/docs/images/performance-guide/mem-snapshot-4-mapper-chunks.png old mode 100755 new mode 100644 diff --git a/training/docs/images/performance-guide/performance-flowchart.png b/training/docs/images/performance-guide/performance-flowchart.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_architecture.png b/training/docs/images/profiler/anemoi_profiler_architecture.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_benchmark_profiler.png b/training/docs/images/profiler/anemoi_profiler_benchmark_profiler.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_config.png b/training/docs/images/profiler/anemoi_profiler_config.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_high_level.png b/training/docs/images/profiler/anemoi_profiler_high_level.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_mlflow_integration.png b/training/docs/images/profiler/anemoi_profiler_mlflow_integration.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_mlflow_integration_2.png b/training/docs/images/profiler/anemoi_profiler_mlflow_integration_2.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_mlflow_integration_3.png b/training/docs/images/profiler/anemoi_profiler_mlflow_integration_3.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_speed_report.png b/training/docs/images/profiler/anemoi_profiler_speed_report.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_speedreport_diagram.png b/training/docs/images/profiler/anemoi_profiler_speedreport_diagram.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_training_rates.png b/training/docs/images/profiler/anemoi_profiler_training_rates.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/anemoi_profiler_validation_rates.png b/training/docs/images/profiler/anemoi_profiler_validation_rates.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/example_memory_report.png b/training/docs/images/profiler/example_memory_report.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/example_memory_timeline.png b/training/docs/images/profiler/example_memory_timeline.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/example_model_summary.png b/training/docs/images/profiler/example_model_summary.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/example_model_summary_2.png b/training/docs/images/profiler/example_model_summary_2.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/example_system_report.png b/training/docs/images/profiler/example_system_report.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/example_time_report.png b/training/docs/images/profiler/example_time_report.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/idle_time_breakdown.png b/training/docs/images/profiler/idle_time_breakdown.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/kernel_breakdown_dfs.png b/training/docs/images/profiler/kernel_breakdown_dfs.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/kernel_breakdown_plots.png b/training/docs/images/profiler/kernel_breakdown_plots.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/memory_snapshot_diagram.png b/training/docs/images/profiler/memory_snapshot_diagram.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/memory_snapshot_output.png b/training/docs/images/profiler/memory_snapshot_output.png old mode 100755 new mode 100644 diff --git a/training/docs/images/profiler/temporal_breakdown.png b/training/docs/images/profiler/temporal_breakdown.png old mode 100755 new mode 100644 diff --git a/training/docs/images/transformer-block.png b/training/docs/images/transformer-block.png old mode 100755 new mode 100644 diff --git a/training/docs/index.rst b/training/docs/index.rst old mode 100755 new mode 100644 diff --git a/training/docs/introduction/installing.rst b/training/docs/introduction/installing.rst old mode 100755 new mode 100644 diff --git a/training/docs/introduction/overview.rst b/training/docs/introduction/overview.rst old mode 100755 new mode 100644 diff --git a/training/docs/modules/data.rst b/training/docs/modules/data.rst old mode 100755 new mode 100644 diff --git a/training/docs/modules/diagnostics.rst b/training/docs/modules/diagnostics.rst old mode 100755 new mode 100644 diff --git a/training/docs/modules/losses.rst b/training/docs/modules/losses.rst old mode 100755 new mode 100644 diff --git a/training/docs/modules/optimization.rst b/training/docs/modules/optimization.rst old mode 100755 new mode 100644 diff --git a/training/docs/modules/schemas.rst b/training/docs/modules/schemas.rst old mode 100755 new mode 100644 diff --git a/training/docs/modules/strategy.rst b/training/docs/modules/strategy.rst old mode 100755 new mode 100644 diff --git a/training/docs/modules/tasks.rst b/training/docs/modules/tasks.rst old mode 100755 new mode 100644 diff --git a/training/docs/modules/train.rst b/training/docs/modules/train.rst old mode 100755 new mode 100644 diff --git a/training/docs/troubleshooting.rst b/training/docs/troubleshooting.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/basic-set-up.rst b/training/docs/user-guide/basic-set-up.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/benchmarking.rst b/training/docs/user-guide/benchmarking.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/configuring.rst b/training/docs/user-guide/configuring.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/distributed.rst b/training/docs/user-guide/distributed.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/download-era5-o96.rst b/training/docs/user-guide/download-era5-o96.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/hydra-intro.rst b/training/docs/user-guide/hydra-intro.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/models.rst b/training/docs/user-guide/models.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/multi-datasets.rst b/training/docs/user-guide/multi-datasets.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/overview.rst b/training/docs/user-guide/overview.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/performance-optimisation.rst b/training/docs/user-guide/performance-optimisation.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/tasks.rst b/training/docs/user-guide/tasks.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/tracking.rst b/training/docs/user-guide/tracking.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/training-methods.rst b/training/docs/user-guide/training-methods.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/training.rst b/training/docs/user-guide/training.rst old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/yaml/dataloader.yaml b/training/docs/user-guide/yaml/dataloader.yaml old mode 100755 new mode 100644 diff --git a/training/docs/user-guide/yaml/example_crps_config.yaml b/training/docs/user-guide/yaml/example_crps_config.yaml old mode 100755 new mode 100644 diff --git a/training/pyproject.toml b/training/pyproject.toml old mode 100755 new mode 100644 diff --git a/training/pytest.ini b/training/pytest.ini old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/__init__.py b/training/src/anemoi/training/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/__main__.py b/training/src/anemoi/training/__main__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/checkpoint/__init__.py b/training/src/anemoi/training/checkpoint/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/checkpoint/base.py b/training/src/anemoi/training/checkpoint/base.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/checkpoint/catalog.py b/training/src/anemoi/training/checkpoint/catalog.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/checkpoint/exceptions.py b/training/src/anemoi/training/checkpoint/exceptions.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/checkpoint/formats.py b/training/src/anemoi/training/checkpoint/formats.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/checkpoint/pipeline.py b/training/src/anemoi/training/checkpoint/pipeline.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/checkpoint/utils.py b/training/src/anemoi/training/checkpoint/utils.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/commands/__init__.py b/training/src/anemoi/training/commands/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/commands/checkpoint.py b/training/src/anemoi/training/commands/checkpoint.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/commands/config.py b/training/src/anemoi/training/commands/config.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/commands/mlflow.py b/training/src/anemoi/training/commands/mlflow.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/commands/profiler.py b/training/src/anemoi/training/commands/profiler.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/commands/train.py b/training/src/anemoi/training/commands/train.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/__init__.py b/training/src/anemoi/training/config/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/autoencoder.yaml b/training/src/anemoi/training/config/autoencoder.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/config.yaml b/training/src/anemoi/training/config/config.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/data/multi.yaml b/training/src/anemoi/training/config/data/multi.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/data/zarr.yaml b/training/src/anemoi/training/config/data/zarr.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/dataloader/multi.yaml b/training/src/anemoi/training/config/dataloader/multi.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/dataloader/native_grid.yaml b/training/src/anemoi/training/config/dataloader/native_grid.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/benchmark_profiler/detailed.yaml b/training/src/anemoi/training/config/diagnostics/benchmark_profiler/detailed.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/benchmark_profiler/simple.yaml b/training/src/anemoi/training/config/diagnostics/benchmark_profiler/simple.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/callbacks/placeholder.yaml b/training/src/anemoi/training/config/diagnostics/callbacks/placeholder.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/callbacks/rollout_eval.yaml b/training/src/anemoi/training/config/diagnostics/callbacks/rollout_eval.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/evaluation.yaml b/training/src/anemoi/training/config/diagnostics/evaluation.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/evaluation_ens.yaml b/training/src/anemoi/training/config/diagnostics/evaluation_ens.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/evaluation_multi.yaml b/training/src/anemoi/training/config/diagnostics/evaluation_multi.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/log/mlflow.yaml b/training/src/anemoi/training/config/diagnostics/log/mlflow.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/log/wandb.yaml b/training/src/anemoi/training/config/diagnostics/log/wandb.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/plot/detailed.yaml b/training/src/anemoi/training/config/diagnostics/plot/detailed.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/plot/multi.yaml b/training/src/anemoi/training/config/diagnostics/plot/multi.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diagnostics/plot/simple.yaml b/training/src/anemoi/training/config/diagnostics/plot/simple.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/diffusion.yaml b/training/src/anemoi/training/config/diffusion.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/ensemble_crps.yaml b/training/src/anemoi/training/config/ensemble_crps.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/graph/encoder_decoder_only.yaml b/training/src/anemoi/training/config/graph/encoder_decoder_only.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/graph/existing.yaml b/training/src/anemoi/training/config/graph/existing.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/graph/hierarchical_2level.yaml b/training/src/anemoi/training/config/graph/hierarchical_2level.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/graph/hierarchical_2level_encoder_decoder_only.yaml b/training/src/anemoi/training/config/graph/hierarchical_2level_encoder_decoder_only.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/graph/hierarchical_3level.yaml b/training/src/anemoi/training/config/graph/hierarchical_3level.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/graph/limited_area.yaml b/training/src/anemoi/training/config/graph/limited_area.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/graph/multi.yaml b/training/src/anemoi/training/config/graph/multi.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/graph/multi_scale.yaml b/training/src/anemoi/training/config/graph/multi_scale.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/graph/point_wise.yaml b/training/src/anemoi/training/config/graph/point_wise.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/graph/stretched_grid.yaml b/training/src/anemoi/training/config/graph/stretched_grid.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/hierarchical.yaml b/training/src/anemoi/training/config/hierarchical.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/hierarchical_autoencoder.yaml b/training/src/anemoi/training/config/hierarchical_autoencoder.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/lam.yaml b/training/src/anemoi/training/config/lam.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/gnn.yaml b/training/src/anemoi/training/config/model/gnn.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/graphtransformer.yaml b/training/src/anemoi/training/config/model/graphtransformer.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/graphtransformer_diffusion.yaml b/training/src/anemoi/training/config/model/graphtransformer_diffusion.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/graphtransformer_diffusiontend.yaml b/training/src/anemoi/training/config/model/graphtransformer_diffusiontend.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/graphtransformer_ens.yaml b/training/src/anemoi/training/config/model/graphtransformer_ens.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/point_wise.yaml b/training/src/anemoi/training/config/model/point_wise.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/transformer.yaml b/training/src/anemoi/training/config/model/transformer.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/transformer_diffusion.yaml b/training/src/anemoi/training/config/model/transformer_diffusion.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/transformer_diffusiontend.yaml b/training/src/anemoi/training/config/model/transformer_diffusiontend.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/transformer_ens.yaml b/training/src/anemoi/training/config/model/transformer_ens.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/model/transformer_transformermapper.yaml b/training/src/anemoi/training/config/model/transformer_transformermapper.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/multi.yaml b/training/src/anemoi/training/config/multi.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/point_wise.yaml b/training/src/anemoi/training/config/point_wise.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/stretched.yaml b/training/src/anemoi/training/config/stretched.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/system/example.yaml b/training/src/anemoi/training/config/system/example.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/system/hardware/example.yaml b/training/src/anemoi/training/config/system/hardware/example.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/system/hardware/slurm.yaml b/training/src/anemoi/training/config/system/hardware/slurm.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/system/input/example.yaml b/training/src/anemoi/training/config/system/input/example.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/system/output/example.yaml b/training/src/anemoi/training/config/system/output/example.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/system/slurm.yaml b/training/src/anemoi/training/config/system/slurm.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/task/autoencoder.yaml b/training/src/anemoi/training/config/task/autoencoder.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/task/forecaster.yaml b/training/src/anemoi/training/config/task/forecaster.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/task/temporal_downscaler.yaml b/training/src/anemoi/training/config/task/temporal_downscaler.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/diffusion.yaml b/training/src/anemoi/training/config/training/diffusion.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/ensemble.yaml b/training/src/anemoi/training/config/training/ensemble.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/lam.yaml b/training/src/anemoi/training/config/training/lam.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/multi.yaml b/training/src/anemoi/training/config/training/multi.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/optimization/default.yaml b/training/src/anemoi/training/config/training/optimization/default.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/optimization/lr_scheduler/cosine_scheduler.yaml b/training/src/anemoi/training/config/training/optimization/lr_scheduler/cosine_scheduler.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/optimization/optimizer/adamw.yaml b/training/src/anemoi/training/config/training/optimization/optimizer/adamw.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/optimization/optimizer/ademamix.yaml b/training/src/anemoi/training/config/training/optimization/optimizer/ademamix.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/optimization/optimizer/zero.yaml b/training/src/anemoi/training/config/training/optimization/optimizer/zero.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/scalers/global.yaml b/training/src/anemoi/training/config/training/scalers/global.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/scalers/lam.yaml b/training/src/anemoi/training/config/training/scalers/lam.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/scalers/multi.yaml b/training/src/anemoi/training/config/training/scalers/multi.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/scalers/stretched.yaml b/training/src/anemoi/training/config/training/scalers/stretched.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/single.yaml b/training/src/anemoi/training/config/training/single.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/stretched.yaml b/training/src/anemoi/training/config/training/stretched.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/training_loss/single.yaml b/training/src/anemoi/training/config/training/training_loss/single.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/training_loss/single_combined.yaml b/training/src/anemoi/training/config/training/training_loss/single_combined.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/weight_averaging/ema.yaml b/training/src/anemoi/training/config/training/weight_averaging/ema.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/config/training/weight_averaging/swa.yaml b/training/src/anemoi/training/config/training/weight_averaging/swa.yaml old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/data/__init__.py b/training/src/anemoi/training/data/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/data/data_reader.py b/training/src/anemoi/training/data/data_reader.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/data/datamodule.py b/training/src/anemoi/training/data/datamodule.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/data/multidataset.py b/training/src/anemoi/training/data/multidataset.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/data/relative_time_indices.py b/training/src/anemoi/training/data/relative_time_indices.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/data/usable_indices.py b/training/src/anemoi/training/data/usable_indices.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/__init__.py b/training/src/anemoi/training/diagnostics/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/benchmark_server.py b/training/src/anemoi/training/diagnostics/benchmark_server.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/__init__.py b/training/src/anemoi/training/diagnostics/callbacks/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/checkpoint.py b/training/src/anemoi/training/diagnostics/callbacks/checkpoint.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/evaluation.py b/training/src/anemoi/training/diagnostics/callbacks/evaluation.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/optimiser.py b/training/src/anemoi/training/diagnostics/callbacks/optimiser.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/plot.py b/training/src/anemoi/training/diagnostics/callbacks/plot.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/plot_adapter.py b/training/src/anemoi/training/diagnostics/callbacks/plot_adapter.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/plot_ens.py b/training/src/anemoi/training/diagnostics/callbacks/plot_ens.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/profiler.py b/training/src/anemoi/training/diagnostics/callbacks/profiler.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/provenance.py b/training/src/anemoi/training/diagnostics/callbacks/provenance.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/sanity.py b/training/src/anemoi/training/diagnostics/callbacks/sanity.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/stopping.py b/training/src/anemoi/training/diagnostics/callbacks/stopping.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/callbacks/weight_averaging.py b/training/src/anemoi/training/diagnostics/callbacks/weight_averaging.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/continents.json b/training/src/anemoi/training/diagnostics/continents.json old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/countries.geo.json b/training/src/anemoi/training/diagnostics/countries.geo.json old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/focus_area.py b/training/src/anemoi/training/diagnostics/focus_area.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/logger.py b/training/src/anemoi/training/diagnostics/logger.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/maps.py b/training/src/anemoi/training/diagnostics/maps.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/mlflow/__init__.py b/training/src/anemoi/training/diagnostics/mlflow/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/mlflow/azureml.py b/training/src/anemoi/training/diagnostics/mlflow/azureml.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/mlflow/logger.py b/training/src/anemoi/training/diagnostics/mlflow/logger.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/mlflow/system_metrics/cpu_monitor.py b/training/src/anemoi/training/diagnostics/mlflow/system_metrics/cpu_monitor.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/mlflow/system_metrics/gpu_monitor.py b/training/src/anemoi/training/diagnostics/mlflow/system_metrics/gpu_monitor.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/mlflow/utils.py b/training/src/anemoi/training/diagnostics/mlflow/utils.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/plots.py b/training/src/anemoi/training/diagnostics/plots.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/profilers.py b/training/src/anemoi/training/diagnostics/profilers.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/diagnostics/projections.py b/training/src/anemoi/training/diagnostics/projections.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/distributed/__init__.py b/training/src/anemoi/training/distributed/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/distributed/groups.py b/training/src/anemoi/training/distributed/groups.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/distributed/strategy.py b/training/src/anemoi/training/distributed/strategy.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/__init__.py b/training/src/anemoi/training/losses/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/base.py b/training/src/anemoi/training/losses/base.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/combined.py b/training/src/anemoi/training/losses/combined.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/huber.py b/training/src/anemoi/training/losses/huber.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/kcrps.py b/training/src/anemoi/training/losses/kcrps.py old mode 100755 new mode 100644 index f32a1938e6..5e1fc146bf --- a/training/src/anemoi/training/losses/kcrps.py +++ b/training/src/anemoi/training/losses/kcrps.py @@ -151,7 +151,6 @@ def _kernel_crps(self, preds: torch.Tensor, targets: torch.Tensor, alpha: float var = torch.abs(preds.unsqueeze(dim=-1) - preds.unsqueeze(dim=-2)) diag = torch.eye(ens_size, dtype=torch.bool, device=preds.device) - import ipdb; ipdb.set_trace() err_r = einops.repeat( torch.abs(preds - targets.unsqueeze(dim=-1)), "batch t var latlon ens -> batch t var latlon n ens", diff --git a/training/src/anemoi/training/losses/logcosh.py b/training/src/anemoi/training/losses/logcosh.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/mae.py b/training/src/anemoi/training/losses/mae.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/mse.py b/training/src/anemoi/training/losses/mse.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/multiscale.py b/training/src/anemoi/training/losses/multiscale.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/rmse.py b/training/src/anemoi/training/losses/rmse.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scaler_tensor.py b/training/src/anemoi/training/losses/scaler_tensor.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scalers/__init__.py b/training/src/anemoi/training/losses/scalers/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scalers/base_scaler.py b/training/src/anemoi/training/losses/scalers/base_scaler.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scalers/loss_weights_mask.py b/training/src/anemoi/training/losses/scalers/loss_weights_mask.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scalers/node_attributes.py b/training/src/anemoi/training/losses/scalers/node_attributes.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scalers/scalers.py b/training/src/anemoi/training/losses/scalers/scalers.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scalers/time_step.py b/training/src/anemoi/training/losses/scalers/time_step.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scalers/variable.py b/training/src/anemoi/training/losses/scalers/variable.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scalers/variable_level.py b/training/src/anemoi/training/losses/scalers/variable_level.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scalers/variable_masking.py b/training/src/anemoi/training/losses/scalers/variable_masking.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/scalers/variable_tendency.py b/training/src/anemoi/training/losses/scalers/variable_tendency.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/spectral.py b/training/src/anemoi/training/losses/spectral.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/utils.py b/training/src/anemoi/training/losses/utils.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/variable_mapper.py b/training/src/anemoi/training/losses/variable_mapper.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/losses/weighted_mse.py b/training/src/anemoi/training/losses/weighted_mse.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/optimizers/AdEMAMix.py b/training/src/anemoi/training/optimizers/AdEMAMix.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/schemas/__init__.py b/training/src/anemoi/training/schemas/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/schemas/base_schema.py b/training/src/anemoi/training/schemas/base_schema.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/schemas/data.py b/training/src/anemoi/training/schemas/data.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/schemas/dataloader.py b/training/src/anemoi/training/schemas/dataloader.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/schemas/diagnostics.py b/training/src/anemoi/training/schemas/diagnostics.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/schemas/schema_utils.py b/training/src/anemoi/training/schemas/schema_utils.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/schemas/system.py b/training/src/anemoi/training/schemas/system.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/schemas/tasks.py b/training/src/anemoi/training/schemas/tasks.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/tasks/__init__.py b/training/src/anemoi/training/tasks/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/tasks/base.py b/training/src/anemoi/training/tasks/base.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/tasks/forecaster.py b/training/src/anemoi/training/tasks/forecaster.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/tasks/temporal_downscaler.py b/training/src/anemoi/training/tasks/temporal_downscaler.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/tasks/timeless.py b/training/src/anemoi/training/tasks/timeless.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/train/__init__.py b/training/src/anemoi/training/train/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/train/methods/__init__.py b/training/src/anemoi/training/train/methods/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/train/methods/base.py b/training/src/anemoi/training/train/methods/base.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/train/methods/diffusion.py b/training/src/anemoi/training/train/methods/diffusion.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/train/methods/ensemble.py b/training/src/anemoi/training/train/methods/ensemble.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/train/methods/single.py b/training/src/anemoi/training/train/methods/single.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/train/profiler.py b/training/src/anemoi/training/train/profiler.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/train/train.py b/training/src/anemoi/training/train/train.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/__init__.py b/training/src/anemoi/training/utils/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/checkpoint.py b/training/src/anemoi/training/utils/checkpoint.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/custom_colormaps.py b/training/src/anemoi/training/utils/custom_colormaps.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/enums.py b/training/src/anemoi/training/utils/enums.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/index_space.py b/training/src/anemoi/training/utils/index_space.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/jsonify.py b/training/src/anemoi/training/utils/jsonify.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/masks.py b/training/src/anemoi/training/utils/masks.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/mlflow_sync.py b/training/src/anemoi/training/utils/mlflow_sync.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/seeding.py b/training/src/anemoi/training/utils/seeding.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/time_indices.py b/training/src/anemoi/training/utils/time_indices.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/variables_metadata.py b/training/src/anemoi/training/utils/variables_metadata.py old mode 100755 new mode 100644 diff --git a/training/src/anemoi/training/utils/worker_init.py b/training/src/anemoi/training/utils/worker_init.py old mode 100755 new mode 100644 diff --git a/training/src/hydra_plugins/anemoi_searchpath/__init__.py b/training/src/hydra_plugins/anemoi_searchpath/__init__.py old mode 100755 new mode 100644 diff --git a/training/src/hydra_plugins/anemoi_searchpath/anemoi_searchpath_plugin.py b/training/src/hydra_plugins/anemoi_searchpath/anemoi_searchpath_plugin.py old mode 100755 new mode 100644 diff --git a/training/tests/conftest.py b/training/tests/conftest.py old mode 100755 new mode 100644 diff --git a/training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.py b/training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.py old mode 100755 new mode 100644 diff --git a/training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.yaml b/training/tests/integration/aicon/test_cicd_aicon_04_icon-dream_medium.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/benchmark/base.yaml b/training/tests/integration/config/benchmark/base.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/benchmark/diffusiontend.yaml b/training/tests/integration/config/benchmark/diffusiontend.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/benchmark/ensemble_crps.yaml b/training/tests/integration/config/benchmark/ensemble_crps.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/benchmark/graphtransformer.yaml b/training/tests/integration/config/benchmark/graphtransformer.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/benchmark/lam.yaml b/training/tests/integration/config/benchmark/lam.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/benchmark/stretched.yaml b/training/tests/integration/config/benchmark/stretched.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/imputer_modifications.yaml b/training/tests/integration/config/imputer_modifications.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/test_autoencoder.yaml b/training/tests/integration/config/test_autoencoder.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/test_diffusion.yaml b/training/tests/integration/config/test_diffusion.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/test_ensemble_crps.yaml b/training/tests/integration/config/test_ensemble_crps.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/test_filtering.yaml b/training/tests/integration/config/test_filtering.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/test_global.yaml b/training/tests/integration/config/test_global.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/test_lam.yaml b/training/tests/integration/config/test_lam.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/test_multidatasets.yaml b/training/tests/integration/config/test_multidatasets.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/test_stretched.yaml b/training/tests/integration/config/test_stretched.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/test_temporal_downscaler.yaml b/training/tests/integration/config/test_temporal_downscaler.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/test_temporal_downscaler_ensemble.yaml b/training/tests/integration/config/test_temporal_downscaler_ensemble.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/config/testing_modifications.yaml b/training/tests/integration/config/testing_modifications.yaml old mode 100755 new mode 100644 diff --git a/training/tests/integration/conftest.py b/training/tests/integration/conftest.py old mode 100755 new mode 100644 diff --git a/training/tests/integration/schemas/partial_metadata_schema.py b/training/tests/integration/schemas/partial_metadata_schema.py old mode 100755 new mode 100644 diff --git a/training/tests/integration/scripts/update_slt_configs.py b/training/tests/integration/scripts/update_slt_configs.py old mode 100755 new mode 100644 diff --git a/training/tests/integration/test_benchmark.py b/training/tests/integration/test_benchmark.py old mode 100755 new mode 100644 diff --git a/training/tests/integration/test_training_cycle.py b/training/tests/integration/test_training_cycle.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/checkpoint/conftest.py b/training/tests/unit/checkpoint/conftest.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/checkpoint/test_base.py b/training/tests/unit/checkpoint/test_base.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/checkpoint/test_catalog.py b/training/tests/unit/checkpoint/test_catalog.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/checkpoint/test_exceptions.py b/training/tests/unit/checkpoint/test_exceptions.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/checkpoint/test_formats.py b/training/tests/unit/checkpoint/test_formats.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/checkpoint/test_pipeline.py b/training/tests/unit/checkpoint/test_pipeline.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/checkpoint/test_utils.py b/training/tests/unit/checkpoint/test_utils.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/commands/test_config.py b/training/tests/unit/commands/test_config.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/commands/test_mlflow.py b/training/tests/unit/commands/test_mlflow.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/conftest.py b/training/tests/unit/conftest.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/data/test_dataset.py b/training/tests/unit/data/test_dataset.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/data/test_multidataset.py b/training/tests/unit/data/test_multidataset.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/data/test_relative_time_indices.py b/training/tests/unit/data/test_relative_time_indices.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/data/test_usable_indices.py b/training/tests/unit/data/test_usable_indices.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/callbacks/test_timelimit.py b/training/tests/unit/diagnostics/callbacks/test_timelimit.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/callbacks/test_variable_order.py b/training/tests/unit/diagnostics/callbacks/test_variable_order.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/callbacks/test_weight_averaging.py b/training/tests/unit/diagnostics/callbacks/test_weight_averaging.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/mlflow/test_azureml_mlflow_logger.py b/training/tests/unit/diagnostics/mlflow/test_azureml_mlflow_logger.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/mlflow/test_mlflow_logger.py b/training/tests/unit/diagnostics/mlflow/test_mlflow_logger.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/mlflow/test_mlflow_utils.py b/training/tests/unit/diagnostics/mlflow/test_mlflow_utils.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/test_callbacks.py b/training/tests/unit/diagnostics/test_callbacks.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/test_checkpoint.py b/training/tests/unit/diagnostics/test_checkpoint.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/test_focus_area.py b/training/tests/unit/diagnostics/test_focus_area.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/test_plot_adapters.py b/training/tests/unit/diagnostics/test_plot_adapters.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/test_plotting_callbacks.py b/training/tests/unit/diagnostics/test_plotting_callbacks.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/test_plotting_ens_callbacks.py b/training/tests/unit/diagnostics/test_plotting_ens_callbacks.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/diagnostics/test_weightandbiases.py b/training/tests/unit/diagnostics/test_weightandbiases.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/distributed/test_groups.py b/training/tests/unit/distributed/test_groups.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/hydra/test_search_path_plugins.py b/training/tests/unit/hydra/test_search_path_plugins.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/losses/test_combined_loss.py b/training/tests/unit/losses/test_combined_loss.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/losses/test_filtered_loss.py b/training/tests/unit/losses/test_filtered_loss.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/losses/test_loss_function.py b/training/tests/unit/losses/test_loss_function.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/losses/test_loss_scaling.py b/training/tests/unit/losses/test_loss_scaling.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/losses/test_multiscale_loss.py b/training/tests/unit/losses/test_multiscale_loss.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/losses/test_scaler.py b/training/tests/unit/losses/test_scaler.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/requirements.txt b/training/tests/unit/requirements.txt old mode 100755 new mode 100644 diff --git a/training/tests/unit/schemas/test_expand_paths.py b/training/tests/unit/schemas/test_expand_paths.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/tasks/test_autoencoder.py b/training/tests/unit/tasks/test_autoencoder.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/tasks/test_forecaster.py b/training/tests/unit/tasks/test_forecaster.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/tasks/test_temporal_downscaler.py b/training/tests/unit/tasks/test_temporal_downscaler.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/train/test_checkpoint_loading.py b/training/tests/unit/train/test_checkpoint_loading.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/train/test_methods.py b/training/tests/unit/train/test_methods.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/train/test_optimizer.py b/training/tests/unit/train/test_optimizer.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/train/test_print_variable_scaling.py b/training/tests/unit/train/test_print_variable_scaling.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/train/test_profiler.py b/training/tests/unit/train/test_profiler.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/train/test_restarting_run.py b/training/tests/unit/train/test_restarting_run.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/utils/test_masks.py b/training/tests/unit/utils/test_masks.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/utils/test_seeding.py b/training/tests/unit/utils/test_seeding.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/utils/test_time_indices.py b/training/tests/unit/utils/test_time_indices.py old mode 100755 new mode 100644 diff --git a/training/tests/unit/utils/test_variable_grouping.py b/training/tests/unit/utils/test_variable_grouping.py old mode 100755 new mode 100644 From c0e88d5d506178737ec944e622dcce056a1311fc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 16:21:27 +0000 Subject: [PATCH 48/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- configs/debug.sh | 2 +- configs/debug_td.yaml | 5 ++--- configs_old/configs/dataloader/native_grid_forecaster.yaml | 2 +- configs_old/configs/debug.sh | 4 ++-- configs_old/configs/diff2_model_forecast.sh | 4 ++-- configs_old/configs/diff_model_forecast.sh | 4 ++-- configs_old/configs/ensemble_interpolator.yaml | 1 - configs_old/configs/graph/n320.yaml | 1 - configs_old/configs/graph/n320_mario.yaml | 1 - configs_old/configs/jobscript_forecast.sh | 4 ++-- configs_old/configs/jobscript_forecast_2.sh | 4 ++-- configs_old/configs/jobscript_interp.sh | 4 ++-- configs_old/configs/jobscript_interp_2.sh | 4 ++-- configs_old/configs/jobscript_interp_3.sh | 4 ++-- configs_old/configs/jobscript_out.sh | 4 ++-- configs_old/configs/jobscript_wind.sh | 4 ++-- .../training/config/training/training_loss/ensemble.yaml | 1 - training/src/anemoi/training/schemas/training.py | 1 - training/tests/integration/conftest.py | 1 - training/tests/unit/schemas/test_training_schemas.py | 1 - 20 files changed, 24 insertions(+), 32 deletions(-) diff --git a/configs/debug.sh b/configs/debug.sh index 87cf360495..6bee91f2b3 100755 --- a/configs/debug.sh +++ b/configs/debug.sh @@ -11,7 +11,7 @@ #SBATCH --time=2:00:00 #SBATCH -o %x-%j.out - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 diff --git a/configs/debug_td.yaml b/configs/debug_td.yaml index 5f00ca2636..cc58d00a82 100755 --- a/configs/debug_td.yaml +++ b/configs/debug_td.yaml @@ -74,13 +74,13 @@ model: hidden2hidden: 0 processor: num_chunks: 8 - graph_attention_backend: "pyg" + graph_attention_backend: "pyg" encoder: num_chunks: 8 graph_attention_backend: "pyg" decoder: num_chunks: 8 - graph_attention_backend: "pyg" + graph_attention_backend: "pyg" training: scalers: @@ -132,4 +132,3 @@ training: ignore_nans: False no_autocast: True alpha: 0.95 - diff --git a/configs_old/configs/dataloader/native_grid_forecaster.yaml b/configs_old/configs/dataloader/native_grid_forecaster.yaml index 6e70a96280..451b45d7cd 100755 --- a/configs_old/configs/dataloader/native_grid_forecaster.yaml +++ b/configs_old/configs/dataloader/native_grid_forecaster.yaml @@ -51,7 +51,7 @@ grid_indices: # ============ dataset: ${hardware.paths.data}/${hardware.files.dataset} -reorder_list: {'10u': 0, '10v': 1, '2d': 2, '2t': 3, 'cos_julian_day': 4, 'cos_latitude': 5, 'cos_local_time': 6, 'cos_longitude': 7, 'cp': 8, 'hcc': 9, +reorder_list: {'10u': 0, '10v': 1, '2d': 2, '2t': 3, 'cos_julian_day': 4, 'cos_latitude': 5, 'cos_local_time': 6, 'cos_longitude': 7, 'cp': 8, 'hcc': 9, 'insolation': 10, 'lcc': 11, 'lsm': 12, 'mcc': 13, 'msl': 14, 'q_100': 15, 'q_1000': 16, 'q_150': 17, 'q_200': 18, 'q_250': 19, 'q_300': 20, 'q_400': 21, 'q_50': 22, 'q_500': 23, 'q_600': 24, 'q_700': 25, 'q_850': 26, 'q_925': 27, 'sin_julian_day': 28, 'sin_latitude': 29, 'sin_local_time': 30, 'sin_longitude': 31, 'skt': 32, 'sp': 33, 'ssrd': 34, 'strd': 35, 't_100': 36, 't_1000': 37, 't_150': 38, 't_200': 39, 't_250': 40, 't_300': 41, 't_400': 42, 't_50': 43, diff --git a/configs_old/configs/debug.sh b/configs_old/configs/debug.sh index d5d63aac80..57c0671ac4 100755 --- a/configs_old/configs/debug.sh +++ b/configs_old/configs/debug.sh @@ -12,12 +12,12 @@ #SBATCH -o %x-%j.out #source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 export PYTHONUNBUFFERED=1 -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate +source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate srun anemoi-training train diagnostics.log.mlflow.run_name="debug" --config-name=debug_hourly diff --git a/configs_old/configs/diff2_model_forecast.sh b/configs_old/configs/diff2_model_forecast.sh index 21f908d84a..e97b313445 100755 --- a/configs_old/configs/diff2_model_forecast.sh +++ b/configs_old/configs/diff2_model_forecast.sh @@ -12,12 +12,12 @@ #SBATCH -o %x-%j.out #source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 export PYTHONUNBUFFERED=1 -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate +source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate srun anemoi-training train training.run_id=3fda52ea9cc747cd92be0bd41e9558fc model.processor.num_layers=8 training.load_weights_only=False training.transfer_learning=False diagnostics.log.mlflow.run_name="fine tune forecast agg 8" --config-name=fine_ensinterp_agg diff --git a/configs_old/configs/diff_model_forecast.sh b/configs_old/configs/diff_model_forecast.sh index 164d8424ac..a2eca46eac 100755 --- a/configs_old/configs/diff_model_forecast.sh +++ b/configs_old/configs/diff_model_forecast.sh @@ -12,12 +12,12 @@ #SBATCH -o %x-%j.out #source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 export PYTHONUNBUFFERED=1 -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate +source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate srun anemoi-training train training.run_id=06d2dff106374533817fe94f9135a877 model.processor.num_layers=8 model.num_channels=2048 training.load_weights_only=False training.transfer_learning=False diagnostics.log.mlflow.run_name="fine tune forecast agg 8 2048" --config-name=fine_ensinterp_agg diff --git a/configs_old/configs/ensemble_interpolator.yaml b/configs_old/configs/ensemble_interpolator.yaml index 6bd13a3d64..cf873173b6 100755 --- a/configs_old/configs/ensemble_interpolator.yaml +++ b/configs_old/configs/ensemble_interpolator.yaml @@ -47,4 +47,3 @@ training: use_all_targets: True #whether to use all interp targets or cycle through them, one each iteration. ensemble_size_per_device: 1 - diff --git a/configs_old/configs/graph/n320.yaml b/configs_old/configs/graph/n320.yaml index 748615814b..8e35c32785 100755 --- a/configs_old/configs/graph/n320.yaml +++ b/configs_old/configs/graph/n320.yaml @@ -64,4 +64,3 @@ attributes: norm: unit-std post_processors: [] - diff --git a/configs_old/configs/graph/n320_mario.yaml b/configs_old/configs/graph/n320_mario.yaml index 2e0a981b79..84e14c9e56 100755 --- a/configs_old/configs/graph/n320_mario.yaml +++ b/configs_old/configs/graph/n320_mario.yaml @@ -62,4 +62,3 @@ attributes: norm: unit-std post_processors: [] - diff --git a/configs_old/configs/jobscript_forecast.sh b/configs_old/configs/jobscript_forecast.sh index e87508830b..a481614dff 100755 --- a/configs_old/configs/jobscript_forecast.sh +++ b/configs_old/configs/jobscript_forecast.sh @@ -12,12 +12,12 @@ #SBATCH -o %x-%j.out #source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 export PYTHONUNBUFFERED=1 -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate +source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate srun anemoi-training train training.run_id=a044a3d47e8846e88040890a2cc26b4f training.scalers.general_variable.weights.cp=0.1 training.scalers.general_variable.weights.tp=1 training.load_weights_only=False training.transfer_learning=False diagnostics.log.mlflow.run_name="high cp tp 1" --config-name=fine_ensinterp_agg diff --git a/configs_old/configs/jobscript_forecast_2.sh b/configs_old/configs/jobscript_forecast_2.sh index a2c58b955c..1ab7ebd7a7 100755 --- a/configs_old/configs/jobscript_forecast_2.sh +++ b/configs_old/configs/jobscript_forecast_2.sh @@ -12,12 +12,12 @@ #SBATCH -o %x-%j.out #source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 export PYTHONUNBUFFERED=1 -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate +source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate srun anemoi-training train training.run_id=9890414472674d5c84cc964bf2318c7d training.scalers.general_variable.weights.cp=0.025 training.scalers.general_variable.weights.tp=0.25 training.load_weights_only=False training.transfer_learning=False diagnostics.log.mlflow.run_name="high cp tp 0.25" --config-name=fine_ensinterp_agg diff --git a/configs_old/configs/jobscript_interp.sh b/configs_old/configs/jobscript_interp.sh index a92a7cad65..6aeff50b1a 100755 --- a/configs_old/configs/jobscript_interp.sh +++ b/configs_old/configs/jobscript_interp.sh @@ -12,12 +12,12 @@ #SBATCH -o %x-%j.out #source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 export PYTHONUNBUFFERED=1 -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate +source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate srun anemoi-training train training.run_id=437a0406460c4c0e8a9f13ccc963b6f4 training.aggregate_outputs=["mean","max","min","diff"] diagnostics.log.mlflow.run_name='graph 6 interp agg' --config-name=ensinterp_o96_nogap_tendency_back diff --git a/configs_old/configs/jobscript_interp_2.sh b/configs_old/configs/jobscript_interp_2.sh index e76eec0c7d..5ca2ba463c 100755 --- a/configs_old/configs/jobscript_interp_2.sh +++ b/configs_old/configs/jobscript_interp_2.sh @@ -12,12 +12,12 @@ #SBATCH -o %x-%j.out #source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 export PYTHONUNBUFFERED=1 -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate +source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate srun anemoi-training train training.run_id=95d57ac1a4be4bae8c67e3b1dfe33558 diagnostics.log.mlflow.run_name='graph 6 interp diff' --config-name=diff_interp_only diff --git a/configs_old/configs/jobscript_interp_3.sh b/configs_old/configs/jobscript_interp_3.sh index 576baee98a..225ad6d6d0 100755 --- a/configs_old/configs/jobscript_interp_3.sh +++ b/configs_old/configs/jobscript_interp_3.sh @@ -12,12 +12,12 @@ #SBATCH -o %x-%j.out #source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 export PYTHONUNBUFFERED=1 -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate +source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate srun anemoi-training train training.run_id=7a6270d63ab54b75a9660b009c6f32ad diagnostics.log.mlflow.run_name='graph 6 gap interp diff' --config-name=ens_interp_nogap diff --git a/configs_old/configs/jobscript_out.sh b/configs_old/configs/jobscript_out.sh index 54b243daeb..78bffdd423 100755 --- a/configs_old/configs/jobscript_out.sh +++ b/configs_old/configs/jobscript_out.sh @@ -12,10 +12,10 @@ #SBATCH -o %x-%j.out #source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate +source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate srun anemoi-training train training.run_id=5994b5275fc5458cb977bf99bcec6bae --config-name=single_11_new_rollout diff --git a/configs_old/configs/jobscript_wind.sh b/configs_old/configs/jobscript_wind.sh index cd6ec8eb52..cf55744fec 100755 --- a/configs_old/configs/jobscript_wind.sh +++ b/configs_old/configs/jobscript_wind.sh @@ -12,12 +12,12 @@ #SBATCH -o %x-%j.out #source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - + module load Stages/2025 GCCcore/.13.3.0 module load Python/3.12.3 export PYTHONUNBUFFERED=1 -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate +source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate srun anemoi-training train dataloader=native_grid_nowind training.fork_run_id=f791b1b356e44c3cbf4e53e45ec086c2 diagnostics.log.mlflow.run_name='no_wind_rain' --config-name=single_11_new_rollout diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble.yaml index ebe0679e24..6c6c1b45ec 100644 --- a/training/src/anemoi/training/config/training/training_loss/ensemble.yaml +++ b/training/src/anemoi/training/config/training/training_loss/ensemble.yaml @@ -21,4 +21,3 @@ datasets: ignore_nans: False no_autocast: True alpha: 0.95 - diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 3afdaae2ad..a18b5093ea 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -21,7 +21,6 @@ from pydantic import NonNegativeFloat from pydantic import NonNegativeInt from pydantic import PositiveInt -from pydantic import Tag from pydantic import field_validator from pydantic import model_validator diff --git a/training/tests/integration/conftest.py b/training/tests/integration/conftest.py index 0fcc749b4b..67af2e7404 100644 --- a/training/tests/integration/conftest.py +++ b/training/tests/integration/conftest.py @@ -278,7 +278,6 @@ def handle_truncation_matrices(cfg: DictConfig, get_test_data: GetTestData) -> D resolved_path = str(Path(tmp_path_loss_matrices).parent) cfg.system.input.loss_matrices_path = Path(tmp_path_loss_matrices).parent - val_multiscale_cfg = cfg.training.validation_metrics.datasets[dataset_name].multiscale.multiscale_config OmegaConf.set_struct(val_multiscale_cfg, False) val_multiscale_cfg.loss_matrices_path = resolved_path diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py index e7a2c63cff..d1cc21e417 100644 --- a/training/tests/unit/schemas/test_training_schemas.py +++ b/training/tests/unit/schemas/test_training_schemas.py @@ -10,7 +10,6 @@ import pytest from pydantic import ValidationError - from anemoi.training.schemas.training import OptimizerSchema from anemoi.training.schemas.training import TimeAggregateLossWrapperSchema From 3f7dab516084d54df3902b6a8c03c1214b235e06 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 8 May 2026 16:23:07 +0000 Subject: [PATCH 49/88] rm configs --- configs/autoencoder.yaml | 49 -- configs/config.yaml | 14 - configs/data/multi.yaml | 83 --- configs/data/zarr.yaml | 81 --- configs/data/zarr_interp.yaml | 101 --- configs/dataloader/multi.yaml | 101 --- configs/dataloader/native_grid.yaml | 82 --- configs/dataloader/native_grid_td.yaml | 82 --- configs/debug.sh | 22 - configs/debug_td.yaml | 135 ---- .../benchmark_profiler/detailed.yaml | 20 - .../benchmark_profiler/simple.yaml | 20 - .../diagnostics/callbacks/placeholder.yaml | 1 - .../diagnostics/callbacks/rollout_eval.yaml | 5 - configs/diagnostics/evaluation.yaml | 36 - configs/diagnostics/evaluation_ens.yaml | 86 --- configs/diagnostics/evaluation_multi.yaml | 32 - configs/diagnostics/log/mlflow.yaml | 18 - configs/diagnostics/log/wandb.yaml | 12 - configs/diagnostics/plot/detailed.yaml | 98 --- configs/diagnostics/plot/multi.yaml | 124 ---- configs/diagnostics/plot/simple.yaml | 61 -- configs/diffusion.yaml | 14 - configs/ensemble_crps.yaml | 51 -- configs/graph/encoder_decoder_only.yaml | 54 -- configs/graph/existing.yaml | 4 - configs/graph/hierarchical_2level.yaml | 99 --- ...rarchical_2level_encoder_decoder_only.yaml | 80 --- configs/graph/hierarchical_3level.yaml | 125 ---- configs/graph/limited_area.yaml | 75 -- configs/graph/multi.yaml | 94 --- configs/graph/multi_scale.yaml | 61 -- configs/graph/n320.yaml | 61 -- configs/graph/point_wise.yaml | 19 - configs/graph/stretched_grid.yaml | 78 --- configs/hierarchical.yaml | 30 - configs/hierarchical_autoencoder.yaml | 43 -- configs/lam.yaml | 38 - configs/model/gnn.yaml | 103 --- configs/model/graphtransformer.yaml | 148 ---- configs/model/graphtransformer_diffusion.yaml | 149 ---- .../model/graphtransformer_diffusiontend.yaml | 150 ---- configs/model/graphtransformer_ens.yaml | 182 ----- configs/model/point_wise.yaml | 101 --- configs/model/transformer.yaml | 149 ---- configs/model/transformer_diffusion.yaml | 150 ---- configs/model/transformer_diffusiontend.yaml | 150 ---- configs/model/transformer_ens.yaml | 178 ----- .../model/transformer_transformermapper.yaml | 121 ---- configs/multi.yaml | 40 -- .../2026-04-28/14-01-44/.hydra/config.yaml | 656 ----------------- .../2026-04-28/14-01-44/.hydra/hydra.yaml | 178 ----- .../2026-04-28/14-01-44/.hydra/overrides.yaml | 1 - .../2026-04-28/14-05-13/.hydra/config.yaml | 658 ------------------ .../2026-04-28/14-05-13/.hydra/hydra.yaml | 178 ----- .../2026-04-28/14-05-13/.hydra/overrides.yaml | 1 - .../2026-04-28/14-05-41/.hydra/config.yaml | 656 ----------------- .../2026-04-28/14-05-41/.hydra/hydra.yaml | 178 ----- .../2026-04-28/14-05-41/.hydra/overrides.yaml | 1 - .../2026-04-28/14-13-07/.hydra/config.yaml | 639 ----------------- .../2026-04-28/14-13-07/.hydra/hydra.yaml | 178 ----- .../2026-04-28/14-13-07/.hydra/overrides.yaml | 1 - .../2026-04-28/14-17-02/.hydra/config.yaml | 635 ----------------- .../2026-04-28/14-17-02/.hydra/hydra.yaml | 180 ----- .../2026-04-28/14-17-02/.hydra/overrides.yaml | 1 - .../2026-04-28/14-18-18/.hydra/config.yaml | 618 ---------------- .../2026-04-28/14-18-18/.hydra/hydra.yaml | 180 ----- .../2026-04-28/14-18-18/.hydra/overrides.yaml | 1 - .../2026-04-28/14-21-51/.hydra/config.yaml | 618 ---------------- .../2026-04-28/14-21-51/.hydra/hydra.yaml | 180 ----- .../2026-04-28/14-21-51/.hydra/overrides.yaml | 1 - .../2026-04-28/14-22-09/.hydra/config.yaml | 618 ---------------- .../2026-04-28/14-22-09/.hydra/hydra.yaml | 180 ----- .../2026-04-28/14-22-09/.hydra/overrides.yaml | 1 - .../2026-04-28/14-31-03/.hydra/config.yaml | 616 ---------------- .../2026-04-28/14-31-03/.hydra/hydra.yaml | 180 ----- .../2026-04-28/14-31-03/.hydra/overrides.yaml | 1 - .../2026-04-28/23-51-24/.hydra/config.yaml | 616 ---------------- .../2026-04-28/23-51-24/.hydra/hydra.yaml | 181 ----- .../2026-04-28/23-51-24/.hydra/overrides.yaml | 1 - .../2026-04-29/15-32-20/.hydra/config.yaml | 616 ---------------- .../2026-04-29/15-32-20/.hydra/hydra.yaml | 181 ----- .../2026-04-29/15-32-20/.hydra/overrides.yaml | 1 - .../2026-04-29/15-48-59/.hydra/config.yaml | 620 ----------------- .../2026-04-29/15-48-59/.hydra/hydra.yaml | 181 ----- .../2026-04-29/15-48-59/.hydra/overrides.yaml | 1 - .../2026-04-30/00-35-05/.hydra/config.yaml | 620 ----------------- .../2026-04-30/00-35-05/.hydra/hydra.yaml | 181 ----- .../2026-04-30/00-35-05/.hydra/overrides.yaml | 1 - .../2026-05-01/01-28-46/.hydra/config.yaml | 620 ----------------- .../2026-05-01/01-28-46/.hydra/hydra.yaml | 181 ----- .../2026-05-01/01-28-46/.hydra/overrides.yaml | 1 - .../2026-05-01/08-37-12/.hydra/config.yaml | 621 ----------------- .../2026-05-01/08-37-12/.hydra/hydra.yaml | 181 ----- .../2026-05-01/08-37-12/.hydra/overrides.yaml | 1 - .../2026-05-02/11-33-12/.hydra/config.yaml | 621 ----------------- .../2026-05-02/11-33-12/.hydra/hydra.yaml | 181 ----- .../2026-05-02/11-33-12/.hydra/overrides.yaml | 1 - .../2026-05-02/11-35-09/.hydra/config.yaml | 621 ----------------- .../2026-05-02/11-35-09/.hydra/hydra.yaml | 181 ----- .../2026-05-02/11-35-09/.hydra/overrides.yaml | 1 - .../2026-05-02/11-38-32/.hydra/config.yaml | 621 ----------------- .../2026-05-02/11-38-32/.hydra/hydra.yaml | 181 ----- .../2026-05-02/11-38-32/.hydra/overrides.yaml | 1 - configs/point_wise.yaml | 20 - configs/stretched.yaml | 39 -- configs/system/example.yaml | 5 - configs/system/hardware/example.yaml | 5 - configs/system/hardware/slurm.yaml | 5 - configs/system/input/example.yaml | 8 - configs/system/input/jupiter.yaml | 8 - configs/system/output/example.yaml | 13 - configs/system/output/jupiter.yaml | 13 - configs/system/slurm.yaml | 5 - configs/task/autoencoder.yaml | 1 - configs/task/forecaster.yaml | 15 - configs/task/temporal_downscaler.yaml | 5 - configs/temporal_downscaler.yaml | 47 -- configs/temporal_downscaler_ensemble.yaml | 77 -- configs/training/diffusion.yaml | 134 ---- configs/training/ensemble.yaml | 138 ---- configs/training/lam.yaml | 118 ---- configs/training/multi.yaml | 116 --- configs/training/optimization/default.yaml | 14 - .../lr_scheduler/cosine_scheduler.yaml | 5 - .../optimization/optimizer/adamw.yaml | 2 - .../optimization/optimizer/ademamix.yaml | 6 - .../training/optimization/optimizer/zero.yaml | 5 - configs/training/scalers/global.yaml | 50 -- configs/training/scalers/lam.yaml | 58 -- configs/training/scalers/multi.yaml | 90 --- configs/training/scalers/stretched.yaml | 71 -- configs/training/single.yaml | 120 ---- configs/training/stretched.yaml | 131 ---- configs/training/training_loss/ensemble.yaml | 13 - .../training_loss/ensemble_combined.yaml | 25 - configs/training/training_loss/single.yaml | 9 - .../training_loss/single_combined.yaml | 15 - configs/training/weight_averaging/ema.yaml | 2 - configs/training/weight_averaging/swa.yaml | 2 - configs_old/configs/bash.sh | 9 - configs_old/configs/bash.sh.save | 12 - configs_old/configs/config.yaml | 14 - configs_old/configs/data/zarr.yaml | 113 --- configs_old/configs/data/zarr_interp.yaml | 99 --- configs_old/configs/data/zarr_new.yaml | 102 --- .../configs/dataloader/native_grid.yaml | 76 -- .../configs/dataloader/native_grid_1.1.yaml | 101 --- .../dataloader/native_grid_forecaster.yaml | 87 --- .../configs/dataloader/native_grid_new.yaml | 101 --- .../dataloader/native_grid_nowind.yaml | 101 --- .../configs/dataloader/native_grid_td.yaml | 76 -- configs_old/configs/datamodule/ens.yaml | 1 - configs_old/configs/datamodule/single.yaml | 1 - configs_old/configs/debug.sh | 23 - configs_old/configs/debug.yaml | 41 -- configs_old/configs/debug_hourly.yaml | 142 ---- .../benchmark_profiler/detailed.yaml | 20 - .../benchmark_profiler/simple.yaml | 20 - .../diagnostics/callbacks/placeholder.yaml | 1 - .../diagnostics/callbacks/rollout_eval.yaml | 4 - .../configs/diagnostics/evaluation.yaml | 64 -- .../configs/diagnostics/evaluation_ens.yaml | 107 --- .../configs/diagnostics/plot/detailed.yaml | 83 --- .../diagnostics/plot/rollout_eval.yaml | 78 --- .../configs/diagnostics/plot/simple.yaml | 41 -- configs_old/configs/diff2_model_forecast.sh | 23 - configs_old/configs/diff_interp_only.yaml | 153 ---- configs_old/configs/diff_model_forecast.sh | 23 - configs_old/configs/diffusion.yaml | 14 - configs_old/configs/ens_interp_nogap.yaml | 156 ----- configs_old/configs/ensemble_crps.yaml | 49 -- .../configs/ensemble_interpolator.yaml | 50 -- .../ensinterp_o96_nogap_tendency_back.yaml | 156 ----- configs_old/configs/fine_ensinterp_agg.yaml | 142 ---- configs_old/configs/fine_ensinterp_diff.yaml | 139 ---- ...ine_ensinterp_o96_nogap_tendency_back.yaml | 142 ---- .../configs/graph/encoder_decoder_only.yaml | 57 -- configs_old/configs/graph/existing.yaml | 8 - configs_old/configs/graph/existing_graph.yaml | 8 - .../configs/graph/hierarchical_2level.yaml | 104 --- .../configs/graph/hierarchical_3level.yaml | 131 ---- configs_old/configs/graph/limited_area.yaml | 82 --- configs_old/configs/graph/multi_scale.yaml | 66 -- configs_old/configs/graph/n320.yaml | 67 -- configs_old/configs/graph/n320_mario.yaml | 65 -- configs_old/configs/graph/stretched_grid.yaml | 80 --- configs_old/configs/hardware/example.yaml | 10 - .../configs/hardware/files/example.yaml | 9 - .../configs/hardware/files/jupiter.yaml | 11 - .../configs/hardware/paths/example.yaml | 13 - .../configs/hardware/paths/jupiter.yaml | 13 - configs_old/configs/hardware/slurm.yaml | 10 - configs_old/configs/hierarchical.yaml | 28 - configs_old/configs/interpolator.yaml | 40 -- configs_old/configs/jobscript_forecast.sh | 23 - configs_old/configs/jobscript_forecast_2.sh | 23 - configs_old/configs/jobscript_interp.sh | 23 - configs_old/configs/jobscript_interp_2.sh | 23 - configs_old/configs/jobscript_interp_3.sh | 23 - configs_old/configs/jobscript_out.sh | 21 - configs_old/configs/jobscript_wind.sh | 23 - configs_old/configs/lam.yaml | 41 -- configs_old/configs/model/gnn.yaml | 96 --- .../configs/model/graphtransformer.yaml | 110 --- .../model/graphtransformer_diffusion.yaml | 107 --- .../model/graphtransformer_diffusiontend.yaml | 107 --- .../configs/model/graphtransformer_ens.yaml | 134 ---- .../model/graphtransformer_ens_new.yaml | 127 ---- configs_old/configs/model/transformer.yaml | 112 --- .../configs/model/transformer_diffusion.yaml | 109 --- .../model/transformer_diffusiontend.yaml | 109 --- .../configs/model/transformer_ens.yaml | 137 ---- .../configs/model/transformer_single_1.1.yaml | 125 ---- .../configs/model/transformer_single_new.yaml | 117 ---- .../model/transformer_transformermapper.yaml | 112 --- .../configs/ms_fine_ensinterp_agg.yaml | 179 ----- .../configs/newscaling_ensinterp_agg.yaml | 124 ---- configs_old/configs/single_11.yaml | 58 -- configs_old/configs/single_11_new.yaml | 58 -- .../configs/single_11_new_rollout.yaml | 70 -- configs_old/configs/stretched.yaml | 36 - configs_old/configs/training/default.yaml | 147 ---- configs_old/configs/training/diffusion.yaml | 147 ---- configs_old/configs/training/ensemble.yaml | 148 ---- .../configs/training/ensemble_new.yaml | 135 ---- .../configs/training/interpolator.yaml | 148 ---- configs_old/configs/training/lam.yaml | 146 ---- .../configs/training/scalers/global.yaml | 59 -- configs_old/configs/training/scalers/lam.yaml | 54 -- .../configs/training/scalers/stretched.yaml | 68 -- configs_old/configs/training/stretched.yaml | 158 ----- 232 files changed, 26552 deletions(-) delete mode 100755 configs/autoencoder.yaml delete mode 100755 configs/config.yaml delete mode 100755 configs/data/multi.yaml delete mode 100755 configs/data/zarr.yaml delete mode 100755 configs/data/zarr_interp.yaml delete mode 100755 configs/dataloader/multi.yaml delete mode 100755 configs/dataloader/native_grid.yaml delete mode 100755 configs/dataloader/native_grid_td.yaml delete mode 100755 configs/debug.sh delete mode 100755 configs/debug_td.yaml delete mode 100755 configs/diagnostics/benchmark_profiler/detailed.yaml delete mode 100755 configs/diagnostics/benchmark_profiler/simple.yaml delete mode 100755 configs/diagnostics/callbacks/placeholder.yaml delete mode 100755 configs/diagnostics/callbacks/rollout_eval.yaml delete mode 100755 configs/diagnostics/evaluation.yaml delete mode 100755 configs/diagnostics/evaluation_ens.yaml delete mode 100755 configs/diagnostics/evaluation_multi.yaml delete mode 100755 configs/diagnostics/log/mlflow.yaml delete mode 100755 configs/diagnostics/log/wandb.yaml delete mode 100755 configs/diagnostics/plot/detailed.yaml delete mode 100755 configs/diagnostics/plot/multi.yaml delete mode 100755 configs/diagnostics/plot/simple.yaml delete mode 100755 configs/diffusion.yaml delete mode 100755 configs/ensemble_crps.yaml delete mode 100755 configs/graph/encoder_decoder_only.yaml delete mode 100755 configs/graph/existing.yaml delete mode 100755 configs/graph/hierarchical_2level.yaml delete mode 100755 configs/graph/hierarchical_2level_encoder_decoder_only.yaml delete mode 100755 configs/graph/hierarchical_3level.yaml delete mode 100755 configs/graph/limited_area.yaml delete mode 100755 configs/graph/multi.yaml delete mode 100755 configs/graph/multi_scale.yaml delete mode 100755 configs/graph/n320.yaml delete mode 100755 configs/graph/point_wise.yaml delete mode 100755 configs/graph/stretched_grid.yaml delete mode 100755 configs/hierarchical.yaml delete mode 100755 configs/hierarchical_autoencoder.yaml delete mode 100755 configs/lam.yaml delete mode 100755 configs/model/gnn.yaml delete mode 100755 configs/model/graphtransformer.yaml delete mode 100755 configs/model/graphtransformer_diffusion.yaml delete mode 100755 configs/model/graphtransformer_diffusiontend.yaml delete mode 100755 configs/model/graphtransformer_ens.yaml delete mode 100755 configs/model/point_wise.yaml delete mode 100755 configs/model/transformer.yaml delete mode 100755 configs/model/transformer_diffusion.yaml delete mode 100755 configs/model/transformer_diffusiontend.yaml delete mode 100755 configs/model/transformer_ens.yaml delete mode 100755 configs/model/transformer_transformermapper.yaml delete mode 100755 configs/multi.yaml delete mode 100755 configs/outputs/2026-04-28/14-01-44/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-28/14-01-44/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-28/14-01-44/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-28/14-05-13/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-28/14-05-13/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-28/14-05-13/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-28/14-05-41/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-28/14-05-41/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-28/14-05-41/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-28/14-13-07/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-28/14-13-07/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-28/14-13-07/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-28/14-17-02/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-28/14-17-02/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-28/14-17-02/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-28/14-18-18/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-28/14-18-18/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-28/14-18-18/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-28/14-21-51/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-28/14-21-51/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-28/14-21-51/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-28/14-22-09/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-28/14-22-09/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-28/14-22-09/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-28/14-31-03/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-28/14-31-03/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-28/14-31-03/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-28/23-51-24/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-28/23-51-24/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-28/23-51-24/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-29/15-32-20/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-29/15-32-20/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-29/15-32-20/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-29/15-48-59/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-29/15-48-59/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-29/15-48-59/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-04-30/00-35-05/.hydra/config.yaml delete mode 100755 configs/outputs/2026-04-30/00-35-05/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-04-30/00-35-05/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-05-01/01-28-46/.hydra/config.yaml delete mode 100755 configs/outputs/2026-05-01/01-28-46/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-05-01/01-28-46/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-05-01/08-37-12/.hydra/config.yaml delete mode 100755 configs/outputs/2026-05-01/08-37-12/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-05-01/08-37-12/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-05-02/11-33-12/.hydra/config.yaml delete mode 100755 configs/outputs/2026-05-02/11-33-12/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-05-02/11-33-12/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-05-02/11-35-09/.hydra/config.yaml delete mode 100755 configs/outputs/2026-05-02/11-35-09/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-05-02/11-35-09/.hydra/overrides.yaml delete mode 100755 configs/outputs/2026-05-02/11-38-32/.hydra/config.yaml delete mode 100755 configs/outputs/2026-05-02/11-38-32/.hydra/hydra.yaml delete mode 100755 configs/outputs/2026-05-02/11-38-32/.hydra/overrides.yaml delete mode 100755 configs/point_wise.yaml delete mode 100755 configs/stretched.yaml delete mode 100755 configs/system/example.yaml delete mode 100755 configs/system/hardware/example.yaml delete mode 100755 configs/system/hardware/slurm.yaml delete mode 100755 configs/system/input/example.yaml delete mode 100755 configs/system/input/jupiter.yaml delete mode 100755 configs/system/output/example.yaml delete mode 100755 configs/system/output/jupiter.yaml delete mode 100755 configs/system/slurm.yaml delete mode 100755 configs/task/autoencoder.yaml delete mode 100755 configs/task/forecaster.yaml delete mode 100755 configs/task/temporal_downscaler.yaml delete mode 100755 configs/temporal_downscaler.yaml delete mode 100755 configs/temporal_downscaler_ensemble.yaml delete mode 100755 configs/training/diffusion.yaml delete mode 100755 configs/training/ensemble.yaml delete mode 100755 configs/training/lam.yaml delete mode 100755 configs/training/multi.yaml delete mode 100755 configs/training/optimization/default.yaml delete mode 100755 configs/training/optimization/lr_scheduler/cosine_scheduler.yaml delete mode 100755 configs/training/optimization/optimizer/adamw.yaml delete mode 100755 configs/training/optimization/optimizer/ademamix.yaml delete mode 100755 configs/training/optimization/optimizer/zero.yaml delete mode 100755 configs/training/scalers/global.yaml delete mode 100755 configs/training/scalers/lam.yaml delete mode 100755 configs/training/scalers/multi.yaml delete mode 100755 configs/training/scalers/stretched.yaml delete mode 100755 configs/training/single.yaml delete mode 100755 configs/training/stretched.yaml delete mode 100755 configs/training/training_loss/ensemble.yaml delete mode 100755 configs/training/training_loss/ensemble_combined.yaml delete mode 100755 configs/training/training_loss/single.yaml delete mode 100755 configs/training/training_loss/single_combined.yaml delete mode 100755 configs/training/weight_averaging/ema.yaml delete mode 100755 configs/training/weight_averaging/swa.yaml delete mode 100755 configs_old/configs/bash.sh delete mode 100755 configs_old/configs/bash.sh.save delete mode 100755 configs_old/configs/config.yaml delete mode 100755 configs_old/configs/data/zarr.yaml delete mode 100755 configs_old/configs/data/zarr_interp.yaml delete mode 100755 configs_old/configs/data/zarr_new.yaml delete mode 100755 configs_old/configs/dataloader/native_grid.yaml delete mode 100755 configs_old/configs/dataloader/native_grid_1.1.yaml delete mode 100755 configs_old/configs/dataloader/native_grid_forecaster.yaml delete mode 100755 configs_old/configs/dataloader/native_grid_new.yaml delete mode 100755 configs_old/configs/dataloader/native_grid_nowind.yaml delete mode 100755 configs_old/configs/dataloader/native_grid_td.yaml delete mode 100755 configs_old/configs/datamodule/ens.yaml delete mode 100755 configs_old/configs/datamodule/single.yaml delete mode 100755 configs_old/configs/debug.sh delete mode 100755 configs_old/configs/debug.yaml delete mode 100755 configs_old/configs/debug_hourly.yaml delete mode 100755 configs_old/configs/diagnostics/benchmark_profiler/detailed.yaml delete mode 100755 configs_old/configs/diagnostics/benchmark_profiler/simple.yaml delete mode 100755 configs_old/configs/diagnostics/callbacks/placeholder.yaml delete mode 100755 configs_old/configs/diagnostics/callbacks/rollout_eval.yaml delete mode 100755 configs_old/configs/diagnostics/evaluation.yaml delete mode 100755 configs_old/configs/diagnostics/evaluation_ens.yaml delete mode 100755 configs_old/configs/diagnostics/plot/detailed.yaml delete mode 100755 configs_old/configs/diagnostics/plot/rollout_eval.yaml delete mode 100755 configs_old/configs/diagnostics/plot/simple.yaml delete mode 100755 configs_old/configs/diff2_model_forecast.sh delete mode 100755 configs_old/configs/diff_interp_only.yaml delete mode 100755 configs_old/configs/diff_model_forecast.sh delete mode 100755 configs_old/configs/diffusion.yaml delete mode 100755 configs_old/configs/ens_interp_nogap.yaml delete mode 100755 configs_old/configs/ensemble_crps.yaml delete mode 100755 configs_old/configs/ensemble_interpolator.yaml delete mode 100755 configs_old/configs/ensinterp_o96_nogap_tendency_back.yaml delete mode 100755 configs_old/configs/fine_ensinterp_agg.yaml delete mode 100755 configs_old/configs/fine_ensinterp_diff.yaml delete mode 100755 configs_old/configs/fine_ensinterp_o96_nogap_tendency_back.yaml delete mode 100755 configs_old/configs/graph/encoder_decoder_only.yaml delete mode 100755 configs_old/configs/graph/existing.yaml delete mode 100755 configs_old/configs/graph/existing_graph.yaml delete mode 100755 configs_old/configs/graph/hierarchical_2level.yaml delete mode 100755 configs_old/configs/graph/hierarchical_3level.yaml delete mode 100755 configs_old/configs/graph/limited_area.yaml delete mode 100755 configs_old/configs/graph/multi_scale.yaml delete mode 100755 configs_old/configs/graph/n320.yaml delete mode 100755 configs_old/configs/graph/n320_mario.yaml delete mode 100755 configs_old/configs/graph/stretched_grid.yaml delete mode 100755 configs_old/configs/hardware/example.yaml delete mode 100755 configs_old/configs/hardware/files/example.yaml delete mode 100755 configs_old/configs/hardware/files/jupiter.yaml delete mode 100755 configs_old/configs/hardware/paths/example.yaml delete mode 100755 configs_old/configs/hardware/paths/jupiter.yaml delete mode 100755 configs_old/configs/hardware/slurm.yaml delete mode 100755 configs_old/configs/hierarchical.yaml delete mode 100755 configs_old/configs/interpolator.yaml delete mode 100755 configs_old/configs/jobscript_forecast.sh delete mode 100755 configs_old/configs/jobscript_forecast_2.sh delete mode 100755 configs_old/configs/jobscript_interp.sh delete mode 100755 configs_old/configs/jobscript_interp_2.sh delete mode 100755 configs_old/configs/jobscript_interp_3.sh delete mode 100755 configs_old/configs/jobscript_out.sh delete mode 100755 configs_old/configs/jobscript_wind.sh delete mode 100755 configs_old/configs/lam.yaml delete mode 100755 configs_old/configs/model/gnn.yaml delete mode 100755 configs_old/configs/model/graphtransformer.yaml delete mode 100755 configs_old/configs/model/graphtransformer_diffusion.yaml delete mode 100755 configs_old/configs/model/graphtransformer_diffusiontend.yaml delete mode 100755 configs_old/configs/model/graphtransformer_ens.yaml delete mode 100755 configs_old/configs/model/graphtransformer_ens_new.yaml delete mode 100755 configs_old/configs/model/transformer.yaml delete mode 100755 configs_old/configs/model/transformer_diffusion.yaml delete mode 100755 configs_old/configs/model/transformer_diffusiontend.yaml delete mode 100755 configs_old/configs/model/transformer_ens.yaml delete mode 100755 configs_old/configs/model/transformer_single_1.1.yaml delete mode 100755 configs_old/configs/model/transformer_single_new.yaml delete mode 100755 configs_old/configs/model/transformer_transformermapper.yaml delete mode 100755 configs_old/configs/ms_fine_ensinterp_agg.yaml delete mode 100755 configs_old/configs/newscaling_ensinterp_agg.yaml delete mode 100755 configs_old/configs/single_11.yaml delete mode 100755 configs_old/configs/single_11_new.yaml delete mode 100755 configs_old/configs/single_11_new_rollout.yaml delete mode 100755 configs_old/configs/stretched.yaml delete mode 100755 configs_old/configs/training/default.yaml delete mode 100755 configs_old/configs/training/diffusion.yaml delete mode 100755 configs_old/configs/training/ensemble.yaml delete mode 100755 configs_old/configs/training/ensemble_new.yaml delete mode 100755 configs_old/configs/training/interpolator.yaml delete mode 100755 configs_old/configs/training/lam.yaml delete mode 100755 configs_old/configs/training/scalers/global.yaml delete mode 100755 configs_old/configs/training/scalers/lam.yaml delete mode 100755 configs_old/configs/training/scalers/stretched.yaml delete mode 100755 configs_old/configs/training/stretched.yaml diff --git a/configs/autoencoder.yaml b/configs/autoencoder.yaml deleted file mode 100755 index e31e2a5a23..0000000000 --- a/configs/autoencoder.yaml +++ /dev/null @@ -1,49 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- system: example -- graph: encoder_decoder_only -- model: graphtransformer -- task: autoencoder -- training: single -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# system: -# hardware: -# num_gpus_per_node: 1 - -dataloader: - validation_rollout: 0 - -model: - model: - _target_: anemoi.models.models.AnemoiModelAutoEncoder - latent_skip: False - processor: - _target_: anemoi.models.layers.processor.NoOpProcessor - -diagnostics: - plot: - callbacks: - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSample - dataset_names: ${diagnostics.plot.datasets_to_plot} - sample_idx: ${diagnostics.plot.sample_idx} - per_sample : 6 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - tp - every_n_batches: ${diagnostics.plot.frequency.batch} - accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - colormaps: ${diagnostics.plot.colormaps} diff --git a/configs/config.yaml b/configs/config.yaml deleted file mode 100755 index c638891133..0000000000 --- a/configs/config.yaml +++ /dev/null @@ -1,14 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- system: example -- graph: multi_scale -- model: gnn -- task: forecaster -- training: single -- _self_ - - -# set to true to switch on config validation -config_validation: True diff --git a/configs/data/multi.yaml b/configs/data/multi.yaml deleted file mode 100755 index be9f543131..0000000000 --- a/configs/data/multi.yaml +++ /dev/null @@ -1,83 +0,0 @@ -# Multi-dataset data configuration for debugging with era5 and era5_copy -format: zarr -# Time frequency requested from dataset -frequency: 6h - -# Dataset-specific configurations -datasets: - era5: - forcing: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - - "insolation" - - "lsm" - - "sdor" - - "slor" - - "z" - diagnostic: [tp, cp] - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: "mean-std" - std: - - "tp" - min-max: - max: - - "sdor" - - "slor" - - "z" - none: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - - "insolation" - - "lsm" - - cerra: - forcing: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - diagnostic: [tp] - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: "mean-std" - std: - - "tp" - min-max: - max: - none: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - const_imputer: - _target_: anemoi.models.preprocessing.imputer.InputImputer - config: - default: "mean" - -# Values set in the code -num_features: null # number of features in the forecast state diff --git a/configs/data/zarr.yaml b/configs/data/zarr.yaml deleted file mode 100755 index fbbfb70ad4..0000000000 --- a/configs/data/zarr.yaml +++ /dev/null @@ -1,81 +0,0 @@ -format: zarr -# Time frequency requested from dataset -frequency: 6h - -datasets: - data: # user-defined name for the dataset - # features that are not part of the forecast state - # but are used as forcing to generate the forecast state - forcing: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - - "insolation" - - "lsm" - - "sdor" - - "slor" - - "z" - # features that are only part of the forecast state - # but are not used as the input to the model - diagnostic: - - tp - - cp - - # const_imputer: - # default: "none" - # 0: [] - - # processors including imputers and normalizers are applied in order of definition - # the order of definition from this file is preserved when this config is included - # and new processors in the main config file are added at the end of the dictionary - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: "mean-std" - - # Remap cp statistics to those of tp when using FractionBounding. This ensures - # that cp, as a fraction of tp, remains consistent with tp's scale and statistics. - # NOTE: This remap should only be applied if FractionBounding is enabled for cp. - # remap: - # cp: tp - - # Standardization applied to tp and cp variables. Ensure that if cp is bounded - # as a fraction of tp, both variables are normalized using these shared statistics. - # "Std" normalization is preferred here over "mean-std" to avoid shifting of the - # zero value in the normalized space. - std: - - "tp" - # - "cp" - - min-max: - max: - - "sdor" - - "slor" - - "z" - none: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - - "insolation" - - "lsm" - # const_imputer: - # _target_: anemoi.models.preprocessing.imputer.ConstantImputer - # config: - # default: "none" - # 0: [] - # When using the imputer, consider including the nan_mask_weights scaler in the - # training loss to ensure imputed grid points are not considered in the loss computation - -# Values set in the code -num_features: null # number of features in the forecast state diff --git a/configs/data/zarr_interp.yaml b/configs/data/zarr_interp.yaml deleted file mode 100755 index 3a2b3fc206..0000000000 --- a/configs/data/zarr_interp.yaml +++ /dev/null @@ -1,101 +0,0 @@ -format: zarr -# Time frequency requested from dataset -frequency: 6h - -datasets: - data: # user-defined name for the dataset - # features that are not part of the forecast state - # but are used as forcing to generate the forecast state - forcing: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - - "insolation" - - "lsm" - - "z" - # features that are only part of the forecast state - # but are not used as the input to the model - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - - # const_imputer: - # default: "none" - # 0: [] - - # processors including imputers and normalizers are applied in order of definition - # the order of definition from this file is preserved when this config is included - # and new processors in the main config file are added at the end of the dictionary - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: "mean-std" - - # Remap cp statistics to those of tp when using FractionBounding. This ensures - # that cp, as a fraction of tp, remains consistent with tp's scale and statistics. - # NOTE: This remap should only be applied if FractionBounding is enabled for cp. - remap: - cp: tp - - # Standardization applied to tp and cp variables. Ensure that if cp is bounded - # as a fraction of tp, both variables are normalized using these shared statistics. - # "Std" normalization is preferred here over "mean-std" to avoid shifting of the - # zero value in the normalized space. - std: - - "tp" - - "cp" - - "ssrd" - - "q_50" - - "q_100" - - "q_150" - - "q_200" - - "q_250" - - "q_300" - - "q_400" - - "q_500" - - "q_600" - - "q_700" - - "q_850" - - "q_925" - - "q_1000" - - min-max: - max: - - "z" - none: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - - "insolation" - - "lsm" - - "tcc" - - "mcc" - - "hcc" - - "lcc" - # const_imputer: - # _target_: anemoi.models.preprocessing.imputer.ConstantImputer - # config: - # default: "none" - # 0: [] - # When using the imputer, consider including the nan_mask_weights scaler in the - # training loss to ensure imputed grid points are not considered in the loss computation - -# Values set in the code -num_features: null # number of features in the forecast state diff --git a/configs/dataloader/multi.yaml b/configs/dataloader/multi.yaml deleted file mode 100755 index d2054da3ce..0000000000 --- a/configs/dataloader/multi.yaml +++ /dev/null @@ -1,101 +0,0 @@ -prefetch_factor: 2 -pin_memory: True - -# ============ -# read_group_size: -# Form subgroups of model comm groups that read data together. -# Each reader in the group only reads 1/read_group_size of the data -# which is then all-gathered between the group. -# This can reduce CPU memory usage as well as increase dataloader throughput. -# The number of GPUs per model must be divisible by read_group_size. -# To disable, set to 1. -# ============ -read_group_size: ${system.hardware.num_gpus_per_model} - -num_workers: - training: 1 - validation: 1 - test: 1 -batch_size: - training: 2 - validation: 2 - test: 2 - -# ============ -# Multi-dataset batch composition: -# Each batch will contain a dictionary with samples from all datasets: -# {"dataset_a": tensor_batch_a, "dataset_b": tensor_batch_b, ...} -# All datasets must have the same number of valid samples for synchronization -# ============ - -# runs only N training batches [N = integer | null] -# if null then we run through all the batches -limit_batches: - training: null - validation: null - test: 20 - -# ============ -# Multi-Dataset Configuration -# Define multiple datasets that will be synchronized during training -# Each dataset must have the same number of valid time samples -# ============ - -training: - datasets: - era5: - dataset_config: - dataset: ${system.input.dataset} - frequency: ${data.frequency} - drop: [] - start: 1985 - end: 2020 - trajectory: null - cerra: - dataset_config: - dataset: ${system.input.dataset_b} # Using same dataset as duplicate for testing - frequency: ${data.frequency} - drop: [] - start: 1985 - end: 2020 - trajectory: null - -# Multi-dataset validation with same datasets, different time period -validation: - datasets: - era5: - dataset_config: - dataset: ${system.input.dataset} - frequency: ${data.frequency} - drop: [] - start: 2021 - end: 2021 - trajectory: null - cerra: - dataset_config: - dataset: ${system.input.dataset_b} - frequency: ${data.frequency} - drop: [] - start: 2021 - end: 2021 - trajectory: null - -# Multi-dataset test with same datasets, different time period -test: - datasets: - era5: - dataset_config: - dataset: ${system.input.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: null - cerra: - dataset_config: - dataset: ${system.input.dataset_b} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: null diff --git a/configs/dataloader/native_grid.yaml b/configs/dataloader/native_grid.yaml deleted file mode 100755 index 0182914c54..0000000000 --- a/configs/dataloader/native_grid.yaml +++ /dev/null @@ -1,82 +0,0 @@ -prefetch_factor: 2 -pin_memory: True - -# ============ -# read_group_size: -# Form subgroups of model comm groups that read data together. -# Each reader in the group only reads 1/read_group_size of the data -# which is then all-gathered between the group. -# This can reduce CPU memory usage as well as increase dataloader throughput. -# The number of GPUs per model must be divisible by read_group_size. -# To disable, set to 1. -# ============ -read_group_size: ${system.hardware.num_gpus_per_model} - -num_workers: - training: 8 - validation: 4 - test: 8 -batch_size: - training: 1 - validation: 1 - test: 4 - -# ============ -# Default effective batch_size for training is 16 -# For the o96 resolution, default per-gpu batch_size is 2 (8 gpus required) -# The global lr is calculated as: -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model -# Assuming a constant effective batch_size, any change in the per_gpu batch_size -# should come with a rescaling of the local_lr to keep a constant global_lr -# ============ - -# runs only N training batches [N = integer | null] -# if null then we run through all the batches -limit_batches: - training: null - validation: null - test: 20 - -# ============ -# Dataloader definitions -# These follow the anemoi-datasets patterns -# You can make these as complicated for merging as you like -# See https://anemoi-datasets.readthedocs.io -# ============ - -# Pointers to datasets and model run info -dataset: ${system.input.dataset} -model_run_info: null # Add for non-analysis training - -training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: null - end: 2020 - trajectory: ${dataloader.model_run_info} - -validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2021 - end: 2021 - trajectory: ${dataloader.model_run_info} - -test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} diff --git a/configs/dataloader/native_grid_td.yaml b/configs/dataloader/native_grid_td.yaml deleted file mode 100755 index 1eda2dfc8a..0000000000 --- a/configs/dataloader/native_grid_td.yaml +++ /dev/null @@ -1,82 +0,0 @@ -prefetch_factor: 2 -pin_memory: True - -# ============ -# read_group_size: -# Form subgroups of model comm groups that read data together. -# Each reader in the group only reads 1/read_group_size of the data -# which is then all-gathered between the group. -# This can reduce CPU memory usage as well as increase dataloader throughput. -# The number of GPUs per model must be divisible by read_group_size. -# To disable, set to 1. -# ============ -read_group_size: ${system.hardware.num_gpus_per_model} - -num_workers: - training: 8 - validation: 4 - test: 8 -batch_size: - training: 1 - validation: 1 - test: 4 - -# ============ -# Default effective batch_size for training is 16 -# For the o96 resolution, default per-gpu batch_size is 2 (8 gpus required) -# The global lr is calculated as: -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model -# Assuming a constant effective batch_size, any change in the per_gpu batch_size -# should come with a rescaling of the local_lr to keep a constant global_lr -# ============ - -# runs only N training batches [N = integer | null] -# if null then we run through all the batches -limit_batches: - training: null - validation: null - test: 20 - -# ============ -# Dataloader definitions -# These follow the anemoi-datasets patterns -# You can make these as complicated for merging as you like -# See https://anemoi-datasets.readthedocs.io -# ============ - -# Pointers to datasets and model run info -dataset: ${system.input.dataset} -model_run_info: null # Add for non-analysis training - -training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: ['u_10', 'v_10', 'w_10', 'z_10', 'q_10', 't_10', 'sdor', 'slor'] - start: 2016-01-01 - end: 2022-05-31 - trajectory: ${dataloader.model_run_info} - -validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: ['u_10', 'v_10', 'w_10', 'z_10', 'q_10', 't_10', 'sdor', 'slor'] - start: 2022-06-01 - end: 2023-05-31 - trajectory: ${dataloader.model_run_info} - -test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} diff --git a/configs/debug.sh b/configs/debug.sh deleted file mode 100755 index 87cf360495..0000000000 --- a/configs/debug.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=8 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=2:00:00 -#SBATCH -o %x-%j.out - - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -export PYTHONUNBUFFERED=1 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_new_env/bin/activate - -srun anemoi-training train diagnostics.log.mlflow.run_name="debug_new_code" --config-name=debug_td diff --git a/configs/debug_td.yaml b/configs/debug_td.yaml deleted file mode 100755 index 5f00ca2636..0000000000 --- a/configs/debug_td.yaml +++ /dev/null @@ -1,135 +0,0 @@ -defaults: -- data: zarr_interp -- dataloader: native_grid_td -- diagnostics: evaluation_ens -- system: slurm -- graph: n320 -- model: graphtransformer_ens -- task: temporal_downscaler -- training: ensemble -- override training/training_loss: ensemble_combined -- _self_ - -config_validation: True - -diagnostics: - plot: - callbacks: [] - callbacks: [] - log: - interval: 100 - mlflow: - enabled: True #True #True - offline: True #True - authentication: True - experiment_name: aifs - tracking_uri: https://mlflow.ecmwf.int - run_name: interpolator - system: True - -data: - frequency: 1h - -dataloader: - limit_batches: - training: 2000 #5000 #null - validation: 100 #10 #0 #null - -graph: - overwrite: false - -system: - input: - graph: graph.pt - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - hardware: - accelerator: auto - num_gpus_per_ensemble: 2 - num_gpus_per_model: 1 - -model: - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: False - num_channels: 1024 - compile: [] # disable torch.compile (avoids triton dependency) - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val] - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - processor: - num_chunks: 8 - graph_attention_backend: "pyg" - encoder: - num_chunks: 8 - graph_attention_backend: "pyg" - decoder: - num_chunks: 8 - graph_attention_backend: "pyg" - -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 #1 - u: 1 #0.5 - v: 1 #0.33 - w: 0.1 - z: 1 #1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - ensemble_size_per_device: 1 - max_steps: 200000 - #load_weights_only: True - optimization: - lr: 5.0e-5 - lr_scheduler: - warmup_t: 1000 - t_initial: 200000 - lr_min: 3e-7 - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'stdev_tendency'] - ignore_nans: False - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'stdev_tendency'] # , 'time_steps'] - ignore_nans: False - no_autocast: True - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: [mean, max, min, diff] - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'stdev_tendency'] - ignore_nans: False - no_autocast: True - alpha: 0.95 - diff --git a/configs/diagnostics/benchmark_profiler/detailed.yaml b/configs/diagnostics/benchmark_profiler/detailed.yaml deleted file mode 100755 index 486c185158..0000000000 --- a/configs/diagnostics/benchmark_profiler/detailed.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# Use anemoi-profile to profile the training process -memory: - enabled: True - steps: 5 # wait warmup steps and then do steps (too many steps would lead to a big file) - warmup: 2 - extra_plots: False - trace_rank0_only: False #set to true and it will profile rank 0 only. Reads SLURM_PROC_ID so won't work when not running via Slurm -time: - enabled: True - verbose: False #If true, output every action the profiler caputres, otherwise output a subset defined in PROFILER_ACTIONS at the top of aifs/diagnostics/profiler.py -speed: - enabled: True -system: - enabled: True -model_summary: - enabled: True -snapshot: - enabled: True - steps: 4 # wait warmup steps and then do steps - warmup: 0 diff --git a/configs/diagnostics/benchmark_profiler/simple.yaml b/configs/diagnostics/benchmark_profiler/simple.yaml deleted file mode 100755 index 34c8023d6d..0000000000 --- a/configs/diagnostics/benchmark_profiler/simple.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# Use anemoi-profile to profile the training process -memory: - enabled: False - steps: 5 # wait warmup steps and then do steps (too many steps would lead to a big file) - warmup: 2 - extra_plots: False - trace_rank0_only: False #set to true and it will profile rank 0 only. Reads SLURM_PROC_ID so won't work when not running via Slurm -time: - enabled: True - verbose: False #If true, output every action the profiler caputres, otherwise output a subset defined in PROFILER_ACTIONS at the top of aifs/diagnostics/profiler.py -speed: - enabled: True -system: - enabled: False -model_summary: - enabled: False -snapshot: - enabled: False - steps: 4 # wait warmup steps and then do steps - warmup: 0 diff --git a/configs/diagnostics/callbacks/placeholder.yaml b/configs/diagnostics/callbacks/placeholder.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs/diagnostics/callbacks/placeholder.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs/diagnostics/callbacks/rollout_eval.yaml b/configs/diagnostics/callbacks/rollout_eval.yaml deleted file mode 100755 index c394349bab..0000000000 --- a/configs/diagnostics/callbacks/rollout_eval.yaml +++ /dev/null @@ -1,5 +0,0 @@ -# Add callbacks here -- _target_: anemoi.training.diagnostics.callbacks.evaluation.RolloutEval - rollout: - - ${task.validation_rollout} - every_n_batches: 20 diff --git a/configs/diagnostics/evaluation.yaml b/configs/diagnostics/evaluation.yaml deleted file mode 100755 index 27cd0ce0db..0000000000 --- a/configs/diagnostics/evaluation.yaml +++ /dev/null @@ -1,36 +0,0 @@ ---- -defaults: - - plot: detailed - - callbacks: placeholder - - benchmark_profiler: detailed - - log: mlflow - -# another alternative if you don't have any callbacks is to remove it from the -# defaults list and just use -callbacks: [] - -debug: - # this will detect and trace back NaNs / Infs etc. but will slow down training - anomaly_detection: False - -enable_checkpointing: True -checkpoint: - every_n_minutes: - save_frequency: 30 # Approximate, as this is checked at the end of training steps - num_models_saved: 3 # If set to k, saves the 'last' k model weights in the training. - - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 # If set to -1, all checkpoints are kept ensuring runs can be continued/forked at any point in the training process - - every_n_train_steps: - save_frequency: null # Does not scale with rollout - num_models_saved: 0 - -enable_progress_bar: True -progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - -check_val_every_n_epoch: 1 -print_memory_summary: False diff --git a/configs/diagnostics/evaluation_ens.yaml b/configs/diagnostics/evaluation_ens.yaml deleted file mode 100755 index d342b86273..0000000000 --- a/configs/diagnostics/evaluation_ens.yaml +++ /dev/null @@ -1,86 +0,0 @@ ---- -defaults: - - plot: simple - - benchmark_profiler: simple - - log: mlflow - -# another alternative if you don't have any callbacks is to remove it from the -# defaults list and just use -callbacks: - - _target_: anemoi.training.diagnostics.callbacks.evaluation.RolloutEvalEns - rollout: - - ${task.validation_rollout} - every_n_batches: 4 - -plot: - callbacks: - # Add plot callbacks here. - - _target_: anemoi.training.diagnostics.callbacks.plot_ens.PlotEnsSample - dataset_names: ["data"] #TODO can make this a default in pydantic and remove here - sample_idx: ${diagnostics.plot.sample_idx} - per_sample : 2 - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - #Defining the accumulation levels for precipitation related fields and the colormap - accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - members: null # None for all members, list for specific members - - # Deterministic callbacks are also overloaded. - - _target_: anemoi.training.diagnostics.callbacks.plot_ens.PlotLoss - dataset_names: ["data"] #TODO can make this a default in pydantic and remove here - # group parameters by categories when visualizing contributions to the loss - # one-parameter groups are possible to highlight individual parameters - parameter_groups: - moisture: [tp, cp, tcw] - sfc_wind: [10u, 10v] - every_n_batches: ${diagnostics.plot.frequency.batch} - - _target_: anemoi.training.diagnostics.callbacks.plot_ens.PlotSpectrum - dataset_names: ["data"] #TODO can make this a default in pydantic and remove here - sample_idx: ${diagnostics.plot.sample_idx} - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - - _target_: anemoi.training.diagnostics.callbacks.plot_ens.PlotHistogram - dataset_names: ["data"] #TODO can make this a default in pydantic and remove here - sample_idx: ${diagnostics.plot.sample_idx} - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - precip_and_related_fields: ["tp", "cp"] # Optional: specify precip fields for special histogram treatment - - _target_: anemoi.training.diagnostics.callbacks.plot_ens.GraphTrainableFeaturesPlot - dataset_names: ["data"] #TODO can make this a default in pydantic and remove here - every_n_epochs: ${diagnostics.plot.frequency.epoch} - - # Overloaded PlotSample will return the plots for the first ensemble member - # - _target_: anemoi.training.diagnostics.callbacks.plot_ens.PlotSample - # sample_idx: ${diagnostics.plot.sample_idx} - # per_sample: 6 - # parameters: ${diagnostics.plot.parameters} - # every_n_batches: ${diagnostics.plot.frequency.batch} - # accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - # precip_and_related_fields: ["tp", "cp"] # Optional: specify precip fields - -debug: - # this will detect and trace back NaNs / Infs etc. but will slow down training - anomaly_detection: False - - -enable_checkpointing: True -checkpoint: - every_n_minutes: - save_frequency: 30 # Approximate, as this is checked at the end of training steps - num_models_saved: 3 # If set to k, saves the 'last' k model weights in the training. - - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 # If set to -1, all checkpoints are kept ensuring runs can be continued/forked at any point in the training process - - every_n_train_steps: - save_frequency: null # Does not scale with rollout - num_models_saved: 0 - -enable_progress_bar: True -progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - -check_val_every_n_epoch: 1 -print_memory_summary: False diff --git a/configs/diagnostics/evaluation_multi.yaml b/configs/diagnostics/evaluation_multi.yaml deleted file mode 100755 index 73127ce50f..0000000000 --- a/configs/diagnostics/evaluation_multi.yaml +++ /dev/null @@ -1,32 +0,0 @@ ---- -defaults: - - plot: multi - - callbacks: placeholder - - benchmark_profiler: detailed - - log: mlflow - -# another alternative if you don't have any callbacks is to remove it from the -# defaults list and just use -# callbacks: [] - -debug: - # this will detect and trace back NaNs / Infs etc. but will slow down training - anomaly_detection: False - -enable_checkpointing: True -checkpoint: - every_n_minutes: - save_frequency: 30 # Approximate, as this is checked at the end of training steps - num_models_saved: 3 # If set to k, saves the 'last' k model weights in the training. - - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 # If set to -1, all checkpoints are kept ensuring runs can be continued/forked at any point in the training process - - every_n_train_steps: - save_frequency: null # Does not scale with rollout - num_models_saved: 0 - -enable_progress_bar: True -check_val_every_n_epoch: 1 -print_memory_summary: False diff --git a/configs/diagnostics/log/mlflow.yaml b/configs/diagnostics/log/mlflow.yaml deleted file mode 100755 index c7176aaf1a..0000000000 --- a/configs/diagnostics/log/mlflow.yaml +++ /dev/null @@ -1,18 +0,0 @@ -mlflow: - enabled: False - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: False - authentication: False - tracking_uri: ??? - experiment_name: 'anemoi-debug' - project_name: 'Anemoi' - system: False - terminal: True - run_name: null # If set to null, the run name will be the a random UUID - on_resume_create_child: True - expand_hyperparams: # Which keys in hyperparams to expand - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} -interval: 100 # passed to trainer.log_every_n_steps diff --git a/configs/diagnostics/log/wandb.yaml b/configs/diagnostics/log/wandb.yaml deleted file mode 100755 index 712521c60f..0000000000 --- a/configs/diagnostics/log/wandb.yaml +++ /dev/null @@ -1,12 +0,0 @@ -wandb: - enabled: False - _target_: pytorch_lightning.loggers.wandb.WandbLogger - offline: False - log_model: False - project: 'Anemoi' - entity: example - # logger options (these probably come with some overhead) - gradients: False - parameters: False - interval: ${diagnostics.log.interval} -interval: 100 # passed to trainer.log_every_n_steps diff --git a/configs/diagnostics/plot/detailed.yaml b/configs/diagnostics/plot/detailed.yaml deleted file mode 100755 index 62c210d6b8..0000000000 --- a/configs/diagnostics/plot/detailed.yaml +++ /dev/null @@ -1,98 +0,0 @@ -asynchronous: True # Whether to plot asynchronously -datashader: True # Choose which technique to use for plotting -projection_kind: equirectangular # or lambert_conformal (requires cartopy) -frequency: # Frequency of the plotting - batch: 750 - epoch: 5 - -# Parameters to plot -parameters: -- z_500 -- t_850 -- u_850 -- v_850 -- 2t -- 10u -- 10v -- sp -- tp -- cp - -# Sample index -sample_idx: 0 - -# Precipitation and related fields -precip_and_related_fields: [tp, cp] - -# select colormaps -colormaps: - default: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormap - name: viridis - # in order to use distinctipy, you need to install the package - # default: - # _target_: anemoi.training.utils.custom_colormaps.DistinctipyColormap - # n_colors: 8 - error: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormap - name: bwr - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: ["#ffffff", "#04e9e7", "#019ff4", "#0300f4", "#02fd02", "#01c501", "#008e00", "#fdf802", "#e5bc00", "#fd9500", "#fd0000", "#d40000", "#bc0000", "#f800fd"] - variables: ${diagnostics.plot.precip_and_related_fields} - -datasets_to_plot: ["data"] # Default dataset names to use in the plot callbacks - -focus_areas: - europe: - latlon_bbox: [30.0, -20.0, 60.0, 40.0] - china: - latlon_bbox: [18.0, 73.0, 54.0, 135.0] - -callbacks: - # Add plot callbacks here - - _target_: anemoi.training.diagnostics.callbacks.plot.GraphTrainableFeaturesPlot - every_n_epochs: 5 - dataset_names: ${diagnostics.plot.datasets_to_plot} #TODO can make ["data"] a default in pydantic and remove here - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotLoss - # group parameters by categories when visualizing contributions to the loss - # one-parameter groups are possible to highlight individual parameters - dataset_names: ${diagnostics.plot.datasets_to_plot} #TODO can make this a default in pydantic and remove here - parameter_groups: - moisture: [tp, cp, tcw] - sfc_wind: [10u, 10v] - every_n_batches: ${diagnostics.plot.frequency.batch} - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSample - dataset_names: ${diagnostics.plot.datasets_to_plot} #TODO can make this a default in pydantic and remove here - sample_idx: ${diagnostics.plot.sample_idx} - per_sample : 6 - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - #Defining the accumulation levels for precipitation related fields and the colormap - accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - colormaps: ${diagnostics.plot.colormaps} - focus_area: null - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSpectrum - dataset_names: ${diagnostics.plot.datasets_to_plot} #TODO can make this a default in pydantic and remove here - # every_n_batches: 100 # Override for batch frequency - # min_delta: 0.01 # Minimum distance between two consecutive points - sample_idx: ${diagnostics.plot.sample_idx} - every_n_batches: ${diagnostics.plot.frequency.batch} - parameters: - - z_500 - - tp - - 2t - - 10u - - 10v - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotHistogram - dataset_names: ${diagnostics.plot.datasets_to_plot} #TODO can make this a default in pydantic and remove here - sample_idx: ${diagnostics.plot.sample_idx} - every_n_batches: ${diagnostics.plot.frequency.batch} - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - parameters: - - z_500 - - tp - - 2t - - 10u - - 10v diff --git a/configs/diagnostics/plot/multi.yaml b/configs/diagnostics/plot/multi.yaml deleted file mode 100755 index 852366b29b..0000000000 --- a/configs/diagnostics/plot/multi.yaml +++ /dev/null @@ -1,124 +0,0 @@ -asynchronous: True # Whether to plot asynchronously -projection_kind: equirectangular # or lambert_conformal (requires cartopy) -datashader: True # Choose which technique to use for plotting -frequency: # Frequency of the plotting - batch: 750 - epoch: 5 - -# Parameters to plot -parameters: -- z_500 -- t_850 -- u_850 -- v_850 -- 2t -- 10u -- 10v -- sp -- tp -- cp - -# Sample index -sample_idx: 0 - -# Precipitation and related fields -precip_and_related_fields: [tp, cp] - -# select colormaps -colormaps: - default: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormap - name: viridis - # in order to use distinctipy, you need to install the package - # default: - # _target_: anemoi.training.utils.custom_colormaps.DistinctipyColormap - # n_colors: 8 - error: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormap - name: bwr - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: ["#ffffff", "#04e9e7", "#019ff4", "#0300f4", "#02fd02", "#01c501", "#008e00", "#fdf802", "#e5bc00", "#fd9500", "#fd0000", "#d40000", "#bc0000", "#f800fd"] - variables: ${diagnostics.plot.precip_and_related_fields} - -datasets_to_plot: ["era5", "cerra"] # Default dataset names to use in the plot callbacks - -focus_areas: - europe: - latlon_bbox: [30.0, -20.0, 60.0, 40.0] - china: - latlon_bbox: [18.0, 73.0, 54.0, 135.0] - -callbacks: - # Add plot callbacks here - - _target_: anemoi.training.diagnostics.callbacks.plot.GraphTrainableFeaturesPlot - every_n_epochs: 5 - dataset_names: ${diagnostics.plot.datasets_to_plot} - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotLoss - # group parameters by categories when visualizing contributions to the loss - # one-parameter groups are possible to highlight individual parameters - dataset_names: ${diagnostics.plot.datasets_to_plot} - parameter_groups: - moisture: [tp, cp, tcw] - sfc_wind: [10u, 10v] - every_n_batches: ${diagnostics.plot.frequency.batch} - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSample - dataset_names: ["era5"] - sample_idx: ${diagnostics.plot.sample_idx} - per_sample : 6 - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - #Defining the accumulation levels for precipitation related fields and the colormap - accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - colormaps: ${diagnostics.plot.colormaps} - # - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSpectrum - # dataset_names: ${diagnostics.plot.datasets_to_plot} #TODO can make this a default in pydantic and remove here - # # every_n_batches: 100 # Override for batch frequency - # # min_delta: 0.01 # Minimum distance between two consecutive points - # sample_idx: ${diagnostics.plot.sample_idx} - # every_n_batches: ${diagnostics.plot.frequency.batch} - # parameters: - # - z_500 - # - tp - # - 2t - # - 10u - # - 10v - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotHistogram - dataset_names: ["era5"] - sample_idx: ${diagnostics.plot.sample_idx} - every_n_batches: ${diagnostics.plot.frequency.batch} - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - parameters: - - z_500 - - tp - - 2t - - 10u - - 10v - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotHistogram - dataset_names: ["cerra"] - sample_idx: ${diagnostics.plot.sample_idx} - every_n_batches: ${diagnostics.plot.frequency.batch} - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - parameters: - - z_500 - - tp - - 2t - # - 10u - # - 10v - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSample - dataset_names: ["cerra"] - sample_idx: ${diagnostics.plot.sample_idx} - per_sample : 6 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - tp - every_n_batches: ${diagnostics.plot.frequency.batch} - #Defining the accumulation levels for precipitation related fields and the colormap - accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - colormaps: ${diagnostics.plot.colormaps} diff --git a/configs/diagnostics/plot/simple.yaml b/configs/diagnostics/plot/simple.yaml deleted file mode 100755 index 050f417af8..0000000000 --- a/configs/diagnostics/plot/simple.yaml +++ /dev/null @@ -1,61 +0,0 @@ -asynchronous: True # Whether to plot asynchronously -projection_kind: equirectangular # or lambert_conformal (requires cartopy) -datashader: True # Choose which technique to use for plotting -frequency: # Frequency of the plotting - batch: 750 - epoch: 10 - -# Parameters to plot -parameters: -- z_500 -- t_850 -- u_850 -- v_850 -- 2t -- 10u -- 10v -- sp -- tp -- cp - -# Sample index -sample_idx: 0 - -# Precipitation and related fields -precip_and_related_fields: [tp, cp] - -# select special colormap for precip fields -colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: ["#ffffff", "#04e9e7", "#019ff4", "#0300f4", "#02fd02", "#01c501", "#008e00", "#fdf802", "#e5bc00", "#fd9500", "#fd0000", "#d40000", "#bc0000", "#f800fd"] - variables: ${diagnostics.plot.precip_and_related_fields} - -datasets_to_plot: ["data"] # Default dataset names to use in the plot callbacks - -focus_areas: - europe: - latlon_bbox: [30.0, -20.0, 60.0, 40.0] - china: - latlon_bbox: [18.0, 73.0, 54.0, 135.0] - -callbacks: - # Add plot callbacks here - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotLoss - # group parameters by categories when visualizing contributions to the loss - # one-parameter groups are possible to highlight individual parameters - dataset_names: ["data"] #TODO can make this a default in pydantic and remove here - parameter_groups: - moisture: [tp, cp, tcw] - sfc_wind: [10u, 10v] - every_n_batches: ${diagnostics.plot.frequency.batch} - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSample - dataset_names: ["data"] #TODO can make this a default in pydantic and remove here - sample_idx: ${diagnostics.plot.sample_idx} - per_sample : 6 - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - #Defining the accumulation levels for precipitation related fields and the colormap - accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - colormaps: ${diagnostics.plot.colormaps} diff --git a/configs/diffusion.yaml b/configs/diffusion.yaml deleted file mode 100755 index dc5f5cbc8b..0000000000 --- a/configs/diffusion.yaml +++ /dev/null @@ -1,14 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- system: example -- graph: multi_scale -- model: graphtransformer_diffusion -- task: forecaster -- training: diffusion -- _self_ - - -# set to true to switch on config validation -config_validation: True diff --git a/configs/ensemble_crps.yaml b/configs/ensemble_crps.yaml deleted file mode 100755 index 3bbae58872..0000000000 --- a/configs/ensemble_crps.yaml +++ /dev/null @@ -1,51 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation_ens -- system: example -- graph: encoder_decoder_only -- model: transformer_ens -- task: forecaster -- training: ensemble -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# hardware: -# num_gpus_per_node: 1 - -diagnostics: - plot: - callbacks: [] - -system: - input: - graph: graph_anemoi_new_${data.resolution}.pt - dataset: aifs-ea-an-oper-0001-mars-${data.resolution}-1979-2022-6h-v6 - truncation: ${data.resolution}-o32-linear.mat.npz - truncation_inv: o32-${data.resolution}-linear.mat.npz - loss_matrices_path: null - hardware: - accelerator: auto - num_gpus_per_ensemble: 1 - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - -model: - num_channels: 128 -dataloader: - limit_batches: - training: 100 - validation: 100 - -data: - resolution: o96 - -training: - ensemble_size_per_device: 2 - max_epochs: 1 diff --git a/configs/graph/encoder_decoder_only.yaml b/configs/graph/encoder_decoder_only.yaml deleted file mode 100755 index b1ecfcdeab..0000000000 --- a/configs/graph/encoder_decoder_only.yaml +++ /dev/null @@ -1,54 +0,0 @@ ---- -overwrite: True - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes # options: AnemoiDatasetNodes, NPZFileNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} # options: l1, l2, unit-max, unit-sum, unit-std - # Hidden nodes - hidden: - node_builder: - _target_: anemoi.graphs.nodes.ReducedGaussianGridNodes # options: AnemoiDatasetNodes, NPZFileNodes - grid: o48 # o32, o48, ... - - -edges: -# Encoder configuration -- source_name: "data" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges # options: KNNEdges, CutOffEdges - cutoff_factor: 0.6 # only for cutoff method - source_mask_attr_name: null - target_mask_attr_name: null - - attributes: ${graph.attributes.edges} - # Decoder configuration -- source_name: "hidden" - target_name: "data" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 3 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - -post_processors: [] diff --git a/configs/graph/existing.yaml b/configs/graph/existing.yaml deleted file mode 100755 index 28bd1982ac..0000000000 --- a/configs/graph/existing.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -overwrite: False - -# This config file can be used to load a graph from your local filesystem diff --git a/configs/graph/hierarchical_2level.yaml b/configs/graph/hierarchical_2level.yaml deleted file mode 100755 index 919a74a1c1..0000000000 --- a/configs/graph/hierarchical_2level.yaml +++ /dev/null @@ -1,99 +0,0 @@ ---- -overwrite: True - - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden_1: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 5 - hidden_2: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 4 - -edges: - # Encoder configuration - - source_name: "data" - target_name: "hidden_1" - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges - cutoff_factor: 0.6 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - # Decoder configuration - - source_name: "hidden_1" - target_name: "data" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - # Hierarchical connections: downscale - - source_name: "hidden_1" - target_name: "hidden_2" - edge_builders: ${graph.edge_builders.downscale} - attributes: ${graph.attributes.edges} - - # Hierarchical connections: upscale - - source_name: "hidden_2" - target_name: "hidden_1" - edge_builders: ${graph.edge_builders.upscale} - attributes: ${graph.attributes.edges} - - # Hierarchical connections: same level - - source_name: "hidden_1" - target_name: "hidden_1" - edge_builders: ${graph.edge_builders.process} - attributes: ${graph.attributes.edges} - - - source_name: "hidden_2" - target_name: "hidden_2" - edge_builders: ${graph.edge_builders.process} - attributes: ${graph.attributes.edges} - - -############# -edge_builders: - downscale: - - _target_: anemoi.graphs.edges.CutOffEdges - cutoff_factor: 1.5 - source_mask_attr_name: null - target_mask_attr_name: null - process: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: null - source_mask_attr_name: null - target_mask_attr_name: null - upscale: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 5 - source_mask_attr_name: null - target_mask_attr_name: null - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - -post_processors: [] diff --git a/configs/graph/hierarchical_2level_encoder_decoder_only.yaml b/configs/graph/hierarchical_2level_encoder_decoder_only.yaml deleted file mode 100755 index 2d0ab302ae..0000000000 --- a/configs/graph/hierarchical_2level_encoder_decoder_only.yaml +++ /dev/null @@ -1,80 +0,0 @@ ---- -overwrite: True - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden_1: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 5 - hidden_2: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 4 - -edges: - # Encoder configuration - - source_name: "data" - target_name: "hidden_1" - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges - cutoff_factor: 0.6 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - # Decoder configuration - - source_name: "hidden_1" - target_name: "data" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - # Hierarchical connections: downscale - - source_name: "hidden_1" - target_name: "hidden_2" - edge_builders: ${graph.edge_builders.downscale} - attributes: ${graph.attributes.edges} - - # Hierarchical connections: upscale - - source_name: "hidden_2" - target_name: "hidden_1" - edge_builders: ${graph.edge_builders.upscale} - attributes: ${graph.attributes.edges} - -############# -edge_builders: - downscale: - - _target_: anemoi.graphs.edges.CutOffEdges - cutoff_factor: 1.5 - source_mask_attr_name: null - target_mask_attr_name: null - upscale: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 5 - source_mask_attr_name: null - target_mask_attr_name: null - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - -post_processors: [] diff --git a/configs/graph/hierarchical_3level.yaml b/configs/graph/hierarchical_3level.yaml deleted file mode 100755 index 8c8783bcc9..0000000000 --- a/configs/graph/hierarchical_3level.yaml +++ /dev/null @@ -1,125 +0,0 @@ ---- -overwrite: True - - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden_1: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 5 - hidden_2: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 4 - hidden_3: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 3 - -edges: - # Encoder configuration - - source_name: "data" - target_name: "hidden_1" - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges - cutoff_factor: 0.6 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - # Decoder configuration - - source_name: "hidden_1" - target_name: "data" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - # Hierarchical connections: downscale - - source_name: "hidden_1" - target_name: "hidden_2" - edge_builders: - - ${graph.edge_builders.downscale} - attributes: ${graph.attributes.edges} - - - source_name: "hidden_2" - target_name: "hidden_3" - edge_builders: - - ${graph.edge_builders.downscale} - attributes: ${graph.attributes.edges} - - # Hierarchical connections: upscale - - source_name: "hidden_3" - target_name: "hidden_2" - edge_builders: - - ${graph.edge_builders.upscale} - attributes: ${graph.attributes.edges} - - - source_name: "hidden_2" - target_name: "hidden_1" - edge_builders: - - ${graph.edge_builders.upscale} - attributes: ${graph.attributes.edges} - - # Hierarchical connections: same level - - source_name: "hidden_1" - target_name: "hidden_1" - edge_builders: - - ${graph.edge_builders.process} - attributes: ${graph.attributes.edges} - - - source_name: "hidden_2" - target_name: "hidden_2" - edge_builders: - - ${graph.edge_builders.process} - attributes: ${graph.attributes.edges} - - - source_name: "hidden_3" - target_name: "hidden_3" - edge_builders: - - ${graph.edge_builders.process} - attributes: ${graph.attributes.edges} - - -############# -edge_builders: - downscale: - _target_: anemoi.graphs.edges.CutOffEdges - cutoff_factor: 1.5 - source_mask_attr_name: null - target_mask_attr_name: null - process: - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: null - source_mask_attr_name: null - target_mask_attr_name: null - upscale: - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 5 - source_mask_attr_name: null - target_mask_attr_name: null - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - -post_processors: [] diff --git a/configs/graph/limited_area.yaml b/configs/graph/limited_area.yaml deleted file mode 100755 index 1deefb4ef0..0000000000 --- a/configs/graph/limited_area.yaml +++ /dev/null @@ -1,75 +0,0 @@ ---- -overwrite: True - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - # Hidden nodes - hidden: - node_builder: - _target_: anemoi.graphs.nodes.LimitedAreaTriNodes # options: AnemoiDatasetNodes, NPZFileNodes, TriNodes - resolution: 6 # grid resolution for npz (o32, o48, ...) - reference_node_name: "data" - mask_attr_name: cutout_mask - margin_radius_km: 10 - -edges: -# Encoder configuration -- source_name: "data" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges # options: KNNEdges, CutOffEdges - cutoff_factor: 0.6 # only for cutoff method - source_mask_attr_name: null - target_mask_attr_name: null - - _target_: anemoi.graphs.edges.CutOffEdges # connects only boundary nodes - cutoff_factor: 1.5 # only for cutoff method - source_mask_attr_name: boundary_mask - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -# Processor configuration -- source_name: "hidden" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -# Decoder configuration -- source_name: "hidden" - target_name: "data" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 3 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: cutout_mask - attributes: ${graph.attributes.edges} - -post_processors: [] - -attributes: - nodes: - # Attributes for data nodes - cutout_mask: - _target_: anemoi.graphs.nodes.attributes.CutOutMask - boundary_mask: - _target_: anemoi.graphs.nodes.attributes.BooleanNot - masks: - _target_: anemoi.graphs.nodes.attributes.CutOutMask - area_weight: - _target_: anemoi.graphs.nodes.attributes.MaskedPlanarAreaWeights # options: Uniform - mask_node_attr_name: cutout_mask - norm: unit-max - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std diff --git a/configs/graph/multi.yaml b/configs/graph/multi.yaml deleted file mode 100755 index 600a5e1436..0000000000 --- a/configs/graph/multi.yaml +++ /dev/null @@ -1,94 +0,0 @@ -# Stretched grid graph config intended to be used with a cutout dataset. -# The stretched mesh resolution used here is intended for o96 global resolution with 10km -# limited area resolution. -overwrite: True - -nodes: - era5: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.era5.dataset_config} - attributes: ${graph.attributes.nodes} - cerra: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.cerra.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 5 - -edges: -# Encoder -- source_name: "era5" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -- source_name: "cerra" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -# Processor -- source_name: "hidden" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -# Decoder -- source_name: "hidden" - target_name: "era5" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 4 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -- source_name: "hidden" - target_name: "cerra" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - -attributes: - nodes: - # Attributes for data nodes - cutout_mask: - _target_: anemoi.graphs.nodes.attributes.CutOutMask - boundary_mask: - _target_: anemoi.graphs.nodes.attributes.BooleanNot - masks: - _target_: anemoi.graphs.nodes.attributes.CutOutMask - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - lam_area_weight: - _target_: anemoi.graphs.nodes.attributes.MaskedPlanarAreaWeights - mask_node_attr_name: cutout_mask - norm: unit-max - - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-max - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - -post_processors: [] diff --git a/configs/graph/multi_scale.yaml b/configs/graph/multi_scale.yaml deleted file mode 100755 index de2aa69e7e..0000000000 --- a/configs/graph/multi_scale.yaml +++ /dev/null @@ -1,61 +0,0 @@ ---- -overwrite: True - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes # options: AnemoiDatasetNodes, NPZFileNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - # Hidden nodes - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes # options: AnemoiDatasetNodes, NPZFileNodes, TriNodes - resolution: 5 # grid resolution for npz (o32, o48, ...) - -edges: -# Encoder configuration -- source_name: "data" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges # options: KNNEdges, CutOffEdges - cutoff_factor: 0.6 # only for cutoff method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - # Processor configuration -- source_name: "hidden" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - # Decoder configuration -- source_name: "hidden" - target_name: "data" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 3 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - -post_processors: [] diff --git a/configs/graph/n320.yaml b/configs/graph/n320.yaml deleted file mode 100755 index b3adf4a5a3..0000000000 --- a/configs/graph/n320.yaml +++ /dev/null @@ -1,61 +0,0 @@ ---- -overwrite: True - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes # options: AnemoiDatasetNodes, NPZFileNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - # Hidden nodes - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes # options: AnemoiDatasetNodes, NPZFileNodes, TriNodes - resolution: 6 # grid resolution for npz (o32, o48, ...) - -edges: -# Encoder configuration -- source_name: "data" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 12 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - # Processor configuration -- source_name: "hidden" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - # Decoder configuration -- source_name: "hidden" - target_name: "data" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 3 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - -post_processors: [] diff --git a/configs/graph/point_wise.yaml b/configs/graph/point_wise.yaml deleted file mode 100755 index de83fdc281..0000000000 --- a/configs/graph/point_wise.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -overwrite: True - - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes # options: AnemoiDatasetNodes, NPZFileNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - -edges: [] - -post_processors: [] diff --git a/configs/graph/stretched_grid.yaml b/configs/graph/stretched_grid.yaml deleted file mode 100755 index eadfb646e3..0000000000 --- a/configs/graph/stretched_grid.yaml +++ /dev/null @@ -1,78 +0,0 @@ -# Stretched grid graph config intended to be used with a cutout dataset. -# The stretched mesh resolution used here is intended for o96 global resolution with 10km -# limited area resolution. -overwrite: True - - -nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.StretchedTriNodes - lam_resolution: 8 - global_resolution: 5 - reference_node_name: "data" - mask_attr_name: cutout_mask - margin_radius_km: 11 - -edges: -# Encoder -- source_name: "data" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -# Processor -- source_name: "hidden" - target_name: "hidden" - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.lam_resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -# Decoder -- source_name: "hidden" - target_name: "data" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - -attributes: - nodes: - # Attributes for data nodes - cutout_mask: - _target_: anemoi.graphs.nodes.attributes.CutOutMask - boundary_mask: - _target_: anemoi.graphs.nodes.attributes.BooleanNot - masks: - _target_: anemoi.graphs.nodes.attributes.CutOutMask - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - lam_area_weight: - _target_: anemoi.graphs.nodes.attributes.MaskedPlanarAreaWeights - mask_node_attr_name: cutout_mask - norm: unit-max - - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-max - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - -post_processors: [] diff --git a/configs/hierarchical.yaml b/configs/hierarchical.yaml deleted file mode 100755 index 564d3d806a..0000000000 --- a/configs/hierarchical.yaml +++ /dev/null @@ -1,30 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- system: example -- graph: hierarchical_3level -- model: graphtransformer -- task: forecaster -- training: single -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# system: -# hardware: -# num_gpus_per_node: 1 - -model: - keep_batch_sharded: False # not yet supported for Hierarchical - model: - _target_: anemoi.models.models.AnemoiModelEncProcDecHierarchical - hidden_nodes_name: ["hidden_1", "hidden_2", "hidden_3"] - enable_hierarchical_level_processing: True - level_process_num_layers: 2 - processor: - num_chunks: 2 diff --git a/configs/hierarchical_autoencoder.yaml b/configs/hierarchical_autoencoder.yaml deleted file mode 100755 index e60dceeea1..0000000000 --- a/configs/hierarchical_autoencoder.yaml +++ /dev/null @@ -1,43 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- datamodule: single -- hardware: example -- graph: hierarchical_2level_encoder_decoder_only -- model: graphtransformer -- task: autoencoder -- training: single -- _self_ - -model: - model: - _target_: anemoi.models.models.AnemoiModelHierarchicalAutoEncoder - hidden_nodes_name: ["hidden_1", "hidden_2"] - processor: - _target_: anemoi.models.layers.processor.NoOpProcessor - enable_hierarchical_level_processing: False - keep_batch_sharded: True - -diagnostics: - plot: - callbacks: - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotLoss - # group parameters by categories when visualizing contributions to the loss - # one-parameter groups are possible to highlight individual parameters - parameter_groups: - moisture: [tp, cp, tcw] - sfc_wind: [10u, 10v] - every_n_batches: ${diagnostics.plot.frequency.batch} - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotReconstruction - sample_idx: ${diagnostics.plot.sample_idx} - per_sample : 6 - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - #Defining the accumulation levels for precipitation related fields and the colormap - accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - colormaps: ${diagnostics.plot.colormaps} - -# set to true to switch on config validation -config_validation: True diff --git a/configs/lam.yaml b/configs/lam.yaml deleted file mode 100755 index 6f45a15014..0000000000 --- a/configs/lam.yaml +++ /dev/null @@ -1,38 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- system: example -- graph: limited_area -- model: graphtransformer -- task: forecaster -- training: lam -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# system: -# hardware: -# num_gpus_per_node: 1 - -dataloader: - dataset: - cutout: - - dataset: ${system.input.dataset} - thinning: ??? - - dataset: ${system.input.forcing_dataset} - adjust: all - min_distance_km: 0 - max_distance_km: 300 -model: - output_mask: - _target_: anemoi.training.utils.masks.Boolean1DMask - attribute_name: cutout_mask -system: - input: - dataset: ??? - forcing_dataset: ??? diff --git a/configs/model/gnn.yaml b/configs/model/gnn.yaml deleted file mode 100755 index cbda483406..0000000000 --- a/configs/model/gnn.yaml +++ /dev/null @@ -1,103 +0,0 @@ -num_channels: 512 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: True - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - # The GNN requires the autocast layer norm, otherwise its memory usage is too high. - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - -processor: - _target_: anemoi.models.layers.processor.GNNProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 2 - mlp_extra_layers: 0 - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GNNForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 1 - mlp_extra_layers: 0 - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - -decoder: - _target_: anemoi.models.layers.mapper.GNNBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 1 - mlp_extra_layers: 0 - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs/model/graphtransformer.yaml b/configs/model/graphtransformer.yaml deleted file mode 100755 index 32602d32d2..0000000000 --- a/configs/model/graphtransformer.yaml +++ /dev/null @@ -1,148 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: True - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - graph_attention_backend: "triton" # Options: "triton", "pyg" - edge_pre_mlp: False - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - edge_pre_mlp: False - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - edge_pre_mlp: False - - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 # GNN and GraphTransformer Processor only - -# Torch compile configuration -# A list of modules present in the model, which will be compiled -# You can optionally pass options to torch.compile with the 'options' key -# -# Below is an explanation of some common parameters to torch.compile -# For a full list of possible parameters, consult the documenation for torch compile -# https://docs.pytorch.org/docs/stable/generated/torch.compile.html -# -# dynamic (bool): When True, it will try to avoid recompilation by generating -# as general a kernel as possible. But the performance of the general -# kernel might be worse. When False, it will generate a specific -# kernel for each input shape (until the configurable recompile -# limit has been hit), leading to possibly better performance but -# more recompilations -# mode (str): Different compilation modes, allowing you to trade off -# compilation time versus potential performance. See the -# torch.compile documentation for list of possible modes -# fullgraph (bool): When True, torch.compile will error when it hits a -# section of code it can't compile. When False, it will fallback to -# non-compiled ("eager") execution for those lines. -# options (dict): a dict of further options which can be passed to torch.compile -compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs/model/graphtransformer_diffusion.yaml b/configs/model/graphtransformer_diffusion.yaml deleted file mode 100755 index 2fb976eb83..0000000000 --- a/configs/model/graphtransformer_diffusion.yaml +++ /dev/null @@ -1,149 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiDiffusionModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: True - # Diffusion parameters - diffusion: - sigma_data: 1.0 - noise_channels: 32 - noise_cond_dim: 16 - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - noise_embedder: - _target_: anemoi.models.layers.diffusion.SinusoidalEmbeddings - num_channels: ${model.model.diffusion.noise_channels} - max_period: 1000 - inference_defaults: - noise_scheduler: - schedule_type: "karras" - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - num_steps: 50 - diffusion_sampler: - sampler: "heun" - S_churn: 0.0 - S_min: 0.0 - S_max: .inf - S_noise: 1.0 - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: 16 - zero_init: True - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - graph_attention_backend: "triton" # Options: "triton", "pyg" - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: True - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 # GNN and GraphTransformer Processor only - - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Torch compile configuration -# A list of modules present in the model, which will be compiled -# You can optionally pass options to torch.compile with the 'options' key -# -# Below is an explanation of some common parameters to torch.compile -# For a full list of possible parameters, consult the documenation for torch compile -# https://docs.pytorch.org/docs/stable/generated/torch.compile.html -# -# dynamic (bool): When True, it will try to avoid recompilation by generating -# as general a kernel as possible. But the performance of the general -# kernel might be worse. When False, it will generate a specific -# kernel for each input shape (until the configurable recompile -# limit has been hit), leading to possibly better performance but -# more recompilations -# mode (str): Different compilation modes, allowing you to trade off -# compilation time versus potential performance. See the -# torch.compile documentation for list of possible modes -# fullgraph (bool): When True, torch.compile will error when it hits a -# section of code it can't compile. When False, it will fallback to -# non-compiled ("eager") execution for those lines. -# options (dict): a dict of further options which can be passed to torch.compile -compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - #options: # An example of setting torch.compile options - #dynamic: false - #mode: max-autotune - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - -# Bounding configuration -bounding: [] diff --git a/configs/model/graphtransformer_diffusiontend.yaml b/configs/model/graphtransformer_diffusiontend.yaml deleted file mode 100755 index f56fd6f1fe..0000000000 --- a/configs/model/graphtransformer_diffusiontend.yaml +++ /dev/null @@ -1,150 +0,0 @@ -num_channels: 1024 -condition_on_residual: False -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiDiffusionTendModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: True - # Diffusion parameters - diffusion: - sigma_data: 1.0 - noise_channels: 32 - noise_cond_dim: 16 - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - noise_embedder: - _target_: anemoi.models.layers.diffusion.SinusoidalEmbeddings - num_channels: ${model.model.diffusion.noise_channels} - max_period: 1000 - inference_defaults: - noise_scheduler: - schedule_type: "karras" - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - num_steps: 50 - diffusion_sampler: - sampler: "heun" - S_churn: 0.0 - S_min: 0.0 - S_max: .inf - S_noise: 1.0 - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: 16 - zero_init: True - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - graph_attention_backend: "triton" # Options: "triton", "pyg" - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: True - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 # GNN and GraphTransformer Processor only - - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Torch compile configuration -# A list of modules present in the model, which will be compiled -# You can optionally pass options to torch.compile with the 'options' key -# -# Below is an explanation of some common parameters to torch.compile -# For a full list of possible parameters, consult the documenation for torch compile -# https://docs.pytorch.org/docs/stable/generated/torch.compile.html -# -# dynamic (bool): When True, it will try to avoid recompilation by generating -# as general a kernel as possible. But the performance of the general -# kernel might be worse. When False, it will generate a specific -# kernel for each input shape (until the configurable recompile -# limit has been hit), leading to possibly better performance but -# more recompilations -# mode (str): Different compilation modes, allowing you to trade off -# compilation time versus potential performance. See the -# torch.compile documentation for list of possible modes -# fullgraph (bool): When True, torch.compile will error when it hits a -# section of code it can't compile. When False, it will fallback to -# non-compiled ("eager") execution for those lines. -# options (dict): a dict of further options which can be passed to torch.compile -compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - #options: # An example of setting torch.compile options - #dynamic: false - #mode: max-autotune - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - -# Bounding configuration -bounding: [] diff --git a/configs/model/graphtransformer_ens.yaml b/configs/model/graphtransformer_ens.yaml deleted file mode 100755 index 196d80556c..0000000000 --- a/configs/model/graphtransformer_ens.yaml +++ /dev/null @@ -1,182 +0,0 @@ -num_channels: 1024 -condition_on_residual: False -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: True - -noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True # Transformer and GraphTransformer only - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - graph_attention_backend: "triton" # Options: "triton", "pyg" - edge_pre_mlp: False - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: True - autocast: false - #Any arguments to your chosen function go here - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - edge_pre_mlp: False - - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - edge_pre_mlp: False - - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection -# _target_: anemoi.models.layers.residual.TruncatedConnection -# truncation_up_file_path: ${system.input.truncation} -# truncation_down_file_path: ${system.input.truncation_inv} - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 # GNN and GraphTransformer Processor only - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Torch compile configuration -# A list of modules present in the model, which will be compiled -# You can optionally pass options to torch.compile with the 'options' key -# -# Below is an explanation of some common parameters to torch.compile -# For a full list of possible parameters, consult the documenation for torch compile -# https://docs.pytorch.org/docs/stable/generated/torch.compile.html -# -# dynamic (bool): When True, it will try to avoid recompilation by generating -# as general a kernel as possible. But the performance of the general -# kernel might be worse. When False, it will generate a specific -# kernel for each input shape (until the configurable recompile -# limit has been hit), leading to possibly better performance but -# more recompilations -# mode (str): Different compilation modes, allowing you to trade off -# compilation time versus potential performance. See the -# torch.compile documentation for list of possible modes -# fullgraph (bool): When True, torch.compile will error when it hits a -# section of code it can't compile. When False, it will fallback to -# non-compiled ("eager") execution for those lines. -# options (dict): a dict of further options which can be passed to torch.compile -compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - -# Bounding configuration -bounding: #These are applied in order - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs/model/point_wise.yaml b/configs/model/point_wise.yaml deleted file mode 100755 index f1e3ef575e..0000000000 --- a/configs/model/point_wise.yaml +++ /dev/null @@ -1,101 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiModelEncProcDec - hidden_nodes_name: "data" - latent_skip: True - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.PointWiseMLPProcessor - num_layers: 16 - num_chunks: 2 - mlp_hidden_ratio: 4 - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.PointWiseForwardMapper - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - -decoder: - _target_: anemoi.models.layers.mapper.PointWiseBackwardMapper - initialise_data_extractor_zero: False - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 # GNN and GraphTransformer Processor only - - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs/model/transformer.yaml b/configs/model/transformer.yaml deleted file mode 100755 index 46eaa15f87..0000000000 --- a/configs/model/transformer.yaml +++ /dev/null @@ -1,149 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: True - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 512 - dropout_p: 0.0 # GraphTransformer - attention_implementation: flash_attention # Possible values: scaled_dot_product_attention, flash_attention - qk_norm: False # Transformer and GraphTransformer only - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Torch compile configuration -# A list of modules present in the model, which will be compiled -# You can optionally pass options to torch.compile with the 'options' key -# -# Below is an explanation of some common parameters to torch.compile -# For a full list of possible parameters, consult the documenation for torch compile -# https://docs.pytorch.org/docs/stable/generated/torch.compile.html -# -# dynamic (bool): When True, it will try to avoid recompilation by generating -# as general a kernel as possible. But the performance of the general -# kernel might be worse. When False, it will generate a specific -# kernel for each input shape (until the configurable recompile -# limit has been hit), leading to possibly better performance but -# more recompilations -# mode (str): Different compilation modes, allowing you to trade off -# compilation time versus potential performance. See the -# torch.compile documentation for list of possible modes -# fullgraph (bool): When True, torch.compile will error when it hits a -# section of code it can't compile. When False, it will fallback to -# non-compiled ("eager") execution for those lines. -# options (dict): a dict of further options which can be passed to torch.compile -compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - #options: # An example of setting torch.compile options - #dynamic: false - #mode: max-autotune - -# Bounding configuration -bounding: #These are applied in order - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs/model/transformer_diffusion.yaml b/configs/model/transformer_diffusion.yaml deleted file mode 100755 index 6f95addbe7..0000000000 --- a/configs/model/transformer_diffusion.yaml +++ /dev/null @@ -1,150 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiDiffusionModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: True - # Diffusion parameters - diffusion: - sigma_data: 1.0 - noise_channels: 32 - noise_cond_dim: 16 - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - noise_embedder: - _target_: anemoi.models.layers.diffusion.SinusoidalEmbeddings - num_channels: ${model.model.diffusion.noise_channels} - max_period: 1000 - inference_defaults: - noise_scheduler: - schedule_type: "karras" - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - num_steps: 50 - diffusion_sampler: - sampler: "heun" - S_churn: 0.0 - S_min: 0.0 - S_max: .inf - S_noise: 1.0 - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: 16 - zero_init: True - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 512 - dropout_p: 0.0 # GraphTransformer - attention_implementation: flash_attention # flash_attention, scaled_dot_product_attention - qk_norm: True # Transformer and GraphTransformer only - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: True - qk_norm: True - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Torch compile configuration -# A list of modules present in the model, which will be compiled -# You can optionally pass options to torch.compile with the 'options' key -# -# Below is an explanation of some common parameters to torch.compile -# For a full list of possible parameters, consult the documenation for torch compile -# https://docs.pytorch.org/docs/stable/generated/torch.compile.html -# -# dynamic (bool): When True, it will try to avoid recompilation by generating -# as general a kernel as possible. But the performance of the general -# kernel might be worse. When False, it will generate a specific -# kernel for each input shape (until the configurable recompile -# limit has been hit), leading to possibly better performance but -# more recompilations -# mode (str): Different compilation modes, allowing you to trade off -# compilation time versus potential performance. See the -# torch.compile documentation for list of possible modes -# fullgraph (bool): When True, torch.compile will error when it hits a -# section of code it can't compile. When False, it will fallback to -# non-compiled ("eager") execution for those lines. -# options (dict): a dict of further options which can be passed to torch.compile -compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - #options: # An example of setting torch.compile options - #dynamic: false - #mode: max-autotune - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - -# Bounding configuration -bounding: [] diff --git a/configs/model/transformer_diffusiontend.yaml b/configs/model/transformer_diffusiontend.yaml deleted file mode 100755 index f1b63388d8..0000000000 --- a/configs/model/transformer_diffusiontend.yaml +++ /dev/null @@ -1,150 +0,0 @@ -num_channels: 1024 -condition_on_residual: False -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiDiffusionTendModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: True - # Diffusion parameters - diffusion: - sigma_data: 1.0 - noise_channels: 32 - noise_cond_dim: 16 - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - noise_embedder: - _target_: anemoi.models.layers.diffusion.SinusoidalEmbeddings - num_channels: ${model.model.diffusion.noise_channels} - max_period: 1000 - inference_defaults: - noise_scheduler: - schedule_type: "karras" - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - num_steps: 50 - diffusion_sampler: - sampler: "heun" - S_churn: 0.0 - S_min: 0.0 - S_max: .inf - S_noise: 1.0 - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: 16 - zero_init: True - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 512 - dropout_p: 0.0 # GraphTransformer - attention_implementation: flash_attention # flash_attention, scaled_dot_product_attention - qk_norm: True # Transformer and GraphTransformer only - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: True - qk_norm: True - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Torch compile configuration -# A list of modules present in the model, which will be compiled -# You can optionally pass options to torch.compile with the 'options' key -# -# Below is an explanation of some common parameters to torch.compile -# For a full list of possible parameters, consult the documenation for torch compile -# https://docs.pytorch.org/docs/stable/generated/torch.compile.html -# -# dynamic (bool): When True, it will try to avoid recompilation by generating -# as general a kernel as possible. But the performance of the general -# kernel might be worse. When False, it will generate a specific -# kernel for each input shape (until the configurable recompile -# limit has been hit), leading to possibly better performance but -# more recompilations -# mode (str): Different compilation modes, allowing you to trade off -# compilation time versus potential performance. See the -# torch.compile documentation for list of possible modes -# fullgraph (bool): When True, torch.compile will error when it hits a -# section of code it can't compile. When False, it will fallback to -# non-compiled ("eager") execution for those lines. -# options (dict): a dict of further options which can be passed to torch.compile -compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - #options: # An example of setting torch.compile options - #dynamic: false - #mode: max-autotune - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - -# Bounding configuration -bounding: [] diff --git a/configs/model/transformer_ens.yaml b/configs/model/transformer_ens.yaml deleted file mode 100755 index 4f0d145acd..0000000000 --- a/configs/model/transformer_ens.yaml +++ /dev/null @@ -1,178 +0,0 @@ -num_channels: 1024 -condition_on_residual: False -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: True - -noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - num_layers: 16 - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 512 - dropout_p: 0.0 - attention_implementation: flash_attention # Possible values: scaled_dot_product_attention, flash_attention - qk_norm: True # Transformer and GraphTransformer only - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: True - autocast: false - #Any arguments to your chosen function go here - Linear: - _target_: torch.nn.Linear # These reflect the defaults, but are shown here for clarity - Activation: - _target_: torch.nn.GELU - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - graph_attention_backend: "triton" # Options: "triton", "pyg" - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection -# _target_: anemoi.models.layers.residual.TruncatedConnection -# truncation_up_file_path: ${system.input.truncation} -# truncation_down_file_path: ${system.input.truncation_inv} - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Torch compile configuration -# A list of modules present in the model, which will be compiled -# You can optionally pass options to torch.compile with the 'options' key -# -# Below is an explanation of some common parameters to torch.compile -# For a full list of possible parameters, consult the documenation for torch compile -# https://docs.pytorch.org/docs/stable/generated/torch.compile.html -# -# dynamic (bool): When True, it will try to avoid recompilation by generating -# as general a kernel as possible. But the performance of the general -# kernel might be worse. When False, it will generate a specific -# kernel for each input shape (until the configurable recompile -# limit has been hit), leading to possibly better performance but -# more recompilations -# mode (str): Different compilation modes, allowing you to trade off -# compilation time versus potential performance. See the -# torch.compile documentation for list of possible modes -# fullgraph (bool): When True, torch.compile will error when it hits a -# section of code it can't compile. When False, it will fallback to -# non-compiled ("eager") execution for those lines. -# options (dict): a dict of further options which can be passed to torch.compile -compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - #options: - #dynamic: false - #mode: max-autotune # an example of setting the compilation mode - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - options: - dynamic: false - -# Bounding configuration -bounding: #These are applied in order - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs/model/transformer_transformermapper.yaml b/configs/model/transformer_transformermapper.yaml deleted file mode 100755 index da0e0a6582..0000000000 --- a/configs/model/transformer_transformermapper.yaml +++ /dev/null @@ -1,121 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.encoder_processor_decoder.AnemoiModelEncProcDec - hidden_nodes_name: "hidden" - latent_skip: True - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - _convert_: all - num_layers: 16 - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 512 - dropout_p: 0.0 # GraphTransformer - attention_implementation: flash_attention # flash_attention, scaled_dot_product_attention - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - qk_norm: False - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.TransformerForwardMapper - _convert_: all - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: -1 - dropout_p: 0.0 - attention_implementation: flash_attention # Possible values: scaled_dot_product_attention, flash_attention - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - qk_norm: False - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -decoder: - _target_: anemoi.models.layers.mapper.TransformerBackwardMapper - _convert_: all - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: True - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: -1 - dropout_p: 0.0 - attention_implementation: flash_attention # Possible values: scaled_dot_product_attention, flash_attention - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - qk_norm: False - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -residual: - _target_: anemoi.models.layers.residual.SkipConnection # options: SkipConnection, TruncatedConnection - step: -1 # use the latest step as skip connection - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -node_loss_weight: area_weight - -# Bounding configuration -bounding: #These are applied in order - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp diff --git a/configs/multi.yaml b/configs/multi.yaml deleted file mode 100755 index e842ec6e32..0000000000 --- a/configs/multi.yaml +++ /dev/null @@ -1,40 +0,0 @@ -defaults: -- data: multi -- dataloader: multi -- diagnostics: evaluation_multi -- system: example -- graph: multi -- model: graphtransformer -- task: forecaster -- training: multi -- _self_ - -config_validation: True - -data: - resolution: o96 - -system: - input: - graph: graph_anemoi_new_${data.resolution}.pt - - # Primary dataset for ERA5 - dataset: aifs-ea-an-oper-0001-mars-${data.resolution}-1979-2023-6h-v8 - - # Secondary dataset for CERRA (using same file for debugging) - dataset_b: aifs-ea-an-oper-0001-mars-${data.resolution}-1979-2023-6h-v8 - - output: - root: ${oc.env:SCRATCH}/anemoi-test/${data.resolution}/ - - hardware: - accelerator: auto - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - -diagnostics: - log: - mlflow: - enabled: False - tracking_uri: None diff --git a/configs/outputs/2026-04-28/14-01-44/.hydra/config.yaml b/configs/outputs/2026-04-28/14-01-44/.hydra/config.yaml deleted file mode 100755 index 0d6cce1af6..0000000000 --- a/configs/outputs/2026-04-28/14-01-44/.hydra/config.yaml +++ /dev/null @@ -1,656 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: false - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: false - authentication: false - tracking_uri: ??? - experiment_name: anemoi-debug - project_name: Anemoi - system: false - terminal: true - run_name: null - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: true - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: triton - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 0.6 - t: 6 - u: 0.8 - v: 0.5 - w: 0.001 - z: 12 - sp: 10 - 10u: 0.1 - 10v: 0.1 - 2d: 0.5 - tp: 0.025 - cp: 0.0025 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: ${training.max_steps} - warmup_t: 1000 - t_in_epochs: false - lr: 6.25e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - swa: - enabled: false - lr: 0.0001 - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - time_aggregate_loss: null - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - '*' - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 - lr: - rate: 5.0e-05 - min: 3.0e-07 - warmup: 1000 - iterations: 200000 -config_validation: true diff --git a/configs/outputs/2026-04-28/14-01-44/.hydra/hydra.yaml b/configs/outputs/2026-04-28/14-01-44/.hydra/hydra.yaml deleted file mode 100755 index 76730b256b..0000000000 --- a/configs/outputs/2026-04-28/14-01-44/.hydra/hydra.yaml +++ /dev/null @@ -1,178 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: [] - job: - name: train - chdir: null - override_dirname: '' - id: ??? - num: ??? - config_name: debug_td.yaml - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-28/14-01-44 - choices: - training: ensemble - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-28/14-01-44/.hydra/overrides.yaml b/configs/outputs/2026-04-28/14-01-44/.hydra/overrides.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs/outputs/2026-04-28/14-01-44/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs/outputs/2026-04-28/14-05-13/.hydra/config.yaml b/configs/outputs/2026-04-28/14-05-13/.hydra/config.yaml deleted file mode 100755 index 8d95666ddc..0000000000 --- a/configs/outputs/2026-04-28/14-05-13/.hydra/config.yaml +++ /dev/null @@ -1,658 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: interpolator - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - wandb: - entity: null - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: true - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: triton - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 0.6 - t: 6 - u: 0.8 - v: 0.5 - w: 0.001 - z: 12 - sp: 10 - 10u: 0.1 - 10v: 0.1 - 2d: 0.5 - tp: 0.025 - cp: 0.0025 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: ${training.max_steps} - warmup_t: 1000 - t_in_epochs: false - lr: 6.25e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - swa: - enabled: false - lr: 0.0001 - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - time_aggregate_loss: null - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - '*' - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 - lr: - rate: 5.0e-05 - min: 3.0e-07 - warmup: 1000 - iterations: 200000 -config_validation: true diff --git a/configs/outputs/2026-04-28/14-05-13/.hydra/hydra.yaml b/configs/outputs/2026-04-28/14-05-13/.hydra/hydra.yaml deleted file mode 100755 index 076ca5687a..0000000000 --- a/configs/outputs/2026-04-28/14-05-13/.hydra/hydra.yaml +++ /dev/null @@ -1,178 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: [] - job: - name: train - chdir: null - override_dirname: '' - id: ??? - num: ??? - config_name: debug_td.yaml - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-28/14-05-13 - choices: - training: ensemble - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-28/14-05-13/.hydra/overrides.yaml b/configs/outputs/2026-04-28/14-05-13/.hydra/overrides.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs/outputs/2026-04-28/14-05-13/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs/outputs/2026-04-28/14-05-41/.hydra/config.yaml b/configs/outputs/2026-04-28/14-05-41/.hydra/config.yaml deleted file mode 100755 index b369c25fc5..0000000000 --- a/configs/outputs/2026-04-28/14-05-41/.hydra/config.yaml +++ /dev/null @@ -1,656 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: interpolator - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: true - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: triton - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 0.6 - t: 6 - u: 0.8 - v: 0.5 - w: 0.001 - z: 12 - sp: 10 - 10u: 0.1 - 10v: 0.1 - 2d: 0.5 - tp: 0.025 - cp: 0.0025 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: ${training.max_steps} - warmup_t: 1000 - t_in_epochs: false - lr: 6.25e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - swa: - enabled: false - lr: 0.0001 - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - time_aggregate_loss: null - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - '*' - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 - lr: - rate: 5.0e-05 - min: 3.0e-07 - warmup: 1000 - iterations: 200000 -config_validation: true diff --git a/configs/outputs/2026-04-28/14-05-41/.hydra/hydra.yaml b/configs/outputs/2026-04-28/14-05-41/.hydra/hydra.yaml deleted file mode 100755 index e86d14812c..0000000000 --- a/configs/outputs/2026-04-28/14-05-41/.hydra/hydra.yaml +++ /dev/null @@ -1,178 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: [] - job: - name: train - chdir: null - override_dirname: '' - id: ??? - num: ??? - config_name: debug_td.yaml - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-28/14-05-41 - choices: - training: ensemble - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-28/14-05-41/.hydra/overrides.yaml b/configs/outputs/2026-04-28/14-05-41/.hydra/overrides.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs/outputs/2026-04-28/14-05-41/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs/outputs/2026-04-28/14-13-07/.hydra/config.yaml b/configs/outputs/2026-04-28/14-13-07/.hydra/config.yaml deleted file mode 100755 index 2b5b3575e0..0000000000 --- a/configs/outputs/2026-04-28/14-13-07/.hydra/config.yaml +++ /dev/null @@ -1,639 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: interpolator - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: true - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: triton - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - swa: - enabled: false - lr: 0.0001 - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - time_aggregate_loss: null - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-04-28/14-13-07/.hydra/hydra.yaml b/configs/outputs/2026-04-28/14-13-07/.hydra/hydra.yaml deleted file mode 100755 index af352b3245..0000000000 --- a/configs/outputs/2026-04-28/14-13-07/.hydra/hydra.yaml +++ /dev/null @@ -1,178 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: [] - job: - name: train - chdir: null - override_dirname: '' - id: ??? - num: ??? - config_name: debug_td.yaml - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-28/14-13-07 - choices: - training: ensemble - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-28/14-13-07/.hydra/overrides.yaml b/configs/outputs/2026-04-28/14-13-07/.hydra/overrides.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs/outputs/2026-04-28/14-13-07/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs/outputs/2026-04-28/14-17-02/.hydra/config.yaml b/configs/outputs/2026-04-28/14-17-02/.hydra/config.yaml deleted file mode 100755 index bb3f60722e..0000000000 --- a/configs/outputs/2026-04-28/14-17-02/.hydra/config.yaml +++ /dev/null @@ -1,635 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: interpolator - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: true - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: triton - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-04-28/14-17-02/.hydra/hydra.yaml b/configs/outputs/2026-04-28/14-17-02/.hydra/hydra.yaml deleted file mode 100755 index c97b848245..0000000000 --- a/configs/outputs/2026-04-28/14-17-02/.hydra/hydra.yaml +++ /dev/null @@ -1,180 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: [] - job: - name: train - chdir: null - override_dirname: '' - id: ??? - num: ??? - config_name: debug_td.yaml - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-28/14-17-02 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-28/14-17-02/.hydra/overrides.yaml b/configs/outputs/2026-04-28/14-17-02/.hydra/overrides.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs/outputs/2026-04-28/14-17-02/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs/outputs/2026-04-28/14-18-18/.hydra/config.yaml b/configs/outputs/2026-04-28/14-18-18/.hydra/config.yaml deleted file mode 100755 index 0fd5a15b7b..0000000000 --- a/configs/outputs/2026-04-28/14-18-18/.hydra/config.yaml +++ /dev/null @@ -1,618 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: interpolator - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: true - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: triton - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-04-28/14-18-18/.hydra/hydra.yaml b/configs/outputs/2026-04-28/14-18-18/.hydra/hydra.yaml deleted file mode 100755 index 824832b44a..0000000000 --- a/configs/outputs/2026-04-28/14-18-18/.hydra/hydra.yaml +++ /dev/null @@ -1,180 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: [] - job: - name: train - chdir: null - override_dirname: '' - id: ??? - num: ??? - config_name: debug_td.yaml - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-28/14-18-18 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-28/14-18-18/.hydra/overrides.yaml b/configs/outputs/2026-04-28/14-18-18/.hydra/overrides.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs/outputs/2026-04-28/14-18-18/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs/outputs/2026-04-28/14-21-51/.hydra/config.yaml b/configs/outputs/2026-04-28/14-21-51/.hydra/config.yaml deleted file mode 100755 index 180ebafdb0..0000000000 --- a/configs/outputs/2026-04-28/14-21-51/.hydra/config.yaml +++ /dev/null @@ -1,618 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: interpolator - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: true - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: triton - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-04-28/14-21-51/.hydra/hydra.yaml b/configs/outputs/2026-04-28/14-21-51/.hydra/hydra.yaml deleted file mode 100755 index 3e54a9db30..0000000000 --- a/configs/outputs/2026-04-28/14-21-51/.hydra/hydra.yaml +++ /dev/null @@ -1,180 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: [] - job: - name: train - chdir: null - override_dirname: '' - id: ??? - num: ??? - config_name: debug_td.yaml - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-28/14-21-51 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-28/14-21-51/.hydra/overrides.yaml b/configs/outputs/2026-04-28/14-21-51/.hydra/overrides.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs/outputs/2026-04-28/14-21-51/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs/outputs/2026-04-28/14-22-09/.hydra/config.yaml b/configs/outputs/2026-04-28/14-22-09/.hydra/config.yaml deleted file mode 100755 index 180ebafdb0..0000000000 --- a/configs/outputs/2026-04-28/14-22-09/.hydra/config.yaml +++ /dev/null @@ -1,618 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: interpolator - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: true - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: triton - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: - - module: anemoi.models.layers.conv.GraphTransformerConv - - module: anemoi.models.layers.normalization.ConditionalLayerNorm - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-04-28/14-22-09/.hydra/hydra.yaml b/configs/outputs/2026-04-28/14-22-09/.hydra/hydra.yaml deleted file mode 100755 index 02ed10b548..0000000000 --- a/configs/outputs/2026-04-28/14-22-09/.hydra/hydra.yaml +++ /dev/null @@ -1,180 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: [] - job: - name: train - chdir: null - override_dirname: '' - id: ??? - num: ??? - config_name: debug_td.yaml - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-28/14-22-09 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-28/14-22-09/.hydra/overrides.yaml b/configs/outputs/2026-04-28/14-22-09/.hydra/overrides.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs/outputs/2026-04-28/14-22-09/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs/outputs/2026-04-28/14-31-03/.hydra/config.yaml b/configs/outputs/2026-04-28/14-31-03/.hydra/config.yaml deleted file mode 100755 index f1b96f870d..0000000000 --- a/configs/outputs/2026-04-28/14-31-03/.hydra/config.yaml +++ /dev/null @@ -1,616 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: interpolator - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: true - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: pyg - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: [] - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-04-28/14-31-03/.hydra/hydra.yaml b/configs/outputs/2026-04-28/14-31-03/.hydra/hydra.yaml deleted file mode 100755 index 0b4bfaba05..0000000000 --- a/configs/outputs/2026-04-28/14-31-03/.hydra/hydra.yaml +++ /dev/null @@ -1,180 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: [] - job: - name: train - chdir: null - override_dirname: '' - id: ??? - num: ??? - config_name: debug_td.yaml - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-28/14-31-03 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-28/14-31-03/.hydra/overrides.yaml b/configs/outputs/2026-04-28/14-31-03/.hydra/overrides.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs/outputs/2026-04-28/14-31-03/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs/outputs/2026-04-28/23-51-24/.hydra/config.yaml b/configs/outputs/2026-04-28/23-51-24/.hydra/config.yaml deleted file mode 100755 index bd5f743cb9..0000000000 --- a/configs/outputs/2026-04-28/23-51-24/.hydra/config.yaml +++ /dev/null @@ -1,616 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: debug - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: true - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: pyg - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: [] - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-04-28/23-51-24/.hydra/hydra.yaml b/configs/outputs/2026-04-28/23-51-24/.hydra/hydra.yaml deleted file mode 100755 index 9160004b9c..0000000000 --- a/configs/outputs/2026-04-28/23-51-24/.hydra/hydra.yaml +++ /dev/null @@ -1,181 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: - - diagnostics.log.mlflow.run_name=debug - job: - name: train - chdir: null - override_dirname: diagnostics.log.mlflow.run_name=debug - id: ??? - num: ??? - config_name: debug_td - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-28/23-51-24 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-28/23-51-24/.hydra/overrides.yaml b/configs/outputs/2026-04-28/23-51-24/.hydra/overrides.yaml deleted file mode 100755 index 536bfe334b..0000000000 --- a/configs/outputs/2026-04-28/23-51-24/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -- diagnostics.log.mlflow.run_name=debug diff --git a/configs/outputs/2026-04-29/15-32-20/.hydra/config.yaml b/configs/outputs/2026-04-29/15-32-20/.hydra/config.yaml deleted file mode 100755 index 75549c23d7..0000000000 --- a/configs/outputs/2026-04-29/15-32-20/.hydra/config.yaml +++ /dev/null @@ -1,616 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: debug_new_code - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: 1 - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: false - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: pyg - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: [] - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-04-29/15-32-20/.hydra/hydra.yaml b/configs/outputs/2026-04-29/15-32-20/.hydra/hydra.yaml deleted file mode 100755 index 7408c25845..0000000000 --- a/configs/outputs/2026-04-29/15-32-20/.hydra/hydra.yaml +++ /dev/null @@ -1,181 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: - - diagnostics.log.mlflow.run_name=debug_new_code - job: - name: train - chdir: null - override_dirname: diagnostics.log.mlflow.run_name=debug_new_code - id: ??? - num: ??? - config_name: debug_td - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-29/15-32-20 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-29/15-32-20/.hydra/overrides.yaml b/configs/outputs/2026-04-29/15-32-20/.hydra/overrides.yaml deleted file mode 100755 index a9fa02ba17..0000000000 --- a/configs/outputs/2026-04-29/15-32-20/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -- diagnostics.log.mlflow.run_name=debug_new_code diff --git a/configs/outputs/2026-04-29/15-48-59/.hydra/config.yaml b/configs/outputs/2026-04-29/15-48-59/.hydra/config.yaml deleted file mode 100755 index ec099cd6f1..0000000000 --- a/configs/outputs/2026-04-29/15-48-59/.hydra/config.yaml +++ /dev/null @@ -1,620 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: debug_new_code - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: ${oc.decode:${oc.env:SLURM_NNODES}} - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: false - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: pyg - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: [] - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-04-29/15-48-59/.hydra/hydra.yaml b/configs/outputs/2026-04-29/15-48-59/.hydra/hydra.yaml deleted file mode 100755 index dda8627f07..0000000000 --- a/configs/outputs/2026-04-29/15-48-59/.hydra/hydra.yaml +++ /dev/null @@ -1,181 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: - - diagnostics.log.mlflow.run_name=debug_new_code - job: - name: train - chdir: null - override_dirname: diagnostics.log.mlflow.run_name=debug_new_code - id: ??? - num: ??? - config_name: debug_td - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-29/15-48-59 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-29/15-48-59/.hydra/overrides.yaml b/configs/outputs/2026-04-29/15-48-59/.hydra/overrides.yaml deleted file mode 100755 index a9fa02ba17..0000000000 --- a/configs/outputs/2026-04-29/15-48-59/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -- diagnostics.log.mlflow.run_name=debug_new_code diff --git a/configs/outputs/2026-04-30/00-35-05/.hydra/config.yaml b/configs/outputs/2026-04-30/00-35-05/.hydra/config.yaml deleted file mode 100755 index ec099cd6f1..0000000000 --- a/configs/outputs/2026-04-30/00-35-05/.hydra/config.yaml +++ /dev/null @@ -1,620 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: debug_new_code - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: ${oc.decode:${oc.env:SLURM_NNODES}} - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: false - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: pyg - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: [] - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-04-30/00-35-05/.hydra/hydra.yaml b/configs/outputs/2026-04-30/00-35-05/.hydra/hydra.yaml deleted file mode 100755 index 997090bc77..0000000000 --- a/configs/outputs/2026-04-30/00-35-05/.hydra/hydra.yaml +++ /dev/null @@ -1,181 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: - - diagnostics.log.mlflow.run_name=debug_new_code - job: - name: train - chdir: null - override_dirname: diagnostics.log.mlflow.run_name=debug_new_code - id: ??? - num: ??? - config_name: debug_td - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-04-30/00-35-05 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-04-30/00-35-05/.hydra/overrides.yaml b/configs/outputs/2026-04-30/00-35-05/.hydra/overrides.yaml deleted file mode 100755 index a9fa02ba17..0000000000 --- a/configs/outputs/2026-04-30/00-35-05/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -- diagnostics.log.mlflow.run_name=debug_new_code diff --git a/configs/outputs/2026-05-01/01-28-46/.hydra/config.yaml b/configs/outputs/2026-05-01/01-28-46/.hydra/config.yaml deleted file mode 100755 index ec099cd6f1..0000000000 --- a/configs/outputs/2026-05-01/01-28-46/.hydra/config.yaml +++ /dev/null @@ -1,620 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: debug_new_code - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: ${oc.decode:${oc.env:SLURM_NNODES}} - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: false - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: pyg - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: triton - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: [] - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: false -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-05-01/01-28-46/.hydra/hydra.yaml b/configs/outputs/2026-05-01/01-28-46/.hydra/hydra.yaml deleted file mode 100755 index 07a5cfdae3..0000000000 --- a/configs/outputs/2026-05-01/01-28-46/.hydra/hydra.yaml +++ /dev/null @@ -1,181 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: - - diagnostics.log.mlflow.run_name=debug_new_code - job: - name: train - chdir: null - override_dirname: diagnostics.log.mlflow.run_name=debug_new_code - id: ??? - num: ??? - config_name: debug_td - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-05-01/01-28-46 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-05-01/01-28-46/.hydra/overrides.yaml b/configs/outputs/2026-05-01/01-28-46/.hydra/overrides.yaml deleted file mode 100755 index a9fa02ba17..0000000000 --- a/configs/outputs/2026-05-01/01-28-46/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -- diagnostics.log.mlflow.run_name=debug_new_code diff --git a/configs/outputs/2026-05-01/08-37-12/.hydra/config.yaml b/configs/outputs/2026-05-01/08-37-12/.hydra/config.yaml deleted file mode 100755 index 9ab698010f..0000000000 --- a/configs/outputs/2026-05-01/08-37-12/.hydra/config.yaml +++ /dev/null @@ -1,621 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: debug_new_code - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph_anemoi_new.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: ${oc.decode:${oc.env:SLURM_NNODES}} - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: false - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: pyg - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: [] - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: true -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-05-01/08-37-12/.hydra/hydra.yaml b/configs/outputs/2026-05-01/08-37-12/.hydra/hydra.yaml deleted file mode 100755 index c1f124ef48..0000000000 --- a/configs/outputs/2026-05-01/08-37-12/.hydra/hydra.yaml +++ /dev/null @@ -1,181 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: - - diagnostics.log.mlflow.run_name=debug_new_code - job: - name: train - chdir: null - override_dirname: diagnostics.log.mlflow.run_name=debug_new_code - id: ??? - num: ??? - config_name: debug_td - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-05-01/08-37-12 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-05-01/08-37-12/.hydra/overrides.yaml b/configs/outputs/2026-05-01/08-37-12/.hydra/overrides.yaml deleted file mode 100755 index a9fa02ba17..0000000000 --- a/configs/outputs/2026-05-01/08-37-12/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -- diagnostics.log.mlflow.run_name=debug_new_code diff --git a/configs/outputs/2026-05-02/11-33-12/.hydra/config.yaml b/configs/outputs/2026-05-02/11-33-12/.hydra/config.yaml deleted file mode 100755 index 56e984c67e..0000000000 --- a/configs/outputs/2026-05-02/11-33-12/.hydra/config.yaml +++ /dev/null @@ -1,621 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: debug_new_code - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: ${oc.decode:${oc.env:SLURM_NNODES}} - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: false - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: pyg - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: [] - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: true -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-05-02/11-33-12/.hydra/hydra.yaml b/configs/outputs/2026-05-02/11-33-12/.hydra/hydra.yaml deleted file mode 100755 index 3dc1ebd6ce..0000000000 --- a/configs/outputs/2026-05-02/11-33-12/.hydra/hydra.yaml +++ /dev/null @@ -1,181 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: - - diagnostics.log.mlflow.run_name=debug_new_code - job: - name: train - chdir: null - override_dirname: diagnostics.log.mlflow.run_name=debug_new_code - id: ??? - num: ??? - config_name: debug_td - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-05-02/11-33-12 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-05-02/11-33-12/.hydra/overrides.yaml b/configs/outputs/2026-05-02/11-33-12/.hydra/overrides.yaml deleted file mode 100755 index a9fa02ba17..0000000000 --- a/configs/outputs/2026-05-02/11-33-12/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -- diagnostics.log.mlflow.run_name=debug_new_code diff --git a/configs/outputs/2026-05-02/11-35-09/.hydra/config.yaml b/configs/outputs/2026-05-02/11-35-09/.hydra/config.yaml deleted file mode 100755 index 56e984c67e..0000000000 --- a/configs/outputs/2026-05-02/11-35-09/.hydra/config.yaml +++ /dev/null @@ -1,621 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: debug_new_code - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: ${oc.decode:${oc.env:SLURM_NNODES}} - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: true - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: false - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: pyg - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: [] - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: true -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-05-02/11-35-09/.hydra/hydra.yaml b/configs/outputs/2026-05-02/11-35-09/.hydra/hydra.yaml deleted file mode 100755 index 7df56e270e..0000000000 --- a/configs/outputs/2026-05-02/11-35-09/.hydra/hydra.yaml +++ /dev/null @@ -1,181 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: - - diagnostics.log.mlflow.run_name=debug_new_code - job: - name: train - chdir: null - override_dirname: diagnostics.log.mlflow.run_name=debug_new_code - id: ??? - num: ??? - config_name: debug_td - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-05-02/11-35-09 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-05-02/11-35-09/.hydra/overrides.yaml b/configs/outputs/2026-05-02/11-35-09/.hydra/overrides.yaml deleted file mode 100755 index a9fa02ba17..0000000000 --- a/configs/outputs/2026-05-02/11-35-09/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -- diagnostics.log.mlflow.run_name=debug_new_code diff --git a/configs/outputs/2026-05-02/11-38-32/.hydra/config.yaml b/configs/outputs/2026-05-02/11-38-32/.hydra/config.yaml deleted file mode 100755 index c84d7f213b..0000000000 --- a/configs/outputs/2026-05-02/11-38-32/.hydra/config.yaml +++ /dev/null @@ -1,621 +0,0 @@ -data: - format: zarr - frequency: 1h - datasets: - data: - forcing: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - z - diagnostic: - - tp - - cp - - tcc - - hcc - - lcc - - mcc - - ssrd - - strd - processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: - default: mean-std - remap: - cp: tp - std: - - tp - - cp - - ssrd - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - min-max: null - max: - - z - none: - - cos_latitude - - cos_longitude - - sin_latitude - - sin_longitude - - cos_julian_day - - cos_local_time - - sin_julian_day - - sin_local_time - - insolation - - lsm - - tcc - - mcc - - hcc - - lcc - num_features: null -dataloader: - prefetch_factor: 2 - pin_memory: true - read_group_size: ${system.hardware.num_gpus_per_model} - num_workers: - training: 8 - validation: 4 - test: 8 - batch_size: - training: 1 - validation: 1 - test: 4 - limit_batches: - training: 2000 - validation: 100 - test: 20 - dataset: ${system.input.dataset} - model_run_info: null - training: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2016-01-01' - end: '2022-05-31' - trajectory: ${dataloader.model_run_info} - validation: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: - - u_10 - - v_10 - - w_10 - - z_10 - - q_10 - - t_10 - - sdor - - slor - start: '2022-06-01' - end: '2023-05-31' - trajectory: ${dataloader.model_run_info} - test: - datasets: - data: - dataset_config: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - drop: [] - start: 2022 - end: null - trajectory: ${dataloader.model_run_info} -diagnostics: - plot: - asynchronous: true - projection_kind: equirectangular - datashader: true - frequency: - batch: 750 - epoch: 10 - parameters: - - z_500 - - t_850 - - u_850 - - v_850 - - 2t - - 10u - - 10v - - sp - - tp - - cp - sample_idx: 0 - precip_and_related_fields: - - tp - - cp - colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: - - '#ffffff' - - '#04e9e7' - - '#019ff4' - - '#0300f4' - - '#02fd02' - - '#01c501' - - '#008e00' - - '#fdf802' - - '#e5bc00' - - '#fd9500' - - '#fd0000' - - '#d40000' - - '#bc0000' - - '#f800fd' - variables: ${diagnostics.plot.precip_and_related_fields} - datasets_to_plot: - - data - focus_areas: - europe: - latlon_bbox: - - 30.0 - - -20.0 - - 60.0 - - 40.0 - china: - latlon_bbox: - - 18.0 - - 73.0 - - 54.0 - - 135.0 - callbacks: [] - benchmark_profiler: - memory: - enabled: false - steps: 5 - warmup: 2 - extra_plots: false - trace_rank0_only: false - time: - enabled: true - verbose: false - speed: - enabled: true - system: - enabled: false - model_summary: - enabled: false - snapshot: - enabled: false - steps: 4 - warmup: 0 - log: - mlflow: - enabled: true - _target_: anemoi.training.diagnostics.mlflow.logger.AnemoiMLflowLogger - offline: true - authentication: true - tracking_uri: https://mlflow.ecmwf.int - experiment_name: aifs - project_name: Anemoi - system: true - terminal: true - run_name: debug_new_code - on_resume_create_child: true - expand_hyperparams: - - config - http_max_retries: 35 - max_params_length: 2000 - save_dir: ${system.output.logs.mlflow} - interval: 100 - callbacks: [] - debug: - anomaly_detection: false - enable_checkpointing: true - checkpoint: - every_n_minutes: - save_frequency: 30 - num_models_saved: 3 - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 - every_n_train_steps: - save_frequency: null - num_models_saved: 0 - enable_progress_bar: true - progress_bar: - _target_: pytorch_lightning.callbacks.TQDMProgressBar - refresh_rate: 1 - check_val_every_n_epoch: 1 - print_memory_summary: false -system: - output: - root: /e/scratch/gkpdm/clare1/new/ - logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard - checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} - plots: plots - profiler: profiler - input: - dataset: /e/data1/jureap-data/ecmwf/gkpdm/datasets/aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph.pt - truncation: null - truncation_inv: null - loss_matrices_path: null - warm_start: null - hardware: - accelerator: auto - num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} - num_nodes: ${oc.decode:${oc.env:SLURM_NNODES}} - num_gpus_per_model: 1 - num_gpus_per_ensemble: 2 -graph: - overwrite: false - nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.datasets.data.dataset_config} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 6 - edges: - - source_name: data - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: hidden - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - source_name: hidden - target_name: data - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - post_processors: [] -model: - num_channels: 1024 - condition_on_residual: false - output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - cpu_offload: false - keep_batch_sharded: true - model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - hidden_nodes_name: hidden - latent_skip: false - noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: null - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - layer_kernels: - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: true - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - graph_attention_backend: pyg - edge_pre_mlp: false - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - zero_init: true - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: false - encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 8 - mlp_hidden_ratio: 4 - num_heads: 16 - initialise_data_extractor_zero: false - qk_norm: false - cpu_offload: ${model.cpu_offload} - gradient_checkpointing: true - layer_kernels: ${model.layer_kernels} - shard_strategy: edges - graph_attention_backend: pyg - edge_pre_mlp: false - residual: - _target_: anemoi.models.layers.residual.SkipConnection - step: -1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - compile: [] - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 -task: - _target_: anemoi.training.tasks.TemporalDownscaler - input_timestep: 6H - output_timestep: 1H - output_left_boundary: false - output_right_boundary: true -training: - scalers: - datasets: - data: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 - u: 1 - v: 1 - w: 0.1 - z: 1 - sp: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - msl: 1 - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - training_loss: - datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - losses: - - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - no_autocast: true - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: - - mean - - max - - min - - diff - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - ignore_nans: false - no_autocast: true - alpha: 0.95 - optimization: - optimizer: - _target_: torch.optim.AdamW - betas: - - 0.9 - - 0.95 - lr_scheduler: - _target_: timm.scheduler.CosineLRScheduler - lr_min: 3.0e-07 - t_initial: 200000 - warmup_t: 1000 - t_in_epochs: false - lr: 5.0e-05 - pl_lr_scheduler: - interval: step - run_id: null - fork_run_id: null - transfer_learning: false - load_weights_only: false - update_ds_stats_on_ckpt_load: - states: false - tendencies: true - deterministic: false - precision: 16-mixed - accum_grad_batches: 1 - num_sanity_val_steps: 6 - gradient_clip: - val: 32.0 - algorithm: value - training_method: anemoi.training.train.methods.EnsembleTraining - ensemble_size_per_device: 1 - strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - loss_gradient_scaling: false - validation_metrics: - datasets: - data: - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - alpha: 1.0 - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: - - null - weights: - - 1.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: - - node_weights - - time_steps - ignore_nans: false - no_autocast: true - alpha: 1.0 - variable_groups: - datasets: - data: - default: sfc - pl: - param: - - q - - t - - u - - v - - w - - z - metrics: - datasets: - data: - - z_500 - - t_850 - - u_850 - - v_850 - max_epochs: null - max_steps: 200000 - submodules_to_freeze: [] - recompile_limit: 32 -config_validation: true diff --git a/configs/outputs/2026-05-02/11-38-32/.hydra/hydra.yaml b/configs/outputs/2026-05-02/11-38-32/.hydra/hydra.yaml deleted file mode 100755 index 1bdeb37bbc..0000000000 --- a/configs/outputs/2026-05-02/11-38-32/.hydra/hydra.yaml +++ /dev/null @@ -1,181 +0,0 @@ -hydra: - run: - dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S} - sweep: - dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} - subdir: ${hydra.job.num} - launcher: - _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher - sweeper: - _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper - max_batch_size: null - params: null - help: - app_name: ${hydra.job.name} - header: '${hydra.help.app_name} is powered by Hydra. - - ' - footer: 'Powered by Hydra (https://hydra.cc) - - Use --hydra-help to view Hydra specific help - - ' - template: '${hydra.help.header} - - == Configuration groups == - - Compose your configuration from those groups (group=option) - - - $APP_CONFIG_GROUPS - - - == Config == - - Override anything in the config (foo.bar=value) - - - $CONFIG - - - ${hydra.help.footer} - - ' - hydra_help: - template: 'Hydra (${hydra.runtime.version}) - - See https://hydra.cc for more info. - - - == Flags == - - $FLAGS_HELP - - - == Configuration groups == - - Compose your configuration from those groups (For example, append hydra/job_logging=disabled - to command line) - - - $HYDRA_CONFIG_GROUPS - - - Use ''--cfg hydra'' to Show the Hydra config. - - ' - hydra_help: ??? - hydra_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][HYDRA] %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - root: - level: INFO - handlers: - - console - loggers: - logging_example: - level: DEBUG - disable_existing_loggers: false - job_logging: - version: 1 - formatters: - simple: - format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' - handlers: - console: - class: logging.StreamHandler - formatter: simple - stream: ext://sys.stdout - file: - class: logging.FileHandler - formatter: simple - filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log - root: - level: INFO - handlers: - - console - - file - disable_existing_loggers: false - env: {} - mode: RUN - searchpath: [] - callbacks: {} - output_subdir: .hydra - overrides: - hydra: - - hydra.mode=RUN - task: - - diagnostics.log.mlflow.run_name=debug_new_code - job: - name: train - chdir: null - override_dirname: diagnostics.log.mlflow.run_name=debug_new_code - id: ??? - num: ??? - config_name: debug_td - env_set: {} - env_copy: [] - config: - override_dirname: - kv_sep: '=' - item_sep: ',' - exclude_keys: [] - runtime: - version: 1.3.2 - version_base: '1.3' - cwd: /e/project1/gkpdm/clare1/time_interpolator_new/configs - config_sources: - - path: /e/project1/gkpdm/clare1/time_interpolator_new/configs - schema: file - provider: anemoi-cwd-searchpath-plugin - - path: hydra.conf - schema: pkg - provider: hydra - - path: anemoi.training.config - schema: pkg - provider: main - - path: anemoi.training.config - schema: pkg - provider: anemoi-package-searchpath-plugin - - path: '' - schema: structured - provider: schema - output_dir: /e/project1/gkpdm/clare1/time_interpolator_new/configs/outputs/2026-05-02/11-38-32 - choices: - training: ensemble - training/weight_averaging: null - training/optimization: default - training/optimization/lr_scheduler: cosine_scheduler - training/optimization/optimizer: adamw - training/training_loss: ensemble_combined - training/scalers: global - task: temporal_downscaler - model: graphtransformer_ens - graph: n320 - system: slurm - system/hardware: slurm - system/input: jupiter - system/output: jupiter - diagnostics: evaluation_ens - diagnostics/log: mlflow - diagnostics/benchmark_profiler: simple - diagnostics/plot: simple - dataloader: native_grid_td - data: zarr_interp - hydra/env: default - hydra/callbacks: null - hydra/job_logging: default - hydra/hydra_logging: default - hydra/hydra_help: default - hydra/help: default - hydra/sweeper: basic - hydra/launcher: basic - hydra/output: default - verbose: false diff --git a/configs/outputs/2026-05-02/11-38-32/.hydra/overrides.yaml b/configs/outputs/2026-05-02/11-38-32/.hydra/overrides.yaml deleted file mode 100755 index a9fa02ba17..0000000000 --- a/configs/outputs/2026-05-02/11-38-32/.hydra/overrides.yaml +++ /dev/null @@ -1 +0,0 @@ -- diagnostics.log.mlflow.run_name=debug_new_code diff --git a/configs/point_wise.yaml b/configs/point_wise.yaml deleted file mode 100755 index 73b8b64dd8..0000000000 --- a/configs/point_wise.yaml +++ /dev/null @@ -1,20 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- system: example -- graph: point_wise -- model: point_wise -- task: forecaster -- training: single -- _self_ - - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# hardware: -# num_gpus_per_node: 1 diff --git a/configs/stretched.yaml b/configs/stretched.yaml deleted file mode 100755 index 433ac71e43..0000000000 --- a/configs/stretched.yaml +++ /dev/null @@ -1,39 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- system: example -- graph: stretched_grid -- model: graphtransformer -- task: forecaster -- training: stretched -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# system: -# hardware: -# num_gpus_per_node: 1 - -dataloader: - dataset: - cutout: - - dataset: ${system.input.dataset} - thinning: ??? - - dataset: ${system.input.forcing_dataset} - adjust: all - min_distance_km: 0 -training: - scalers: - datasets: - data: # user-defined key in data - node_weights: - weight_frac_of_total: ??? -system: - input: - dataset: ??? - forcing_dataset: ??? diff --git a/configs/system/example.yaml b/configs/system/example.yaml deleted file mode 100755 index 016f4caf79..0000000000 --- a/configs/system/example.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -defaults: - - output: example - - input: example - - hardware: example diff --git a/configs/system/hardware/example.yaml b/configs/system/hardware/example.yaml deleted file mode 100755 index d28436c2a8..0000000000 --- a/configs/system/hardware/example.yaml +++ /dev/null @@ -1,5 +0,0 @@ -# number of GPUs per node and number of nodes (for DDP) -accelerator: auto -num_gpus_per_node: 1 -num_nodes: 1 -num_gpus_per_model: 1 diff --git a/configs/system/hardware/slurm.yaml b/configs/system/hardware/slurm.yaml deleted file mode 100755 index d0b76d9c66..0000000000 --- a/configs/system/hardware/slurm.yaml +++ /dev/null @@ -1,5 +0,0 @@ -# number of GPUs per node and number of nodes (for DDP) -accelerator: auto -num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} -num_nodes: ${oc.decode:${oc.env:SLURM_NNODES}} -num_gpus_per_model: 1 diff --git a/configs/system/input/example.yaml b/configs/system/input/example.yaml deleted file mode 100755 index 48c11d0465..0000000000 --- a/configs/system/input/example.yaml +++ /dev/null @@ -1,8 +0,0 @@ -dataset: ??? -graph: ??? -# To load the graph from a file, you need to provide a path here like: /path/to/your/graph.pt -# If no such file exists, the graph will be created from the config. -truncation: null -truncation_inv: null -loss_matrices_path: null -warm_start: null diff --git a/configs/system/input/jupiter.yaml b/configs/system/input/jupiter.yaml deleted file mode 100755 index 48c11d0465..0000000000 --- a/configs/system/input/jupiter.yaml +++ /dev/null @@ -1,8 +0,0 @@ -dataset: ??? -graph: ??? -# To load the graph from a file, you need to provide a path here like: /path/to/your/graph.pt -# If no such file exists, the graph will be created from the config. -truncation: null -truncation_inv: null -loss_matrices_path: null -warm_start: null diff --git a/configs/system/output/example.yaml b/configs/system/output/example.yaml deleted file mode 100755 index d24d00c6d7..0000000000 --- a/configs/system/output/example.yaml +++ /dev/null @@ -1,13 +0,0 @@ -root: ??? -logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard -checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} -plots: plots -profiler: profiler diff --git a/configs/system/output/jupiter.yaml b/configs/system/output/jupiter.yaml deleted file mode 100755 index d0f81fe38b..0000000000 --- a/configs/system/output/jupiter.yaml +++ /dev/null @@ -1,13 +0,0 @@ -root: /e/scratch/gkpdm/clare1/new/ -logs: - root: logs - wandb: wandb - mlflow: mlflow - tensorboard: tensorboard -checkpoints: - root: checkpoint - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} -plots: plots -profiler: profiler diff --git a/configs/system/slurm.yaml b/configs/system/slurm.yaml deleted file mode 100755 index 79a13c88bf..0000000000 --- a/configs/system/slurm.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -defaults: - - output: jupiter - - input: jupiter - - hardware: slurm diff --git a/configs/task/autoencoder.yaml b/configs/task/autoencoder.yaml deleted file mode 100755 index 3d4ed8c97d..0000000000 --- a/configs/task/autoencoder.yaml +++ /dev/null @@ -1 +0,0 @@ -_target_: anemoi.training.tasks.Autoencoder diff --git a/configs/task/forecaster.yaml b/configs/task/forecaster.yaml deleted file mode 100755 index c1f14f4ac7..0000000000 --- a/configs/task/forecaster.yaml +++ /dev/null @@ -1,15 +0,0 @@ -_target_: anemoi.training.tasks.Forecaster -multistep_input: 2 -multistep_output: 1 -timestep: "6H" - -# Rollout configuration for autoregressive forecasting -rollout: - start: 1 - # increase rollout every n epochs - epoch_increment: 0 - # maximum rollout to use - maximum: 1 - # number of rollout steps to use for validation - -validation_rollout: 1 diff --git a/configs/task/temporal_downscaler.yaml b/configs/task/temporal_downscaler.yaml deleted file mode 100755 index 01353c0a90..0000000000 --- a/configs/task/temporal_downscaler.yaml +++ /dev/null @@ -1,5 +0,0 @@ -_target_: anemoi.training.tasks.TemporalDownscaler -input_timestep: 6H -output_timestep: 1H -output_left_boundary: False -output_right_boundary: True diff --git a/configs/temporal_downscaler.yaml b/configs/temporal_downscaler.yaml deleted file mode 100755 index f27a8c71d0..0000000000 --- a/configs/temporal_downscaler.yaml +++ /dev/null @@ -1,47 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- system: example -- graph: multi_scale -- model: graphtransformer -- task: temporal_downscaler -- training: single -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# system: -# hardware: -# num_gpus_per_node: 1 - -diagnostics: - plot: - callbacks: [] - callbacks: [] - -training: - training_loss: - datasets: - data: # user-defined key in data - # loss class to initialise - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False - time_aggregate_loss: - datasets: - data: # user-defined key in data - time_aggregation_types: [mean, max, min, diff] - weight: 1.0 - loss_fn: - _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'node_weights'] - ignore_nans: False diff --git a/configs/temporal_downscaler_ensemble.yaml b/configs/temporal_downscaler_ensemble.yaml deleted file mode 100755 index d7a8592e6c..0000000000 --- a/configs/temporal_downscaler_ensemble.yaml +++ /dev/null @@ -1,77 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation_ens -- system: example -- graph: multi_scale -- model: graphtransformer_ens -- task: temporal_downscaler -- training: ensemble -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# system: -# hardware: -# num_gpus_per_node: 1 - -diagnostics: - plot: - callbacks: [] - callbacks: [] - -system: - input: - graph: graph_anemoi_new.pt - dataset: aifs-ea-an-oper-0001-mars-o96-1979-2024-1h-v3-with-era51 - loss_matrices_path: null - hardware: - accelerator: auto - num_gpus_per_ensemble: 1 - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - -model: - num_channels: 128 - -training: - ensemble_size_per_device: 2 - training_loss: - datasets: - data: # user-defined key in data - # loss class to initialise, can be anything subclassing torch.nn.Module - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - weights: [1.0] - - keep_batch_sharded: ${model.keep_batch_sharded} - - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - # scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - no_autocast: True - alpha: 0.95 - time_aggregate_loss: - datasets: - data: # user-defined key in data - time_aggregation_types: [mean, max, min, diff] - weight: 1.0 - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - no_autocast: True - alpha: 0.95 diff --git a/configs/training/diffusion.yaml b/configs/training/diffusion.yaml deleted file mode 100755 index cacbccc5eb..0000000000 --- a/configs/training/diffusion.yaml +++ /dev/null @@ -1,134 +0,0 @@ ---- -defaults: - - scalers: global - - training_loss: single - - optimization: default - - weight_averaging: null - -# resume or fork a training from a checkpoint last.ckpt or specified in system.input.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. -update_ds_stats_on_ckpt_load: - states: False # rebuild state processors from current dataset when loading a checkpoint - tendencies: True # rebuild tendency processors from current dataset when loading a checkpoint - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: bf16-mixed - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 1. - algorithm: norm - -optimization: - optimizer: - _target_: torch.optim.AdamW - weight_decay: 0.1 - betas: [0.9, 0.95] - eps: 1e-7 - -# select model -training_method: anemoi.training.train.methods.DiffusionTraining - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPGroupStrategy - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# loss function for the model -training_loss: - datasets: - data: # user-defined key in data - # loss class to initialise - _target_: anemoi.training.losses.WeightedMSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - datasets: - data: # user-defined key in data - # loss class to initialise - mse: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # Cannot scale over the variable dimension due to possible remappings. - # Available scalers include: - # - 'loss_weights_mask': Giving imputed NaNs a zero weight in the loss function - # Use the `scale_validation_metrics` section to variable scale. - scalers: ["node_weights", "time_steps"] - # other kwargs - ignore_nans: True - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g.: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - -variable_groups: - datasets: - data: # user-defined key in data - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: - datasets: - data: # user-defined key in data - - z_500 - - t_850 - - u_850 - - v_850 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 1000000 - -submodules_to_freeze: [] - -# if using torch compile, how many times a certain block of code will be recompiled in response to different inputs. -# A higher limit can result in better performance but will increase compilation time and disk space -recompile_limit: 32 diff --git a/configs/training/ensemble.yaml b/configs/training/ensemble.yaml deleted file mode 100755 index cb0f155922..0000000000 --- a/configs/training/ensemble.yaml +++ /dev/null @@ -1,138 +0,0 @@ ---- -defaults: - - scalers: global - - training_loss: ensemble - - optimization: default - - weight_averaging: null - -# resume or fork a training from a checkpoint last.ckpt or specified in system.input.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. -update_ds_stats_on_ckpt_load: - states: False # rebuild state processors from current dataset when loading a checkpoint - tendencies: True # rebuild tendency processors from current dataset when loading a checkpoint - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# select model -training_method: anemoi.training.train.methods.EnsembleTraining - -# number of ensemble members per device -ensemble_size_per_device: 4 - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${system.hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - datasets: - data: # user-defined key in data - # loss class to initialise, can be anything subclassing torch.nn.Module - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['node_weights', 'time_steps'] - ignore_nans: False - alpha: 1.0 - - multiscale: - _target_: anemoi.training.losses.MultiscaleLossWrapper - - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - weights: [1.0] - - keep_batch_sharded: ${model.keep_batch_sharded} - - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['node_weights', 'time_steps'] - - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - # scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - no_autocast: True - alpha: 1.0 - - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - -variable_groups: - datasets: - data: # user-defined key in data - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: - datasets: - data: # user-defined key in data - - z_500 - - t_850 - - u_850 - - v_850 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - - -submodules_to_freeze: [] - -# if using torch compile, how many times a certain block of code will be recompiled in response to different inputs. -# A higher limit can result in better performance but will increase compilation time and disk space -recompile_limit: 32 diff --git a/configs/training/lam.yaml b/configs/training/lam.yaml deleted file mode 100755 index 967ce8a315..0000000000 --- a/configs/training/lam.yaml +++ /dev/null @@ -1,118 +0,0 @@ ---- -defaults: - - scalers: lam - - training_loss: single - - optimization: default - - weight_averaging: null - -# resume or fork a training from a checkpoint last.ckpt or specified in system.input.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. -update_ds_stats_on_ckpt_load: - states: False # rebuild state processors from current dataset when loading a checkpoint - tendencies: True # rebuild tendency processors from current dataset when loading a checkpoint - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# Optimizer settings - -# select model -training_method: anemoi.training.train.methods.SingleTraining - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPGroupStrategy - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - datasets: - data: # user-defined key in data - # loss class to initialise - mse_inside_lam: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # Cannot scale over the variable dimension due to possible remappings. - # Available scalers include: - # - 'loss_weights_mask': Giving imputed NaNs a zero weight in the loss function - # Use the `scale_validation_metrics` section to variable scale. - scalers: ["node_weights", "time_steps"] - # other kwargs - ignore_nans: True - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - -variable_groups: - datasets: - data: # user-defined key in data - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: - datasets: - data: # user-defined key in data - - z_500 - - t_850 - - u_850 - - v_850 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - - -submodules_to_freeze: [] - -# if using torch compile, how many times a certain block of code will be recompiled in response to different inputs. -# A higher limit can result in better performance but will increase compilation time and disk space -recompile_limit: 32 diff --git a/configs/training/multi.yaml b/configs/training/multi.yaml deleted file mode 100755 index 6cec1d1382..0000000000 --- a/configs/training/multi.yaml +++ /dev/null @@ -1,116 +0,0 @@ ---- -defaults: - - scalers: multi - - training_loss: single - - optimization: default - - weight_averaging: null - -# resume or fork a training from a checkpoint last.ckpt or specified in hardware.files.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. -update_ds_stats_on_ckpt_load: - states: False # rebuild state processors from current dataset when loading a checkpoint - tendencies: True # rebuild tendency processors from current dataset when loading a checkpoint - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# ===================================================================== -# Optimizer configuration -# ===================================================================== - -# select model -training_method: anemoi.training.train.methods.SingleTraining - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPGroupStrategy - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - - -submodules_to_freeze: [] -# Dataset-specific loss and metrics configuration -training_loss: - datasets: - era5: - # ERA5 uses additional scalers - _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: false - cerra: - # CERRA uses additional scalers - _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: false - -validation_metrics: - datasets: - era5: - mse: - _target_: anemoi.training.losses.MSELoss - scalers: ['node_weights', 'time_steps'] - ignore_nans: true - cerra: - mse: - _target_: anemoi.training.losses.MSELoss - scalers: ['node_weights', 'time_steps'] - ignore_nans: true - -# ERA5-specific variable groups (extends default with more variables) -variable_groups: - datasets: - era5: - default: sfc - pl: - param: [q, t, u, v, w] #, z] TODO: # ERA5 has vorticity and divergence - sfc: - param: [tp, cp, 10u, 10v, 2d, sp] # ERA5 surface variables - cerra: - default: sfc - pl: - param: [q, t, u, v, w] #, z] TODO: # CERRA has vorticity and divergence - sfc: - param: [tp, cp, 10u, 10v, 2d] # CERRA surface variables - -# Same metrics as ERA5 -metrics: - datasets: - era5: - - z_500 - - z_1000 - - t_500 - - u_850 - - v_850 - cerra: - - z_500 - - z_1000 - - t_500 - - u_850 diff --git a/configs/training/optimization/default.yaml b/configs/training/optimization/default.yaml deleted file mode 100755 index f7ad78d808..0000000000 --- a/configs/training/optimization/default.yaml +++ /dev/null @@ -1,14 +0,0 @@ -defaults: - - optimizer: adamw - - lr_scheduler: cosine_scheduler - - _self_ - -lr: 0.625e-4 # local_lr — scaled by hardware config at runtime - -# Lightning scheduler integration: controls how Lightning calls the scheduler -# during training (step vs epoch, metric to monitor for ReduceLROnPlateau, etc.). -# See https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.core.LightningModule.html#lightning.pytorch.core.LightningModule.configure_optimizers -# for all available options. -# Set to null to use Lightning defaults (interval: epoch). -pl_lr_scheduler: - interval: step diff --git a/configs/training/optimization/lr_scheduler/cosine_scheduler.yaml b/configs/training/optimization/lr_scheduler/cosine_scheduler.yaml deleted file mode 100755 index c738a7b021..0000000000 --- a/configs/training/optimization/lr_scheduler/cosine_scheduler.yaml +++ /dev/null @@ -1,5 +0,0 @@ -_target_: timm.scheduler.CosineLRScheduler -lr_min: 3e-7 -t_initial: ${training.max_steps} # NOTE: When max_epochs < max_steps, scheduler will run for max_steps -warmup_t: 1000 -t_in_epochs: false # t_initial and warmup_t are in steps, not epochs (matches interval: step) diff --git a/configs/training/optimization/optimizer/adamw.yaml b/configs/training/optimization/optimizer/adamw.yaml deleted file mode 100755 index 0b03298257..0000000000 --- a/configs/training/optimization/optimizer/adamw.yaml +++ /dev/null @@ -1,2 +0,0 @@ -_target_: torch.optim.AdamW -betas: [0.9, 0.95] # β₁, β₂ diff --git a/configs/training/optimization/optimizer/ademamix.yaml b/configs/training/optimization/optimizer/ademamix.yaml deleted file mode 100755 index c51d8d3bd7..0000000000 --- a/configs/training/optimization/optimizer/ademamix.yaml +++ /dev/null @@ -1,6 +0,0 @@ -_target_: anemoi.training.optimizers.AdEMAMix.AdEMAMix -betas: [0.9, 0.95, 0.9999] # β₁, β₂, β₃ -alpha: 8.0 # Mixing factor controlling EMA fusion -beta3_warmup: 260000 # Warm-up steps for β₃ (in iterations) -alpha_warmup: 260000 # Warm-up steps for α (in iterations) -weight_decay: 0.01 diff --git a/configs/training/optimization/optimizer/zero.yaml b/configs/training/optimization/optimizer/zero.yaml deleted file mode 100755 index f321c12dfe..0000000000 --- a/configs/training/optimization/optimizer/zero.yaml +++ /dev/null @@ -1,5 +0,0 @@ -_target_: torch.distributed.optim.ZeroRedundancyOptimizer -optimizer_class: - _target_: torch.optim.AdamW - _partial_: true -betas: [0.9, 0.95] diff --git a/configs/training/scalers/global.yaml b/configs/training/scalers/global.yaml deleted file mode 100755 index 046e739189..0000000000 --- a/configs/training/scalers/global.yaml +++ /dev/null @@ -1,50 +0,0 @@ -datasets: - data: - # Several scalers can be added here. In order to be applied their names must be included in the loss. - # scaler name must be included in `scalers` in the losses for this to be applied. - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 0.6 #1 - t: 6 #1 - u: 0.8 #0.5 - v: 0.5 #0.33 - w: 0.001 - z: 12 #1 - sp: 10 - 10u: 0.1 - 10v: 0.1 - 2d: 0.5 - tp: 0.025 - cp: 0.0025 - - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - - # mask NaNs with zeros in the loss function - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - - # tendency scalers - # scale the prognostic losses by the stdev of the variable tendencies (e.g. the 6-hourly differences of the data) - # useful if including slow vs fast evolving variables in the training (e.g. Land/Ocean vs Atmosphere) - # if using this option 'variable_loss_scalings' should all be set close to 1.0 for prognostic variables - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - - # Scalers from node attributes - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - - # Scalers in the time dimension - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler diff --git a/configs/training/scalers/lam.yaml b/configs/training/scalers/lam.yaml deleted file mode 100755 index bca0ce5241..0000000000 --- a/configs/training/scalers/lam.yaml +++ /dev/null @@ -1,58 +0,0 @@ -datasets: - data: - # Several scalers can be added here. In order to be applied their names must be included in the loss. - # scaler name must be included in `scalers` in the losses for this to be applied. - general_variable: - # Variable groups definition for scaling by variable level. - # The variable level scaling methods are defined under additional_scalers - # A default group is required and is appended as prefix to the metric of all variables not assigned to a group. - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 0.6 #1 - t: 6 #1 - u: 0.8 #0.5 - v: 0.5 #0.33 - w: 0.001 - z: 12 #1 - sp: 10 - 10u: 0.1 - 10v: 0.1 - 2d: 0.5 - tp: 0.025 - cp: 0.0025 - - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - - # mask NaNs with zeros in the loss function - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - - # tendency scalers - # scale the prognostic losses by the stdev of the variable tendencies (e.g. the 6-hourly differences of the data) - # useful if including slow vs fast evolving variables in the training (e.g. Land/Ocean vs Atmosphere) - # if using this option 'variable_loss_scalings' should all be set close to 1.0 for prognostic variables - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - - # Scalers from node attributes - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: "unit-sum" - - limited_area_mask: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: cutout_mask - norm: null - - # Scalers in the time dimension - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler diff --git a/configs/training/scalers/multi.yaml b/configs/training/scalers/multi.yaml deleted file mode 100755 index e6a965c4ad..0000000000 --- a/configs/training/scalers/multi.yaml +++ /dev/null @@ -1,90 +0,0 @@ -# Dataset-specific scalers configuration -datasets: - era5: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 0.8 # ERA5-specific weight - t: 6 # ERA5-specific weight - u: 0.8 - v: 0.5 - w: 0.001 - z: 12 # Higher weight for geopotential in ERA5 - sp: 10 - 10u: 0.1 # ERA5 has 10m winds - 10v: 0.1 - 2d: 0.5 - tp: 0.025 # ERA5 has precipitation - cp: 0.0025 # ERA5 has convective precipitation - - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - - # tendency scalers - # scale the prognostic losses by the stdev of the variable tendencies (e.g. the 6-hourly differences of the data) - # useful if including slow vs fast evolving variables in the training (e.g. Land/Ocean vs Atmosphere) - # if using this option 'variable_loss_scalings' should all be set close to 1.0 for prognostic variables - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - - # Scalers from node attributes - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - - # Scalers in the time dimension - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler - - cerra: - # ERA5_copy uses same configuration as CERRA for debugging - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1.0 # Same as ERA5 - t: 8 # Same as ERA5 - u: 0.8 - v: 0.5 - w: 0.001 - z: 3 # Same as ERA5 - - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.1 - slope: 0.001 - - # tendency scalers - # scale the prognostic losses by the stdev of the variable tendencies (e.g. the 6-hourly differences of the data) - # useful if including slow vs fast evolving variables in the training (e.g. Land/Ocean vs Atmosphere) - # if using this option 'variable_loss_scalings' should all be set close to 1.0 for prognostic variables - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - - # Scalers from node attributes - node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: area_weight - norm: unit-sum - - # Scalers in the time dimension - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler diff --git a/configs/training/scalers/stretched.yaml b/configs/training/scalers/stretched.yaml deleted file mode 100755 index 505014a4bc..0000000000 --- a/configs/training/scalers/stretched.yaml +++ /dev/null @@ -1,71 +0,0 @@ -datasets: - data: - - # Several scalers can be added here. In order to be applied their names must be included in the loss. - # scaler name must be included in `scalers` in the losses for this to be applied. - general_variable: - # Variable groups definition for scaling by variable level. - # The variable level scaling methods are defined under additional_scalers - # A default group is required and is appended as prefix to the metric of all variables not assigned to a group. - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 0.6 #1 - t: 6 #1 - u: 0.8 #0.5 - v: 0.5 #0.33 - w: 0.001 - z: 12 #1 - sp: 10 - 10u: 0.1 - 10v: 0.1 - 2d: 0.5 - tp: 0.025 - cp: 0.0025 - - pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - - # mask NaNs with zeros in the loss function - nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - - # tendency scalers - # scale the prognostic losses by the stdev of the variable tendencies (e.g. the 6-hourly differences of the data) - # useful if including slow vs fast evolving variables in the training (e.g. Land/Ocean vs Atmosphere) - # if using this option 'variable_loss_scalings' should all be set close to 1.0 for prognostic variables - stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - - var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - - # Scalers from node attributes - node_weights: - _target_: anemoi.training.losses.scalers.ReweightedGraphNodeAttributeScaler - nodes_attribute_name: area_weight - scaling_mask_attribute_name: cutout_mask - weight_frac_of_total: ??? - norm: "unit-sum" - - lam_node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: lam_area_weight - norm: "unit-sum" - - limited_area_mask: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: cutout_mask - norm: null - - outside_lam_mask: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_attribute_name: boundary_mask - norm: null - - # Scalers in the time dimension - time_steps: - _target_: anemoi.training.losses.scalers.UniformTimeStepScaler diff --git a/configs/training/single.yaml b/configs/training/single.yaml deleted file mode 100755 index fd539d7a0e..0000000000 --- a/configs/training/single.yaml +++ /dev/null @@ -1,120 +0,0 @@ ---- -defaults: - - scalers: global - - training_loss: single - - optimization: default - - weight_averaging: null - -# resume or fork a training from a checkpoint last.ckpt or specified in system.input.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. -update_ds_stats_on_ckpt_load: - states: False # rebuild state processors from current dataset when loading a checkpoint - tendencies: True # rebuild tendency processors from current dataset when loading a checkpoint - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * K -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# select model -training_method: anemoi.training.train.methods.SingleTraining - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPGroupStrategy - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - datasets: - data: # user-defined key in data - # loss class to initialise - mse: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # Cannot scale over the variable dimension due to possible remappings. - # Available scalers include: - # - 'loss_weights_mask': Giving imputed NaNs a zero weight in the loss function - # Use the `scale_validation_metrics` section to variable scale. - scalers: ["node_weights", "time_steps"] - # other kwargs - ignore_nans: True - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works -# param is an alias for the variable name in the case of no metadata. - -variable_groups: - datasets: - data: # user-defined key in data - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: - datasets: - data: # user-defined key in data - - z_500 - - t_850 - - u_850 - - v_850 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - - - -# Changes in per-gpu batch_size should come with a rescaling of the local_lr -# in order to keep a constant global_lr -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model - -submodules_to_freeze: [] - -# if using torch compile, how many times a certain block of code will be recompiled in response to different inputs. -# A higher limit can result in better performance but will increase compilation time and disk space -recompile_limit: 32 diff --git a/configs/training/stretched.yaml b/configs/training/stretched.yaml deleted file mode 100755 index f746738518..0000000000 --- a/configs/training/stretched.yaml +++ /dev/null @@ -1,131 +0,0 @@ ---- -defaults: - - scalers: stretched - - training_loss: single - - optimization: default - - weight_averaging: null - -# resume or fork a training from a checkpoint last.ckpt or specified in system.input.warm_start -run_id: null -fork_run_id: null -load_weights_only: False # only load model weights, do not restore optimiser states etc. -update_ds_stats_on_ckpt_load: - states: False # rebuild state processors from current dataset when loading a checkpoint - tendencies: True # rebuild tendency processors from current dataset when loading a checkpoint - -transfer_learning: False # activate to perform transfer learning - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# Optimizer settings - -# select model -training_method: anemoi.training.train.methods.SingleTraining - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPGroupStrategy - num_gpus_per_model: ${system.hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - datasets: - data: # user-defined key in data - # loss class to initialise - mse: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # Cannot scale over the variable dimension due to possible remappings. - # Available scalers include: - # - 'loss_weights_mask': Giving imputed NaNs a zero weight in the loss function - # Use the `scale_validation_metrics` section to variable scale. - scalers: ["node_weights", "time_steps"] - # other kwargs - ignore_nans: True - mse_inside_lam_contribution: - _target_: anemoi.training.losses.MSELoss - scalers: ["limited_area_mask", "node_weights", "time_steps"] - ignore_nans: True - mse_outside_lam_contribution: - _target_: anemoi.training.losses.MSELoss - scalers: ["outside_lam_mask", "node_weights", "time_steps"] - ignore_nans: True - mse_inside_lam: - _target_: anemoi.training.losses.MSELoss - scalers: ["lam_node_weights", "time_steps"] - ignore_nans: True - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - -variable_groups: - datasets: - data: # user-defined key in data - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: - datasets: - data: # user-defined key in data - - z_500 - - t_850 - - u_850 - - v_850 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - - -submodules_to_freeze: [] - -# if using torch compile, how many times a certain block of code will be recompiled in response to different inputs. -# A higher limit can result in better performance but will increase compilation time and disk space -recompile_limit: 32 diff --git a/configs/training/training_loss/ensemble.yaml b/configs/training/training_loss/ensemble.yaml deleted file mode 100755 index fa370f7dd0..0000000000 --- a/configs/training/training_loss/ensemble.yaml +++ /dev/null @@ -1,13 +0,0 @@ -datasets: - data: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - weights: [1.0] - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - no_autocast: True - alpha: 0.95 diff --git a/configs/training/training_loss/ensemble_combined.yaml b/configs/training/training_loss/ensemble_combined.yaml deleted file mode 100755 index 11e593bb2e..0000000000 --- a/configs/training/training_loss/ensemble_combined.yaml +++ /dev/null @@ -1,25 +0,0 @@ -datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - losses: - - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - weights: [1.0] - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] - ignore_nans: False - no_autocast: True - alpha: 0.95 - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: [mean, max, min, diff] - loss_fn: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - no_autocast: True - alpha: 0.95 diff --git a/configs/training/training_loss/single.yaml b/configs/training/training_loss/single.yaml deleted file mode 100755 index d2ddccb98c..0000000000 --- a/configs/training/training_loss/single.yaml +++ /dev/null @@ -1,9 +0,0 @@ -datasets: - data: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False diff --git a/configs/training/training_loss/single_combined.yaml b/configs/training/training_loss/single_combined.yaml deleted file mode 100755 index 4599d51685..0000000000 --- a/configs/training/training_loss/single_combined.yaml +++ /dev/null @@ -1,15 +0,0 @@ -datasets: - data: - _target_: anemoi.training.losses.combined.CombinedLoss - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] - ignore_nans: False - losses: - - _target_: anemoi.training.losses.MSELoss - scalers: ['*'] - ignore_nans: False - - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper - time_aggregation_types: [mean, max, min, diff] - loss_fn: - _target_: anemoi.training.losses.MSELoss - scalers: ['pressure_level', 'general_variable', 'node_weights'] - ignore_nans: False diff --git a/configs/training/weight_averaging/ema.yaml b/configs/training/weight_averaging/ema.yaml deleted file mode 100755 index 3b05996d55..0000000000 --- a/configs/training/weight_averaging/ema.yaml +++ /dev/null @@ -1,2 +0,0 @@ -_target_: pytorch_lightning.callbacks.EMAWeightAveraging -decay: 0.999 diff --git a/configs/training/weight_averaging/swa.yaml b/configs/training/weight_averaging/swa.yaml deleted file mode 100755 index 35f5194d23..0000000000 --- a/configs/training/weight_averaging/swa.yaml +++ /dev/null @@ -1,2 +0,0 @@ -_target_: pytorch_lightning.callbacks.StochasticWeightAveraging -swa_lrs: 1.e-4 diff --git a/configs_old/configs/bash.sh b/configs_old/configs/bash.sh deleted file mode 100755 index 3951024970..0000000000 --- a/configs_old/configs/bash.sh +++ /dev/null @@ -1,9 +0,0 @@ -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -anemoi-training mlflow sync -r 9d4481b431c94645942630bad8f40ab1 -s /e/scratch/gkpdm/clare1/new/logs/mlflow/ -d https://mlflow.ecmwf.int -e time_interpolator -a - -anemoi-training mlflow sync -r e11804a269a4405aa2095bd6c3c721f9 -s /e/scratch/gkpdm/clare1/logs/mlflow/ -d https://mlflow.ecmwf.int -e time_interpolator -a -anemoi-training mlflow sync -r 7443938cbaf9419685fab06ba9f7abb3 -s /e/scratch/gkpdm/clare1/logs/mlflow/ -d https://mlflow.ecmwf.int -e time_interpolator -a diff --git a/configs_old/configs/bash.sh.save b/configs_old/configs/bash.sh.save deleted file mode 100755 index 2aa82052a4..0000000000 --- a/configs_old/configs/bash.sh.save +++ /dev/null @@ -1,12 +0,0 @@ -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -anemoi-training mlflow sync -r 71ac6f06f3c64f7da499a70ee1368ac2 -s /e/scratch/gkpdm/clare1/logs/mlflow/ -d https://mlflow.ecmwf.int -e time_interpolator -a -anemoi-training mlflow sync -r 73f5c7576a0c47b2b58a7e734a806ecb -s /e/scratch/gkpdm/clare1/logs/mlflow/ -d https://mlflow.ecmwf.int -e time_interpolator -a -anemoi-training mlflow sync -r 2aaff63510d64e0282323447104dc2c8 -s /e/scratch/gkpdm/clare1/logs/mlflow/ -d https://mlflow.ecmwf.int -e time_interpolator -a - -d4bce2ccbab54863afd2071b6011fbdf -a01ff0a2f5674aff8de9e8114932519d -fb7aed02802840339087e043f9f9a054 diff --git a/configs_old/configs/config.yaml b/configs_old/configs/config.yaml deleted file mode 100755 index 1b997691ba..0000000000 --- a/configs_old/configs/config.yaml +++ /dev/null @@ -1,14 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- datamodule: single -- hardware: example -- graph: multi_scale -- model: gnn -- training: default -- _self_ - - -# set to true to switch on config validation -config_validation: True diff --git a/configs_old/configs/data/zarr.yaml b/configs_old/configs/data/zarr.yaml deleted file mode 100755 index d39737a157..0000000000 --- a/configs_old/configs/data/zarr.yaml +++ /dev/null @@ -1,113 +0,0 @@ -format: zarr -resolution: n320 -# Time frequency requested from dataset -frequency: 6h -# Time step of model (must be multiple of frequency) -timestep: 6h - -# features that are not part of the forecast state -# but are used as forcing to generate the forecast state -forcing: -- "cos_latitude" -- "cos_longitude" -- "sin_latitude" -- "sin_longitude" -- "cos_julian_day" -- "cos_local_time" -- "sin_julian_day" -- "sin_local_time" -- "insolation" -- "lsm" -- "sdor" -- "slor" -- "z" -# features that are only part of the forecast state -# but are not used as the input to the model -diagnostic: -- tp -- cp -- sf -- tcc -- hcc -- lcc -- mcc -- ro -- ssrd -- strd -- 100u -- 100v - -normalizer: - default: "mean-std" - - # Remap cp statistics to those of tp when using FractionBounding. This ensures - # that cp, as a fraction of tp, remains consistent with tp's scale and statistics. - # NOTE: This remap should only be applied if FractionBounding is enabled for cp. - # remap: - # cp: tp - - # Standardization applied to tp and cp variables. Ensure that if cp is bounded - # as a fraction of tp, both variables are normalized using these shared statistics. - # "Std" normalization is preferred here over "mean-std" to avoid shifting of the - # zero value in the normalized space. - remap: - cp: tp - sf: tp - std: - - "tp" - - "cp" - - "sf" - - "ro" - - "tcw" - - "ssrd" - - "q_50" - - "q_100" - - "q_150" - - "q_200" - - "q_250" - - "q_300" - - "q_400" - - "q_500" - - "q_600" - - "q_700" - - "q_850" - - "q_925" - - "q_1000" - min-max: - max: - - "sdor" - - "slor" - - "z" - none: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - - "insolation" - - "lsm" - - "tcc" - - "mcc" - - "hcc" - - "lcc" - - "swvl1" - - "swvl2" - -# const_imputer: -# default: "none" -# 0: [] - -# processors including imputers and normalizers are applied in order of definition -processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: ${data.normalizer} - # const_imputer: - # _target_: anemoi.models.preprocessing.imputer.ConstantImputer - # config: ${data.const_imputer} - -# Values set in the code -num_features: null # number of features in the forecast state diff --git a/configs_old/configs/data/zarr_interp.yaml b/configs_old/configs/data/zarr_interp.yaml deleted file mode 100755 index b779f30712..0000000000 --- a/configs_old/configs/data/zarr_interp.yaml +++ /dev/null @@ -1,99 +0,0 @@ -format: zarr -resolution: n320 -# Time frequency requested from dataset -frequency: 6h -# Time step of model (must be multiple of frequency) -timestep: 6h - -# features that are not part of the forecast state -# but are used as forcing to generate the forecast state -forcing: -- "cos_latitude" -- "cos_longitude" -- "sin_latitude" -- "sin_longitude" -- "cos_julian_day" -- "cos_local_time" -- "sin_julian_day" -- "sin_local_time" -- "insolation" -- "lsm" -- "z" -# features that are only part of the forecast state -# but are not used as the input to the model -diagnostic: -- tp -- cp -- tcc -- hcc -- lcc -- mcc -- ssrd -- strd - -normalizer: - default: "mean-std" - - # Remap cp statistics to those of tp when using FractionBounding. This ensures - # that cp, as a fraction of tp, remains consistent with tp's scale and statistics. - # NOTE: This remap should only be applied if FractionBounding is enabled for cp. - # remap: - # cp: tp - - # Standardization applied to tp and cp variables. Ensure that if cp is bounded - # as a fraction of tp, both variables are normalized using these shared statistics. - # "Std" normalization is preferred here over "mean-std" to avoid shifting of the - # zero value in the normalized space. - remap: - cp: tp - std: - - "tp" - - "cp" - - "ssrd" - - "q_50" - - "q_100" - - "q_150" - - "q_200" - - "q_250" - - "q_300" - - "q_400" - - "q_500" - - "q_600" - - "q_700" - - "q_850" - - "q_925" - - "q_1000" - min-max: - max: - - "z" - none: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - - "insolation" - - "lsm" - - "tcc" - - "mcc" - - "hcc" - - "lcc" - -# const_imputer: -# default: "none" -# 0: [] - -# processors including imputers and normalizers are applied in order of definition -processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: ${data.normalizer} - # const_imputer: - # _target_: anemoi.models.preprocessing.imputer.ConstantImputer - # config: ${data.const_imputer} - -# Values set in the code -num_features: null # number of features in the forecast state diff --git a/configs_old/configs/data/zarr_new.yaml b/configs_old/configs/data/zarr_new.yaml deleted file mode 100755 index 84bd2da9fd..0000000000 --- a/configs_old/configs/data/zarr_new.yaml +++ /dev/null @@ -1,102 +0,0 @@ -format: zarr -resolution: n320 -# Time frequency requested from dataset -frequency: 6h -# Time step of model (must be multiple of frequency) -timestep: 6h - -# features that are not part of the forecast state -# but are used as forcing to generate the forecast state -forcing: -- "cos_latitude" -- "cos_longitude" -- "sin_latitude" -- "sin_longitude" -- "cos_julian_day" -- "cos_local_time" -- "sin_julian_day" -- "sin_local_time" -- "insolation" -- "lsm" -- "sdor" -- "slor" -- "z" -# features that are only part of the forecast state -# but are not used as the input to the model -diagnostic: -- tcc -- hcc -- lcc -- mcc -- ro -- ssrd -- strd - -normalizer: - default: "mean-std" - - # Remap cp statistics to those of tp when using FractionBounding. This ensures - # that cp, as a fraction of tp, remains consistent with tp's scale and statistics. - # NOTE: This remap should only be applied if FractionBounding is enabled for cp. - # remap: - # cp: tp - - # Standardization applied to tp and cp variables. Ensure that if cp is bounded - # as a fraction of tp, both variables are normalized using these shared statistics. - # "Std" normalization is preferred here over "mean-std" to avoid shifting of the - # zero value in the normalized space. - std: - - "ro" - - "tcw" - - "ssrd" - - "q_50" - - "q_100" - - "q_150" - - "q_200" - - "q_250" - - "q_300" - - "q_400" - - "q_500" - - "q_600" - - "q_700" - - "q_850" - - "q_925" - - "q_1000" - min-max: - max: - - "sdor" - - "slor" - - "z" - none: - - "cos_latitude" - - "cos_longitude" - - "sin_latitude" - - "sin_longitude" - - "cos_julian_day" - - "cos_local_time" - - "sin_julian_day" - - "sin_local_time" - - "insolation" - - "lsm" - - "tcc" - - "mcc" - - "hcc" - - "lcc" - - "swvl1" - - "swvl2" - -# const_imputer: -# default: "none" -# 0: [] - -# processors including imputers and normalizers are applied in order of definition -processors: - normalizer: - _target_: anemoi.models.preprocessing.normalizer.InputNormalizer - config: ${data.normalizer} - # const_imputer: - # _target_: anemoi.models.preprocessing.imputer.ConstantImputer - # config: ${data.const_imputer} - -# Values set in the code -num_features: null # number of features in the forecast state diff --git a/configs_old/configs/dataloader/native_grid.yaml b/configs_old/configs/dataloader/native_grid.yaml deleted file mode 100755 index ad8422962e..0000000000 --- a/configs_old/configs/dataloader/native_grid.yaml +++ /dev/null @@ -1,76 +0,0 @@ -prefetch_factor: 2 -pin_memory: True - -# ============ -# read_group_size: -# Form subgroups of model comm groups that read data together. -# Each reader in the group only reads 1/read_group_size of the data -# which is then all-gathered between the group. -# This can reduce CPU memory usage as well as increase dataloader throughput. -# The number of GPUs per model must be divisible by read_group_size. -# To disable, set to 1. -# ============ -read_group_size: ${hardware.num_gpus_per_model} - -num_workers: - training: 8 - validation: 8 - test: 8 -batch_size: - training: 2 - validation: 4 - test: 4 - -# ============ -# Default effective batch_size for training is 16 -# For the o96 resolution, default per-gpu batch_size is 2 (8 gpus required) -# The global lr is calculated as: -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model -# Assuming a constant effective batch_size, any change in the per_gpu batch_size -# should come with a rescaling of the local_lr to keep a constant global_lr -# ============ - -# runs only N training batches [N = integer | null] -# if null then we run through all the batches -limit_batches: - training: null - validation: null - test: 20 - -# set a custom mask for grid points. -# Useful for LAM (dropping unconnected nodes from forcing dataset) -grid_indices: - _target_: anemoi.training.data.grid_indices.FullGrid - nodes_name: ${graph.data} - -# ============ -# Dataloader definitions -# These follow the anemoi-datasets patterns -# You can make these as complicated for merging as you like -# See https://anemoi-datasets.readthedocs.io -# ============ - -dataset: ${hardware.paths.data}/${hardware.files.dataset} - -training: - dataset: ${dataloader.dataset} - start: null - end: 2020 - frequency: ${data.frequency} - drop: [] - -validation_rollout: 1 # number of rollouts to use for validation, must be equal or greater than rollout expected by callbacks - -validation: - dataset: ${dataloader.dataset} - start: 2021 - end: 2021 - frequency: ${data.frequency} - drop: [] - -test: - dataset: ${dataloader.dataset} - start: 2022 - end: null - frequency: ${data.frequency} - drop: [] diff --git a/configs_old/configs/dataloader/native_grid_1.1.yaml b/configs_old/configs/dataloader/native_grid_1.1.yaml deleted file mode 100755 index 0a6fe93736..0000000000 --- a/configs_old/configs/dataloader/native_grid_1.1.yaml +++ /dev/null @@ -1,101 +0,0 @@ -prefetch_factor: 2 -pin_memory: True - -# ============ -# read_group_size: -# Form subgroups of model comm groups that read data together. -# Each reader in the group only reads 1/read_group_size of the data -# which is then all-gathered between the group. -# This can reduce CPU memory usage as well as increase dataloader throughput. -# The number of GPUs per model must be divisible by read_group_size. -# To disable, set to 1. -# ============ -read_group_size: ${hardware.num_gpus_per_model} - -num_workers: - training: 8 - validation: 8 - test: 8 -batch_size: - training: 1 - validation: 1 - test: 4 - -# ============ -# Default effective batch_size for training is 16 -# For the o96 resolution, default per-gpu batch_size is 2 (8 gpus required) -# The global lr is calculated as: -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model -# Assuming a constant effective batch_size, any change in the per_gpu batch_size -# should come with a rescaling of the local_lr to keep a constant global_lr -# ============ - -# runs only N training batches [N = integer | null] -# if null then we run through all the batches -limit_batches: - training: null - validation: null - test: 20 - -# set a custom mask for grid points. -# Useful for LAM (dropping unconnected nodes from forcing dataset) -grid_indices: - _target_: anemoi.training.data.grid_indices.FullGrid - nodes_name: ${graph.data} - -# ============ -# Dataloader definitions -# These follow the anemoi-datasets patterns -# You can make these as complicated for merging as you like -# See https://anemoi-datasets.readthedocs.io -# ============ - -dataset: ${hardware.paths.data}/${hardware.files.dataset} - -training: - dataset: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - start: null - end: 2022 - frequency: ${data.frequency} - drop: [] - - dataset: ${hardware.paths.data}/${hardware.files.dataset_land} - start: null - end: 2022 - frequency: ${data.frequency} - select: [swvl1, swvl2, stl1, stl2, ssrd, strd, sf, tcc, mcc, hcc, lcc, 100u, 100v, ro] - start: null - end: 2022 - drop: [] - -validation: - dataset: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - start: 2023 - end: 2023 - frequency: ${data.frequency} - drop: [] - - dataset: ${hardware.paths.data}/${hardware.files.dataset_land} - start: 2023 - end: 2023 - frequency: ${data.frequency} - select: [swvl1, swvl2, stl1, stl2, ssrd, strd, sf, tcc, mcc, hcc, lcc, 100u, 100v, ro] - start: 2023 - end: 2023 - drop: [] -validation_rollout: 1 # number of rollouts to use for validation, must be equal or greater than rollout expected by callbacks -test: - dataset: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - start: 2022 - end: null - frequency: ${data.frequency} - drop: [] - - dataset: ${hardware.paths.data}/${hardware.files.dataset_land} - start: 2022 - end: null - frequency: ${data.frequency} - select: [swvl1, swvl2, stl1, stl2, ssrd, strd, sf, tcc, mcc, hcc, lcc, 100u, 100v, ro] - start: 2022 - end: null - drop: [] diff --git a/configs_old/configs/dataloader/native_grid_forecaster.yaml b/configs_old/configs/dataloader/native_grid_forecaster.yaml deleted file mode 100755 index 6e70a96280..0000000000 --- a/configs_old/configs/dataloader/native_grid_forecaster.yaml +++ /dev/null @@ -1,87 +0,0 @@ -prefetch_factor: 2 -pin_memory: True - -# ============ -# read_group_size: -# Form subgroups of model comm groups that read data together. -# Each reader in the group only reads 1/read_group_size of the data -# which is then all-gathered between the group. -# This can reduce CPU memory usage as well as increase dataloader throughput. -# The number of GPUs per model must be divisible by read_group_size. -# To disable, set to 1. -# ============ -read_group_size: ${hardware.num_gpus_per_model} - -num_workers: - training: 8 - validation: 4 - test: 4 -batch_size: - training: 1 - validation: 1 - test: 4 - -# ============ -# Default effective batch_size for training is 16 -# For the o96 resolution, default per-gpu batch_size is 2 (8 gpus required) -# The global lr is calculated as: -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model -# Assuming a constant effective batch_size, any change in the per_gpu batch_size -# should come with a rescaling of the local_lr to keep a constant global_lr -# ============ - -# runs only N training batches [N = integer | null] -# if null then we run through all the batches -limit_batches: - training: null - validation: null - test: 20 - -# set a custom mask for grid points. -# Useful for LAM (dropping unconnected nodes from forcing dataset) -grid_indices: - _target_: anemoi.training.data.grid_indices.FullGrid - nodes_name: ${graph.data} - -# ============ -# Dataloader definitions -# These follow the anemoi-datasets patterns -# You can make these as complicated for merging as you like -# See https://anemoi-datasets.readthedocs.io -# ============ - -dataset: ${hardware.paths.data}/${hardware.files.dataset} -reorder_list: {'10u': 0, '10v': 1, '2d': 2, '2t': 3, 'cos_julian_day': 4, 'cos_latitude': 5, 'cos_local_time': 6, 'cos_longitude': 7, 'cp': 8, 'hcc': 9, - 'insolation': 10, 'lcc': 11, 'lsm': 12, 'mcc': 13, 'msl': 14, 'q_100': 15, 'q_1000': 16, 'q_150': 17, 'q_200': 18, 'q_250': 19, 'q_300': 20, 'q_400': 21, - 'q_50': 22, 'q_500': 23, 'q_600': 24, 'q_700': 25, 'q_850': 26, 'q_925': 27, 'sin_julian_day': 28, 'sin_latitude': 29, 'sin_local_time': 30, 'sin_longitude': - 31, 'skt': 32, 'sp': 33, 'ssrd': 34, 'strd': 35, 't_100': 36, 't_1000': 37, 't_150': 38, 't_200': 39, 't_250': 40, 't_300': 41, 't_400': 42, 't_50': 43, - 't_500': 44, 't_600': 45, 't_700': 46, 't_850': 47, 't_925': 48, 'tcc': 49, 'tcw': 50, 'tp': 51, 'u_100': 52, 'u_1000': 53, 'u_150': 54, 'u_200': 55, - 'u_250': 56, 'u_300': 57, 'u_400': 58, 'u_50': 59, 'u_500': 60, 'u_600': 61, 'u_700': 62, 'u_850': 63, 'u_925': 64, 'v_100': 65, 'v_1000': 66, 'v_150': 67, - 'v_200': 68, 'v_250': 69, 'v_300': 70, 'v_400': 71, 'v_50': 72, 'v_500': 73, 'v_600': 74, 'v_700': 75, 'v_850': 76, 'v_925': 77, 'w_100': 78, 'w_1000': 79, - 'w_150': 80, 'w_200': 81, 'w_250': 82, 'w_300': 83, 'w_400': 84, 'w_50': 85, 'w_500': 86, 'w_600': 87, 'w_700': 88, 'w_850': 89, 'w_925': 90, 'z': 91, - 'z_100': 92, 'z_1000': 93, 'z_150': 94, 'z_200': 95, 'z_250': 96, 'z_300': 97, 'z_400': 98, 'z_50': 99, 'z_500': 100, 'z_600': 101, 'z_700': 102, 'z_850': 103, 'z_925': 104} - -training: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - start: 2016-01-01 - end: 2022-05-31 - reorder: ${dataloader.reorder_list} - drop: ['u_10', 'v_10', 'w_10', 'z_10', 'q_10', 't_10'] - -validation_rollout: 1 # number of rollouts to use for validation, must be equal or greater than rollout expected by callbacks - -validation: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - start: 2022-06-01 - end: 2023-05-31 - reorder: ${dataloader.reorder_list} - drop: ['u_10', 'v_10', 'w_10', 'z_10', 'q_10', 't_10'] - -test: - dataset: ${dataloader.dataset} - start: 2022 - end: null - frequency: ${data.frequency} - drop: [] diff --git a/configs_old/configs/dataloader/native_grid_new.yaml b/configs_old/configs/dataloader/native_grid_new.yaml deleted file mode 100755 index 060ef7ced0..0000000000 --- a/configs_old/configs/dataloader/native_grid_new.yaml +++ /dev/null @@ -1,101 +0,0 @@ -prefetch_factor: 2 -pin_memory: True - -# ============ -# read_group_size: -# Form subgroups of model comm groups that read data together. -# Each reader in the group only reads 1/read_group_size of the data -# which is then all-gathered between the group. -# This can reduce CPU memory usage as well as increase dataloader throughput. -# The number of GPUs per model must be divisible by read_group_size. -# To disable, set to 1. -# ============ -read_group_size: ${hardware.num_gpus_per_model} - -num_workers: - training: 8 - validation: 8 - test: 8 -batch_size: - training: 1 - validation: 1 - test: 4 - -# ============ -# Default effective batch_size for training is 16 -# For the o96 resolution, default per-gpu batch_size is 2 (8 gpus required) -# The global lr is calculated as: -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model -# Assuming a constant effective batch_size, any change in the per_gpu batch_size -# should come with a rescaling of the local_lr to keep a constant global_lr -# ============ - -# runs only N training batches [N = integer | null] -# if null then we run through all the batches -limit_batches: - training: null - validation: null - test: 20 - -# set a custom mask for grid points. -# Useful for LAM (dropping unconnected nodes from forcing dataset) -grid_indices: - _target_: anemoi.training.data.grid_indices.FullGrid - nodes_name: ${graph.data} - -# ============ -# Dataloader definitions -# These follow the anemoi-datasets patterns -# You can make these as complicated for merging as you like -# See https://anemoi-datasets.readthedocs.io -# ============ - -dataset: ${hardware.paths.data}/${hardware.files.dataset} - -training: - dataset: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - start: null - end: 2022 - frequency: ${data.frequency} - drop: [tp, cp] - - dataset: ${hardware.paths.data}/${hardware.files.dataset_land} - start: null - end: 2022 - frequency: ${data.frequency} - select: [swvl1, swvl2, stl1, stl2, ssrd, strd, tcc, mcc, hcc, lcc, ro] - start: null - end: 2022 - drop: [] - -validation: - dataset: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - start: 2023 - end: 2023 - frequency: ${data.frequency} - drop: [tp, cp] - - dataset: ${hardware.paths.data}/${hardware.files.dataset_land} - start: 2023 - end: 2023 - frequency: ${data.frequency} - select: [swvl1, swvl2, stl1, stl2, ssrd, strd, tcc, mcc, hcc, lcc, ro] - start: 2023 - end: 2023 - drop: [] -validation_rollout: 1 # number of rollouts to use for validation, must be equal or greater than rollout expected by callbacks -test: - dataset: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - start: 2022 - end: null - frequency: ${data.frequency} - drop: [tp, cp] - - dataset: ${hardware.paths.data}/${hardware.files.dataset_land} - start: 2022 - end: null - frequency: ${data.frequency} - select: [swvl1, swvl2, stl1, stl2, ssrd, strd, tcc, mcc, hcc, lcc, ro] - start: 2022 - end: null - drop: [] diff --git a/configs_old/configs/dataloader/native_grid_nowind.yaml b/configs_old/configs/dataloader/native_grid_nowind.yaml deleted file mode 100755 index 3264059987..0000000000 --- a/configs_old/configs/dataloader/native_grid_nowind.yaml +++ /dev/null @@ -1,101 +0,0 @@ -prefetch_factor: 2 -pin_memory: True - -# ============ -# read_group_size: -# Form subgroups of model comm groups that read data together. -# Each reader in the group only reads 1/read_group_size of the data -# which is then all-gathered between the group. -# This can reduce CPU memory usage as well as increase dataloader throughput. -# The number of GPUs per model must be divisible by read_group_size. -# To disable, set to 1. -# ============ -read_group_size: ${hardware.num_gpus_per_model} - -num_workers: - training: 8 - validation: 8 - test: 8 -batch_size: - training: 1 - validation: 1 - test: 4 - -# ============ -# Default effective batch_size for training is 16 -# For the o96 resolution, default per-gpu batch_size is 2 (8 gpus required) -# The global lr is calculated as: -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model -# Assuming a constant effective batch_size, any change in the per_gpu batch_size -# should come with a rescaling of the local_lr to keep a constant global_lr -# ============ - -# runs only N training batches [N = integer | null] -# if null then we run through all the batches -limit_batches: - training: null - validation: null - test: 20 - -# set a custom mask for grid points. -# Useful for LAM (dropping unconnected nodes from forcing dataset) -grid_indices: - _target_: anemoi.training.data.grid_indices.FullGrid - nodes_name: ${graph.data} - -# ============ -# Dataloader definitions -# These follow the anemoi-datasets patterns -# You can make these as complicated for merging as you like -# See https://anemoi-datasets.readthedocs.io -# ============ - -dataset: ${hardware.paths.data}/${hardware.files.dataset} - -training: - dataset: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - start: null - end: 2022 - frequency: ${data.frequency} - drop: [tp, cp, 10u, 10v] - - dataset: ${hardware.paths.data}/${hardware.files.dataset_land} - start: null - end: 2022 - frequency: ${data.frequency} - select: [swvl1, swvl2, stl1, stl2, ssrd, strd, tcc, mcc, hcc, lcc, ro] - start: null - end: 2022 - drop: [] - -validation: - dataset: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - start: 2023 - end: 2023 - frequency: ${data.frequency} - drop: [tp, cp, 10u, 10v] - - dataset: ${hardware.paths.data}/${hardware.files.dataset_land} - start: 2023 - end: 2023 - frequency: ${data.frequency} - select: [swvl1, swvl2, stl1, stl2, ssrd, strd, tcc, mcc, hcc, lcc, ro] - start: 2023 - end: 2023 - drop: [] -validation_rollout: 1 # number of rollouts to use for validation, must be equal or greater than rollout expected by callbacks -test: - dataset: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - start: 2022 - end: null - frequency: ${data.frequency} - drop: [tp, cp, 10u, 10v] - - dataset: ${hardware.paths.data}/${hardware.files.dataset_land} - start: 2022 - end: null - frequency: ${data.frequency} - select: [swvl1, swvl2, stl1, stl2, ssrd, strd, tcc, mcc, hcc, lcc, ro] - start: 2022 - end: null - drop: [] diff --git a/configs_old/configs/dataloader/native_grid_td.yaml b/configs_old/configs/dataloader/native_grid_td.yaml deleted file mode 100755 index 564afd03d9..0000000000 --- a/configs_old/configs/dataloader/native_grid_td.yaml +++ /dev/null @@ -1,76 +0,0 @@ -prefetch_factor: 2 -pin_memory: True - -# ============ -# read_group_size: -# Form subgroups of model comm groups that read data together. -# Each reader in the group only reads 1/read_group_size of the data -# which is then all-gathered between the group. -# This can reduce CPU memory usage as well as increase dataloader throughput. -# The number of GPUs per model must be divisible by read_group_size. -# To disable, set to 1. -# ============ -read_group_size: ${hardware.num_gpus_per_model} - -num_workers: - training: 8 - validation: 4 - test: 4 -batch_size: - training: 1 - validation: 1 - test: 4 - -# ============ -# Default effective batch_size for training is 16 -# For the o96 resolution, default per-gpu batch_size is 2 (8 gpus required) -# The global lr is calculated as: -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model -# Assuming a constant effective batch_size, any change in the per_gpu batch_size -# should come with a rescaling of the local_lr to keep a constant global_lr -# ============ - -# runs only N training batches [N = integer | null] -# if null then we run through all the batches -limit_batches: - training: null - validation: null - test: 20 - -# set a custom mask for grid points. -# Useful for LAM (dropping unconnected nodes from forcing dataset) -grid_indices: - _target_: anemoi.training.data.grid_indices.FullGrid - nodes_name: ${graph.data} - -# ============ -# Dataloader definitions -# These follow the anemoi-datasets patterns -# You can make these as complicated for merging as you like -# See https://anemoi-datasets.readthedocs.io -# ============ - -dataset: ${hardware.paths.data}/${hardware.files.dataset} - -training: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - start: 2016-01-01 - end: 2022-05-31 - drop: ['u_10', 'v_10', 'w_10', 'z_10', 'q_10', 't_10', 'sdor', 'slor'] - -validation_rollout: 1 # number of rollouts to use for validation, must be equal or greater than rollout expected by callbacks - -validation: - dataset: ${dataloader.dataset} - frequency: ${data.frequency} - start: 2022-06-01 - end: 2023-05-31 - drop: ['u_10', 'v_10', 'w_10', 'z_10', 'q_10', 't_10', 'sdor', 'slor'] - -test: - dataset: ${dataloader.dataset} - start: 2022 - end: null - frequency: ${data.frequency} - drop: [] diff --git a/configs_old/configs/datamodule/ens.yaml b/configs_old/configs/datamodule/ens.yaml deleted file mode 100755 index 23610214fe..0000000000 --- a/configs_old/configs/datamodule/ens.yaml +++ /dev/null @@ -1 +0,0 @@ -_target_: anemoi.training.data.datamodule.AnemoiEnsDatasetsDataModule diff --git a/configs_old/configs/datamodule/single.yaml b/configs_old/configs/datamodule/single.yaml deleted file mode 100755 index adc4ef8c91..0000000000 --- a/configs_old/configs/datamodule/single.yaml +++ /dev/null @@ -1 +0,0 @@ -_target_: anemoi.training.data.datamodule.AnemoiDatasetsDataModule diff --git a/configs_old/configs/debug.sh b/configs_old/configs/debug.sh deleted file mode 100755 index d5d63aac80..0000000000 --- a/configs_old/configs/debug.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=8 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=12:00:00 -#SBATCH -o %x-%j.out - -#source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -export PYTHONUNBUFFERED=1 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -srun anemoi-training train diagnostics.log.mlflow.run_name="debug" --config-name=debug_hourly diff --git a/configs_old/configs/debug.yaml b/configs_old/configs/debug.yaml deleted file mode 100755 index 95238c98d6..0000000000 --- a/configs_old/configs/debug.yaml +++ /dev/null @@ -1,41 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- datamodule: single -- diagnostics: evaluation -- hardware: slurm -- graph: multi_scale -- model: gnn -- training: default -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# hardware: -# num_gpus_per_node: 1 - -diagnostics: - plot: - callbacks: [] -hardware: - accelerator: auto - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - - -graph: - overwrite: False - -model: - num_channels: 128 -dataloader: - limit_batches: - training: 100 - validation: 100 -training: - max_epochs: 5 diff --git a/configs_old/configs/debug_hourly.yaml b/configs_old/configs/debug_hourly.yaml deleted file mode 100755 index 7fdfc7fff6..0000000000 --- a/configs_old/configs/debug_hourly.yaml +++ /dev/null @@ -1,142 +0,0 @@ -defaults: -- data: zarr_interp -- dataloader: native_grid_td -- diagnostics: evaluation -- datamodule: ens -- hardware: slurm -- graph: n320 -- model: graphtransformer_ens -- training: ensemble -- override hydra/hydra_logging: disabled -- override hydra/job_logging: disabled -- _self_ - -config_validation: False - -hydra: - output_subdir: null - run: - dir: . - -data: - frequency: 1h - timestep: 1h - -dataloader: - limit_batches: - training: 2000 #5000 #null - validation: 100 #10 #0 #null - -diagnostics: - log: - interval: 100 - wandb: - entity: null - mlflow: - enabled: True #True #True - offline: True #True - authentication: True - experiment_name: metno - tracking_uri: https://mlflow.ecmwf.int - run_name: interpolator - system: True - -hardware: - files: - dataset: aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph_interp_n320.pt - num_gpus_per_ensemble: 2 #4 - num_gpus_per_model: 1 #4 - -model: - #model_run_info: #Add for non-analysis training - # start: 2016-01-01T00:00:00 - # length: 18 #in number of dates (* frequency for actual time) - num_channels: 1024 - keep_batch_sharded: False - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val] - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - processor: - num_chunks: 8 - encoder: - num_chunks: 8 - decoder: - num_chunks: 8 - - model: - _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti - latent_skip: False - grid_skip: 1 # Which of the input indices to use as residual connection, null if none. - -training: - load_weights_only: False - transfer_learning: False - scalers: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 #1 - u: 1 #0.5 - v: 1 #0.33 - w: 0.1 - z: 1 #1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - multistep_input: 1 - model_task: anemoi.training.train.tasks.GraphEnsInterpMulti - explicit_times: - input: [0,6] - target: [1,2,3,4,5,6] - aggregate_outputs: #calculate loss on time-aggregated outputs - - mean - - max - - min - - diff - use_all_targets: False #whether to use all interp targets or pick a random one. - #Used with 30 data parallel and 2 ens members. Per target effective batch size of only 6, but 30 with all targets. - run_id: null - ensemble_size_per_device: 1 - max_epochs: null - max_steps: 200000 - #load_weights_only: True - #transfer_learning: True - lr: - rate: 5.0e-5 - min: 3e-7 - warmup: 1000 - iterations: 200000 - training_loss: - _target_: anemoi.training.losses.AlmostFairKernelCRPS #non-combined loss - alpha: 0.95 - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'stdev_tendency'] - ignore_nans: False - rollout: - start: 1 - epoch_increment: 0 - max: 1 - -graph: - overwrite: False diff --git a/configs_old/configs/diagnostics/benchmark_profiler/detailed.yaml b/configs_old/configs/diagnostics/benchmark_profiler/detailed.yaml deleted file mode 100755 index 486c185158..0000000000 --- a/configs_old/configs/diagnostics/benchmark_profiler/detailed.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# Use anemoi-profile to profile the training process -memory: - enabled: True - steps: 5 # wait warmup steps and then do steps (too many steps would lead to a big file) - warmup: 2 - extra_plots: False - trace_rank0_only: False #set to true and it will profile rank 0 only. Reads SLURM_PROC_ID so won't work when not running via Slurm -time: - enabled: True - verbose: False #If true, output every action the profiler caputres, otherwise output a subset defined in PROFILER_ACTIONS at the top of aifs/diagnostics/profiler.py -speed: - enabled: True -system: - enabled: True -model_summary: - enabled: True -snapshot: - enabled: True - steps: 4 # wait warmup steps and then do steps - warmup: 0 diff --git a/configs_old/configs/diagnostics/benchmark_profiler/simple.yaml b/configs_old/configs/diagnostics/benchmark_profiler/simple.yaml deleted file mode 100755 index 34c8023d6d..0000000000 --- a/configs_old/configs/diagnostics/benchmark_profiler/simple.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# Use anemoi-profile to profile the training process -memory: - enabled: False - steps: 5 # wait warmup steps and then do steps (too many steps would lead to a big file) - warmup: 2 - extra_plots: False - trace_rank0_only: False #set to true and it will profile rank 0 only. Reads SLURM_PROC_ID so won't work when not running via Slurm -time: - enabled: True - verbose: False #If true, output every action the profiler caputres, otherwise output a subset defined in PROFILER_ACTIONS at the top of aifs/diagnostics/profiler.py -speed: - enabled: True -system: - enabled: False -model_summary: - enabled: False -snapshot: - enabled: False - steps: 4 # wait warmup steps and then do steps - warmup: 0 diff --git a/configs_old/configs/diagnostics/callbacks/placeholder.yaml b/configs_old/configs/diagnostics/callbacks/placeholder.yaml deleted file mode 100755 index fe51488c70..0000000000 --- a/configs_old/configs/diagnostics/callbacks/placeholder.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/configs_old/configs/diagnostics/callbacks/rollout_eval.yaml b/configs_old/configs/diagnostics/callbacks/rollout_eval.yaml deleted file mode 100755 index 6afa04dc2c..0000000000 --- a/configs_old/configs/diagnostics/callbacks/rollout_eval.yaml +++ /dev/null @@ -1,4 +0,0 @@ -# Add callbacks here -- _target_: anemoi.training.diagnostics.callbacks.evaluation.RolloutEval - rollout: ${dataloader.validation_rollout} - every_n_batches: 20 diff --git a/configs_old/configs/diagnostics/evaluation.yaml b/configs_old/configs/diagnostics/evaluation.yaml deleted file mode 100755 index 0a218e6f62..0000000000 --- a/configs_old/configs/diagnostics/evaluation.yaml +++ /dev/null @@ -1,64 +0,0 @@ ---- -defaults: - - plot: simple - - callbacks: placeholder - - benchmark_profiler: detailed - -# another alternative if you don't have any callbacks is to remove it from the -# defaults list and just use -# callbacks: [] - -debug: - # this will detect and trace back NaNs / Infs etc. but will slow down training - anomaly_detection: False - -# activate the pytorch profiler (disable this in production) -# remember to also activate the tensorboard logger (below) -profiler: False - -enable_checkpointing: True -checkpoint: - every_n_minutes: - save_frequency: 30 # Approximate, as this is checked at the end of training steps - num_models_saved: 3 # If set to k, saves the 'last' k model weights in the training. - - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 # If set to -1, all checkpoints are kept ensuring runs can be continued/forked at any point in the training process - - every_n_train_steps: - save_frequency: null # Does not scale with rollout - num_models_saved: 0 - -log: - wandb: - enabled: False - offline: False - log_model: False - project: 'Anemoi' - entity: null - # logger options (these probably come with some overhead) - gradients: False - parameters: False - tensorboard: - enabled: False - mlflow: - enabled: False - offline: False - authentication: False - tracking_uri: "https://mlflow.ecmwf.int/" - experiment_name: 'anemoi-debug' - project_name: 'Anemoi' - system: False - terminal: True - run_name: null # If set to null, the run name will be the a random UUID - on_resume_create_child: True - expand_hyperparams: # Which keys in hyperparams to expand - - config - http_max_retries: 35 - max_params_length: 2000 - interval: 100 # passed to trainer.log_every_n_steps - -enable_progress_bar: True -check_val_every_n_epoch: 1 -print_memory_summary: False diff --git a/configs_old/configs/diagnostics/evaluation_ens.yaml b/configs_old/configs/diagnostics/evaluation_ens.yaml deleted file mode 100755 index 0252ef0574..0000000000 --- a/configs_old/configs/diagnostics/evaluation_ens.yaml +++ /dev/null @@ -1,107 +0,0 @@ ---- -defaults: - - plot: simple - - benchmark_profiler: simple - -# another alternative if you don't have any callbacks is to remove it from the -# defaults list and just use -callbacks: - - _target_: anemoi.training.diagnostics.callbacks.evaluation.RolloutEvalEns - rollout: ${dataloader.validation_rollout} - every_n_batches: 4 - -plot: - callbacks: - # Add plot callbacks here. - - _target_: anemoi.training.diagnostics.callbacks.plot_ens.PlotEnsSample - sample_idx: ${diagnostics.plot.sample_idx} - per_sample : 2 - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - #Defining the accumulation levels for precipitation related fields and the colormap - accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - members: null # None for all members, list for specific members - - # Deterministic callbacks are also overloaded. - - _target_: anemoi.training.diagnostics.callbacks.plot_ens.PlotLoss - # group parameters by categories when visualizing contributions to the loss - # one-parameter groups are possible to highlight individual parameters - parameter_groups: - moisture: [tp, cp, tcw] - sfc_wind: [10u, 10v] - every_n_batches: ${diagnostics.plot.frequency.batch} - - _target_: anemoi.training.diagnostics.callbacks.plot_ens.PlotSpectrum - sample_idx: ${diagnostics.plot.sample_idx} - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - - _target_: anemoi.training.diagnostics.callbacks.plot_ens.PlotHistogram - sample_idx: ${diagnostics.plot.sample_idx} - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - precip_and_related_fields: ["tp", "cp"] # Optional: specify precip fields for special histogram treatment - - _target_: anemoi.training.diagnostics.callbacks.plot_ens.GraphTrainableFeaturesPlot - every_n_epochs: ${diagnostics.plot.frequency.epoch} - - # Overloaded PlotSample will return the plots for the first ensemble member - # - _target_: anemoi.training.diagnostics.callbacks.plot_ens.PlotSample - # sample_idx: ${diagnostics.plot.sample_idx} - # per_sample: 6 - # parameters: ${diagnostics.plot.parameters} - # every_n_batches: ${diagnostics.plot.frequency.batch} - # accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - # precip_and_related_fields: ["tp", "cp"] # Optional: specify precip fields - -debug: - # this will detect and trace back NaNs / Infs etc. but will slow down training - anomaly_detection: False - -# activate the pytorch profiler (disable this in production) -# remember to also activate the tensorboard logger (below) -profiler: False - -enable_checkpointing: True -checkpoint: - every_n_minutes: - save_frequency: 30 # Approximate, as this is checked at the end of training steps - num_models_saved: 3 # If set to k, saves the 'last' k model weights in the training. - - every_n_epochs: - save_frequency: 1 - num_models_saved: -1 # If set to -1, all checkpoints are kept ensuring runs can be continued/forked at any point in the training process - - every_n_train_steps: - save_frequency: null # Does not scale with rollout - num_models_saved: 0 - -log: - wandb: - enabled: False - offline: False - log_model: False - project: 'Anemoi' - entity: ??? - # logger options (these probably come with some overhead) - gradients: False - parameters: False - tensorboard: - enabled: False - mlflow: - enabled: False - offline: False - authentication: False - tracking_uri: ??? - experiment_name: 'anemoi-debug' - project_name: 'Anemoi' - system: False - terminal: True - run_name: null # If set to null, the run name will be the a random UUID - on_resume_create_child: True - expand_hyperparams: # Which keys in hyperparams to expand - - config - http_max_retries: 35 - max_params_length: 2000 - interval: 100 # passed to trainer.log_every_n_steps - -enable_progress_bar: True -check_val_every_n_epoch: 1 -print_memory_summary: False diff --git a/configs_old/configs/diagnostics/plot/detailed.yaml b/configs_old/configs/diagnostics/plot/detailed.yaml deleted file mode 100755 index e9616897f1..0000000000 --- a/configs_old/configs/diagnostics/plot/detailed.yaml +++ /dev/null @@ -1,83 +0,0 @@ -asynchronous: True # Whether to plot asynchronously -datashader: True # Choose which technique to use for plotting -frequency: # Frequency of the plotting - batch: 750 - epoch: 5 - -# Parameters to plot -parameters: -- z_500 -- t_850 -- u_850 -- v_850 -- 2t -- 10u -- 10v -- sp -- tp -- cp - -# Sample index -sample_idx: 0 - -# Precipitation and related fields -precip_and_related_fields: [tp, cp] - -# select colormaps -colormaps: - default: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormap - name: viridis - # in order to use distinctipy, you need to install the package - # default: - # _target_: anemoi.training.utils.custom_colormaps.DistinctipyColormap - # n_colors: 8 - error: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormap - name: bwr - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: ["#ffffff", "#04e9e7", "#019ff4", "#0300f4", "#02fd02", "#01c501", "#008e00", "#fdf802", "#e5bc00", "#fd9500", "#fd0000", "#d40000", "#bc0000", "#f800fd"] - variables: ${diagnostics.plot.precip_and_related_fields} - -callbacks: - # Add plot callbacks here - - _target_: anemoi.training.diagnostics.callbacks.plot.GraphTrainableFeaturesPlot - every_n_epochs: 5 - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotLoss - # group parameters by categories when visualizing contributions to the loss - # one-parameter groups are possible to highlight individual parameters - parameter_groups: - moisture: [tp, cp, tcw] - sfc_wind: [10u, 10v] - every_n_batches: ${diagnostics.plot.frequency.batch} - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSample - sample_idx: ${diagnostics.plot.sample_idx} - per_sample : 6 - parameters: ${diagnostics.plot.parameters} - every_n_batches: ${diagnostics.plot.frequency.batch} - #Defining the accumulation levels for precipitation related fields and the colormap - accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - colormaps: ${diagnostics.plot.colormaps} - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSpectrum - # every_n_batches: 100 # Override for batch frequency - # min_delta: 0.01 # Minimum distance between two consecutive points - sample_idx: ${diagnostics.plot.sample_idx} - every_n_batches: ${diagnostics.plot.frequency.batch} - parameters: - - z_500 - - tp - - 2t - - 10u - - 10v - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotHistogram - sample_idx: ${diagnostics.plot.sample_idx} - every_n_batches: ${diagnostics.plot.frequency.batch} - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - parameters: - - z_500 - - tp - - 2t - - 10u - - 10v diff --git a/configs_old/configs/diagnostics/plot/rollout_eval.yaml b/configs_old/configs/diagnostics/plot/rollout_eval.yaml deleted file mode 100755 index 1e80633c3c..0000000000 --- a/configs_old/configs/diagnostics/plot/rollout_eval.yaml +++ /dev/null @@ -1,78 +0,0 @@ -asynchronous: True # Whether to plot asynchronously -datashader: True # Choose which technique to use for plotting -frequency: # Frequency of the plotting - batch: 750 - epoch: 5 - -# Parameters to plot -parameters: -- z_500 -- t_850 -- u_850 -- v_850 -- 2t -- 10u -- 10v -- sp -- tp -- cp - -# Sample index -sample_idx: 0 - -# Precipitation and related fields -precip_and_related_fields: [tp, cp] - -# select special colormap for precip fields -colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: ["#ffffff", "#04e9e7", "#019ff4", "#0300f4", "#02fd02", "#01c501", "#008e00", "#fdf802", "#e5bc00", "#fd9500", "#fd0000", "#d40000", "#bc0000", "#f800fd"] - variables: ${diagnostics.plot.precip_and_related_fields} - -callbacks: - # Add plot callbacks here - - _target_: anemoi.training.diagnostics.callbacks.plot.GraphTrainableFeaturesPlot - every_n_epochs: 5 - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotLoss - # group parameters by categories when visualizing contributions to the loss - # one-parameter groups are possible to highlight individual parameters - parameter_groups: - moisture: [tp, cp, tcw] - sfc_wind: [10u, 10v] - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSample - sample_idx: ${diagnostics.plot.sample_idx} - per_sample : 6 - parameters: ${diagnostics.plot.parameters} - #Defining the accumulation levels for precipitation related fields and the colormap - accumulation_levels_plot: [0, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 100] # in mm - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - colormaps: ${diagnostics.plot.colormaps} - - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotSpectrum - # every_n_batches: 100 # Override for batch frequency - sample_idx: ${diagnostics.plot.sample_idx} - parameters: - - z_500 - - tp - - 2t - - 10u - - 10v - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotHistogram - sample_idx: ${diagnostics.plot.sample_idx} - precip_and_related_fields: ${diagnostics.plot.precip_and_related_fields} - parameters: - - z_500 - - tp - - 2t - - 10u - - 10v - - _target_: anemoi.training.diagnostics.callbacks.plot.LongRolloutPlots - # for rollout and video_rollout pick any integers below dataloader.validation_rollout - rollout: - - ${dataloader.validation_rollout} - video_rollout: ${dataloader.validation_rollout} - every_n_epochs: 20 - sample_idx: ${diagnostics.plot.sample_idx} - parameters: ${diagnostics.plot.parameters} - colormaps: ${diagnostics.plot.colormaps} diff --git a/configs_old/configs/diagnostics/plot/simple.yaml b/configs_old/configs/diagnostics/plot/simple.yaml deleted file mode 100755 index 765ad5da90..0000000000 --- a/configs_old/configs/diagnostics/plot/simple.yaml +++ /dev/null @@ -1,41 +0,0 @@ -asynchronous: True # Whether to plot asynchronously -datashader: True # Choose which technique to use for plotting -frequency: # Frequency of the plotting - batch: 750 - epoch: 10 - -# Parameters to plot -parameters: -- z_500 -- t_850 -- u_850 -- v_850 -- 2t -- 10u -- 10v -- sp -- tp -- cp - -# Sample index -sample_idx: 0 - -# Precipitation and related fields -precip_and_related_fields: [tp, cp] - -# select special colormap for precip fields -colormaps: - precip: - _target_: anemoi.training.utils.custom_colormaps.MatplotlibColormapClevels - clevels: ["#ffffff", "#04e9e7", "#019ff4", "#0300f4", "#02fd02", "#01c501", "#008e00", "#fdf802", "#e5bc00", "#fd9500", "#fd0000", "#d40000", "#bc0000", "#f800fd"] - variables: ${diagnostics.plot.precip_and_related_fields} - -callbacks: - # Add plot callbacks here - - _target_: anemoi.training.diagnostics.callbacks.plot.PlotLoss - # group parameters by categories when visualizing contributions to the loss - # one-parameter groups are possible to highlight individual parameters - parameter_groups: - moisture: [tp, cp, tcw] - sfc_wind: [10u, 10v] - every_n_batches: ${diagnostics.plot.frequency.batch} diff --git a/configs_old/configs/diff2_model_forecast.sh b/configs_old/configs/diff2_model_forecast.sh deleted file mode 100755 index 21f908d84a..0000000000 --- a/configs_old/configs/diff2_model_forecast.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=8 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=12:00:00 -#SBATCH -o %x-%j.out - -#source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -export PYTHONUNBUFFERED=1 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -srun anemoi-training train training.run_id=3fda52ea9cc747cd92be0bd41e9558fc model.processor.num_layers=8 training.load_weights_only=False training.transfer_learning=False diagnostics.log.mlflow.run_name="fine tune forecast agg 8" --config-name=fine_ensinterp_agg diff --git a/configs_old/configs/diff_interp_only.yaml b/configs_old/configs/diff_interp_only.yaml deleted file mode 100755 index b8405b7163..0000000000 --- a/configs_old/configs/diff_interp_only.yaml +++ /dev/null @@ -1,153 +0,0 @@ -defaults: -- data: zarr_interp -- dataloader: native_grid -- diagnostics: evaluation -- datamodule: ens -- hardware: slurm -- graph: n320 -- model: graphtransformer_ens -- training: ensemble -- override hydra/hydra_logging: disabled -- override hydra/job_logging: disabled -- _self_ - -config_validation: False - -hydra: - output_subdir: null - run: - dir: . - -data: - frequency: 1h - timestep: 1h - -dataloader: - num_workers: - training: 8 #4 - validation: 4 - test: 4 - batch_size: - training: 1 - validation: 1 - test: 1 - limit_batches: - training: 2000 #5000 #null - validation: 100 #10 #0 #null - training: - start: 1979-01-01 - end: 2022-05-31 - drop: [sdor, slor] - validation: - start: 2022-06-01 - end: 2023-05-31 - drop: [sdor, slor] - test: - start: 2022-06-01 - end: 2023-05-31 - prefetch_factor: 2 - validation_rollout: 1 - -diagnostics: - log: - interval: 100 - wandb: - entity: null - mlflow: - enabled: True #True #True - offline: True #True - authentication: True - experiment_name: metno - tracking_uri: https://mlflow.ecmwf.int - run_name: interpolator - system: True - -hardware: - files: - dataset: aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph_interp_n320.pt - num_gpus_per_ensemble: 2 #4 - num_gpus_per_model: 1 #4 - -model: - num_channels: 1024 - keep_batch_sharded: False - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val] - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - processor: - num_chunks: 8 - encoder: - num_chunks: 8 - model: - _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti - latent_skip: False - grid_skip: 1 # Which of the input indices to use as residual connection, null if none. - -training: - scalers: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 #1 - u: 1 #0.5 - v: 1 #0.33 - w: 0.1 - z: 1 #1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - multistep_input: 1 - model_task: anemoi.training.train.tasks.GraphEnsInterpMulti - explicit_times: - input: [0,6] - target: [1,2,3,4,5,6] - aggregate_outputs: #calculate loss on time-aggregated outputs - - diff - use_all_targets: False #whether to use all interp targets or pick a random one. - #Used with 30 data parallel and 2 ens members. Per target effective batch size of only 6, but 30 with a$ - - run_id: null - ensemble_size_per_device: 1 - max_epochs: null - max_steps: 200000 - #load_weights_only: True - #transfer_learning: True - lr: - rate: 5.0e-5 - min: 3e-7 - warmup: 1000 - training_loss: - _target_: anemoi.training.losses.AlmostFairKernelCRPS #non-combined loss - alpha: 0.95 - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'stdev_tendency'] - ignore_nans: False - - rollout: - start: 1 - epoch_increment: 0 - max: 1 - -graph: - overwrite: False diff --git a/configs_old/configs/diff_model_forecast.sh b/configs_old/configs/diff_model_forecast.sh deleted file mode 100755 index 164d8424ac..0000000000 --- a/configs_old/configs/diff_model_forecast.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=8 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=12:00:00 -#SBATCH -o %x-%j.out - -#source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -export PYTHONUNBUFFERED=1 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -srun anemoi-training train training.run_id=06d2dff106374533817fe94f9135a877 model.processor.num_layers=8 model.num_channels=2048 training.load_weights_only=False training.transfer_learning=False diagnostics.log.mlflow.run_name="fine tune forecast agg 8 2048" --config-name=fine_ensinterp_agg diff --git a/configs_old/configs/diffusion.yaml b/configs_old/configs/diffusion.yaml deleted file mode 100755 index acc8244e0b..0000000000 --- a/configs_old/configs/diffusion.yaml +++ /dev/null @@ -1,14 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- diagnostics: evaluation -- datamodule: single -- hardware: example -- graph: multi_scale -- model: graphtransformer_diffusion -- training: diffusion -- _self_ - - -# set to true to switch on config validation -config_validation: True diff --git a/configs_old/configs/ens_interp_nogap.yaml b/configs_old/configs/ens_interp_nogap.yaml deleted file mode 100755 index 26dc172517..0000000000 --- a/configs_old/configs/ens_interp_nogap.yaml +++ /dev/null @@ -1,156 +0,0 @@ -defaults: -- data: zarr_interp -- dataloader: native_grid -- diagnostics: evaluation -- datamodule: ens -- hardware: slurm -- graph: n320 -- model: graphtransformer_ens -- training: ensemble -- override hydra/hydra_logging: disabled -- override hydra/job_logging: disabled -- _self_ - -config_validation: False - -hydra: - output_subdir: null - run: - dir: . - -data: - frequency: 1h - timestep: 1h - -dataloader: - model_run_info: - start: 1979-01-01T10:00:00 - length: 12 - num_workers: - training: 8 #4 - validation: 4 - test: 4 - batch_size: - training: 1 - validation: 1 - test: 1 - limit_batches: - training: 2000 #5000 #null - validation: 100 #10 #0 #null - training: - start: 1979-01-01 - end: 2022-05-31 - drop: [sdor, slor, q_10, u_10, v_10, w_10, t_10, z_10] - validation: - start: 2022-06-01 - end: 2023-05-31 - drop: [sdor, slor, q_10, u_10, v_10, w_10, t_10, z_10] - test: - start: 2022-06-01 - end: 2023-05-31 - prefetch_factor: 2 - validation_rollout: 1 - -diagnostics: - log: - interval: 100 - wandb: - entity: null - mlflow: - enabled: True #True #True - offline: True #True - authentication: True - experiment_name: metno - tracking_uri: https://mlflow.ecmwf.int - run_name: interpolator - system: True - -hardware: - files: - dataset: aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph_interp_n320.pt - num_gpus_per_ensemble: 2 #4 - num_gpus_per_model: 1 #4 - -model: - num_channels: 1024 - keep_batch_sharded: False - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val] - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - processor: - num_chunks: 8 - encoder: - num_chunks: 8 - model: - _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti - latent_skip: False - grid_skip: 1 # Which of the input indices to use as residual connection, null if none. - -training: - scalers: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 #1 - u: 1 #0.5 - v: 1 #0.33 - w: 0.1 - z: 1 #1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - multistep_input: 1 - model_task: anemoi.training.train.tasks.GraphEnsInterpMulti - explicit_times: - input: [0,6] - target: [1,2,3,4,5,6] - aggregate_outputs: #calculate loss on time-aggregated outputs - - diff - use_all_targets: False #whether to use all interp targets or pick a random one. - #Used with 30 data parallel and 2 ens members. Per target effective batch size of only 6, but 30 with a$ - - run_id: null - ensemble_size_per_device: 1 - max_epochs: null - max_steps: 200000 - #load_weights_only: True - #transfer_learning: True - lr: - rate: 5.0e-5 - min: 3e-7 - warmup: 1000 - training_loss: - _target_: anemoi.training.losses.AlmostFairKernelCRPS #non-combined loss - alpha: 0.95 - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'stdev_tendency'] - ignore_nans: False - - rollout: - start: 1 - epoch_increment: 0 - max: 1 - -graph: - overwrite: False diff --git a/configs_old/configs/ensemble_crps.yaml b/configs_old/configs/ensemble_crps.yaml deleted file mode 100755 index ef6cbfe757..0000000000 --- a/configs_old/configs/ensemble_crps.yaml +++ /dev/null @@ -1,49 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- datamodule: ens -- diagnostics: evaluation_ens -- hardware: example -- graph: encoder_decoder_only -- model: transformer_ens -- training: ensemble -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# hardware: -# num_gpus_per_node: 1 - -diagnostics: - plot: - callbacks: [] -hardware: - files: - truncation: ${data.resolution}-o32-linear.mat.npz - truncation_inv: o32-${data.resolution}-linear.mat.npz - graph: graph_anemoi_new_${data.resolution}.pt - dataset: aifs-ea-an-oper-0001-mars-${data.resolution}-1979-2022-6h-v6.zarr - accelerator: auto - num_gpus_per_ensemble: 1 - num_gpus_per_node: 1 - num_nodes: 1 - num_gpus_per_model: 1 - - -model: - num_channels: 128 -dataloader: - limit_batches: - training: 100 - validation: 100 - -data: - resolution: o96 - -training: - ensemble_size_per_device: 2 - max_epochs: 1 diff --git a/configs_old/configs/ensemble_interpolator.yaml b/configs_old/configs/ensemble_interpolator.yaml deleted file mode 100755 index 6bd13a3d64..0000000000 --- a/configs_old/configs/ensemble_interpolator.yaml +++ /dev/null @@ -1,50 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- datamodule: single -- diagnostics: evaluation -- hardware: example -- graph: multi_scale -- model: graphtransformer_ens -- training: ensemble -- _self_ - -config_validation: False - -data: - frequency: 1h - resolution: o96 - - diagnostics: [] # Default behaviour is to interpolate between observed fields, not predict unseen fields - -#dataloader: - # model_run_info: #Add for non-analysis training - # start: 2020-02-05T12:00:00 - # length: 18 #in number of dates (* frequency for actual time) - -hardware: - num_gpus_per_ensemble: 4 - num_gpus_per_model: 2 - -model: - model: - _target_: anemoi.models.models.interpolator.AnemoiModelEncProcDecEnsInterp - latent_skip: True # True/False for skip connection on latent mesh - grid_skip: 0 # Which of the input indices to use as residual connection, null if none. - -training: - model_task: anemoi.training.train.tasks.GraphEnsInterp - # Instead of inferred using multistep and timeincrement, specify time indices explicitly - explicit_times: - input: [0,6] - target: [1,2,3,4,5] - - target_forcing: #forcing parameters for the target time to include as input - data: #of which come from the dataset - - "insolation" - time_fraction: True - - use_all_targets: True #whether to use all interp targets or cycle through them, one each iteration. - - ensemble_size_per_device: 1 - diff --git a/configs_old/configs/ensinterp_o96_nogap_tendency_back.yaml b/configs_old/configs/ensinterp_o96_nogap_tendency_back.yaml deleted file mode 100755 index fda9dd30d0..0000000000 --- a/configs_old/configs/ensinterp_o96_nogap_tendency_back.yaml +++ /dev/null @@ -1,156 +0,0 @@ -defaults: -- data: zarr_interp -- dataloader: native_grid -- diagnostics: evaluation -- datamodule: ens -- hardware: slurm -- graph: n320 -- model: graphtransformer_ens -- training: ensemble -- override hydra/hydra_logging: disabled -- override hydra/job_logging: disabled -- _self_ - -config_validation: False - -hydra: - output_subdir: null - run: - dir: . - -data: - frequency: 1h - timestep: 1h - -dataloader: - num_workers: - training: 8 #4 - validation: 4 - test: 4 - batch_size: - training: 1 - validation: 1 - test: 1 - limit_batches: - training: 2000 #5000 #null - validation: 100 #10 #0 #null - training: - start: 1979-01-01 - end: 2022-05-31 - drop: [sdor, slor, q_10, u_10, v_10, w_10, t_10, z_10] - validation: - start: 2022-06-01 - end: 2023-05-31 - drop: [sdor, slor, q_10, u_10, v_10, w_10, t_10, z_10] - test: - start: 2022-06-01 - end: 2023-05-31 - prefetch_factor: 2 - validation_rollout: 1 - -diagnostics: - log: - interval: 100 - wandb: - entity: null - mlflow: - enabled: True #True #True - offline: True #True - authentication: True - experiment_name: metno - tracking_uri: https://mlflow.ecmwf.int - run_name: interpolator - system: True - -hardware: - files: - dataset: aifs-ea-an-oper-0001-mars-n320-1979-2024-1h-v2-with-era51.zarr - graph: graph_interp_n320.pt - num_gpus_per_ensemble: 2 #4 - num_gpus_per_model: 1 #4 - -model: - num_channels: 1024 - keep_batch_sharded: False - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val] - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - processor: - num_chunks: 8 - encoder: - num_chunks: 8 - model: - _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti - latent_skip: False - grid_skip: 1 # Which of the input indices to use as residual connection, null if none. - -training: - scalers: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 #1 - u: 1 #0.5 - v: 1 #0.33 - w: 0.1 - z: 1 #1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - multistep_input: 1 - model_task: anemoi.training.train.tasks.GraphEnsInterpMulti - explicit_times: - input: [0,6] - target: [1,2,3,4,5,6] - aggregate_outputs: #calculate loss on time-aggregated outputs - - mean - - max - - min - - diff - use_all_targets: False #whether to use all interp targets or pick a random one. - #Used with 30 data parallel and 2 ens members. Per target effective batch size of only 6, but 30 with a$ - - run_id: null - ensemble_size_per_device: 1 - max_epochs: null - max_steps: 200000 - #load_weights_only: True - #transfer_learning: True - lr: - rate: 5.0e-5 - min: 3e-7 - warmup: 1000 - training_loss: - _target_: anemoi.training.losses.AlmostFairKernelCRPS #non-combined loss - alpha: 0.95 - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'stdev_tendency'] - ignore_nans: False - - rollout: - start: 1 - epoch_increment: 0 - max: 1 - -graph: - overwrite: False diff --git a/configs_old/configs/fine_ensinterp_agg.yaml b/configs_old/configs/fine_ensinterp_agg.yaml deleted file mode 100755 index 20e650b1aa..0000000000 --- a/configs_old/configs/fine_ensinterp_agg.yaml +++ /dev/null @@ -1,142 +0,0 @@ -defaults: -- data: zarr_interp -- dataloader: native_grid_forecaster -- diagnostics: evaluation -- datamodule: ens -- hardware: slurm -- graph: n320 -- model: graphtransformer_ens -- training: ensemble -- override hydra/hydra_logging: disabled -- override hydra/job_logging: disabled -- _self_ - -config_validation: False - -hydra: - output_subdir: null - run: - dir: . - -data: - frequency: 1h - timestep: 1h - -dataloader: - limit_batches: - training: 2000 #5000 #null - validation: 100 #10 #0 #null - -diagnostics: - log: - interval: 100 - wandb: - entity: null - mlflow: - enabled: True #True #True - offline: True #True - authentication: True - experiment_name: metno - tracking_uri: https://mlflow.ecmwf.int - run_name: interpolator - system: True - -hardware: - files: - dataset: aifs-od-fc-oper-0001-mars-n320-2016-2024-1h-v1.zarr - graph: graph_interp_n320.pt - num_gpus_per_ensemble: 2 #4 - num_gpus_per_model: 1 #4 - -model: - model_run_info: #Add for non-analysis training - start: 2016-01-01T00:00:00 - length: 18 #in number of dates (* frequency for actual time) - num_channels: 1024 - keep_batch_sharded: False - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val] - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - processor: - num_chunks: 8 - encoder: - num_chunks: 8 - decoder: - num_chunks: 8 - - model: - _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti - latent_skip: False - grid_skip: 1 # Which of the input indices to use as residual connection, null if none. - -training: - load_weights_only: True - transfer_learning: True - scalers: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 #1 - u: 1 #0.5 - v: 1 #0.33 - w: 0.1 - z: 1 #1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - multistep_input: 1 - model_task: anemoi.training.train.tasks.GraphEnsInterpMulti - explicit_times: - input: [0,6] - target: [1,2,3,4,5,6] - aggregate_outputs: #calculate loss on time-aggregated outputs - - mean - - max - - min - - diff - use_all_targets: False #whether to use all interp targets or pick a random one. - #Used with 30 data parallel and 2 ens members. Per target effective batch size of only 6, but 30 with all targets. - run_id: null - ensemble_size_per_device: 1 - max_epochs: null - max_steps: 200000 - #load_weights_only: True - #transfer_learning: True - lr: - rate: 5.0e-5 - min: 3e-7 - warmup: 1000 - iterations: 200000 - training_loss: - _target_: anemoi.training.losses.AlmostFairKernelCRPS #non-combined loss - alpha: 0.95 - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'stdev_tendency'] - ignore_nans: False - rollout: - start: 1 - epoch_increment: 0 - max: 1 - -graph: - overwrite: False diff --git a/configs_old/configs/fine_ensinterp_diff.yaml b/configs_old/configs/fine_ensinterp_diff.yaml deleted file mode 100755 index d134a50ca3..0000000000 --- a/configs_old/configs/fine_ensinterp_diff.yaml +++ /dev/null @@ -1,139 +0,0 @@ -defaults: -- data: zarr_interp -- dataloader: native_grid_forecaster -- diagnostics: evaluation -- datamodule: ens -- hardware: slurm -- graph: n320 -- model: graphtransformer_ens -- training: ensemble -- override hydra/hydra_logging: disabled -- override hydra/job_logging: disabled -- _self_ - -config_validation: False - -hydra: - output_subdir: null - run: - dir: . - -data: - frequency: 1h - timestep: 1h - -dataloader: - limit_batches: - training: 2000 #5000 #null - validation: 100 #10 #0 #null - -diagnostics: - log: - interval: 100 - wandb: - entity: null - mlflow: - enabled: True #True #True - offline: True #True - authentication: True - experiment_name: metno - tracking_uri: https://mlflow.ecmwf.int - run_name: interpolator - system: True - -hardware: - files: - dataset: aifs-od-fc-oper-0001-mars-n320-2016-2024-1h-v1.zarr - graph: graph_interp_n320.pt - num_gpus_per_ensemble: 2 #4 - num_gpus_per_model: 1 #4 - -model: - model_run_info: #Add for non-analysis training - start: 2016-01-01T00:00:00 - length: 18 #in number of dates (* frequency for actual time) - num_channels: 1024 - keep_batch_sharded: False - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val] - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - processor: - num_chunks: 8 - encoder: - num_chunks: 8 - decoder: - num_chunks: 8 - - model: - _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti - latent_skip: False - grid_skip: 1 # Which of the input indices to use as residual connection, null if none. - -training: - load_weights_only: True - transfer_learning: True - scalers: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 #1 - u: 1 #0.5 - v: 1 #0.33 - w: 0.1 - z: 1 #1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - multistep_input: 1 - model_task: anemoi.training.train.tasks.GraphEnsInterpMulti - explicit_times: - input: [0,6] - target: [1,2,3,4,5,6] - aggregate_outputs: #calculate loss on time-aggregated outputs - - diff - use_all_targets: False #whether to use all interp targets or pick a random one. - #Used with 30 data parallel and 2 ens members. Per target effective batch size of only 6, but 30 with all targets. - run_id: null - ensemble_size_per_device: 1 - max_epochs: null - max_steps: 100000 - #load_weights_only: True - #transfer_learning: True - lr: - rate: 5.0e-5 - min: 3e-7 - warmup: 1000 - iterations: 50000 - training_loss: - _target_: anemoi.training.losses.AlmostFairKernelCRPS #non-combined loss - alpha: 0.95 - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'stdev_tendency'] - ignore_nans: False - rollout: - start: 1 - epoch_increment: 0 - max: 1 - -graph: - overwrite: False diff --git a/configs_old/configs/fine_ensinterp_o96_nogap_tendency_back.yaml b/configs_old/configs/fine_ensinterp_o96_nogap_tendency_back.yaml deleted file mode 100755 index 740b997041..0000000000 --- a/configs_old/configs/fine_ensinterp_o96_nogap_tendency_back.yaml +++ /dev/null @@ -1,142 +0,0 @@ - -defaults: -- data: zarr_interp -- dataloader: native_grid_forecaster -- diagnostics: evaluation -- datamodule: ens -- hardware: slurm -- graph: n320 -- model: graphtransformer_ens -- training: ensemble -- override hydra/hydra_logging: disabled -- override hydra/job_logging: disabled -- _self_ - -config_validation: False - -hydra: - output_subdir: null - run: - dir: . - -data: - frequency: 1h - timestep: 1h - -dataloader: - limit_batches: - training: 2000 #5000 #null - validation: 100 #10 #0 #null - -diagnostics: - log: - interval: 100 - wandb: - entity: null - mlflow: - enabled: True #True #True - offline: True #True - authentication: True - experiment_name: metno - tracking_uri: https://mlflow.ecmwf.int - run_name: interpolator - system: True - -hardware: - files: - graph: graph_interp_n320.pt - dataset: aifs-od-fc-oper-0001-mars-n320-2016-2024-1h-v1.zarr - num_gpus_per_ensemble: 2 #4 - num_gpus_per_model: 1 #4 - -model: - model_run_info: #Add for non-analysis training - start: 2016-01-01T00:00:00 - length: 18 #in number of dates (* frequency for actual time) - num_channels: 1024 - keep_batch_sharded: False - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val] - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - processor: - num_chunks: 8 - encoder: - num_chunks: 8 - decoder: - num_chunks: 8 - - model: - _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti - latent_skip: False - grid_skip: 1 # Which of the input indices to use as residual connection, null if none. - -training: - load_weights_only: True - transfer_learning: True - scalers: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 #1 - u: 1 #0.5 - v: 1 #0.33 - w: 0.1 - z: 1 #1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - multistep_input: 1 - model_task: anemoi.training.train.tasks.GraphEnsInterpMulti - explicit_times: - input: [0,6] - target: [1,2,3,4,5,6] - #aggregate_outputs: #calculate loss on time-aggregated outputs - # - mean - # - max - # - min - # - diff - use_all_targets: False #whether to use all interp targets or pick a random one. - #Used with 30 data parallel and 2 ens members. Per target effective batch size of only 6, but 30 with all targets. - run_id: null - ensemble_size_per_device: 1 - max_epochs: null - max_steps: 50000 - #load_weights_only: True - #transfer_learning: True - lr: - rate: 5.0e-5 - min: 3e-7 - warmup: 1000 - iterations: 50000 - training_loss: - _target_: anemoi.training.losses.AlmostFairKernelCRPS #non-combined loss - alpha: 0.95 - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'stdev_tendency'] - ignore_nans: False - rollout: - start: 1 - epoch_increment: 0 - max: 1 -graph: - overwrite: False diff --git a/configs_old/configs/graph/encoder_decoder_only.yaml b/configs_old/configs/graph/encoder_decoder_only.yaml deleted file mode 100755 index fa183ca0f4..0000000000 --- a/configs_old/configs/graph/encoder_decoder_only.yaml +++ /dev/null @@ -1,57 +0,0 @@ ---- -overwrite: True - -data: "data" -hidden: "hidden" - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes # options: AnemoiDatasetNodes, NPZFileNodes - dataset: ${dataloader.dataset} - attributes: ${graph.attributes.nodes} # options: l1, l2, unit-max, unit-sum, unit-std - # Hidden nodes - hidden: - node_builder: - _target_: anemoi.graphs.nodes.ReducedGaussianGridNodes # options: AnemoiDatasetNodes, NPZFileNodes - grid: o96 # o32, o48, ... - - -edges: -# Encoder configuration -- source_name: ${graph.data} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges # options: KNNEdges, CutOffEdges - cutoff_factor: 0.6 # only for cutoff method - source_mask_attr_name: null - target_mask_attr_name: null - - attributes: ${graph.attributes.edges} - # Decoder configuration -- source_name: ${graph.hidden} - target_name: ${graph.data} - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 3 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - -post_processors: [] diff --git a/configs_old/configs/graph/existing.yaml b/configs_old/configs/graph/existing.yaml deleted file mode 100755 index 8bafc9303f..0000000000 --- a/configs_old/configs/graph/existing.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -overwrite: False - -data: "data" -hidden: "hidden" - -# This config file can be used to load a graph from your local filesystem -# ${hardware.paths.graph}/${hardware.files.graph} diff --git a/configs_old/configs/graph/existing_graph.yaml b/configs_old/configs/graph/existing_graph.yaml deleted file mode 100755 index 8bafc9303f..0000000000 --- a/configs_old/configs/graph/existing_graph.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -overwrite: False - -data: "data" -hidden: "hidden" - -# This config file can be used to load a graph from your local filesystem -# ${hardware.paths.graph}/${hardware.files.graph} diff --git a/configs_old/configs/graph/hierarchical_2level.yaml b/configs_old/configs/graph/hierarchical_2level.yaml deleted file mode 100755 index e7660e8d09..0000000000 --- a/configs_old/configs/graph/hierarchical_2level.yaml +++ /dev/null @@ -1,104 +0,0 @@ ---- -overwrite: True - -data: "data" -hidden: - - "hidden_1" - - "hidden_2" - - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.dataset} - attributes: ${graph.attributes.nodes} - hidden_1: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 5 - hidden_2: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 4 - -edges: - # Encoder configuration - - source_name: "data" - target_name: "hidden_1" - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges - cutoff_factor: 0.6 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - # Decoder configuration - - source_name: "hidden_1" - target_name: "data" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - # Hierarchical connections: downscale - - source_name: "hidden_1" - target_name: "hidden_2" - edge_builders: ${graph.edge_builders.downscale} - attributes: ${graph.attributes.edges} - - # Hierarchical connections: upscale - - source_name: "hidden_2" - target_name: "hidden_1" - edge_builders: ${graph.edge_builders.upscale} - attributes: ${graph.attributes.edges} - - # Hierarchical connections: same level - - source_name: "hidden_1" - target_name: "hidden_1" - edge_builders: ${graph.edge_builders.process} - attributes: ${graph.attributes.edges} - - - source_name: "hidden_2" - target_name: "hidden_2" - edge_builders: ${graph.edge_builders.process} - attributes: ${graph.attributes.edges} - - -############# -edge_builders: - downscale: - - _target_: anemoi.graphs.edges.CutOffEdges - cutoff_factor: 1.5 - source_mask_attr_name: null - target_mask_attr_name: null - process: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: null - source_mask_attr_name: null - target_mask_attr_name: null - upscale: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 5 - source_mask_attr_name: null - target_mask_attr_name: null - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - -post_processors: [] diff --git a/configs_old/configs/graph/hierarchical_3level.yaml b/configs_old/configs/graph/hierarchical_3level.yaml deleted file mode 100755 index b7a56155a1..0000000000 --- a/configs_old/configs/graph/hierarchical_3level.yaml +++ /dev/null @@ -1,131 +0,0 @@ ---- -overwrite: True - -data: "data" -hidden: - - "hidden_1" - - "hidden_2" - - "hidden_3" - - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.dataset} - attributes: ${graph.attributes.nodes} - hidden_1: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 5 - hidden_2: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 4 - hidden_3: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes - resolution: 3 - -edges: - # Encoder configuration - - source_name: "data" - target_name: "hidden_1" - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges - cutoff_factor: 0.6 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - # Decoder configuration - - source_name: "hidden_1" - target_name: "data" - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - # Hierarchical connections: downscale - - source_name: "hidden_1" - target_name: "hidden_2" - edge_builders: - - ${graph.edge_builders.downscale} - attributes: ${graph.attributes.edges} - - - source_name: "hidden_2" - target_name: "hidden_3" - edge_builders: - - ${graph.edge_builders.downscale} - attributes: ${graph.attributes.edges} - - # Hierarchical connections: upscale - - source_name: "hidden_3" - target_name: "hidden_2" - edge_builders: - - ${graph.edge_builders.upscale} - attributes: ${graph.attributes.edges} - - - source_name: "hidden_2" - target_name: "hidden_1" - edge_builders: - - ${graph.edge_builders.upscale} - attributes: ${graph.attributes.edges} - - # Hierarchical connections: same level - - source_name: "hidden_1" - target_name: "hidden_1" - edge_builders: - - ${graph.edge_builders.process} - attributes: ${graph.attributes.edges} - - - source_name: "hidden_2" - target_name: "hidden_2" - edge_builders: - - ${graph.edge_builders.process} - attributes: ${graph.attributes.edges} - - - source_name: "hidden_3" - target_name: "hidden_3" - edge_builders: - - ${graph.edge_builders.process} - attributes: ${graph.attributes.edges} - - -############# -edge_builders: - downscale: - _target_: anemoi.graphs.edges.CutOffEdges - cutoff_factor: 1.5 - source_mask_attr_name: null - target_mask_attr_name: null - process: - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: null - source_mask_attr_name: null - target_mask_attr_name: null - upscale: - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 5 - source_mask_attr_name: null - target_mask_attr_name: null - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - -post_processors: [] diff --git a/configs_old/configs/graph/limited_area.yaml b/configs_old/configs/graph/limited_area.yaml deleted file mode 100755 index 1d95e37d99..0000000000 --- a/configs_old/configs/graph/limited_area.yaml +++ /dev/null @@ -1,82 +0,0 @@ ---- -overwrite: True - -data: "data" -hidden: "hidden" - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.dataset} - attributes: ${graph.attributes.nodes} - # Hidden nodes - hidden: - node_builder: - _target_: anemoi.graphs.nodes.LimitedAreaTriNodes # options: AnemoiDatasetNodes, NPZFileNodes, TriNodes - resolution: 6 # grid resolution for npz (o32, o48, ...) - reference_node_name: ${graph.data} - mask_attr_name: cutout_mask - margin_radius_km: 10 - -edges: -# Encoder configuration -- source_name: ${graph.data} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges # options: KNNEdges, CutOffEdges - cutoff_factor: 0.6 # only for cutoff method - source_mask_attr_name: null - target_mask_attr_name: null - - _target_: anemoi.graphs.edges.CutOffEdges # connects only boundary nodes - cutoff_factor: 1.5 # only for cutoff method - source_mask_attr_name: boundary_mask - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -# Processor configuration -- source_name: ${graph.hidden} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -# Decoder configuration -- source_name: ${graph.hidden} - target_name: ${graph.data} - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 3 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: cutout_mask - attributes: ${graph.attributes.edges} - -post_processors: - - _target_: anemoi.graphs.processors.RemoveUnconnectedNodes - nodes_name: data - ignore: cutout_mask # optional - save_mask_indices_to_attr: indices_connected_nodes # optional - -attributes: - nodes: - # Attributes for data nodes - cutout_mask: - _target_: anemoi.graphs.nodes.attributes.CutOutMask - boundary_mask: - _target_: anemoi.graphs.nodes.attributes.BooleanNot - masks: - _target_: anemoi.graphs.nodes.attributes.CutOutMask - area_weight: - _target_: anemoi.graphs.nodes.attributes.MaskedPlanarAreaWeights # options: Uniform - mask_node_attr_name: cutout_mask - norm: unit-max - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std diff --git a/configs_old/configs/graph/multi_scale.yaml b/configs_old/configs/graph/multi_scale.yaml deleted file mode 100755 index fecf204869..0000000000 --- a/configs_old/configs/graph/multi_scale.yaml +++ /dev/null @@ -1,66 +0,0 @@ ---- -overwrite: True - -data: "data" -hidden: "hidden" - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes # options: AnemoiDatasetNodes, NPZFileNodes - dataset: ${dataloader.dataset} - attributes: ${graph.attributes.nodes} - # Hidden nodes - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes # options: AnemoiDatasetNodes, NPZFileNodes, TriNodes - resolution: 5 # grid resolution for npz (o32, o48, ...) - attributes: ${graph.attributes.nodes} - -edges: -# Encoder configuration -- source_name: ${graph.data} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges # options: KNNEdges, CutOffEdges - cutoff_factor: 0.6 # only for cutoff method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - # Processor configuration -- source_name: ${graph.hidden} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - # Decoder configuration -- source_name: ${graph.hidden} - target_name: ${graph.data} - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 3 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-std - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - -post_processors: [] diff --git a/configs_old/configs/graph/n320.yaml b/configs_old/configs/graph/n320.yaml deleted file mode 100755 index 748615814b..0000000000 --- a/configs_old/configs/graph/n320.yaml +++ /dev/null @@ -1,67 +0,0 @@ ---- -overwrite: True - -data: "data" -hidden: "hidden" - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes # options: AnemoiDatasetNodes, NPZFileNodes - dataset: ${dataloader.dataset} - attributes: ${graph.attributes.nodes} - # Hidden nodes - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes # options: AnemoiDatasetNodes, NPZFileNodes, TriNodes - resolution: 6 # grid resolution for npz (o32, o48, ...) - attributes: ${graph.attributes.nodes} - -edges: -# Encoder configuration -- source_name: ${graph.data} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 12 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - # Processor configuration -- source_name: ${graph.hidden} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - # Decoder configuration -- source_name: ${graph.hidden} - target_name: ${graph.data} - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 3 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-max - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - -post_processors: [] - diff --git a/configs_old/configs/graph/n320_mario.yaml b/configs_old/configs/graph/n320_mario.yaml deleted file mode 100755 index 2e0a981b79..0000000000 --- a/configs_old/configs/graph/n320_mario.yaml +++ /dev/null @@ -1,65 +0,0 @@ ---- -overwrite: True - -data: "data" -hidden: "hidden" - -nodes: - # Data nodes - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes # options: AnemoiDatasetNodes, NPZFileNodes - dataset: ${dataloader.dataset} - attributes: ${graph.attributes.nodes} - # Hidden nodes - hidden: - node_builder: - _target_: anemoi.graphs.nodes.TriNodes # options: AnemoiDatasetNodes, NPZFileNodes, TriNodes - resolution: 6 # grid resolution for npz (o32, o48, ...) - attributes: ${graph.attributes.nodes} - -edges: -# Encoder configuration -- source_name: ${graph.data} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.CutOffEdges # options: KNNEdges, CutOffEdges - cutoff_factor: 0.6 # only for cutoff method - source_mask_attr_name: null - target_mask_attr_name: null -- source_name: ${graph.hidden} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - # Decoder configuration -- source_name: ${graph.hidden} - target_name: ${graph.data} - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges # options: KNNEdges, CutOffEdges - num_nearest_neighbours: 3 # only for knn method - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - - -attributes: - nodes: - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights # options: Area, Uniform - norm: unit-max # options: l1, l2, unit-max, unit-sum, unit-std - fill_value: 0 - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-max - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - -post_processors: [] - diff --git a/configs_old/configs/graph/stretched_grid.yaml b/configs_old/configs/graph/stretched_grid.yaml deleted file mode 100755 index 2323880416..0000000000 --- a/configs_old/configs/graph/stretched_grid.yaml +++ /dev/null @@ -1,80 +0,0 @@ -# Stretched grid graph config intended to be used with a cutout dataset. -# The stretched mesh resolution used here is intended for o96 global resolution with 10km -# limited area resolution. -overwrite: True - -data: "data" -hidden: "hidden" - -nodes: - data: - node_builder: - _target_: anemoi.graphs.nodes.AnemoiDatasetNodes - dataset: ${dataloader.training.dataset} - attributes: ${graph.attributes.nodes} - hidden: - node_builder: - _target_: anemoi.graphs.nodes.StretchedTriNodes - lam_resolution: 8 - global_resolution: 5 - reference_node_name: ${graph.data} - mask_attr_name: cutout_mask - margin_radius_km: 11 - -edges: -# Encoder -- source_name: ${graph.data} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 12 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -# Processor -- source_name: ${graph.hidden} - target_name: ${graph.hidden} - edge_builders: - - _target_: anemoi.graphs.edges.MultiScaleEdges - x_hops: 1 - scale_resolutions: ${graph.nodes.hidden.node_builder.lam_resolution} - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} -# Decoder -- source_name: ${graph.hidden} - target_name: ${graph.data} - edge_builders: - - _target_: anemoi.graphs.edges.KNNEdges - num_nearest_neighbours: 3 - source_mask_attr_name: null - target_mask_attr_name: null - attributes: ${graph.attributes.edges} - -attributes: - nodes: - # Attributes for data nodes - cutout_mask: - _target_: anemoi.graphs.nodes.attributes.CutOutMask - boundary_mask: - _target_: anemoi.graphs.nodes.attributes.BooleanNot - masks: - _target_: anemoi.graphs.nodes.attributes.CutOutMask - area_weight: - _target_: anemoi.graphs.nodes.attributes.SphericalAreaWeights - norm: unit-max - fill_value: 0 - lam_area_weight: - _target_: anemoi.graphs.nodes.attributes.MaskedPlanarAreaWeights - mask_node_attr_name: cutout_mask - norm: unit-max - - edges: - edge_length: - _target_: anemoi.graphs.edges.attributes.EdgeLength - norm: unit-max - edge_dirs: - _target_: anemoi.graphs.edges.attributes.EdgeDirection - norm: unit-std - -post_processors: [] diff --git a/configs_old/configs/hardware/example.yaml b/configs_old/configs/hardware/example.yaml deleted file mode 100755 index 7792156184..0000000000 --- a/configs_old/configs/hardware/example.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -defaults: -- paths: example -- files: example - -# number of GPUs per node and number of nodes (for DDP) -accelerator: auto -num_gpus_per_node: 1 -num_nodes: 1 -num_gpus_per_model: 1 diff --git a/configs_old/configs/hardware/files/example.yaml b/configs_old/configs/hardware/files/example.yaml deleted file mode 100755 index 3c88140619..0000000000 --- a/configs_old/configs/hardware/files/example.yaml +++ /dev/null @@ -1,9 +0,0 @@ -dataset: ??? -graph: ??? -truncation: null -truncation_inv: null -checkpoint: - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} -warm_start: null diff --git a/configs_old/configs/hardware/files/jupiter.yaml b/configs_old/configs/hardware/files/jupiter.yaml deleted file mode 100755 index e01311a498..0000000000 --- a/configs_old/configs/hardware/files/jupiter.yaml +++ /dev/null @@ -1,11 +0,0 @@ -dataset: aifs-ea-an-oper-0001-mars-${data.resolution}-1979-2023-6h-v8.zarr -#dataset_land: aifs-ea-an-oper-0001-mars-${data.resolution}-1979-2024-6h-v1-land-reduced-snow.zarr -dataset_land: aifs-ea-an-oper-0001-mars-${data.resolution}-1979-2023-6h-v1-land.zarr -graph: null -truncation: null -truncation_inv: null -checkpoint: - every_n_epochs: anemoi-by_epoch-epoch_{epoch:03d}-step_{step:06d} - every_n_train_steps: anemoi-by_step-epoch_{epoch:03d}-step_{step:06d} - every_n_minutes: anemoi-by_time-epoch_{epoch:03d}-step_{step:06d} -warm_start: null diff --git a/configs_old/configs/hardware/paths/example.yaml b/configs_old/configs/hardware/paths/example.yaml deleted file mode 100755 index c3210e4194..0000000000 --- a/configs_old/configs/hardware/paths/example.yaml +++ /dev/null @@ -1,13 +0,0 @@ -data: ??? -output: ??? -truncation: null -logs: - base: ${hardware.paths.output}logs/ - wandb: ${hardware.paths.logs.base} - mlflow: ${hardware.paths.logs.base}mlflow/ - tensorboard: ${hardware.paths.logs.base}tensorboard/ -checkpoints: ${hardware.paths.output}checkpoint/ -plots: ${hardware.paths.output}plots/ -profiler: ${hardware.paths.output}profiler/ -graph: ${hardware.paths.output}graphs/ -warm_start: null diff --git a/configs_old/configs/hardware/paths/jupiter.yaml b/configs_old/configs/hardware/paths/jupiter.yaml deleted file mode 100755 index c8de678de3..0000000000 --- a/configs_old/configs/hardware/paths/jupiter.yaml +++ /dev/null @@ -1,13 +0,0 @@ -data: /e/data1/jureap-data/ecmwf/gkpdm/datasets/ -output: /e/scratch/gkpdm/clare1/ -truncation: null -logs: - base: ${hardware.paths.output}logs/ - wandb: ${hardware.paths.logs.base} - mlflow: ${hardware.paths.logs.base}mlflow/ - tensorboard: ${hardware.paths.logs.base}tensorboard/ -checkpoints: ${hardware.paths.output}checkpoint/ -plots: ${hardware.paths.output}plots/ -profiler: ${hardware.paths.output}profiler/ -graph: ${hardware.paths.output}graph/ -warm_start: null diff --git a/configs_old/configs/hardware/slurm.yaml b/configs_old/configs/hardware/slurm.yaml deleted file mode 100755 index 5d997ba4a3..0000000000 --- a/configs_old/configs/hardware/slurm.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -defaults: -- paths: jupiter -- files: jupiter - -# number of GPUs per node and number of nodes (for DDP) -accelerator: auto -num_gpus_per_node: ${oc.decode:${oc.env:SLURM_GPUS_PER_NODE}} -num_nodes: ${oc.decode:${oc.env:SLURM_NNODES}} -num_gpus_per_model: 1 diff --git a/configs_old/configs/hierarchical.yaml b/configs_old/configs/hierarchical.yaml deleted file mode 100755 index 8eb201dee7..0000000000 --- a/configs_old/configs/hierarchical.yaml +++ /dev/null @@ -1,28 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- datamodule: single -- diagnostics: evaluation -- hardware: example -- graph: hierarchical_3level -- model: graphtransformer -- training: default -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# hardware: -# num_gpus_per_node: 1 - -model: - keep_batch_sharded: False # not yet supported for Hierarchical - model: - _target_: anemoi.models.models.hierarchical.AnemoiModelEncProcDecHierarchical - enable_hierarchical_level_processing: True - level_process_num_layers: 2 - processor: - num_chunks: 2 diff --git a/configs_old/configs/interpolator.yaml b/configs_old/configs/interpolator.yaml deleted file mode 100755 index e4f9f2eb44..0000000000 --- a/configs_old/configs/interpolator.yaml +++ /dev/null @@ -1,40 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- datamodule: single -- diagnostics: evaluation -- hardware: example -- graph: multi_scale -- model: graphtransformer -- training: interpolator -- _self_ - -config_validation: True - -data: - frequency: 1h - resolution: o96 - - diagnostics: [] # Default behaviour is to interpolate between observed fields, not predict unseen fields - -#dataloader: - # model_run_info: #Add for non-analysis training - # start: 2020-02-05T12:00:00 - # length: 18 #in number of dates (* frequency for actual time) - -model: - model: - _target_: anemoi.models.models.interpolator.AnemoiModelEncProcDecInterpolator - latent_skip: False # True/False for skip connection on latent mesh - grid_skip: 0 # Which of the input indices to use as residual connection, null if none. - -training: - # Instead of inferred using multistep and timeincrement, specify time indices explicitly - explicit_times: - input: [0,6] - target: [1,2,3,4,5] - - target_forcing: #forcing parameters for the target time to include as input - data: #of which come from the dataset - - "insolation" - time_fraction: True diff --git a/configs_old/configs/jobscript_forecast.sh b/configs_old/configs/jobscript_forecast.sh deleted file mode 100755 index e87508830b..0000000000 --- a/configs_old/configs/jobscript_forecast.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=8 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=12:00:00 -#SBATCH -o %x-%j.out - -#source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -export PYTHONUNBUFFERED=1 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -srun anemoi-training train training.run_id=a044a3d47e8846e88040890a2cc26b4f training.scalers.general_variable.weights.cp=0.1 training.scalers.general_variable.weights.tp=1 training.load_weights_only=False training.transfer_learning=False diagnostics.log.mlflow.run_name="high cp tp 1" --config-name=fine_ensinterp_agg diff --git a/configs_old/configs/jobscript_forecast_2.sh b/configs_old/configs/jobscript_forecast_2.sh deleted file mode 100755 index a2c58b955c..0000000000 --- a/configs_old/configs/jobscript_forecast_2.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=8 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=12:00:00 -#SBATCH -o %x-%j.out - -#source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -export PYTHONUNBUFFERED=1 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -srun anemoi-training train training.run_id=9890414472674d5c84cc964bf2318c7d training.scalers.general_variable.weights.cp=0.025 training.scalers.general_variable.weights.tp=0.25 training.load_weights_only=False training.transfer_learning=False diagnostics.log.mlflow.run_name="high cp tp 0.25" --config-name=fine_ensinterp_agg diff --git a/configs_old/configs/jobscript_interp.sh b/configs_old/configs/jobscript_interp.sh deleted file mode 100755 index a92a7cad65..0000000000 --- a/configs_old/configs/jobscript_interp.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=8 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=12:00:00 -#SBATCH -o %x-%j.out - -#source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -export PYTHONUNBUFFERED=1 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -srun anemoi-training train training.run_id=437a0406460c4c0e8a9f13ccc963b6f4 training.aggregate_outputs=["mean","max","min","diff"] diagnostics.log.mlflow.run_name='graph 6 interp agg' --config-name=ensinterp_o96_nogap_tendency_back diff --git a/configs_old/configs/jobscript_interp_2.sh b/configs_old/configs/jobscript_interp_2.sh deleted file mode 100755 index e76eec0c7d..0000000000 --- a/configs_old/configs/jobscript_interp_2.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=8 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=12:00:00 -#SBATCH -o %x-%j.out - -#source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -export PYTHONUNBUFFERED=1 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -srun anemoi-training train training.run_id=95d57ac1a4be4bae8c67e3b1dfe33558 diagnostics.log.mlflow.run_name='graph 6 interp diff' --config-name=diff_interp_only diff --git a/configs_old/configs/jobscript_interp_3.sh b/configs_old/configs/jobscript_interp_3.sh deleted file mode 100755 index 576baee98a..0000000000 --- a/configs_old/configs/jobscript_interp_3.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=8 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=12:00:00 -#SBATCH -o %x-%j.out - -#source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -export PYTHONUNBUFFERED=1 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -srun anemoi-training train training.run_id=7a6270d63ab54b75a9660b009c6f32ad diagnostics.log.mlflow.run_name='graph 6 gap interp diff' --config-name=ens_interp_nogap diff --git a/configs_old/configs/jobscript_out.sh b/configs_old/configs/jobscript_out.sh deleted file mode 100755 index 54b243daeb..0000000000 --- a/configs_old/configs/jobscript_out.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=4 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=12:00:00 -#SBATCH -o %x-%j.out - -#source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -srun anemoi-training train training.run_id=5994b5275fc5458cb977bf99bcec6bae --config-name=single_11_new_rollout diff --git a/configs_old/configs/jobscript_wind.sh b/configs_old/configs/jobscript_wind.sh deleted file mode 100755 index cd6ec8eb52..0000000000 --- a/configs_old/configs/jobscript_wind.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=anemoi-jupiter-example -#SBATCH --nodes=4 -#SBATCH --ntasks-per-node=4 -#SBATCH --gpus-per-node=4 -#SBATCH --cpus-per-task=72 -#SBATCH --hint=nomultithread -#SBATCH --exclusive -#SBATCH --account=gkpdm -#SBATCH -p booster -#SBATCH --time=12:00:00 -#SBATCH -o %x-%j.out - -#source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -module load Stages/2025 GCCcore/.13.3.0 -module load Python/3.12.3 - -export PYTHONUNBUFFERED=1 - -source /e/data1/jureap-data/ecmwf/users/clare1/time_interpolator_env/bin/activate - -srun anemoi-training train dataloader=native_grid_nowind training.fork_run_id=f791b1b356e44c3cbf4e53e45ec086c2 diagnostics.log.mlflow.run_name='no_wind_rain' --config-name=single_11_new_rollout diff --git a/configs_old/configs/lam.yaml b/configs_old/configs/lam.yaml deleted file mode 100755 index 46c545c30f..0000000000 --- a/configs_old/configs/lam.yaml +++ /dev/null @@ -1,41 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- datamodule: single -- diagnostics: evaluation -- hardware: example -- graph: limited_area -- model: graphtransformer -- training: lam -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# hardware: -# num_gpus_per_node: 1 - -dataloader: - dataset: - cutout: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - thinning: ??? - - dataset: ${hardware.paths.data}/${hardware.files.forcing_dataset} - adjust: all - min_distance_km: 0 - grid_indices: - _target_: anemoi.training.data.grid_indices.MaskedGrid - nodes_name: data - node_attribute_name: indices_connected_nodes -model: - output_mask: - _target_: anemoi.training.utils.masks.Boolean1DMask - nodes_name: ${graph.data} - attribute_name: cutout_mask -hardware: - files: - dataset: ??? - forcing_dataset: ??? diff --git a/configs_old/configs/model/gnn.yaml b/configs_old/configs/model/gnn.yaml deleted file mode 100755 index 42c4351563..0000000000 --- a/configs_old/configs/model/gnn.yaml +++ /dev/null @@ -1,96 +0,0 @@ -num_channels: 512 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiModelEncProcDec - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - # The GNN requires the autocast layer norm, otherwise its memory usage is too high. - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - -processor: - _target_: anemoi.models.layers.processor.GNNProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 2 - mlp_extra_layers: 0 - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GNNForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 1 - mlp_extra_layers: 0 - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -decoder: - _target_: anemoi.models.layers.mapper.GNNBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 1 - mlp_extra_layers: 0 - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs_old/configs/model/graphtransformer.yaml b/configs_old/configs/model/graphtransformer.yaml deleted file mode 100755 index 9b2d84b301..0000000000 --- a/configs_old/configs/model/graphtransformer.yaml +++ /dev/null @@ -1,110 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiModelEncProcDec - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 # GNN and GraphTransformer Processor only - - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs_old/configs/model/graphtransformer_diffusion.yaml b/configs_old/configs/model/graphtransformer_diffusion.yaml deleted file mode 100755 index 632656d10d..0000000000 --- a/configs_old/configs/model/graphtransformer_diffusion.yaml +++ /dev/null @@ -1,107 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiDiffusionModelEncProcDec - # Diffusion parameters - diffusion: - sigma_data: 1.0 - noise_channels: 32 - noise_cond_dim: 16 - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - noise_embedder: - _target_: anemoi.models.layers.diffusion.SinusoidalEmbeddings - num_channels: ${model.model.diffusion.noise_channels} - max_period: 1000 - inference_defaults: - noise_scheduler: - schedule_type: "karras" - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - num_steps: 50 - diffusion_sampler: - sampler: "heun" - S_churn: 0.0 - S_min: 0.0 - S_max: .inf - S_noise: 1.0 - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: 16 - w_one_bias_zero_init: True - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: True - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 # GNN and GraphTransformer Processor only - - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: [] diff --git a/configs_old/configs/model/graphtransformer_diffusiontend.yaml b/configs_old/configs/model/graphtransformer_diffusiontend.yaml deleted file mode 100755 index a57bdb3a92..0000000000 --- a/configs_old/configs/model/graphtransformer_diffusiontend.yaml +++ /dev/null @@ -1,107 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiDiffusionTendModelEncProcDec - # Diffusion parameters - diffusion: - sigma_data: 1.0 - noise_channels: 32 - noise_cond_dim: 16 - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - noise_embedder: - _target_: anemoi.models.layers.diffusion.SinusoidalEmbeddings - num_channels: ${model.model.diffusion.noise_channels} - max_period: 1000 - inference_defaults: - noise_scheduler: - schedule_type: "karras" - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - num_steps: 50 - diffusion_sampler: - sampler: "heun" - S_churn: 0.0 - S_min: 0.0 - S_max: .inf - S_noise: 1.0 - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: 16 - w_one_bias_zero_init: True - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: True - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 # GNN and GraphTransformer Processor only - - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: [] diff --git a/configs_old/configs/model/graphtransformer_ens.yaml b/configs_old/configs/model/graphtransformer_ens.yaml deleted file mode 100755 index 0f444b30b3..0000000000 --- a/configs_old/configs/model/graphtransformer_ens.yaml +++ /dev/null @@ -1,134 +0,0 @@ -num_channels: 1024 -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - -noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - inject_noise: True - layer_kernels: - Activation: - _target_: torch.nn.GELU - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True # Transformer and GraphTransformer only - cpu_offload: ${model.cpu_offload} - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - w_one_bias_zero_init: True - autocast: false - #Any arguments to your chosen function go here - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 # GNN and GraphTransformer Processor only - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs_old/configs/model/graphtransformer_ens_new.yaml b/configs_old/configs/model/graphtransformer_ens_new.yaml deleted file mode 100755 index cc581c56e3..0000000000 --- a/configs_old/configs/model/graphtransformer_ens_new.yaml +++ /dev/null @@ -1,127 +0,0 @@ -num_channels: 1024 -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - -noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.GraphTransformerProcessor - trainable_size: ${model.trainable_parameters.hidden2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_layers: 16 - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True # Transformer and GraphTransformer only - cpu_offload: ${model.cpu_offload} - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - w_one_bias_zero_init: True - autocast: false - #Any arguments to your chosen function go here - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - hidden2hidden: 8 # GNN and GraphTransformer Processor only - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs_old/configs/model/transformer.yaml b/configs_old/configs/model/transformer.yaml deleted file mode 100755 index 6811501f1d..0000000000 --- a/configs_old/configs/model/transformer.yaml +++ /dev/null @@ -1,112 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiModelEncProcDec - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 512 - dropout_p: 0.0 # GraphTransformer - attention_implementation: flash_attention # Possible values: scaled_dot_product_attention, flash_attention - qk_norm: False # Transformer and GraphTransformer only - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs_old/configs/model/transformer_diffusion.yaml b/configs_old/configs/model/transformer_diffusion.yaml deleted file mode 100755 index 5d9368a635..0000000000 --- a/configs_old/configs/model/transformer_diffusion.yaml +++ /dev/null @@ -1,109 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiDiffusionModelEncProcDec - # Diffusion parameters - diffusion: - sigma_data: 1.0 - noise_channels: 32 - noise_cond_dim: 16 - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - noise_embedder: - _target_: anemoi.models.layers.diffusion.SinusoidalEmbeddings - num_channels: ${model.model.diffusion.noise_channels} - max_period: 1000 - inference_defaults: - noise_scheduler: - schedule_type: "karras" - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - num_steps: 50 - diffusion_sampler: - sampler: "heun" - S_churn: 0.0 - S_min: 0.0 - S_max: .inf - S_noise: 1.0 - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: 16 - w_one_bias_zero_init: True - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 512 - dropout_p: 0.0 # GraphTransformer - attention_implementation: flash_attention # flash_attention, scaled_dot_product_attention - qk_norm: True # Transformer and GraphTransformer only - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: True - qk_norm: True - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: [] diff --git a/configs_old/configs/model/transformer_diffusiontend.yaml b/configs_old/configs/model/transformer_diffusiontend.yaml deleted file mode 100755 index 23afda334d..0000000000 --- a/configs_old/configs/model/transformer_diffusiontend.yaml +++ /dev/null @@ -1,109 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiDiffusionTendModelEncProcDec - # Diffusion parameters - diffusion: - sigma_data: 1.0 - noise_channels: 32 - noise_cond_dim: 16 - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - noise_embedder: - _target_: anemoi.models.layers.diffusion.SinusoidalEmbeddings - num_channels: ${model.model.diffusion.noise_channels} - max_period: 1000 - inference_defaults: - noise_scheduler: - schedule_type: "karras" - sigma_max: 100.0 - sigma_min: 0.02 - rho: 7.0 - num_steps: 50 - diffusion_sampler: - sampler: "heun" - S_churn: 0.0 - S_min: 0.0 - S_max: .inf - S_noise: 1.0 - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: 16 - w_one_bias_zero_init: True - autocast: false - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - num_layers: 16 - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 512 - dropout_p: 0.0 # GraphTransformer - attention_implementation: flash_attention # flash_attention, scaled_dot_product_attention - qk_norm: True # Transformer and GraphTransformer only - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: True - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: True - qk_norm: True - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: [] diff --git a/configs_old/configs/model/transformer_ens.yaml b/configs_old/configs/model/transformer_ens.yaml deleted file mode 100755 index 9ab1767022..0000000000 --- a/configs_old/configs/model/transformer_ens.yaml +++ /dev/null @@ -1,137 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiEnsModelEncProcDec - -noise_injector: - _target_: anemoi.models.layers.ensemble.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - inject_noise: True - layer_kernels: - Activation: - _target_: torch.nn.GELU - - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - num_layers: 16 - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 512 - dropout_p: 0.0 - attention_implementation: flash_attention # Possible values: scaled_dot_product_attention, flash_attention - qk_norm: True # Transformer and GraphTransformer only - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - layer_kernels: - LayerNorm: - _target_: anemoi.models.layers.normalization.ConditionalLayerNorm - normalized_shape: ${model.num_channels} - condition_shape: ${model.noise_injector.noise_channels_dim} - w_one_bias_zero_init: True - autocast: false - #Any arguments to your chosen function go here - Linear: - _target_: torch.nn.Linear # These reflect the defaults, but are shown here for clarity - Activation: - _target_: torch.nn.GELU - - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - - - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp - - # [OPTIONAL] NormalizedReluBounding - # This is an extension of the Relu bounding in case the thrshold to be used - # is not 0. For example, in case of the sea surface temperature we don't use - # [0, infinity), buth rather [-2C, infinity). We do not want the water - # temperature to be below the freezing temperature. - - # - _target_: anemoi.models.layers.bounding.NormalizedReluBounding - # variables: [sst] - # min_val: [-2] - # normalizer: ['mean-std'] diff --git a/configs_old/configs/model/transformer_single_1.1.yaml b/configs_old/configs/model/transformer_single_1.1.yaml deleted file mode 100755 index 836a1e78a9..0000000000 --- a/configs_old/configs/model/transformer_single_1.1.yaml +++ /dev/null @@ -1,125 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiModelEncProcDec - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - num_layers: 16 - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 1120 - dropout_p: 0.0 # GraphTransformer - attention_implementation: flash_attention # flash_attention, scaled_dot_product_attention - qk_norm: False # Transformer and GraphTransformer only - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - ro - - tcw - - ssrd - - ro - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[0, 1) - variables: - - tcc - - swvl1 - - swvl2 - min_val: 0 - max_val: 1 - - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - variables: - - cp - - sf - min_val: 0 - max_val: 1 - total_var: tp - - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - variables: - - lcc - - mcc - - hcc - min_val: 0 - max_val: 1 - total_var: tcc diff --git a/configs_old/configs/model/transformer_single_new.yaml b/configs_old/configs/model/transformer_single_new.yaml deleted file mode 100755 index 2fe9c0a918..0000000000 --- a/configs_old/configs/model/transformer_single_new.yaml +++ /dev/null @@ -1,117 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.AnemoiModelEncProcDec - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - num_layers: 16 - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 1120 - dropout_p: 0.0 # GraphTransformer - attention_implementation: flash_attention # flash_attention, scaled_dot_product_attention - qk_norm: False # Transformer and GraphTransformer only - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.GraphTransformerForwardMapper - trainable_size: ${model.trainable_parameters.data2hidden} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -decoder: - _target_: anemoi.models.layers.mapper.GraphTransformerBackwardMapper - trainable_size: ${model.trainable_parameters.hidden2data} - sub_graph_edge_attributes: ${model.attributes.edges} - num_chunks: 4 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - initialise_data_extractor_zero: False - qk_norm: False - cpu_offload: ${model.cpu_offload} - layer_kernels: ${model.layer_kernels} - shard_strategy: "edges" - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -# Bounding configuration -bounding: #These are applied in order - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - ro - - tcw - - ssrd - - ro - - q_50 - - q_100 - - q_150 - - q_200 - - q_250 - - q_300 - - q_400 - - q_500 - - q_600 - - q_700 - - q_850 - - q_925 - - q_1000 - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[0, 1) - variables: - - tcc - - swvl1 - - swvl2 - min_val: 0 - max_val: 1 - - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - variables: - - lcc - - mcc - - hcc - min_val: 0 - max_val: 1 - total_var: tcc diff --git a/configs_old/configs/model/transformer_transformermapper.yaml b/configs_old/configs/model/transformer_transformermapper.yaml deleted file mode 100755 index d939c60e8a..0000000000 --- a/configs_old/configs/model/transformer_transformermapper.yaml +++ /dev/null @@ -1,112 +0,0 @@ -num_channels: 1024 -cpu_offload: False - -keep_batch_sharded: True - -model: - _target_: anemoi.models.models.encoder_processor_decoder.AnemoiModelEncProcDec - -layer_kernels: - # The layer_kernels can be adjusted per model component, but are defined here for convenience. - LayerNorm: - _target_: torch.nn.LayerNorm - Linear: - _target_: torch.nn.Linear - Activation: - _target_: torch.nn.GELU - QueryNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - KeyNorm: - _target_: anemoi.models.layers.normalization.AutocastLayerNorm - bias: False - -processor: - _target_: anemoi.models.layers.processor.TransformerProcessor - _convert_: all - num_layers: 16 - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: 512 - dropout_p: 0.0 # GraphTransformer - attention_implementation: flash_attention # flash_attention, scaled_dot_product_attention - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - cpu_offload: ${model.cpu_offload} - qk_norm: False - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -encoder: - _target_: anemoi.models.layers.mapper.TransformerForwardMapper - _convert_: all - cpu_offload: ${model.cpu_offload} - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: -1 - dropout_p: 0.0 - attention_implementation: flash_attention # Possible values: scaled_dot_product_attention, flash_attention - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - qk_norm: False - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - - -decoder: - _target_: anemoi.models.layers.mapper.TransformerBackwardMapper - _convert_: all - cpu_offload: ${model.cpu_offload} - num_chunks: 2 - mlp_hidden_ratio: 4 # GraphTransformer or Transformer only - num_heads: 16 # GraphTransformer or Transformer only - window_size: -1 - dropout_p: 0.0 - attention_implementation: flash_attention # Possible values: scaled_dot_product_attention, flash_attention - softcap: 0.0 # Transformer only - use_alibi_slopes: False # Transformer only - qk_norm: False - use_rotary_embeddings: False - layer_kernels: ${model.layer_kernels} - -output_mask: - _target_: anemoi.training.utils.masks.NoOutputMask - -trainable_parameters: - data: 8 - hidden: 8 - data2hidden: 8 - hidden2data: 8 - -attributes: - edges: - - edge_length - - edge_dirs - nodes: [] - -node_loss_weight: area_weight - -# Bounding configuration -bounding: #These are applied in order - - # Bound tp (total precipitation) with a Relu bounding layer - # ensuring a range of [0, infinity) to avoid negative precipitation values. - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - # [OPTIONAL] Bound cp (convective precipitation) as a fraction of tp. - # This guarantees that cp is physically consistent with tp by restricting cp - # to a fraction of tp [0 to 1]. Uncomment the lines below to apply. - # NOTE: If this bounding strategy is used, the normalization of cp must be - # changed to "std" normalization, and the "cp" statistics should be remapped - # to those of tp to ensure consistency. - - # - _target_: anemoi.models.layers.bounding.FractionBounding # fraction of tp - # variables: - # - cp - # min_val: 0 - # max_val: 1 - # total_var: tp diff --git a/configs_old/configs/ms_fine_ensinterp_agg.yaml b/configs_old/configs/ms_fine_ensinterp_agg.yaml deleted file mode 100755 index d5ad9deb4b..0000000000 --- a/configs_old/configs/ms_fine_ensinterp_agg.yaml +++ /dev/null @@ -1,179 +0,0 @@ -defaults: -- data: zarr_interp -- dataloader: native_grid_forecaster -- diagnostics: evaluation -- datamodule: ens -- hardware: slurm -- graph: n320 -- model: graphtransformer_ens_new -- training: ensemble_new -- override hydra/hydra_logging: disabled -- override hydra/job_logging: disabled -- _self_ - -config_validation: False - -hydra: - output_subdir: null - run: - dir: . - -data: - frequency: 1h - timestep: 1h - -dataloader: - limit_batches: - training: 2000 #5000 #null - validation: 100 #10 #0 #null - -diagnostics: - log: - interval: 100 - wandb: - entity: null - mlflow: - enabled: True #True #True - offline: True #True - authentication: True - experiment_name: metno - tracking_uri: https://mlflow.ecmwf.int - run_name: interpolator - system: True - -hardware: - loss_matrices_path: /e/home/jusers/clare1/jupiter/ - files: - dataset: aifs-od-fc-oper-0001-mars-n320-2016-2024-1h-v1.zarr - graph: graph_interp_n320.pt - num_gpus_per_ensemble: 2 #4 - num_gpus_per_model: 1 #4 - -model: - noise_injector: - _target_: anemoi.models.layers.ensemble_new.NoiseConditioning - noise_std: 1 - noise_channels_dim: 4 - noise_mlp_hidden_dim: 32 - noise_matrix: /e/home/jusers/clare1/jupiter/gaussian_filter_noise_o32_o96_cutoff.npz - row_normalize_noise_matrix: false - autocast: false - layer_kernels: - Activation: - _target_: torch.nn.GELU - model_run_info: #Add for non-analysis training - start: 2016-01-01T00:00:00 - length: 18 #in number of dates (* frequency for actual time) - num_channels: 1024 - keep_batch_sharded: False - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val] - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - processor: - num_chunks: 8 - encoder: - num_chunks: 8 - decoder: - num_chunks: 8 - - model: - _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti - latent_skip: False - grid_skip: 1 # Which of the input indices to use as residual connection, null if none. - -training: - load_weights_only: True - transfer_learning: True - scalers: - general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 1 - t: 1 #1 - u: 1 #0.5 - v: 1 #0.33 - w: 0.1 - z: 1 #1 - sp: 1 - msl: 1 - 10u: 1 - 10v: 1 - 2d: 1 - tp: 0.025 - cp: 0.0025 - multistep_input: 1 - model_task: anemoi.training.train.tasks.GraphEnsInterpMulti - explicit_times: - input: [0,6] - target: [1,2,3,4,5,6] - aggregate_outputs: #calculate loss on time-aggregated outputs - - mean - - max - - min - - diff - use_all_targets: False #whether to use all interp targets or pick a random one. - #Used with 30 data parallel and 2 ens members. Per target effective batch size of only 6, but 30 with all targets. - run_id: null - ensemble_size_per_device: 1 - max_epochs: null - max_steps: 200000 - #load_weights_only: True - #transfer_learning: True - lr: - rate: 5.0e-5 - min: 3e-7 - warmup: 1000 - iterations: 200000 - training_loss: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${hardware.loss_matrices_path} - loss_matrices: - - filter_n320_w=gaussian_d=8.0x.npz - - filter_n320_w=gaussian_d=2.0x.npz - - null - weights: - - 1.0 - - 2.0 - - 4.0 - keep_batch_sharded: ${model.keep_batch_sharded} - per_scale_loss: - _target_: anemoi.training.losses.kcrps_new.AlmostFairKernelCRPS - scalers: - - pressure_level - - general_variable - - nan_mask_weights - - node_weights - - stdev_tendency - no_autocast: true - ignore_nans: false - alpha: 0.95 - validation_metrics: - afkcrps: - _target_: anemoi.training.losses.kcrps_new.AlmostFairKernelCRPS - scalers: - - node_weights - ignore_nans: false - alpha: 1.0 - rollout: - start: 1 - epoch_increment: 0 - max: 1 - -graph: - overwrite: False diff --git a/configs_old/configs/newscaling_ensinterp_agg.yaml b/configs_old/configs/newscaling_ensinterp_agg.yaml deleted file mode 100755 index ffefcacff1..0000000000 --- a/configs_old/configs/newscaling_ensinterp_agg.yaml +++ /dev/null @@ -1,124 +0,0 @@ -defaults: -- data: zarr_interp -- dataloader: native_grid_forecaster -- diagnostics: evaluation -- datamodule: ens -- hardware: slurm -- graph: n320 -- model: graphtransformer_ens -- training: ensemble -- override hydra/hydra_logging: disabled -- override hydra/job_logging: disabled -- _self_ - -config_validation: False - -hydra: - output_subdir: null - run: - dir: . - -data: - frequency: 1h - timestep: 1h - -dataloader: - limit_batches: - training: 2000 #5000 #null - validation: 100 #10 #0 #null - -diagnostics: - log: - interval: 100 - wandb: - entity: null - mlflow: - enabled: True #True #True - offline: True #True - authentication: True - experiment_name: metno - tracking_uri: https://mlflow.ecmwf.int - run_name: interpolator - system: True - -hardware: - files: - dataset: aifs-od-fc-oper-0001-mars-n320-2016-2024-1h-v1.zarr - graph: graph_interp_n320.pt - num_gpus_per_ensemble: 2 #4 - num_gpus_per_model: 1 #4 - -model: - model_run_info: #Add for non-analysis training - start: 2016-01-01T00:00:00 - length: 18 #in number of dates (* frequency for actual time) - num_channels: 1024 - keep_batch_sharded: False - bounding: - - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity) - variables: - - tp - - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val] - variables: - - tcc - - hcc - - mcc - - lcc - min_val: 0 - max_val: 1 - trainable_parameters: - data: 0 - hidden: 0 - data2hidden: 0 - hidden2data: 0 - hidden2hidden: 0 - processor: - num_chunks: 8 - encoder: - num_chunks: 8 - decoder: - num_chunks: 8 - - model: - _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti - latent_skip: False - grid_skip: 1 # Which of the input indices to use as residual connection, null if none. - -training: - load_weights_only: True - transfer_learning: True - multistep_input: 1 - model_task: anemoi.training.train.tasks.GraphEnsInterpMulti - explicit_times: - input: [0,6] - target: [1,2,3,4,5,6] - aggregate_outputs: #calculate loss on time-aggregated outputs - - mean - - max - - min - - diff - use_all_targets: False #whether to use all interp targets or pick a random one. - #Used with 30 data parallel and 2 ens members. Per target effective batch size of only 6, but 30 with all targets. - run_id: null - ensemble_size_per_device: 1 - max_epochs: null - max_steps: 200000 - #load_weights_only: True - #transfer_learning: True - lr: - rate: 5.0e-5 - min: 3e-7 - warmup: 1000 - iterations: 200000 - training_loss: - _target_: anemoi.training.losses.AlmostFairKernelCRPS #non-combined loss - alpha: 0.95 - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - rollout: - start: 1 - epoch_increment: 0 - max: 1 - -graph: - overwrite: False diff --git a/configs_old/configs/single_11.yaml b/configs_old/configs/single_11.yaml deleted file mode 100755 index eb3e33a180..0000000000 --- a/configs_old/configs/single_11.yaml +++ /dev/null @@ -1,58 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid_1.1 -- datamodule: single -- diagnostics: evaluation -- hardware: slurm -- graph: encoder_decoder_only -- model: transformer_single_1.1 -- training: default -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# hardware: -# num_gpus_per_node: 1 - -hardware: - accelerator: auto - num_gpus_per_model: 1 - files: - graph: graph_n320.pt - -graph: - overwrite: False - -diagnostics: - plot: - callbacks: [] - log: - mlflow: - enabled: True - offline: True - experiment_name: 'aifs-single-v2' - run_name: "AIFS 1.1 baseline" - terminal: True - -model: - num_channels: 1024 - -dataloader: - batch_size: - training: 1 - validation: 1 - limit_batches: - training: null - validation: 100 - -training: - # max_epochs: 67 - max_steps: 260000 - lr: - rate: 3.125e-5 # effective batchsize is 16 - iterations: 260000 - min: 3e-7 # Not scaled by GPU diff --git a/configs_old/configs/single_11_new.yaml b/configs_old/configs/single_11_new.yaml deleted file mode 100755 index b71750cb57..0000000000 --- a/configs_old/configs/single_11_new.yaml +++ /dev/null @@ -1,58 +0,0 @@ -defaults: -- data: zarr_new -- dataloader: native_grid_new -- datamodule: single -- diagnostics: evaluation -- hardware: slurm -- graph: encoder_decoder_only -- model: transformer_single_new -- training: default -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# hardware: -# num_gpus_per_node: 1 - -hardware: - accelerator: auto - num_gpus_per_model: 1 - files: - graph: graph_n320.pt - -graph: - overwrite: False - -diagnostics: - plot: - callbacks: [] - log: - mlflow: - enabled: True - offline: True - experiment_name: 'aifs-single-v2' - run_name: "AIFS 1.1 baseline" - terminal: True - -model: - num_channels: 1024 - -dataloader: - batch_size: - training: 1 - validation: 1 - limit_batches: - training: null - validation: 100 - -training: - # max_epochs: 67 - max_steps: 260000 - lr: - rate: 3.125e-5 # effective batchsize is 16 - iterations: 260000 - min: 3e-7 # Not scaled by GPU diff --git a/configs_old/configs/single_11_new_rollout.yaml b/configs_old/configs/single_11_new_rollout.yaml deleted file mode 100755 index bda946c6c5..0000000000 --- a/configs_old/configs/single_11_new_rollout.yaml +++ /dev/null @@ -1,70 +0,0 @@ -defaults: -- data: zarr_new -- dataloader: native_grid_new -- datamodule: single -- diagnostics: evaluation -- hardware: slurm -- graph: encoder_decoder_only -- model: transformer_single_new -- training: default -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# hardware: -# num_gpus_per_node: 1 - -hardware: - files: - dataset: aifs-od-an-oper-0001-mars-n320-2016-2023-6h-v8.zarr - dataset_land: aifs-od-an-oper-0001-mars-n320-2016-2023-6h-v1-land.zarr - graph: graph_n320.pt - accelerator: auto - num_gpus_per_model: 1 - -graph: - overwrite: False - -diagnostics: - plot: - callbacks: [] - log: - mlflow: - enabled: True - offline: True - experiment_name: 'aifs-single-v2' - run_name: "AIFS 1.1 baseline" - terminal: True - -model: - num_channels: 1024 - -dataloader: - num_workers: - training: 1 - validation: 1 - test: 1 - batch_size: - training: 1 - validation: 1 - limit_batches: - training: null - validation: 100 - -training: - load_weights_only: False - max_epochs: 13 - max_steps: 12000 - lr: - rate: 8e-7 # effective batchsize is 16 - iterations: 7900 - min: 3e-7 # Not scaled by GPU - warmup: 100 - rollout: - start: 10 - epoch_increment: 1 - max: 12 diff --git a/configs_old/configs/stretched.yaml b/configs_old/configs/stretched.yaml deleted file mode 100755 index 5539cb8801..0000000000 --- a/configs_old/configs/stretched.yaml +++ /dev/null @@ -1,36 +0,0 @@ -defaults: -- data: zarr -- dataloader: native_grid -- datamodule: single -- diagnostics: evaluation -- hardware: example -- graph: stretched_grid -- model: graphtransformer -- training: stretched -- _self_ - -config_validation: True - -### This file is for local experimentation. -## When you commit your changes, assign the new features and keywords -## to the correct defaults. -# For example to change from default GPU count: -# hardware: -# num_gpus_per_node: 1 - -dataloader: - dataset: - cutout: - - dataset: ${hardware.paths.data}/${hardware.files.dataset} - thinning: ??? - - dataset: ${hardware.paths.data}/${hardware.files.forcing_dataset} - adjust: all - min_distance_km: 0 -training: - scalers: - node_weights: - weight_frac_of_total: ??? -hardware: - files: - dataset: ??? - forcing_dataset: ??? diff --git a/configs_old/configs/training/default.yaml b/configs_old/configs/training/default.yaml deleted file mode 100755 index b433303c00..0000000000 --- a/configs_old/configs/training/default.yaml +++ /dev/null @@ -1,147 +0,0 @@ ---- -defaults: - - scalers: global - -# resume or fork a training from a checkpoint last.ckpt or specified in hardware.files.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# multistep input -# 1 = single step scheme, X(t-1) used to predict X(t) -# k > 1: multistep scheme, uses [X(t-k), X(t-k+1), ... X(t-1)] to predict X(t) -# Deepmind use k = 2 in their model -multistep_input: 2 - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# stochastic weight averaging -# https://pytorch.org/blog/stochastic-weight-averaging-in-pytorch/ -swa: - enabled: False - lr: 1.e-4 - -# Optimizer settings -optimizer: - zero: False # use ZeroRedundancyOptimizer ; saves memory for larger models - kwargs: - betas: [0.9, 0.95] - -# select model -model_task: anemoi.training.train.tasks.GraphForecaster - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPGroupStrategy - num_gpus_per_model: ${hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# loss function for the model -training_loss: - # loss class to initialise - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - # loss class to initialise - mse: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # Cannot scale over the variable dimension due to possible remappings. - # Available scalers include: - # - 'loss_weights_mask': Giving imputed NaNs a zero weight in the loss function - # Use the `scale_validation_metrics` section to variable scale. - scalers: ['node_weights'] - # other kwargs - ignore_nans: True - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works -# param is an alias for the variable name in the case of no metadata. - -variable_groups: - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: -- z_500 -- t_850 -- u_850 -- v_850 - -# length of the "rollout" window (see Keisler's paper) -rollout: - start: 1 - # increase rollout every n epochs - epoch_increment: 0 - # maximum rollout to use - max: 1 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - -lr: - warmup: 1000 # number of warmup iterations - rate: 0.625e-4 #local_lr - iterations: ${training.max_steps} # NOTE: When max_epochs < max_steps, scheduler will run for max_steps - min: 3e-7 #Not scaled by #GPU - -# Changes in per-gpu batch_size should come with a rescaling of the local_lr -# in order to keep a constant global_lr -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model - -submodules_to_freeze: [] diff --git a/configs_old/configs/training/diffusion.yaml b/configs_old/configs/training/diffusion.yaml deleted file mode 100755 index 8d3dd436b2..0000000000 --- a/configs_old/configs/training/diffusion.yaml +++ /dev/null @@ -1,147 +0,0 @@ ---- -defaults: - - scalers: global - -# resume or fork a training from a checkpoint last.ckpt or specified in hardware.files.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: bf16-mixed - -# multistep input -# 1 = single step scheme, X(t-1) used to predict X(t) -# k > 1: multistep scheme, uses [X(t-k), X(t-k+1), ... X(t-1)] to predict X(t) -# Deepmind use k = 2 in their model -multistep_input: 2 - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 1. - algorithm: norm - -# stochastic weight averaging -# https://pytorch.org/blog/stochastic-weight-averaging-in-pytorch/ -swa: - enabled: False - lr: 1.e-4 - -# Optimizer settings -optimizer: - zero: False - kwargs: - weight_decay: 0.1 - betas: [0.9, 0.95] - eps: 1e-7 - -# select model -model_task: anemoi.training.train.tasks.GraphDiffusionForecaster - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPGroupStrategy - num_gpus_per_model: ${hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# loss function for the model -training_loss: - # loss class to initialise - _target_: anemoi.training.losses.WeightedMSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - # loss class to initialise - mse: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # Cannot scale over the variable dimension due to possible remappings. - # Available scalers include: - # - 'loss_weights_mask': Giving imputed NaNs a zero weight in the loss function - # Use the `scale_validation_metrics` section to variable scale. - scalers: ['node_weights'] - # other kwargs - ignore_nans: True - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g.: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - -variable_groups: - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: -- z_500 -- t_850 -- u_850 -- v_850 - -# length of the "rollout" window (see Keisler's paper) -rollout: - start: 1 - # increase rollout every n epochs - epoch_increment: 0 - # maximum rollout to use - max: 1 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 1000000 - -lr: - warmup: 1000 # number of warmup iterations - rate: 0.625e-4 #local_lr - iterations: ${training.max_steps} # NOTE: When max_epochs < max_steps, scheduler will run for max_steps - min: 3e-7 #Not scaled by #GPU - -# Changes in per-gpu batch_size should come with a rescaling of the local_lr -# in order to keep a constant global_lr -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model - -submodules_to_freeze: [] diff --git a/configs_old/configs/training/ensemble.yaml b/configs_old/configs/training/ensemble.yaml deleted file mode 100755 index 8eeb55d324..0000000000 --- a/configs_old/configs/training/ensemble.yaml +++ /dev/null @@ -1,148 +0,0 @@ ---- -defaults: - - scalers: global - -# resume or fork a training from a checkpoint last.ckpt or specified in hardware.files.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# multistep input -# 1 = single step scheme, X(t-1) used to predict X(t) -# k > 1: multistep scheme, uses [X(t-k), X(t-k+1), ... X(t-1)] to predict X(t) -# Deepmind use k = 2 in their model -multistep_input: 2 - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# stochastic weight averaging -# https://pytorch.org/blog/stochastic-weight-averaging-in-pytorch/ -swa: - enabled: False - lr: 1.e-4 - -# Optimizer settings -optimizer: - zero: False # use ZeroRedundancyOptimizer ; saves memory for larger models - kwargs: - betas: [0.9, 0.95] - -# select model -model_task: anemoi.training.train.tasks.GraphEnsForecaster - -# number of ensemble members per device -ensemble_size_per_device: 4 - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# loss function for the model -training_loss: - # loss class to initialise, can be anything subclassing torch.nn.Module - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - # other kwargs - ignore_nans: False - alpha: 1.0 - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - # loss class to initialise, can be anything subclassing torch.nn.Module - fkcrps: - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - scalers: ['node_weights'] - ignore_nans: False - alpha: 1.0 - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - -variable_groups: - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: -- z_500 -- t_850 -- u_850 -- v_850 - -# length of the "rollout" window (see Keisler's paper) -rollout: - start: 1 - # increase rollout every n epochs - epoch_increment: 0 - # maximum rollout to use - max: 1 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - -lr: - warmup: 1000 # number of warmup iterations - rate: 0.625e-4 #local_lr - iterations: ${training.max_steps} # NOTE: When max_epochs < max_steps, scheduler will run for max_steps - min: 3e-7 #Not scaled by #GPU - -# Changes in per-gpu batch_size should come with a rescaling of the local_lr -# in order to keep a constant global_lr -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model - -submodules_to_freeze: [] diff --git a/configs_old/configs/training/ensemble_new.yaml b/configs_old/configs/training/ensemble_new.yaml deleted file mode 100755 index 564e98313f..0000000000 --- a/configs_old/configs/training/ensemble_new.yaml +++ /dev/null @@ -1,135 +0,0 @@ ---- -defaults: - - scalers: global - -# resume or fork a training from a checkpoint last.ckpt or specified in hardware.files.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# multistep input -# 1 = single step scheme, X(t-1) used to predict X(t) -# k > 1: multistep scheme, uses [X(t-k), X(t-k+1), ... X(t-1)] to predict X(t) -# Deepmind use k = 2 in their model -multistep_input: 2 - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# stochastic weight averaging -# https://pytorch.org/blog/stochastic-weight-averaging-in-pytorch/ -swa: - enabled: False - lr: 1.e-4 - -# Optimizer settings -optimizer: - zero: False # use ZeroRedundancyOptimizer ; saves memory for larger models - kwargs: - betas: [0.9, 0.95] - -# select model -model_task: anemoi.training.train.tasks.GraphEnsForecaster - -# number of ensemble members per device -ensemble_size_per_device: 4 - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPEnsGroupStrategy - num_gpus_per_ensemble: ${hardware.num_gpus_per_ensemble} - num_gpus_per_model: ${hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# loss function for the model -training_loss: - # loss class to initialise, can be anything subclassing torch.nn.Module - _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: null - # loss class to initialise, can be anything subclassing torch.nn.Module - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - -variable_groups: - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: -- z_500 -- t_850 -- u_850 -- v_850 - -# length of the "rollout" window (see Keisler's paper) -rollout: - start: 1 - # increase rollout every n epochs - epoch_increment: 0 - # maximum rollout to use - max: 1 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - -lr: - warmup: 1000 # number of warmup iterations - rate: 0.625e-4 #local_lr - iterations: ${training.max_steps} # NOTE: When max_epochs < max_steps, scheduler will run for max_steps - min: 3e-7 #Not scaled by #GPU - -# Changes in per-gpu batch_size should come with a rescaling of the local_lr -# in order to keep a constant global_lr -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model - -submodules_to_freeze: [] diff --git a/configs_old/configs/training/interpolator.yaml b/configs_old/configs/training/interpolator.yaml deleted file mode 100755 index 816c3e7e2b..0000000000 --- a/configs_old/configs/training/interpolator.yaml +++ /dev/null @@ -1,148 +0,0 @@ ---- -defaults: - - scalers: global - -# resume or fork a training from a checkpoint last.ckpt or specified in hardware.files.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# multistep input -# 1 = single step scheme, X(t-1) used to predict X(t) -# k > 1: multistep scheme, uses [X(t-k), X(t-k+1), ... X(t-1)] to predict X(t) -# Deepmind use k = 2 in their model -multistep_input: 2 - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# stochastic weight averaging -# https://pytorch.org/blog/stochastic-weight-averaging-in-pytorch/ -swa: - enabled: False - lr: 1.e-4 - -# Optimizer settings -optimizer: - zero: False # use ZeroRedundancyOptimizer ; saves memory for larger models - kwargs: - betas: [0.9, 0.95] - -# select model -model_task: anemoi.training.train.tasks.GraphInterpolator - -# Instead of inferred using multistep and timeincrement, specify time indices explicitly -explicit_times: - input: [0,6] - target: [1,2,3,4,5] - -target_forcing: #forcing parameters for the target time to include as input - data: #of which come from the dataset - - "insolation" - time_fraction: True - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPGroupStrategy - num_gpus_per_model: ${hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# loss function for the model -training_loss: - # loss class to initialise - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers. - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - # loss class to initialise - mse: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # Cannot scale over the variable dimension due to possible remappings. - # Available scalers include: - # - 'loss_weights_mask': Giving imputed NaNs a zero weight in the loss function - # Use the `scale_validation_metrics` section to variable scale. - scalers: [] - # other kwargs - ignore_nans: True - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - -variable_groups: - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: -- z_500 -- t_850 -- u_850 -- v_850 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - -lr: - warmup: 1000 # number of warmup iterations - rate: 0.625e-4 #local_lr - iterations: ${training.max_steps} # NOTE: When max_epochs < max_steps, scheduler will run for max_steps - min: 3e-7 #Not scaled by #GPU - -# Changes in per-gpu batch_size should come with a rescaling of the local_lr -# in order to keep a constant global_lr -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model - -submodules_to_freeze: [] diff --git a/configs_old/configs/training/lam.yaml b/configs_old/configs/training/lam.yaml deleted file mode 100755 index 0475e7f373..0000000000 --- a/configs_old/configs/training/lam.yaml +++ /dev/null @@ -1,146 +0,0 @@ ---- -defaults: - - scalers: lam - -# resume or fork a training from a checkpoint last.ckpt or specified in hardware.files.warm_start -run_id: null -fork_run_id: null -transfer_learning: False # activate to perform transfer learning -load_weights_only: False # only load model weights, do not restore optimiser states etc. - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# multistep input -# 1 = single step scheme, X(t-1) used to predict X(t) -# k > 1: multistep scheme, uses [X(t-k), X(t-k+1), ... X(t-1)] to predict X(t) -# Deepmind use k = 2 in their model -multistep_input: 2 - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# stochastic weight averaging -# https://pytorch.org/blog/stochastic-weight-averaging-in-pytorch/ -swa: - enabled: False - lr: 1.e-4 - -# Optimizer settings -optimizer: - zero: False # use ZeroRedundancyOptimizer ; saves memory for larger models - kwargs: - betas: [0.9, 0.95] - -# select model -model_task: anemoi.training.train.tasks.GraphForecaster - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPGroupStrategy - num_gpus_per_model: ${hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# loss function for the model -training_loss: - # loss class to initialise - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers/scalers.yaml - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - # loss class to initialise - mse_inside_lam: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # Cannot scale over the variable dimension due to possible remappings. - # Available scalers include: - # - 'loss_weights_mask': Giving imputed NaNs a zero weight in the loss function - # Use the `scale_validation_metrics` section to variable scale. - scalers: ["node_weights"] - # other kwargs - ignore_nans: True - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - -variable_groups: - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: -- z_500 -- t_850 -- u_850 -- v_850 - -# length of the "rollout" window (see Keisler's paper) -rollout: - start: 1 - # increase rollout every n epochs - epoch_increment: 0 - # maximum rollout to use - max: 1 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - -lr: - warmup: 1000 # number of warmup iterations - rate: 0.625e-4 #local_lr - iterations: ${training.max_steps} # NOTE: When max_epochs < max_steps, scheduler will run for max_steps - min: 3e-7 #Not scaled by #GPU - -# Changes in per-gpu batch_size should come with a rescaling of the local_lr -# in order to keep a constant global_lr -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model - -submodules_to_freeze: [] diff --git a/configs_old/configs/training/scalers/global.yaml b/configs_old/configs/training/scalers/global.yaml deleted file mode 100755 index bb86547431..0000000000 --- a/configs_old/configs/training/scalers/global.yaml +++ /dev/null @@ -1,59 +0,0 @@ -# Several scalers can be added here. In order to be applied their names must be included in the loss. -# scaler name must be included in `scalers` in the losses for this to be applied. -general_variable: - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 0.6 #1 - t: 6 #1 - u: 0.8 #0.5 - v: 0.5 #0.33 - w: 0.001 - z: 12 #1 - sp: 10 - 10u: 0.5 - 10v: 0.5 - 100u: 0.1 - 100v: 0.1 - 2d: 0.5 - tp: 0.025 - cp: 0.0025 - ro: 0.005 - sf: 0.025 - tcc: 0.1 - mcc: 0.1 - lcc: 0.1 - hcc: 0.1 - swvl2: 2 # 200 - swvl1: 1 # 100 - stl2: 10 - stl1: 1 - ssrd: 0.05 - strd: 0.1 - -pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - -# mask NaNs with zeros in the loss function -nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - -# tendency scalers -# scale the prognostic losses by the stdev of the variable tendencies (e.g. the 6-hourly differences of the data) -# useful if including slow vs fast evolving variables in the training (e.g. Land/Ocean vs Atmosphere) -# if using this option 'variable_loss_scalings' should all be set close to 1.0 for prognostic variables -stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - -var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - -# Scalers from node attributes -node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_name: ${graph.data} - nodes_attribute_name: area_weight - norm: unit-sum diff --git a/configs_old/configs/training/scalers/lam.yaml b/configs_old/configs/training/scalers/lam.yaml deleted file mode 100755 index 122d21d634..0000000000 --- a/configs_old/configs/training/scalers/lam.yaml +++ /dev/null @@ -1,54 +0,0 @@ -# Several scalers can be added here. In order to be applied their names must be included in the loss. -# scaler name must be included in `scalers` in the losses for this to be applied. -general_variable: - # Variable groups definition for scaling by variable level. - # The variable level scaling methods are defined under additional_scalers - # A default group is required and is appended as prefix to the metric of all variables not assigned to a group. - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 0.6 #1 - t: 6 #1 - u: 0.8 #0.5 - v: 0.5 #0.33 - w: 0.001 - z: 12 #1 - sp: 10 - 10u: 0.1 - 10v: 0.1 - 2d: 0.5 - tp: 0.025 - cp: 0.0025 - -pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - -# mask NaNs with zeros in the loss function -nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - -# tendency scalers -# scale the prognostic losses by the stdev of the variable tendencies (e.g. the 6-hourly differences of the data) -# useful if including slow vs fast evolving variables in the training (e.g. Land/Ocean vs Atmosphere) -# if using this option 'variable_loss_scalings' should all be set close to 1.0 for prognostic variables -stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - -var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - -# Scalers from node attributes -node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_name: ${graph.data} - nodes_attribute_name: area_weight - norm: "unit-sum" - -limited_area_mask: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_name: ${graph.data} - nodes_attribute_name: cutout_mask - norm: null diff --git a/configs_old/configs/training/scalers/stretched.yaml b/configs_old/configs/training/scalers/stretched.yaml deleted file mode 100755 index 6e1045af1a..0000000000 --- a/configs_old/configs/training/scalers/stretched.yaml +++ /dev/null @@ -1,68 +0,0 @@ -# Several scalers can be added here. In order to be applied their names must be included in the loss. -# scaler name must be included in `scalers` in the losses for this to be applied. -general_variable: - # Variable groups definition for scaling by variable level. - # The variable level scaling methods are defined under additional_scalers - # A default group is required and is appended as prefix to the metric of all variables not assigned to a group. - _target_: anemoi.training.losses.scalers.GeneralVariableLossScaler - weights: - default: 1 - q: 0.6 #1 - t: 6 #1 - u: 0.8 #0.5 - v: 0.5 #0.33 - w: 0.001 - z: 12 #1 - sp: 10 - 10u: 0.1 - 10v: 0.1 - 2d: 0.5 - tp: 0.025 - cp: 0.0025 - -pressure_level: - _target_: anemoi.training.losses.scalers.ReluVariableLevelScaler - group: pl - y_intercept: 0.2 - slope: 0.001 - -# mask NaNs with zeros in the loss function -nan_mask_weights: - _target_: anemoi.training.losses.scalers.NaNMaskScaler - -# tendency scalers -# scale the prognostic losses by the stdev of the variable tendencies (e.g. the 6-hourly differences of the data) -# useful if including slow vs fast evolving variables in the training (e.g. Land/Ocean vs Atmosphere) -# if using this option 'variable_loss_scalings' should all be set close to 1.0 for prognostic variables -stdev_tendency: - _target_: anemoi.training.losses.scalers.StdevTendencyScaler - -var_tendency: - _target_: anemoi.training.losses.scalers.VarTendencyScaler - -# Scalers from node attributes -node_weights: - _target_: anemoi.training.losses.scalers.ReweightedGraphNodeAttributeScaler - nodes_name: ${graph.data} - nodes_attribute_name: area_weight - scaling_mask_attribute_name: cutout_mask - weight_frac_of_total: ??? - norm: "unit-sum" - -lam_node_weights: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_name: ${graph.data} - nodes_attribute_name: lam_area_weight - norm: "unit-sum" - -limited_area_mask: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_name: ${graph.data} - nodes_attribute_name: cutout_mask - norm: null - -outside_lam_mask: - _target_: anemoi.training.losses.scalers.GraphNodeAttributeScaler - nodes_name: ${graph.data} - nodes_attribute_name: boundary_mask - norm: null diff --git a/configs_old/configs/training/stretched.yaml b/configs_old/configs/training/stretched.yaml deleted file mode 100755 index 65b3a8bac4..0000000000 --- a/configs_old/configs/training/stretched.yaml +++ /dev/null @@ -1,158 +0,0 @@ ---- -defaults: - - scalers: stretched - -# resume or fork a training from a checkpoint last.ckpt or specified in hardware.files.warm_start -run_id: null -fork_run_id: null -load_weights_only: False # only load model weights, do not restore optimiser states etc. -transfer_learning: False # activate to perform transfer learning - -# run in deterministic mode ; slows down -deterministic: False - -# miscellaneous -precision: 16-mixed - -# multistep input -# 1 = single step scheme, X(t-1) used to predict X(t) -# k > 1: multistep scheme, uses [X(t-k), X(t-k+1), ... X(t-1)] to predict X(t) -# Deepmind use k = 2 in their model -multistep_input: 2 - -# gradient accumulation across K batches, K >= 1 (if K == 1 then no accumulation) -# the effective batch size becomes num-devices * batch_size * k -accum_grad_batches: 1 - -num_sanity_val_steps: 6 - -# clipp gradients, 0 : don't clip, default algorithm: norm, alternative: value -gradient_clip: - val: 32. - algorithm: value - -# stochastic weight averaging -# https://pytorch.org/blog/stochastic-weight-averaging-in-pytorch/ -swa: - enabled: False - lr: 1.e-4 - -# Optimizer settings -optimizer: - zero: False # use ZeroRedundancyOptimizer ; saves memory for larger models - kwargs: - betas: [0.9, 0.95] - -# select model -model_task: anemoi.training.train.tasks.GraphForecaster - -# select strategy -strategy: - _target_: anemoi.training.distributed.strategy.DDPGroupStrategy - num_gpus_per_model: ${hardware.num_gpus_per_model} - read_group_size: ${dataloader.read_group_size} - -# loss functions - -# dynamic rescaling of the loss gradient -# see https://arxiv.org/pdf/2306.06079.pdf, section 4.3.2 -# don't enable this by default until it's been tested and proven beneficial -loss_gradient_scaling: False - -# loss function for the model -training_loss: - # loss class to initialise - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # A selection of available scalers are listed in training/scalers/scalers.yaml - # '*' is a valid entry to use all `scalers` given, if a scaler is to be excluded - # add `!scaler_name`, i.e. ['*', '!scaler_1'], and `scaler_1` will not be added. - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights'] - ignore_nans: False - -# Validation metrics calculation, -# This may be a list, in which case all metrics will be calculated -# and logged according to their name. -# These metrics are calculated in the output model space, and thus -# have undergone postprocessing. -validation_metrics: - # loss class to initialise - mse: - _target_: anemoi.training.losses.MSELoss - # Scalers to include in loss calculation - # Cannot scale over the variable dimension due to possible remappings. - # Available scalers include: - # - 'loss_weights_mask': Giving imputed NaNs a zero weight in the loss function - # Use the `scale_validation_metrics` section to variable scale. - scalers: ['node_weights'] - # other kwargs - ignore_nans: True - mse_inside_lam_contribution: - _target_: anemoi.training.losses.MSELoss - scalers: ['limited_area_mask', 'node_weights'] - ignore_nans: True - mse_outside_lam_contribution: - _target_: anemoi.training.losses.MSELoss - scalers: ['outside_lam_mask', 'node_weights'] - ignore_nans: True - mse_inside_lam: - _target_: anemoi.training.losses.MSELoss - scalers: ['lam_node_weights'] - ignore_nans: True - -# Variable groups definition for scaling -# The variable level scaling methods are defined under training/scalers -# A default group is required and is appended as prefix to the metric of all variables not assigned to a group. -# Variables are assigned to a group by their param if contained in the metadata, else by their name. - -# If more complex grouping is required, groups can be defined as a dictionary, such that all -# keys must be evaluate to True. -# .e.g. to set the variable group based on if the metadata specifies the variable is a pressure level -# you can write the following: -# variable_groups: -# default: sfc -# pl: -# is_pressure_level: True -# See `anemoi.transform.variables.Variable` for the available metadata. -# Note that the former formulation of -# : -# variable_groups: -# default: sfc -# pl: [q, t, u, v, w, z] -# -# still works - -variable_groups: - default: sfc - pl: - param: [q, t, u, v, w, z] - -metrics: -- z_500 -- t_850 -- u_850 -- v_850 - -# length of the "rollout" window (see Keisler's paper) -rollout: - start: 1 - # increase rollout every n epochs - epoch_increment: 0 - # maximum rollout to use - max: 1 - -# Set max_epochs or max_steps. Training stops at the first limit reached. -max_epochs: null -max_steps: 150000 - -lr: - warmup: 1000 # number of warmup iterations - rate: 0.625e-4 #local_lr - iterations: ${training.max_steps} # NOTE: When max_epochs < max_steps, scheduler will run for max_steps - min: 3e-7 #Not scaled by #GPU - -# Changes in per-gpu batch_size should come with a rescaling of the local_lr -# in order to keep a constant global_lr -# global_lr = local_lr * num_gpus_per_node * num_nodes / gpus_per_model - -submodules_to_freeze: [] From b0e7a7cd728ceb801ce6ed36125320fa3dec2e17 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 8 May 2026 16:26:59 +0000 Subject: [PATCH 50/88] fix failing schema --- .../src/anemoi/training/schemas/training.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index a18b5093ea..3b0c048bfc 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -305,21 +305,6 @@ class MultiscaleConfigDiskSchema(BaseModel): scalers: list[str] | None = None "Scalers to apply to the wrapped loss (delegated to inner per_scale_loss)." - @field_validator("per_scale_loss", mode="before") - @classmethod - def add_empty_scalers_to_inner(cls, v: Any) -> Any: - """Inject empty scalers for inner loss; scalers flow through the wrapper.""" - if isinstance(v, dict) and "scalers" not in v: - v["scalers"] = [] - else: - from omegaconf import DictConfig - from omegaconf.omegaconf import open_dict - - if isinstance(v, DictConfig) and "scalers" not in v: - with open_dict(v): - v["scalers"] = [] - return v - class MultiscaleConfigOnTheFlySchema(BaseModel): """On-the-fly multiscale config: smoothing subgraphs built from the main graph.""" @@ -360,6 +345,21 @@ class MultiScaleLossSchema(BaseModel): loss_matrices_path: str | None = None loss_matrices: list[str | None] | None = None + @field_validator("per_scale_loss", mode="before") + @classmethod + def add_empty_scalers_to_inner(cls, v: Any) -> Any: + """Inject empty scalers for inner loss; scalers flow through the wrapper.""" + if isinstance(v, dict) and "scalers" not in v: + v["scalers"] = [] + else: + from omegaconf import DictConfig + from omegaconf.omegaconf import open_dict + + if isinstance(v, DictConfig) and "scalers" not in v: + with open_dict(v): + v["scalers"] = [] + return v + @model_validator(mode="after") def check_no_deprecated_mixed_with_on_the_fly(self) -> Self: if isinstance(self.multiscale_config, MultiscaleConfigOnTheFlySchema) and ( From 99497a0988e9b3249d07cea09cc16d49bfc3a993 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 8 May 2026 16:43:34 +0000 Subject: [PATCH 51/88] fix failing tests --- .../src/anemoi/training/losses/multiscale.py | 5 +++++ .../tests/unit/losses/test_aggregate_loss.py | 17 +++++++---------- .../tests/unit/schemas/test_training_schemas.py | 4 ++++ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/training/src/anemoi/training/losses/multiscale.py b/training/src/anemoi/training/losses/multiscale.py index 073c5a33ec..ad56929a6b 100644 --- a/training/src/anemoi/training/losses/multiscale.py +++ b/training/src/anemoi/training/losses/multiscale.py @@ -9,6 +9,7 @@ import logging +from collections.abc import Iterator from pathlib import Path import einops @@ -134,6 +135,10 @@ def __init__( def needs_shard_layout_info(self) -> bool: return True + def iter_leaf_losses(self) -> Iterator["BaseLoss"]: + """MultiscaleLossWrapper is a leaf: it performs substantive computation.""" + yield self + def _load_smoothing_matrices( self, multiscale_config: object | None, diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index 3248b20607..bcfbba10bc 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -134,7 +134,10 @@ def test_diff_aggregation_computes_temporal_differences() -> None: target_diff = target[:, 1:, ...] - target[:, :-1, ...] wrapper_diff = TimeAggregateLossWrapper(["diff"], inner) - expected = inner(pred_diff, target_diff) + # The wrapper iterates per diff-step to handle time scalers correctly. + expected = torch.tensor(0.0) + for step in range(pred_diff.shape[1]): + expected = expected + inner(pred_diff[:, step : step + 1, ...], target_diff[:, step : step + 1, ...]) result = wrapper_diff(pred, target) assert torch.allclose(result, expected, atol=1e-6) @@ -394,20 +397,14 @@ def test_nested_iter_leaf_losses_reaches_innermost() -> None: def test_combined_loss_scaler_reaches_wrapped_inner() -> None: - from anemoi.training.losses.combined import CombinedLoss - inner1 = MAELoss() inner2 = MAELoss() wrapper = TimeAggregateLossWrapper(["mean"], inner2) - combined = CombinedLoss( - losses=[ - inner1, - wrapper, - ], - ) + # Verify that add_scaler on the wrapper propagates to the inner loss grid_scaler = torch.ones(4) - combined.add_scaler(TensorDim.GRID, grid_scaler, name="node_weights") + wrapper.add_scaler(TensorDim.GRID, grid_scaler, name="node_weights") + inner1.add_scaler(TensorDim.GRID, grid_scaler, name="node_weights") # Both leaf losses should have the scaler assert inner1.scaler.has_scaler_for_dim(TensorDim.GRID) diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py index d1cc21e417..a0b6e72be6 100644 --- a/training/tests/unit/schemas/test_training_schemas.py +++ b/training/tests/unit/schemas/test_training_schemas.py @@ -10,6 +10,10 @@ import pytest from pydantic import ValidationError +from anemoi.training.schemas.training import CombinedLossSchema +from anemoi.training.schemas.training import MultiscaleConfigDiskSchema +from anemoi.training.schemas.training import MultiscaleConfigOnTheFlySchema +from anemoi.training.schemas.training import MultiScaleLossSchema from anemoi.training.schemas.training import OptimizerSchema from anemoi.training.schemas.training import TimeAggregateLossWrapperSchema From e726b5c375825be6ef54cee85230d6aa7c2ff7d2 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Fri, 8 May 2026 20:49:17 +0000 Subject: [PATCH 52/88] fix pre commit --- .../src/anemoi/training/losses/aggregate.py | 75 +++++++++++-------- .../tests/unit/losses/test_aggregate_loss.py | 2 +- 2 files changed, 46 insertions(+), 31 deletions(-) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index a8e935f70d..388d81b5e2 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -82,11 +82,11 @@ def forward( # and apply time weights manually. without_time = without_scalers or [] if TensorDim.TIME not in without_time and TensorDim.TIME.value not in without_time: - without_time = list(without_time) + [TensorDim.TIME.value] + without_time = [*list(without_time), TensorDim.TIME.value] # Extract time weights from the shared scaler (if present) time_weights = None - for _name, (dims, scaler) in self.loss.scaler.tensors.items(): + for dims, scaler in self.loss.scaler.tensors.values(): if isinstance(dims, int): dims = (dims,) if TensorDim.TIME.value in dims or TensorDim.TIME in dims: @@ -105,33 +105,48 @@ def forward( shared_kwargs["squash_mode"] = squash_mode for agg_op in self.time_aggregation_types: - if agg_op == "diff": - pred_agg = pred[:, 1:, ...] - pred[:, :-1, ...] # (bs, time-1, ens, latlon, nvar) - target_agg = target[:, 1:, ...] - target[:, :-1, ...] # (bs, time-1, latlon, nvar) - # Compute loss per diff-step, weighted by time scaler - for step in range(pred_agg.shape[1]): - step_loss = self.loss( - pred_agg[:, step : step + 1, ...], - target_agg[:, step : step + 1, ...], - **shared_kwargs, - ) - if time_weights is not None: - step_loss = step_loss * time_weights[step] - loss = loss + step_loss - elif agg_op == "mean": - pred_agg = torch.mean(pred, dim=1, keepdim=True) # (bs, 1, ens, latlon, nvar) - target_agg = torch.mean(target, dim=1, keepdim=True) # (bs, 1, latlon, nvar) - loss = loss + self.loss(pred_agg, target_agg, **shared_kwargs) - elif agg_op == "min": - pred_agg = torch.amin(pred, dim=1, keepdim=True) # (bs, 1, ens, latlon, nvar) - target_agg = torch.amin(target, dim=1, keepdim=True) # (bs, 1, latlon, nvar) - loss = loss + self.loss(pred_agg, target_agg, **shared_kwargs) - elif agg_op == "max": - pred_agg = torch.amax(pred, dim=1, keepdim=True) # (bs, 1, ens, latlon, nvar) - target_agg = torch.amax(target, dim=1, keepdim=True) # (bs, 1, latlon, nvar) - loss = loss + self.loss(pred_agg, target_agg, **shared_kwargs) - else: - msg = f"Unknown aggregation type '{agg_op}'. Supported: 'diff', 'mean', 'min', 'max'." - raise ValueError(msg) + loss = loss + self._compute_agg_loss(agg_op, pred, target, time_weights, shared_kwargs) return loss + + def _compute_agg_loss( + self, + agg_op: str, + pred: torch.Tensor, + target: torch.Tensor, + time_weights: torch.Tensor | None, + shared_kwargs: dict, + ) -> torch.Tensor: + """Compute loss for a single aggregation operation.""" + if agg_op == "diff": + return self._compute_diff_loss(pred, target, time_weights, shared_kwargs) + agg_fns = {"mean": torch.mean, "min": torch.amin, "max": torch.amax} + if agg_op not in agg_fns: + msg = f"Unknown aggregation type '{agg_op}'. Supported: 'diff', 'mean', 'min', 'max'." + raise ValueError(msg) + fn = agg_fns[agg_op] + pred_agg = fn(pred, dim=1, keepdim=True) + target_agg = fn(target, dim=1, keepdim=True) + return self.loss(pred_agg, target_agg, **shared_kwargs) + + def _compute_diff_loss( + self, + pred: torch.Tensor, + target: torch.Tensor, + time_weights: torch.Tensor | None, + shared_kwargs: dict, + ) -> torch.Tensor: + """Compute per-step diff loss, optionally weighted by time scaler.""" + pred_agg = pred[:, 1:, ...] - pred[:, :-1, ...] # (bs, time-1, ens, latlon, nvar) + target_agg = target[:, 1:, ...] - target[:, :-1, ...] # (bs, time-1, latlon, nvar) + loss = torch.tensor(0.0, dtype=pred.dtype, device=pred.device, requires_grad=False) + for step in range(pred_agg.shape[1]): + step_loss = self.loss( + pred_agg[:, step : step + 1, ...], + target_agg[:, step : step + 1, ...], + **shared_kwargs, + ) + if time_weights is not None: + step_loss = step_loss * time_weights[step] + loss = loss + step_loss + return loss diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index bcfbba10bc..5b9720659a 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -15,6 +15,7 @@ from anemoi.training.losses.kcrps import AlmostFairKernelCRPS from anemoi.training.losses.mae import MAELoss from anemoi.training.utils.enums import TensorDim +from anemoi.training.losses.multiscale import MultiscaleLossWrapper # --------------------------------------------------------------------------- # Helpers @@ -345,7 +346,6 @@ def test_iter_leaf_losses_yields_inner_leaves() -> None: def _make_multiscale_wrapper(inner: BaseLoss | None = None) -> "MultiscaleLossWrapper": """Build a single-scale MultiscaleLossWrapper (no smoothing matrices).""" - from anemoi.training.losses.multiscale import MultiscaleLossWrapper if inner is None: inner = _make_loss() From b72f0f91a7a0fe2eaab0bc0f090b9ee384ed95a8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 20:49:59 +0000 Subject: [PATCH 53/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/tests/unit/losses/test_aggregate_loss.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index 5b9720659a..74cb407f5c 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -14,8 +14,8 @@ from anemoi.training.losses.base import BaseLoss from anemoi.training.losses.kcrps import AlmostFairKernelCRPS from anemoi.training.losses.mae import MAELoss -from anemoi.training.utils.enums import TensorDim from anemoi.training.losses.multiscale import MultiscaleLossWrapper +from anemoi.training.utils.enums import TensorDim # --------------------------------------------------------------------------- # Helpers @@ -346,7 +346,6 @@ def test_iter_leaf_losses_yields_inner_leaves() -> None: def _make_multiscale_wrapper(inner: BaseLoss | None = None) -> "MultiscaleLossWrapper": """Build a single-scale MultiscaleLossWrapper (no smoothing matrices).""" - if inner is None: inner = _make_loss() return MultiscaleLossWrapper( From b83c8aa8a99894c23cd6ccaaf1a891425df35b2f Mon Sep 17 00:00:00 2001 From: mc4117 Date: Sat, 9 May 2026 10:11:45 +0000 Subject: [PATCH 54/88] change scalings --- .../config/training/training_loss/ensemble_combined.yaml | 5 +++++ .../config/training/training_loss/single_combined.yaml | 5 +++++ training/src/anemoi/training/losses/aggregate.py | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml index 900d9cdd09..3023552a8d 100644 --- a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml +++ b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml @@ -3,6 +3,11 @@ datasets: _target_: anemoi.training.losses.combined.CombinedLoss scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] ignore_nans: False + # loss_weights: [n_timesteps / (n_timesteps + n_agg_ops), n_agg_ops / (n_timesteps + n_agg_ops)] + # Each sub-loss averages internally (raw over timesteps, aggregate over agg ops). + # These weights re-scale so the total matches: sum_all / (n_timesteps + n_agg_ops). + # Example for 6 timesteps and 4 agg ops: [0.6, 0.4] + loss_weights: [0.6, 0.4] losses: - _target_: anemoi.training.losses.MultiscaleLossWrapper loss_matrices_path: ${system.input.loss_matrices_path} diff --git a/training/src/anemoi/training/config/training/training_loss/single_combined.yaml b/training/src/anemoi/training/config/training/training_loss/single_combined.yaml index cf18e68746..364ac12178 100644 --- a/training/src/anemoi/training/config/training/training_loss/single_combined.yaml +++ b/training/src/anemoi/training/config/training/training_loss/single_combined.yaml @@ -3,6 +3,11 @@ datasets: _target_: anemoi.training.losses.combined.CombinedLoss scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] ignore_nans: False + # loss_weights: [n_timesteps / (n_timesteps + n_agg_ops), n_agg_ops / (n_timesteps + n_agg_ops)] + # Each sub-loss averages internally (raw over timesteps, aggregate over agg ops). + # These weights re-scale so the total matches: sum_all / (n_timesteps + n_agg_ops). + # Example for 6 timesteps and 4 agg ops: [0.6, 0.4] + loss_weights: [0.6, 0.4] losses: - _target_: anemoi.training.losses.MSELoss scalers: ['*'] diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 388d81b5e2..5f8fa0622f 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -107,6 +107,10 @@ def forward( for agg_op in self.time_aggregation_types: loss = loss + self._compute_agg_loss(agg_op, pred, target, time_weights, shared_kwargs) + # Average over the number of aggregation types, matching the old per-term + # normalisation (old code: loss /= num_interp_steps + num_aggregate_ops). + loss = loss / len(self.time_aggregation_types) + return loss def _compute_agg_loss( From 79f690d2d201f324ce8f9cb106237fd619d7229f Mon Sep 17 00:00:00 2001 From: mc4117 Date: Sat, 9 May 2026 10:18:38 +0000 Subject: [PATCH 55/88] fix failing tests --- training/src/anemoi/training/losses/aggregate.py | 4 ++-- training/tests/unit/losses/test_aggregate_loss.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 5f8fa0622f..961543127e 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -109,8 +109,8 @@ def forward( # Average over the number of aggregation types, matching the old per-term # normalisation (old code: loss /= num_interp_steps + num_aggregate_ops). - loss = loss / len(self.time_aggregation_types) - + if self.time_aggregation_types: + loss = loss / len(self.time_aggregation_types) return loss def _compute_agg_loss( diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index 74cb407f5c..f6407f3e64 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -105,7 +105,7 @@ def test_empty_aggregation_returns_zero(pred: torch.Tensor, target: torch.Tensor def test_loss_accumulates_across_agg_ops(pred: torch.Tensor, target: torch.Tensor) -> None: - """Combined wrapper loss equals sum of individual wrapper losses.""" + """Combined wrapper loss equals average of individual wrapper losses.""" inner = _make_loss() wrapper_mean = TimeAggregateLossWrapper(["mean"], inner) @@ -116,7 +116,7 @@ def test_loss_accumulates_across_agg_ops(pred: torch.Tensor, target: torch.Tenso loss_diff = wrapper_diff(pred, target) loss_both = wrapper_both(pred, target) - assert torch.allclose(loss_both, loss_mean + loss_diff, atol=1e-6) + assert torch.allclose(loss_both, (loss_mean + loss_diff) / 2, atol=1e-6) # --------------------------------------------------------------------------- @@ -197,7 +197,7 @@ def test_crps_multiple_agg_ops_return_scalar() -> None: def test_crps_loss_accumulates_across_agg_ops() -> None: - """Combined CRPS wrapper loss equals sum of individual wrapper losses.""" + """Combined CRPS wrapper loss equals average of individual wrapper losses.""" inner = _make_crps_loss() pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) target = torch.rand(BS, TIME, LATLON, NVAR) @@ -206,7 +206,7 @@ def test_crps_loss_accumulates_across_agg_ops() -> None: loss_diff = TimeAggregateLossWrapper(["diff"], inner)(pred, target) loss_both = TimeAggregateLossWrapper(["mean", "diff"], inner)(pred, target) - assert torch.allclose(loss_both, loss_mean + loss_diff, atol=1e-6) + assert torch.allclose(loss_both, (loss_mean + loss_diff) / 2, atol=1e-6) @pytest.mark.parametrize("agg_op", ["mean", "min", "max"]) From a4c5df3a4de1455d83b3231779c683d934335fa5 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 11 May 2026 07:53:04 +0000 Subject: [PATCH 56/88] fix schema --- .../config/training/training_loss/ensemble_combined.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml index 3023552a8d..e65c773bcb 100644 --- a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml +++ b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml @@ -13,7 +13,6 @@ datasets: loss_matrices_path: ${system.input.loss_matrices_path} loss_matrices: [null] weights: [1.0] - keep_batch_sharded: ${model.keep_batch_sharded} per_scale_loss: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] From 043a14b2b8e0ce4e0c9da9c5c1285db2083828f8 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 11 May 2026 09:50:49 +0000 Subject: [PATCH 57/88] fix ensemble crps --- training/tests/integration/config/test_ensemble_crps.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/training/tests/integration/config/test_ensemble_crps.yaml b/training/tests/integration/config/test_ensemble_crps.yaml index 1cbcc0a956..902f7f63aa 100644 --- a/training/tests/integration/config/test_ensemble_crps.yaml +++ b/training/tests/integration/config/test_ensemble_crps.yaml @@ -8,9 +8,8 @@ training: training_loss: datasets: data: - multiscale_config: - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: ["o96_smoothing_o96.npz", null] + loss_matrices_path: ${system.input.loss_matrices_path} + loss_matrices: ["o96_smoothing_o96.npz", null] weights: [1.0, 1.0] validation_metrics: datasets: From 75e93738bb3a5dd99eedcf3fab3a32248a08bfd9 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 11 May 2026 11:54:23 +0000 Subject: [PATCH 58/88] fix failing tests --- .../training/config/training/training_loss/ensemble.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble.yaml index 6c6c1b45ec..f9368d5080 100644 --- a/training/src/anemoi/training/config/training/training_loss/ensemble.yaml +++ b/training/src/anemoi/training/config/training/training_loss/ensemble.yaml @@ -8,6 +8,9 @@ datasets: # On-the-fly: multiscale_config: {num_scales: 4, base_num_nearest_neighbours: 16, base_sigma: 0.01570} multiscale_config: null # null = single scale, no smoothing weights: [1.0] + # Deprecated: pass inside multiscale_config instead. + loss_matrices_path: ${system.input.loss_matrices_path} + loss_matrices: [null] per_scale_loss: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS From 08f70ac3802998ae1f74be9960271de47d62869c Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 11 May 2026 12:11:43 +0000 Subject: [PATCH 59/88] fix tests --- .../training/training_loss/ensemble.yaml | 4 --- .../training_loss/ensemble_combined.yaml | 3 +-- .../config/test_ensemble_crps.yaml | 5 ++-- training/tests/integration/conftest.py | 25 ++++++++++++------- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble.yaml index f9368d5080..c230d24b48 100644 --- a/training/src/anemoi/training/config/training/training_loss/ensemble.yaml +++ b/training/src/anemoi/training/config/training/training_loss/ensemble.yaml @@ -8,10 +8,6 @@ datasets: # On-the-fly: multiscale_config: {num_scales: 4, base_num_nearest_neighbours: 16, base_sigma: 0.01570} multiscale_config: null # null = single scale, no smoothing weights: [1.0] - # Deprecated: pass inside multiscale_config instead. - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] - per_scale_loss: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml index e65c773bcb..3aeb90fd53 100644 --- a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml +++ b/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml @@ -10,8 +10,7 @@ datasets: loss_weights: [0.6, 0.4] losses: - _target_: anemoi.training.losses.MultiscaleLossWrapper - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: [null] + multiscale_config: null # null = single scale, no smoothing weights: [1.0] per_scale_loss: _target_: anemoi.training.losses.kcrps.AlmostFairKernelCRPS diff --git a/training/tests/integration/config/test_ensemble_crps.yaml b/training/tests/integration/config/test_ensemble_crps.yaml index 902f7f63aa..1cbcc0a956 100644 --- a/training/tests/integration/config/test_ensemble_crps.yaml +++ b/training/tests/integration/config/test_ensemble_crps.yaml @@ -8,8 +8,9 @@ training: training_loss: datasets: data: - loss_matrices_path: ${system.input.loss_matrices_path} - loss_matrices: ["o96_smoothing_o96.npz", null] + multiscale_config: + loss_matrices_path: ${system.input.loss_matrices_path} + loss_matrices: ["o96_smoothing_o96.npz", null] weights: [1.0, 1.0] validation_metrics: datasets: diff --git a/training/tests/integration/conftest.py b/training/tests/integration/conftest.py index 67af2e7404..c7def0afee 100644 --- a/training/tests/integration/conftest.py +++ b/training/tests/integration/conftest.py @@ -250,12 +250,18 @@ def lam_config_with_graph( return cfg, urls -def _get_loss_cfgs_with_matrices(training_loss_cfg: DictConfig) -> list[DictConfig]: - """Extract loss configs that have loss_matrices, handling both direct and CombinedLoss cases.""" - if "loss_matrices" in training_loss_cfg: - return [training_loss_cfg] +def _get_multiscale_cfgs(training_loss_cfg: DictConfig) -> list[DictConfig]: + """Extract multiscale_config dicts that contain loss_matrices.""" + multiscale_cfg = training_loss_cfg.get("multiscale_config") + if multiscale_cfg is not None and "loss_matrices" in multiscale_cfg: + return [multiscale_cfg] if "losses" in training_loss_cfg: - return [sub_loss for sub_loss in training_loss_cfg.losses if "loss_matrices" in sub_loss] + results = [] + for sub_loss in training_loss_cfg.losses: + mc = sub_loss.get("multiscale_config") + if mc is not None and "loss_matrices" in mc: + results.append(mc) + return results return [] @@ -265,14 +271,15 @@ def handle_truncation_matrices(cfg: DictConfig, get_test_data: GetTestData) -> D training_losses_cfg = get_multiple_datasets_config(cfg.training.training_loss) for dataset_name, training_loss_cfg in training_losses_cfg.items(): - loss_cfgs_to_check = _get_loss_cfgs_with_matrices(training_loss_cfg) + multiscale_cfgs = _get_multiscale_cfgs(training_loss_cfg) - for loss_cfg in loss_cfgs_to_check: - for file in loss_cfg.loss_matrices: + for multiscale_cfg in multiscale_cfgs: + for file in multiscale_cfg.get("loss_matrices") or []: if file is not None: tmp_path_loss_matrices = get_test_data(url_loss_matrices + file) if tmp_path_loss_matrices is not None: - loss_cfg.loss_matrices_path = str(Path(tmp_path_loss_matrices).parent) + OmegaConf.set_struct(multiscale_cfg, False) + multiscale_cfg.loss_matrices_path = str(Path(tmp_path_loss_matrices).parent) if tmp_path_loss_matrices is not None: resolved_path = str(Path(tmp_path_loss_matrices).parent) From 570f638353af3643d88c14bbfda5250c927ab296 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 11 May 2026 12:33:58 +0000 Subject: [PATCH 60/88] rename to composite loss --- training/docs/modules/losses.rst | 4 ++-- training/src/anemoi/training/config/temporal_downscaler.yaml | 2 +- .../anemoi/training/config/temporal_downscaler_ensemble.yaml | 2 +- .../{ensemble_combined.yaml => ensemble_composite.yaml} | 0 .../{single_combined.yaml => single_composite.yaml} | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename training/src/anemoi/training/config/training/training_loss/{ensemble_combined.yaml => ensemble_composite.yaml} (100%) rename training/src/anemoi/training/config/training/training_loss/{single_combined.yaml => single_composite.yaml} (100%) diff --git a/training/docs/modules/losses.rst b/training/docs/modules/losses.rst index 6b375d5ec9..e4954a6d3c 100644 --- a/training/docs/modules/losses.rst +++ b/training/docs/modules/losses.rst @@ -136,8 +136,8 @@ be listed there. meaningful for single-step tasks. We strongly recommend using the time aggregate loss when training any -temporal downscaler. The pre-built config variants ``single_combined`` -and ``ensemble_combined`` combine it with the primary loss inside a +temporal downscaler. The pre-built config variants ``single_composite`` +and ``ensemble_composite`` combine it with the primary loss inside a :class:`~anemoi.training.losses.combined.CombinedLoss`. *************************** diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index d0ee2cc197..137a57fe04 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -7,7 +7,7 @@ defaults: - model: graphtransformer - task: temporal_downscaler - training: single -- override training/training_loss: single_combined +- override training/training_loss: single_composite - _self_ config_validation: True diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index d52938e349..ae184e9e11 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -7,7 +7,7 @@ defaults: - model: graphtransformer_ens - task: temporal_downscaler - training: ensemble -- override training/training_loss: ensemble_combined +- override training/training_loss: ensemble_composite - _self_ config_validation: True diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble_composite.yaml similarity index 100% rename from training/src/anemoi/training/config/training/training_loss/ensemble_combined.yaml rename to training/src/anemoi/training/config/training/training_loss/ensemble_composite.yaml diff --git a/training/src/anemoi/training/config/training/training_loss/single_combined.yaml b/training/src/anemoi/training/config/training/training_loss/single_composite.yaml similarity index 100% rename from training/src/anemoi/training/config/training/training_loss/single_combined.yaml rename to training/src/anemoi/training/config/training/training_loss/single_composite.yaml From abb61f590a83e4c3fd4d1cc61231cbca3b7d2a49 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 11 May 2026 12:48:00 +0000 Subject: [PATCH 61/88] update docs --- training/docs/modules/losses.rst | 9 +++------ training/docs/modules/tasks.rst | 2 +- training/src/anemoi/training/losses/multiscale.py | 8 -------- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/training/docs/modules/losses.rst b/training/docs/modules/losses.rst index e4954a6d3c..0eb5e1d25f 100644 --- a/training/docs/modules/losses.rst +++ b/training/docs/modules/losses.rst @@ -87,12 +87,9 @@ deterministic: Time Aggregate Loss Functions *************************** -A key challenge in temporal downscaling is **temporal consistency**: the -model must produce output sequences that are internally coherent over -time, not just accurate at each individual step. This is especially -critical for variables like precipitation (``tp``, ``cp``) whose -statistics (totals, extremes, and temporal gradients) matter as much as -instantaneous values. +These loss functions encourage the model to produce **temporally consistent** outputs +i.e. output sequences that are internally coherent over +time, not just accurate at each individual step. :class:`~anemoi.training.losses.aggregate.TimeAggregateLossWrapper` addresses this by applying a base loss function to *time-aggregated* diff --git a/training/docs/modules/tasks.rst b/training/docs/modules/tasks.rst index c9a1060ae6..c8616740c6 100644 --- a/training/docs/modules/tasks.rst +++ b/training/docs/modules/tasks.rst @@ -155,7 +155,7 @@ Example: ``input_timestep="6H"``, ``output_timestep="3H"``, ``output_left_boundary=True`` produces output offsets ``[0H, 3H]`` and input offsets ``[0H, 6H]``. -We strongly recommend using the time aggregate loss when training any +The default is to use the time aggregate loss when training any temporal downscaler. .. automodule:: anemoi.training.tasks.temporal_downscaling diff --git a/training/src/anemoi/training/losses/multiscale.py b/training/src/anemoi/training/losses/multiscale.py index ad56929a6b..c3d3391d29 100644 --- a/training/src/anemoi/training/losses/multiscale.py +++ b/training/src/anemoi/training/losses/multiscale.py @@ -44,7 +44,6 @@ def __init__( multiscale_config: object | None = None, graph_data: HeteroData | None = None, data_node_name: str = DEFAULT_DATASET_NAME, - keep_batch_sharded: bool = True, autocast: bool = False, ignore_nans: bool = False, # Deprecated: pass loss_matrices_path / loss_matrices inside multiscale_config instead. @@ -86,12 +85,6 @@ def __init__( Main graph; required for on-the-fly mode to copy data-node positions. data_node_name : str Node type in *graph_data* that holds the data-grid coordinates. - keep_batch_sharded : bool - Whether the task should keep the batch grid-sharded during loss - computation. When enabled, the task passes shard-layout metadata to - this wrapper and multiscale smoothing follows the sharded path. - If disabled, the loss is evaluated on replicated full-grid tensors - on each model rank. autocast : bool Whether to use automatic mixed precision for the projections. ignore_nans : bool @@ -126,7 +119,6 @@ def __init__( len(weights) == self.num_scales ), f"Number of weights ({len(weights)}) must match number of scales ({self.num_scales})" self.weights = weights - self.keep_batch_sharded = keep_batch_sharded self.supports_sharding = True self.mloss = None self.projector = SparseProjector(autocast=autocast) From 061c01c4d21541c3d5e178123c7b8a5df439f925 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 12:48:40 +0000 Subject: [PATCH 62/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/docs/modules/losses.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/training/docs/modules/losses.rst b/training/docs/modules/losses.rst index 0eb5e1d25f..860b699f92 100644 --- a/training/docs/modules/losses.rst +++ b/training/docs/modules/losses.rst @@ -87,7 +87,7 @@ deterministic: Time Aggregate Loss Functions *************************** -These loss functions encourage the model to produce **temporally consistent** outputs +These loss functions encourage the model to produce **temporally consistent** outputs i.e. output sequences that are internally coherent over time, not just accurate at each individual step. From 9d4b4ef07f114952d8c50fe5127958030d159e8f Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 11 May 2026 13:46:42 +0000 Subject: [PATCH 63/88] rename --- training/docs/modules/losses.rst | 4 ++-- training/src/anemoi/training/config/temporal_downscaler.yaml | 2 +- .../anemoi/training/config/temporal_downscaler_ensemble.yaml | 2 +- ...le_composite.yaml => ensemble_multiscale_aggregation.yaml} | 0 .../{single_composite.yaml => single_MSE_aggregation.yaml} | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename training/src/anemoi/training/config/training/training_loss/{ensemble_composite.yaml => ensemble_multiscale_aggregation.yaml} (100%) rename training/src/anemoi/training/config/training/training_loss/{single_composite.yaml => single_MSE_aggregation.yaml} (100%) diff --git a/training/docs/modules/losses.rst b/training/docs/modules/losses.rst index 860b699f92..af3b1e3306 100644 --- a/training/docs/modules/losses.rst +++ b/training/docs/modules/losses.rst @@ -133,8 +133,8 @@ be listed there. meaningful for single-step tasks. We strongly recommend using the time aggregate loss when training any -temporal downscaler. The pre-built config variants ``single_composite`` -and ``ensemble_composite`` combine it with the primary loss inside a +temporal downscaler. The pre-built config variants ``single_MSE_aggregation`` +and ``ensemble_multiscale_aggregation`` combine it with the primary loss inside a :class:`~anemoi.training.losses.combined.CombinedLoss`. *************************** diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index 137a57fe04..fe78ccaf22 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -7,7 +7,7 @@ defaults: - model: graphtransformer - task: temporal_downscaler - training: single -- override training/training_loss: single_composite +- override training/training_loss: single_MSE_aggregation - _self_ config_validation: True diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index ae184e9e11..e9f3b710db 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -7,7 +7,7 @@ defaults: - model: graphtransformer_ens - task: temporal_downscaler - training: ensemble -- override training/training_loss: ensemble_composite +- override training/training_loss: ensemble_multiscale_aggregation - _self_ config_validation: True diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble_composite.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble_multiscale_aggregation.yaml similarity index 100% rename from training/src/anemoi/training/config/training/training_loss/ensemble_composite.yaml rename to training/src/anemoi/training/config/training/training_loss/ensemble_multiscale_aggregation.yaml diff --git a/training/src/anemoi/training/config/training/training_loss/single_composite.yaml b/training/src/anemoi/training/config/training/training_loss/single_MSE_aggregation.yaml similarity index 100% rename from training/src/anemoi/training/config/training/training_loss/single_composite.yaml rename to training/src/anemoi/training/config/training/training_loss/single_MSE_aggregation.yaml From f1ff22206489f14ef51b22f3ea8a2c52cffe36f2 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 11 May 2026 13:55:42 +0000 Subject: [PATCH 64/88] fix failing test --- training/tests/unit/losses/test_aggregate_loss.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index f6407f3e64..dc8ccded24 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -351,17 +351,8 @@ def _make_multiscale_wrapper(inner: BaseLoss | None = None) -> "MultiscaleLossWr return MultiscaleLossWrapper( per_scale_loss=inner, weights=[1.0], - keep_batch_sharded=True, ) - -def test_nested_needs_shard_layout_info_propagates() -> None: - ms = _make_multiscale_wrapper() - wrapper = TimeAggregateLossWrapper(["mean"], ms) - # MultiscaleLossWrapper with keep_batch_sharded=True -> needs_shard_layout_info=True - assert wrapper.needs_shard_layout_info is True - - def test_nested_scaler_shared_through_chain() -> None: leaf = _make_loss() ms = _make_multiscale_wrapper(leaf) From ff443654ded6943da0781aea987b29e4afc2b209 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 13:56:54 +0000 Subject: [PATCH 65/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/tests/unit/losses/test_aggregate_loss.py | 1 + 1 file changed, 1 insertion(+) diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index dc8ccded24..f34272c7c9 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -353,6 +353,7 @@ def _make_multiscale_wrapper(inner: BaseLoss | None = None) -> "MultiscaleLossWr weights=[1.0], ) + def test_nested_scaler_shared_through_chain() -> None: leaf = _make_loss() ms = _make_multiscale_wrapper(leaf) From 421e6c0c276b7147ae4c957085c5e3091d8690d3 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Tue, 12 May 2026 14:16:48 +0000 Subject: [PATCH 66/88] fix scalers --- training/src/anemoi/training/schemas/training.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 3b0c048bfc..d6c84b37a6 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -419,6 +419,8 @@ class Config(BaseModel.Config): class CombinedLossSchema(BaseLossSchema): + scalers: list[str] = Field(default_factory=list) + "Scalers applied at the combined-loss level; sub-losses define their own scalers." losses: list[ BaseLossSchema | AlmostFairKernelCRPSSchema From 503436dafd011099ed825353204d4b0e49aa4b3b Mon Sep 17 00:00:00 2001 From: mc4117 Date: Wed, 13 May 2026 12:36:51 +0000 Subject: [PATCH 67/88] update combined loss --- .../src/anemoi/training/losses/combined.py | 61 +++++-------------- training/src/anemoi/training/losses/loss.py | 7 +++ training/src/anemoi/training/losses/utils.py | 5 +- 3 files changed, 25 insertions(+), 48 deletions(-) diff --git a/training/src/anemoi/training/losses/combined.py b/training/src/anemoi/training/losses/combined.py index fb5ace6699..80a5cd1907 100644 --- a/training/src/anemoi/training/losses/combined.py +++ b/training/src/anemoi/training/losses/combined.py @@ -29,7 +29,7 @@ class CombinedLoss(BaseLoss): """Combined Loss function.""" needs_graph_data: bool = True - # CombinedLoss builds child losses itself, so it needs the filtered scaler + # CombinedLoss builds child losses itself, so it needs the full scaler # set and data indices during construction. factory_context_keys = frozenset( {LossFactoryContextKey.AVAILABLE_SCALERS, LossFactoryContextKey.DATA_INDICES}, @@ -50,18 +50,8 @@ def __init__( Allows multiple losses to be combined into a single loss function, and the components weighted. - As the losses are designed for use within the context of the - anemoi-training configuration, `losses` work best as a dictionary. - - If `losses` is a `tuple[dict]`, the `scalers` key will be extracted - before being passed to `get_loss_function`, and the `scalers` defined - in each loss only applied to the respective loss. Thereby `scalers` - added to this class will be routed correctly. - If `losses` is a `tuple[Callable]`, all `scalers` added to this class - will be added to all underlying losses. - And if `losses` is a `tuple[BaseLoss]`, no scalers added to - this class will be added to the underlying losses, as it is - assumed that will be done by the parent function. + Each child loss controls its own scalers via its `scalers` config key. + All available scalers are passed through to child losses unconditionally. Parameters ---------- @@ -69,8 +59,8 @@ def __init__( if a `tuple[dict]`: Tuple of losses to initialise with `get_loss_function`. Allows for kwargs to be passed, and weighings controlled. - If a loss should only have some of the scalers, set `scalers` in the loss config. - If no scalers are set, all scalers added to this class will be included. + Each child loss specifies its own `scalers` to control which + scalers it receives. if a `tuple[Callable]`: Will be called with `kwargs`, and all scalers added to this class added. if a `tuple[BaseLoss]`: @@ -83,8 +73,7 @@ def __init__( If None, all losses are weighted equally. by default None. available_scalers : dict[str, TENSOR_SPEC] | None, optional - Scaler tensors already filtered by the top-level CombinedLoss configuration. - These are passed down to child losses when present. + All scaler tensors available. Passed through to child losses. data_indices : IndexCollection | None, optional Training data indices needed by child losses that perform variable mapping. kwargs: Any @@ -97,7 +86,6 @@ def __init__( loss_weights=(1.0,), ) CombinedLoss.add_scaler(name = 'scaler_1', ...) - # Only added to the `MSELoss` if specified in it's `scalers`. -------- >>> CombinedLoss( losses = [anemoi.training.losses.MSELoss], @@ -110,28 +98,16 @@ def __init__( _target_: anemoi.training.losses.combined.CombinedLoss losses: - _target_: anemoi.training.losses.MSELoss - - _target_: anemoi.training.losses.MAELoss - scalers: ['*'] - loss_weights: [1.0, 0.6] - # All scalers passed to this class will be added to each underlying loss - ``` - - ``` - training_loss: - _target_: anemoi.training.losses.combined.CombinedLoss - losses: - - _target_: anemoi.training.losses.MSELoss - scalers: ['variable'] + scalers: ['variable', 'node_weights'] - _target_: anemoi.training.losses.MAELoss scalers: ['loss_weights_mask'] - scalers: ['*'] - # Only the specified scalers will be added to each loss + loss_weights: [1.0, 0.6] + # Each child loss specifies its own scalers ``` """ super().__init__() self.losses: list[type[BaseLoss]] = [] - self._loss_scaler_specification: dict[int, list[str]] = {} losses = (*(losses or []), *extra_losses) if loss_weights is None: @@ -143,11 +119,6 @@ def __init__( for i, loss in enumerate(losses): if isinstance(loss, DictConfig | dict): loss_config = dict(loss) - scaler_spec = loss_config.pop("scalers", ["*"]) - self._loss_scaler_specification[i] = scaler_spec - # Only propagate scaler declarations when explicitly provided. - if available_scalers: - loss_config["scalers"] = scaler_spec self.losses.append( get_loss_function( DictConfig(loss_config), @@ -157,14 +128,12 @@ def __init__( ), ) elif isinstance(loss, type): - self._loss_scaler_specification[i] = ["*"] self.losses.append(loss(**kwargs)) else: assert isinstance(loss, BaseLoss) - self._loss_scaler_specification[i] = loss.scaler self.losses.append(loss) - self.add_module(str(i), self.losses[-1]) # (self.losses[-1].name + str(i), self.losses[-1]) + self.add_module(str(i), self.losses[-1]) self.loss_weights = loss_weights del self.scaler # Remove scaler property from parent class, as it is not used here @@ -223,15 +192,13 @@ def forward( @functools.wraps(ScaleTensor.add_scaler, assigned=("__doc__", "__annotations__")) def add_scaler(self, dimension: int | tuple[int], scaler: torch.Tensor, *, name: str | None = None) -> None: - for i, spec in self._loss_scaler_specification.items(): - if "*" in spec or name in spec: - self.losses[i].add_scaler(dimension=dimension, scaler=scaler, name=name) + for loss in self.losses: + loss.add_scaler(dimension=dimension, scaler=scaler, name=name) @functools.wraps(ScaleTensor.update_scaler, assigned=("__doc__", "__annotations__")) def update_scaler(self, name: str, scaler: torch.Tensor, *, override: bool = False) -> None: - for i, spec in self._loss_scaler_specification.items(): - if "*" in spec or name in spec: - self.losses[i].update_scaler(name=name, scaler=scaler, override=override) + for loss in self.losses: + loss.update_scaler(name=name, scaler=scaler, override=override) def has_scaler_for_dim(self, dim: TensorDim) -> bool: return any(loss.has_scaler_for_dim(dim=dim) for loss in self.losses) diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py index e3dbfca0c1..f2ee9e4669 100644 --- a/training/src/anemoi/training/losses/loss.py +++ b/training/src/anemoi/training/losses/loss.py @@ -196,6 +196,13 @@ def get_loss_function( scalers_to_include = [s for s in list(scalers.keys()) if f"!{s}" not in scalers_to_include] available_scalers = _filter_scalers(scalers_to_include, scalers) if has_scalers_config else None + # If the target class requests AVAILABLE_SCALERS (e.g. CombinedLoss), always + # pass the full unfiltered scalers so child losses can control their own. + if ( + hasattr(target_cls, "factory_context_keys") + and LossFactoryContextKey.AVAILABLE_SCALERS in target_cls.factory_context_keys + ): + available_scalers = scalers factory_context = LossFactoryContext( available_scalers=available_scalers, data_indices=data_indices, diff --git a/training/src/anemoi/training/losses/utils.py b/training/src/anemoi/training/losses/utils.py index 340a9591c9..9c057410ea 100644 --- a/training/src/anemoi/training/losses/utils.py +++ b/training/src/anemoi/training/losses/utils.py @@ -75,7 +75,10 @@ def print_variable_scaling(loss: BaseLoss, data_indices: IndexCollection) -> dic log_text = f"Final Variable Scaling in {loss.__class__.__name__}: " scaling_values, scaling_sum = {}, 0.0 for idx, name in subset_vars: - value = float(variable_scaling[idx]) + if idx < variable_scaling.shape[0]: + value = float(variable_scaling[idx]) + else: + value = 1.0 log_text += f"{name}: {value:.4g}, " scaling_values[name] = value scaling_sum += value From eb6a41c028ac56d6d90b4babaf3d3044562cb287 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Wed, 13 May 2026 14:43:33 +0000 Subject: [PATCH 68/88] update tests --- .../ensemble_multiscale_aggregation.yaml | 1 - .../training_loss/single_MSE_aggregation.yaml | 1 - .../anemoi/training/losses/variable_mapper.py | 5 +-- .../src/anemoi/training/schemas/training.py | 32 ++++++------------- .../tests/unit/losses/test_combined_loss.py | 12 +++---- .../unit/schemas/test_training_schemas.py | 2 -- 6 files changed, 16 insertions(+), 37 deletions(-) diff --git a/training/src/anemoi/training/config/training/training_loss/ensemble_multiscale_aggregation.yaml b/training/src/anemoi/training/config/training/training_loss/ensemble_multiscale_aggregation.yaml index 3aeb90fd53..7a9ed22e92 100644 --- a/training/src/anemoi/training/config/training/training_loss/ensemble_multiscale_aggregation.yaml +++ b/training/src/anemoi/training/config/training/training_loss/ensemble_multiscale_aggregation.yaml @@ -1,7 +1,6 @@ datasets: data: _target_: anemoi.training.losses.combined.CombinedLoss - scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights', 'time_steps'] ignore_nans: False # loss_weights: [n_timesteps / (n_timesteps + n_agg_ops), n_agg_ops / (n_timesteps + n_agg_ops)] # Each sub-loss averages internally (raw over timesteps, aggregate over agg ops). diff --git a/training/src/anemoi/training/config/training/training_loss/single_MSE_aggregation.yaml b/training/src/anemoi/training/config/training/training_loss/single_MSE_aggregation.yaml index 364ac12178..665184f140 100644 --- a/training/src/anemoi/training/config/training/training_loss/single_MSE_aggregation.yaml +++ b/training/src/anemoi/training/config/training/training_loss/single_MSE_aggregation.yaml @@ -1,7 +1,6 @@ datasets: data: _target_: anemoi.training.losses.combined.CombinedLoss - scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] ignore_nans: False # loss_weights: [n_timesteps / (n_timesteps + n_agg_ops), n_agg_ops / (n_timesteps + n_agg_ops)] # Each sub-loss averages internally (raw over timesteps, aggregate over agg ops). diff --git a/training/src/anemoi/training/losses/variable_mapper.py b/training/src/anemoi/training/losses/variable_mapper.py index 4cafba754c..fca36579d6 100644 --- a/training/src/anemoi/training/losses/variable_mapper.py +++ b/training/src/anemoi/training/losses/variable_mapper.py @@ -304,7 +304,7 @@ def forward( without_scalers: list[str] | list[int] | None = None, grid_shard_slice: slice | None = None, group: ProcessGroup | None = None, - squash_mode: str = "avg", + squash_mode: str | None = None, pred_layout: IndexSpace | str | None = None, target_layout: IndexSpace | str | None = None, **kwargs, @@ -347,9 +347,10 @@ def forward( "without_scalers": without_scalers, "grid_shard_slice": grid_shard_slice, "group": group, - "squash_mode": squash_mode, }, ) + if squash_mode is not None: + loss_kwargs["squash_mode"] = squash_mode empty_metric_selection = False if isinstance(scaler_indices, tuple): diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index d6c84b37a6..bd36886503 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -252,7 +252,6 @@ class ImplementedLossesUsingBaseLossSchema(StrEnum): mae = "anemoi.training.losses.MAELoss" logcosh = "anemoi.training.losses.LogCoshLoss" huber = "anemoi.training.losses.HuberLoss" - combined = "anemoi.training.losses.combined.CombinedLoss" fcl = "anemoi.training.losses.spectral.FourierCorrelationLoss" lsd = "anemoi.training.losses.spectral.LogSpectralDistance" logfft2d = "anemoi.training.losses.spectral.LogFFT2Distance" @@ -418,9 +417,15 @@ class Config(BaseModel.Config): extra = "allow" -class CombinedLossSchema(BaseLossSchema): - scalers: list[str] = Field(default_factory=list) - "Scalers applied at the combined-loss level; sub-losses define their own scalers." +class CombinedLossSchema(BaseModel): + """Schema for CombinedLoss. Does not accept scalers; each child loss defines its own.""" + + model_config = ConfigDict(extra="forbid", populate_by_name=True) + + target_: Literal["anemoi.training.losses.combined.CombinedLoss"] = Field(..., alias="_target_") + "CombinedLoss target." + ignore_nans: bool = False + "Allow nans in the loss and apply methods ignoring nans for measuring the loss." losses: list[ BaseLossSchema | AlmostFairKernelCRPSSchema @@ -433,25 +438,6 @@ class CombinedLossSchema(BaseLossSchema): loss_weights: list[int | float] | None = None "Weightings of losses, if not set, all losses are weighted equally." - @field_validator("losses", mode="before") - @classmethod - def add_empty_scalers(cls, losses: Any) -> Any: - """Add empty scalers to loss functions, as scalers can be set at top level.""" - from omegaconf import DictConfig - from omegaconf.omegaconf import open_dict - - for loss in losses: - target = loss.get("_target_", "") if hasattr(loss, "get") else "" - if "MultiscaleLossWrapper" in str(target): - continue - if "scalers" not in loss: - if isinstance(loss, DictConfig): - with open_dict(loss): - loss["scalers"] = [] - else: - loss["scalers"] = [] - return losses - @model_validator(mode="after") def check_length_of_weights_and_losses(self) -> Self: """Check that the number of losses and weights match, or if not set, skip.""" diff --git a/training/tests/unit/losses/test_combined_loss.py b/training/tests/unit/losses/test_combined_loss.py index 12001706b4..36a05d98b8 100644 --- a/training/tests/unit/losses/test_combined_loss.py +++ b/training/tests/unit/losses/test_combined_loss.py @@ -44,10 +44,9 @@ def test_combined_loss() -> None: { "_target_": "anemoi.training.losses.CombinedLoss", "losses": [ - {"_target_": "anemoi.training.losses.MSELoss"}, - {"_target_": "anemoi.training.losses.MAELoss"}, + {"_target_": "anemoi.training.losses.MSELoss", "scalers": ["test"]}, + {"_target_": "anemoi.training.losses.MAELoss", "scalers": ["test"]}, ], - "scalers": ["test"], "loss_weights": [1.0, 0.5], }, ), @@ -68,10 +67,9 @@ def test_combined_loss_invalid_loss_weights() -> None: { "_target_": "anemoi.training.losses.combined.CombinedLoss", "losses": [ - {"_target_": "anemoi.training.losses.MSELoss"}, - {"_target_": "anemoi.training.losses.MAELoss"}, + {"_target_": "anemoi.training.losses.MSELoss", "scalers": ["test"]}, + {"_target_": "anemoi.training.losses.MAELoss", "scalers": ["test"]}, ], - "scalers": ["test"], "loss_weights": [1.0, 0.5, 1], }, ), @@ -106,7 +104,6 @@ def test_combined_loss_seperate_scalers() -> None: {"_target_": "anemoi.training.losses.MSELoss", "scalers": ["test"]}, {"_target_": "anemoi.training.losses.MAELoss", "scalers": ["test2"]}, ], - "scalers": ["test", "test2"], "loss_weights": [1.0, 0.5], }, ), @@ -208,7 +205,6 @@ def test_combined_loss_with_filtered_target_only_subloss_preserves_scaler_remapp }, ], "loss_weights": [1.0, 0.5], - "scalers": ["*"], }, ), scalers={ diff --git a/training/tests/unit/schemas/test_training_schemas.py b/training/tests/unit/schemas/test_training_schemas.py index a0b6e72be6..81a9253dc0 100644 --- a/training/tests/unit/schemas/test_training_schemas.py +++ b/training/tests/unit/schemas/test_training_schemas.py @@ -154,7 +154,6 @@ def test_multiscale_loss_deprecated_loss_matrices_path_with_on_the_fly_config_re _COMBINED_LOSS_BASE = { "_target_": "anemoi.training.losses.combined.CombinedLoss", - "scalers": [], } @@ -162,7 +161,6 @@ def test_combined_loss_with_scalers_valid() -> None: CombinedLossSchema( **{ **_COMBINED_LOSS_BASE, - "scalers": ["*"], "losses": [ {"_target_": "anemoi.training.losses.MSELoss", "scalers": ["nan_mask_weights"]}, {"_target_": "anemoi.training.losses.MAELoss", "scalers": ["nan_mask_weights"]}, From 4a62954435082f02dfe7556858131c79ffe027be Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 15:05:33 +0000 Subject: [PATCH 69/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- training/src/anemoi/training/schemas/training.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 3fcf915c40..8b37ea0130 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -421,7 +421,14 @@ class CombinedLossSchema(BaseModel): "CombinedLoss target." ignore_nans: bool = False "Allow nans in the loss and apply methods ignoring nans for measuring the loss." - losses: list[MultiScaleLossSchema | TimeAggregateLossWrapperSchema | SpectralLossSchema | CRPSSchema | HuberLossSchema | BaseLossSchema] = Field( + losses: list[ + MultiScaleLossSchema + | TimeAggregateLossWrapperSchema + | SpectralLossSchema + | CRPSSchema + | HuberLossSchema + | BaseLossSchema + ] = Field( min_length=1, ) "Losses to combine, can be any of the normal losses." From aaff2972ddb8b380d09fbd001a42be65c5eefd83 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Wed, 13 May 2026 15:11:41 +0000 Subject: [PATCH 70/88] fix failing tests --- training/src/anemoi/training/losses/loss.py | 5 +++-- training/src/anemoi/training/losses/utils.py | 5 +---- training/tests/unit/losses/test_aggregate_loss.py | 10 +++++----- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py index f2ee9e4669..f0155465dd 100644 --- a/training/src/anemoi/training/losses/loss.py +++ b/training/src/anemoi/training/losses/loss.py @@ -157,8 +157,9 @@ def get_loss_function( target_variables = loss_config.pop("target_variables", None) graph_extra = {"data_node_name": data_node_name} if data_node_name is not None else {} + target = loss_config.get("_target_") - if "_target_" in loss_config and loss_config["_target_"] in NESTED_LOSSES: + if target in NESTED_LOSSES: per_scale_loss_config = loss_config.pop("per_scale_loss") per_scale_loss = get_loss_function( OmegaConf.create(per_scale_loss_config), @@ -175,7 +176,7 @@ def get_loss_function( **_graph_data_kwargs(target_cls, graph_data, graph_extra), ) - if "_target_" in loss_config and loss_config["_target_"] in WRAPPED_LOSSES: + if target in WRAPPED_LOSSES: inner_loss_config = loss_config.pop("loss_fn") inner_loss = get_loss_function(OmegaConf.create(inner_loss_config), scalers, data_indices) wrapper = instantiate(loss_config, loss_fn=inner_loss) diff --git a/training/src/anemoi/training/losses/utils.py b/training/src/anemoi/training/losses/utils.py index 9c057410ea..b62725c630 100644 --- a/training/src/anemoi/training/losses/utils.py +++ b/training/src/anemoi/training/losses/utils.py @@ -75,10 +75,7 @@ def print_variable_scaling(loss: BaseLoss, data_indices: IndexCollection) -> dic log_text = f"Final Variable Scaling in {loss.__class__.__name__}: " scaling_values, scaling_sum = {}, 0.0 for idx, name in subset_vars: - if idx < variable_scaling.shape[0]: - value = float(variable_scaling[idx]) - else: - value = 1.0 + value = float(variable_scaling[idx]) if idx < variable_scaling.shape[0] else 1.0 log_text += f"{name}: {value:.4g}, " scaling_values[name] = value scaling_sum += value diff --git a/training/tests/unit/losses/test_aggregate_loss.py b/training/tests/unit/losses/test_aggregate_loss.py index f34272c7c9..39048310b3 100644 --- a/training/tests/unit/losses/test_aggregate_loss.py +++ b/training/tests/unit/losses/test_aggregate_loss.py @@ -12,7 +12,7 @@ from anemoi.training.losses.aggregate import TimeAggregateLossWrapper from anemoi.training.losses.base import BaseLoss -from anemoi.training.losses.kcrps import AlmostFairKernelCRPS +from anemoi.training.losses.kcrps import CRPS from anemoi.training.losses.mae import MAELoss from anemoi.training.losses.multiscale import MultiscaleLossWrapper from anemoi.training.utils.enums import TensorDim @@ -29,9 +29,9 @@ def _make_loss() -> MAELoss: return loss -def _make_crps_loss() -> AlmostFairKernelCRPS: - """Return an AlmostFairKernelCRPS loss with a unit grid scaler (4 grid points).""" - loss = AlmostFairKernelCRPS(no_autocast=False) +def _make_crps_loss() -> CRPS: + """Return a CRPS loss with a unit grid scaler (4 grid points).""" + loss = CRPS(no_autocast=False) loss.add_scaler(TensorDim.GRID, torch.ones(4), name="unit_grid") return loss @@ -178,7 +178,7 @@ def test_reduction_aggregation_reduces_time_dim(agg_op: str) -> None: @pytest.mark.parametrize("agg_op", ["mean", "min", "max", "diff"]) def test_crps_returns_scalar_tensor(agg_op: str) -> None: - """TimeAggregateLossWrapper with AlmostFairKernelCRPS should return a scalar for each agg type.""" + """TimeAggregateLossWrapper with CRPS should return a scalar for each agg type.""" pred = torch.rand(BS, TIME, ENS_CRPS, LATLON, NVAR) target = torch.rand(BS, TIME, LATLON, NVAR) wrapper = TimeAggregateLossWrapper([agg_op], _make_crps_loss()) From f0643acd0169fde0ca520b31257b38413cc0b076 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Wed, 13 May 2026 15:17:39 +0000 Subject: [PATCH 71/88] pre commit hook --- training/src/anemoi/training/losses/loss.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py index f0155465dd..81d60ca5e1 100644 --- a/training/src/anemoi/training/losses/loss.py +++ b/training/src/anemoi/training/losses/loss.py @@ -190,8 +190,7 @@ def get_loss_function( _apply_scalers(wrapper, resolved, scalers, data_indices) return wrapper - if scalers is None: - scalers = {} + scalers = scalers or {} if "*" in scalers_to_include: scalers_to_include = [s for s in list(scalers.keys()) if f"!{s}" not in scalers_to_include] From 5c409a3842dc4f8372b12cf923158f101967633e Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 14 May 2026 12:42:02 +0000 Subject: [PATCH 72/88] update behaviour --- .../src/anemoi/training/losses/combined.py | 1 - training/src/anemoi/training/losses/loss.py | 8 ++++ .../src/anemoi/training/schemas/training.py | 42 +++++++++++++++++-- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/training/src/anemoi/training/losses/combined.py b/training/src/anemoi/training/losses/combined.py index 80a5cd1907..8db71d1ab9 100644 --- a/training/src/anemoi/training/losses/combined.py +++ b/training/src/anemoi/training/losses/combined.py @@ -124,7 +124,6 @@ def __init__( DictConfig(loss_config), scalers=available_scalers, data_indices=data_indices, - **dict(kwargs), ), ) elif isinstance(loss, type): diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py index 81d60ca5e1..ddb33f15cb 100644 --- a/training/src/anemoi/training/losses/loss.py +++ b/training/src/anemoi/training/losses/loss.py @@ -159,6 +159,14 @@ def get_loss_function( graph_extra = {"data_node_name": data_node_name} if data_node_name is not None else {} target = loss_config.get("_target_") + # For CombinedLoss, propagate parent scalers to sub-losses that don't specify their own. + if "CombinedLoss" in (target or "") and scalers_to_include: + for sub_loss in loss_config.get("losses", []): + if isinstance(sub_loss, dict) and "scalers" not in sub_loss: + # MultiscaleLossWrapper manages scalers on per_scale_loss, not at top level + if "MultiscaleLossWrapper" not in sub_loss.get("_target_", ""): + sub_loss["scalers"] = list(scalers_to_include) + if target in NESTED_LOSSES: per_scale_loss_config = loss_config.pop("per_scale_loss") per_scale_loss = get_loss_function( diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 8b37ea0130..32b8834a72 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -262,8 +262,8 @@ class ImplementedLossesUsingBaseLossSchema(StrEnum): class BaseLossSchema(BaseModel): target_: ImplementedLossesUsingBaseLossSchema = Field(..., alias="_target_") "Loss function object from anemoi.training.losses." - scalers: list[str] = Field(example=["variable"]) # TODO(Mario): Validate scalers are defined - "Scalers to include in loss calculation" + scalers: list[str] = Field(default_factory=list, example=["variable"]) + "Scalers to include in loss calculation. Defaults to empty (no scaling)." ignore_nans: bool = False "Allow nans in the loss and apply methods ignoring nans for measuring the loss." predicted_variables: list[str] | None = None @@ -413,12 +413,18 @@ class Config(BaseModel.Config): class CombinedLossSchema(BaseModel): - """Schema for CombinedLoss. Does not accept scalers; each child loss defines its own.""" + """Schema for CombinedLoss. + + Top-level ``scalers`` act as defaults for sub-losses that don't specify their own. + Sub-losses that explicitly set ``scalers`` override the parent value. + """ model_config = ConfigDict(extra="forbid", populate_by_name=True) target_: Literal["anemoi.training.losses.combined.CombinedLoss"] = Field(..., alias="_target_") "CombinedLoss target." + scalers: list[str] = Field(default_factory=list) + "Default scalers propagated to sub-losses that don't specify their own." ignore_nans: bool = False "Allow nans in the loss and apply methods ignoring nans for measuring the loss." losses: list[ @@ -435,6 +441,36 @@ class CombinedLossSchema(BaseModel): loss_weights: list[int | float] | None = None "Weightings of losses, if not set, all losses are weighted equally." + @model_validator(mode="before") + @classmethod + def propagate_scalers_to_children(cls, data: Any) -> Any: + """Propagate parent scalers to sub-losses that don't specify their own. + + MultiscaleLossWrapper is skipped because it manages scalers via per_scale_loss. + """ + from omegaconf import DictConfig + from omegaconf.omegaconf import open_dict + + parent_scalers = data.get("scalers", []) if hasattr(data, "get") else [] + if not parent_scalers: + return data + + losses = data.get("losses", []) if hasattr(data, "get") else [] + for loss in losses: + if not hasattr(loss, "get"): + continue + target = loss.get("_target_", "") + # MultiscaleLossWrapper manages scalers on per_scale_loss, not at top level + if "MultiscaleLossWrapper" in str(target): + continue + if "scalers" not in loss: + if isinstance(loss, DictConfig): + with open_dict(loss): + loss["scalers"] = list(parent_scalers) + elif isinstance(loss, dict): + loss["scalers"] = list(parent_scalers) + return data + @model_validator(mode="after") def check_length_of_weights_and_losses(self) -> Self: """Check that the number of losses and weights match, or if not set, skip.""" From 4427846e58f1be447a69b2cebbfd56e3c06d834a Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 14 May 2026 12:44:59 +0000 Subject: [PATCH 73/88] fix pre commit --- training/src/anemoi/training/losses/loss.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py index ddb33f15cb..ec8224d0ff 100644 --- a/training/src/anemoi/training/losses/loss.py +++ b/training/src/anemoi/training/losses/loss.py @@ -106,6 +106,17 @@ def _extract_constructor_context( return context.for_loss_class(get_class(target)) +def _propagate_combined_scalers(loss_config: dict, scalers_to_include: list) -> None: + """Propagate parent scalers to CombinedLoss sub-losses that don't specify their own.""" + for sub_loss in loss_config.get("losses", []): + if ( + isinstance(sub_loss, dict) + and "scalers" not in sub_loss + and "MultiscaleLossWrapper" not in sub_loss.get("_target_", "") + ): + sub_loss["scalers"] = list(scalers_to_include) + + # Future import breaks other type hints TODO Harrison Cook def get_loss_function( config: DictConfig, @@ -161,11 +172,7 @@ def get_loss_function( # For CombinedLoss, propagate parent scalers to sub-losses that don't specify their own. if "CombinedLoss" in (target or "") and scalers_to_include: - for sub_loss in loss_config.get("losses", []): - if isinstance(sub_loss, dict) and "scalers" not in sub_loss: - # MultiscaleLossWrapper manages scalers on per_scale_loss, not at top level - if "MultiscaleLossWrapper" not in sub_loss.get("_target_", ""): - sub_loss["scalers"] = list(scalers_to_include) + _propagate_combined_scalers(loss_config, scalers_to_include) if target in NESTED_LOSSES: per_scale_loss_config = loss_config.pop("per_scale_loss") From df2098eb703ed221d7de4666fd8ac754c6f709c1 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 14 May 2026 12:47:56 +0000 Subject: [PATCH 74/88] fix tests --- .../src/anemoi/training/losses/combined.py | 2 ++ training/src/anemoi/training/losses/loss.py | 34 ++++++++++++------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/training/src/anemoi/training/losses/combined.py b/training/src/anemoi/training/losses/combined.py index 8db71d1ab9..4b645b6e55 100644 --- a/training/src/anemoi/training/losses/combined.py +++ b/training/src/anemoi/training/losses/combined.py @@ -124,6 +124,8 @@ def __init__( DictConfig(loss_config), scalers=available_scalers, data_indices=data_indices, + graph_data=kwargs.get("graph_data"), + data_node_name=kwargs.get("data_node_name"), ), ) elif isinstance(loss, type): diff --git a/training/src/anemoi/training/losses/loss.py b/training/src/anemoi/training/losses/loss.py index ec8224d0ff..9d5bbd83bd 100644 --- a/training/src/anemoi/training/losses/loss.py +++ b/training/src/anemoi/training/losses/loss.py @@ -117,6 +117,27 @@ def _propagate_combined_scalers(loss_config: dict, scalers_to_include: list) -> sub_loss["scalers"] = list(scalers_to_include) +def _build_wrapped_loss( + loss_config: dict, + scalers_to_include: list, + scalers: dict[str, TENSOR_SPEC] | None, + data_indices: "IndexCollection | None", +) -> BaseLoss: + """Instantiate a WRAPPED_LOSSES target (e.g. TimeAggregateLossWrapper).""" + inner_loss_config = loss_config.pop("loss_fn") + inner_loss = get_loss_function(OmegaConf.create(inner_loss_config), scalers, data_indices) + wrapper = instantiate(loss_config, loss_fn=inner_loss) + # Apply any scalers specified on the wrapper itself (delegated to the inner loss). + if scalers_to_include and scalers: + resolved = ( + [s for s in scalers if f"!{s}" not in scalers_to_include] + if "*" in scalers_to_include + else list(scalers_to_include) + ) + _apply_scalers(wrapper, resolved, scalers, data_indices) + return wrapper + + # Future import breaks other type hints TODO Harrison Cook def get_loss_function( config: DictConfig, @@ -192,18 +213,7 @@ def get_loss_function( ) if target in WRAPPED_LOSSES: - inner_loss_config = loss_config.pop("loss_fn") - inner_loss = get_loss_function(OmegaConf.create(inner_loss_config), scalers, data_indices) - wrapper = instantiate(loss_config, loss_fn=inner_loss) - # Apply any scalers specified on the wrapper itself (delegated to the inner loss). - if scalers_to_include and scalers: - resolved = ( - [s for s in scalers if f"!{s}" not in scalers_to_include] - if "*" in scalers_to_include - else list(scalers_to_include) - ) - _apply_scalers(wrapper, resolved, scalers, data_indices) - return wrapper + return _build_wrapped_loss(loss_config, scalers_to_include, scalers, data_indices) scalers = scalers or {} From 056d0477593be462122ef7fea7f89f4a9818ffd5 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 14 May 2026 16:27:36 +0000 Subject: [PATCH 75/88] add per timestep callback --- .../callbacks/per_timestep_metrics.py | 141 ++++++++++ .../training/diagnostics/callbacks/plot.py | 3 +- .../callbacks/test_per_timestep_metrics.py | 246 ++++++++++++++++++ 3 files changed, 389 insertions(+), 1 deletion(-) create mode 100644 training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py create mode 100644 training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py diff --git a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py new file mode 100644 index 0000000000..dfc58ec266 --- /dev/null +++ b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py @@ -0,0 +1,141 @@ +# (C) Copyright 2024 Anemoi contributors. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities +# granted to it by virtue of its status as an intergovernmental organisation +# nor does it submit to any jurisdiction. + +"""Callback to log per-timestep validation metrics for temporal downscaling tasks.""" + +import logging +from contextlib import nullcontext + +import pytorch_lightning as pl +import torch +from pytorch_lightning.callbacks import Callback + +from anemoi.training.losses.base import BaseLoss +from anemoi.training.utils.enums import TensorDim + +LOGGER = logging.getLogger(__name__) + + +class PerTimestepMetrics(Callback): + """Log validation metrics broken down by output timestep. + + For tasks where the model predicts multiple + output timesteps at once, this callback slices predictions and targets + along the time dimension and logs per-timestep validation metrics. + + Parameters + ---------- + every_n_batches : int + Frequency of per-timestep evaluation (runs every N validation batches). + Default is 1 (every batch). + """ + + def __init__(self, every_n_batches: int = 1) -> None: + super().__init__() + self.every_n_batches = every_n_batches + + def on_validation_batch_end( + self, + trainer: pl.Trainer, + pl_module: pl.LightningModule, + outputs: list, + batch: dict[str, torch.Tensor], + batch_idx: int, + ) -> None: + if batch_idx % self.every_n_batches != 0: + return + + precision_mapping = { + "16-mixed": torch.float16, + "bf16-mixed": torch.bfloat16, + } + prec = trainer.precision + dtype = precision_mapping.get(prec) + + context = ( + torch.autocast(device_type=next(iter(batch.values())).device.type, dtype=dtype) + if dtype is not None + else nullcontext() + ) + + with context, torch.no_grad(): + self._eval_per_timestep(pl_module, batch) + + def _eval_per_timestep(self, pl_module: pl.LightningModule, batch: dict[str, torch.Tensor]) -> None: + """Run model and compute metrics per timestep.""" + # Get inputs and targets via the task + x = pl_module.task.get_inputs(batch, data_indices=pl_module.data_indices) + x = pl_module._expand_ens_dim(x) + + # Run model forward + y_pred = pl_module(x) + + # Get targets + y_full = pl_module.task.get_targets(batch) + y = pl_module._collapse_ens_dim(y_full) + + batch_size = next(iter(batch.values())).shape[0] + + # For each dataset, compute per-timestep metrics + for dataset_name in y_pred: + pred = y_pred[dataset_name] # (bs, time, ens, grid, var) + target = y[dataset_name] # (bs, time, grid, var) + + n_timesteps = target.shape[TensorDim.TIME] + + # Gather ensemble members across the ensemble comm group + if hasattr(pl_module, "ens_comm_subgroup") and pl_module.ens_comm_subgroup is not None: + from anemoi.training.distributed.primitives import gather_tensor + + pred = gather_tensor( + pred.clone(), + dim=TensorDim.ENSEMBLE_DIM, + sizes=[pred.size(TensorDim.ENSEMBLE_DIM)] * pl_module.ens_comm_subgroup_size, + mgroup=pl_module.ens_comm_subgroup, + ) + + # Post-process for metrics (in physical space) + post_processor = pl_module.model.post_processors[dataset_name] + metrics_dict = pl_module.metrics[dataset_name] + val_metric_ranges = pl_module.val_metric_ranges[dataset_name] + grid_shard_slice = pl_module.grid_shard_slice.get(dataset_name) + + for t in range(n_timesteps): + # Slice single timestep: remove time dim + pred_t = pred[:, t : t + 1, :, :, :] # keep time dim for post-processor + target_t = target[:, t : t + 1, :, :] + + pred_t_post = post_processor(pred_t, in_place=False) + target_t_post = post_processor(target_t, in_place=False) + + for metric_name, metric in metrics_dict.items(): + if not isinstance(metric, BaseLoss): + continue + + for mkey, indices in val_metric_ranges.items(): + step_name = f"val_{metric_name}_metric/{dataset_name}/{mkey}/t_{t + 1}" + + metric_kwargs = { + "scaler_indices": (..., indices), + "grid_shard_slice": grid_shard_slice, + "group": pl_module.model_comm_group, + } + + value = metric(pred_t_post, target_t_post, **metric_kwargs) + + pl_module.log( + step_name, + value, + on_epoch=True, + on_step=False, + prog_bar=False, + logger=pl_module.logger_enabled, + batch_size=batch_size, + sync_dist=True, + ) diff --git a/training/src/anemoi/training/diagnostics/callbacks/plot.py b/training/src/anemoi/training/diagnostics/callbacks/plot.py index 1f41724044..7a924244d8 100644 --- a/training/src/anemoi/training/diagnostics/callbacks/plot.py +++ b/training/src/anemoi/training/diagnostics/callbacks/plot.py @@ -696,7 +696,8 @@ def _plot( parameter_positions = list[int](data_indices.model.output.name_to_index.values()) # reorder parameter_names by position parameter_names = [parameter_names[i] for i in np.argsort(parameter_positions)] - metadata_variables = pl_module.model.metadata["dataset"].get("variables_metadata") + metadata = pl_module.model.metadata + metadata_variables = metadata["dataset"].get("variables_metadata") if metadata is not None else None # Sort the list using the custom key argsort_indices = argsort_variablename_variablelevel( diff --git a/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py b/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py new file mode 100644 index 0000000000..aec09bfcce --- /dev/null +++ b/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py @@ -0,0 +1,246 @@ +# (C) Copyright 2024 Anemoi contributors. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities +# granted to it by virtue of its status as an intergovernmental organisation +# nor does it submit to any jurisdiction. + +"""Tests for PerTimestepMetrics callback.""" + +from unittest.mock import MagicMock +from unittest.mock import patch + +import pytest +import torch + +from anemoi.training.diagnostics.callbacks.per_timestep_metrics import PerTimestepMetrics +from anemoi.training.losses.base import BaseLoss + + +BS = 2 +TIME = 6 +ENS = 4 +GRID = 16 +NVAR = 3 + + +@pytest.fixture +def callback(): + return PerTimestepMetrics(every_n_batches=1) + + +@pytest.fixture +def callback_every_2(): + return PerTimestepMetrics(every_n_batches=2) + + +class FakeLoss(BaseLoss): + """Minimal BaseLoss subclass for testing.""" + + def __init__(self): + super().__init__() + # Provide a minimal scaler so has_scaler_for_dim works + from anemoi.training.losses.base import ScalerData + + self._scaler = ScalerData() + + def forward(self, y_pred, y, **kwargs): + return torch.tensor(1.0) + + @property + def name(self) -> str: + return "fake" + + +def _make_pl_module(n_timesteps=TIME, n_ens=ENS, n_grid=GRID, n_var=NVAR): + """Create a mocked pl_module with the attributes needed by the callback.""" + pl_module = MagicMock() + + # Predictions: (bs, time, ens, grid, var) + pred = torch.randn(BS, n_timesteps, n_ens, n_grid, n_var) + # Targets: (bs, time, grid, var) + target = torch.randn(BS, n_timesteps, n_grid, n_var) + + # task.get_inputs returns input dict + pl_module.task.get_inputs.return_value = {"data": torch.randn(BS, 2, n_grid, n_var)} + pl_module._expand_ens_dim.return_value = {"data": torch.randn(BS, 2, n_ens, n_grid, n_var)} + + # model forward returns predictions + pl_module.__call__ = MagicMock(return_value={"data": pred}) + pl_module.return_value = {"data": pred} + + # task.get_targets returns targets + y_full = {"data": target.unsqueeze(2)} # add ens dim for _collapse_ens_dim + pl_module.task.get_targets.return_value = y_full + pl_module._collapse_ens_dim.return_value = {"data": target} + + # No ensemble comm group (single GPU case) + pl_module.ens_comm_subgroup = None + + # Post-processor: identity + pl_module.model.post_processors = {"data": lambda x, in_place=False: x} + + # Metrics + fake_loss = FakeLoss() + pl_module.metrics = {"data": {"fkcrps": fake_loss}} + + # Variable groups: 2 groups + pl_module.val_metric_ranges = { + "data": { + "pl": torch.arange(0, 2), + "sfc": torch.arange(2, 3), + }, + } + + # Grid shard slice + pl_module.grid_shard_slice = {"data": None} + + # Model comm group + pl_module.model_comm_group = None + + # Logger enabled + pl_module.logger_enabled = True + + # data_indices + pl_module.data_indices = MagicMock() + + return pl_module + + +def _make_trainer(precision="32-true"): + trainer = MagicMock() + trainer.precision = precision + return trainer + + +def _make_batch(n_timesteps=TIME): + """Create a batch dict with the expected structure.""" + # batch contains input + output timesteps (typically input=2, output=TIME) + total_steps = 2 + n_timesteps + return {"data": torch.randn(BS, total_steps, GRID, NVAR)} + + +class TestPerTimestepMetrics: + def test_init_default(self): + cb = PerTimestepMetrics() + assert cb.every_n_batches == 1 + + def test_init_custom(self): + cb = PerTimestepMetrics(every_n_batches=5) + assert cb.every_n_batches == 5 + + def test_skips_non_matching_batch(self, callback_every_2): + """Callback should skip batches that don't match every_n_batches.""" + trainer = _make_trainer() + pl_module = _make_pl_module() + batch = _make_batch() + + # batch_idx=1 should be skipped (1 % 2 != 0) + callback_every_2.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=1) + pl_module.task.get_inputs.assert_not_called() + + def test_runs_on_matching_batch(self, callback_every_2): + """Callback should run on batches matching every_n_batches.""" + trainer = _make_trainer() + pl_module = _make_pl_module() + batch = _make_batch() + + callback_every_2.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=0) + pl_module.task.get_inputs.assert_called_once() + + def test_logs_per_timestep_metrics(self, callback): + """Callback should log metrics for each timestep and variable group.""" + trainer = _make_trainer() + pl_module = _make_pl_module() + batch = _make_batch() + + callback.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=0) + + # Should have logged: TIME timesteps * 2 var groups * 1 metric = 12 calls + assert pl_module.log.call_count == TIME * 2 + + # Check metric names + logged_names = [call.args[0] for call in pl_module.log.call_args_list] + for t in range(1, TIME + 1): + assert f"val_fkcrps_metric/data/pl/t_{t}" in logged_names + assert f"val_fkcrps_metric/data/sfc/t_{t}" in logged_names + + def test_log_kwargs(self, callback): + """Check that log is called with correct kwargs.""" + trainer = _make_trainer() + pl_module = _make_pl_module() + batch = _make_batch() + + callback.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=0) + + # Check first log call kwargs + _, kwargs = pl_module.log.call_args_list[0] + assert kwargs["on_epoch"] is True + assert kwargs["on_step"] is False + assert kwargs["prog_bar"] is False + assert kwargs["sync_dist"] is True + assert kwargs["batch_size"] == BS + + def test_handles_single_timestep(self, callback): + """Should work with a single output timestep.""" + trainer = _make_trainer() + pl_module = _make_pl_module(n_timesteps=1) + batch = _make_batch(n_timesteps=1) + + callback.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=0) + + # 1 timestep * 2 groups = 2 log calls + assert pl_module.log.call_count == 2 + logged_names = [call.args[0] for call in pl_module.log.call_args_list] + assert "val_fkcrps_metric/data/pl/t_1" in logged_names + assert "val_fkcrps_metric/data/sfc/t_1" in logged_names + + def test_skips_non_baseloss_metrics(self, callback): + """Non-BaseLoss metrics should be skipped.""" + trainer = _make_trainer() + pl_module = _make_pl_module() + batch = _make_batch() + + # Add a non-BaseLoss metric + pl_module.metrics["data"]["non_loss"] = MagicMock(spec=[]) # no BaseLoss interface + + callback.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=0) + + # Only BaseLoss metrics logged: TIME * 2 groups + assert pl_module.log.call_count == TIME * 2 + + def test_uses_autocast_for_mixed_precision(self, callback): + """Should apply autocast when precision is mixed.""" + trainer = _make_trainer(precision="16-mixed") + pl_module = _make_pl_module() + batch = _make_batch() + + # Should not raise + callback.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=0) + assert pl_module.log.call_count == TIME * 2 + + def test_ensemble_gather(self, callback): + """Should call gather_tensor when ens_comm_subgroup is set.""" + trainer = _make_trainer() + pl_module = _make_pl_module() + batch = _make_batch() + + # Enable ensemble comm + pl_module.ens_comm_subgroup = MagicMock() + pl_module.ens_comm_subgroup_size = 2 + + with patch( + "anemoi.training.diagnostics.callbacks.per_timestep_metrics.gather_tensor", + side_effect=lambda x, **kwargs: x, + ) as mock_gather: + # Need to patch at import location + with patch( + "anemoi.training.distributed.primitives.gather_tensor", + side_effect=lambda x, **kwargs: x, + ): + callback._eval_per_timestep(pl_module, batch) + + # Metrics should still be logged + assert pl_module.log.call_count == TIME * 2 From e5501454e4871be4c28d3de0b27a6efec96fcf33 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 16:30:13 +0000 Subject: [PATCH 76/88] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../unit/diagnostics/callbacks/test_per_timestep_metrics.py | 1 - 1 file changed, 1 deletion(-) diff --git a/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py b/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py index aec09bfcce..c3ddd406f4 100644 --- a/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py +++ b/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py @@ -18,7 +18,6 @@ from anemoi.training.diagnostics.callbacks.per_timestep_metrics import PerTimestepMetrics from anemoi.training.losses.base import BaseLoss - BS = 2 TIME = 6 ENS = 4 From de82ddfe129d4eb1894b00aa4223a84357217ee0 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 14 May 2026 16:37:34 +0000 Subject: [PATCH 77/88] fix unit tests --- .../callbacks/per_timestep_metrics.py | 2 +- .../callbacks/test_per_timestep_metrics.py | 83 ++++++++----------- 2 files changed, 35 insertions(+), 50 deletions(-) diff --git a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py index dfc58ec266..97108da496 100644 --- a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py +++ b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py @@ -44,7 +44,7 @@ def on_validation_batch_end( self, trainer: pl.Trainer, pl_module: pl.LightningModule, - outputs: list, + outputs: list, # noqa: ARG002 batch: dict[str, torch.Tensor], batch_idx: int, ) -> None: diff --git a/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py b/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py index aec09bfcce..42581c3024 100644 --- a/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py +++ b/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py @@ -27,26 +27,22 @@ @pytest.fixture -def callback(): +def callback() -> PerTimestepMetrics: return PerTimestepMetrics(every_n_batches=1) @pytest.fixture -def callback_every_2(): +def callback_every_2() -> PerTimestepMetrics: return PerTimestepMetrics(every_n_batches=2) class FakeLoss(BaseLoss): """Minimal BaseLoss subclass for testing.""" - def __init__(self): + def __init__(self) -> None: super().__init__() - # Provide a minimal scaler so has_scaler_for_dim works - from anemoi.training.losses.base import ScalerData - self._scaler = ScalerData() - - def forward(self, y_pred, y, **kwargs): + def forward(self, y_pred: torch.Tensor, y: torch.Tensor, **kwargs: object) -> torch.Tensor: return torch.tensor(1.0) @property @@ -54,13 +50,16 @@ def name(self) -> str: return "fake" -def _make_pl_module(n_timesteps=TIME, n_ens=ENS, n_grid=GRID, n_var=NVAR): +def _make_pl_module( + n_timesteps: int = TIME, + n_ens: int = ENS, + n_grid: int = GRID, + n_var: int = NVAR, +) -> MagicMock: """Create a mocked pl_module with the attributes needed by the callback.""" pl_module = MagicMock() - # Predictions: (bs, time, ens, grid, var) pred = torch.randn(BS, n_timesteps, n_ens, n_grid, n_var) - # Targets: (bs, time, grid, var) target = torch.randn(BS, n_timesteps, n_grid, n_var) # task.get_inputs returns input dict @@ -79,14 +78,11 @@ def _make_pl_module(n_timesteps=TIME, n_ens=ENS, n_grid=GRID, n_var=NVAR): # No ensemble comm group (single GPU case) pl_module.ens_comm_subgroup = None - # Post-processor: identity - pl_module.model.post_processors = {"data": lambda x, in_place=False: x} + pl_module.model.post_processors = {"data": lambda x, **_: x} - # Metrics fake_loss = FakeLoss() pl_module.metrics = {"data": {"fkcrps": fake_loss}} - # Variable groups: 2 groups pl_module.val_metric_ranges = { "data": { "pl": torch.arange(0, 2), @@ -94,44 +90,36 @@ def _make_pl_module(n_timesteps=TIME, n_ens=ENS, n_grid=GRID, n_var=NVAR): }, } - # Grid shard slice pl_module.grid_shard_slice = {"data": None} - - # Model comm group pl_module.model_comm_group = None - - # Logger enabled pl_module.logger_enabled = True - - # data_indices pl_module.data_indices = MagicMock() return pl_module -def _make_trainer(precision="32-true"): +def _make_trainer(precision: str = "32-true") -> MagicMock: trainer = MagicMock() trainer.precision = precision return trainer -def _make_batch(n_timesteps=TIME): +def _make_batch(n_timesteps: int = TIME) -> dict[str, torch.Tensor]: """Create a batch dict with the expected structure.""" - # batch contains input + output timesteps (typically input=2, output=TIME) total_steps = 2 + n_timesteps return {"data": torch.randn(BS, total_steps, GRID, NVAR)} class TestPerTimestepMetrics: - def test_init_default(self): + def test_init_default(self) -> None: cb = PerTimestepMetrics() assert cb.every_n_batches == 1 - def test_init_custom(self): + def test_init_custom(self) -> None: cb = PerTimestepMetrics(every_n_batches=5) assert cb.every_n_batches == 5 - def test_skips_non_matching_batch(self, callback_every_2): + def test_skips_non_matching_batch(self, callback_every_2: PerTimestepMetrics) -> None: """Callback should skip batches that don't match every_n_batches.""" trainer = _make_trainer() pl_module = _make_pl_module() @@ -141,7 +129,7 @@ def test_skips_non_matching_batch(self, callback_every_2): callback_every_2.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=1) pl_module.task.get_inputs.assert_not_called() - def test_runs_on_matching_batch(self, callback_every_2): + def test_runs_on_matching_batch(self, callback_every_2: PerTimestepMetrics) -> None: """Callback should run on batches matching every_n_batches.""" trainer = _make_trainer() pl_module = _make_pl_module() @@ -150,7 +138,7 @@ def test_runs_on_matching_batch(self, callback_every_2): callback_every_2.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=0) pl_module.task.get_inputs.assert_called_once() - def test_logs_per_timestep_metrics(self, callback): + def test_logs_per_timestep_metrics(self, callback: PerTimestepMetrics) -> None: """Callback should log metrics for each timestep and variable group.""" trainer = _make_trainer() pl_module = _make_pl_module() @@ -167,7 +155,7 @@ def test_logs_per_timestep_metrics(self, callback): assert f"val_fkcrps_metric/data/pl/t_{t}" in logged_names assert f"val_fkcrps_metric/data/sfc/t_{t}" in logged_names - def test_log_kwargs(self, callback): + def test_log_kwargs(self, callback: PerTimestepMetrics) -> None: """Check that log is called with correct kwargs.""" trainer = _make_trainer() pl_module = _make_pl_module() @@ -183,7 +171,7 @@ def test_log_kwargs(self, callback): assert kwargs["sync_dist"] is True assert kwargs["batch_size"] == BS - def test_handles_single_timestep(self, callback): + def test_handles_single_timestep(self, callback: PerTimestepMetrics) -> None: """Should work with a single output timestep.""" trainer = _make_trainer() pl_module = _make_pl_module(n_timesteps=1) @@ -197,21 +185,20 @@ def test_handles_single_timestep(self, callback): assert "val_fkcrps_metric/data/pl/t_1" in logged_names assert "val_fkcrps_metric/data/sfc/t_1" in logged_names - def test_skips_non_baseloss_metrics(self, callback): + def test_skips_non_baseloss_metrics(self, callback: PerTimestepMetrics) -> None: """Non-BaseLoss metrics should be skipped.""" trainer = _make_trainer() pl_module = _make_pl_module() batch = _make_batch() - # Add a non-BaseLoss metric - pl_module.metrics["data"]["non_loss"] = MagicMock(spec=[]) # no BaseLoss interface + pl_module.metrics["data"]["non_loss"] = MagicMock(spec=[]) callback.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=0) # Only BaseLoss metrics logged: TIME * 2 groups assert pl_module.log.call_count == TIME * 2 - def test_uses_autocast_for_mixed_precision(self, callback): + def test_uses_autocast_for_mixed_precision(self, callback: PerTimestepMetrics) -> None: """Should apply autocast when precision is mixed.""" trainer = _make_trainer(precision="16-mixed") pl_module = _make_pl_module() @@ -221,26 +208,24 @@ def test_uses_autocast_for_mixed_precision(self, callback): callback.on_validation_batch_end(trainer, pl_module, [], batch, batch_idx=0) assert pl_module.log.call_count == TIME * 2 - def test_ensemble_gather(self, callback): + def test_ensemble_gather(self, callback: PerTimestepMetrics) -> None: """Should call gather_tensor when ens_comm_subgroup is set.""" - trainer = _make_trainer() pl_module = _make_pl_module() batch = _make_batch() - # Enable ensemble comm pl_module.ens_comm_subgroup = MagicMock() pl_module.ens_comm_subgroup_size = 2 - with patch( - "anemoi.training.diagnostics.callbacks.per_timestep_metrics.gather_tensor", - side_effect=lambda x, **kwargs: x, - ) as mock_gather: - # Need to patch at import location - with patch( + with ( + patch( + "anemoi.training.diagnostics.callbacks.per_timestep_metrics.gather_tensor", + side_effect=lambda x, **_: x, + ), + patch( "anemoi.training.distributed.primitives.gather_tensor", - side_effect=lambda x, **kwargs: x, - ): - callback._eval_per_timestep(pl_module, batch) + side_effect=lambda x, **_: x, + ), + ): + callback._eval_per_timestep(pl_module, batch) - # Metrics should still be logged assert pl_module.log.call_count == TIME * 2 From b04654c7fad0e404232236719d63333d861a5b08 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 14 May 2026 16:50:51 +0000 Subject: [PATCH 78/88] tests --- none | Bin 0 -> 2030409 bytes .../callbacks/test_per_timestep_metrics.py | 14 ++++---------- 2 files changed, 4 insertions(+), 10 deletions(-) create mode 100644 none diff --git a/none b/none new file mode 100644 index 0000000000000000000000000000000000000000..ef8e43b1fbd864e1cfffbc619de2557d245dd44f GIT binary patch literal 2030409 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

=?dPn7`X~UX6ciFrV4}^RL4EeWmS6VLre0 zbhR-5|FeF*FyA+hyG5A)yN&)`s0ZrYSSQpEiBE46>V;Z^{t)VixaGDA^~BC%JB0eD zOxeXky_4$x3Zecv+~rrH9`Z9|T%cdlBwZ)eE1~#zIH+Grjb1O*GZo^j73!Zuc~%Ma zPQ2p33iZ#-&=o>G^!(T=p?-@0VUbWT#XY)QsGm;UTO!m`xlb)p{=@yw$baHRmh{Pg zxSyGQuKec4??rs_n%_zl^2u*@wkzqA=bT6p=#&5O{p3Fhzpmht|9tk`C;!3cl^5at z%8&4QfdB?!p`F-+_Q@<4P$wS81DdUr046U2rC$ETqDxXh&vA9qn zpFHDOui`%W$BKESee#ZvqssZ@AL$2_^vOf6mMrX(pX|O_)h93c5WkX7ev&g)pszfo zK~10hhv!TF^C5K&m;C3m=RWyQ;l-7d*Tg+sO!>{T?iG~hyguu=){)6xH?e#0~!u2Zu!u2Z;!~IZxh4WWl71^Ms@++Lb@+@4B z@-JM!@-AGj@-JM!@-W;FsC+)_y-XGJ`K$PGh^7^dbZav8Fv!44cP7$B=-;K~>KI^?CLj!!)f3Nly@mUW( zXk5T&{dhHXX`l6C!nq}V){lRESH@>OnQ%r0pY>1k)p>o^JKe_T^;!SaZjs+-J(TTK zA)ob2zRy_DU^7^b_R^QF%v!40%uAtBQXYHoKKI@(Qfkk}QKixVO@>vgE&6?k5 z{q)_$0H5_z-;>3B)=xWk6!%$AeSfKx&-(BFi!wgzy~9$@XZ^S2RcW8~;7`Al@L9iY z+*96Xy>@C!MW6NC+dbuc)^mIBm-1Qvl@2c9v)-%!eQ}@lU(Yoqeb$4?+_FCF$HEti z_^cQIm|E0l{n)I1VW0Kn$Di~2tbY%6uIjVi4QNu?XZ^b)T{WNe@TaljvwrO{siMz% z^<%0EKI_-+*ngJw?659Xeb&FhrvrV~yK6s*&-!;t<3OMF@WGT-eAdq$3fJ_>f1Kmk z9~brW^`13-@}EhK>-gk9obTj6PZHO0$$vP1?Q@^}r^)CVF8R;y0gg-lb0naKOaAk5 zcx{*bhwmr<8FQ_+PyWO2v(H`odEdU@x1aaz_xa=>3$|BQ-Vt1>obr!2hbk!#`KCiP z7isSnQ=X9*^PK$S%WUP9cN7{{RryDS@CwR9nqDZQ{3O{TQC{+) zd1aUUr`df+dCC&Mrc3_A^C$lqKeU!l{`1*$m;C3-8P_MTDS9E$C%^gq>*_vv&dEl# zeexe(FZoZyBeh)eAAa6G_wDDE7vcS`{k-xde4p|!T)$8LgX{Ile{lUi`48@gPyU1R z_sM^7zP>$wpZo{c-zWdU{qV_uaQ}SrAKWjW{0H~XC;!3y^vQp) z{+0J)y(|C4`d1!|c%b|i>sNU#)~oVctY781SkKCTvHq3!V!bQ>#rjtsjCi2@81X}S zG2(^tW5f^T$%rS)KQaH6cVfOP|HS-P9*Xs#{1WrmwewZ^CFZYd=d(hPZh>bK`D^7+(rIZt6fLFm6` z&;`_cXNDE>ssFx8SJ0;(To;zlr+z$|uc%MGxO-g@pZak`p<+JuyUC--N&p0RZ`_w;+u}>oPPQ~U0 zed?bv1q%4oLlPg?0sT}bw6IUTbpBx>pZcj~sUkl0)Bx;DN&VL~BEYBK%U+_mPyJW^ zcrl-Pu*2peKJ{Dmv&DVtwfVzK_|$J+qT)XF+_mLJed@n0wTt-Fd)F@)_No6uOBMC0 z2fKy@_|%U*=N0s+7fanP=u@1AX5&ZqvZd9;jAJ=}atDWCee zcee^Y_43Rb<$dbsb|)(M)YEbIVIOwXe>b~U@mcTfz&_}#{|=|B;Ly^;?|1*cTS{+^gYLeAa(I$5irJ@2wbD(P#aazH()s^CkM?1TKtdh$-6GCu2{gEd{B^-l2&HGJ})$Y-gk9Bk$Jq$$v5xtM0S@`TC&av))M&FVJWGGq{ZStcPA5t?rZm#A{K-XT3E4RaKw$ zQ`T*Wo2aLLK3l$gX9%J{6;{@PI5XZ@C< zQ(2$&+`5zHeb#?D=T`Jt@147ayo~zq?fVKo>%nikmGfCYR_R^UXT8`UQ5B!{W1V|d zeb$p5>N-B_-&&PQ`mA@Sek|#;{@vHCgwJ}o%=%(J>(?JImhxGzjyzr3XZ?ES?~*?2 z+2pSSeAd6EN*D84@2*=^)Mx!$`O5&G_3*c8OZu#z>t8D5vtF)Vqp;8VdG+FgKI`e! zG5LJ*ALc9apNPeEeDWXWGyB{n|4ANQ%P0RSG8Oymga1S>tL2mbjK5vSC;#F5$$t`V zuj7*ceD>V8pLgy1UHf_0exFPJGvTc3lXr}F#V7x$kg2*)9`a+6nm+l@AG-s6@`^bv ztNG*?KO}T~@{DDeC*&W&zg73iJEk_R>68D|9bVlh4~aiQeDag;>(=(ke`-&w>68CV zY+u_a|B0+x*C+qs^^^aUDNxrX|Ka)D=RWyQ`LwlN@}E%$@$Yni|LlBL%O(HW{<@A! z{=@f^{~Z6Ku225M@3YTc`+48K-?yLl?f3ci`jvO#dX<0S`jv;_eki}f`MdUfU3>nn zy&mOXxPIkbxL(&@zw$8L57*v5DuKXA4UwJU%f%03d zU*)w}ugY(+ewF89JuCmk`d8kI^{)IE>tA^=;(_vG#1G}gh!@I_5kHhCBc3S##Qay@ ziTSSl6Z2nrDAt4WOUz&8m6)%}FEM|WXJS4p|HS-P-ii6H{1fwEc_`L{@>8rI<)v6J z%1^O=l&4}nDgVX#SKf>DuKXA4UwJU%f%03dU*)w}ugY(+ewF89JuCmk`d8kI^{)IE z>tA^=;(_vG#1G}gh!@I_5kHhCBc3S#M*LIWjdY zXUe}3|CDzl-YNe^{8Ju|c&Pjw@zb^O(zWr^wed7I|Eu4Fe6Riw^1u2)&;#nK{Qrs9yxVp#Bl`gZfF(6Y75;|Eb@B ze5d{g@}K%4$cO4*Ab+V}fqbR@1@f2r8OUeqe<1&<-+_Fm{s;1(`XR`N>YpHgs$YV9 zss0J_r}`<#r|SP8|Eu4FeDB))uYM5pfciJc-|E*OU#owE{H=Zt^11py$p7m1Am6M1 zgZ!_45cGihN6-)I7eOzme+2!YeiHPAYxR%%UC=w~e?kAK9|k?7{uT6#`c=>?>R&;> zsGkKrqy884kNREEJL-Qy|EM1ZJ*55_^ppB!&`au{K|iUV20i84{vSi$gMJ@l`+xK~ z`hk?+pnu2MejQ``cZ}`lF}DB5kpH0H$G81I`W*d0#`X^>FG9bN@+0&QDNjN_k@64p zzZl!^Vr>75vHdW{_OBS*uVTo5(7$4AKZ~*bFUIz}7~B71Y(I>#{WHe)%NW}~V{AW- zvHd@W{0IF$#`gc{bMyll@*DK;D6c`kj`ADy?B#`hAS;|Iz2@2U327 z{vl)gg^cYVGPa+{*#0NwUFdgG{)PT0jrF^Y^}mhv!;ST?jrFUI^{hoB!u`33q{lvki%MfnB#SCnUhoB!u`3d@Gl$W4i zM)?W)XOyR)pT^k!A4C3wejj7|fAl%}feiT#`ge@&*DBlW|5M(Jem~{E=>Jn5jDA4nx9HzfUWJn5jDA4n$LJqaUW|T0<;UnBRGy4}Lgk<6e^cIxemCWx z=zmiliheldm*`*9`HFruoxkW`)A@{kHszn_e^cIxemCWx=zmiliheldr|6$kUW$G> z<)`SMQ=W=`I_1CU|5M(Jem~{E=>Jn5jDA4nx9HzfUWJn5jDA4n$LJqaUW|T0<;UnBRGy4}LgnA+e^lO$en;is=zmlmj($kx*XUnV zUX6Z5<=5z6RGy7~M&;k=e^lO$en;is=zmlmj($kx=jfkQUXFfA<>%<1RGyB0N}v1( z{-3dapRxX*v3{Vj{++RYow5F%v3{Ph{-3dapRxX*v3{Vj{-Lpcp|Sp z|7WZpXsmx{tY2rWe`l|7WZpXsmx|tY2uXe`u_qXsrKftlw#@|7olr zYOH^0tY2xYe`&0rX{`Tgtlw#@|7olrYOH^1tY2!Ze`>6sYOMcntlw{}|8HzRfU*9) zv3|X={=Kn&zOnwlv3|d?{=c#P0LJzY7~3ykZ2y3<{RGDP-^TjghV>8pZ)5#%WBqHx zdIf&9Vf_OC+OVF1pKYxFZLHsItp9DSA8uGb!9O?FFE`ddH`Y%#*8exw?>E-}H?|+Z zSpVKwzus8?-dI21SpVNxzu#E@-`IWtWBUh;?H4e%f56y&0%Q9hjO}+Yw*SG{eh6dx z7mV#!Ft&fe*nS3M`yY($cQCg9!PtHXWBVtJ?UyjNf5O;)3S;|!40#XweT?n@(dXy~ zGUPYt-!bGh=+`mIZ~EUgc)F}DB5kpH0H$JqWKeU5%0{XF`I^!?};($AxRNWTyL zM27qW{V&G$yBOR5Vr)N*A-_QXin0AF#`dom+s|Tb|BJExE{6OA{V&G$!x-B?W5`R; zFJs70&_83yQ_xRiZ2ylT??JzhvHd^#9Q{Cs{099yhP(#-I)?lP{X2#{2mL(8_Wv02 z9`ySd+yA4_(GR4bNB@w%AN@l5dGrtI_o1IiuOIzS%Dd3-q}PxBC*@)2hf;op{v|zM z^egH4qkl=S2mMTX{pf#E-i3ZAn9enI8O=pR&`jDAAppXh&6-idxU<)7$(Qyz+bIOUhi3}ESN$LK|EeE^eqi-)(7&sG4f=J} zzd`@5`Z?(5RsRS5zv}m(-&g$~^#7_KgnnT4kI+A?ei8bG)jvZ2u=+{pCszLh{jchG zpx;&f5A?sPAA){Z^)JxBs(uCfRn@;h|El^K=x0^`1O2b+cc9-@{SWlNsvm-WSoKfP zKdXKT`eoHWLI14!Dd?wF{|EiQ>i3}E*Ju7m|F8N%=m%E+2K~G0*Pvfl{TuY}s-J^? zUiE*_|Eqov`hC^^LI1D%LFflo{|NoV>KCD3Sp6gP538Sqeqx{c2mR0LccI@|{V()C zs~?7bX!WnqzpQ>0`jyqcLjSV*S?Fh0{|o)k>UW{vS^Y2cKdT>xerWa2&_Aty8TzHw zKSTet`f2E=_Q`+ndsXE<-7|Oh$bVv=_nI+6`Av_dDLwL^z&nRx$bVXw``#n}Sv&i> zNB+b2lm8q)(!-Gd#6E9yWR*w$^IQH&%8M4>Zle6?*@+R#lQI{Zru?H^s`)YGKYfP` ziy{9RIx2-n{xjtJaUS_kz_4#($bbI$#fc&R`Fqd781kP2E$VyZKf!r^@W_8M2F>%x zfBGK`_Q-#F9l0Mv{!^{lIgk7&ar3Pn`A?c(uY2S_pY|tJ{=@Sn|9OFZBSR| z{AcC3)gJjzlguSO@}F66W+?C4@-b5R*O7XYl!uMlIZOG~`7te&SG~PoQTb1wYfY4A z{gb4t@~@hUqLp`T4ERa;SEGd^l!rZv(@*(X-w!`4FFX6&Xys?c1E(oZ>ve0k)_KRbKv_b9{JD0{i!_ipO|7rTZwMYK*=fip) z`A;$l@yLIAmz(O5|M70@}J%{PI=@%!#3{r$bUW^ zJnxbJ6Nwa!|NB$FbcDqOZQ>4i$kNoGmtABgsKl4hz^~isgFTd%L z|MXaN&?EmDTQ#ZH%W1q%9{JDoM#;3EZgeW6@*mDu@}FXF1C;;7K0mrOgYuhS-&avy zb0M&S@|%rat0~WU3{RZ=hwmrvDW5%q@}Jn}yJi&E&o|qgNZ+4yX*&IUjYbLe`>Ni5 z=#l>f7ww?Dqk6?KK;(mGQG-orAAIu2e|jgp>yiIly&G5gPlw}amH+VlXJ0R= z{3pvHQJ&)h>PpwxT`Om_+$@To#|M1i! z|4Dgix5w-6pK6gu{aO;G-O@7)aL!F6-aRerm%=TPOf$NlcgZCLgNl%EFf@1i{Q$)%pkf2Dr7^4_oNk5c~I${DOYcw3e*<+u6IO;lbx zp!LtnZ~r`wSc&zVyz2zzzv;GNzhta;Kl32vzq3n^P#%0^`)K9I=@a!*UVLxUQ02$* z6ZTb}JmYvb<==F>X;<@d;c_8)8LQUCM{nX!ZXC&lqe zJIH@7)=wKl{*y21lo;}#Kd%3{gZ!s+v%x#afA%Dc7eoFtyH9is`Op24OJc}>I=5OI zL;kaI*q9jdAJZpU4Ec}q_IV8X&-@-YV#t3Mge3IHe^w32?~(ufl&XqH{uA%Z+8*`a zw8)Yk`A_~UDLwL^c9*{L$bSm|)Yc>a2{={5Bmb%KD!WJivuAfAkNl^3oj4x(PxIax zJ@TJvPGyh$CvNnX81kQC19rxc{}j$ND~9~%P2$WkV$+>#8NB)!Pm#Loi|6G{kk^fYiKglEiiGDQL zBmbHI-D;2g=VHCZ9{Eq4{cAn)pF%;#BmW8Pa>OJ5iJSGTNB$GJ@}NilNB;A7ZsU>v^q8{IBmar{cb7;0^R)aakNjs-jwK%X z&yHQIJ@TJlTP^U&f4<&6-Xs6%+3dYX{QKgka~_sDeRCtC*{_}d$uO9hN_HVa)=jau8sD{f0o_uA>Y8BUc_UUTAkW#u>5o0e9d^R99c zOe=gTad2o&U-IO0Uo`iki5ie4v{6_il?F7w~ zCr_CArSi`Q*+wewOjC56^3S_>Mkx<%G-wsA8(p9PD zH_EGrZ3|X@J-Ac{<=MTR78?I%zo@UgJJt0-pVv z^nmgjPmgphrun~Vy!q<)9K14J{ht>d=BOVuvEY35Z!XlDsD9028Lj?JNZ@$&a~>9* zr2fyJsNyxu~S3U z@0bv8fchVQo{UyMW7Tq+fV(I#&JigUvlr#VD(SZpToaXfqeS+x>4%?teiPU{hrM^CaM3E^!`}& zgQ}voVg8=mbh`RA)w0Z0|0YZ8nd;|c*fmZ4pZIYntKYL?{TTIsrWBi~e$e{ACaZt+ z^zskt7yVIXg8E0VqJLCBsp9BS>VNGUGGG0!dk1E!|5f~}x$1{invHRRe!071iuzSQ z;NRh(emPKVvie!OHvFXiSMez`)bDyVYOeZUovP1LKP=I$>FS@o+&EwTve&m~see}R z;9T|7&R&^sEdLSq|A6<1>Se_JU`G@Xz1Ky$g-++JUemLMEx_=G$h3;1aULoW^;1{}|4S0s` ze*^xZ``v(d=>9k0AG#k7c!-eyfS>4oIp8I_e-8MG?xzEuqWk|KUJLmTc#rP?6Z;%I zNcZmnzi}+DaV)=aEYEQ){}J*Z@E&3R4?k~tkbWNgNcRf@FVg*kz>jo4A@C&K{|Njm z(DE+F@-N5out3YN9LuZp{K2mr%d;HIzZ}cE0xkb?EDv)mKMSI{|nSVy59xr9o_!|^^fj{fqF>yuR#5x`&FP`(fun> zzvzAzsAq)y2lbEccY%6G$bV4(=zbWehjjl8)K9u!2I?ieosd7z%t{XbCu>3$!m_jLac)PK4k2V77uXLbJ*)W5pl3F=+l{{;1~kpG|_7V;m|&%*v6)XTbm3hHNJ{}1YE-T#O4mHY?1 zNB94UeGVQZ?EeA35%&Lp*EsCo0lyLU|A6P{{y%&_`44!H?*9|}96U%r4}PTY2QSk7 zf54CQ`@oZg{0IEQvAn~v{KK(4#IgLsvAiPC@(aiE49D^h$MO!x@(;)I5XbTp$MO<~ z{WIVvj^!!3{}0cX{0F>8_y37~4jv@z{{g?z{d&M_bpIak8{N+bJV*Ec;rq#dz{BZvJ$;6?g*@FV>`@Fd6bFWv75yi0if;9t5Q5_p*IUj%-o`xSv#3C|z= zO7}AY&(i&mz`umo3*IHXe(*2d4+%U>_fG;p)BTdb%XI%F@H6541WyyLfAHTx%X=Nm ze*-NK4z&E%vAou?{MNBN*RlN9vAj3X@?XdDV8`;~K+B6A%Z~#sPp)S9r(=1iWBI3J zd8lLgrOsFIN}a#pmpY%pGabu69m_i%%Re2i5vp9fl=UXA`A^q>CTA9_!J{}27A z`vE`?>hJfV-}LwT&};hpedss+JwNoE{{A2OPk-+Zy{EtbhyD|*2X+4d=ttcz0D4jP z4}gBu{RE&Vh5QHlM}O}Qy`#T>hyKyu!$S}0@7JMU^!Mt}EBgC&=okGxJM@hH{vG;9 zfA0>xqrZQL{?XsVLl5ci=b@kU_wvw7`uln4C;dG=^pyVoANo&!?+?AFzyF8+6Y?ME zLH+$c^qc-(A9_uHzYqPUzvqXZ)8GF?|LO1jq4)In|ImNB9{}{A?jHdCsQU##FY5jQ z(2u&G0Q98pe*pcf`yD{<>i!4Nzq%g+^sw$<0R5`_6+o}*{sqvlx}O2`tnPmR{j2*O zK=11Q2hhJl{sTR%`zJs@>wXE)%esF8^t0}#06i__KdAq7zYo-Vy8j32Kiv-m^`P$G zf%;AN>p;Dx`*)yz)BQY9&*}ajsQ+}o57c|Q{|D+n-46uyppgHde$@R!P%rBKA*dg9 zKM~ZEy8i|0AF=h0u>a>>v)Z~J2I?W*zXJ7(u>S}3itb;5`bF6PgL+2T|AYER_q#y7 zqx)Z={?Yv~P!9?Fe^5W^ei^8jbpH(0Pr9E5>M61HpYHd8dQZrIQ2*(EAgBj*{|?k| zx?czCHQm1h^_%YJfqG8&|3Lkx`+cC^)BQhC|LJ}ps0Vfb5Y&&lUkK_&-9H5NqwXhy zdQ$g4LH(=youJ;;{ZCN;>V7DwhlTtH^{ehzf_hc=FG2mP`9d}7rLJfc!utO1OB1=-GF!K{x{$sx*raBi0+>Qej@Du z0WT5u|A3ze`+vYwbpIcoFZmC6kM92y`y4z-*#855BkcbHuMzhDfZquFf53Be{~x}e z{0F>8_y37~4j!bR2S3vHgBR)N!H@L&z?1a)!M_|{FL;+;Klqp45AZO@@+&=G@G3oj z@GHF@@GQN4@Grey@Ggh_PvBpAKfuHE{(+x4mX|q}pE;JNIhOxAmiIcA|2mcjJC@%% zme)F#-#V7(I+p)BmiIcA|2mcjJC+|imKQsgA3K&OJC=VsmUlXqe>#?jI+kAsT3#7w z`DLKxnSqvnI+k}jmVY{yhdP#@I+m9@mY+J7r#hDZI+pi3mj61I2RoMEI+oWumft#- z=Q@`EI+pi3mj61I2RoJ@JC+wamLEHoCp(sZJC=7l8vo22$MSHEU*Ok{<<*Ym*N)}c z4&xvAw_|y?#y{|H$MSH;@^g)s;N==W!Ou0Gf~V{LKk$F5S-&UH`aglz52|MU8^`)J zj`eRG>*qMu{|U5yPoVXG0<9kuX#JyV)-MXQ{!yUyld4(&!?AvcWBm`u`XP?>FC6Pv zIM%;#te@dn|HH9SpUbdevf1QAIJJZj`eQ>tzQ#p z{hL7R=LA~+$FY8oWBnh;`azEMj~we4Io3aNte@mq|Erqyy8^BM6=?miYSzCBw0@Oi z{VT`%S%KF73bcM#p!L53tsfR>{j+M;FAKE(S)ldPsx@hlILU$@5kJKFK5iWTze$7m z3F5>_k|fUm_rK(E636M)yI0qeL7l@omn>bUM*KK!+qSKBx}M}1)k2mptS4FVczbty zsX8i1ZjI_Fo!ua5wV}O)_G~E~ZnT%ac)W(!`S+W6y&T^6E=hN(FtL~9Ti8Q>{x?MG zIeq0~x&9K?q@ScZ8YUMXhe}AjUgB&Cm4vr@i$sS?z~V63QY=)aOb?R<5AbiF{1_r} zdWXswJcdHsL^bRty~YH~k8Oiw+qc1TV^@f@s~9X7@z@iukH_D8;Pt_H-%A{S5ssS^ z$1j8P2*mgEd$;5J^Wiv`aQrwpZfzXD56*+1K9Tso#0BsWTg zOZPSrQt*C+Om7(>8QVn4g6H8f`ph6HF(yJ{BEzM^$q4y)AyS%|a2eAoN+v&ykTsnm zq}4YOvafxltf&<(eWneR%2@}=?rPzQ!rXyb&r&)8>6Lk;b=MV+hEDvCsHPFjg|)qqU37aD5?D_S_aII zM4lWX<@*m22j4sE%n&&?JW3K)jgnTghe%>PPF@lzhxSLvwgk~~V?aRMg!znK$skM21@PA{p3lFfpU0wxXi3DKp*o%Q+C}PB|#g)W&OP<$+6rBn|F=QQY_Uxc}KP4!pm^a9??U8{$5n!Ts-m``#M&|1!p*D8?re<5Cvm za|q)Ugz?{nao>sY?~Qp77vnns<60Es%W-ai@7aTKzku-{hk398^J5d{MJLRUo0unK zF#mR9-gU?PGnj{*U&}DB9$7<#SQ14BNs(nC5|lVpV#bBa>m?!5@LGtx8Wt=CT0)cG z2$AgJLDKzUu+&`^EV;XPlX~mJBw${s+^ioeU3P}aH#vJr>Ehj`;GQ0m?Dt-hFlirI zmAbE7J0B`bgR%Y}gUNL1E4TXflMk)?OZNN&Z|op>vKMo@LZl>U zIY_$U-gRg-P=4MpK;8$1OWrTTq{4Rtq*t4P^5%6vNqRm)Dy;_(#lOk4>~VxFsSzb3 zM@7lG`9q|Z8zrOS50SMcqGkM^NXeOKh&04_bzL1P^HN63ug4=~^{yy+6BH>I{c!2@ zI!X@Dz`Vo1qcI8dxZuy2Vw83NQozb#s3;ul$Fy5WzqUGVrNXeZdN)pEzB6;!1*ZFt8z6I|~6%r+( zk0NB{*>DMc5h;G7aG9}epnO?;kj!ZtE>~t_&ZUfyZc8I%)QdrqFDz2(g-6K5ei5=G zairwf9wE-G2)Vr_QmWzc&726ivN=Mw7a1%iaSdPe7%Z~}M#;Vl5i%E#H}LwG`1@JB zz7Ox?@mt}zt8o1BI1dNkzZ2iP3g6!l$KmmVaooB%KF?zt&Tk&ht0vAb9OwB3#(y2g zeFDb+I_5!ojBmm>{p4HRpPU%y5g7mL821Sn|L-vmc4B^H$Gix_{5XX%SdIIi4ELS) ze-y^y3*6tsxUa$Z{0Q9Vzi|Icgq`^3C#P~PGxF5p!C+Zq0 zdoaE^Fs=sQeE{R!3*-MD zt67*|4OU0WaLhl>JI+7OLl5(_4(8<<%umkK16cowZ-&X&SpRns2liuqr^dSOi1nQx z>%0Qie`T!u23Y^I5C<3^Mk6jTJ}^$S#rkWBb@vkMuL9O#U97JxZTibOtgqBqXP=Vv zkrh~XSFrx(VjVWb`sBLIi1nEd>vS8|e-f%2DBe@3i( zuK(MJ1B?&P5f>ICJ}^#nK>P_o+^K;0Qw?#bKjKSy#FZh4F9Q%~8Y2F@N8D+P`12Lw zPDf{`;=2dpk@~2e)jt*R zzK_r!6`?x{Lx0S%`bTvI^hHMKjK85jf~@|b4yg})QW&~qrPV(xt^Rr4D^z}h{^<>U zGaR}m6#8a_)j#K5TbuXRLzGstr_k^iEQ_pT!UokJeXjr_P5c`*R_u@mxS zdgR~Y$h$X@f72lk7eIbpjl5a_`E`ZWKZlTa>m&b;Mjj4DelCZ+TnOL$v(-OOszgZ* z=$~xRKfglX9R45uli)+NG};y^m!W_7dc14@(LYP@zNc3IJca&9g>_n|&_G!WUD3Gi zKsjOcPc`U{8PFdo;ZvQ)y4?j`auoW6Iwe;BjDh|+3LTWs>YuNnZ+xqN@CuM;CDT(9q_|#$4KVRc}Z{zz<<2bpXe;z~s@c1oo9%XTUJg*R(AN9{j zjQ>82`pD2aJ72J<66<_YyDb!W03kx~ic z!28=B_q7@BZxHUY5B(E_`(6Y0{~wG)K8(*$j7tNI&pM3LHyHof7cYly}_#=Sy_f5i|786T;C7#|rYTOt1DM%+Dv z_#28i+{x;n@`$hb5occ@{+_q`XS~%vNf4LsAwJ)?`X>f?uiJM6Wft<_dgQlf$UWa7 zzddY$JcoN%4SDYuISE$%zxpR7^v{aV^iOf@L3cES{#XbdLVZ##cpa|?;o4%X{wav#x5ROm!53X4K(;f4J^W=Bj z|0KBY*Kz-YF%E^Ge=g#_HpJ(L;XYr${V#+2{uKAW1jb<*#%DdoWg)I16~^gzjDJsz z`(=#(Gw9%b7+;R-4t)0&jPth`|JNAzuQC25t^P@ddGRym2lWrd z56mylGwPotpXr|+n4k49FLz*m_QX7m!TNuMx`*}8QN)4cSl{WeuA{NO(_oz!!}_m{ zb>AH8e+uHje#D1~hzp0Hf965|w8Q$Vh;?@g>#s4^A?u5b&_6!bS0=2pY^XoBV%@R+ zn1^-P2kZ0BhF+2!>$5HN&oQk3Y|uYJSpW492dZFw2Vz~9!}=b8b>0E`=l=B&$%FM@ zczCdsM|`*p{c{HKAp&utJ>pMs#GPV@KY0;{RwBOSMO+z-_|hD4rZVEsOT?Y#h(8?= zhjJn&eS`mBKzs_Y`iHuQ`iC5d`i8oOe1|%R{D-=S`iDA*`iQ!S`iMG-`h(ns{DmBb z`hvQG`hq%x`h&WI`hz-z`h>cKe1@Ec`iHuQ`iC5d`i8oO`i44({D<6!`iDA*`iQ!S z`iMG-`ir`Y`inY@`bxhS-%p)I{YBkH{zM%{{zF|B%YT^vnD?0fm|8nUFKirVdiJ% zW#(t*Y4RWH9_k#XDT|7Q@81)&?i~5W@jrv!0FUCKX|8QKXZ>e*sf2n(^f2o5xKd6hT zkExTXKdC#ZKdD1`f2k{}FR3%h->5sOKdD2hPpM0(PpMO>f2n&p{?x(Lx74*9U+P@y zU+P|tKXowmF?BKZF?BNaH+47lH+4AmHFY)hHFY-iH+47lH+4AYCv`dXIrR_YALAb5 zALAh78{-<|8{-_~ALAb5ALAh7BjY0DBjY6F591Ew591Ky3*!po3*!vq591Ew591Ky z6XO!&6XO))ALAb5ALAh78{-<|8{-_~ALAb5ALAh7BjY0DBjY6FFXJxbFXJ%dE8{BT zE8{HVFXJxbFXJ%dGvhMjGvhS#AM+mbAM+sd8}l0T8|!@LKjuB=KjuN^N9IN5$5{Qt zyc4T`m|vJzm|vJ@n15pV5AzW76Y~=D6Y~`FAM+mbAM;==|6zV(o@4%F-edk_9%O!G zUSxh`o@D-I-evw}9%g=JUS)n|o@M@J-evw}9%g=KUS@t~o~HgG_o4nF2co{A{vqF? z&Y}Jx_aXlw2O|HWE}}l-`=~#tJE%XXL#QvvRj4nhGpIkPJIG(CL#R)vOQ=t%Q>cHa zd#Hb?gQ#z)f2eP$bN*NVP#=*CQ6KSr)L+zH)L+zL)K}D1Raku>R;+!>R;+$>SO9+>SN9m>QCxU>QCxW>PzZM>PzZO z>QCxU>QCxW>Qm~{J-7zyRO(;qUg}@!VCq|rEA=gPF7+>UFZFLM|Di69m1fUtb17hunuB<^f~`w z{lU6}^#|(^t}oUVtS?w+u>N4(!S%;Fg!KvQ64oc=w5)$v_ptt99rQW>VVy(%!@7s{ z59=V-N34rjAF)ni{l&VA^%v_f)>o{nSYNTuV*SOsi}e@lF!E{EWvtIwr_ukS??wNM z`iK4&eJ$#rSpSQ@7yU2#VAMzaJN+^GWb~gt*FV%3vHXWV6a6RpPV}FsL+DS@mx|Rt z^uOqP(f^|Up}$36i~bgUu2}s;|BF5t{W1Dt^v9@^=)ci-qyI)9j{X|;5B)XzZ1msg zyHWqphvWItm!m&NpDvdF(Ep$hLVtt42K^2C9P~fvdocge2Z_}`^hfBE(0`!sK>vY0 z1pNj23e-RJ8R$RIccA}3A0pQOqCY{Og8m165BeYULFjML*Py>apM(AfeGmE{^g-y4 z&=;XULZ5{G3w;;*FZ5yPuh3Vaze1md{tJB<`Y-fh=+DrXp+7^PhWdxTS1afr`e5|8 z=xb5m(C4E5q3=cii#`}%kJUf)$>=}PccTA9ABz4G^$-0e`b_kn=sVGWq7N18f6<@% zod108f6>>XzZI*0=zG!sq7O#@i@q5BG3p=sZ}i>hzs2$&`fBvo=zmfF(0AkU>BG^V zqc2B)j^|1LlfEbYPx_$rH|c9~eCc!2|D^9p|C2r_{Zaa&^hfEF#_}KfkMtpVe`n#o z^8V6ir2e7rNdJ*OB>hSHlJqC(Q_}yW?@9lYJ}C7qeNFnC9B2BU^gZc+(g&qKN?(-z zD1B1;uk>B%ztV^0{GzU=ze@j$`kTHh=O2Ao`m^+9>Ce)qCI2S(CjVv}{M`RyoFo4x z_h$Sf2PYpV7bhQ&^L^J^L=TcPD=*hbLbrS0`U5XD5FrcPD=*hbNyWmnWYm zr>Flx--G@KeGvK^^fl;jQ2)^XpzlHdgFXoT5&9zZN9dE#f1vLWtAEIU=qu1)pwIBR z{-F;+e}cXQ{R#RM^grl((Ep$h603ih-{^DD|6tyu|3M#w{s?^$`Xls7=)cf+q5nc3 zhW-kD75XdmS?IseccK5nJWPLvz6|p_eVX@H|Iq)U{-M5!)jzTR*Z=CDSpSPY8T}{v zPV}GXL(yM~)j#x^V*M}bANo+#C-kMLPv}$S*dC$27yU2#VDz`BYv^y$=c4~b-;4ei zeK7iC)Iapc=##1chU2RLhV!7mMqiEo8hth%pS~OYH~L@HKlJ73&(Wu&{-N(l|C2r_ z{Z0Cs^f&2qQvcHTr2k1Dl>R7vQTn6wN$Ee*cjW!24@rNKz9Ria`i%4+={wSYqz}pQ zp)W~)l0GHVkr9VpkL;sb&EB#mcu+%^F zRq3zNXQlu8x&K9fmcA_gS(bw*{-OU( z-<#{7J~-n8eR2BZ^uOr8(|4!;P9L8BI(>Ee>-5>_zteZ8|4tvC`iH(e{dxNI)IZs+ z{^29_O%cLeM3#{Xg@ee?~+1#D)IhBlQn;O;6~XvCuhNEdOc$S^p3J&e!=q9-qhM z@p&Gx{XhJE9*4*0ad~{62hWe^#q-niME-k^yw?)>?=tdWpEePa6?ttI@>@3KxnGd~ z#v|_)MgB8Z|0DnxV169g>OcBt8}bh8Zy$MR5%SBo$Sce*$B}2cApbl=-kFH}Qvqw~ z74p+A6e*uYF_nPb1{NpDh3JE&thoyhuL4JedOe zr?AyOC9VG1iM(0}`E?xf><#2!=H14~zkQL1J0L&TL|(3l@11}=eR6n|#E0%_0sX_r z>CiXE>YuyNKlz}49z*xE+=ki?k9?hfr#|BQ-avo!gZ{Y({gEH*l=@;ZbVcX7|IryG zpg(FtcT9)=hzkyL66^LTbjbwF)N&*Sp=JP&?9zn9<7uS za-2E-9CwaC=K<#j=LP2n=LzpW?>qG;$AR~k_m%gT_nG&f_nr5j<3N4NapCxIoH+g* zcaA^jL9G7a_;Q>%{v3DmAI<~L59(sh56%i6p-eLY(%{~m|m!ZfjCy`$oAkU0J{#l8>ixGP;f1!Vx zV!WCoFD*uXVxIaH`7bW?&r#&RHm{@P1oB&A>65=U4=Jas~2lZ{*$m$iK|PTaaIwSARu*WuB$}NsYYw9Qij8c{nNZGxKsMoImsQ zOX#0(pnK{;|L`%9)j#jT;W2^pJX(pqC2*e<;6Hri>-;-kr%uWY{WBK2V*&I}8|aYT z&=+Hu!T*Q8pw2iC{qZw&M@#6BaOjXC&?nR-bD>YjY4U9cvw`k;VfD`o=$j+ZHG80M zYT_C)eWrh?gZMiC&e!=q9-qhM@p&Hnets{%pU2_xd0ZZ!=fU&idGY*so*aLUJI9~% zfaA+?<@j=(IsP1Xjz8xC=LhEn=LhEr??3N5??1J{v3CXzs>`UFUOVR%W>xTbKE)poClmAoEMxQoF|-roOhgmoQIrWoL8J*oM)VW zoOhgmoQIsBoR^%RoTps>tb4fr83(w&xvsgsxz4%%x$e3C83!027#A2H7$>;?xbC?A zxDL6#xURUq$XU7mxbC$6u=99`a*_UNR}X zuiWSZ{WqbX)JfW3S_Jf!sv~xr1Vc<)7g=IG=Ic{Bwzdw;Bn zo#-#DH%Ln3`{t$%mxlq!UHE*H&G3=aMall;kuvNJys!zV+NW{ z-ZEO6UI05@0Cs!}F}7@!%r1xX%{N3Q9Y?*jaEN4CFhmYbijs|=hRD?QQPK`EX;XTfh6dEe9E{tv}C@cv%FeSM7k%lpjxAB_9{5%+&5 z#$h||C&$IX_>{yrJ;wOIiHVT;82>Gp2g@--cgK-WYr$ov%%)iSxH_or@6QZOS=GO(xvoV-|4(1)_-v`XY$(WxdalN6K zpK~xzr(g~2!kUO4*G~o~?k{t&h8{TGCEnQ{@}zVxi94j1>?_n)LY`t>M5**qy& zx^)YdGEc$6#{^05c->_xe*1W2NH>|XH%#`fLT_eU=%qjL-vtq$OQI$_&_jxC>?LJW z_K|#9`$~lyi05IwWXvn{XLju?RR;Bw&29V3n!*EQYmm;YoI$ekQn*zA z5}KyxAQ^*Pa|m;0@a_SUwjX+7+lI;O!2{%C$UyN@g-O1b;DRS2Wl*VTNty=DB*NM~3=Q%7zv%zDA0-QZjFhkb2B&}q zz7D@PIp*xmV0cr|_?y}fl4*GD?W{-{+-Z>H%sg1yjEI!@H^L?0W|Z7d8zxyt4v<`7 z17&Mam<;KUUJ<;%JnDqgE8q(c3zr}J4wM0Zf@LfUm&Td<%Xi=6_n*TD%BDd4PT}Ja zxjScwd^so|MjTPV$Wx%1@Ar>w`zgcE*+3gA4CVElVw+?Qhfw__eW z!uYPmxNgJv-oZF?{7YfnBQgF*Fb~#aesEq0=Eo|`6W;%sxbLNL|FdHps^b1`#(f=w z``a4#`8n?YAl&y^xc{Ru4(%~McQG#X@q;i<6EXgyG44(A-y1LwIKCw?u5mHGl`ziJ zF#hu~?m2#rl)iY+3Cxd#ze6K;ht|S8sfqc=c^85C$9c&4H39SLAm$h68RuV7%sbA% zoS27;F+Vvk*JFNWScgZf|F&57Q?dT+cTM9oOGhti!=rUnjAyN@0B^!#b;u^_Lv$t`^o`4XncrSf5;% z1+YH*Vx7*y`ez@FhxNZ1ai9d&_hqc>8Cc)ZSm#Bs{=de$ABFY*JL14D#D^M)3-1@e zPs$l8QxSjaAntTQ{K<$o#Q4$^aiuEa%VfkE#-GNBJ5LaQ#v%??Lwx!Xaf$IMA>ve~ zH~-N;1)+c1LjSaczF7=iGZXrz0d!6ytABE)>!3P_uaCvwr{eW)c;5l&pIx{o^PxYe zLssG*7Q;QIzM#&a{-_My5d{75ckVuN3;HApbV=Oc|LC8g&_8MSK-WP39E1MJ1AP+& zU9NeoW`RB0JKVis2bCI9!A}>`%ekzMR_0Z~{{>Xnd zp?~TjzcoZ&8~2(1Nr$|*9Qm&z@?gI${H;WUJV1V={&@!dGZJ|>Ir8sOYw4zKf8APNB^XV z0jGh!8T$yesMSB~p?{V__q2fi>F}BUNpJN}E$AQWF6y7zIFE3ve_X47;^FwYaNNPr zKRk~J#4w)M1e_nwb34YLx;Hb%e-HFeMvU)0jO%NR?Yo(F!5T3?o8WpUL;p;`JpCPO^*YwXaI1gjV+|cdT+4y@mJD(3 z2IAk}h_;TYxJ=uu(vI=pgEaJ~3 z#GN~cKkX5RDj+_6`JL0d4xSI*__ievkvI6n>V^Cko zjrhzs{Ri^jT;x6GzrM(WPp$sxg8a4td2Sr?-+s)QPRM_$kO$*@6DH4*7qKamT(tV9 zEAq}91y>)mZC%C-zM-pk$)On{gcq@ALgkZ$ba*Y_xd5XEz3Gs?jXP2 zLoQ{0i-SBDtA8#)|13rx%#Qpxcm#U!kROv-{gV@Uw=+HyhCE!=>Yvuguh~})k{8Io z)sc6Zf5##Z7e#)~gS`hyGa(-ID|Qr!yY; zdI$WyAoP!e_fdcR0^Knc`lAeV$m$mGd!Q@wK>xh?20b~@A6qj=NSxmyREJQX_|PTP zCz+sAN<#m1hVIz{{qsE@GeW0O*91V{G^vT20{SPd)jwZZ{gVuTzf*0nOv3x9zslpd z2XOrFa2~7i{nS+h@cp}SoZoPK>aHp{KF{NKoL^z+pJ&iNRdJrwzx^=oYcT$2Fb}pv z|IEj@ZpQe&#W-{PzrwiB!}uTkO#gJU`sW_>4|Qj5+<)rO61cy!a9`)+{s!Yduf+Z5 zeV@(yk8v1=@i_(k!||a`?T+#9jB%&7S%i7O@oj=}^{%7u9^p0d`GpsMJv*K8PpRn$@{%T_#F2(xH`+t~w4`?aMZEY6>$vH?8S(0-G zNvpmBM1rD-5(Nx^5+q3wQGx^|M`r3Nvpd-K?DRrksu-pilPW8DuTlQK66!F z`>da>`|NYaxp$A@=-qTvRn(l{oX>pcS3R{Zb7*~b)jHjx^`Bkq{%5WKeToC+wZ6a8 zx_&|HyPMW|DXstNTK6Ng{y$M1*em`irnrz*^-)pr&$Eg@)x|#p6o1ky4*m967dJ%w zlUMvROL3;B;*YPmlQlypw^(tgg5uLlic3+&r%Q@c@DJPr|DXfGH*gJn1Ls_if8Zkc z2u^}O;Es@g;0w4So`2vD^cOe;eFiRpPv8{z2kwD?;2`)0u7Pht{Ri%Wf6#&8BmNvd zf|KAcxQp|{Vel2Y5_|<`!C!C}`~`=>XQBQBr;-22d*nazAo-2FMt&pDk^jhhNQ zBma^2$baNP@*{bX{79Z8|DrpfKahvXujEzq1@bKUm%K~5bRGBxod^Dbd*B~9DAa%8BRC2D3I2h<;IL5tfv?~!_zUhr|KU2&r?@WojO&Dd z;a>O`4u)^xTKE>ug@55*_!mEbkKtnY7*2*i;ZFDy4n_ZgE4jaLCifrigg@a>_!KUM zPvKPf7w(0B@dNl4u7z*mT=YM<7yHA(@G-g|d<-YU-}oK;4Ts}ja5a1lXT#rcH~t5Q z!{=~0`XroA{3Gs#{6l;rt`XmebHqR59`TPjNPHwN5+8|^#2?}g@rO7>d?Bt7Ux+ir zAL0)2hd4xhA}$f1h*QKr;vVsjI7oaWt`XmebHqR59`TPjNPHwN5+8|^#9!hr@s~JE zd?l_DUx~BCU*azDmpB~q5Am5eP5vYAk^jhp)c4f&5BZP0NB$!ZlHbT{cAovEZfp6d( z_y_KRf8ZcKhl|jM;3W71?tnkw5cmSFfG^+-_yg{MKj0Af1TKM3;1u`=?ty>cAoLx$ z2EKuF;2*dL{Ra+$kKiKsDAa%8F8B)$gRkH!_zKQ~ztDf+FRlYVgUjGEI1T=Vd*NR= z7`}yT;afNt`@_BPFB}XX!^QA1IwATG+zEfeq3|VK317mQ@F)BOf5M^gDO?)z5Bv-F z!oP4Z_JwQVTR0c~g?r&&bU^qRF2+CLWb{Y48~(-*L;VMR5zdCc;coaF4iEVUK1Zjd z{t5YqI*9s)x`z5DL2PL>LcnR>LcnT>JM~R>JRD=))#dJ^#%Mx{XyNq`lAk^ zKA|q5KA}#b{-N%n{-F+{zM-z6zM;;c{-N%n{-F*+AEqv%KB7*d{z7-IsrX}cnCdHZ zW%On0Eb1@nF6uApFzPevGU~I;(tqfG(f6YN1^>|BqOV1NE9`&K_oDwrAB_GOe@=gl z@6msv??nFz4xzt9Un!n{=sUqb^r7G%`cm|#=u^@EqVGlji#{0rt+4+^pNsw%eJ}c7 z@DKel_$Tat(SM`wHcaQI4@Z9u{-M7{pN;+-eK-1V^x^2w!9Vop=+n{vpzlHdgFXoT z4f-1NH|TTF{~+(t|DX>-e}ujW{So>k^dIOu(0`y0L4Se10{sR04D=u9JCJ|qL(rd~ zFF}8TJ_Y>``X2N@=!4MTpszuHgFXlS5BP`v2YnFwBlJb+kI*Nf{}S>KeHi*H2G3J`kUC9{wIA;`1dRM0sYZZ@(cQ-^hxPIa^LAc(ud^! zuG4*`zgQsPANr2;AL&EVpTsWoC+Snt|D^9p{}cY1fo)}1`kVAQ;UD^**q=Tqd<_54 zAH`4L@3YgS{mK96!{T4`Rq3zNXQls2-xdF(4-5a$mxX`m)1rT)d!v7&gQIVwYol+Y zbEAKwd!v7&gQJh5i=&UDlcPVQJ9k$6L5D_PMps5(MrTHUMt4SkMu$e9MwdpPMyE#q zM)yYlMh8dVM%PB)M(0NVM)yYlMh8b9M;AvQM<+*rM|VemM~6pWM^`7lqO+sFqr0QO zqr;=mqsybu6Q}8a(Dxw!(FY0nhyF&`|Dx|f|ARgV{So>i^hfBE(0`!sK>vY01pNi; zD+K)Wi};7W1O11xf&N2Zg8l^jL;r)m2aH1>g#HG74e}d(4*DOk5&T0Rg#HM95&9$a zNyxwSUFg5ihoQehUxoe(eHQvJ^j*lm^kL}F(3hbeJ%Q1^ttGN(f6YN zMIQ|Qp)Usi&?iIxq3=Zh$@);Op0d6Y{U!QL^q=TE(SL$N;1l{%@Ckh?`d{?D=zq}% zgMZ)}`djq5Que>-kI@&SKekTagTLsz(SM^4$MNAR`fK#r=)b{T^xx>i(VwF)M}Lk! z9sEn*ll~`tQ2LwnHR*5C=cNBd-;@3)eNg(N_yzsZkbmG#`j2oZ{YCnU^cU$f(to7y zNdJ*OB>hSHlJqCxRQjLvJ?Vea2gSbhHR*5C=Y)Ugd(!`ef9Q|W7o|T+pA`PV@94jV z{V)2e@K4zPqVJ0T(TAl!3zyTMg@5RO!$0)D>4VeXrmszZn?5)FZ~ET!zv+Y1AEz%) zf1Ef${~7*a{n3XWr}af&nf@|;X8OIM6M+KF!_h-;>bZ@P(dx(5BPOhNyP&-rsc=X*biKR(bsnJNAlBn}y`dw5A) z@xAz>i8urPC@b!mCjQ7E4%s9=DIhL^PkM?|#)yATihBl$e|T*!zNsx;=TqrB%f&g5 z&F${K5%=U1|M1G^{5hZVJZ4O!@as<>5ohuXT?Ob&Zu@^91_O3gz81 z%D?@Uhi_GWE~LDCTKRde^7QlC|I@jbo{<;-@Y+lKGe}%>ReaN4{L@6oJ1PFjcwWz? z>6OpO#4&NjMDay_amG2V(F5X+5z=4KVeS&2Y!a6|D1GLO zf&*Mz=|A6Zk%rTMkiE{Hq`i%2pK%q%H}j?cY?J;oqMLHS%Zj&p<#Ya=&-otb=e+O_ z*TL~QF30CQoS*Y@ey)S-cEbMH9sA=4*cZEEUpN>0V|VP2AE5u>7x)K$ zg8$)n_#ga(f8kg77k-BS;dl5S9FBkDm-r`~9`et4#lOyqgVVK!E-J1SRDAnQaqjy# z{+XpXm`m~T2gSvaijQR!CnqWXnW-&dU8sQkA|d5`?}r1Ibg z%5QI|u5Y6JwoQ4C{72mn{}fjq{Jg!GT6qzDV6F0GZRMZA;-BHlKe?5M)+@iJRnV-ZzRg`xYD*qHz9-5L%`+&qhY6AnL6=JsfOAUB>ks`bf0VA53yH1=g;|^?{R+4%lWwuj?Zy9KIh^5oR{-+ z9b6yR#r1KW*dM!NfBXRZVpr^oov}Z5$Nu;M{()cMANUFU$$jVkV~6N1|KWG|AAX2`;aB(hraH|w1B&$yLHF`ea?QK3S)%f7U(gpE$t!4)_1C&RPG|J*G?Hwun#Ae_j>;q||?$xaPe0W|lbTe(}%0(trG*|J7Ce6ZXI2 z^`C#I|3&>Dum7}E4!NUPa($m}x_UhowXZ^X?``D|^q+A5bEyA3qwj|MpL6Q_=s(K? z{imYx%n;?DY!&|Me+^Q8qW?8Y`H4Cm{b#N6UfBOCqx_aq|H-Sow@>*G{b$w&@xJE0=yeRIdD*izK zq5pMCToLxaLj7lv_~Xi`^`Ef+#Xjhi{jYzu|M_3(Kdr<+e-`{}|8u=yq#CjLQxL;sm6 z`xFxY(Eq9|{<$Fg|0n&g`houQPyMeg@;~~nbL77{<%j4$ne^|ySNuc&3;p|Rt=Z9m z{uAzhM*qnv{pXb8-*(k~6IK5$R2nuqia+-&4pmlsq5t)+;>#q( znKp_)eH3@HtN+zraj1ae({#n9rixE}6{p54{=KQVw^{KI9eiz||72EuhyFwT7wSK) z6$j~mO$_*FpX$W76@TAU++C;m`jxOimO!u{ijBt|I||aEvPs=QSq6&)G0o1 zR-E3Y{5Su(SP1no}&JLH_(4N zD-TlNqyL;%eoMP1dH+ve<-JhVXGEWY^zW!51e6vPegZ`7Xp?YxQANpVC#6RqRuBOk?f9QXq|4a?^ zpQ$>3*#8RkANXgA&L7|ZqCbZ&RYdwv)?|=Ov`_liyzUu@2q5st(;Gc8ipWlN1 z*Mxw7;`?94g8tVm-QSYB&%cR(!v5DN*`c=VL;ov>_y^5rwd^0?|3d${OZvi;>bz1+m#6LT<{=Zcm_^1BYZ1GRZ{@3qXcl5tjXdPa! z|Mjc-Urn|C8j64BYkh|OulZW1^uHQt-P8YyC=OKB`cB#ZdP3`docL$PztR6n4D=uP z2c5aH;t&0=^WvYeibHoRK0U6uv_|oX{#SA7Kb55aJR$w3lV0x;-?0DZe(5_M#5oJ4 z|1?$Kt74%4@HzW}_?+*h-2d~o?%_Y}|4A!dW|R1*xAbM-A^T1#6`=7bKaQ_e2$^M^h%6mnW z|LB8M6#uaQr@!j^`29ault0>tfBw7se}*dmq}>1Wqxk24YyZz;<=>S1e|}l;*Z!aO z;vas)EYthR{jZe!pZf>;PrCET`=9x|ru3h1{}27A|8)QJYvPm_g8e^v2k1HE6#Uao zI?s0LKmDZp^pO4&zyBxP{~Y$e{?q+G*dM!NfBfKj`=7Bp_NNbuf8ZDR2YzzB{m<`< zE9ozCpSl0+yZZlP|1*Au|NY(m=l|*cpOLD+&its^I064;RD8*&xUyaGWvJpzL&cxx z6?aOAe_AOHvHxe1;?jMJPs7DO|LOjp*_*n%AH+X@xBsWI>dgPG{XcERKkWb6uKGGn z-2NZ-U&QbK*{}LMzW){O|EZu{_)q(PUXl(F?*G{$eIT>)5moGpNG$XaemGl?te!AIh#Sh4Wi?R`=2>4=jS^9xAs4Cf4R?g|HYmEwEr3Vhx?zg zEA|cdKVx_J_wV*UyQ|6$)x{PXYVLg+*2MCeb~d;T4LDgOC)^rvwD54sfk6gn04 zKXpI#KRUoaJ^zJ15I+BfPC)&Az30EEuc@=Czp1;azr+2{@y~xz|FiES{`oKTAL{$? z`S-tj{tNv9-2wdp9Rhs;T>*UoodNv;-2wdp9U|QSgFdk?(0|Z<;-7y<*FoR;Po95g z|4+*2-{bfHpwEQ*4?0c!^Y7vFU+nAor{~{8{y~32cS3(chYI&U$3Op$?u7otb;Lja zg-(V37ytZwxc>)zFWmow?uY(|4v0R8F3A2LbVB$i<^CUZwNU?||HZy5?ms#l`drHA z-^1s>&;il+(Dl&w(D}mW-_ifj0nrEJpMOVxM0X7L|DZ3TE21x=Gon9+{DTgOK8Y^L z{xoz->Obl}>Obm0>bw8R^Iz0g)K%11)LGPD)LqnH)M3!@eT)C3GhACv+#yj}C=Cg)W6Yg-(V37e4=v4v4;o zu7`cm`LO>#J^zmG7C!%lzQ(>P^tJf?Kj?4haOiX4{vUKY^gnbz*ajUCeJ_0e9i5N; zKjHK5=z!>h=z{2j@z1}bKZg5%&=upKe}{kYKR7&m{vCaieQM~x?E6FiMF&RT4fp?` z^P>Nv`=bA%1EUY43y06YqralNqQ9cUqOYQ>qOYQ}qQ9cMqQ9~a4}F&XKj^dQwCKO+ zzUaT`!05Z^y6o>m=SBZT_YI$aM;}HPMjvLMAp3vdAM|H*X!K=tW%OlqX7p!tXY^-u zX!L1xY4mAy>P*4&?=__VgwMZ+{KG!y4#EDP?1BDszxXKJ|NNr(=X>qHVc+o-?Y|i) z{+XnE__K7CZ-VFF+XVZ6;(z}q-2a3A6aM}W`p*~Af7st#C60f(iht03*#E<8Ykj_0 z{PU&whkeqQbbih|OXvSc*YTG4isQ1sI-fY}VV(b)p8uL1?Em5VZWsS>eSgI5|0yT_ zS**NpkMbM)I{GQUvCpGJ#UXCL^4=Qdzdp)?CB#4R`=8l=5$=Efewv=iQhs4yMStZN z_CK@#l)UqT{(iXshyBmt{-4jpKd&qAvHv5p_JOefxw`m={m+hluF82O^xx8;|MlXA zA?~vNOQqiKvBR3hApW8M#r_lW@LuKD`r@B^#XsTx=atI4KPdmk?|&vgqf?BK{?jMm zAND^F2=+gt@37D3E*atchx>oHj)pou`=9UC@i*u^7j*ti!Si2S2YgmC*#EpY*#EOocB&xz9}ov)-|+W; zYUb8&Bgy`QW%tdpANzms5By@V{G*<1pH26FlkR%~-T!d^GyH@8Q(&Q(C(wVm|JZ^3 zKiPx*Kex$F^gr4E^Q`RulKcSsvj2zu?LX@OWB+^9_gpRe->m=NQ2xRGpXTxp{G`9G zA^iQHPjqe1ihpjJq@J7j=PUVHxc`U!&sXF2|MZrB;-{+=|A>3+f9#<+81}#7fB)wb z#l7(Ne+no*@?1!`|M?BYpJIwTtrUN1C=Olk_kSiT?y&!mKK#G)`#;3BKh@uFr8vj) zA8(0&x{7}uRvc`m_}Dk-e^DpK?|=SQad@rb>ywJBr4(N)D$cV1psM0-HO1eIio+8W zpR*_~vp;jY;`B=8zh%mM?`Z$WFzo|jf9o>w5BpoU2mBNM{!fDVhy5Yp{^u0|{|q{i zy#Kji4)rU7{XYwoU)X2*Rj~i(73H4-%0uIFCF?)TkYJxixc~VP<+cF@HPcr4jl6bI z`R!-z^MHTG=(EeS)mxVi0RONr&zqpFH zg8juei!+vrKQ`z8>-T>S2l@~Db8?GQ@<{&~@S1+FSo%+Ay%rPSEE3nSznT5dA^-d- z{&C`;TlIM%{dqxs&iCLS&I|uc2>7R{jyp!jhkrKc`~$>4c~|N;r*$10bbUAJx-N@< zs_8nn1pKo^_Fo{Kpjge{MR_~5Br~6EAITJ_=EmaP5d)i{IgN~lTLLS`~&yEKRo{h-@rBD{-2cmgFY1U z51a&lz#Z^M$Ukred;w>`AM87ZKj0Af1TKM3LjHk!;2(4#_y(?lZ{VDi{1gBD7n}rt zabEZQf^Xm&_~!5U2R`EY zFZd&T{tFI)FW?HEuYxn+kC1=h5cmWxfluI+c>M?dVgCwvG|D)lW9 zggfESkbmIHl=@G|KkzAB3ZKHM@Gsm8|H8r87p{eG;au#`zAyL}4u+56V)z(8fxqGI z@b?en_dmng@HgBIf5YMMIb05(!#~77;vVsjI7oaWu7&%biGShqU+jY)8s$$9{CR)fc!>YV}C1o zj{5(4{6l^uPm+JgJLDhoP{=>=`+vwgA^(t{$V=h=XYwC;kNig-B)^f@$ZzC1@*n$N z$$#X*aQ`#;kvvKMCGUp&pUJP}Rq`u&mgm31{m(rAMSdnPlb^}c@Xr--5B!4;1mD0l z@J+}+a1ZGR;oA7$KaA%e_!usRkMR@qx0Jts7(V~Sb9V4&{O=#ar`QEP#ZK@q+zbDPzkdkV z!nYy+z`gJ<9E^X!#rOxDjQ$9Bv;PM_gsL2PJ>L2PL z)_3^(htxUo&wo(|rF{O2^+(;o^Isda4yiAwE2uB1GpIkPJE%XXL#R)vOQ=t%Q&K+v zMSVkEgZ@LE!}_Q0q5h!`LLa6sqCTQdqW+@pqW+=|yWaC()LqnH)L|)~|B9dgb&KX- ze5LspPH`xH{%QZmljnai|MYY)|0|q-@uPU9g62+y^G}(tbv~GXdS#Dh!3Fa#YHI!j z^G_3p^>Y<9m*QW||LU=?yBiYBzhM698qL38?rAvx>w5D~=SUY~{wZ_FoQ}`@uQlb8 z=YKK(G_}rKSLg4e`4`M*jh}zoL-P-=)zY(uSu{g|IZ*AiE;ZL6e*P(QFPVS3PID0I ze5@J6pFQo`Mw92Cj{QN;D?Ieq{L^=D*E3%)B+viaQtw~SKmA~*;@v~Z^WR4ne%h_k z8knm&2>)-)KmBT@Vn<&woaQVre=2_dDf6lB9jM>FdN_Ih*Qt?z&Hp-ICwczYCe5|j zk~Vq%S4GXg`23Imd;Zs(`keWv%-`y%xf7=}e}Xw&%$Eq~pMLSVW(Cywzvq83m*QW| z|H`Ylz+5lpd!?NJ#T+o^f34E|ivjwaIbrehPbcU)-q-KKr<{M9UGpziX#NHBPfO|g z!uh9fYyJiE-&ARH=6|)* zakjP7zF5t_U=G|X1(WB0wGZZhG5?ggbIiYB{wednn16aw{UZUjZqjq5 z`u~47|FrND?S8=2Pgb{^H1-5TlMOE{Wghyf4{$ehoAYUZS=eP zx9Ruw&#wOW=AZ6p^k3(nGS{g`P1#d(4pPoPt=uem{%I%8H^_S_dH#FRx5Yi0KXCZR zA#Stg3&hVqU6&?#{^=8%Kaeh6^8C|o%q7UG`7!&G=YO5=qFM8re{j9|r=2wa;F7K< z<^0o~`m>btPnrMqy5=kVu=%g~r|-4Ze)nMhS5M7hNIC!X%HiRTxnIox>ZjLVVtPhs zL-PFh#mb>)mL|_XEs{!e#IvYQ(&s7XfAu*##7#PsJpVL){@2Uxljnae$g1ZUHGiU; z=1`=Z|CO-$zs~>qW1eOMX|Ba#&9`W(84*`|{5AiJ`S0QUuaEUPbHc*;Uo&)m=3g-X z>+|%QhuS}R{yXzeng7N4=j%GQG}p5Lx-RBljL`gxs>PG%UoiiT`CoZt-)owGF+}#Q zs`(d>Y3-cs@|1f`^Dmf#``-BE`CrV3V@}*s&A%w6`@Z*n{eE~b|KeNCzi6hv|3onV zqLJ=9^G}(>_O9%+W|(Hc>)&=wcABU87mxj>--(j_zn32z)BKBY{@0G~dj44Uzo@v% z{5R%*eW3XlWyIvnzc|zWzs~;(=btkFVxjztIdjaPWB$b;`QKd4zhFLZdp~(T9rM3V zYyE#8%>OzR%>SyiO8SrHU!QHVAM?MM1IYY~i<*D2QSpKK7d;ez?$rE?lA3?v6o;69np<(D(_-mA znt#!LLTh(s++Xug%PA(6)PH9cpGqoDHPrks=AJHlxrt*AJoDX||IU0<=DfF9t-X!n zo`-d8=D_oLNBudU^F8LTGk3kR_+yGVq?!2QWARTP&DVl6;1A}mGk-LbIE4A^%w=CH zK7mtKY5v!9n)`L7cR!m0|FHOn`KMhq-wXcPBK|op{&`gMzrNKgpO4X>^Euz+{G6Bb zhx6Z`Wv;xAAI^X0yqurw;QF{Ou8->+s{D6G{KNcr=0FWne#@l1wovn(nDfp2?X z%;jc2H+hQr-^~3c|1k%g`QFU+X1+IbzM22c+;8STF$bLa;LHVYp#0cLd6N0#%pGU` zICIFEFV0+X=8H3D9R6YMIP=GuL*7sPQ(bwP`Q$S-r|PKqhxzZ#=c*1A|D>G%UPAoC z-1jz{o_43jL41Dtiy=1ui#hQr=f5`*UocmzXX9kf_^0{r#~Y~kFfw`m*KWOr^WT~8 z&Ybs>s&|^WX75{0{$P z4sXi&@Aw~nhyUS+_$Pjef8wVr75_E`{8QrO0C!aJZD%n5tE=Yxq*MG`r?~gD;$KO{ z!Ht^+*j#AlLo@%B`Ge&Z8;U9ZFo*eW#g_VtE5{UHn6>ka;?GFU-KnGbJI57=h)>KV ztgrZ#NpXt#&&+*h{tt05oc}&Y@$C!6xp4j|^WU#&{yXupgXRL&QG86TIN3q*w}av? z^WPgP4l`f6tm5j$cYC^@#6Jm&zjGCL_bUD}hdRIFb92SzKNO#tQ_cL#t;&0^Kc?qE zH3y3M-puu8zLU-Q*1aR|k^fS4Rc}Z6k-6XxD8GgC-^n}i^G^pWuf!H;&YtoN^S8tK z@66#2=f5+bn>pRg|7Pwt^S^IX9t`K7j#qwT{yX!(nSa_!`Hwl^Dd)d4f1J7F%pYeC zIrGJtE6#jz=8PW=_=o(<{L>#VXitFhGV@!HC{GtTlFUD~#6Q)=KjHjS=DVXIvQIRF@K%8>&#zg4m^(YAIx26{yKBm;UDI* zzac((QJj)l{8M$d=5%e42Bz0={yXzcJ^dTX^c?C2JgNRYI=Nmy7auVfp84?CoBv){ z$7inme`o$XcE|qsK{)>%`(kJK2fK&-^H1~Nxxd_3?l1S5`ybAKheNT?-_3u=zHsf9 z?P5pqPdNV_`-k)2@eBNe`KSNs{CE75`R}ZM);;wPae(z5KmVQe&$?&*69yY)ux?+8?&RBn}JJuiTkoC#BWPP$uuQ&glbThxkBT zAU+Hc{}6wOJH#L25b=e$LVO|45Pyg}#2?}i@rk%Zd?HT4Kj=Qpe`gLn`c63iG@SpA z?!)|dbRhJh4&op5A9N!41KkDv1sw)`C7k~r@(;QT`U^S?`V4c~(P!Wv=D#!do%!#~ zfk)pNDX!@!z8MwhKg@kc|3L>rAA*aRe~M0o{`9KOi~fWTg}%gb(U;Jf(4Wwq(4Uxp ziav!dHB9`2P8C1@9UZ{tdn>Oo-Tl|9>Tl}s`N}Wd zl~<^*sk5oSsk^Dasl%;47ynp&F8*QuH+4V!gAPD_&s=Znd**yo|5Nu<|Dyw-55&)Z zM}I(fK!2z!{y|@0t~m3>(HYPm&>hep&>_P4@8}b=m8a2v(0$s7f0zT$e0Ovm^d08B zqyI4Xo%!$RKzx2qe~vzcPK5q~?gD>gQ+!5WL07rEaWZGr7Js0-pueEQpwDa*mwYHb z`Mde==sV~c^uf2~ z7x&9QF3L~PAJ@t6>d61lAv1sVwCRfIixK%5^WRI#@9@8Dm$k=I{)sNxRQ`!hN&QFN zNBpA>q`srBqrQ7eagO?rx{vygI*|F$)P>ZC)QQwz)LqnH)L~X%DXv(3r8qM-IHbs6;;bsF^_bzjIo)OXZ%)OXZ*A^)VD|4w~Kok;x|&VQ#4O*#La`jfho`ja}8 z`jonq`jk4A`k%T#oc~UJAI^Vg&NullRocdg{|90`uz{m7Et?~oY_oVBYz9&1Q|6P>b2M7AkarpgIW`Ww32S>1p52Yv2s+2v*Z8_?<2$^Phm=zr*dA^)K7!9VDK zzsc_Cf9QblG5j+}{t@yIx+DIF4hdhQE21x=GonADJEA|r;pmf1RR7}#6O+HKW75| zDLqp2!4w}pS6o0JMkhvpu0Y&T{6U9as`!GgJXG=Je#IH|=U)_e?ic?s{}g>1T^fBF zo%-+Qzo+CMbRhH}{v7_PEB*=RzZVyO%om5i7tB?ELVS@^I?FNf2i$@Fa-%rJ5A>h- z{@3U@{t4&5_ZHub73XXU^q-J_;G>BF|1kgk7xB-_IxpwH-u!pY&v`k2uYiBD1oPkF zwBE{pe=6@ip!|12d9YVI?bQqTC$I9{qJV!&2mFIRz+7CGK<(+oQKg{8# zzJ64BrLOYJPUV>gm4D8Qf2Jz`)MhP7|6wloDdng6;-9|Ce~&8fZB_nTtvt9)`Hi{W z4=KN`QJ!m}{P%+L-e<~x+m#2iD?e^jUL-&ER-PpPmQ>!oD*h=i{wbyW8qR;8tUP;4 z`S)|>UFMI&KMzU&X{@|lRmYte=s)N_@Xw9npSg>4E#eyZ2Av1}2mT55pXvG>{&`2A zZ_)Su5dZWNcYG)QD6MsRTd8EO=-gQQe#9A7#UD+?9q`9*;*i5yw|m7UAB#`!5~rM# z{)6r_wdNrAo?hv1G1tAD_~(s)e~O5EZk7I1RIfJ&`Vag=|BLgN)Oo+x`JV{*r-hDt zP{-#y%zytw=Vku;?E(KB)pc=wOT<6$?`Hx3(EoC>FLrGr`(_OI=N<9S&9eUs;ve*% z0`iL);-6dPCpmQgtLVP}ru&Z_;7jJebARgx{jWi~@8SG+?DM?r0-wUE{bm34vU`&3 z-&1~&SN828yB3vwu`~1EH_Pr{$^Ng%58jl2Y?fbilz;pf@XuQLT}$~N`VV}KUwtqC zdS8ClLH<`=em712_pAJHUcf)_c}Mx_KE=P|ihE7OKdDX*a7l`9?1oBK-il8}6{prI{ynX@H%IX=mEs`$^RVLD`hb7#QT)58x)1(g4s-#<$43&P@HV3_*+MD_h-f5Hj2Z{f3K#vT14?Rjdb?RioZ(~caJOnE>awBsQ6qs;GeXL z)3+%9eWbiM`Y}BVr#!er`Hi{W=s($%=X&Yhb#C*do1y#{&VMhdyx3Lw?N9Mfwj-($ z0{v%Y3jSfvHu?{9w?`=d6i^;&rg+g(d1;CA({kmh#maxzx;(At5T9~wf79>hD8Hps zT|ZOnq=@ny^S`g@dfF-fkq18r_-B*;j5*-y0t&WV4z#_>;@VE%hN|J)?*3H6`U`g~2mKj=Ss z#UG=@9Sg)Codf;2+KphgBB;#B|(n{`*Hd|3ICW`R`l@ ze8&9urs5y2vxMv)&VR=bii&S91@qra2mEtR{4-bf?<7CKKXSmu@(=uEx$gf>y6^Al z{y!-@{BdD`+pYWBF5sW_SB)^|az^V_ukYir%#sr64C zv`O)Sy6CXt!!pH*R$70ZweC)8{gu@^Y^L>fO?Abm;vd!-^WWdny8BY=Z<*F1^+|fI z%bZ%DzSijmt^W*K_pJZ!iUYZ{z7w>rng8BH>%3)L|0})thxl+_{IgB*p^M_gP{kkS zzc*I=p$>ad@g*VPpFxT<%@uz#k8kaoDE>589IBxB+|KvUL zA9;}cNM0mAk|(LZ$vfm9@(}rjyh47V&L;nmcgR2FA@UP>iTp&KBL9*1$baNP@*8=L z{6?N5|B?5|f8;^(BYBbhNS-ABl6T3!L;Z*ROCBaalb6ZQ1xCXwV&xQU2_rO1J5PSp|!AEcs=ZCxCFE|Xof~(*w&I5nJUGNti2A{!Y zTp#)m{0sNOzi=>oi(TPcI2Zm!_k(}Y0pVk~7<~{_!B$8mvANbx3TUs{0Vn* z|KU*V1DBQ(|G=s6FWd|N!olz@Tnpb~XZRQHg@55-_!usRkKtta8}5d`;c)mGzk;vf zZ1@}QhQHx(_#7^W&*609A90WPM;s)+5!Z-s#5v+0agX>%93(yx7m1I=N#YN2hxkJr zBEAq;h%dw$;tz3$_(L2bJ`tCw&xljRKjI$ok2pwtBd!tOh;zh0;$Eo#5Fd$)#7E*J z@t3$u{3Q+(Ux};4SBtZXzr=5B?!Pk{8L3JNz(Md0 zT!X#?=Y;!z;2$^$J_`5$@ICkg?tnkgVc-k60=|GV;19S1{(wW^6Zi){fm7fgxCj1$ zgWwyu2EIY(fq&xlANU9^f{)-N_zUjh{BRih5?lpeaUS>!?t;HU{(;NTr?^h|7w(0B z@que*TT2xeDE)JhkxN<_!usRkKtta8}6q6iXXz)a5a1lXT#rcH~bBUqff%+ z_$N9g^$&Fq^$&Fr^$m3m^$m3n^$&Fq^$&Fr^$~Ru^$~Rv^#^qa^#^qb^#yeW`YP*; z`h&WI`hz-z`h>cK`h+@#`iHuQ^-mo{eM4PCeM6l?{X^Zu`lk*eKA;OzA5kY!e^GZ) ze^G}~Ur|@}R(zq(qW+@pqW+=|qduz=@DFubi#yY2@GtFck!o$KRQ%WC&NOLLrOJ>& z?^66PbE@>IdiUwwwNjUd2RvM<>KzTzq-x*3{b$)faBmJzh^^f7u6yQ4f-AZ^s@Int z@9W%g!R7NK_UDHuZm`!Pxz@SXm3q3(3pTlJ6Gv(P%sTr%?`xEd*!TH+e6M+-J&wP} z`^ibG?eAAQyxd;BA#b{g+gi9etybx|vIpF*6K~j`&p-OIy}mJKzS~vjb~k+NYp&Y3 zrtZ5J7rK7Edb&sZyzW|*(p;8O%Uqthqul5dFT0b6$Ge=p-*5@lUU04NeMNu&WqW^U z_zJfmX_>v}`zP~9?0kcZe&U{e>n-=$q}BF%bBQT-eOxEk_4d6-9M{Qvj-U7FdOPnu zMRwSAxIcE=b#?mjm|ZvD<9esR_=V&8c|T<5T>E$YwEP8oo%6sn*Z(@j6n)Be2oqzCQw zLaKId`ueKwYrm`W_Epoo82w&muSV{LB0V%CtFik-G2_5f&D`xjJnW{QYU@%}?Coxz z*Fk%uySj5X^m0>r_j7A%>UTi9ivhoX$hDg^)E#a(*sc0twEOkp;cow3que)FySff- zo^@@PGO!gWq&uL_Gnjexqd(5 zkqK_&=z;FUj4AHknIqigzPfiid$`B*%yjA7407Fa&vTth@$Y%r-cMQhhFkX02z$@> z|E#~lj=%T2weG8F6Wo=@SGgzee9rwkb+PWp1p6NEZzwv~KL4}Pbi2OI+mq~mw#vBE z^}qW?S83Y2?%i2a-J44{*nJ;-=3}#)_tKYc^rAU#c%P5lgQe!V53eM-YOQCw29K|H z+s@8&zrDHCUQ=b9<9M{X$_yTFZKZ5tUg?7mJ|u*~jvz9Osb{@>GLz1gG7Q%PpmEYr4|othtuncWx6+G&0; zqRMXbi|$=NHb1x_aliRZwn4|t?-F``WA@*3{HXcE=rw!IPq_~KGj*BM4u9o6ezwv- zX#Q7t|L5k9xBqe6{Il)u)8@Z?55Ha2=39p!^S*5B`*eR3+`KA{?X~q=zU%aDW!H4y zU9R!gD(=hTb(24@QORDP-dx&U=wHcoSyJ5{C{fvcSH6N9JJQo{(bRT{SDbsbTO&7O zR(;p*Vr6&R&&}Ok!9>whM|F$ciz3!-&(={qt(Y^b_&2Ge=itdfhS?tfJ zH%)D?IX?c`YgD+rTlMOV?%5s{TtfQGUiuQX+}6?=U5>;$?p*1-?xSd3_xR~+-b+hv zcl++i;$H9E*o|3ngBv~VUbnGicK5`I``uHM^SeWfn!2{*3c0rrwQYjM6ta~VR4_CPKjqd#ZPVVT6oNoWh zM_l_3>0O2gA9t0%%I%uI-`CY|o8XQV9O$atp3$wYIK-Wc=5;#~hP!8vW^!E$jdu4m z%;&}*e$I6+U(_wmHqx!1SIi~7InH(ZqLTWy6Wtwq>$r?hJnw2eU(wyQWVB1lTiXru zhq-x?^4f!?eFi6Ly17Stxpy+wbC*7w;(p1~#LazlhO3tAJ~!{{N$Sbm;WiB)?_T=- zJ~y`AEZ1P=gYMov^IXj|`rW&Yij^xmy4#YTcL%55>+T#k+SOa}fO~nD_7`ZMdz-o1`)GW)+UE6M!f#iHBH{`W45n!ija@xJ+2 zsq+r=kL6{O%%2jg zy<>JScSFql;JvqYn!k1UaEB?>mblyl4G)*m%_9Lc4We zTAWzh?<umu(Tv~_x|=>c2!kp_n>4%9ev*y2Ko)Wl0=dLrh z{%mF*DNpaM_R*nSHpd=jALuT()s>1|Ke4 zJ2aaQm(^{Q!-vbB{2`+cmwobS8Xqp}&^eb67d-iF9v?2dZ~sj`T$cNA4j(Rieq1ge zF3WYxO+H+V$AA6H zvOZi^w^(T(4y#?GxSz~r3HClZw6J}?Wl90NzIpdlvisGoUv(cYYgMDF50~ZMR^IOG z<%jF|@bu?(>iclh&_%U;xa{>Fm3+ACi&x9|aM{MKCG6F^P{>c_vIP6QK#u%&ysyva z@!_)ZM{l;*UWbd@`Cc8G-Hvx(6ZxZ#KO|d5AFjtQ@Pp6OHSpmw-ecbj4Qra+_w1VyREt7wTv`f$~T$W1<6wXH-RAFetT%jLsWpZ}5FhpT$* z%jUyXT~229;i^sT^ZRgB=7fSiTs7grd_G(?Z+TuHt{Pe3W*@HlrsXX@Ts5X?0Uxev zcV`|SuIlo3E+4LX^ug>tT$N*DCLgZqnJ1eMS3NT+qYqa-wlsqeR~gueUeK_jS+*|x)u1c`?3HgiJbq<($^5B9y7FfCPkL20KSEqJVg`B(q$rG4r$ z;so!}byJpt0bv0>IRal^sgd6()n^r`#ieBa2YF68eKx4!l6@Zl={UcgnRw~4c&0WZbiDsfaS;3|7B z&WgcR;rGN}u|Q9Y20RmktHeFAfKy^{mG~tFSBYn0aFzHb23LubLhgydRpO{vz*Y8M zoD~bW%DyiSv*U}~VsMps%3j4+F}RBB3ivJ-=w;D>+w8pJIlB(=on4oBF9uif_W}-# z1$tRD$fvO&pNDxe7Ua)ZkWXW9mGWy0u2TMw1$j3HSBVqCJQfS`T`b5?u^?~7f;<+3 ztCZJbaFz07nD1h6mGWl{u2MdY!BxtyF}O+Z#Gx^`N}LmetHeQeU&X6t2k~tz z;GP&WY?}`Te zZvH2(H-8l8n}3S?qi_{}55HAC5DoOMXb?|hK|GHIaWWRf&sY#oV{nz?YYeVZ{Er23 zHwITJPlRzS7R0+SKE;B#6$|26EQo8dAU?)|co&1K6hC8dmEvg(u2OuB!BvWVQ}>oK@Wc`pW6DPG6mD#h^_T&1`kgR2zhV{n!7WDKrS z{Exv^%A+y3N_jN~S1HfN;40#{#ah^NQzUaFuu|23Lur zVgXm#dvTUsr})plC;qa3k2o;~SBYn0aFw_x23LtwVsMrCB?ecCXJT-b_$CHdiIZY* zmAEGsa8xYdDtj-^iUnL{-xr73@x^U1xJo=_ui`7azv5QA4)LAYN8D@27q{7Y#dCHY z;yb%8@t)aJoNU)C4m5jt@wEAY_}ctU9B=+4PB;G&x5wZr;zCegMd2#m2X&LJd(~4G2UK5KTu{9g zg{$};@j`W2G|;P}L0x0(RP~RoE7dEu-c-lf`cqwF>rr)%t!vdwwoX<5*t%CeWpP0D zmBj_sTNVdYUs>ExJr*U-sD6tEbyYN|vtn=+*A>)x(Lk??5@%GuS^QC57bPC4&WjSC zRQE;UD*j$j4@LvMDjM`Hqd_0jxJv!UXwa9827O9PJR{KB--Y`lHdHUuwr!pVQ8({-<4s`k{7R>W@Z){;6HB`livKk81f; z{i7&crT&%WN%e)IaFzN+QMgL|qbOXZeo_>!QoqacuKG+-xJrF7%VX->MBys+cPu}t z9}|VE)TfEURqESB;VSiUqHvY^L6+~---*Ii>K8@fD)o<|aFzN=QMgL|qbOXZep3{# zQhzE6SE+Agc~yO+C|spJo#l1)v7&I5`g~EiO8u!QT&2EM6s}SqD+*VsuN4jYf>F3i z{jMlnrM_V_=p)*D^%bK*AJM+AzM~yqeaa|Yr9NRa=o{+aZ+%32ufC#vu0Eq(pZc73 zztoqF!d2?)Md2#-{p`M~e`|J7|2G=+`J!-@`hL-%PZ))()IYRW^%J8(AJINnpV5w| zzGM`xQvc9i)lanZsc&h=Q(w}KuRdio=tG+ysQ+wSB`!4ks*h}TSAW_3K>cR(3-zCk ztN0#VrM|Rr74P9H^>NKk>i61xRe#p*xB9kr|JBDed#JB#c2$4a?4*9L*MvLvmF{nGRegXcT%|sX#dY-|qHvY^G*P%p{e>u8rM^QHu2LT& z3RkHw5rwPN*NMVa>Q_YJD)oJ$aFzN%QMgKdp(tFXK2Q{{Qr{>FSEfRq7K(;VSi&qHvY^KT)_!{h%mZrM^=Xu2Nsg z^0xX+(V!1#=T-kP3RkJW7Y+J;(V!1#@6{Ky>r}tezNdbn{d?5cjKWpwzeV9H_35H; zmHKK?xJv!DC|srfTNJKRKQ0>d^`dZ<`gGBt?-vdFfc9Q}!D!G2wC}5LXvbHdF$!0y z|7Wl22ipBrpVh8I{YbNq`m}a@^%?EF>Ob0bs2^$9rT(PZQ+-{#UiB@_-s=0B{nZCH ze^6i8?5{qs`HT9-=3nYFn|;;iHG8Y?YxY+k*!)3#Ve=35iOoONr?&N?zPi~%eOa@Y z`nI;N)PJ{isQ$g#M}1nem-@D5U-fy-?&|-VAE+N}_E#U+{6l?W^C$I{&F<>|njfei zZ2qRcv-y+y%I06{Ge?7c1QrLhf55nkxBypaAAqfU?GLaxp#1_C7qoxCxQg$=RoYiz zT*Z61N_}`+r|Q?+x>A4L)|>k7w*E3a__(b{_2q3{tG{pSRQ-Be_v-&!9MFCMiwoKx zU~xeE0W5B4|A56A?LV;fuYCX(540~J8thlFc%*#_##LMwT&4X67Jsx4!QzqjC0KmY zJ_X|{z6V!n|AKK9@8PPX=2uFgQ{A3^MFgJO)wM?io|<#+Q0d^k7kuua2OT=`Wdwe@ zQ0&79I?n^=FGt{~ard2%z)x8xERVoXcjtRC0zcKe(mi7RxU`ic@Y9;EyOQ9iZ(BXP zIC!53KRq>R&XVB!UT}O5e!B8%*6=kFoZkzM=LP5Sg7bR8b$G#bdFTye)}^()JbFxO z%XfPo&S-gX_8sXhFa9v*L-Q!RMKKiNQo(Q_coA)h?z(<{!{Ue*@pN%K8T0SZ^;Zg)XdhYno5%}oNCw`2Ow|2d>KLQ`UQ)yQOKFayfn-TbE z?4<<}_^80-tr7UhKR!JIAEkM9bOb&s*6p1Lx`WI6Z3I5L^6+C3@^h0BjUw>Tw2=uB z_^4s#5fS*P(X}oS_-M}hauN9GX!%SL_^8m>9ZA;DYq2~DK6-pxtt9y9%N&oC4&Eoi zN7D-JUmSctF*v>lADz4HyF~aX@m%Xf_-OKn9ZLuAlY-Bag6s2w`{lt$dykLz;G^E- zJTJJf9-JyW*gmLiZ6h9hG&xsy4?e0gGm8fwtw}#WF?daakFK6MQ6l&}5*#lAA3e5Z zcvA417@RK>94`WY>G+Yr{w}bm7ueZ@i)D8YPL>}yI7ohB`>1q(y}%A$aNiPx`{@Pu z*9-2q7ud}U?BE4<^#VJ4f!)2p&R*ab9-J*dvVBytuNT|qj@Xe(4A4lMuL1#XUP$y0EqF1ismNzH0=&nVh~w1io3)dQb$u`FUvV2z*m_`K=N7=Eb^qM&O&L$2}Z@Z!VsC zE@HY-i>VR#X46}XBk;{FKctVqHw7vlN`h~0T$nEc-(=cbH3Hu>xHc;ZzIo{NTa)0M zQ&%q}!8fJ9Y7&8OMn3yU1ipFeqX`lC=7FB8Bk;}0(laCQ&9w(NMc|tygSSTDn_?Xo zM&O%ajh>3YHyhvkJObZT%zZe5F41Da9})Ow(Y^PS4$hkh-$W{nO@eQ7znMJ=zR7%M z)soo_~wnLwk5$gYw}l!z&FG5<&D5M_jEs<1mE~A)+E6< zuMHlY1mBF=`B)Ns^L_hsTi~0H*V-)!-q(X~=B!w_B=~+}aQsC0X8YdM;cHTGf4$&3 z5(E2q!SNG=^Ckw@kr-T;7ueGauGb6f?FIJt0)OxV`+I@Ec!7U;fqlKe-dISVV>x*k0y1+hOU@tGQuNTb!)x7JUtV#*!7+*pwvS2c%L~?_7pxmESWjNC zzPw<)dBM8%f_3Nx>)H#}xfiT^FIeXub&ukLLl;sUv3*Qh-?ooQ>)i|DjDuGcH$3Vk z#S@1Pr1;{{ffR2XoTB*Sj*UJWVISY}ZpR`U{6%iu<2(PK_x=;}-ND;-MUHM->~8G( zPNYE9W$uH`uSD+Jv)Fx7VqGLd>qYLyGcVisd4H}$^7jj0nq%Kv_RSpod&fu2bZhc1 zioEd3O853dQzIwSuXZ1n9S~VJf2DgX%jC$M+RNO^6@w#rx~_Bkvb2bt*to&Pb{CC2 zd)GQwY5kp%+`qr=Hcl=QiHu(9qO+Ss_KA7c-qA1e?$*U_^mBzHMOQDDc5+ALk!FkB zv4c0;_3-}1Zu8wE&HCDVzF*_Q96Mj9r)Ii=`zJ<@Jv8553$2{Y|FYFC_L*L7;+6ua(I%_rLR4tjK=U4Opc$GX=pm5g*szs2p! zbtUQO-BI`JwuMP~PHc7q{`e^=@0<Q?!g_;)J@ZQo2yVd zf6}RU=h;a;ORaMqJC&7+<&ZzOjCkj5*X6+2 zQapp8<0RgC_a66q&bJcBe!0_4xS>{J+E=%8p2VLg?c+KUKl|u_o4mT5ccI%p*YelY zUj1TwT=prIy;@s$x=!8GdAo*e*YDSDNIY`eHaEX=4KG*WZLY=COkSH$BJOhY+Ft9Y zHf!&3Hg86S4es{c(ZmsxH@gpW?nwOnx@(_j&Yimw8{M|jeKPK`#OF>g)$fMX^U8j*)|I&-r{~7J?Y^t-yp!cux(&bQ z@^XK+RKL6WVdB?g7rO>A-`hB9u^W3iw>P@dBKLfw`X2tu`~IWmyEQBKCi0%|=PEnb zj^A(hOt-X4w|doz%ym_J_e`ume7@V>vTr@U$NTlw7TM?T%~)*LH|5b8c0ZrIGQ}0z zIwR?UJ7>5P6V7fKzG0@__lXlGn%%xCFwS*r^FvbaBU9WfOHLxvKb?5_N5SGnQle-G&SP5g2A$$sXay^8cS|IN^>i}`J~7c?hIeq8Il zj@%!wP5w_=Z{ESKN8G%`VczoepSnh+T6w+K9$;O1uWUNTI`$6a)Bf1Oi#@mZn9JN} zhPSKB5%+N2WnRVVpSp3|XL^O-J>X6h80ocpWS@KZ;z}>!<$bPj&bi(VrS}jQyjzEz zB#wD6o&Cl&er~V#^ud#Ec*V_L^TsELkKSip&JaJnKaZbv;|G4}m3{uSEB(heUhg}; z6!U)U73uo9ThizUum9Pj?&fkAyx9XjaditH_6nc>)NOtCnD~J89s1J2AuFpee{8woqf0We!3m*&so2C?|=58D?aph z?{4iY?tAK_SLxPwU9-J^cvJ3=xo4ie=FRA}(banI8?WetTU_l--+8+yu5;tN9q=Ze zc-uwGZSrd7T<0Rsf8_o4+6LDz{|4{2ZJS;HoO`{r9ir~{q3gUVJ+`@nD>i%6+pcu` zzggtH^6gT$@Qz7d+3G7@yQJ5=JzDQi6rSuYdw#J?TGQM6wc;YTX<;wV9a-vL8{X4f z^z7TN^EVT`@t?1C30=B*ZA)!%t-E#c?%Wk|+0%{p&WzmbGOm5zyQlaz*W;G?UdxHw z-H|;Dy$U}>+?I5&da3T%;AY-9#>@WhPPcFEgWjl~+uhMo?Y&`H_qc^!CtDogys1ae zcNu4I@dnIQo*MePmsov~8}rQ;`<(Ziht0R^ysO+?``+mMbM4>Lde=;sf7Kap)rytw z!19m1k$IN6?(e5^9}m#;9D`H4VttmmWh=h-_HAG6a_mp-UVM0wy>`BLzB_)y4|aS$ zFMW27{ry1;X1d%hKJkwCnQyNJ8ZNT?*R}l&J5SRaXW0Gkd0>hi|6s$JcD~}?6tho- zk`v8tT^o%xJ9g{ztl972ePhhN(~1o>`#;?FNwd$SX~WE3Kerxf_S<@XjM+1F_Hkz4 zt*=Zp|4Dy;KlA7B^Y*m+x&I6OZno}sv*!BEANhUaD_v~egx-QS;@^|br_-Q>Y$ zpL+`rH@hwWcBI*H;e>H!zpRz@e1q)U``|?Lhw_Rm*zMBe%Y)%Eoq(3_*1`OpmqDeOD$|& zFF)VZ)^ooPn%erlvt~nEAFpihW9#VMTYA{KxUbMaTPF{#e9YEa*=dj1`inl(-qvHr z3C(RCt{>CN*6HebO>AAaI@G|{U)CS*vGv&NY6pu0E4tUS_5b^(x)u-K8DGQJd7dM_ zt^2ucs#`p${Zd7X2NxHY3iv9)hp!4wD(WZmRr34eC5rg)Rk>!xefVnkjU|2f>Qu|( zK0LK;R#88huM+HijY7%a-_xzIeJ}Szh3)TESW(D_uf`^o^5Lshearap)$GlseE4d7 z#*#jK)uc!{AHG`oL3uUAi$<>HD(Ayjjk}le;j6-{O8M~B>#0im@Y2HO#eMi{U!&qa zJaukbQ9qfl66}4(TZ{O~e3f9|Z`-x7ov+uMg?#v`eBmPYy645Bc71(*DPY(2;BN)& zI-4}eZ^tj)tFWE7Z=)+g# z@>KTWtDPMx`tViLjpcp#YT>#nK72K{RW%>Jato^X@Kxoj+HWtuI&?=xAHI5RQF$M} z>Yu8d4`1y*Th@oKhBYbUS2%jdl4TdGbDYGzGiv(euaTcu_sMgy#A=);aYMCQTt{O0 zgSCD5s^+b=eE6!>R73a4_{RpRmz928Xqm;!%LN`6!+n)c@>NM@YIOWMg3&HO0f4&RxIKt z^HqX<|NUnR+wlh-DCEOeZJ#OZ!&48IFXAWjRf4^r^ITE;{Ndr!T-$$>$$?Uf3_dGs)HLzWNAHLe2RLF;)$`35;!&f!6UU=Q6b(G9k z3HJH!#Nu|m%iopo;j2UAirVX~Ws2DOCca$Cj#urM5_bHN?aG+{OlXkX{HAj2+~!9g zF34&2udw|l^Nahln1A)@n9c70tg;2oPES0Q z-|lP2(S_}Pzje5f-T$4H3YtCUj>>O#z4Mcs%udCR-DGy}TPd&k!Q^qd%`dVY%V~aa zd01}qo91P6nBUbJn9b~;XLnBXhc|D{>z{1>Ua7kxS+9xZ%`utm9zDQMtGe=hW8vgs(atDdEFcQ!AA5$-kpME9=8oJw}xG;j5GTEBWwMwTcye z`08uzmnPqzu3F89uRi&zl24wFOeycfSB>^o_u;GIMXUMn)zJPm{basMu=7R~2jHtq zwUwvDQ^&Nvlldya-WSsP=Q_KLENtIP^;BW|_k6d%kPlzI_--j5zPk2n2_L>HwOG$( zh_CJ`Uebr3-ngf@4_}R)U({avs`+PF|CbL`LDS6C}KNZSp_FHmOZnN*J>$02u zKW&iB>~m|*9A>XtvvZpLZt0ra?CD+1WA+x=X9DvRCk93!%s z-)DU>qph1XKcu(&t6z<=`#pGSHnUGIJ>P)c@_d=o>^P}vUbEkOqxGDF>^tz#P38~x zE3RO-I>qvu9gBUG)BL4G`GV#T-NxiM|CoEEkgeZrb<)|o?c5-pt>b%Uq_y=|W>7|3 zm&;D2w{=>yd^%gV2lYAY`nzv$u=QNJZ{7QVOfM1FK6!0tYsUqUE+Oiw|Jr3D?aGXyHvohWTy)FmF!mmzmh#G;8(J51^h~OvVdR7?iKJW z+0g=iCA(U{uViNn_?7Hx0l$(RF5p+P+Xehe_OyUs$-WlwEAf{CekJ=}z^}xA3iy@m zb^*VVJul!_vhM}_O7^~hUx_aj@GJ3v0)8bvRV04pxcF9)_?63xkGX#Fw*r18{#3xP z#HWhHuN)WOa=!SN+b90#_bI+wz^}x23iy@ykl(v_t@};9xPV`Y{}k{m@u32KCH_<- zUS$-|DiXhPzWA5x6JIOfSK?Jh@hm@2e9rZWuepBlH;*6jbB`PGa*reNboambwa0~c zx5tTixW|onxyO}wyT_CGy2qFJyWhX~t@}wl*zZ-m)$dz;*6&~Z*8L&A>wXn)c0Y*+ zyWhpDJr2aPJubw%Jr2aPJ#NIyJ?_No-T&g(9uMN%#oC#pSO<7~ivN4OYCYg_CLZtc zCw}koD8BFUDgN*AtM!4$t=0t|$66=welpF^d~ccN@!KA1UBhvX=$?O7^r!yrqC&iRTpX zE7{KiekFTaB>P*yuVj~tWTy-GmF#l?zmokf;8(Ku1^h~Oxkz@pfM1CZ6!0tA`vQI? z`(Gq}<>!jm74R$ZrUHH?K2;=s<+%8k+bJICa^hkBd&CzD_?3810lyMID&SY*I|cko z{HK6li9Z$aEAc9$cvg}4mGi~Fe82cv0lyNjGKy#U{fVFYIpT4C|Khiqqm@niR|__O<8{M!8^{_Fk{A9nwVAG<%rm)*bO&mKSG=N`{mFZg|m zuljw9&wAWzUE%LW>k_|T@mIfZ@mcqe_^kfY>T8H>M(>liApVl}29<|=_cc^uazf-M)inMO>_owxZ zzelZiJP&A{RiyP5yoU8wk=9W~T32~K(0U90#Coep=Yz}-LFa)noew&$^TG(f(s>{A zOVBxAgkS00FQ)Urn9c_s*Lk7K>paorbdKozbgmfTS2}--@GG6WMfjD@;UfG>=XDW& zrE|6jztZ_ygkR~rEyAyK4j189I+u&^E1lEDblw-?S319o={zu|^FhaTUKrE)pv&t# z(a+O)WQ1SoT+pa=NbeYuk%^=ht6x=uR8a2Kj|FT{jPIij{}_(dtB(;*yBLw z#2z;~SN6EmxwQLV=ffTkIxmhRYoG0+b8L@KonL#r>O9-yOy|%Ze>$J`c+`2d$EVJ( zJ$`k*?QyGfZI5G}bMt;OoiFgcWja@g@GG4&MEI4?IruI!og?raXF5NK@GG4s#B|OO z)44-T=MXWSlSKHH&L<-LO6Mue3z^OZ%&&AFV1A|Z0rM-JBQW1(Iu9_v(s_XSmCgyw zuXJt@;a56$i0~_&M@0CQ&L<-LO6L+0ex-AZ2*1*~MucDKJR-ucbUqQ`S32K`@GG5v zMEI4?ha&t+=N=J$rE`!7ztZ_pgkR}gDZ;OG&J^KSI$w(LE1f?@_?6D5BK%6{M-hId z^P~vB()m(^U+KIl!mo7x6yaAo--_@nou@_kmCk!2{7UCR5q_m}x0uf9BK%6{KM{VV z^Prf{k0Sg^=SmTNrE{hTztZ_qgkS0WDW>zP2*1*~QcUMe5q_oftO&o-c~yj8>HI3D z^FcpX=aLbArE|ZS&I98{epTzZ&I{d6onyM3&Jq3h=)5z+uXJt~;a57}i|{L**G2f1 z&hKJ6|BLV|oeLUuP8ieqp!0Qp==*iP7~xks7c}ae(C<&@tA38oA^rY!KI{5*{^;lF zJktH6^IP|u&UM|7I_Gu&>3rAytMgy?zs`r2j_4v{G zvd6Q|yZt_O-s<(>;BdG zug8PVi`{QJ*L6SYoY&(;=gA%qIxqJ4(D|{yU!Cv!yVbeAzhj;A`}@=RyuVAG+xt7! zIljMJo$LF%*15mGXPx)^`_}otzYm?C`#aJ(yT1#aoBKP_Il8|yox}V4)A_u=N1fOE zJJdP7zf+y#`@7b;zrR17&-;7SdA;WW=>+`!OCR9*Kzadx=h6ZAyO%D&^MUjNo)4rK zi14eaBbH2oUp07laew&L)14pglHzsnt3|t?P=a55dgEgy?_Ul3YYBd}d&e*O!>{ga zTQeoaE9J|nTshrWhF^`p_OlZFs^5i8Gx*hA13oLkuNKvNyac~`?S!2(_|-0(` z>%AQ__|>dGnq=^+U1xq$f?w_V&7&pw)i+H}EWxi9Y&)3^+NC1H66zj|fi(HZ>e z${GDL_|=u8cFN#azYOeThb z{aLi5boG)qGx*hl(yR=AwN>Y*Gx*id|9mimU-iEJ&J2Ea(dE}?@T*}hug~CDix-W` z;8zPb9GStdLT%p+ezoJ2qcZr_rbq0U!LR;V)hL5s?R8bZ41RU-x94Z@s}H(mUx_r-%`zNeR&nu<+N~!)Vjh~RlO-SP?r2Y?ST!b`ELK-(AjjNExQ%K`0 zr1xJ={S?xBEvNTgPVc{*`Xi)%4XK|(>i3YwK}h2wq;U|^xCv?8h1CBcjfZeUemvte zr143+7_T9XvyjGLNaHc2@yXxA_zh{?@*Wt+d|%n9bqkm;veWljmcg%HdwD?yznXXU zn;HCS(%AoG@T+0J|B=D3nt%A841U#n&t)0>>g|yWGx*im$KTB0R~L7jmBFv>+;(;b zziQL>=?s2#&;bo|)~nTBn&+%vH>_!BoyNeI)@SgmuyyO4^=gA=+ggWl;_)qfZt(Tu zD(gCK?)pmxzxr(GiVS{r{yFnA_|=$UA7}8Z$pbUv=N} zgbaRl`Te_O@T+mXn`H2-56c}g_|@VgvJ8Ip@t|We_*Ko87iI9Pg*D?c_|=G?KPthm zj{l{$1ixB3bzup9HM)MI41V?foTEzct7rbYus{52-#;EK!LJ7F*D!-${cXn`Gx*gv z=k?9tS67T1mBFtrI_Rhjes%Ef*JtpnVgI@_gJ0cr_xTz8s{LvGGWgXYk3X2fui6c{ zGlO3>d+(_Xes#cuw@pdUt%F}RY=3MCes#dJi~7T_n(umJ=M=9??JTEq<@EQI;a7VP zSW<#to%-w}CHU3sPnu`&s|$xcS%P0(bkm6?_*K?uS^tD}@T&)oykoqm8ehg{6l+$AMW+I}Pc(#oqE=hx9#%^nHi)eT4KKh4fv7^qqwCorU!Mh4ej! z^c@D)LHbSu`&as|L;C(g`W{1?2h6YZ{hMEDJ}|%1cW!>A@80}M^MU!5<^%Xurr$e2 z*KQOq%0?Wq68(Di^t@H**PTv$?rW>jt!JC|S&I%ltGezh^y1m}-+qg}JL~b`XXw7O zhdV7r2cE6D|0{Ii+442tqDRkuIdLU=ap^8sqDRk;Shxy3y6Y#t<4dd2qdQLdYrC#> z{l`4ME*B5V7Khcw`~SVl&%bcfKV9F_9oG6ew@h5;=l=cY4Q|JZZuQVbWwoExN5@in zC|`t5xl}uDG5X)xGwR+&7hL+_j}OoZ&%W;LMd*f0E1y}6uDNvJ+RxAv*G+D>1pRaW zo@XsZpIhEDn}?3K{M=RVpt}uoUVIHbu59oe^ts`xzs^Ii8@_+^9dy6tCClGM#~U80 z{~o&F@YjPrL?;}EKfVavaM-*ZKWEbl(QQ?+t6K&?}V>o>CvZ zQn;wLK6<6F>%k4sD}_yeZHQhe+*I2by;AwX^$n{T7Y7~Q6unaUFUt5O&vPb zF!=0<{xe*1*bC@F!w<7wMkg9>_oVX~L{R+=X|1NtL#=h__dgajZ&9Bf$hb{MAj(#`X^8Hund&A1>m!hK%o8G$; zy?2QEzGP3rCHpT&-y1gn=Th{*VfUIP=!C^nHqNIG^}BeZRDG#OgIJ*RAnd|2@NxT89ohG``>~^xC0&v*rALckKAcr|7Wb zvZ-J2JKyoKcbB2hj(0x$E&A{9?QxpVC$xyaHC~DSJ9Y@G_`UJS_e%VT`K!@``}vf= zwcA?PUw!R5bl~BmXI2{@_-vKm@1b)xxE<$i`=|Tou}<}>ssHM+YyI3WKV9c`%&+^? z?Rx9{dgzzJ8-LX2cQLh>u?ae+&}CHveiu`FvW?L*g~v~7f}Sb-bb2H7OyR$Co1$k5 zuk~q$o+(^IFWX@s6B3>)77JyZB!sE?j0ES_aOQ#k3smgt$nx09@A z3giFS6g^Y8dHH7OnZiA{Z;qZR>`-cno+<43!=~t&!nh$#(KCgylN+OF3e67G?>Vdg z7p!TBo+<47Sbg+NVUXq>`hECu4bU@%i=_i%ysfC+;PJH2nkw{6Vf~DO_@BYxGOujTKv>TMAeIV{7zE;es7npjQgJN%zQi({-$MOQF%c zX8i7DY`fO_r7&RU&CoA}+s|&r?_S2?$8U~~DNH+m3x4-9UNLP;^h}}6(_5iu3g=F5 zjh-p|xMFMcOrfEEN0#sVm@T(L&lGa$vY2PK@31Yua~WoSvkiL1aL?j4{LW>#uhDks znZoMdx2tCUxv|L()$kO4-x8hz!b2{&XArvYY~o>q(SbWX#nC5`kKQK>d)A=4&ffWA zfce0&i!$`n*=D1w(NkxA`qrSY&YoK_0G)RB(&RztuCp5+8B`4~IrEso=(=5hilaMn zJe5axME&TEvYU?>TtW2QJRhAA^`SH3Ip~adE;=LHfxakHyU>G_Zo8$Q?PJTmOSVVb z9Ms$Psq^=JY_G0)xS#FU^8-uhgG*nn$ZXecUYDUG?!UOU+V*2Xv!1pu_e|?$JF(+i z`=DzLYe#ms9rzqZ6C*Mk)!hszrRwA z?l*KkqXr#t*le?b=%~w`ULIt7TQ_SEI_t3Lw87}E1O1-j=z_|`Q+aej)Q|3`?!_5{ z&;gaprwm3HR7bfKM|VwrrG4mvcwgvrN^cLTLC4eogg*zM3*x<^3o5A}(Cw5K+*XZ_ zr?m6x0qA~8H%}Xc9;kHp@q;Uf?z+VDQa-wC>O*hcfAsLd6|6kZyhrt!2dRGZRP{eP zpgQ#@I-rvJ86D7U^*cJClEwl0pV=B0=ze&==zi!2bU#7w4c!m#6WtH*7u^r<8{JP? z{f6!*s2|Y%1obPrpP+t5_Y>6b=zhxTXLLVhjSF-?WsM_rKV|hVx}UQ88@*3i;|!fo z(6~Y86EvRC`2>wGbUutX^gTi24?RG5?Xs?(A5Y$CZ_h`UZ?(JUryg(b;rZ&?Q@VQo z+H||UJ)fTQuYEkPjelw%bfn?lv$}i!`1Fp>o?m{^?sh&A@-}>iO!6hI@Gay1Mb6p3e@h*~|0SO%1wwzB_a9KAs=v>;Fq& z-g;TOVCJ#ff9_#B(0;9T(c$`uJ#0sMUf#>|<9)~MjqWqNFrl00(Jy9oM-Li){;sF( zPQ4%Y^?W<8>%O*2haKL>cIw?{``T{3JEyM?aK4|Ua|kL>pO!lv^#yU z?a1%?{@^KdXII+}EohP3KK*c3$@c2PZTi|yb)4PLcId!yqGqh9P~`*fXjr}p}D^Egq8POX$QI=`iI|{q<-{2JeS{@q#fvh zXcs!5p#J1{CZpPm9w?~4`JKtA{zn%SG#=0e1@%9=prG-BE+}Yxp$npa3wVn98(mOP z|Dy{E8V~4#g2o5BprG-IE{N|1T~JVepbMhE&;N`gl6!hJr3kv$q(FFy~3+RG^<`Hy3eBbDT_}K|%8kzjMp{gB~ao??ne>O#3D1d)Plg@8fjh+FwEE!+s08nN0f` z=xZ|Vcc6!1-@^Pr`xxd6+SfowlWCs=Jr4UL=xZ|Vf1uZ4{{;Px>nE=L74$ofQ(pTo zu3!5#5uT!b6r=W4{Cw@_xIXRA_&M6QL9fF;4tgE-b=)rP^PsC>J#G7_b-eA7*3Gt0 zT1VSnXuTFCt+Q>t9n*RneQ=%jE6{ha-bepZ z)_w=N4c76tn_A!7j%vM+-Xm!Jk6woT5p*Ez3!tZA{{($ap#O<$e+7LF`zbE3{TJ7- z{TlQ$b=ogMPs9ER`Wp6A9M}Ge^R?fCzJ~oC^fl~1p?6__13gTC?SI6yPldjQeJ%7a z?03Yp|ABsn{StIFCGDdawXcG{hW!-hYrneKx;e?N_0nVPDJdP5V%OpW2^7Kf`_%`Wg1G z(9f_B=6=w=7Wx_X$nzWAT9()!tUO6zIcEv>I@r?j57UDNv8c2Mhe+aax&ZI`ruww=;?+ICCp zYuhocx6#iAt@qKB1nobdcVK;s9)k6+?Z5UZ(5bMmf&PK@E_#Td^{?%a*2}g}T1VSn zX6YuH~yU&DSI`Wp88(ATj4h`xsXE%Y_)f1$5opAvly`M?+u3zM99I_U}BNv_I$Z zrTsd8|JqMQPs9EwdK&gk(bKSxik^mjRdh7$v!b72zY_fn`vJD|e-WMn!b94{uI4Fsf6&=Hg>-nzDNEZr z|I=T$Fi-gLh0a%{Gr1oJ+?R^OOE7+8SrS-PzA?dRRl(*R@M)KW9<@<{Np+ zbq(E)`+KZM?~*P3_CM$oN>6=zwC&?F#~x~Xbn_3V+CCk0&WW~HD<>Rn`?YPOLv2ro zU3`G;+RM8gV7oi^?i$;VyT3c%_T`q5BW)*6Uwf79Mx%2twH;YK<$T+fHrtQ1J?eGO zskS#yo^-11RkwFfu>IPn?a{Vp)2zfXc6NUAL%O8WOMV7Y)EVK zlhc}PYn(W>vv~^7gU7rwva9R6XuF=~CoAsnY;4tLTl18<-};%S95bY+dCH{4HRh?4 z?p=s3rS9rhKch=2%{uNYbSbm98?p#pO6k~J-$IWv`;%K{qeCgLXxGU7@Z^jQ=ukq{ z^{xFr4_?&V?{|8)Mt6RgbpR#{N_A# zDCOm!FG7b>9@D1|9ZGr8?bFerl*{=%bSUMMR)2;5q&(-&htQpbe>_@;?j*!LpFwvL z8g2P7x|6W%=85P{!p;}p!1;9e@&4;QKR!G7I?qSfo_vevr{-(Nd%imV&FejX4VNyJ z`Lx&fS9xBWbH>%4cgJ6HsppUKS$BDUx$TqNJWov8ce3Y=bGM!3dE~|JcY9uWcJb|= zk4|2Di|3mkexBg@>V?radH%Zes_~xBK50DG^Vje(<2>ITuu;{*Ld{O@H}|Sf%Dp$rx1syEU0Sj`bVAG-27y}M%x-+daASE@6b;hx*c2Z)6o4h z^PcsA`hPuP3qNCN1Z!++Ss?Ye)^I&>*v_BTIj521PdXQ%Jcr-aF;e8KN;#!0j0 zqf-e}=e~|kCH(b)57DWF-6p<_P9?m({wZ`SVW;zFqf-eVO?eZYN@&(<5jvI7?8as2 zR6@%IKcQ0z+x%9GP9=PC*+g_IVQTY-(W!)gE}xE0C0uvg4d_(D2@@_trxJcxHW8gl z_+;cW=v2bA8|u)hgjxTYhfXD2f92QcR6?o6N9a^SeE4T{D&eK)HlR}pE2_RmrxLoK zH4mLi*m37Z9#2Pa@h3W!@Y~|%<|${dJ`P<~&-qC*J>ef$q}DB-r7?&Nn%<)~ARs zxn1H<)+fkLWywCGx5XZzx5Yl8x5Zwex5a*;w=Kz@qPNAap|{2EqOZk%ps&Tgpr^%7 zpr^%dpr^%-pr^&Ipr^$ip{K>(pr^%Np{K=up{K>3p{K=up{K>(p{Fg&KBA|^ZlR~e zj-jWm6A!RHMRqi2KSeyk`V`qm^t3^C6FqH^9nINKkzLIb@31~a_BKzv#QGH8H*xV6 z>r;qRUcAQjiwEWGr-+B-iI-TPLOJ5%EzTE@u|7pS%K8-XI_pKm8*=tj#4B>%tN5RF zLgI_okBCR)@D%ZiJn@j6{S@&Nqxg#TDLjvS@fg=9-jlPRB7R~NU-9$Ai(H?0kLwo? zLVpcU&FN3^PV11wN3BZ|KebLteAT)o@mIfJ@j&ZS#25YE#P9q*#rv#J5f99H-{OVV z6^UQEAH)}}I}-o24oQ5}x+L*a>yX4pty>a*wa!U=*ZL#zQ0tMzORa+vAGWSZ{MLFW z@m}kn#DlGe5-+wsN<2A-r)Zu+|H}M`-j(?%OY;+YSLQ49uFPNPU71hOyE3n#cV*tq z()>|M^GlZIiBg(3N@*S`rFo^4=A$glH|SiMulW5~<}dWF%xCCbnZMAxGT)(hWq!=k zyoKJCc?`WPb^yIA^Jtdr2)|Fu{D|(Ad6VCzgT*fKJHgl~ z^sv}1^sv~eEZH^mut9bZJuG%8OLhr8EOrV#EOrY$EOrb%Y>*wz*-w#Ow?0L7!}=82 z74)z{_CHU2Ay0NBXFo-D1wAZw2t6$J2|XgPi>o z@d)cvWcM@nEyM>h_A$f{a`sci7pzYa@31~aJR(oL#QGGTM_jzc`V`{u6!99@FCLV$ zpCW!@6koAEMLf{$5MQ!BMLg2=iwF6+;z!n}h%Z^6BK~B(k$9)uJEgsR->SdGOLO{P zJk@$7@mA}T#8a(j60f!XNj%v4Bk|Cj{uVE_K1n<^XFQ0vTE8S7YyFgXwDnx#_0|iC zH(F05UTNKz_`h{xS}#~XBpzu!k$9!`N8+K@C5fL}rzE~=eUf;p^-JQh9#7)E)+LFb zTBjtw>hUIC?C~Vt>+vNX?C)Re6zk2j?ywF`>k;eHv_7#;P3slw*0g@f`M$Icuue?t z1?#%R@2&R|@3;O->j3M)v@Wo&OzR8l#I#(I0wu`W&P6YJ2l9lf?X zwBE`2zO@dq9!={K>)^B=vaU_*8|&S)?y>$&>mcjlv@WtfPU|H3UY!@4%p91>KUmZ_ z!VjzUPaEU4x%`1SU4Fof@@Ekn4s3~k`*`^Qjq!Ky^2A5~{$VO#n^SH?gSq*}`)YIf z@ACcf+hvqLirD*$E%8quClB5Nzw%C(e=ei^P{c0v+TeFSPI!82{Lsg%d$hzaeQdmc zvugRfi0{`lu9iQGIO35_s^t$O-u=V+T>dfK9^#)r_;oJ-7>-l^gGLK-o>y95&gCB? zesaeb#=l%uuX;wbNrP1e)-Wf$`3;P;_dD5Yaah| z_ICIqce?y#8s+~W_BuuW+^bKI&9>hj|K;)8ncLvcJpQ=DHuy!4XZ&sJYWd%YFD}{w zzv*$y?>5JedTjr03;e3buGdN5IpT`AbU`cpuE%dSY>J=uc;dcI@t+<$+`bw9)Z?7T zw!&Y1?BBLA{@i1Sbq%WJA0zHRt$wxqKE&%EZG!*yxcRS*@aG=K$U*2;`F8>;F_Kan@ z{B6Wy!pdC!H(ZYR^Xu0*|CPmm=CtpB$1TWtpC@nqb}oMyaomLYx%_3s<`*x{dGDp3 zA*bIi8}lswH)5}6U(Mw&Bd+MUAeVoQc;WM3NKvYVpSr zhyHDD&bYYm?AbZvB<%c3&bayU;ivPBu%S6oAbW^S+z9h{h#sfr#by`*y9Uw`gQ7rcXIk^#DMp6`n}Egc{$^t=Z|x9#>HP| zg`9El{IViv+&uB*3wqC2#d~H>!#_t{S^ZMZc-ZHh*Yl0zv^HmazVP3v@{!JXt;JtQ zZ2U!C&iK3ckeNB-@oycU&l#U59yvANIDTvK+YuYT^<=(r9M|UZPvr3|e~(7}o_~CO z;r96TjyFEIJ$|z{=J(vosNeCApLc7AU+s8Cqjvb&j(tY8#qV}(ws~9pg2#1Fw!t5F zY;o6C_z#cwY}m3|euI3!{4g5zJN)s0aqaMnEniCQ@MrCG`CByVclcw!7uw&pBxe{A-9Tu@{19>&i!9rGkthG{fPhO z@~;rL>|TZc^O*0`5P#{h=f4`^M?H3Lw<&(r+Y^8h`C^d9OCr^55a_i|20E=Z9SWJ7Ujy zzvuGT5wCmww_N@^oKO7cw|>ZJ=b*XET`qflMb6)Itp0xl`OSzUPp!h=eOz$v`dt1o z;@zw3;m1B^SN@U9|3>_?>F>Gxa>U0r`OP?g{Hk33Ib1*a7hU&V&ixPW@J%lN9P#yi zR~er@^0%D#_u`PHeopP2FLU1ij8;o>>hHDrw|?G%k9?lfKUZ%3Nlw2F8T3(3KXzFE zZchK5e&q)_{kyyL;`IM{=g!ILpJv0}%;~SKyZt+-|JL8~Zccx0y4Av*{(bZFk8;LO z?LjeTJP*0;<(&7~Y~d?8@4MBCB4^xR-TOKGZ^V-ieiHv1@$nsI^;-4cfne=+jcl5x&$~oV~Det|N^PO~l2=eB(S&oAdoIz2=F0<9tw? z^PTU1^V9g>h#NXQk#C$2YV(crL2aIRRROP(UJJkV%o9c8Qw2Qfm-D*g*FIi7qAz~# zT`t9|Q-0znJK|5?_rp_)5BI>QJnN-S_&1L| zv(ETCkL~`{?>)&5-n3I!{IkasZrBUI_wn?{y5q+^{&;Cm{Ehp)Bz{z2f7-0r1^?u+ z>EKR9;zvc|M+J7~)kAl|?|A&-o?Y-m9xvIjYk_^*bmDIKH;;Ghw|jxz+V8Wj_&<+d z&)W-s=<(yPy5k=`zP-0}rLv1{KHnSv>9O_9Uie#&_g~o?Kj?AMPTdOZWA_$&;CDXG zzOQeAeO~lZfBe?R8I5!Nt;Y*m_Q4N({5JN*FMIr({Dot$TgdMuZADdf2q9rm+G&EA8j{xziRl<4l@UdFW&5ODPE-fO8d+=^**cN zNA+gzYd$lubIH6^@7=ss{bv5Mc;G(fGc&I4TMhrYZ2#(N_|ZQ)53FDTKcbx}zkna9 zz5-tKU8_MAtURxPAE~|qex&*<8-XyEU%Nf7QR{!|Lzq zH15o+HEzteHJ;4BHNMQpHQuVz_^VF*rbzszV4m!;WM}+q$5E|!DH6XaHqL)L;`ctb z9lbODt>Ya}?To+c7zcF0|8@M~p)UC6j_aH3ir@SAefvG|;~h_#xkr)sO_BIb!TdIT zkDUwV!P3z?7m42#iQg2=bLI6N@k1R??$#N9)^YQ@I^*X$Hv0Q+_`i;QKHU?4*YWV? zyW<}_HodPa{@sP87)>qoqOWnJdU}t4}R3+fMfQ=PkOw#MOXaV$Ibt~D}L?$eWd4B z!*5QUKM+6mvDf?i%nuj%iphTlvWx*vY$V~am(@Eadb4LSbg<8c=c zz%PAVyXT++ezVIygDY4Kzv25#`Q}HuzZ!m1+hlMBEAOxJ9P>-PfAc5RU!9(3{;B>k zFIB&pr>Y;#Pt||suj*g(TlK&Br~1cyRQ+Xss{S)yRezels(;OoHGa(3HJ;5E^*+rf z^}fyPHSWDG(0610sP}6=srPOEss1r9Rlk|1svpfy)qm!%>Rhw3yws?+!C^@P4RuQT)=dflP#((4d?r`74ZHNV&R_c}n|iFv)oy?MUA1FsYG z9eMqr@5}26eQ#bz=sWW|L*Jp-CHii?e$e;j^@P5+>hxWEU83){I(^60X`cswrtn$( zzsp|M;`iN{_HpnJ&;Abn;$4oo_J7P@v>#NY{S*AM`@Xb~fln4q zgWq`eo6L8#Ut}JneI)ZD?JJolX`jiwN&8MkT7Tmg-0e;4aQvaN4}c$Vr>FHb{!v+P z;~$lEIQ~&tm*YpAb$U$u2r;eS@rTZS1Ae<*Pg)P-znk?j{!&>-U zt&d|`FXP{v^)r6LS%>5In{_pQ#961~SDbZwOzU|3inDIV4>{|6{FbvXfIo58>-ZOE z{f_^3_DAq<&i+A6`ztZ+3*gV3{Q~@(vwwiUbM_Nr+K-9YS?x36PoDi6{L8!lh-*Iw z|MHGgUi&?+U;9JmAKIV6pFI0DdLQ1uaa{X3_?KsY$L-VplKGzY!wUF`_EXF!wBKT0 zsC_f@O6|LuKWKl&d_wyzMcSV!;3wL*!M{BFIQW-$yU5r64*uoY55liJ`!+`HI zOZD!=>q`7rv(Ci-H|z75*6sKUXC04!aMthm6K8!N)A~QA^*R2)S+B>me#c)p z>-m`0_xLYo{{VmL>{sBgJ8C^0(|Q}f>+Eabr=5Ke{C7vKukq*2dK>@Wtk3Za&bl2x z;jH8F56=2Mru9Ak#@P>uY2A*WaMtnoBWJ$=f8*>2;D4O`0sO=J`{23S_rdRb)V>P- z;Ms4%KfLpaYd^;A)IO2RX`jY_kM@)B%O15ag8z2*Pa=Fl`yu#cXMY6$?(DBb_=)yi zjM|66|GVoaU;8t@U;8)seUI9AF=`*i?@#+zMcU^vKh*x0`H%K@{5D_F{+aow_Sei$wf|=RsQoeXN$r=JUuyr%d{g^r=AYVMGr!gTo%y!*6V3Ou zpJhI%{Vwxz?K_&+Yv0oRPy1WugWB&hf7Je%d8PKv%rmu*W`3#tGxJaFubHoEKhC^T z`)1~u+D9{=)qb7%s`lf|U$sBy^@R3Iy&lkhr`HME2lcu^`=VY)XrI*U3hkSkpKJfo zJYM^h=H=RVG*8z)qell&&v?t*w+BY#jIepDNUEn7-?EbGV@ROO-CgOiRZZY~D{I9zl z@gFZZK9aw~iI+zB$=&z&djft^ec9i;zz1p`&GE+`TkJ3*z)u$S{-z83Wcwe#ngT!R zbA1c^v&YZFPWWe!D?8tffA;v~#~yD!H0y;i5q{FQW}xwkFaL*s_PF}%@#Z_zKlzJ!P{-5HHZQ8*{!;U#+G}r# zv}<9P+amnr!{?5j0zY|Y^Tu7UH?Oq+vJ5|Y^}+v@;U{-(-J}cr#0XgqKV{ABEyx=!$u zTR(iL3_q!T?&&i8WaJxNJHt;ty0X_3@RR3OOen)owwykx3_qDVbPN2u$FHVrhky5Y z+_jzX?;ele<0SmM$7>sn!oPd`_V9c0?;c0ZdKmxi@$;QWyCeS&1v)T?;bz=fSZ)JW$f5A^4K79}K6XKM=W@;bvlO6vz#Qfums?2=k z{2^Vb;6?nq$LDtaH~!t@%3)*h?;c0Ld8hg4p<^yFPaQsZoOx@X3FFOUH*Gc1y!O#{ zcborB=ySMv;#Iqy>i2g4slCikW}G&_{BNf>4>BJ-xa~0W$_IvwG*4{z#YyI!#Zl** zhmO7RV)N3c)?Q~GI#3*tadBAFTg-b;*>Jb{XUhw2G9SJ5*1ww<52(Axy!NLL$C~dB zKkZiY-y3e5U_N~RUniL#|GaWigr79tt=VJnlkc~`e+vAh)up4$@RJj>8_MvLy~oVy z0zc_6;U81rC&xcAq6|M7KIft`{ABo$Rb}`|vzEV?;U`%N(@Oz< zvi7L!yTDI|9s11__{qd~jx57Z2JAh&3_q!vUo!=MQuDwwUEn7Nw>qEC;)FWyO^I)Km4T8 z$$R_$XS?(#v!KS$dFGSc{P5<12blki9k8#TcYOQ(%^!d7J=DB% z_@_sjXFh%QspglRM*Y?N^M2{d>HpR@UuOQe__>SBCts^K!u;~T2c2fV`Dwr7%s)?_ za)kNqF=t+9zWq$c8_oBASaO5;;EK0Lo0ngH#qH+x_ndyO`QPCaZ!;gf@o(eIAFphB zwRz>Pn_Xd^x!~0^%rDEU&Nl!2?DFHxS2x^puzBUDyA3zbY%%_PkC)P``+Gbz(%6B& z9@{pLe6P(uxYz4}fBxkruM;K@(cZAW%l|gG)9Z-Cy5Hw@#eTQkXMWzJ*Wbic*!;9`6my%-u%C6(KxRM&YXCw*8%e{yv6H;!_Tx%zrG_;^TZphLlG~?6R)t&h36*TVVw){#7nZoYchC-_=Qn?!}=ES zo-FZ}Eb*Bv@tZ91oh(&#<9#|is`QCa1*$e9rWIwD&kUg>f zK=#9W1=$UR|WS^{iklnHlLUzo$2-&qf z*?sFJWbdp)5ihU~h4&3l5O1&!g?Qo>u3tPPW1m7iAWytNfB((QOOA^-Scf7Wv9W#i z=4Xj_W$Y`+ZfD7^XNjL>iQkoy9nX?o&k_&F*uM}zunt9h!8#P4mw1GAE#e*4pNJnA z#TTqY5ihZ>MZCj07x575PsA%ri5F&xFJ_59W{FRh62B}Z9+oA(ma+dMe&zQm-jyXD zmL*=6C4QGBzLq8amnA-!C4QJCKA0u`m?i#MN<1)2yf91rw3PT|mUw5DcxaY*X({p4 zQkrLc{;m1V=gOK-eBP}2#plnOZ+srD`N!wwnh$+Wt$E4k>Y6uwF0A>%=f|2qd>*X% z!RN!8FMPhN`NikXns0oq+6s^#igG))UBHSVtf`VV!~Oh;<0EGu8>n4p=uJyO3k&WhbmF zklnD(Kz77B2H7d=CS(_VuCIC9=l+`4t*?;%v<^h}*5~}1$9?XvdEGhz*#YYZWFM?2 zkiD>uKz7191KAPl5@dI*ACP^pok?#ltW%I3%9EYePPvb)x4$PVYpj_2${$i5q8@2vx& ze)7cwe7|@?&OU_fyHWPu?@v4_OMJrbUpy;IJi^ZtugDS)%Mw4!5?{*_Psjkb7;(b}-XIbKFS>lBm`%>b48FpSg(E1PY@>1f}S>oHJ#J@|4kCzfZFD0IvB|e-b zew!t}nMZg1QsU>O#MeuQ9@MzWta(?gX*IK| zig4&bn>47ZYSN_Y|M}OfYTv5!MxA&1UZr8}mW(z{$!#Fr|ak0g^W}#X-`* zHhNF*3;7399<1b1jxyuaYv8=*RaM6d$p=XT-&Fp^DIKH^ki0Ka93%}Kppify@eiat zSjnRtWo9(ph@ZEpsv4s>`5<}Vugb4Y=^%B0H(>bvg9vUcunsCq#Q^Y zkmrNk*Fb%HyWT%IbMvaIy@XsdCg@*~G>~y{sRH>R=^%OFYSjx;A7#mJtv+NNfwT>z zJV;rP`}P(-rv3om)B8AH$Teex{su_{85fTzkPng$k_R?bJs|Z_mi%0O%D4h)8%TMO zvLN@JAe^Os1HW!vRds`qYsL)y50VBlPTo}@A0!^3T@TV4Q)p4Wv9s zS&;k26W?qjuHCY#>UqUUV{9>oK+-_^bDfZUkaUndu)FF3sgJVcPZBa7LD~jV9;7VD zeas1rN09jfq#wab-!a}+r*!a8^*@2}3X%_AsPT2XkTM`?AmffXfbj-0KY;WTSm_(a z6MaNFczOzqN3O{SCu#i9_mlxi0~uF*^Nc5u`2eIJz{~z_x9_<`$h<(D_Y79vE#rZAOgea53XCVN$p@qQpT46ENE*nvz*b;CK*j~g zw++(QLxl7%7NU&v#19gt@jG@-Yb0!k_OVh1o{Ca9i%+>QV%#$?+xU= zR{F3~2BiN8yl0TIAmzE2dO+F-^4=2CQs1KwL zka8epz>^fVIJq=5_cU4VQWFAHfeNF5;MK+1r$9~(*>Bn^B+^;GhHPH7-%-~-BE zE9CD2X*WndNEwj7lev{RNE&#H?yuxA=W;*DI{?Y+ra)P+692pI>yzRjWkJdurO-k5 zgS=1hE`<{m_y=}KNZw@%JP)KEaE-z>3fvEp4^kea3`o6jOyVGEAoo}D;Dp=<@@$a2 zR}?4{J2 zo=qA^8u*s-I|^whNIO9CLCS!%8=FQPBn^C7_gC_;b=(i~H-Y4xs6bh;5}%^`PD^o+ zvLIzfE1aPFLEaA-6mC%9A4on(-XjV;52PM&r%kG=rV6d z93&0gUiDP+2B$QTG;p=X(IG;r#MJikTTsA_#44v#X~^2SRdiVN(adY zX%9#lkoLf(iG!qpLsU;C?}C&Dk_PUm{L6*36Qms=`5}~wLGA%519CrW zPvRhHAoo}Du%V=Zq=DGaLlkHmI9Bs12zNb7NIO9CLFxx715!V03*sPY;6T+9LGnR((CH}-QWhi+JY4sI)I-~8AKZd#xCwj$ zqpdNE<-%z&2_RNc+|cpHq2|e2_el zeg-Me+OSUc0(@2dw7HP$9Td0*SvP{GDeR&^K1e=D9(cd%0jZCB$nUSf^#SP`WPJ+4 z6Ao42evon?_kffEc`kb*#6i+P?yuyrS3*4?Z2-vwcT{^o+IN$XdqMI+c+njx4pJ5* z58R;l1yT=fr+sh@uHh>13y}7Km2}Dwr=0}&%1=W04oEvdo&!<_q&)<96?+KegR}u8 z4}3%I0%_l_LUqzxc>U{AFN zqB!Yq$%11EhUmC7m+FX(s{x0+)jSfV2bT zIUr>~+Cylga_r@h57GvZJaDnbA4vO-5;j(OkZ}f54x|i7`4fcS$}WLFx0bCCa(#&c z*C6{SV4cEM3gm<2gXDp4s2-5|xQG0S3S2*wu0i%|KzPIyA@_rn1GxvJ49IiY<0B4| z26BHTkG((Y0citB9(bVI1Jb@_Lhc302jNZMr8r1gkUX%9?gOcZw$nbi2-k3#=ViY^ z+6PwBDMOrg65um%s|ym+4&poqqzp)V2m@4(JvH({+5nOV{-}NiY2UTNZYmEl&Opk6 zlmRI}Ubs&CGGIgPncOYp`e6mGLH4u26$(!(kPng%k_RqUJs|aQ5BY@x*Z)q}Ap2$@ z{A7WU`$5Wq+yhbuck`K}b zkUVe`wFjhqPYVxGd9X_Lf|LU(15$pb5WWGjjt80l!OENu|9B&%gV>9&6yR4N`~@7Q z`C?^?gWLyl4@eo1`&XwpNE*ofl{{=EX&`AJ_BU66FM{wvu&wOS{wWU9E|BMelmV%q zJy7BxX<$>`U&*^BrGcb@Uy9d^6Ve`#wt(b=lmYKoxIM)|(!lq1e3^m;$bBI9fRq8bpFMoyAZZ}?SMso7 zq=BS?*u^6i8mL}y^MpNRAC6CPkamI84^kGSe)gz|gQS7G=>AIH#FPe-2Ci2>O%~D~ zkhXy2gOmZEQFtuHLDIlgy1$YK=O7Iv4TR6IHpV`KtcyYBORzFWVy~GiNe7uf5PLO3VQwdy z5jkTh@? z<HfV6|NM&cl8Aoo}DZr3&SfV2@L?-2#cf|WRSerk$? zlm#h6+ju@myFu&`w)IHOw;*XC>DXj!FG%}9@SdGuwje6SKHk3Maua^M+iA9$gVKH?fYCn5dAHR&Mbz!!v@%DIyAJYvkY|IG0ci)} z3YFvC@}5DyYjC2T%RA&6d z9U$dE%78o%{Qz;0G?4o%dAvi?K+-_o8_%LXkamFB7i{HSny*39K+>_X*iw+^f#idf z0e49O`-{!TZi74@bTf;<;wt^=tLq#gox4%>=-1gQ_CE|4-H^%5Rc zIZ;9X10NJW2jA3xL~(r$>N9t|olvIU|3J!ul`_OB%l+UYp_=Y%uo7RQbT!F&;O+|G zISSh-P#;JgAoqfl0ci)?4B{YZ;8_Zlybiji9*{PI9fjQ$Ck^bKaEP#{0__E<1Ed^CS&+Y+yhefS_Rq((jKr)J?%lJICzo*NO_PlAoY$*aga1{ zOWj||yH#=S19>J$-kl1R1uOAZx^H5NgOmj+!x&*4fQ%pTY2oCQ23F!x=?^MS8u)0! znZkz@suNNNams;|1wU5c9@0VT1Lq5;q%^P+U#Rq_6ekV*z0pQ&qIqh%;?xUL2S_=P zvLNkxF2zC8z~59)CGTa$sRyKuAbH@tgdYpb3fv2l5B^*A#1sd)2P6-ilaP8|Qy?8A z51gm_DdTG)*OYxHA}e51hl1g}j< zK5@!`jMpE8v=5wtkeCKytRsRAILL7^1!BgK1e&( z3%M60AG}-j{F&k)WkK@5hPn@=9?o(}2T23((EXI*nlfC2=+Qu)%QfkILtOI>^4)-x z0W0a0A(DjcrRL2;0Lkn$j9Klm#g>Qh|9EWc~!NR5(Y0c7x=Dv=5{V$lr6J0{sutuiz&2bw(+qK9GEn`#{Qo zJm<0$2T23}RH)=#qigO1c_v66czePJg<}=C7bG8Cr!X$XLGA&`18+%4JvS2z)HMM*H5Q7 zNLi3FGZknjNPEBm>W3Fo9Hc&w@*rhE>U|}}LDIln_gC@?#kmjUnIL&{6etT;;{9~r zn<)-b7NpF4g-!|kB>Y17okxTzw?0RseTtvJq!C)83=v)CZCeavw-p zkmr1s;vi{Y2h~%_`$}={19>J$9=JLo?O35}?ghyQf7iLi$`l8=2P6;tDIxW&QXm~9 z5ByE{Q-*8Ga1E|W$aA?SeO*fbQ^>dlDGO2tqzuS?1ip`!sSc2Qu)RVn1;!6JGa>oJ zDFY5r*hYc&fwTksLG5mv;vmllxeufa$aB!35C=&ESLpsqUPr~b59FC3d0>x(1B6`^ zxECZJd{y=Amf|4yfaHODC!`)UF{Fd!fo0uK8LlbAHMnm=p361qjB&1W1;#Z{RDt`zO8g{UAC}@EWkJdut3W$J+5^s1`-i1CNPQsXLCS#C z%b6i@kTmdF-CxP$ERp*_o(YmSLV>biCH|D|J3GZe%7T=+K;Z!Wo!|)x$LRVZ1^$8L zgOs^a;Z(&z<~Q(dg{u^}A0!{7JV+UkdPk=?NE$d-p^}Fdm-|4T36gh<0%gHU{54%q zNO6#|AZ6}Wcv|fMncu+26()g-gXDv>52Osp-}6re`X8iU!LFM~!zrXbkbIE)K+1qT z=aCc#NdtG&{gu3_igO>xGePpe*$LkkKBK_BAo*Y?)$?46gWLm>2fmb$dS)t+4w46Q zKV`V44A)>t$aA?Sop;RjTm{}MNLjFwP8s6dM;NW}z5?Yz`UIrhA_eXPEAi#J{y4=! z%7T>nLVaw1k_g{5oA9r~r}={xc!>5NBM~S2$bO;9*TSA{v1Pic=p*KFEC_ zWkH_PIK@HIz=Ks!C9kF8+z0YZkUX$`!mh&B3fv2l5ALFRwn}l3dqDEQ?GjQCS~b!^ z^1u$dpE6uihHG%AgglpP(ixjv@20@G1t|+w(kVln`v`m=eT3wLHtSOwBS^1$zOKV`V44A)6D@=TDti3*ejEAfwY-#sY~QWm7lKNK#~-wEE3aJsG^RNx;- zK1i9z6_^J><~Q&+g((W$50Vd39;6INz0*=0Bn|vop_0e{1HpYD&jiVPNrAFpCB916 zucSCgS&%Y?0`nlq{06?S@EWK%NIppWK+1spJ@XXke~^9!k82=}fspz@@)5%Y*~LeaTmb@y2OZREZpFSa_5+#FpO{Son_XM%ha zPnXDbqU*s6qNyuK`;Z@b&|ZHxM~-TEPSkq-?uXy(V@8x^y>?kix!IZPmcQdM3G1CeYJSx*CZa6FYutxbp1WF5B1R;@}P5; zt{m0ypzLYA6_cAoXQCdiSKK!28JR_W+%$W7RgPv*57#c*vu31@dbnZcdBi+o+_30e zvAXxBc+1H97J0GNdF1BEuaDhAebmSOqyCZi4|b_sU(SOUM0-W957#cPmFwQSa--^x)9du6`$4oYqgor!vQa`A%j@W?FcEKS=3lBD)o|v_x8B=TLpAjM(htK)BAli8WB768I#3^-hrHRGxxL4|(Y8UdN z9!?gaJ^t>XI;x?09x;y?rztvDtnOZl-E;RAd9l@bee`|h9+7j=e!M+e zta3DmW{?NX`#X?wRKuI2)?2Y^sD?L0y`rmgUFdy_n?`Fyo-gX7=ZHMGf7B=PUdL{lF=>prD&v>(kOFFNP+%25pmX1?{#Np23EiF$Zd@%He-$Smq(@9ep_ax{Z_ zczMyDOCxpE!__m-Bjyp~wMFNO)o-Zy=Foc^d65Ts&>ZIy2p$Ci^S;fi{OvZ`;k8C zqaMzfJ!qd9{Rxry%Zkz8Gr_gOuS4_5hh~rmo%>zosD`~V-+I3$w+CGV>fxlh9&~+w zg=SG7SIM4EwF`Ms55Jr4f3(N7yS~Xo@l=r*{e2#sCz>X5{m6%W$b(+L8TFYeo~>f^ z_ki%4XpYDnnn5$jgU;<*IjZ56QR^*`*dBBZsE5lH*9yBwW>FtUM2l9AW>628D%#`k zRI8&Nn&%Poh;fCYbH(bOiMUtfIUp~#I*;5Od9Le+{Mac%K0G|n5k1dMLVHjjcZoKu z9C=X>hhz@z**5e#(DmYb(RP)i{b(L}&^i7txg6E-t*G_<9dmOXfA77hC*LFIqwCo- zG>iK9dNi zkOz6tep))dQ$s$q6ZPEJ2p*=r__vdw>>qYyJAMK-?|jtr_MgKf8u;^@A~*rANA1h zpUCg;^gZVL3E`vpePW7GJar^Sf8P)1ji!zCQ6Kg2!R$f%%;?V?iD$1E{XIb(6wMi# zM?N%zJm_3Mt3i%xI528GKf}QubPcG7H|2WJ_4NqNqCV~sEmk@5q8<*<9NOdBUEea1 zc=?La-^auaq7@_8i+pGXdC==Oqu#6HwJOGoB78YoJ2Ho6&FuXj<&8G&7dCcP_)O-s!&HgG|waE5#w$}=Ze)m6Y;>vb3k5f zbso7n@?3{R{J2<=ucMylho0x5p*^UNr$vWXj=ZRc^JflwgvW(m2fALII^P#Kp>nhz z%_9#w=j6&!4X4O_>kUh84xNd5I8)9?*K=-Y7WHw`>^Z-3MSVFBdcS-c z`aBDcj?g~jL;J|*X1)p4(GJwZKa2MMn0VIsQ6G8m*CM~z=Ym>{{$c{!Bj)j*5_^w& zA0ZF6I*;5Od0+ZjGW>Xckx%|?ejh^b$Js)AP#=9xY>vv27xnP*%%eR%3+8iK=z7sU z7zdC;mg^B_L82vqOyf|7XGLL*{26@oAeg=*l)$shN_55rcd(btY z9zL4uLD#ocXcqPH>}Z?Hkr(yw*36+juHE(R6p44O8270Bz;O4-^&%gdL0Xoc!ZtuefNDsb7%(5AP+j%&+3t*8vYTr-l2)@LDztKcv|t|@TkZv>fZph2dBi+o99nd)Slu%bpC5S+$cwGcBR5B$>lG0{Zd2rwua@VBp64~8 zJ*ba&NB^lDc~K8n$Q;^pbLe%T>%|rFoNlcg?ML&-gU-35a#X`*Gv9jmCpU-AL_O@D z^U?J@9GXRaTrzvcRF1r;hqGo5?eQM-K6)w=KUXonT={$93(=q=pWF=cqW7s8_17cu zTanKfARo3mkKBGbF}@E&KC~0{@Y|wuCM5Q`2-HU&{IbX|_W6qz;|~$qBj))f68{l- z-y#pTI*;5O`SmeX?Ld8;Et)3s{=l1y`f?uhe({+apKn3efzCrdw2yp_X0A{j?La;3 zUbNR|l-7tJ^^pgC{t5ZTv&Gk9^z*gQ9x;#ilz7?5`v`fk)p_LR$otaI=;FsQMLzil z`TY~UAJ+=)L4EYOv9&8lUev?4GLQCb7|xj2fvy+rLw>Z6CXdh0s!>NfP!FHUKD57Y zIC1=VeSUvNKIB3E?Za>KeG&X|#!j7f4#m4gVjNIBDC{5UqdxNBgzQ24%;@hGiT9}( z{hSUQ8x4-kBOjVU9(1msEha}b922#kpE+g^x(3w4ak(CJeMg68Q6C?Qj;$PdQ4hyv z4()O6uJ4pcd`881cI8)w!y?y=NhH%Ff9a}hrtTjY~(k>`h==gXlzsE;2-uU3w{sD~S74()k6^g7V> z;%<3;?^cfXqj}^(=e%Dzs^QL=Z@mf0&7m_<4}0c(bUj~%W>Fuv&z^58M_$y!#WIKX zc#nA>{TzvZuNeJBE%fO6A$>DKuCygoj( z6ZNob(K$X7GAe%5M;`Qf6XX~BJVuLgp6b~n=JDPXFA{m*A}_W&kK7#j^|5@YkNUV) zv|{A_fo~V}O69DHGmrKh6!y&PK-Y`*AwSwjOULJDjj5v@sE6-oAKHI>xOn{ddj1@Me8_|RCx)H# z^y0kO!UX zXEw@F4Zn$6&(CtS2VD#5;n%q?bbX^jv#5_>L^oBAyr_q7XAbRg?XK_6NPKU__)z7~ zhxbRW7x~Z(@}k#oMtw}hV=G2K2Mf0epA5~R88m}D=-g*2M>X6c^R4G+V%meQ0rl{s z;t$~)ky+HoO|s|B%Fzt!;rOCGerBaQ>Y;faF^?EOEjm}M?wN?ci9847#a8E$n6VaJ={F!qwAR?G>iIpVl-Ff$cuWodgjm`?=kPA`9tx-kr@5lHuO1- z?$OxzkPrEg2fa_tsQccL*k?3e$@i;~4_lo_Za?`<$0{Ko+KGDDr|2A?W%2nC)JGol zIT_>^``k&3af9mFBj)km6mJoE-y$!zI*;5O`Sr1DsE_(MDB3;p{=g|K*O&9)&}d-f zb2`|&a{J_bXdj&(-+rMw+JSm_RMB3awK^$&)JGolIWFWE?-XB)(a(cLd&E56Q{q!2 z?<3^FR_BqMBkxN;QqzA1@B=L4CY78eTc_q8?6`IkabF*f*~OT`$^) z{AeF-6rZ0Jsg8D_9{!x)*U|o4!aniiq*%k9(`7HtRQx#cYn7wx zLgyhby1sWppZmedi~Uo7uX3~>%^@#3=Yz^o4f|!j_5AE#bLdRe!{3Xp*}MSFgT)KL%3^N4xG_*c=nVs-aY?4G-~$cwGcBR5B$k?*PLqdxjR-JFqg z(SE!t>RLIPLo>*O=KTy}IjZ61QS0@n8mgi1b1oJ6d>Z=v7p@U4Q#pFx_)gA89_$~j z6#3j7`dl3L%=b4|sT}P`bI60v@v{%*sMe8ZzV+5l%^W%t^>FKA|8V`tEb8M7*|TBg zXa@Cg^P)X|Mx#3F;k23O5%Y+#Z_&A8b?+T`PMr=xjA$u>fw3CtHM(vv#5{b z@_CWdDn~P@hi4V-85*gh9=@7+9x;y?FDyD&tUkQr%R}#Nf?ja zoso0Vetag^b9d!v4$UABn!m4dRKq7S-+GT#4b{-+Yy90^-w#KBZx?+%6x-K8uSxz) z)$y(9<;eHl@zP?q{CD1~m7_T{gS=?|jml9C=gfTTeNZ)2Ltjt+ELI3)9}_uu5^(3z-*)5V9bW75bh z>f_*OvdWPc^>FHK^K&KKg#u zl96-Ke!MqYx^gs!W{?NX`&sI8RKq)?)?2M=sD`&jYe&=PdEv~(trM?XIeOmcxgjqe z5^Wq!nm$fZ+$vw^-?VbHAI%{zI>*oUm7^MNmigA(F1a~$ChFn9;vwPAky+HoC9S2$}^N4xGxOdUHV)ell4+*`mkQaH72hEZ9@A08N>f?FQiIMjM zdakICJa}((M&$Z%kK(+!?qQXq{b&w((K%;Vj%wI7^R0JLa&zcR)WhqG_l6@Pv#5_h z<@cq_D@QY^hu0MC85yag9)6d39x;y?Z!9`jtbS|7cZS~E$csG4gXYMukw+ta)W?^j zrz7X0{Wu}l^K9j44$UABnt!2kRKt%l-+FIW4b{-+O#Gcz-xo%IpA~&w5Zl)RUrzph z)$!YCLgf3;==;pLZ2o)a^UBd2nn4~k|5fFvhD&C?^?s=us-dr|{x{qsd(rpHak|te zisb0J(0Ry%u5XIS=RnZsJ#c8$rE;_%%^?pu$G?dnM>RY(YQ32fn?q-!9xhm1Hk>^& zi~4wCG-u^#2K8{>qCNgC1$ERz^E_f6F)mVcu2|i@6fYUMx5$gF&LcNRo>9+GAN6s= zsCVRCv>%_3)~OuLp&8^s^XpZPYWQ^2dRtTt)o^UIU9@VR7p`6$n0SZE(euVBs?IAP z8toP>nLaLC+;gV<`MYwoAI%{zI>*l>m!nz-Gv9iHQZt9nL_IvJI5gZpGK>1SM)nM; z9L=B}9#*u+&(Ky!J?xoz9x;y?k1aY^tbSs}r-t5F$csG4gXUr_f?gn{b&w((K**vj%v76=3DQkFuz zWY3+IqZ!o0`-}G66RD#fPL_EdF^?F>6rC$pA6xO$q4zfOA`kMQIr3{{T%?csI3XGz zIT!86KlA(S2bH5aG=n^7{^QC~4S&si>wQx-R70P)@OM&ue-!Fza zqpzp^75Y9b`hF|+Nxf4fM{^x{ddP$3{o5?^j(^{!^4|Zi=WBs_$dA6hI8$_X_M`6` z{@kR z`N-&?X#4bW=i=e{{^=o=qy1LU++6x|)UK0LG7C)a&%eLtb>w1C^s1_Rf6kJ(}DcIurHq)#69tlaX1} z$GNlT>B`Xz>fwt;d!CEbQ4iiJXg^M$>-nW}G>2x82hIOpIjZ3_nQuLx4NyZh^tl5+8~vL6&pi5mA^N*#xMaTm z>F=N|R&2SyzcypkEp?o~xMSj(D@Su^2lAqM|HhOY)v#~Wdj9U68mghc&(}TjeR%Z! zQ(P%pv~qM^Xg~6x>svbVxd8P2f4nDJwsN!|%^?pu$G=e}M>V`7YQ3I`&7m_<4>vCE z7_J$aMSZ*_>RmaSK|Nf*XwSNlI_jZ$9x;y?H!C_fjB_+4~dCuVlMa7gA`@51Ef(3z-**A?#xFOAHiK5m{p zmsO5tP!F#z+T-71QAa)8IP*MW9x;w8I#;ZIOT~AD-dD(rJjjFQX!+>TNFVj_)#&la z`vE;?)JGotEqXR`eRy?o?OgZsm81P=4tdczFIA3exJKq%Z(MS7=uFhZ&x^l>??z@( zALq=T@s*<))Wc7T_IwzrqaMzhc^)y37{4kySFHYB#Xp7K+sKPN$b;s{uMs~xLLc?f z&!d>mcs$rMRx1OKHp@wSc=X}f?`gf*q{mM5E7pxlg zh;XH7;fNp2VDrd%&11iCiK=1C2c*7qay9ht-{DEovXOmg2l62gx(@&5ogCHhxTy8~ zn@;wiYec;@BVKIzQHgt3j=ad@+MM6o=p0_TgjUwpGKHKa=_n$<^?-;+Nr0k-caK@*yv}u6~uH8cv8>Z$M&u&^4kS z9$Y*r{C8v)_3@)=NhH%HzF zLnD6dUF16_GKVd{D)D)hqZ#BG9=T3*J-A?=&xp#=KIBIpwD*e2Q4QzKeCz!uxjA$u z>fIReV#~W`?&ivo7kRu#ybsX(2UpD3DekHowtW56?@O+Rql?dk4@5f@?U3^!FM1!E zQAhjG_op5WH_q2jQ4Q6f2z_rC?LmFyLFdzb@%eWq`OulDhwl_!$E%U=H={oC;J6~c z*!QtpjN>D;N6hn4#S=pBTjW6==NhH%H#b{>?jnyt&A?RAdfY?sGHCRE}nlXQgQUTqn97G>@%so>q&`zpK1QVtdgJY;faF^?E8D>_%K?pcYijRq8X<*m*mH%HzB zcSicCkB>zUM9xL~arIo!LzSaBG=n^7{*lU24Oh*4>pfF7R71bdc!r)6dcL?}zEALS z)v)C|rT%(yHGI1`AsiPSRkTCShrH;0Vn!Y9L*L&TAMTc~XQLXbe-!%OFxrFq$b-(O z7vlRepp9937wj zOrbvN1Y)W?~#=bFmV4C>*iqCM9|>Zph2dBi+oyuIjLvASm^zCSvw$SZGk9=SR49(XF! zM|~U@y%;$c?Z+*1Jug>|=FklCp!wG-M>X6u^Q||&YN&>OAMgx4C-i)Amwa9P)2d<1 z2dDl;ay9(6_-FW4bWYI@IUn+(_lX&Gv=4p%>c{Y)d|e*ZQ2p1?_kPhH)JGn4KKUN< zL^*>Gor!ulZG^7F_s)Gk8ud{RyA=7wzR%raoIXN(#5~?RV((?|E9Aje=aHME3*%cP z)JJ_>F6t3^KcMG~`pAP@MoUFL7l2(Vw@=Q8_R+QRtr)7K9jJ$E7wz@gjw|CwedIx( z8$o{Y!SS^i`&7>!F^~6}c+<#x4|%cGdF1BEd)S{T^id!8jQU6W=UlWO`H%|83&iN(d&iS2R#)T0^TNZchAkhS`q9bN(7*GJuSCa2cA_1~hdk)K z6DmhFd?9MRVO2vld?s?1eds#y#qj*9Vaq>E{o>?mcv60wF52^8q>g%Mo=40h#wUu-6{~wz;uoS}MP7NU^T^GS_rSZ6KI-FF z(Z`W<(S96|>-n^DG>2x82hD$8IjZ6AnQy%xtA=Xm_W{q)b3)G-cg)wt|EL^!+K{yFEQ$zehDx_dVavzOEnI(~%c>?EBa)#swp^N6gc`;>APnE95~QK-6QWk<~ zwCVwZ;JZJgT9}P{9@mqZ86SQ zJ$uAFo~^h?`b;1L`9W_K((xd_NoKtlU01AKFL0 zZ@ylrj&`6PZe6t3XA+)`AN7$3ecl22#aG7HV(eQzd&E563*vr}_XhG}tMkask@uM2 zOZ8D74~d3Em*!lwANi06`RJ_p@>k9~{tqwA-|xUN`CM-P>R?BVNjvgt)W9XYCDx2W~< zk(Z7==o(QkAFb-}V$0`FoNsA#qR@zEb`(!kr{Qg58ny%OS>b+mcN^N{u8UChl@tIZ*$p zk)s;!6Sdx~iCrJMM%2T(it~iCMP^YS_l#z*9L=B}&RMi)jz}H#a6rT(<`HAp;ye|r zdxq-X1D+f5VypAW=P7y5%p38eXO4XHMdq;O3n!kxa^yvx1tQmpt_S}aEm%3)hy2Kc z_AXR8s$u`A^%hBN4xNd5-6LLX`R<8(RF1sJ<2~YifZjhHdFT9|Q#G8S@_E9=ldIw1 zi_3;fMBYbe2l62=dLNomNBeMraLKA+%NI<2spM+7LUH|Y>BwHR1No2_UDq;|qZ+Ok zwcc`x?LpUwdN`=KZ}^YMEb3#QX!**~4C>)tMSEPk>qD;#mkC#_8n*l&sjrk=4Oc0y z9rAuqZ=X4KKXjve8uRl}7kUpefVTn*1Fz7wt%*^71{AM&E>>J`aR4d0Gh zZ;izEpld`uT&L)|*Nl1<_2sWdYejN2gL=4j(VpIsI_lvo5s#QhjO!MiD^~YR#oi;H zBl2Ra^T^GS_r(SgKYI4ahdUL$A2y8aL4DjT+Ng3ggL=4Q(VmSXuLE5#z7%azIoglr zkq4c#Y2~PfFGj7md17z758Agw<*0`Lj#|$>S3@=2E801-ZM{bVX&q0ws>f^rAKGAGN`{jJdgM2h|G&pjfut(AT*)MXx zu;m9O-oJ7*gFFXBI~P3%`Ki&6NRIX)Kk}fx2Ud=1cuLfI2PZa%&P2UKB3^9y$%zlG z9C?xFuxQ(2-{R5X;gKA7F1kLs8T5LNh_)(jU7UNOPMwZSEJyp%9GXGr92Lp&$YR&b zx8561LDB5#;q>g$xbLM%(JYqbl=v=Y7do1>h z+*jnqR_BqMBhTryh#x%@4KFH=2rrC! z7VVJpAuqlYnNdgk@S*VHs$t7Vr+!ItHN3KTXE;2v7wtekqD;#p9@D;4O{+V>Q^OK!)uB+gjYvi z588oz$cyfe8FjP|Uk$IV8n*nk)c=!Q4JVrXf1F~vd=DqNy=VvWAuqbF>nle!^dIW2 zH!7(;=o(QEZ!Nm+8zZx*k3UbAuVGe>W>61rDcW;$q>g&{Q|5WZJYu}9=v=Y7XDap{ z@f?vCTb)O4j=V4Kiulp9M?QS2=>2eaWDn}&1JON|qZ!o0CyVyn8+je*dhv(6zWXXi z`_Vk|pmXl89M$mq%(vcy$<3j&Q4hxyUC%?2S=7g;vS)PVXa*lDK2o&j;pm|vkNnBZ z^N4xG_-N6&V)e%=e!OCQI>I-jv5{FcgJzHi?R%nfRKsym>$&G@sD^Ju&a&^Bil40* zpO5gR=()&wXa>z754v76>MvCMVz@O69D7zcr6TKa+S+rlyhdjtfy`py`_XXV- z{4jbi+NyX&QUAS&2mQHdeCWBL`;R|I?^llYqdDY3=X_8(s^L#j>wT2i9KKi7lg~BL z|L8hCPHqxjqtJJm*IrU(d)$VMP9kr`&smG@sZ-#$?`S# z#B#JB&7m1|&KH%V8a|%+*83{CIdmrK;rB(?@pWVt_3?r1`KEF-gL?Q~(VlN3b=1TA zGtVRD5#tX<=Ze+cbFpXmagkTv>O69D z{FS49$d5c|?*f&h8ZIBT-a?7Zp)*l$;fNPo{*T0qRF1sJ(>>~3oUFJ+*dvmo*MY7N z&7jw_Xf$zglH$<(x?3!<9PLMQXa=3Lc;%>uXJo$h{+`?%IurG9*`n)MGBS($czpIO zRXLhLJzS<}&(e`P>fv#j=MnRWak-*%#p>>{*fVlpkr!K?M{bThrxhc9^h}U%rN|t% ze6_?YSB|{Mvr6PT(e>alx&BovNBfW;dC=aTm7^LSo%z=5mE0UU6ZKY)c(LV2Wp0hi zkr#Q^j3&viE9_ESH}P7L|3iJ`=^ag-9Oo@=mw4^SJnADq@}j-#RE}!cH)_2;iOr!i zQE$D77hAq<;`J*>UgX&znm^Zpixf9aykRtNa@0rHhrH7RGiF&(5yx8*d6YpL*@*+?FX#cz)@ZjRV68|&u{y}~8K0#je zzS<)?G<`g+czEIgk$tF-=8zYivuEX~hKEJ1H!!g|bSCQI6-C#vS7a9T@zChsm7^Kd z!x2S$_KwcTb>i8@{Sps~ye`y7*N?pD_3jh-eIC12KIO#uenDdUP#?`9FFI#%<*0^J zWWM$GPi_vKiF$Z&(RCaUnMHk^D0_xfj%H8~4=UPoV5E+E*eUZoVjeLbQgp6Z-8~n3 zhVC=+VypAW&5`GJM8uDt4f5fcMbGQV$R5D90!;1DC9eEw-dhxI5n99+9 zG><&!oMS6THT*Mbz2g&`LuaENo>Fu@Cq!mZAODC>tQ^gt9-dsZ=cGs-_0T+zm`9AK z7M&|rKds`^E5@@TygWK1GK*%=4Dz6TLn}u$yew)x_goFta75%R`_8WToQmouc(e#IAryG6){JjjFg(=O3P5g*!#dN{o3oQtEKiu!UMyrjr4-ZE-2 zURt?5VjlNG?4G$d$cwGcBR5Cx=M|AY>f^}h%4qYV{c=9!K|b0fx+>bOxO>t4xjJ&c zu;te$zNT_Ci#*pxo)3Bs_+a#(%F#aLM;^5Iy2?=vABbA-hQ#L3nW#4^;>DKVpZLbg zkr#PxicT$_R=hpDIg+E-fvykDpx1LtbW-u;VxRo)~9&$SmsP>e+KwJ{LX}bt~%2_bHl@`}4!o;UW>PSbRTx zCbAFp(H!!kbDpgn)o^^&de0{|ht5PjoIK~F>v$nFi~9Ip^kU`6i+VU|=Fpy(!j&WJ zReU{sIr6$tA6-B4qSyOMv_^69DgKw=HdVgXpPGHBkLJ(}I_I^@Q4JT%p4NLKxjA$u z>ft*@*D)?Ki~2Z!_Pkj+nn68$yJ*i_kvi((e3|DF^N8`?qI1RS?zz}Abf1wITb)O4 zjy$&yB7XEtkPm+fbLiADPXa@E0$D%zSM_vcIUYsYd?~}^Wel(9f=$ub0 zM>Xu0`PTa^xjA$;>fzT#*YkN~7WMJx$@4Y*%Fzt!;a5d_zKqmS4}Z!$kC;b{-xQrI zR{yr*?<&ThBb+Sv`TNi;nn5$jgZBMUIjUjj%(tFpoxp~xq1bso9>bZqqBh!5>VJ)AiE(K(%>qZ6Y(>Y@LRL4NUp zskay>sh&Mz9`{1*p1C*3i>=NhH%IQL|IN}zee}PB{+sN8^wECgLmuR#!SQto-4}FU z@Ndyn(MieimZH9#2m3@*N1hA1|2SVXP334mnnNCR&a{=I8qOQF-gJr0p)*kr*D1P= z=_9kKkMl$`RE}m)57#Q%Gh^g^j^39zTQpPU=yjs&M;`QgXO8^3L%+W8hx~e+rE;_% z%^?puXV%J54ZqKP>&>3r96A&AaPFe(m?JWa`uJJ)%vm{_K|SnRv}dkJ9rbWR=6S?C zV(eCQu2|hY7kh^8GxB1q^T^GS=Qe-DkDd+k;XjI=*8-6}sE^&F1uI80sE5lH?O7=D zI?(mvCwYAfSC00hdE`OoEK)hD;m4V8y&lQUp|epB|6X)Gi$-QqA0Nz~#VSWLsE11w z?O8lhM?HKX^E_f6F)mqju2_AkikGe!mydAmXqm_?nn5$jgZ3?3IjUjrsP)`)HB`g3 zB4^pRLd7dqj4MajGg>Kf9-2Wj$b+uejQT1SuNsccuQ%jF9^^s$>CyOB3;EDa)WbE3 z&gm6B5_&^)`!mvE{oY-n??;MV>99C5uZHw+*+9q9f>^=uU_UR|8q#E+f{^6eg(!-Uy?-S)ht5R3fe|mZ{D#c!RXOq^&%dL!^6Luw6bC2X zJMw?1k355-^^@cF#p4t26PZVSObWLlYkuxo*@)*N435^&AxKo<3exd_M8Pk$tF-=8zYib4cZ=hR;QQN@W?FcRKdS9It-IzW;RJ=Cv*^zyy zkLHjUopVm*sD{@>t#@8xbLdRe!)J@Gf_bX1(l;2)WfHW_FNb}oa@BLiZ+lTsS4tdcz!z)KMTqg6aHzK(?bSCQI$fE1G zEHaDwxLEdFUOAdUJ-o7L&lQn6>fxf9=MnRW@v5S8#p>?4*fVsWkr!K?M{bThxBo=^ z=-D72-e2^*u8ZtJeY`2UzH&5!dU#*ao*N>s16?n6&+8jiIoglrkq4b~W96uZi)6m_ zZcc6vosD{UN741%5}8GPTsV7ftsKpu9^PKG=e9^4_0T+zm`99v7M&|rzpLWAE5-*R zd?valGK*%=4Dz6T_g0Q-_;l2I?ztMO;Zu>b?0c}{hbqR0BYZR(9XSuppc&*r*K0=o zk&4HJXGF+{JjjFg)2Y#85g*!#diX@qIgdvt7xm>lIJU?yJ~C=CK3TavVjlNG?4G$d z$cwGcBR5Cx=d+PM>f`g#bJ5{N`{jJdgM4&I^g?t-acI%~c`Zx{miF zv#5^)v*&}#(G2S0M@4%+jMPyN|CMs z1o^&*%wfyFP5fo$$csE*MXnQF4-Uxne_c7+hy2Kc_I^`2s^K1)Z@ur5n?q-!-uDqN zw)~%&`=N5=MV=p{4T_r+KZnl^D03@_&3HAKaWMxqYaQ=8zYiGjZjphTCLM>rI;696A&AaLS_V=p30v zecU*ECaWCHpdL<9v}f{29rbXd%=3tO#Mq_iT(P=)F7^!FXXM3J=aHKu&u!X}A3Yo7 z!+DFI*WV(0P#p<6w8|3xPP&wL<=8*@TGh^kbhU;g(^=3|P z4xNp9I7iX-%o3SJeVjjgX005}pdQX%v}d+R9rbX&%=3tO#5iZsxnlLXD(+e_&KKcQ z(cF<)G=pZ42kq-tIjZ53QR}(qYN&>PkDO)S{1q=yF)kEg_h`Y$d1waBAP>4;GwKUh zyhwOU-bcuXJjjFg(~a@<2>H-X)WgM#&RI0NA%4_H9$c)*FTNta7UL2T+9T$1FU0Pd zdxJdK>O69D7za_8!Z!EmUGd5ua`ZaU^`jZ|dV58)6=yHblV6XkCzhlAXb#PwbJnOF)v#OUTW_u8 z=Fpj_hkc5!qjzK$^>LQ$S-WyHgL=4b(Vlf8b=1R|GtVRD5#xGA=Ze+cbFpXWJ|i!- zI*;5Od2Sm;{OH*rAMR50yf%*PL4DjJ+N5$cgL=4g(Vk5suLE5#&Y0J?S>b81$cH@0NAJeBf9O7;|0Y29 z=YYul!j>PBcu3{Qi#!KLo)3BsczSeDCp;>DJq zn)vX_kr#Q6h_)+kUpzKEGLoa$fvykDpx1L$v`ul_;-~p_cXVPo+K=YY3_9nS%25qJ z$$aY_m)smW6ZP=qqU$(5GK>27PWGHoIhsK|JgI2UiIF<$;oF(#5%Y-gl%jLR>h7`F zGjd;%7h9c2ZjL;sGa`QUOptGAWDZ+?PU2yeBQNrt8M#h$J@{s>|E$WLWk$qP>??j%s*Q)OwdDHiyncy%7;Fw*1D#msO6u$a8sgQmz9}FJ7JaipX`N zKDs{SMX%?|XlVNQLh<*+BP07zAI%{zI_Ij&Q4N2KTJM^~=Fpj_hc^^m$F-4J)W`3m z|5T1>{*fVlpkr!K?M{bThr&}U^^h}WN*2o;T z{I0~eRgS#Kb9>}E(e>ar(H)heeaMeIXz!hsqZ)o4wcg!{&7m_<@1BSkTmDtzdn-p? zZA7w@}l?E1JStj(bwtl<>)Ye`5PkAI%{zI_HVXQ4M#@eCs`x+#EU+_3-(k>v%dci~6{A_B>NLnn68$ zu4vD*kvi((R+;A!^N8_62`E86pJq>g%Mo=40h#`lZP6{~+x@rM=Tgb06$K8nnu88m}DXy3<` zqZtN8PZ@yiImiN1)Ohi1?W@}TQAqyAOJUx)WZ$cH@0gZ9&% z(YFyF+KGDjL(w_kMYk9ARYvYQ3(B&7m_8h zEiRaN-e~{isE>~qdF4Ar^F@cJj%O5CNIZXJAL^qy27k7$v~(G2Qg-=aO;qhYyDJh!++;vSLLh5G3Fkr%z*MWgf6$K&z?T=1P~ z^0oNTKGa8Z$b-&VymC~-W3#9A{+`?%IurG9*`n)MGBS($cu4jvRXLhLJzS<}&(e`P z>fyne=MnRWak-*%#p>?4*fVsWkr!K?M{bThw-qCP^lXq1Hz;~uD@FF8KCTw6TsfLS zJzT$N&nl7Efvy)1%sE{#M!0>{Co+p>&KFs^O5R_4+3^ht5Pjyrk$l{u!A?eLNuAqjEHZdU#>co&nL?#dV7R4)=`Y=yjs& zM>FX4{wrFuxK?q4{CXUiSdR9iIW&XL*{gC?!}T-YdV41~ht5Pj+^^_521RC3AJ@p9 zeJV#YsE31#_Us#}qaLoFc^)y3822waSFG-yi#f;g7A(f*U)WcJX_8b~{9q4*-wY5uxI95@5tol(AlVm z#}!@AQIT2H$62%I=*rOy>fy0Pdya|JQ4eRyJdc=1jK>$9D^@?D;u9;z(;~b$Iw>-X zX3z}spnWG-j%s*O)Ozl@8mi%ik+bYOz2Y+}#$gej9Sx0~hi1?W@}TQAqkd+^XN7Y| z$cH@0gZ9&$(K!(x+KGC2e$hGSMza_7*X^QsC`H%A+5xnJ1ws}f&cIhsYDDs_7L96A&Au8DZD<##5&wsPb}p8rJ07f&eO7+x32(d$6h zhi1_0xjs6kcx-W|{JOg#u^jD3b7%&gGpce_!x=N*dN(CEht5PjyuIi;ZjQ{NK6c5T zTPjC0sE4-|?YT8lM?IV}^E_f6G2T&hu2|hY7JEkSEAnEi^T^GS=X6iRkDdwg-5Z(1 zmOqsEzRHmodG3!~C%PV-JlFp~v$nDi~2Zg_Pkg*nn68$xoFQzkvi((EScvK^N8`)qI1RS?xom0cW;pwTb)O4 zjy$7rkv{6+88hE{?^X@f(7$K+Ug+zUI7x&b zMdKsS7xmF|L>~0q-w!)SI7{)D@Po)c)JJp3i_ZD5a#X{gqt^R4u{m@m>S5QMkFMjB z&@AfXPtm89BQNUV9GOFVCWNy^*tPgo_*vw2p+35PKMDdX9{UWh_sE_9U zkEpwj_O7hHzfYHRHz?iR-67K5-6bU*A}uINhom6gC?(x3APtIuiXg3oz%yUp-`wN* zV~+QVxz@Em*FN_-2N`ms8FbDE%~1^x&iv5(Fu6H&ChFm5rRVr4GK>1SZ}xoL9L=B} zep=e|Nu-W?xKHMJ#5`jBymYQu-JOfQL-&llIMjLM=E!^dGU7+?1o?36oR8kuSD`(q zkKaXKH%DI7!|!Dd?fGBmbD-zNy;J|DIoglrkq4dgZF5w^y)r-aMo4T9or!ulYJ{F= z#KVUL5K?a&zQ9 zeb3TIee`|M&(ddeF4~WL$b)?JRD9Ei?giZo&KP|^a^L7)aiQo3&Cwj1K^`Ft+iso*PW>633E$x{nQb#?!G2#*Ph;jbXxngy9DR$@X z7I|@~^T^GSceHS%kNUWHv`FM!v>&gJ7Hy8^&GLe0#kLHjUowICnRKxY6p|^ZubLdRe z!-GoCu|i}P^>N*3#pY-R_3(hwo|U3I^PG5Zxq9N2BcBWP(eooO`n;<|_ot6HFt6&z>JOM>D90YnAq_ z8L6WlUY2_L6pEZV3! znn69>skCR~$mc-MiA9|Z7H;2wfJ=~`BJX=I&Q6CS< zo-LcB8PvnAOMAA8)KL!)&ODEpM~vH+&K0X~*LeHJxJ!fwMmt1i(F~eF9<*=A=BS20 ziH4p#S3@;CAaa&{yEfjfG42uJ-qG%n^Uw^MK_2wHX4Lm=yjM74gnY<@JZL}pJ@LmO zAKHm}xL@gV9vtdCa&zQ94~q0r9}kHR zj{Nfl+K+t5gM8$lV-5}73%VCPDmpA0xtz7sSLeYyqQfKa1>HZM79G(X?MHLSgU&g! zIjZ5WqoMcH#OBbMsE461*QQC7#q>g&HN9K9NJYqbxbgo$4or}Fg_l&$a)OqCQ$a_0I;z#cW`S5q8_jN{O z59;H&(V5NB4C>+Kr9EdwJ_mYU+%2E)?B-}cnnxaV&N&{H8gYK|Q>%wC93I9rbYe%=3tO#CUP(T(SBkjW2DCS48-S=(mwsG=pZ4 z2kpD8IjZ6BqoL={)ldy@jhtoQm5r}zjMqeXeROr?JT!x5kOw`l8TD%$Ul%SBAs_M} z586+QMK?rzXea97&82g0j20>No@_-ypY=4cMhAP<_qyE&@iGttny zw>4D5r=$BKUvKE^10Rm=Z;qY|orgT=`5uUT{o{q@viWoIU~{w|%^@#3=b`4PhRbAr z=sl9$96A&A@X6A1JQ|rreOx$u9&3(fP!FFd?Rh*>M?G99^E_f6F+No~SFG+X#qQkQ zA}Yp90vrTU$=owHCC(HAo=lfe|7WMHz(c8_D7xi%B%%MG=-SfR0iT~ah|JnTC z;XfkJk9=qbdC})LqyApwe>KLD^Y``P>f!sLIW&W2kO!UnL332Y)iOWyK1^;8dIr?P z&q~krQDheNarx}|xH+0ZJ^Zw^=aWbs^>De&^N4xG_<8AEvATC6_Kv*=z5HfdS}Roqvidf_xV+559;H0(bvt97xi$|%%MI13w;jsytqt0-#5+Cel(9f=$vnx zqZ%%q`Jp#LVsq$B)WZ>TK6;)JL$j!lOGP6!M_$y!PseYbd0%6`jz$T^qefyJy&O9n zE%J4Se8`8q=eYaI72j6WDd=s8RS9dey=&I;SZvrH%?-E&@-SOu3D}h zjvJXpef)kjUUM{qdbm<)k7xIM6EvQ%F-{!e6wySH=SMSW26@ouH={mD<4GIiUJ+g! zO%|C$GiU~R(7BU0M>V`A8hTSEwg)`}>fv;y=b9=qi~4w3G<9<{gL*h^Y0or~I_lwX zBOWo27^g3tD^~YT#NM&@fV?==dF1BEdz~@jNAC{#aFNpcoGG#g^>OxS=H_Sy^>E?R zo>?NF13fQZ63yBi?ML&-gU*?)IjZ5s(a@VCu{m@$>fyYl=b1Ayi~4v`G*@#pgL*hm zY0un|I_jZ$9x;y?=PR8nR-eD|0*!Ie2v>;~jLf1LG=n^7-$Kn%4Ofnao;z1VHC!oj zmVJvgUc50b8R0U~5|Q)J44Oe6^t@)&mukFpIAVl+$b&p+Kl%Qat6aA<;@}eFdkvX(y&CvTp?+Le$)@qLSqj}^( z=d9fv)o{CL=&hUB96A&A@Q|F3o@c$#Eb8O7(fZAi7xnPK%%MFSg!4r>f4OP6VRQ63 z(eooO`n(%ObC>g!?}i&kaEM!Pge`_Vk|pmTO@j%xTyH1u{)Y!01?dbmT* zN6)iIXcqPHft%1J->+N&F4VRi}oQu+DCK6cWS7PcA*}gR@(ooXpZ<%A9?WCCBJy2 z_=XrykI)`5&l!!+Y>ekccvW;(WCqQk8RS9x&Tfuscx5#7+=&{hp?h|gedjm+O=G+; z!b_qHBIltQG=n_odCjO_)cE3X&ItLC2YJwbnk~9C;zK)84=*pB^V?{aQeV!4mzDhD zX`&&<-!->K%;PS^?#$gFFAjAcxjAy5S4aA&kJm=mL{pXa%lVK8`DpU!y2!ntd%>Hd z>!Z2LjY@rW9(*^tA@W|({p0=7jm^=1G>1IsoST}X8r~NTy;~BSLuaBMzFm5bTO+fm zkM~BuZ;obA5C2-)^M~m4@{ID1@U}>fJ|}v9G=o0x?a>JNbBDifZl9bF?W1pEy)#rt zJ5UerF73T5`Z|8pM;`oR$uIsmz9GhYBD6=$<4(lx*gYT*4s{;6IdZQLMEvOPkPn|L z-RFamJ*bb5L=QDbGpL7uD(!hV`Y@jZJulja{AeG&AK#;)I@*PL_(W;{W6^u@qdxNB z<0ZfNzW9b1pN!BRG0#(tpKgrLNBFnsnaB*9K{LpM_C4Di)$pxo=(!U$R73adEc;$) z{O88_QiQKYFGkKoGiU~R(DRy6f4T81;T{q4ArJDP{j_WJTEvHTq8`3kI_LFh=TcwJ zgKw1l;w_^g#=kVTN6h0c#O}=9ATJJe9=SPkpKnL{sE_YP??juI_RIN@2l;4|=O*6)WaDvhxWV|dVlCW;s2t4HAnl=Jo2D(-fxa- z_;ob&{+-wyIurG9x}1-m=flt}>f=|@N6nEJ^>FIUp*$H^SpGeW%A1?YLv zKIBLH=<1{+wT^b69*&uPX#dFJmGPrK>Y;xhi2S33kL2$Gz=!hh2}TXYqeWsIqZ}t3 zJ<>;g@^+_8~))?oB z@PKIY$Q+tMGsuI^ouWCa;r`Lkn<}wA=owHCr!PI%)R9@#$33HInxh%i!|6(Urj685 z5BG?8#5`jBe(7AXx_2V>j=cxu#i7n4H%H#f;>IEX|P@ z_3(zwp*^#PJ_mYU+%1}|Ioglrkq4bKdvjF7U8A8lXJT{cOw_|`az1*Vxk9t3kGn*3 zH%DI7!wWKp_V^m}bu@1zp06=3(0tKw{>axE@}U{zMPH|8)E8{LP-9#&!nLA>BXej5 z%^(jtcai3(hHFMcZ?VMopl3im+^;+!Ts$(1`uL-0iRNeq_3+1~J)Yh3E!BAG#<*;R zD@Dsho*&Ji8RS8q-;DZljhAnX=SKKSv_fPK&7c|NLFca69M$mUXy~n+*dFu@sE0o+ zJ=ZFcS=7frMXNSPGpL8Fm-eg{siPh~8}W#F#JEQ3T(P=$BKD5G2js<}&LcNR-s{>C zKYDk_huf9j=Q@!+sE->)>o!L-sE6B@_N*8A9O!xR>1h4tXg``q9(2wI%~1`XiiX}s ziOr$2Q4cpSJrN4Rga zbz~OJpc&*r`?hJ0YPe4{^xU}`s^O0#XW6$y;~g90&Jpew?G!l=&7c|NLC6|^HSxbF65AIp=i>Hl-824^&kC?|@h~1gHL0%l{ zJaTj7KKG0CQ6CS8_K&76?U(Z*5Ax9z(N7}xgmahfM?PnMzM!8s2Zrts_3^OipytSn zdN@bs(4K=s?+?8v{AF}VbF?4LBM&;~(B`Oyzlet3;fc+mGf@v`$@%DcjtI@7KAsXC z*&KOM4`<9A+H+L6MTA?H$A&*`jy@-Pe&j`;_vmQTa&O|+&Am^j!IXg6q`Z#L#oYNe6Q4dGX9NKek zxLkBzBtE|}UeNr~@Hf%&C7;|3^5QFz8TAVrU(^_X7vb-tiz9Pr2F)N3I`@+1sD`&j zL+`hV?Lp6gdiYZ5xh{*$qCVadUEUncpdP+Z+T+Zb&cwKZ=#02koa_;=4ZNLpxCqZz`R0L$p);sE<5&W63YxBEBKUnZ!2YOz# z5BbqP+Bm+uLUptY_3)n3{y#<=#*g~QgLjww;<@4*V!Ss(d&E5VHNL+wJ`&-J(F2hg zG=pZ42km>XIjZ5GqoLO69D z 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�%8GWL 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

nXA|=(LIU<1S7$HkUj?h` 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

AzzC*S^f7J)Z6Vnx5_d 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 z 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 E0LXi}m;e9( literal 0 HcmV?d00001 diff --git a/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py b/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py index edd16c809e..438be4ce32 100644 --- a/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py +++ b/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py @@ -41,7 +41,7 @@ class FakeLoss(BaseLoss): def __init__(self) -> None: super().__init__() - def forward(self, y_pred: torch.Tensor, y: torch.Tensor, **kwargs: object) -> torch.Tensor: + def forward(self, y_pred: torch.Tensor, y: torch.Tensor, **kwargs: object) -> torch.Tensor: # noqa: ARG002 return torch.tensor(1.0) @property @@ -215,15 +215,9 @@ def test_ensemble_gather(self, callback: PerTimestepMetrics) -> None: pl_module.ens_comm_subgroup = MagicMock() pl_module.ens_comm_subgroup_size = 2 - with ( - patch( - "anemoi.training.diagnostics.callbacks.per_timestep_metrics.gather_tensor", - side_effect=lambda x, **_: x, - ), - patch( - "anemoi.training.distributed.primitives.gather_tensor", - side_effect=lambda x, **_: x, - ), + with patch( + "anemoi.training.distributed.primitives.gather_tensor", + side_effect=lambda x, **_: x, ): callback._eval_per_timestep(pl_module, batch) From e7db74f1c4e06191763efa1a8852f60f81713017 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 14 May 2026 16:58:52 +0000 Subject: [PATCH 79/88] tests --- .../training/diagnostics/callbacks/per_timestep_metrics.py | 2 +- .../unit/diagnostics/callbacks/test_per_timestep_metrics.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py index 97108da496..243bcb4cbd 100644 --- a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py +++ b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py @@ -91,7 +91,7 @@ def _eval_per_timestep(self, pl_module: pl.LightningModule, batch: dict[str, tor # Gather ensemble members across the ensemble comm group if hasattr(pl_module, "ens_comm_subgroup") and pl_module.ens_comm_subgroup is not None: - from anemoi.training.distributed.primitives import gather_tensor + from anemoi.models.distributed.graph import gather_tensor pred = gather_tensor( pred.clone(), diff --git a/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py b/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py index 438be4ce32..db08d5b6e9 100644 --- a/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py +++ b/training/tests/unit/diagnostics/callbacks/test_per_timestep_metrics.py @@ -216,7 +216,7 @@ def test_ensemble_gather(self, callback: PerTimestepMetrics) -> None: pl_module.ens_comm_subgroup_size = 2 with patch( - "anemoi.training.distributed.primitives.gather_tensor", + "anemoi.models.distributed.graph.gather_tensor", side_effect=lambda x, **_: x, ): callback._eval_per_timestep(pl_module, batch) From 31ee3a02ded4f1cc29b7f49a6e3a5ba425884342 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Thu, 14 May 2026 17:03:47 +0000 Subject: [PATCH 80/88] update config --- .../config/training/training_loss/single_MSE_aggregation.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/training/src/anemoi/training/config/training/training_loss/single_MSE_aggregation.yaml b/training/src/anemoi/training/config/training/training_loss/single_MSE_aggregation.yaml index 665184f140..5e335e34f7 100644 --- a/training/src/anemoi/training/config/training/training_loss/single_MSE_aggregation.yaml +++ b/training/src/anemoi/training/config/training/training_loss/single_MSE_aggregation.yaml @@ -9,7 +9,7 @@ datasets: loss_weights: [0.6, 0.4] losses: - _target_: anemoi.training.losses.MSELoss - scalers: ['*'] + scalers: ['pressure_level', 'general_variable', 'node_weights', 'time_steps'] ignore_nans: False - _target_: anemoi.training.losses.aggregate.TimeAggregateLossWrapper scalers: ['pressure_level', 'general_variable', 'node_weights'] From 68bb1059ae04eb1cf71c64a6928b76edcbc7a9a6 Mon Sep 17 00:00:00 2001 From: Mariana Clare <31656450+mc4117@users.noreply.github.com> Date: Mon, 18 May 2026 18:25:30 +0200 Subject: [PATCH 81/88] update docs --- training/docs/modules/losses.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/training/docs/modules/losses.rst b/training/docs/modules/losses.rst index 212af171e2..cbbea2f106 100644 --- a/training/docs/modules/losses.rst +++ b/training/docs/modules/losses.rst @@ -129,7 +129,7 @@ following aggregations are supported: temporal transitions and discontinuities. The wrapper accumulates the specified loss function evaluated on each aggregation in -turn and returns the sum. Because the ``time_steps`` scaler is +turn and returns the average. Because the ``time_steps`` scaler is intentionally excluded from the inner ``loss_fn`` (temporal aggregation collapses the time dimension), only spatial and variable scalers should be listed there. From 5d6b6516e4a8c65e78b6abd9456646700ad35350 Mon Sep 17 00:00:00 2001 From: Mariana Clare <31656450+mc4117@users.noreply.github.com> Date: Mon, 18 May 2026 18:27:36 +0200 Subject: [PATCH 82/88] copyright --- training/src/anemoi/training/losses/aggregate.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/training/src/anemoi/training/losses/aggregate.py b/training/src/anemoi/training/losses/aggregate.py index 961543127e..de44302b88 100644 --- a/training/src/anemoi/training/losses/aggregate.py +++ b/training/src/anemoi/training/losses/aggregate.py @@ -1,3 +1,12 @@ +# (C) Copyright 2024- Anemoi contributors. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities +# granted to it by virtue of its status as an intergovernmental organisation +# nor does it submit to any jurisdiction. + from __future__ import annotations import logging From 3362726e168bca3654de4bb9c0761ae30c677127 Mon Sep 17 00:00:00 2001 From: Mariana Clare <31656450+mc4117@users.noreply.github.com> Date: Mon, 18 May 2026 18:28:58 +0200 Subject: [PATCH 83/88] Delete none --- none | Bin 2030409 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 none diff --git a/none b/none deleted file mode 100644 index ef8e43b1fbd864e1cfffbc619de2557d245dd44f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2030409 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

=?dPn7`X~UX6ciFrV4}^RL4EeWmS6VLre0 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 z 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�%8GWL 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

nXA|=(LIU<1S7$HkUj?h` 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

AzzC*S^f7J)Z6Vnx5_d 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 z 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 E0LXi}m;e9( From b6b311ad2e6fead069a10df80c077cdaa6cdd469 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 18 May 2026 16:44:13 +0000 Subject: [PATCH 84/88] add callback --- .../src/anemoi/training/config/temporal_downscaler.yaml | 4 +++- .../training/config/temporal_downscaler_ensemble.yaml | 4 +++- .../diagnostics/callbacks/per_timestep_metrics.py | 8 ++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/training/src/anemoi/training/config/temporal_downscaler.yaml b/training/src/anemoi/training/config/temporal_downscaler.yaml index fe78ccaf22..f791ee3fd7 100644 --- a/training/src/anemoi/training/config/temporal_downscaler.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler.yaml @@ -23,4 +23,6 @@ config_validation: True diagnostics: plot: callbacks: [] - callbacks: [] + callbacks: + - _target_: anemoi.training.diagnostics.callbacks.per_timestep_metrics.PerTimestepMetrics + every_n_batches: 20 diff --git a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml index e9f3b710db..12ff86f2f0 100644 --- a/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml +++ b/training/src/anemoi/training/config/temporal_downscaler_ensemble.yaml @@ -23,7 +23,9 @@ config_validation: True diagnostics: plot: callbacks: [] - callbacks: [] + callbacks: + - _target_: anemoi.training.diagnostics.callbacks.per_timestep_metrics.PerTimestepMetrics + every_n_batches: 20 system: input: diff --git a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py index 243bcb4cbd..e5db8017f5 100644 --- a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py +++ b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py @@ -18,6 +18,7 @@ from anemoi.training.losses.base import BaseLoss from anemoi.training.utils.enums import TensorDim +from anemoi.training.utils.index_space import IndexSpace LOGGER = logging.getLogger(__name__) @@ -125,7 +126,14 @@ def _eval_per_timestep(self, pl_module: pl.LightningModule, batch: dict[str, tor "scaler_indices": (..., indices), "grid_shard_slice": grid_shard_slice, "group": pl_module.model_comm_group, + "pred_layout": IndexSpace.MODEL_OUTPUT, + "target_layout": IndexSpace.DATA_FULL, } + if getattr(metric, "needs_shard_layout_info", False): + metric_kwargs.update( + grid_dim=pl_module.grid_dim, + grid_shard_sizes=pl_module.grid_shard_sizes[dataset_name], + ) value = metric(pred_t_post, target_t_post, **metric_kwargs) From 037d3b6dde04dda781493310c77b86463c563f47 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 18 May 2026 16:56:46 +0000 Subject: [PATCH 85/88] revert change to squash --- training/src/anemoi/training/losses/variable_mapper.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/training/src/anemoi/training/losses/variable_mapper.py b/training/src/anemoi/training/losses/variable_mapper.py index fca36579d6..4cafba754c 100644 --- a/training/src/anemoi/training/losses/variable_mapper.py +++ b/training/src/anemoi/training/losses/variable_mapper.py @@ -304,7 +304,7 @@ def forward( without_scalers: list[str] | list[int] | None = None, grid_shard_slice: slice | None = None, group: ProcessGroup | None = None, - squash_mode: str | None = None, + squash_mode: str = "avg", pred_layout: IndexSpace | str | None = None, target_layout: IndexSpace | str | None = None, **kwargs, @@ -347,10 +347,9 @@ def forward( "without_scalers": without_scalers, "grid_shard_slice": grid_shard_slice, "group": group, + "squash_mode": squash_mode, }, ) - if squash_mode is not None: - loss_kwargs["squash_mode"] = squash_mode empty_metric_selection = False if isinstance(scaler_indices, tuple): From 24bc65963ea3aeb96654a8e52f21687021cfe6ce Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 18 May 2026 17:41:03 +0000 Subject: [PATCH 86/88] fix callback --- .../diagnostics/callbacks/per_timestep_metrics.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py index e5db8017f5..2ca9792382 100644 --- a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py +++ b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py @@ -72,14 +72,18 @@ def _eval_per_timestep(self, pl_module: pl.LightningModule, batch: dict[str, tor """Run model and compute metrics per timestep.""" # Get inputs and targets via the task x = pl_module.task.get_inputs(batch, data_indices=pl_module.data_indices) - x = pl_module._expand_ens_dim(x) + if hasattr(pl_module, "_expand_ens_dim"): + x = pl_module._expand_ens_dim(x) # Run model forward y_pred = pl_module(x) # Get targets y_full = pl_module.task.get_targets(batch) - y = pl_module._collapse_ens_dim(y_full) + if hasattr(pl_module, "_collapse_ens_dim"): + y = pl_module._collapse_ens_dim(y_full) + else: + y = y_full batch_size = next(iter(batch.values())).shape[0] @@ -124,6 +128,7 @@ def _eval_per_timestep(self, pl_module: pl.LightningModule, batch: dict[str, tor metric_kwargs = { "scaler_indices": (..., indices), + "without_scalers": [TensorDim.TIME], "grid_shard_slice": grid_shard_slice, "group": pl_module.model_comm_group, "pred_layout": IndexSpace.MODEL_OUTPUT, From 328ccf1e38e951b2907f5bfb6bb017ef404af6b0 Mon Sep 17 00:00:00 2001 From: mc4117 Date: Mon, 18 May 2026 17:46:09 +0000 Subject: [PATCH 87/88] fix pre commit --- .../diagnostics/callbacks/per_timestep_metrics.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py index 2ca9792382..1948d74ba4 100644 --- a/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py +++ b/training/src/anemoi/training/diagnostics/callbacks/per_timestep_metrics.py @@ -72,18 +72,14 @@ def _eval_per_timestep(self, pl_module: pl.LightningModule, batch: dict[str, tor """Run model and compute metrics per timestep.""" # Get inputs and targets via the task x = pl_module.task.get_inputs(batch, data_indices=pl_module.data_indices) - if hasattr(pl_module, "_expand_ens_dim"): - x = pl_module._expand_ens_dim(x) + x = pl_module._expand_ens_dim(x) if hasattr(pl_module, "_expand_ens_dim") else x # Run model forward y_pred = pl_module(x) # Get targets y_full = pl_module.task.get_targets(batch) - if hasattr(pl_module, "_collapse_ens_dim"): - y = pl_module._collapse_ens_dim(y_full) - else: - y = y_full + y = pl_module._collapse_ens_dim(y_full) if hasattr(pl_module, "_collapse_ens_dim") else y_full batch_size = next(iter(batch.values())).shape[0] From c0bcb43386ba8d04da5ff5b2261957f69ea2b5a2 Mon Sep 17 00:00:00 2001 From: Vera Gahlen Date: Tue, 19 May 2026 10:53:24 +0000 Subject: [PATCH 88/88] make scalers optional for combined loss but required for base loss --- training/src/anemoi/training/schemas/training.py | 16 ++++++++++++---- .../tests/integration/test_training_cycle.py | 7 +++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/training/src/anemoi/training/schemas/training.py b/training/src/anemoi/training/schemas/training.py index 388ea1caf1..9a7663c03c 100644 --- a/training/src/anemoi/training/schemas/training.py +++ b/training/src/anemoi/training/schemas/training.py @@ -262,8 +262,8 @@ class ImplementedLossesUsingBaseLossSchema(StrEnum): class BaseLossSchema(BaseModel): target_: ImplementedLossesUsingBaseLossSchema = Field(..., alias="_target_") "Loss function object from anemoi.training.losses." - scalers: list[str] = Field(default_factory=list, example=["variable"]) - "Scalers to include in loss calculation. Defaults to empty (no scaling)." + scalers: list[str] = Field(example=["variable"]) # TODO(Mario): Validate scalers are defined + "Scalers to include in loss calculation" ignore_nans: bool = False "Allow nans in the loss and apply methods ignoring nans for measuring the loss." predicted_variables: list[str] | None = None @@ -342,7 +342,10 @@ class MultiScaleLossSchema(BaseModel): @field_validator("per_scale_loss", mode="before") @classmethod def add_empty_scalers_to_inner(cls, v: Any) -> Any: - """Inject empty scalers for inner loss; scalers flow through the wrapper.""" + """Inject empty scalers for inner loss if missing; scalers flow through the wrapper. + + This is needed to avoid validation errors on the inner loss when scalers are only defined at the wrapper level. + """ if isinstance(v, dict) and "scalers" not in v: v["scalers"] = [] else: @@ -382,7 +385,10 @@ class TimeAggregateLossWrapperSchema(BaseModel): @field_validator("loss_fn", mode="before") @classmethod def add_empty_scalers_to_inner(cls, v: Any) -> Any: - """Inject empty scalers for inner loss; scalers flow through the wrapper.""" + """Inject empty scalers for inner loss if missing; scalers flow through the wrapper. + + This is needed to avoid validation errors on the inner loss when scalers are only defined at the wrapper level. + """ if isinstance(v, dict) and "scalers" not in v: v["scalers"] = [] else: @@ -446,6 +452,8 @@ class CombinedLossSchema(BaseLossSchema): target_: Literal["anemoi.training.losses.combined.CombinedLoss"] = Field(..., alias="_target_") "CombinedLoss target." + scalers: list[str] = Field(default_factory=list, example=["variable"]) + "Optional top-level scalers propagated to sub-losses that don't define their own." losses: list[ Annotated[ Annotated[BaseLossSchema, Tag("base")] diff --git a/training/tests/integration/test_training_cycle.py b/training/tests/integration/test_training_cycle.py index 9d4778b6fd..a2e892e9fe 100644 --- a/training/tests/integration/test_training_cycle.py +++ b/training/tests/integration/test_training_cycle.py @@ -418,3 +418,10 @@ def test_training_cycle_temporal_downscaler_ensemble( trainer = AnemoiTrainer(cfg) trainer.train() assert_keys_exist(trainer.metadata, PARTIAL_METADATA_SCHEMA) + + +def test_config_validation_temporal_downscaler_ensemble( + temporal_downscaler_ensemble_config: tuple[DictConfig, str], +) -> None: + cfg, _ = temporal_downscaler_ensemble_config + BaseSchema(**cfg)

c@N3?~iG`w9FZd%mw{JhMg{Fa(EZgln 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 z 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

c@N3?~iG`w9FZd%mw{JhMg{Fa(EZgln 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 z z`X5e3|Mgq;f93C+pTFl@yJrpkm**cIi1~BL`By9c{gw8Axi8JVX`Wxc|0_Rd`Io!b z^q`bS#%{L!`MST&J#IPw@)_sP{Q&rvJHXukmG?R8+yCY6ujo&@_bYaQ{X6@=rm#Ef zZTQzF^hGP}|8k#D_mQ}l#Qt3L z$K+q`{fZr6mG*zR8zK0Ydr0J8mG*zR`z!i#&b0^sa(~Hxa{re*Saw*GS;K;V-Oqgf z<6l-K`PZ_m)ak#1f3<{vEy(__oPX^|zcKs|^ZshycMbma|N8!~35EXaBlKUf|Le*^ z|K;!1fBn||UzefZTC(+|bnr1_(@^wZW&gu%@jm+f zLG@+9zuY$!`@iI0@3i3k(Iy4|(%($$efuQ7Aj2R^0$p}V_c|5wjJlhf|- zFL!)hS@J*Z`$!%CD)0aD^?i*8GW}P)zV9h}^L=Cgm*?;PFZZl@-k!f_?=y(~Up||E zcmJ1X?Kyk?;eY7!h-Z`gAJ(`3D}U~J{15*__dV9fzue2H{>wNW{)fh6#%N>uQ|8oDM-nZ_6)Dzd-;9f}gf9Zed z{x5Tgxg_*okzZo}m$@g;zxDC2JTJQ!GxT5Xzf}L_KFm?{d7KZ4{a@zI*#8y&hk2fL z|CjtL-~VN9&hxwZTOVWhd79sYf8}}Kz1P;i)4rL@zuW<4{TuwteE{wSus)9Z)cs$1 z9s2L=|8n5UC{ks)?e~3eK@SMF2`ryc|+@k;9u@zb}zI0nS+1zD)BGtqdwF| zXEP&cy`*RSWAHD1=dHiW`@fEce=T%E9skPfGJQQ_|JN&z4oU~Yzm_@b*ZeDXf9ZXn z^Dq4m|6kbumDk4=|N5=_zhd{7{eb!LFZ&Sg|8mDdzW>V}g!>qB{uTSbKrH+~NO z6Z^j&Wd^;{{;&N@{7e7C*#D)6(}M7?`R)JeRPsOk|9$_LJ9A?H*9~itkGS(J=>9Kv z`^dlC@00VdyuWSV+Z|xRzow)8atBzx|Le6v|K%RAl?(lsU;kJ4e_aLtTCdQ5h5w=a z>&FuRiv3@{&l`pQ%Y9<8|I0mNvH#2cWB<|HJSgbRU=cuh`GE70gQS!tg)T`>;75<^5lJAO53BRT|!NF8}(i z`@i&^Ebsq14E>jT*XrB<<@tC{pAM+wfS!lv;`w+^o|ot5`FZZKgDv!5@-NR{_NWJ? z&m*3VzLxHHbI)7Ozx1{A`TCrF-tK%0{uMhQe+&O|KV$6wavx*(AG)K_{a@~Fbbdkp z75<0LIJoQ4J&*4Ha`$61W+0r2(ErfAkmeR=ES#@cko{lo9&`s`?Eeb?L-&8l-rYf1 z-~O*W4&?Dc{a5V&GX5BQY8iaN*kk{fy9Z_P`Tj5W8tU)rp2Pb54`*IArgrzC-2b5d z6KiK5%mLwlXuQ|^)*X=Ue+>UacSEZGaz~^48UM@-kY2Rvzuf;7`x)KY==3U^4lOVT}(`F=@fF5Lg+-br(>IoSLg`Y-ow>VN3& zO+ARs$FZAJ{$+mrSN4DDF`V!JGWY61ockX(WVWS}|6#u0b5mws^gdSqmEZs8$G@x# zyqAanVeJ2MA8$4KuiG>K!;kU8)W7`TXJ4tEe{&CTe$SVGx%<}{IQ`IT3U7$KzL0;p zN7(&e))(?GcMRushxg9lU+$N6&#d!SLwH^H&pLn1Z?wL% zezT4X{$*`vjhD|o%D&Wq<@zsmUa~JWV0s{i{!3k0uFuMKSi!&4XvwSeEmXhNuHawp z0n2q>@-KIPsR7G%VZp!Dm$^U8*YWk#mj(aI-#7S+`mbDP6#PpKlKZICC8Q|5vWV%K4W&yK?^J?k_c9>c3uub%p<-?8_ZsYQpN< z|D~2J{0~E4mg~-P{awz#)Zc~vE7#@a{7e2P|H}7&c~0(2^W4C4WbClLJ08FTet&YwGbZVxV>OP7Bgg1?h< z?)L9S)5m)}^FM4lg}o<*|6w!!{_hq3hd(#0+yB* z?_!VA{$$MH$NsN9;a~1&X~~~=cZ+??4)j0meYyii{g=JY(0|>#_1yhmH`5!{|M0i+ zFLf88|59HO`Y&}C_Mgl8FLe>I|I7V1_JQ4p)0e)m`*G|OH>6*zZlb*Z>pL_UXS8Eq z7=B~<{x9_yq0PwkU-qx(wf{@~$Kh}<_kXzuEOvak@5|j^?f}#OF!-0d!NUL0{ai9A zHCXlS|8jqqd%xsg4;TE)U0?bf-t}@-a`)F{_?J7uD)BG(hv|P<-~O+%{;Mtgt6#yt z=B57%{*~*1^8HZizjFUWcTZK)f8AW@zw-TGq5qQes9{pe6#j>5o76a|dCK{h>?`<} z`@h`xCHpG#FTW=Laz~eZN)47;tl0l`H8q#|EHzvC{x7v(@-H=BYQ4h$Q0-S6KGcMT z{!6yzd$?cB*N~-!|6%MGQ*$Q&TG0Jp>hVIG=U%j2|D_f#{14T})u;bbgEwkiqV9)u;bbKkD8=^{47k zXRR?IsWCmg@IQ?GU+yD}-Gu5|jc@KbG=9my%KN|EcWB&G|Elg+{jWM;W4!!Jy|23; z@529Ze*9~#LjRTPbMyUQ@-MZ&W&Wl9SN`P=NHxLchJ62*`9%$J&cF0Oe2e*teE(OT zf7MsV{x9{{YOmE`=eq3RU+Sdu{a?Yq)JfO3|0~y7tG}MJ(69MduK#krMg4Z|9#8VQ z`fjz|=J;IqozH*fbDs0#U(RRdb*S^1&SqMpTCX~{Y5nTn>$3hU_J3LXx&u3(3tgx1 zKP>CN+$&&xeGYZD`?mF6vHs5I5A!+0T>s@hX7@5XpP0`F=5v7Zuh@|s{LA@4=MIB^ z#g1k7EjxeMyU>5-b(wXY`Y-1konO?$-g(B*e>vyqyrXlE&ObW$8Tzl-ajpK#+SeV} zq5q27*xJ+?P5t>}2etKR=)c@gJq-QVcl;UkU;6*M``R7Y&UiZO>71wguibs^4s3T~ zyBom0*zVT0#(uQWe_2cGqms{;=5=@QFXwPW|K+}M`ws3OcMrMy$lXise6D-J?GLyo zJm+8T1&ND?0u^Lawm-1fUfjK zS3tXa3OiUT7`@hs1MDNw!n=|O{ABi0!!N2rgatDe1xcc;8?g9z_!_a^I z1J9&N`@bsjFZEyUB&l!zm$U5pIGy{)>f~;d`?w2UkLQ!SPxO7V|C#fzq4YRkSaekF z?w1CI|6#8GYC>=FUV4-_(x0>k*>QC|oasaU(q(cw4*$dU_#dkO>Ok-E0s5BC|4)8s zQf&{^9;drr!vC;6z0aNaTGvefb#$TsTK2BF`@h2fF#4wf$!M&)?8{ zcK_Ef{JP!$H5PBO8|e$%AMQ$@SPg_)i23QiUW0$VJpd0C^k4RxL;v+Nz2`S~ou2GR zuT=D=)pp3g)OXB_e}(Qt{g=DH)PTkQubxBz&?bfcOP!PYB{`0IrqF+>b5if5?n(Vq zuK$W1UzPTMg*L3d{a?90OU+ik|4aVm4lwzbS}%289cRy|-TmbbutWJ=eflr8WWQDa z^)oZYo_p{w_p!zPFS%gs|5E>^4$ku!$hn06OTC=BIr&%UzheKF8awrN>c4`2`8?!b zYV%_MmpVW7dvZ+meDW{#ed_$w`{{kC{!iVn`rk_XztjM4g#V%Q5TOkY|3l;Re`|0v z{*~|ll7G4XOa1Tl%+g)7U%ryKe_)a*Ma8x(42o=zt;HL z-Gj9ZzKAjEP2E5EpWOc?|55{-^Dni*YID`-s?W{&S0(+IdmCf_SMaa${xA8LnqalT z=7sY9FLTL)?Eg}K9sEnZbGPo9gZ>X?{g=KF-plo8@Sa|2|Cc@u`X840mp%}=&x8C+?+0rD z{UFNxOMi*bf9WS-eWAC69*DW`g#1hY0euK^{-y6g+5gb{se57d2k@Tg{mcc9F_7G(d|y!e-X2l^i9e-QdF`B!*6oLBfC>H*>X-+CatA%cJD&k*-; zeHipV41b1$xwGrt5dMe3zufVw*Ms~^|8u<`^nh?Du-*{*LWKTHe~AUz|CRf1g#V#_ z8`fXJzj9v=eKD+$^vO7h`bQrO{V;O=rC)}=8KM8ue?uRR+-D>F5B1>4_kYEFqy8S( zQ@`osVLhk6hyI6pe3bcD=)acX&+C5}{44Zde*P^!zbE`_Vf+vECw!m2=#hp0;ilZ7 zj^f{|HfwkI*SZ=1I(HuYt7XQ&7A@(&z#sswJY>r@~`{m!N0DDak+zQ|4je2EBn9RY=r+iU)zH^R&KTP$Agmm z>oz_%fqzY=7S8$CQw9I>YkvMter{xJeF}#5dB(ru_4D_Q^OrxmuTai-4ZP9w-&tQFc!LG$_ zws^k1iPi7&{9^ytA9%hC!8UXLwIk2ny)WT^nDejo=ojgIWe+s=e{E6tABO&`H~KI4 zu-r=@GWS2cgMMZ1f9U>~Qw#nT{)f*0uU&zEeSxk(eZhh7uYvHd*#C7?q5m2H|2mSN z4f$8?{x9@jwfjf-JLG+~;9vIOR!9G3U(WgT-{XI{5&nmd(;u@Brv7U?dcTVl{A(Hb z*J%1>?hTQDje~zVf8Kq$I{laXzwY8*YX5DaV*gk4<<4G#T}_4lYh1SfYgop=zGa>( z_dg8&wQsTi>q7dD!M|evSMaZo;9t(>2mji$(0^T9@;|(h{%PA)=I;OMMt}1M_}9w? z|8mbu+5hl_f`9FR=1Yyi(d?Je|8W1z|8V)5u_^oy-96KSd(Mjm|7tyDuK(el_4psY zNk7=Wu>IjL=o4SuX>8hxKJXp%gD)!h*9Y*g@IPFRKR<@PbNC-NEcSl||GJ~_KWt7v z+TOJLzy6G_Lw(1#_#f^teBS))5Ad%)RN!CZI&rUBK>oEl{Ofw^`+JN1U(GkbmxsT% z+)Dm6WFGwMQ`ndMYoiMM>katY+6Dje^?dy!c>uvbgu`r$^U_RS!F?au0nSb?K0RAPPs>Hw4f0g-{?8}cK+)Y=^_?PS}_?KUk zi!~_muX8j0)vM5#tpsyhxZqzK7W=jO_*Xk-EUqo`PR_sj6Nij1?*G#NaI<3n*W1LE z9f?PBdHq?93&saIdFKlHFXtc3(KSn#jMPnen760@Dj zi2Yy2{y&og-2c`3Eq=zCa|r(B{x4@D%njy+4>SFjIV9izb!oxB{zSfs{a?e1{9C&R zjOS&ZHQ#z42>#{Xuh3;rFZ5q6$djw`{S*7Y%!{%A%Y3Q+Yis65^8H`#{R*F9^KS$A zsroPTvD$2N^Tma~aSy&%XO;L@>;Q|rzdGOZ`X7e>$-VSz!v8S%mwT`)`5(%^@;Ws9 z4|D$IeK6nu6+5nT{$&lE^RMj-{&jA)|LY~{Y57-A_*eKJ%D;BZ_?P~N@~_JZ{g?HZ z{`03-@ITZa-ulSBU+(|X2Sfg4ZFDa+Qt&V9C+7~Wzudt*FaJY#GdIPXUjC)OefS@i z`IjE|@~`keboW>6z?Ofx<2v8}W&P_uY-?k8W6Qtv=)aEoH2e=QF8J5A?Eh+b_Tbu` z)eQ^(L;07xuib%tI5loBYTfWZJdE0R9q#|u#CK5}yBE96zpSOLqhr57?ti!$b+>yL z>^}^m4^e6VmwkvA;a?xazuZsmUhvreW&Q6C1m|Jh3qF(i*xi_u?T=rKzA+2qAG16B zD|V3o1^w4%=)YFY_J3Vk_#d8Hc+jOKK8JhE^*?Nc{_D!j|8NF%$ub51+Olz- z|6%a2!?<7C@3i;13p-%!e=bzo|Me|B%8TG%x&NX2Sz2WL%e^g+W&6Ks3jXz9^g7-1 z;{3n6UpA%(I)%_t}Q8-IwvN*#BjJb;s`2>0Y!1_EGJxx?g4*`@eGjmGA%h>Fc`vUmb3M zcV_;FvHweL#)9}C&dT&(_MdNuf31WD!yP-h|KT%*|DpSM!vFC0f`5&Ne+}iHTWSB7 zeeZ+Nf4Tcd{xz)v|9Um!Un^DMU+(D&|HF4P|HBFRA8rP(l3Tr&@vq;*zgm~{U-GXB zd>jS;im%1~ub-H)5B}xr1^?=d{>%5%|8N@qhpmhKU*Uh~o~a89{uTSbf`7T6YAjqt z|HCZ{{v`*If4LW`3w%UQA}{Gt=)VS2C5H+A)gIm=f7vhNUuu)4Xa0xsFZoR+ z{&fhvNAB~mFF)M>B@fH@fBo2?PX84ig!&Q6zn*6QSL2VX(orS; zH3atMhm32FjDMX6`|_jAzuf<|1p2bG`|)ft{^jfIulRf3FWx)+4}A`?|7&IRU+(`3 z{&hXi!{>4|{*-rR{L6oT@UK3X%;jIrZ>ih;75rc6_+kJ^d)*O+1KDDVH; zwBTQR75ppqf87X^H#W)Thjgvee;o|xAAQ*9q?R@Ie@!6H{{AfZJj{;$s}@Gs-@+r(#Mb_-&6?Ekum*l!N_YT&Q;f9=KR%mH7K6Jr0@ zvxWZa2=YrGW+==h!M|ev*QVqgbB}q)-0KWVzW-}F->c@|eU7fvf6dAGmw8ct;J>4j z9#GHzul3+x7i9at)L!4r{x5TE&cDpP&Cq|fICN~A|dzY6}zchA$#a!II^i=