EXAONE Forecast for Demand

EXAONE Forecast for Demand is a time series foundation model (TSFM) built for demand forecasting. It keeps a general-domain backbone frozen and adapts it with a demand-aware adapter: five low-rank branches, one shared and one for each of the four demand classes (smooth, intermittent, erratic, lumpy), mixed by a router that reads eight scale-free statistics of the input series. The weights in this repository were trained on synthetic data only β€” the backbone on KernelSynth and the adapter on a synthetic demand corpus β€” so no real-world series entered any stage of training.

This repository holds the model weights. The inference code lives at LGAI-Research/EXAONE-Forecast and is released under a different license β€” see License.

Overview

The technical report builds EXAONE Forecast for Demand in two versions that differ only in the data the adapter is trained on. This repository releases the synthetic-only version, which the report calls EXAONE Demand (Synthetic).

Model Backbone Adapter training data MASE Released
EXAONE Backbone (zero-shot) General-domain TSFM pretrained on KernelSynth β€” 1.1050 ❌
EXAONE Forecast for Demand (Synthetic) Same backbone, frozen Synthetic demand only 1.0742 βœ… this repository
EXAONE Forecast for Demand Same backbone, frozen Real-world and synthetic demand 1.0667 ❌

A model trained on open demand data inherits the licenses of that data, while one trained on series we generated ourselves inherits none of them. The released version therefore uses the synthetic corpus alone, and it still outperforms all 36 TSFMs it was compared against.

From raw context to eight statistics to the router's mixture over four experts plus a shared branch
The router reads eight scale-free statistics of the raw context and weighs the four demand-class experts; a shared branch is added on top with a fixed weight.

Model Configuration

Parameters 348M (backbone 312M, frozen Β· adapter and router 36M)
Encoder blocks 24
Model width / embedding width 1024 / 2048
Attention heads 16 (RoPE)
Adapted projections W_q, W_k, W_v, W_o and the two feed-forward projections of every block (144 in total)
Adapter branches 5 β€” 1 shared (rank 16) + 4 routed (rank 4)
Router input 8 statistics: zero share, ADI, CVΒ², trend, AC(1), share of upward steps, CV, length
Patch size (input = output) 16
Context length 8192
Horizon per forward pass 64 (longer horizons are unrolled)
Output 21 quantile levels (0.01, 0.05, 0.10, …, 0.95, 0.99)
Precision float32

Evaluation Results

Zero-shot results on 22 held-out demand datasets. Both versions of EXAONE Demand are compared against 36 TSFMs and the frozen backbone, all run under the same protocol. Error metrics are geometric means over the 22 datasets (lower is better). Avg. Rank is the mean position by per-dataset MASE, and Win rate is the share of the 836 per-dataset MASE comparisons against the other 38 rows that a model wins. The top six of 39 rows, ordered by MASE:

# Model Avg. Rank Win rate MASE ND WQL MAPE MAE MSIS
1 EXAONE Forecast for Demand 4.09 91.9% 1.0667 0.1409 0.1138 0.2565 60.24 10.70
2 EXAONE Forecast for Demand (Synthetic) β€” this repository 5.55 88.0% 1.0742 0.1420 0.1147 0.2583 60.73 10.63
3 TiRex-1.1 7.64 82.5% 1.0818 0.1451 0.1161 0.2911 62.06 10.75
4 Chronos-2 8.59 80.0% 1.0885 0.1497 0.1406 0.3010 64.02 14.48
5 EXAONE Backbone (zero-shot) 7.95 81.7% 1.1050 0.1445 0.1169 0.2609 61.82 11.41
6 TimesFM-2.5 10.05 76.2% 1.1073 0.1486 0.1215 0.3032 63.58 12.31

The released synthetic-only model is ahead of every one of the 36 baselines on all six error metrics, the average rank, and the win rate, and its MSIS is the best of all 39 rows. Adding real-world demand to the adapter's training data (row 1, not released) lowers MASE by a further 0.0075. Full protocol and results are in the technical report.

MASE over 22 held-out demand datasets for EXAONE Forecast for Demand and the strongest baselines
MASE over the 22 held-out demand datasets (lower is better). This repository releases EXAONE Forecast for Demand (Synthetic).

Requirements

  • Python β‰₯ 3.9
  • PyTorch β‰₯ 2.0 (a CUDA build is recommended; CPU works for small workloads)

Quickstart

pip install "exaone-forecast[demand] @ git+https://github.com/LGAI-Research/EXAONE-Forecast.git"
import numpy as np
from exaone_forecast.demand import from_pretrained

fc = from_pretrained(device="cuda:0")     # downloads these weights on first use

rng = np.random.default_rng(0)
series = [(rng.random(300) < 0.2) * rng.integers(1, 9, 300) for _ in range(4)]

q = fc.predict(series, horizon=28)                       # (4, 21, 28) quantiles
yhat = fc.point(series, horizon=28)                      # (4, 28) median forecast
lo, hi = fc.interval(series, horizon=28, lower=0.1, upper=0.9)

Inputs may be a single 1D series, a list of 1D arrays of differing lengths, or a 2D (n_series, T) array. Feed values on their natural scale β€” the model normalizes internally and reads only the last context_length (8192) points. Missing observations are supported: encode them as np.nan. A genuine zero is a 0, not a NaN; the zero share is one of the statistics the router reads.

Available checkpoints

Name File Parameters
default exaone-demand-1.0.safetensors 348M

config.json accompanies the weights and describes the architecture.

Intended use

Zero-shot probabilistic forecasting of demand series β€” retail sales, spare-part orders, bookings, electricity load, ridership and the like β€” for research and educational purposes. Each series is forecast from its own recent history; no per-dataset training is required.

Limitations

  • The adapter is specialised to demand-shaped series. Outside that domain, behaviour falls back toward the general-domain backbone.
  • Training data is synthetic only. Behaviour the generators do not reproduce β€” an industry's idiosyncratic seasonality, an unrecorded external event β€” was never seen during training.
  • The router judges a series from its input window alone, so a very short window makes the demand-class assignment less reliable.
  • Stock-out censoring and promotions are not modelled unless they show up in the series itself.
  • One forward pass covers 64 steps; longer horizons are produced by unrolling.

License

The model weights in this repository are released under the EXAONE AI Model License Agreement 1.2 - NC (LICENSE), which limits use to non-commercial research and education.

The inference code at LGAI-Research/EXAONE-Forecast is licensed separately under the BSD-3-Clause-LG AI Research License, which permits commercial use. Installing that package does not grant commercial rights to the weights it downloads.

Third-party open source components and their licenses are listed in Notice.md.

Citation

@article{lgai2026exaonedemand,
  title   = {EXAONE Demand 1.0: A Time Series Foundation Model for Demand Forecasting},
  author  = {Lee, Seunghan and Han, Sangjun and Seo, Jun and Kang, Junhyeok and
             Lee, Jaehoon and Lim, Tae Yoon and Kang, Dongwan and Choi, Hwanil and
             Kim, Minjae and Yoo, Sungdong and Lee, Soonyoung and Ahn, Wonbin},
  journal = {arXiv preprint arXiv:2609.30880},
  year    = {2026}
}

The technical report, the figures above, and the code package use the short form EXAONE Demand (from exaone_forecast.demand import from_pretrained).

Contact

LG AI Research β€” https://www.lgresearch.ai

Downloads last month
37
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Paper for LG-AI-Research/EXAONE-Forecast-for-Demand-1.0