StormCast CONUS is a regression UNet model for high-resolution (3km) weather
prediction over the full Continental United States (CONUS) domain. It is
trained as the first stage of the
StormCast regression-diffusion framework,
which autoregressively predicts 99 state variables at km scale using a 1-hour
time step, with dense vertical resolution in the atmospheric boundary layer.
This model extends the original StormCast V1
to the full CONUS domain (1056 x 1792 grid) rather than the smaller central
US bounding box (512 x 640) used in the original paper.
This checkpoint contains the regression model only. The full StormCast
pipeline additionally uses an EDM diffusion model to add fine-grained stochastic
structure (storm cells, precipitation bands).
For lexicon information, review the HRRR Lexicon at Earth2Studio. Variables marked with hl refer to natural/hybrid model levels.
Output
Output Type(s): Tensor (99 surface and model level variables) Output Format: PyTorch Tensors Output Parameters: Four Dimensional (4D) (batch, variable, latitude, longitude) Other Properties Related to Output:
Output grid: HRRR Lambert Conformal, 1056 x 1792 at 3km
Output state weather variables: same 99 variables as input
Properties:
HRRR data for the date range of 2023/01/01 to 2023/01/11 (264 hourly samples). The HRRR is a NOAA real-time 3-km resolution, hourly updated, cloud-resolving, convection-allowing atmospheric model, initialized by 3km grids with 3km radar assimilation. Data covers the full CONUS domain (1056 x 1792 grid points).
Properties:
ERA5 data for the date range of 2023/01/01 to 2023/01/11, interpolated to the HRRR grid. ERA5 provides hourly estimates of various atmospheric, land, and oceanic climate variables.
Properties:
HRRR data for the full year 2025 (8,760 hourly samples, ~3.3 TB). Full CONUS domain (1056 x 1792).
Conditioning:GFS (GFS_FX) for 2025, interpolated to the HRRR grid (26 conditioning variables at pressure levels).
Invariants: Land-sea mask and orography from ARCO ERA5, interpolated to the HRRR grid.
Data fetched and prepared using NVIDIA Earth2Studio data APIs (HRRR, GFS_FX, ARCO sources).
Training Configuration
Stage 1: Initial Training
Parameter
Value
Optimizer
Adam (fused)
Learning rate
4e-4
LR rampup steps
1,000
Total steps
16,000
Effective batch size
4 (gradient accumulation)
Batch size per GPU
1
Loss
MSE (regression)
Gradient clipping
1.0
Precision
BF16 (AMP) with TF32
Stage 2: Fine-tuning on 2025
Parameter
Value
Optimizer
Adam (fused)
Learning rate
2e-4
LR rampup steps
500
Total steps
32,000 (resumed from v0 weights at step 0)
Effective batch size
4 (gradient accumulation)
Batch size per GPU
1
Loss
MSE (regression)
Gradient clipping
1.0
Precision
BF16 (AMP) with TF32
Compute
Resource
Value
GPU
1x NVIDIA H100 80GB
Peak GPU memory
~29 GiB
Training speed
~5.0 s/step
Stage 1 training time
~21 hours (16,000 steps)
Stage 2 training time
~26 hours (32,000 steps)
Final train loss
0.0128
Final val loss
0.0104
Inference
Test Hardware:
H100 (80 GB)
Usage with Earth2Studio
python
1import numpy as np
2import torch
3from huggingface_hub import hf_hub_download
4from earth2studio.data import HRRR, GFS_FX
5from earth2studio.io import ZarrBackend
6from earth2studio.models.px import StormCast
7from earth2studio.models.px.stormcast import(8 CONDITIONING_VARIABLES, INVARIANTS, VARIABLES,9)10from physicsnemo.core import Module as PhysicsNemoModule
11import earth2studio.run as run
1213REPO_ID ="kashif/stormcast-regression-conus-v0"141516classRegressionOnlyStormCast(StormCast):17"""StormCast wrapper using only the regression model (no diffusion)."""1819@torch.inference_mode()20def_forward(self, x, conditioning):21if"conditioning_means"in self._buffers:22 conditioning = conditioning - self.conditioning_means
23if"conditioning_stds"in self._buffers:24 conditioning = conditioning / self.conditioning_stds
25 x =(x - self.means)/ self.stds
26 invariant_tensor = self.invariants.repeat(x.shape[0],1,1,1)27 concats = torch.cat((x, conditioning, invariant_tensor), dim=1)28 out = self.regression_model(concats)29 out = out * self.stds + self.means
30return out
313233# Download and load checkpoint (use 32000 for 2025-finetuned, 16000 for v0)34ckpt_path = hf_hub_download(REPO_ID,"StormCastUNet.0.32000.mdlus")35regression = PhysicsNemoModule.from_checkpoint(ckpt_path)36diffusion = torch.nn.Identity()3738# Download and load normalization stats39means = torch.from_numpy(40 np.load(hf_hub_download(REPO_ID,"means.npy"))[None,:,None,None]41)42stds = torch.from_numpy(43 np.load(hf_hub_download(REPO_ID,"stds.npy"))[None,:,None,None]44)45conditioning_means = torch.from_numpy(46 np.load(hf_hub_download(REPO_ID,"conditioning_means.npy"))[None,:,None,None]47)48conditioning_stds = torch.from_numpy(49 np.load(hf_hub_download(REPO_ID,"conditioning_stds.npy"))[None,:,None,None]50)5152# Download and load invariants53import xarray as xr
54from huggingface_hub import snapshot_download
55inv_path = snapshot_download(REPO_ID, allow_patterns="invariants.zarr/**")56inv = xr.open_zarr(f"{inv_path}/invariants.zarr", consolidated=False)57invariants = torch.from_numpy(58 inv["HRRR_invariants"].sel(channel=["lsm","orography"]).values[None]59)6061# Build model for full CONUS62model = RegressionOnlyStormCast(63 regression_model=regression,64 diffusion_model=diffusion,65 means=means,66 stds=stds,67 invariants=invariants,68 hrrr_lat_lim=(0,1056),69 hrrr_lon_lim=(0,1792),70 variables=np.array(VARIABLES),71 conditioning_means=conditioning_means,72 conditioning_stds=conditioning_stds,73 conditioning_variables=np.array(CONDITIONING_VARIABLES),74 conditioning_data_source=GFS_FX(),75)7677# Run 4-hour forecast (use any recent date with HRRR/GFS data available)78io = ZarrBackend()79io = run.deterministic(["2026-03-13"],4, model, HRRR(), io)8081# Plot composite reflectivity82import cartopy
83import cartopy.crs as ccrs
84import matplotlib.pyplot as plt
8586projection = ccrs.LambertConformal(87 central_longitude=262.5, central_latitude=38.5,88 standard_parallels=(38.5,38.5),89 globe=ccrs.Globe(semimajor_axis=6371229, semiminor_axis=6371229),90)91fig, ax = plt.subplots(subplot_kw={"projection": projection}, figsize=(12,7))92im = ax.pcolormesh(93 model.lon, model.lat, io["refc"][0,4],94 transform=ccrs.PlateCarree(), cmap="turbo", vmin=-10, vmax=60,95)96ax.add_feature(97 cartopy.feature.STATES.with_scale("50m"),98 linewidth=0.5, edgecolor="black", zorder=2,99)100ax.coastlines()101ax.gridlines()102ax.set_title("StormCast CONUS - Composite Reflectivity +4h")103fig.colorbar(im, ax=ax, shrink=0.7, label="dBZ")104plt.savefig("refc_prediction.png", dpi=150, bbox_inches="tight")
Example Inference Results
4-hour autoregressive forecast initialized from HRRR analysis on 2026-03-13 00Z, with GFS conditioning. Showing 2m temperature, 10m U-wind, composite reflectivity, and mean sea level pressure.
Initial conditions (+0h):
StormCast CONUS +0h
+2h forecast:
StormCast CONUS +2h
+4h forecast:
StormCast CONUS +4h
Limitations
Regression-only: No diffusion model, so predictions are spatially smooth. The full StormCast pipeline requires the EDM diffusion stage for realistic fine-grained storm structure (convective cells, precipitation bands).
Reflectivity: Composite reflectivity (refc) captures large-scale precipitation patterns (frontal bands, lake-effect regions) but peaks around 24 dBZ — well below real convective storms (>50 dBZ). The diffusion model is essential for realistic storm-cell intensities.
Reduced architecture: Model channels = 64 (vs 128 in original StormCast V1) to fit full CONUS domain on a single H100 80GB GPU.
Single-year fine-tuning: Stage 2 trained on full year 2025 (8,760 hourly samples) covering all seasons, but still less diverse than the original V1's 3.5 years (2018-2021). Rare or extreme weather events may be underrepresented.
Ethical Considerations
NVIDIA believes Trustworthy AI is a shared responsibility. When downloaded or used in accordance with the terms of service, developers should work with their internal model team to ensure this model meets requirements for the relevant industry and use case.
Citation
bibtex
1@article{pathak2024stormcast,
2 title={Kilometer-Scale Convection Allowing Model Emulation using Generative Diffusion Modeling},
3 author={Pathak, Jaideep and others},
4 journal={arXiv preprint arXiv:2408.10958},
5 year={2024}
6}