Instructions to use lowdown-labs/fela-timeseries with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use lowdown-labs/fela-timeseries with Transformers:
# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("lowdown-labs/fela-timeseries", trust_remote_code=True, dtype="auto") - Notebooks
- Google Colab
- Kaggle
DISCLAIMER
This model is a research preview. It is released by Lowdown Labs in the interest of advancing public science and demonstrating that a Fourier Neural Operator can forecast on a plain CPU with a constant memory footprint. The dataset behind this one (UCI electricity load) is CC BY 4.0 and could permit commercial use with attribution; see the license notes below before deploying.
FELA-TS edge: On device electricity load forecaster
FELA-TS edge reads a window of recent load history and forecasts the next 96 steps ahead. It is tiny, about 1.76M parameters, and runs on a plain CPU with no GPU. Its working memory does not grow with how long the stream has been running, so you can drop it into a meter or a building controller and let it forecast a live feed for years without the memory climbing due to the model expanding its usage.
The shipped checkpoint is trained on the standard 321 channel electricity load benchmark, but the architecture underneath is a generic multi channel forecaster for long horizons.
What goes in, what comes out
- Input: one history window of shape
(1, 512, 321): 512 past time steps across 321 load channels, per channel standardized on the training statistics. RevIN handles the instance normalization inside the model, so you pass the standardized history and the model manages the per window mean and scale itself. - Output: a forecast of shape
(1, 96, 321): the next 96 steps for all 321 channels, returned in the original (denormalized) units. - In plain terms: "here are the last 512 hours of load for these meters" goes in, and "here is the next 96 hours for each of them" comes out.
The edge/on device unit runs a single load stream at a time (one channel), which is the sub millisecond, constant memory path described under Performance.
Why we built it this way
The sequence mixer is a Fourier Neural Operator, a filter the model learns and then applies in the frequency domain. Electricity load runs on strong daily and weekly cycles, and those cycles are what a frequency domain filter reads best, so the method fits the signal. The model is pure FNO with a patch embedding, and it normalizes each history window internally (a step called RevIN) so you do not have to hand tune it. It is pure FNO, with none of the gated memory or attention layers that some sibling FELA models add.
Because it carries no attention and no KV cache, the working memory stays small and fixed no matter how much history has streamed through it. The live single stream path keeps its history in a 512 sample ring buffer, about 2 KB, and one forward pass runs on roughly 126 KB of activations. That flat footprint is the whole point at the edge: a full history attention model would keep growing its memory until it ran out, while this one does not move.
Performance
Speed and footprint, measured on CPU (single core, single load stream).
| Format | Size on disk | Notes |
|---|---|---|
| fp32 | 9.96 MB | full model weights |
| int8 (PyTorch/ONNX) | 7.29 MB | deployable edge unit |
| TFLite float16 | 4.9 MB | smallest deployable export |
- Full 321 channel forecast: median 165.7 ms on one CPU core.
- Single channel edge unit forecast: median 0.863 ms on one CPU core.
- int8 ONNX single stream update: about 0.56 ms per update (roughly 1,700 updates per second) on one core.
- Live working RAM (constant, independent of history length): a 2 KB ring buffer holds the entire retained history, plus about 126 KB of activations, for a working set under 200 KB excluding weights.
Constant memory is verified: the O(1) ring buffer streaming path was checked against recomputing the forecast on the explicit window and matched exactly (mean absolute difference 0.0 over 1,800 streamed steps).
The model fits comfortably on a Raspberry Pi 4/5 or Pi Zero 2 W (Cortex-A class, ONNX path); it probably could not fit a small microcontroller (the 5 to 7 MB model is larger than typical MCU flash) without explicitly targeting those constraints, so the realistic edge target is a Cortex-A single board computer, not a Cortex-M part.
Accuracy
Protocol: UCI ElectricityLoadDiagrams20112014 ("electricity" / ECL benchmark), the standard Informer chronological 70/10/20 train/validation/test split, lookback L = 512, forecast horizon H = 96, over all 321 channels. Metric is mean squared error (MSE) and mean absolute error (MAE) on the z normalized test windows, the standard long horizon ECL protocol.
| Benchmark | Metric | This model | Baseline (named) |
|---|---|---|---|
| Electricity, horizon 96 | MSE | 0.1325 | PatchTST ~0.129 |
| Electricity, horizon 96 | MAE | 0.2233 | iTransformer MSE ~0.148, DLinear MSE ~0.140 |
The card MSE/MAE of 0.1325 / 0.2233 reproduced at 0.1344 / 0.2254 on a fresh held out evaluation (1.76M parameters). PatchTST leads on accuracy by a small margin at this horizon; iTransformer and DLinear are behind. However, sub millisecond single stream forecasts on one CPU core with a flat, sub 200 KB working set are provably attainable, vs a full history attention model whose memory climbs with the length of the stream.
How to run it
The short version:
import torch
from modeling import load_model, forecast
m = load_model("/path/to/weights_dir") # a dir with model.safetensors + config.json
# x: a (1, 512, 321) history window, per channel standardized on training stats
y = forecast(m, x) # -> (1, 96, 321) forecast in original units
load_model also accepts the model.safetensors path directly or a Hugging Face repo id. The fp32
weights ship as model.safetensors; the loader builds the architecture from config.json and
loads the state dict.
Training data and license
- Dataset: UCI ElectricityLoadDiagrams20112014 ("electricity" / ECL), the 321 client hourly
variant used across the Informer / Autoformer / PatchTST time series literature (26,304 hourly
timesteps x 321 client load streams). Source: UCI Machine Learning Repository, dataset 321
(DOI 10.24432/C58C86). The training split, windowing, and the audited train window count are
reproduced in
train.py(--smokerebuilds the split and asserts 17,805 train windows). - License: Creative Commons Attribution 4.0 International (CC BY 4.0), as listed on the UCI dataset page. Commercial use is ALLOWED, contingent only on attribution and preserving the license terms. This is the one dataset in the FELA industrial family with an unambiguous, commercially usable license. Attribution: cite the UCI ElectricityLoadDiagrams20112014 dataset (DOI 10.24432/C58C86).
Intended use, limitations, and safety
What it is for: the forecasting core inside an edge or on premises energy product, running on a CPU or a single board computer. Fit includes live load forecasting on a meter or gateway, building and microgrid controllers, and any long running multi channel forecast where the memory must stay flat while history accumulates.
What it is not for: this is a forecasting model, not a control system or a guarantee. It was trained and evaluated only on the UCI electricity benchmark; generalization to other load profiles, sampling rates, sensors, and populations is not established and must be validated before any operational use. Accuracy is at parity with, not ahead of, the strongest published transformer forecaster (PatchTST leads by a small margin); the model wins on footprint and constant memory, not on top line accuracy. Continuous stream benchmarks beyond the verified streaming equals batch check (for example multi day real time factor on a specific physical board) are not yet measured.
Model family
This is part of the FELA family from Lowdown Labs: one Fourier Neural Operator architecture across
many modalities, all CPU native and subquadratic. Sibling repos share no weights, so none carries a
base_model link.
License
Released under the Lowdown Labs Lovely License 1.0 (CC BY-NC 4.0 plus Hippocratic License 3.0). See LICENSE. For most LL models, a commercial license may be available; contact Lowdown Labs.
- Downloads last month
- 2