CAMulator

CAMulator is an auto-regressive machine-learned emulator of NSF NCAR's CAM6 atmosphere, trained and run within the CREDIT framework. Given prescribed sea-surface temperature, sea-ice, incoming solar radiation, and CO2, it rolls a 1 degree (192x288), 32-level, 6-hourly atmospheric state forward for climate-length simulations (years to decades). It conserves global dry-air mass, moisture, and total atmospheric energy, remains numerically stable over decadal rollouts, and reproduces the annual climatology together with major modes of variability such as ENSO and the NAO -- at roughly a 350x speedup over CAM6, making it an efficient way to generate large climate ensembles.

The model and method are described in Chapman et al. (2025), CAMulator: Fast Emulation of the Community Atmosphere Model (arXiv:2504.06007).

CAMulator is a research tool. It emulates a specific CAM6 configuration and is not a substitute for an operational forecast or a full Earth-system model.

Quick links

Inference quickstart

# 1. get the toolbox
git clone -b camulator_huggingface https://github.com/WillyChap/miles-credit.git camulator
cd camulator

# 2. environment (PyTorch 2.4.1 + CUDA 12.1; pinned in environment.yml)
conda env create -f environment.yml -n camulator
conda activate camulator
pip install -e . --no-deps        # --no-deps: environment.yml pins the exact stack

# 3. pull this model + its inputs into ./assets/
cd climate
python download_assets.py --repo_id willychap/camulator     # default checkpoint = epoch 65

# 4. verify + run (writes monthly-mean NetCDF by default)
python check_setup.py
bash RunQuickClimate.sh

Full instructions, configuration, and the asset manifest are in climate/README.md.

Evaluation

We evaluate many training checkpoints by running each as a free-running, autoregressive 35-year rollout (1980-2014, 6-hourly, no-leap) and scoring it against the CREDIT ERA5-scaled training target on the same 1 degree grid (latitude-weighted), looking at both the monthly-mean climatology and the 6-hourly distribution.

Checkpoint 65 is selected as the default. The other top checkpoints (epochs 63, 70, 48, 47, 66, 76, 68, 51, 43) are provided as well, so you can evaluate them yourself, build cheap checkpoint ensembles, or study sensitivity to training stage β€” pick one with download_assets.py --checkpoint checkpoint.pt000NN.pt.

Checkpoint 65 climatology (latitude-weighted, full 35-yr record):

Field Spatiotemporal RMSE Global-mean bias Decadal-trend error Global-mean monthly RMSE Annual corr.
TREFHT 1.564 K +0.033 K -0.007 K/decade 0.159 K 0.985
PRECT 6.09e-4 (2.4 mm/day) -3.9e-6 (essentially neutral) -- clim. RMSE 7.49e-5 --

The figures below summarize the metrics: a skill scorecard across the top checkpoints, checkpoint 65's annual-mean bias maps, the global-mean temperature evolution against the training target, and the 6-hourly precipitation distribution.

Checkpoint skill scorecard (green = better)

Checkpoint 65 annual-mean bias maps

Global-mean TREFHT, 1980-2014: checkpoints vs training target

6-hourly PRECT distribution

Note on PRECT units: native values are metres of liquid-water equivalent per 6-hourly step (ERA5 tp convention); mm/day = native x 4000. Checkpoint 65's global-mean precipitation is 2.92 mm/day vs. truth 2.93.

Repository layout

willychap/camulator
β”œβ”€β”€ README.md                          # this model card
β”œβ”€β”€ inference_config.yaml              # ready-to-run config (= camulator_config.yml)
β”œβ”€β”€ checkpoint.pt00065.pt              # default model (epoch 65); top-10 epochs alongside
β”œβ”€β”€ forcing_data/
β”‚   β”œβ”€β”€ b.e21.CREDIT_climate_cyclic_1yr_f32coords.nc      # cyclic (default)
β”‚   └── b.e21.CREDIT_climate_branch_1980_2014.nc          # progressive/transient
β”œβ”€β”€ initial_conditions/
β”‚   └── init_camulator_condition_tensor_*.pth            # 69 ICs (Jan 1 & Jul 1, 1980/1981-2014)
β”œβ”€β”€ normalization/
β”‚   β”œβ”€β”€ mean_*.nc, std_*.nc                               # z-score
β”‚   └── *statics*.nc                                      # statics + latitude weights
β”œβ”€β”€ metadata/
β”‚   └── camulator_metadata.yaml                           # output variable units / long-names
└── figs/                                                 # model-card figures

(The inference toolbox actually reads its units from the in-repo copy climate/camulator_metadata.yaml; the metadata/ copy here is for reference.)

download_assets.py pulls these into the toolbox's ./assets/ for you.

Training data

CAMulator was trained on a CAM6 / ERA5-scaled climate dataset (1980-2014). The full training archive is not hosted here; the inputs needed to run the model (forcing, initial conditions, normalization, statics) are.

If you would like access to our training Zarr datasets, please email wchapman [at] colorado.edu.

Citation

@article{chapman2025camulator,
  title   = {CAMulator: Fast Emulation of the Community Atmosphere Model},
  author  = {Chapman, William E. and Schreck, John S. and Sha, Yingkai and
             Gagne II, David John and Kimpara, Dhamma and Zanna, Laure and
             Mayer, Kirsten J. and Berner, Judith},
  journal = {arXiv preprint arXiv:2504.06007},
  year    = {2025},
  doi     = {10.48550/arXiv.2504.06007},
  url     = {https://arxiv.org/abs/2504.06007}
}
Downloads last month

-

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

Paper for willychap/camulator