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{kishore2026nanoforecast,
title={NanoForecast v0.5: Competitive Time Series Forecasting Through Training Pipeline Optimization},
author={Kishore, Gautam},
journal={arXiv preprint arXiv:2609.31669},
year={2026}
}
Paper: arxiv.org/abs/2609.31669
Links
- GitHub: github.com/eulogik/NanoForecast
- Live Demo: huggingface.co/spaces/eulogik/nanoforecast
- Paper: arxiv.org/abs/2609.31669
- Latest version: eulogik/nanoforecast-v05
- Paper: arxiv.org/abs/2609.31669
- 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!
Model discussions
Share what you know. Help others. Build trust.
Loading comments...
Keep it about the model. No spam, scams or personal attacks. Links are not allowed in comments or replies. Comment policy