Update cbottle-3d checkpoints to EMA weights

#4
by pmanshausen - opened
.gitattributes CHANGED
@@ -38,3 +38,8 @@ cBottle-3d/training-state-000512000.checkpoint filter=lfs diff=lfs merge=lfs -te
38
  cBottle-3d/training-state-002048000.checkpoint filter=lfs diff=lfs merge=lfs -text
39
  cBottle-3d/training-state-009856000.checkpoint filter=lfs diff=lfs merge=lfs -text
40
  cBottle-3d-tc/training-state-002176000.checkpoint filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
38
  cBottle-3d/training-state-002048000.checkpoint filter=lfs diff=lfs merge=lfs -text
39
  cBottle-3d/training-state-009856000.checkpoint filter=lfs diff=lfs merge=lfs -text
40
  cBottle-3d-tc/training-state-002176000.checkpoint filter=lfs diff=lfs merge=lfs -text
41
+ cBottle-3d-tc-ema/ema-checkpoint-002176000.checkpoint filter=lfs diff=lfs merge=lfs -text
42
+ cBottle-3d-ema/ema-checkpoint-000512000.checkpoint filter=lfs diff=lfs merge=lfs -text
43
+ cBottle-3d-ema/ema-checkpoint-002048000.checkpoint filter=lfs diff=lfs merge=lfs -text
44
+ cBottle-3d-ema/ema-checkpoint-009856000.checkpoint filter=lfs diff=lfs merge=lfs -text
45
+ ema_gate_assets/*.png filter=lfs diff=lfs merge=lfs -text
EMA_WEIGHTS.md ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # EMA checkpoints (`cBottle-3d-ema/`, `cBottle-3d-tc-ema/`)
2
+
3
+ Exponential-moving-average (EMA) checkpoints for the `cbottle-3d-moe` denoiser
4
+ and its paired `cbottle-3d-moe-tc` tropical-cyclone classifier, released to
5
+ reproduce the results in **"Towards accurate extreme event likelihoods from
6
+ diffusion model climate emulators"** (egusphere-2026-2610). These are the
7
+ weights used for every figure and number in the revised manuscript; the
8
+ originally submitted version used the raw (non-EMA) optimizer weights in
9
+ `cBottle-3d/` and `cBottle-3d-tc/` instead.
10
+
11
+ Inference code is public at [NVlabs/cBottle](https://github.com/NVlabs/cBottle)
12
+ (`scripts/inference_coarse.py` for AMIP-style sampling,
13
+ `scripts/inference_odds_ratio.py` for the guided-sampling / importance-sampling
14
+ pipeline used in the likelihood paper).
15
+
16
+ ## Contents
17
+
18
+ - `cBottle-3d-ema/ema-checkpoint-000512000.checkpoint` — MoE expert A (σ ≥ 100 active range), 512k images seen
19
+ - `cBottle-3d-ema/ema-checkpoint-002048000.checkpoint` — MoE expert B (10 ≤ σ < 100), 2048k images seen
20
+ - `cBottle-3d-ema/ema-checkpoint-009856000.checkpoint` — MoE expert C (σ < 10), 9856k images seen
21
+ - `cBottle-3d-tc-ema/ema-checkpoint-002176000.checkpoint` — paired TC classifier, 2176k images seen
22
+
23
+ Same training run and same image counts (`nimg`) as `cBottle-3d/` and
24
+ `cBottle-3d-tc/` — these are an EMA-averaged view of the identical training
25
+ run, not a separately trained model. Do not mix these EMA weights with the
26
+ classifier from the raw-weight run, or vice versa: the likelihood-paper
27
+ reproduction used the EMA classifier throughout, paired only with the EMA MoE
28
+ denoiser.
29
+
30
+ ## Why EMA weights
31
+
32
+ The manuscript's original submission used `net_state.pth` from the raw
33
+ training-state checkpoints (the optimizer's live weights, i.e. what's in
34
+ `cBottle-3d/` and `cBottle-3d-tc/`). A later evaluation found the EMA weights
35
+ close part of the gap between cBottle's tropical-cyclone climatology and
36
+ ERA5's, at no cost elsewhere. We gated the switch by re-running the original
37
+ [cBottle paper](https://github.com/NVlabs/cBottle)'s own AMIP evaluation suite
38
+ (spectra, seasonal cycle, precipitation PDF, variance maps, global-mean
39
+ biases, Arctic Oscillation, ENSO teleconnection, TC frequency) comparing raw
40
+ vs. EMA weights against ERA5. All figured evidence below is from that gate;
41
+ diagnostics we evaluated but aren't shown as figures here are called out
42
+ explicitly rather than asserted without a plot.
43
+
44
+ ### Validation loss / log-probability
45
+
46
+ 80 held-out samples per checkpoint — EMA is equal to or better than the raw
47
+ weights at all three checkpoint steps, with the largest gain at the
48
+ least-trained checkpoint (512k):
49
+
50
+ ![EMA vs raw net, validation loss and log-prob](ema_gate_assets/ema_vs_raw_aggregate.png)
51
+
52
+ Breaking this down by noise level confirms EMA is not worse anywhere, and is
53
+ consistently at least as good within each expert's own MoE-active σ range
54
+ (shaded):
55
+
56
+ ![Denoising loss by noise level, raw vs EMA](ema_gate_assets/ema_vs_raw_by_sigma.png)
57
+
58
+ ### Tropical cyclone frequency
59
+
60
+ AMIP inference, 1980–2000, TempestExtremes detections, same pipeline as the
61
+ original cBottle paper — EMA closes roughly half the gap to ERA5 without any
62
+ guidance or classifier involved:
63
+
64
+ | | detections/year | ρ̄ (detections vs. ERA5 ratio) |
65
+ |---|---|---|
66
+ | ERA5 (truth) | 1007 | 1.3 |
67
+ | cBottle raw MoE | 707 | 0.95 |
68
+ | cBottle EMA MoE | **873** | **1.2** |
69
+
70
+ ![TC detection density, ERA5 vs raw vs EMA](ema_gate_assets/TC_frequency_heatmap.png)
71
+
72
+ ### Global-mean biases
73
+
74
+ This is the most notable improvement outside of TC frequency. Global-mean,
75
+ deseasonalized anomaly time series (1980–2000, shading = ensemble spread)
76
+ against ERA5 (black):
77
+
78
+ **Precipitation** — the raw-weight model has a persistent **~+0.3 mm/d global
79
+ bias** relative to ERA5 that does not appear in the EMA weights, which track
80
+ ERA5's inter-annual variability directly instead of just running parallel to
81
+ it offset upward:
82
+
83
+ | raw weights | EMA weights |
84
+ |---|---|
85
+ | ![Global-mean precip anomaly, raw](ema_gate_assets/global_mean_pr_net.png) | ![Global-mean precip anomaly, EMA](ema_gate_assets/global_mean_pr_ema.png) |
86
+
87
+ **Z500** — similarly, the raw-weight model runs persistently above ERA5 for
88
+ most of the 1980s and misses the 1984–85 dip entirely; the EMA weights track
89
+ ERA5 much more closely throughout, including that dip:
90
+
91
+ | raw weights | EMA weights |
92
+ |---|---|
93
+ | ![Global-mean Z500 anomaly, raw](ema_gate_assets/global_mean_Z500_net.png) | ![Global-mean Z500 anomaly, EMA](ema_gate_assets/global_mean_Z500_ema.png) |
94
+
95
+ **2 m temperature** — both track ERA5's inter-annual variability similarly
96
+ well; no meaningful difference between raw and EMA here:
97
+
98
+ | raw weights | EMA weights |
99
+ |---|---|
100
+ | ![Global-mean tas anomaly, raw](ema_gate_assets/global_mean_tas_net.png) | ![Global-mean tas anomaly, EMA](ema_gate_assets/global_mean_tas_ema.png) |
101
+
102
+ ### Modes of variability (no regression)
103
+
104
+ **Arctic Oscillation** — daily AO index against ERA5, train-period CRPS is
105
+ identical (5.0) for both raw and EMA weights; switching to EMA does not
106
+ change AO skill:
107
+
108
+ | raw weights | EMA weights |
109
+ |---|---|
110
+ | ![AO index, raw](ema_gate_assets/ao_index_net.png) | ![AO index, EMA](ema_gate_assets/ao_index_ema.png) |
111
+
112
+ **ENSO precipitation teleconnection** — regression of precipitation anomaly
113
+ onto the ENSO index, against ERA5 (a); raw (b, left) and EMA (b, right) both
114
+ reproduce the tropical Pacific dipole pattern with no visible difference
115
+ between them:
116
+
117
+ | raw weights | EMA weights |
118
+ |---|---|
119
+ | ![ENSO precip teleconnection, raw](ema_gate_assets/enso_pr_net.png) | ![ENSO precip teleconnection, EMA](ema_gate_assets/enso_pr_ema.png) |
120
+
121
+ ### Precipitation PDF and variance maps
122
+
123
+ Effectively unchanged, and if anything marginally closer to ERA5 truth for
124
+ precipitation and near-surface temperature RMS:
125
+
126
+ ![Precipitation PDF, ERA5 truth vs raw-gen vs EMA-gen](ema_gate_assets/precip_pdf.png)
127
+
128
+ ![Global variance maps: Z500, precipitation, 2m temperature](ema_gate_assets/total_variance_maps.png)
129
+
130
+ ### Power spectra
131
+
132
+ Spherical-harmonic power spectra against ERA5 truth (black) for Z500, pr,
133
+ T850, tcwv, tas, and uas, raw weights (dashed) and EMA weights (teal) overlaid
134
+ directly. The two are visually indistinguishable across the full wavenumber
135
+ range for all six variables — EMA does not shift spectral content at any
136
+ scale:
137
+
138
+ ![Power spectra, ERA5 truth vs raw-gen vs EMA-gen, six variables](ema_gate_assets/spectra.png)
139
+
140
+ ### Seasonal cycle
141
+
142
+ DJF-minus-JJA seasonal contrast maps for Z500, precipitation, 2 m temperature,
143
+ and sea-ice concentration — truth (top row), raw weights (middle row), EMA
144
+ weights (bottom row). All three rows are qualitatively very similar,
145
+ including the Southern Ocean sea-ice edge and the Southern Hemisphere storm
146
+ track pattern in panel (d)/(h)/(l):
147
+
148
+ ![Seasonal cycle (DJF-JJA), ERA5 truth vs raw-gen vs EMA-gen](ema_gate_assets/seasonal_cycle.png)
149
+
150
+ **Conclusion:** EMA weights are climatologically as good as or better than
151
+ the raw weights on every metric checked, with clear improvements in TC
152
+ frequency and in the global-mean precipitation and Z500 biases, and no
153
+ regression in validation loss, power spectra, seasonal cycle, precipitation
154
+ PDF, variance maps, Arctic Oscillation skill, or ENSO teleconnection. This is
155
+ why the revision uses EMA weights throughout.
156
+
157
+ ## Usage
158
+
159
+ Unconditional / AMIP-forced sampling (reproduces the climatology plots above):
160
+
161
+ ```bash
162
+ python3 scripts/inference_coarse.py \
163
+ --dataset amip --sample.mode sample --sample.sigma_max 200 \
164
+ --sample.sampler all --sample.batch_gpu 8 --sample.bf16 \
165
+ --end_time 2017-12-31 \
166
+ cBottle-3d-ema/ema-checkpoint-000512000.checkpoint,cBottle-3d-ema/ema-checkpoint-002048000.checkpoint,cBottle-3d-ema/ema-checkpoint-009856000.checkpoint \
167
+ <output_dir>
168
+ ```
169
+
170
+ Guided sampling / odds-ratio calculation for the TC likelihood paper (uses the
171
+ classifier checkpoint too):
172
+
173
+ ```bash
174
+ python3 scripts/inference_odds_ratio.py \
175
+ --moe cBottle-3d-ema/ema-checkpoint-000512000.checkpoint,cBottle-3d-ema/ema-checkpoint-002048000.checkpoint,cBottle-3d-ema/ema-checkpoint-009856000.checkpoint \
176
+ --classifier cBottle-3d-tc-ema/ema-checkpoint-002176000.checkpoint \
177
+ ... # see scripts/inference_odds_ratio.py --help for the full sampler/guidance CLI
178
+ ```
179
+
180
+ ## Provenance
181
+
182
+ - Converted from EMA network snapshots (`network-snapshot-*.pkl`) to
183
+ inference-ready checkpoints via
184
+ `scripts/cmip_eval_scripts/convert_ema_snapshot_to_checkpoint.py` in the
185
+ cBottle training repo.
186
+ - Denoiser: three-expert mixture (`SongUNet`, HEALPix HPX64), each expert
187
+ responsible for a disjoint noise-level range (σ<10, 10≤σ<100, σ≥100).
188
+ - Classifier: `cBottle-3d-tc`, a `SongUNet` with an HPX3-resolution
189
+ classification head, trained jointly with a denoising objective, binary
190
+ cross-entropy term (weight 0.1) on IBTrACS-derived tropical-cyclone labels.
191
+
192
+ ## License
193
+
194
+ Same terms as the rest of this repository: the
195
+ [NVIDIA Software and Model Evaluation License Agreement](https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-software-and-model-evaluation-license/).
196
+
197
+ ## Citation
198
+
199
+ ```bibtex
200
+ @article{manshausen2026towards,
201
+ title={Towards accurate extreme event likelihoods from diffusion model climate emulators},
202
+ author={Manshausen, Peter and Brenowitz, Noah and Berner, Julius and Kashinath, Karthik and Pritchard, Mike},
203
+ journal={arXiv preprint arXiv:2605.03802},
204
+ year={2026}
205
+ }
206
+ ```
207
+
208
+ This is the arXiv preprint; update to the camera-ready EGUsphere/journal citation once egusphere-2026-2610 is formally published.
cBottle-3d-ema/README.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ cBottle-3d EMA checkpoints
2
+
3
+ Exponential-moving-average (EMA) weights for the same three-expert MoE denoiser
4
+ and training run as `cBottle-3d/`, at matching image counts (512k / 2048k / 9856k).
5
+ These are EMA-averaged views of the identical training run, not a separately
6
+ trained model.
7
+
8
+ See [`../EMA_WEIGHTS.md`](../EMA_WEIGHTS.md) for why these are released
9
+ alongside the raw weights, and the climatology evaluation used to validate them.
10
+
11
+ Training performed by Peter Manshausen and Noah Brenowitz.
cBottle-3d-ema/ema-checkpoint-000512000.checkpoint ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2f094ad198625fec597ddcb8a8444b8ed118e38ab435ad5689da59af86457268
3
+ size 595916400
cBottle-3d-ema/ema-checkpoint-002048000.checkpoint ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:50f69ee240abffaa04fcc83153db091b192748c9489777fdad873362dc3694a9
3
+ size 595916400
cBottle-3d-ema/ema-checkpoint-009856000.checkpoint ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2c1efa81b05e3a69cbece7a1a1e3c578125359744c04d10df44ae9cb87e0a1f4
3
+ size 595916400
cBottle-3d-tc-ema/README.md ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ cBottle-3d-tc EMA checkpoint
2
+
3
+ Exponential-moving-average (EMA) weights for the same TC classifier and
4
+ training run as `cBottle-3d-tc/`, at matching image count (2176k). Pair this
5
+ only with `cBottle-3d-ema/`, not with the raw `cBottle-3d/` weights.
6
+
7
+ See [`../EMA_WEIGHTS.md`](../EMA_WEIGHTS.md) for why these are released
8
+ alongside the raw weights, and the climatology evaluation used to validate them.
9
+
10
+ Training performed by Peter Manshausen.
cBottle-3d-tc-ema/ema-checkpoint-002176000.checkpoint ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9cb1c6a72aa40f3c3535c9497a03f2ce77eff68fbf1c5f8c1cfdda9c5c26b326
3
+ size 595916438
ema_gate_assets/TC_frequency_heatmap.png ADDED

Git LFS Details

  • SHA256: 37724cec9b3545e0d6a10666e0341983b0c254b7834311cb50472392050aa1c8
  • Pointer size: 131 Bytes
  • Size of remote file: 820 kB
ema_gate_assets/ao_index_ema.png ADDED

Git LFS Details

  • SHA256: 996edf5e811edc4780942867dc1b6ec33909897c74fc1b60e143fefd854c3346
  • Pointer size: 130 Bytes
  • Size of remote file: 80.7 kB
ema_gate_assets/ao_index_net.png ADDED

Git LFS Details

  • SHA256: 89b9621059c03c042571667dac548b363063837e02a940863f6509457cc8172c
  • Pointer size: 130 Bytes
  • Size of remote file: 80.8 kB
ema_gate_assets/ema_vs_raw_aggregate.png ADDED

Git LFS Details

  • SHA256: 0d88da5fffb049f7e78a248a2eab1129a5805cd8b9c8c9d7ffd0a14773105d1b
  • Pointer size: 131 Bytes
  • Size of remote file: 113 kB
ema_gate_assets/ema_vs_raw_by_sigma.png ADDED

Git LFS Details

  • SHA256: ab513f745f9929fa4956b4cb9882fbedce0a486805c26205ebdbdb3066192dd8
  • Pointer size: 131 Bytes
  • Size of remote file: 152 kB
ema_gate_assets/enso_pr_ema.png ADDED

Git LFS Details

  • SHA256: 8ffa0c432fadffe1b9da2c994165eff2f2fb8541a4d23f5081c48a04cd64696f
  • Pointer size: 131 Bytes
  • Size of remote file: 283 kB
ema_gate_assets/enso_pr_net.png ADDED

Git LFS Details

  • SHA256: e066b5a2da88934eebc343e67b08b380694cebe118b9357d1496d1e015f2422f
  • Pointer size: 131 Bytes
  • Size of remote file: 283 kB
ema_gate_assets/global_mean_Z500_ema.png ADDED

Git LFS Details

  • SHA256: b8dd7e9c66eb7c272ebb3f3d76254f1cd5bd6fef29fe16a71ba195609fdca7f4
  • Pointer size: 130 Bytes
  • Size of remote file: 37.1 kB
ema_gate_assets/global_mean_Z500_net.png ADDED

Git LFS Details

  • SHA256: 544aa05516d8b245293ba42f6c5ac16558da39ad6c32c11ed8b88e3d3aed0ed7
  • Pointer size: 130 Bytes
  • Size of remote file: 40.3 kB
ema_gate_assets/global_mean_pr_ema.png ADDED

Git LFS Details

  • SHA256: 8e825b2c3bd41c754366876f68bbc35b9f8303ef4c07c39d2b0c85652c142ce3
  • Pointer size: 130 Bytes
  • Size of remote file: 40.1 kB
ema_gate_assets/global_mean_pr_net.png ADDED

Git LFS Details

  • SHA256: b001109c2cde2da6bec2c074cdedb50344ea93038bf55935bd24edb6319c8003
  • Pointer size: 130 Bytes
  • Size of remote file: 32.4 kB
ema_gate_assets/global_mean_tas_ema.png ADDED

Git LFS Details

  • SHA256: 557dddf2368e757f77bd597b9c559f093b2b89b3034e37ce5cdecb5a4248df50
  • Pointer size: 130 Bytes
  • Size of remote file: 44.8 kB
ema_gate_assets/global_mean_tas_net.png ADDED

Git LFS Details

  • SHA256: 81c497fc44d9f54b80ae7d59af2883687f148801ed0ac0317d7c84e69ca75c4f
  • Pointer size: 130 Bytes
  • Size of remote file: 44.6 kB
ema_gate_assets/precip_pdf.png ADDED

Git LFS Details

  • SHA256: 1ac8ca4efd896f1d671080d3f72ce8469b97f5b00eb0f64d1c3ae519329b58dc
  • Pointer size: 130 Bytes
  • Size of remote file: 44.3 kB
ema_gate_assets/seasonal_cycle.png ADDED

Git LFS Details

  • SHA256: e2ba133d9c8b4a90ee678933dcb392ef34cc3843ad1f61577a17fd48eec48ae8
  • Pointer size: 131 Bytes
  • Size of remote file: 407 kB
ema_gate_assets/spectra.png ADDED

Git LFS Details

  • SHA256: f3fdd5d155883865e337af2e5c7237e673c30c4c6a260864441380666558efe5
  • Pointer size: 131 Bytes
  • Size of remote file: 169 kB
ema_gate_assets/total_variance_maps.png ADDED

Git LFS Details

  • SHA256: 15093e0a2145ecbfd35f094d6342ea2210dd60ec8c62ac87a3a0e40deb334323
  • Pointer size: 131 Bytes
  • Size of remote file: 515 kB