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.
- π Technical report: arXiv:2609.30880 (also bundled here as
EXAONE_Demand_v1.0_Technical_Report.pdf) - π» Code: https://github.com/LGAI-Research/EXAONE-Forecast
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.
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 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