NanoForecast v0.3
6.5M-Parameter Time Series Foundation Model — Deploy Anywhere
CPU inference · Raspberry Pi · ONNX · Streaming · Quantile forecasts
Built by Eulogik — deployable AI for the real world
What is NanoForecast v0.3?
NanoForecast v0.3 is the initial release of a 6.5M-parameter time series foundation model designed for deployment on CPUs, Raspberry Pi, edge devices, and in the browser. It performs zero-shot forecasting with quantile uncertainty bounds.
This is a reference release. For the latest improvements, see eulogik/nanoforecast-v05 (43.8% better MASE with same architecture).
Key Features
- Zero-shot forecasting — no training needed for new time series
- Streaming inference — feed one value at a time via stateful DeltaNet RNN
- Quantile predictions — p10, p25, p50, p75, p90 with monotonic guarantees
- ONNX export — 9.2MB INT8 for edge, IoT, browser deployment
- CPU inference — 19.5ms median latency on Apple M4
- Train from CSV — fine-tune on your data in minutes
- Apache 2.0 license — no restrictions on commercial use
Benchmark Results
Standard protocol: context 512, horizon 48, non-overlapping test windows, MASE scaled by seasonal-naive in-sample MAE.
| Dataset | NanoForecast v0.3 (6.5M) | TimesFM (200M) | PatchTST (15M+) |
|---|---|---|---|
| ETTh1 | 0.681 | 0.705 | 0.781 |
| ETTh2 | 1.328 | 1.360 | 1.467 |
| ETTm1 | 0.288 | 0.545 | 0.488 |
| exchange_rate | 11.758 | 4.383 | 3.861 |
| electricity | 2.213 | 0.923 | 1.347 |
| traffic | 1.913 | 0.765 | 1.379 |
| Overall MASE | 3.030 | 1.447 | 1.554 |
v0.3 → v0.5 improvement: Overall MASE 3.030 → 1.704 (↓43.8%) with same architecture, pipeline fixes only.
Quick Start
Install
pip install nanoforecast
Zero-Shot Forecasting
import numpy as np
from nanoforecast import NanoForecast
model = NanoForecast.from_pretrained("eulogik/nanoforecast-v03")
context = np.sin(np.linspace(0, 8*np.pi, 512)) + 0.1 * np.random.randn(512)
result = model.predict(context, horizon=48, freq=1)
print(result["forecast"].shape) # (48,) point forecast
print(result["quantiles"].shape) # (5, 48) p10..p90
Streaming Inference
result = model.predict(context, horizon=48, return_state=True)
state = result.pop("state")
for new_val in incoming_stream:
result = model.predict_step(new_val, state, horizon=48)
forecast = result["forecast"][0]
Model Files
| File | Size |
|---|---|
model.safetensors |
26.1 MB |
config.json |
343 B |
model_card.json |
710 B |
Citation
@article{nanoforecast2026,
title={NanoForecast: A Deployable Time Series Foundation Model},
author={Gautam Kishore and Eulogik},
year={2026},
url={https://github.com/eulogik/NanoForecast},
note={6.5M parameters, CPU inference, ONNX export, streaming RNN}
}
Links
- GitHub: github.com/eulogik/NanoForecast
- Live Demo: huggingface.co/spaces/eulogik/nanoforecast
- Paper: arxiv.org/abs/2608.14658
- Latest version: eulogik/nanoforecast-v05
- Website: eulogik.com
Built by Eulogik — deployable AI for the real world
If you found this useful, please ⭐ the GitHub repo and like this model on Hugging Face!
- Downloads last month
- 63
Collection including eulogik/nanoforecast-v03
Paper for eulogik/nanoforecast-v03
Evaluation results
- MASE on ETTh1self-reported0.681
- sMAPE (%) on ETTh1self-reported16.970
- MASE on ETTh2self-reported1.328
- sMAPE (%) on ETTh2self-reported12.810
- MASE on ETTm1self-reported0.288
- sMAPE (%) on ETTm1self-reported7.480
- MASE on exchange_rateself-reported11.758
- sMAPE (%) on exchange_rateself-reported9.670