msingstad commited on
Commit
28d2e45
·
1 Parent(s): 674db91

Added README and model configs

Browse files
README.md CHANGED
@@ -1,3 +1,57 @@
1
  ---
2
  license: apache-2.0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  ---
 
1
  ---
2
  license: apache-2.0
3
+ language:
4
+ - en
5
+
6
+ tags:
7
+ - weather-forecasting
8
+ - weather
9
+ - meteorology
10
+ - ensemble-forecasting
11
+ - probabilistic-forecasting
12
+ - temporal downscaling
13
+ ---
14
+
15
+ # Bris-HourGlass
16
+
17
+ This repository contains the Bris-HourGlass (hourly temporal downscaler) checkpoints with matching training configs.
18
+
19
+ The intended use is training with Anemoi and forecast inference from the published model artifacts.
20
+
21
+ ## Contents
22
+
23
+ - `configs/Bris-HourGlass_o96.yaml`: global o96 pre-training config
24
+ - `configs/Bris-HourGlass_n320.yaml`: global n320 fine-tuning config
25
+ - `configs/Bris-HourGlass_stretched.yaml`: global+regional n320+2.5km stretched grid fine-tuning config
26
+ - `Bris-HourGlass_n320_inference.ckpt`: global n320 inference checkpoint
27
+ - `Bris-HourGlass_n320_training.ckpt`: global n320 training checkpoint (for further fine-tuning)
28
+ - `Bris-HourGlass_stretched_inference.ckpt`: stretched grid inference checkpoint
29
+ - `Bris-HourGlass_stretched_training.ckpt`: stretched grid training checkpoint
30
+
31
+ ## Scope
32
+
33
+ This is an artifact repository. It provides model weights and configs, but not input datasets.
34
+
35
+ The source code used for training is open and available through Anemoi Core: https://github.com/ecmwf/anemoi-core
36
+
37
+ ## Usage
38
+
39
+ Training is performed with the Anemoi codebase.
40
+
41
+ Training and fine-tuning of this model was done on the Anemoi Core branch `ecmwf/anemoi-core/tree/feature/ens_interp`.
42
+
43
+ https://github.com/ecmwf/anemoi-core/tree/feature/ens_interp
44
+
45
+ Porting the checkpoints to a newer version is not supported, but the functionality in that branch is now all on the main Anemoi Core, so for training new models, using main is recommended.
46
+
47
+ ## Notes
48
+
49
+ - `bris-crpsfft_inference.ckpt` is the checkpoint intended for inference.
50
+ - `bris-crpsfft_training.ckpt` is kept as a training artifact.
51
+ - The configs are included to make the artifacts easier to interpret and reuse.
52
+
53
+ ## Citation
54
+
55
+ If you use these artifacts, cite: https://arxiv.org/abs/2607.11457
56
+
57
  ---
configs/Bris-HourGlass_n320.yaml ADDED
@@ -0,0 +1,204 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ defaults:
2
+ - data: zarr
3
+ - dataloader: native_grid
4
+ - diagnostics: evaluation
5
+ - datamodule: ens
6
+ - hardware: slurm
7
+ - graph: n320
8
+ - model: graphtransformer_ens
9
+ - training: ensemble
10
+ - override hydra/hydra_logging: disabled
11
+ - override hydra/job_logging: disabled
12
+ - _self_
13
+
14
+ config_validation: False
15
+
16
+ hydra:
17
+ output_subdir: null
18
+ run:
19
+ dir: .
20
+
21
+ data:
22
+ frequency: 1h
23
+ timestep: 1h
24
+ resolution: n320
25
+ forcing:
26
+ - lsm
27
+ - cos_julian_day
28
+ - cos_local_time
29
+ - cos_latitude
30
+ - cos_longitude
31
+ - sin_julian_day
32
+ - sin_local_time
33
+ - sin_latitude
34
+ - sin_longitude
35
+ - insolation
36
+ - z
37
+ diagnostic:
38
+ - tp
39
+ - ssrd
40
+ - strd
41
+ normalizer:
42
+ none:
43
+ - lsm
44
+ - cos_julian_day
45
+ - cos_local_time
46
+ - cos_latitude
47
+ - cos_longitude
48
+ - sin_julian_day
49
+ - sin_local_time
50
+ - sin_latitude
51
+ - sin_longitude
52
+ - insolation
53
+ - lcc
54
+ - mcc
55
+ - hcc
56
+ - tcc
57
+ max:
58
+ - z
59
+
60
+ dataloader:
61
+ dataset:
62
+ dataset: ${hardware.paths.data}/${hardware.files.dataset}
63
+ select: ['10u', '10v', '2d', '2t', 'cos_julian_day', 'cos_latitude', 'cos_local_time', 'cos_longitude', 'hcc', 'insolation', 'lcc', 'lsm', 'mcc', 'msl', 'q_100', 'q_1000', 'q_150', 'q_200', 'q_250', 'q_300', 'q_400', 'q_50', 'q_500', 'q_700', 'q_850', 'q_925', 'sin_julian_day', 'sin_latitude', 'sin_local_time', 'sin_longitude', 'skt', 'sp', 'ssrd', 'strd', 't_100', 't_1000', 't_150', 't_200', 't_250', 't_300', 't_400', 't_50', 't_500', 't_700', 't_850', 't_925', 'tcc', 'tcw', 'tp', 'u_100', 'u_1000', 'u_150', 'u_200', 'u_250', 'u_300', 'u_400', 'u_50', 'u_500', 'u_700', 'u_850', 'u_925', 'v_100', 'v_1000', 'v_150', 'v_200', 'v_250', 'v_300', 'v_400', 'v_50', 'v_500', 'v_700', 'v_850', 'v_925', 'w_100', 'w_1000', 'w_150', 'w_200', 'w_250', 'w_300', 'w_400', 'w_50', 'w_500', 'w_700', 'w_850', 'w_925', 'z', 'z_100', 'z_1000', 'z_150', 'z_200', 'z_250', 'z_300', 'z_400', 'z_50', 'z_500', 'z_700', 'z_850', 'z_925']
64
+ reorder: sort
65
+
66
+ num_workers:
67
+ training: 8 #4
68
+ validation: 4
69
+ test: 4
70
+ batch_size:
71
+ training: 1
72
+ validation: 1
73
+ test: 1
74
+ limit_batches:
75
+ training: 500
76
+ validation: 20
77
+ training:
78
+ start: 2016-01-01
79
+ end: 2023-12-31
80
+ validation:
81
+ start: 2024-01-01
82
+ end: 2024-12-31
83
+ test:
84
+ start: 2024-01-01
85
+ end: 2024-12-31
86
+
87
+ prefetch_factor: 2
88
+ validation_rollout: 1
89
+
90
+ model_run_info: #Add for non-analysis training
91
+ start: 2016-01-01T00:00:00
92
+ length: 18 #in number of dates (* frequency for actual time)
93
+
94
+ diagnostics:
95
+ plot:
96
+ callbacks: []
97
+ log:
98
+ interval: 100
99
+ wandb:
100
+ entity: null
101
+ mlflow:
102
+ enabled: True
103
+ offline: True
104
+ authentication: True
105
+ experiment_name: ensemble-interpolator
106
+ tracking_uri: https://mlflow.ecmwf.int
107
+ run_name: n320_ifs
108
+ system: True
109
+ checkpoint:
110
+ every_n_minutes:
111
+ save_frequency: null #30
112
+ num_models_saved: 1
113
+ every_n_epochs:
114
+ save_frequency: 1
115
+ num_models_saved: 2
116
+ every_n_train_steps:
117
+ save_frequency: 5000
118
+ num_models_saved: -1
119
+
120
+ hardware:
121
+ paths:
122
+ data: DATA_PATH/
123
+ output: OUTPUT_PATH/
124
+ graph: GRAPH_PATH/
125
+ warm_start: null
126
+ files:
127
+ graph: n320.pt
128
+ dataset: aifs-od-fc-oper-0001-mars-n320-2016-2024-1h-v1.zarr
129
+ warm_start: null
130
+ num_gpus_per_ensemble: 8
131
+ num_gpus_per_model: 4
132
+
133
+ model:
134
+ num_channels: 1024
135
+ keep_batch_sharded: False
136
+ bounding:
137
+ - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity)
138
+ variables:
139
+ - tp
140
+ - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val]
141
+ variables:
142
+ - tcc
143
+ - hcc
144
+ - mcc
145
+ - lcc
146
+ min_val: 0
147
+ max_val: 1
148
+ trainable_parameters:
149
+ data: 0
150
+ hidden: 0
151
+ data2hidden: 0
152
+ hidden2data: 0
153
+ hidden2hidden: 0
154
+ processor:
155
+ num_chunks: 8
156
+ num_layers: 16
157
+ encoder:
158
+ num_chunks: 8
159
+ decoder:
160
+ num_chunks: 8
161
+
162
+ model:
163
+ _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti
164
+ latent_skip: True
165
+ grid_skip: 1
166
+
167
+ graph:
168
+ overwrite: False
169
+
170
+ training:
171
+ model_task: anemoi.training.train.tasks.GraphEnsInterpMulti
172
+
173
+ explicit_times:
174
+ input: [0,6]
175
+ target: [1,2,3,4,5,6]
176
+
177
+ ensemble_size_per_device: 1
178
+ max_epochs: null
179
+ max_steps: 50000
180
+ fork_run_id: o96_id
181
+ load_weights_only: True
182
+ transfer_learning: True
183
+ lr:
184
+ rate: 3.0e-5
185
+ min: 3e-7
186
+ warmup: 1000
187
+ training_loss:
188
+ _target_: anemoi.training.losses.AlmostFairKernelCRPS
189
+ alpha: 0.95
190
+ scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights']
191
+ ignore_nans: False
192
+
193
+ aggregate_outputs:
194
+ - mean
195
+ - max
196
+ - min
197
+ - diff
198
+
199
+ rollout:
200
+ start: 1
201
+ epoch_increment: 0
202
+ max: 1
203
+
204
+
configs/Bris-HourGlass_o96.yaml ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ defaults:
2
+ - data: zarr
3
+ - dataloader: native_grid
4
+ - diagnostics: evaluation
5
+ - datamodule: ens
6
+ - hardware: slurm
7
+ - graph: o96
8
+ - model: graphtransformer_ens
9
+ - training: ensemble
10
+ - override hydra/hydra_logging: disabled
11
+ - override hydra/job_logging: disabled
12
+ - _self_
13
+
14
+ config_validation: False
15
+
16
+ hydra:
17
+ output_subdir: null
18
+ run:
19
+ dir: .
20
+
21
+ data:
22
+ frequency: 1h
23
+ timestep: 1h
24
+ resolution: o96
25
+ forcing:
26
+ - lsm
27
+ - cos_julian_day
28
+ - cos_local_time
29
+ - cos_latitude
30
+ - cos_longitude
31
+ - sin_julian_day
32
+ - sin_local_time
33
+ - sin_latitude
34
+ - sin_longitude
35
+ - insolation
36
+ - z
37
+ diagnostic:
38
+ - tp
39
+ - ssrd
40
+ - strd
41
+ normalizer:
42
+ none:
43
+ - lsm
44
+ - cos_julian_day
45
+ - cos_local_time
46
+ - cos_latitude
47
+ - cos_longitude
48
+ - sin_julian_day
49
+ - sin_local_time
50
+ - sin_latitude
51
+ - sin_longitude
52
+ - insolation
53
+ - lcc
54
+ - mcc
55
+ - hcc
56
+ - tcc
57
+ max:
58
+ - z
59
+
60
+ dataloader:
61
+ dataset:
62
+ dataset: ${hardware.paths.data}/${hardware.files.dataset}
63
+ select: ['10u', '10v', '2d', '2t', 'cos_julian_day', 'cos_latitude', 'cos_local_time', 'cos_longitude', 'hcc', 'insolation', 'lcc', 'lsm', 'mcc', 'msl', 'q_100', 'q_1000', 'q_150', 'q_200', 'q_250', 'q_300', 'q_400', 'q_50', 'q_500', 'q_700', 'q_850', 'q_925', 'sin_julian_day', 'sin_latitude', 'sin_local_time', 'sin_longitude', 'skt', 'sp', 'ssrd', 'strd', 't_100', 't_1000', 't_150', 't_200', 't_250', 't_300', 't_400', 't_50', 't_500', 't_700', 't_850', 't_925', 'tcc', 'tcw', 'tp', 'u_100', 'u_1000', 'u_150', 'u_200', 'u_250', 'u_300', 'u_400', 'u_50', 'u_500', 'u_700', 'u_850', 'u_925', 'v_100', 'v_1000', 'v_150', 'v_200', 'v_250', 'v_300', 'v_400', 'v_50', 'v_500', 'v_700', 'v_850', 'v_925', 'w_100', 'w_1000', 'w_150', 'w_200', 'w_250', 'w_300', 'w_400', 'w_50', 'w_500', 'w_700', 'w_850', 'w_925', 'z', 'z_100', 'z_1000', 'z_150', 'z_200', 'z_250', 'z_300', 'z_400', 'z_50', 'z_500', 'z_700', 'z_850', 'z_925']
64
+ reorder: sort
65
+
66
+ num_workers:
67
+ training: 8
68
+ validation: 8
69
+ test: 4
70
+ batch_size:
71
+ training: 1
72
+ validation: 1
73
+ test: 1
74
+ limit_batches:
75
+ training: null
76
+ validation: null
77
+ training:
78
+ start: 2016-01-01
79
+ end: 2023-12-31
80
+ validation:
81
+ start: 2024-01-01
82
+ end: 2024-12-31
83
+ test:
84
+ start: 2024-01-01
85
+ end: 2024-12-31
86
+
87
+ prefetch_factor: 2
88
+ validation_rollout: 1
89
+
90
+ model_run_info: #Add for non-analysis training
91
+ start: 2016-01-01T00:00:00
92
+ length: 18 #in number of dates (* frequency for actual time)
93
+
94
+ diagnostics:
95
+ plot:
96
+ callbacks: []
97
+ log:
98
+ interval: 100
99
+ wandb:
100
+ entity: null
101
+ mlflow:
102
+ enabled: True
103
+ offline: True
104
+ authentication: True
105
+ experiment_name: ensemble-interpolator
106
+ tracking_uri: https://mlflow.ecmwf.int
107
+ run_name: o96_ifs
108
+ system: True
109
+ checkpoint:
110
+ every_n_minutes:
111
+ save_frequency: null
112
+ num_models_saved: 1
113
+ every_n_epochs:
114
+ save_frequency: 1
115
+ num_models_saved: 2
116
+ every_n_train_steps:
117
+ save_frequency: 50000
118
+ num_models_saved: -1
119
+
120
+ hardware:
121
+ paths:
122
+ data: DATA_PATH/
123
+ output: OUTPUT_PATH/
124
+ graph: GRAPH_PATH/
125
+ warm_start: null
126
+ files:
127
+ graph: o96.pt
128
+ dataset: aifs-od-fc-oper-0001-mars-o96-2016-2024-1h-v1.zarr
129
+ warm_start: null
130
+ num_gpus_per_ensemble: 2
131
+ num_gpus_per_model: 1
132
+
133
+ model:
134
+ num_channels: 1024
135
+ keep_batch_sharded: False
136
+ bounding:
137
+ - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity)
138
+ variables:
139
+ - tp
140
+ - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val]
141
+ variables:
142
+ - tcc
143
+ - hcc
144
+ - mcc
145
+ - lcc
146
+ min_val: 0
147
+ max_val: 1
148
+ trainable_parameters:
149
+ data: 0
150
+ hidden: 0
151
+ data2hidden: 0
152
+ hidden2data: 0
153
+ hidden2hidden: 0
154
+ processor:
155
+ num_chunks: 2
156
+ encoder:
157
+ num_chunks: 2
158
+ decoder:
159
+ num_chunks: 2
160
+
161
+ model:
162
+ _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti
163
+ latent_skip: True
164
+ grid_skip: 1 # Which of the input indices to use as residual connection, null if none.
165
+
166
+ graph:
167
+ overwrite: False
168
+
169
+ training:
170
+ model_task: anemoi.training.train.tasks.GraphEnsInterpMulti
171
+
172
+ explicit_times:
173
+ input: [0,6]
174
+ target: [1,2,3,4,5,6]
175
+
176
+ ensemble_size_per_device: 1
177
+ max_epochs: null
178
+ max_steps: 200000
179
+ run_id: null
180
+ lr:
181
+ rate: 1.0e-4
182
+ min: 3e-7
183
+ warmup: 1000
184
+ training_loss:
185
+ _target_: anemoi.training.losses.AlmostFairKernelCRPS
186
+ alpha: 0.95
187
+ scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights']
188
+ ignore_nans: False
189
+
190
+ aggregate_outputs:
191
+ - diff
192
+
193
+
194
+ rollout:
195
+ start: 1
196
+ epoch_increment: 0
197
+ max: 1
198
+
199
+
configs/Bris-HourGlass_stretched.yaml ADDED
@@ -0,0 +1,254 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ defaults:
4
+ - data: zarr
5
+ - dataloader: native_grid
6
+ - diagnostics: evaluation
7
+ - datamodule: ens
8
+ - hardware: slurm
9
+ - graph: n320_2.5k
10
+ - model: graphtransformer_ens
11
+ - training: ensemble
12
+ - override hydra/hydra_logging: disabled
13
+ - override hydra/job_logging: disabled
14
+ - _self_
15
+
16
+ config_validation: False
17
+
18
+ hydra:
19
+ output_subdir: null
20
+ run:
21
+ dir: .
22
+
23
+ data:
24
+ frequency: 1h
25
+ timestep: 1h
26
+ resolution: N320
27
+ forcing:
28
+ - lsm
29
+ - cos_julian_day
30
+ - cos_local_time
31
+ - cos_latitude
32
+ - cos_longitude
33
+ - sin_julian_day
34
+ - sin_local_time
35
+ - sin_latitude
36
+ - sin_longitude
37
+ - insolation
38
+ - z
39
+ diagnostic:
40
+ - tp
41
+ - ssrd
42
+ - strd
43
+ normalizer:
44
+ none:
45
+ - lsm
46
+ - cos_julian_day
47
+ - cos_local_time
48
+ - cos_latitude
49
+ - cos_longitude
50
+ - sin_julian_day
51
+ - sin_local_time
52
+ - sin_latitude
53
+ - sin_longitude
54
+ - insolation
55
+ - lcc
56
+ - mcc
57
+ - hcc
58
+ - tcc
59
+ max:
60
+ - z
61
+
62
+ dataloader:
63
+ dataset:
64
+ dataset:
65
+ cutout:
66
+ - dataset: /leonardo_work/AIFAC_5C0_154/weathergen/data/meps-2p5km-2020-2025-1h-v2.zarr
67
+ trim_edge: 50
68
+ reorder: sort
69
+ - dataset: ${hardware.paths.data}/${hardware.files.dataset}
70
+ reorder: sort
71
+ min_distance_km: 0
72
+ adjust: all
73
+ select: ['10u', '10v', '2d', '2t', 'cos_julian_day', 'cos_latitude', 'cos_local_time', 'cos_longitude', 'hcc', 'insolation', 'lcc', 'lsm', 'mcc', 'msl', 'q_100', 'q_1000', 'q_150', 'q_200', 'q_250', 'q_300', 'q_400', 'q_50', 'q_500', 'q_700', 'q_850', 'q_925', 'sin_julian_day', 'sin_latitude', 'sin_local_time', 'sin_longitude', 'skt', 'sp', 'ssrd', 'strd', 't_100', 't_1000', 't_150', 't_200', 't_250', 't_300', 't_400', 't_50', 't_500', 't_700', 't_850', 't_925', 'tcc', 'tcw', 'tp', 'u_100', 'u_1000', 'u_150', 'u_200', 'u_250', 'u_300', 'u_400', 'u_50', 'u_500', 'u_700', 'u_850', 'u_925', 'v_100', 'v_1000', 'v_150', 'v_200', 'v_250', 'v_300', 'v_400', 'v_50', 'v_500', 'v_700', 'v_850', 'v_925', 'w_100', 'w_1000', 'w_150', 'w_200', 'w_250', 'w_300', 'w_400', 'w_50', 'w_500', 'w_700', 'w_850', 'w_925', 'z', 'z_100', 'z_1000', 'z_150', 'z_200', 'z_250', 'z_300', 'z_400', 'z_50', 'z_500', 'z_700', 'z_850', 'z_925']
74
+ reorder: sort
75
+
76
+ num_workers:
77
+ training: 4
78
+ validation: 4
79
+ test: 4
80
+ batch_size:
81
+ training: 1
82
+ validation: 1
83
+ test: 1
84
+ limit_batches:
85
+ training: null
86
+ validation: 10
87
+ training:
88
+ start: 2020-02-06
89
+ end: 2023-12-31
90
+ validation:
91
+ start: 2024-01-01
92
+ end: 2024-12-31
93
+ test:
94
+ start: 2024-01-01
95
+ end: 2024-12-31
96
+
97
+ prefetch_factor: 2
98
+ validation_rollout: 1
99
+
100
+ model_run_info: #Add for non-analysis training
101
+ start: 2020-02-06T00:00:00
102
+ length: 18 #in number of dates (* frequency for actual time)
103
+
104
+ diagnostics:
105
+ plot:
106
+ callbacks: []
107
+ log:
108
+ interval: 100
109
+ wandb:
110
+ entity: null
111
+ mlflow:
112
+ enabled: True
113
+ offline: True
114
+ authentication: True
115
+ experiment_name: ensemble-interpolator
116
+ tracking_uri: https://mlflow.ecmwf.int
117
+ run_name: n320_2.5k
118
+ system: True
119
+ checkpoint:
120
+ every_n_minutes:
121
+ save_frequency: null
122
+ num_models_saved: 1
123
+ every_n_epochs:
124
+ save_frequency: 1
125
+ num_models_saved: -1
126
+ every_n_train_steps:
127
+ save_frequency: 500
128
+ num_models_saved: 2
129
+
130
+ hardware:
131
+ paths:
132
+ data: /leonardo_work/DestE_340_26/ai-ml/datasets/
133
+ output: /leonardo_work/EUHPC_R06_263/mingstad/experiments/ensinterp/
134
+ graph: /leonardo_scratch/fast/EUHPC_R04_079/mingstad/graphs/
135
+ warm_start: null
136
+ files:
137
+ graph: n320_2p5k_7p10.pt
138
+ dataset: aifs-od-fc-oper-0001-mars-n320-2016-2024-1h-v1.zarr
139
+ warm_start: null
140
+ num_gpus_per_ensemble: 8
141
+ num_gpus_per_model: 4
142
+
143
+ model:
144
+ num_channels: 1024
145
+ keep_batch_sharded: False
146
+ bounding:
147
+ - _target_: anemoi.models.layers.bounding.ReluBounding #[0, infinity)
148
+ variables:
149
+ - tp
150
+ - _target_: anemoi.models.layers.bounding.HardtanhBounding #[min_val, max_val]
151
+ variables:
152
+ - tcc
153
+ - hcc
154
+ - mcc
155
+ - lcc
156
+ min_val: 0
157
+ max_val: 1
158
+ trainable_parameters:
159
+ data: 0
160
+ hidden: 0
161
+ data2hidden: 0
162
+ hidden2data: 0
163
+ hidden2hidden: 0
164
+ processor:
165
+ num_chunks: 8
166
+ num_layers: 16
167
+ encoder:
168
+ num_chunks: 8
169
+ decoder:
170
+ num_chunks: 8
171
+
172
+ model:
173
+ _target_: anemoi.models.models.AnemoiModelEncProcDecEnsInterpMulti
174
+ latent_skip: True
175
+ grid_skip: 1 # Which of the input indices to use as residual connection, null if none.
176
+
177
+ graph:
178
+ overwrite: False
179
+
180
+ training:
181
+ model_task: anemoi.training.train.tasks.GraphEnsInterpMulti
182
+
183
+ explicit_times:
184
+ input: [0,6]
185
+ target: [1,2,3,4,5,6]
186
+
187
+ ensemble_size_per_device: 1
188
+ max_epochs: null
189
+ max_steps: 50000
190
+ fork_run_id: n320_id
191
+ load_weights_only: True
192
+ transfer_learning: True
193
+
194
+ lr:
195
+ rate: 3.0e-5
196
+ min: 3e-7
197
+ warmup: 1000
198
+
199
+ training_loss:
200
+ _target_: anemoi.training.losses.CombinedLoss
201
+ losses:
202
+ - _target_: anemoi.training.losses.AlmostFairKernelCRPSLooped
203
+ alpha: 0.95
204
+ scalers: ['pressure_level', 'general_variable', 'nan_mask_weights', 'node_weights']
205
+ ignore_nans: False
206
+ - _target_: anemoi.training.losses.CRPSFFTLossLoopedLPF
207
+ alpha: 0.95
208
+ cutoff_ratio: 1.0
209
+ no_kweight: True
210
+ fft: True
211
+ xdim: 849
212
+ ydim: 969
213
+ scalers: ['pressure_level', 'general_variable', 'nan_mask_weights']
214
+ ignore_nans: False
215
+ scalers: ['*']
216
+ loss_weights: [1.0, 0.15]
217
+ validation_metrics:
218
+ fkcrps:
219
+ _target_: anemoi.training.losses.kcrps_looped.AlmostFairKernelCRPSLooped
220
+ scalers: ['node_weights']
221
+ ignore_nans: True
222
+ fkcrps_inside_lam:
223
+ _target_: anemoi.training.losses.kcrps_looped.AlmostFairKernelCRPSLooped
224
+ scalers: ['lam_node_weights']
225
+ ignore_nans: True
226
+ fftcrps:
227
+ _target_: anemoi.training.losses.CRPSFFTLossLoopedLPF
228
+ scalers: []
229
+ ignore_nans: True
230
+ cutoff_ratio: 1.0
231
+ no_kweight: True
232
+ fft: True
233
+ xdim: 849
234
+ ydim: 969
235
+ alpha: 0.95
236
+
237
+ rollout:
238
+ start: 1
239
+ epoch_increment: 0
240
+ max: 1
241
+
242
+ aggregate_outputs:
243
+ - mean
244
+ - max
245
+ - min
246
+ - diff
247
+
248
+ scalers: stretched
249
+
250
+ scalers:
251
+ node_weights:
252
+ weight_frac_of_total: 0.5
253
+
254
+