hugging-science/ai-weather-models-with-earthmover-data
AI weather forecasts, one click from the data
This app runs ECMWF AIFS Single 1.0 (default), 1.1, or Microsoft Aurora 0.25 Pretrained. It reads the initial conditions live from Arraylake, and follows earth-mover/aifs-demo. Pick an init time and a number of 6-hourly steps. The forecast is plotted on a 0.25° grid.
Two initial-condition sources are wired up, and both work:
- ECMWF HRES, Brightband's IFS store. It is a rolling window of about two weeks. Pick from the dropdown of stored 6-hourly init times.
- ECMWF ERA5, the reanalysis, from 1940 to a few days ago. Type any date. The app snaps it down to the nearest 00/06/12/18 UTC slot.
Verify against ERA5 draws a forecast − ERA5 map under each plotted variable. Each map is titled with the cos(lat)-weighted RMSE and bias for that step. The two default variables are 2t and z_500. The box is on by default. It turns itself off for an init time ERA5 cannot reach. Turning it back on there is refused, and the message gives the date ERA5 ends. ERA5 lags real time by about six days, and the HRES picker opens on the newest init time. On that source the box therefore starts off. Step the init time back a week. The box then ticks itself and the difference maps appear. Steps past the end of the archive stay empty, and the Status box says how many were covered.
Running your own copy
You need your own initial conditions. The app reads Earthmover marketplace listings. A read works only for an account that has subscribed to the listing. An Arraylake token alone is not enough. Arraylake tokens are also per-organization, so the token must belong to the organization that holds the subscription. This applies whether you duplicate this Space or run it locally:
- Subscribe, with your Earthmover account, to [ECMWF IFS Initial Conditions (open)](https://app.earthmover.io/marketplace/697162921880507a6587c31b). That is what the default
ifssource reads. The ERA5 source is independent of it, because ERA5 carries its own static fields (lsm,z,slor,sdor). An ERA5-only copy can skip this step and leave theifsinit-time picker empty. - Create Arraylake API tokens for the organizations that hold your subscriptions.
- Set these, as Space secrets or in a local
.env. See.env.example:
ARRAYLAKE_TOKEN=<Arraylake token for the IFS subscription org>
HF_TOKEN=<a Hugging Face token, for the AIFS checkpoint>
PAID_ERA5_ARRAYLAKE_TOKEN=<Arraylake token for earthmover-public> # optional
#ARRAYLAKE_AI_FORECAST_REPO=<your-org>/<your-arraylake-repo> # optional A subscription under your own organization materializes its copy at <your-org>/<repo>, not at the Earthmover-held defaults the app reads. Point the app at your copies with these optional variables. No code edit is needed:
#ARRAY_ORG_NAME=<your-org> # IFS, org only
#ARRAYLAKE_IC_REPO=<your-org>/<your IFS analysis repo>
#ARRAYLAKE_ERA5_REPO=<your-org>/<your daily-updated ERA5 repo> ARRAY_ORG_NAME is the short way to say "same IFS listing, my org". It keeps the listing's own repo name and swaps only the organization. Use ARRAYLAKE_IC_REPO when your copy carries another name. It replaces the whole path and takes precedence.
The ERA5 option needs no extra subscription. Without PAID_ERA5_ARRAYLAKE_TOKEN it reads the free CC-BY `earthmover-public/era5`. That copy covers 1940 onwards, but it lags real time by a quarter or so. To get the daily copy instead, subscribe to ERA5 (daily updates) and set its token as PAID_ERA5_ARRAYLAKE_TOKEN. The Status box names whichever copy it opened.
Finished forecasts are mirrored to the shared Hugging Face bucket hugging-science/ai-weather-models-with-earthmover-data-storage. HF_BUCKET_ID overrides it. When ARRAYLAKE_AI_FORECAST_REPO points at an Arraylake repo writable by ARRAYLAKE_TOKEN, they are also written there as icechunk data, one group per run at {model}/{initial-conditions}/{init}. See docs/ARRAYLAKE_ACCESS.md.
The defaults are the Earthmover-held copies. ARRAYLAKE_IC_REPO defaults to spring-data/ecmwf-ifs-initial-conditions-open-subscription, and ARRAYLAKE_ERA5_REPO to earthmover-public/era5-private. An ARRAYLAKE_ERA5_REPO that cannot be opened still falls back to the free repo. Without a valid subscription the app still starts. The init-time picker stays empty, and the Status box shows the error.
Running locally
uv venv --python 3.12
uv pip install -r requirements.txt
uv run gradio app.py # http://127.0.0.1:7860, with hot reloadrequirements.txt is the single source of truth for dependencies. See AGENTS.md for the details, and docs/ for the deeper notes.
Two Spaces
This app is deployed twice. Production is hugging-science/ai-weather-models-with-earthmover-data, the one you are probably looking at. Staging is a protected Space, hugging-science/ai-weather-models-with-earthmover-data-staging. Changes get a run there on real ZeroGPU hardware before they go public. A Space builds its main branch and nothing else, so staging is a second Space rather than a branch. git push --force staging HEAD:main deploys whatever branch is checked out.
A colored bar at the top of the page tells you which one you are on: amber STAGING, slate LOCAL, and nothing at all on production. docs/ENVIRONMENTS.md has the rest.
Requests and feedback
The discussion tab is this project's issue tracker and feature-request board. Bugs, questions, and "please add X" all go there. `docs/FEEDBACK.md` is what a request must answer. For a new model, that means where the weights are, what it takes as input, whether our initial-condition sources can feed it, what runs it, and whether it fits the GPU budget.
