File size: 18,798 Bytes
3476d8e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
---
license: other
license_name: lowdown-labs-lovely-license-1.0
license_link: LICENSE
tags:
  - fela
  - fourier-neural-operator
  - fno
  - cpu
  - on-device
  - energy-forecasting
  - solar-power
  - wind-power
  - probabilistic-forecasting
  - quantile-regression
library_name: transformers
pipeline_tag: time-series-forecasting
---

# DISCLAIMER

This model is a research preview. GEFCom2014 is competition data with no stated reuse or
commercial use grant (citation only), so respect that before any commercial use. Lowdown Labs
has put together this model in the interest of advancing public science.

# FELA Power Grid: on station probabilistic solar and wind power forecasting

This model forecasts how much power a solar farm or a wind farm will produce in the
coming hours, and it gives a full range of outcomes (not just a single guess) so a grid
operator can plan for the good case and the bad case. It is small enough to fit the
envelope of a cheap microcontroller right at the station, with no cloud and no network
connection, running there through an ONNX or TFLite export.

# What goes in, what comes out

- Input: a short window of weather forecast numbers for the site (numerical weather
  prediction, or NWP, covariates such as forecast irradiance for solar or forecast wind
  speed and direction for wind). Solar input shape is (1, 6, 20): 6 time steps, 20
  weather features. Wind input shape is (1, 12, 15): 12 time steps, 15 weather features.
- Output: 99 numbers per forecast hour, the 1 percent through 99 percent quantiles of
  power output, normalized to the site's rated capacity (0 to 1). A quantile is a "what
  if" level: the 10 percent quantile (P10) is a low estimate that power should exceed
  90 percent of the time, the 90 percent quantile (P90) is a high estimate. The gap
  between P10 and P90 is the uncertainty band the operator plans against.
- This lets a grid or plant operator schedule reserves, bid into a market, and manage
  ramps with a calibrated sense of risk, using a device that sits on the station and
  keeps working when the network is down.

# Why we built it this way

The model is a dual path Fourier Neural Operator, or FNO. The main path mixes information in the
frequency domain: a fast Fourier transform, a learned filter on the frequencies, then a transform
back. Weather and power move on daily and seasonal cycles, which is cheap to capture this way.
Alongside it runs a small local mixer for the short range detail.

Everything is kept deliberately small: 136,780 parameters for solar, 311,554 for wind. Quantized to
8 bit integers each track is under a megabyte, and a single hourly forecast takes under a
millisecond on one CPU core (measured on an x86 server CPU). That is small enough to sit on a
microcontroller at the station, running through the ONNX or TFLite export. Because it runs there
offline, the site's operational data never leaves the premises.

# Performance

Speed and footprint, measured on CPU (AMD EPYC 9555, batch size 1, median of 20 runs).

| Track | Parameters | fp32 size | int8 size | Latency, 1 core |
|---|---|---|---|---|
| Solar, input (1, 6, 20) | 136,780 | 0.74 MB | 504 KB | 0.386 ms |
| Wind, input (1, 12, 15) | 311,554 | 1.91 MB | 1472 KB | 0.375 ms |

The int8 weights are the on device deploy size. The int8 pinball loss is essentially
unchanged from fp32 (see Accuracy), so quantization is effectively lossless here.

# Accuracy

The benchmark is GEFCom2014, the standard Global Energy Forecasting Competition dataset
(Hong et al. 2016). The protocol is the final task (Task 15): train on all data before the
held out test month and forecast that month from weather inputs only, with no test period
power used (so there is no leakage). 

Solar is 3 zones (test month June 2014), wind is 10
zones (test month December 2013). The metric is pinball loss averaged over the 1 to 99
percent quantiles, with power normalized to site capacity, exactly as in the competition.
Lower pinball loss is better. "Skill" is the percent reduction in pinball loss against a
named reference forecast.

| Benchmark | Metric | This model | Baseline (named) | Source |
|---|---|---|---|---|
| GEFCom2014 solar | pinball (norm.) | 0.01308 (int8 0.01328) | competition benchmark 0.0285 | measured (ours) |
| GEFCom2014 solar | skill vs competition benchmark | +54.1 percent | competition benchmark | measured (ours) |
| GEFCom2014 solar | skill vs diurnal persistence | +32.1 percent | diurnal persistence | measured (ours) |
| GEFCom2014 solar | pinball (norm.) | 0.01308 | our LightGBM quantile baseline 0.01232 | measured (ours) |
| GEFCom2014 solar | pinball (norm.) | 0.01308 | published LSTM/quantile NN 0.0143 | published |
| GEFCom2014 wind | pinball (norm.) | 0.04690 (int8 0.04692) | competition benchmark 0.0792 | measured (ours) |
| GEFCom2014 wind | skill vs competition benchmark | +40.8 percent | competition benchmark | measured (ours) |
| GEFCom2014 wind | skill vs diurnal persistence | +47.5 percent | diurnal persistence | measured (ours) |
| GEFCom2014 wind | pinball (norm.) | 0.04690 | our LightGBM quantile baseline 0.04547 | measured (ours) |
| GEFCom2014 wind | pinball (norm.) | 0.04690 | published GAN / normalizing flow / VAE / DDPM | published |

The model wins the official GEFCom2014 benchmark on both tracks, and it beats
the competition benchmark by wide margins (skill +54.1 percent on solar, +40.8 percent on wind).
What it is not is a new raw pinball record. 

On the identical pipeline it ties our own LightGBM
gradient boosted baseline (solar 0.01308 vs 0.01232, wind 0.04690 vs 0.04547). It beats a
published LSTM/quantile NN on solar and a published GAN on wind, sits level with a published
normalizing flow, and lands a few percent behind the best published diffusion model (VAE/DDPM)
on wind. 

So - the accuracy is competitive but with given resources, not chart topping. The real edge is where it delivers
that accuracy: 136,780 and 311,554 parameters, under a megabyte in int8, sub millisecond on a
CPU, running on station with the network gapped - which we feel is a great domain adaptation for our methodologies.

# How to run it

See `quickstart/` for a runnable example. The model loads in a few lines with the bundled
`modeling.py` plus `config.json`, from the safe `safetensors` weight file (no pickle):

```python
from huggingface_hub import hf_hub_download
import modeling  # bundled in this repo

path = hf_hub_download("lowdown-labs/fela-power-grid", "solar.safetensors")
model = modeling.load_model(path, track="solar")

# Preprocess a raw NWP window (shape (6, 20) for solar), then forecast.
x = modeling.preprocess_nwp(raw_window, track="solar")  # validates shape, standardizes
import torch
with torch.no_grad():
    quantiles = model(x)  # (1, 99): the P1..P99 power quantiles for the center forecast hour

# A P10 to P90 band for the center forecast hour:
p10 = quantiles[0, 9].item()
p90 = quantiles[0, 89].item()
print("Center hour P10..P90 (fraction of capacity):", p10, p90)
```

The `modeling.preprocess_nwp` helper standardizes the weather window and validates its
shape (it fails clearly on the wrong shape or units). For an interactive playground, see
the Hugging Face Space linked in this repo.

## Formats

This model is CPU native: no GPU is required to run it, in any format. The fp32 and int8
formats run on a plain CPU.

- fp32: reference and CPU.
- int8: on device deployment format (AVX512-VNNI on x86, NEON dot product on ARM). The
  int8 pinball loss is essentially unchanged (solar 0.01328 vs 0.01308, wind 0.04692 vs
  0.04690), so on device quantization is effectively lossless here.
- bf16: an optional format for server or GPU inference, not required and not the on device
  format. Most commodity ARM and microcontroller CPUs lack native bf16, so use fp32 or int8
  there. You never need a GPU; bf16 is only a convenience when one happens to be present.

## Serving

For serving at scale, use the separate CPU native FELA server (https://github.com/Lowdown-Labs/fela_server). It
runs this model on CPU, with no GPU required. The quickstart in this repo is the minimal
single process path; the FELA server is the production serving path.

# Training data

- GEFCom2014 (Global Energy Forecasting Competition 2014), public competition data
  released with the competition. Used for both training and the held out evaluation, under
  the GEFCom2014 Task 15 protocol described above. Solar and wind tracks. Citation: Hong,
  Pinson, Fan, Zareipour, Troccoli, Hyndman (2016), "Probabilistic energy forecasting:
  Global Energy Forecasting Competition 2014 and beyond," International Journal of
  Forecasting 32(3). The dataset is the public competition release; check the competition
  terms for the exact redistribution conditions before rehosting it.

No proprietary or customer data was used. The model takes only numerical weather
prediction covariates as input.

## Training data, splits and licensing

The training and held out evaluation splits are defined in `train.py` in this repo. A `--smoke`
flag rebuilds the split, asserts the audited held out window count per track, and exits before
training.

- Dataset: GEFCom2014 (Global Energy Forecasting Competition 2014), solar and wind tracks.
  Version: the Task 15 (final task) public release, as distributed with the paper. The solar
  track has 3 zones with 12 NWP predictors; the wind track has 10 zones with 4 NWP predictors.
- Source: the data was released as the appendix of the GEFCom2014 paper and mirrored by the
  competition General Chair at http://blog.drhongtao.com/2017/03/gefcom2014-load-forecasting-data.html
  (and via ScienceDirect, DOI 10.1016/j.ijforecast.2016.02.001). Citation: Hong, Pinson, Fan,
  Zareipour, Troccoli, Hyndman (2016), International Journal of Forecasting 32(3), 896-913.
- Split: GEFCom2014 Task 15 protocol, a fixed calendar held out month, not a random split.
  Solar test month is June 2014 (2014-06-01 01:00 to 2014-07-01 00:00); wind test month is
  December 2013. Training uses all prior data; the test month is forecast from NWP only (no
  test period power, so no autoregressive leakage). The held out and train membership is the
  `is_test` flag defined in `train.py`, and `train.py --smoke` asserts the audited held out
  counts: solar 2154 windows over 3 zones, wind 7390 windows over 10 zones. A 6 percent tail
  of the training rows is held out as a validation set for early stopping (deterministic tail
  slice).
- License: NO license is stated for GEFCom2014. The data is competition data delivered as an
  appendix to a copyrighted (all rights reserved) Elsevier / International Journal of
  Forecasting article; the author distribution page states only a citation requirement, with no
  reuse or commercial use grant. Underlying source data (e.g. ISO New England for the extended
  load track) may carry its own upstream terms, and the distributor warns against combining the
  datasets.
- Commercial verdict: UNCLEAR and UNSTATED. Competition data, no license grant, the highest risk
  of the family. Citation alone is not a commercial use grant. For any commercial or
  redistribution use, obtain written permission from the organizers (Tao Hong / International
  Institute of Forecasters) and verify the upstream source terms first.

# Citations and licenses

This section consolidates the formal references and the direct links to the real license
text for every dataset and method used, verified from source.

## Datasets

- **GEFCom2014 (Global Energy Forecasting Competition 2014)**: solar and wind tracks, the
  Task 15 protocol used for both training and the held out evaluation.
  - Reference: Hong, T., Pinson, P., Fan, S., Zareipour, H., Troccoli, A., & Hyndman, R. J.
    (2016). Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and
    beyond. *International Journal of Forecasting*, 32(3), 896-913.
    DOI: [10.1016/j.ijforecast.2016.02.001](https://doi.org/10.1016/j.ijforecast.2016.02.001)
  - Data and terms: released as the appendix of the paper and mirrored by the competition General
    Chair at
    [blog.drhongtao.com/2017/03/gefcom2014-load-forecasting-data.html](http://blog.drhongtao.com/2017/03/gefcom2014-load-forecasting-data.html).
    The paper itself is (c) Elsevier / International Journal of Forecasting (all rights reserved):
    [ScienceDirect article page](https://www.sciencedirect.com/science/article/pii/S0169207016000133).
  - **License: NO reuse or commercial use grant is stated, COMPETITION TERMS.** The distribution
    page states only a citation requirement; the data is delivered as an appendix to a copyrighted
    Elsevier article, and underlying source data (e.g. ISO New England for the extended load track)
    may carry its own upstream terms. Citation is not a commercial use grant. For any commercial or
    redistribution use, obtain written permission from the organizers (Tao Hong / International
    Institute of Forecasters) and verify the upstream source terms first. See the fuller caveat under
    "Training data, splits and licensing" above.

## Methods and code

- **Fourier Neural Operator (FNO)**: the sequence mixer at the core of both tracks.
  Li, Z., Kovachki, N., Azizzadenesheli, K., Liu, B., Bhattacharya, K., Stuart, A., & Anandkumar, A.
  (2021). Fourier Neural Operator for Parametric Partial Differential Equations. *ICLR*.
  [arXiv:2010.08895](https://arxiv.org/abs/2010.08895)
- **PyTorch**: training and inference framework. Paszke, A., et al. (2019). PyTorch: An
  Imperative Style, High-Performance Deep Learning Library. *NeurIPS*.
  [arXiv:1912.01703](https://arxiv.org/abs/1912.01703)
- **LightGBM**: the reference gradient boosted quantile baseline. Ke, G., et al. (2017).
  LightGBM: A Highly Efficient Gradient Boosting Decision Tree. *NeurIPS*.
  [proceedings](https://papers.nips.cc/paper_files/paper/2017/hash/6449f44a102fde848669bdd9eb6b76fa-Abstract.html)
- **NumPy / SciPy**: used in the data preparation and evaluation pipeline; standard scientific
  Python stack. Harris et al. (2020), [Nature 585, 357-362](https://doi.org/10.1038/s41586-020-2649-2);
  Virtanen et al. (2020), [Nature Methods 17, 261-272](https://doi.org/10.1038/s41592-019-0686-2).
- **ONNX Runtime / TFLite**: the on device export and runtime path.
  [onnxruntime.ai](https://onnxruntime.ai/),
  [ai.google.dev/edge/litert](https://ai.google.dev/edge/litert).

This model does not use Gated Linear Attention, Gated DeltaNet, or Landmark Attention: both
tracks are pure FNO (see `modeling.py` and `train.py`).

# Intended use, limitations, and safety

What it is for:

- Short horizon probabilistic power forecasting at a solar or wind site, driven by a
  numerical weather prediction feed, on station or on device.

What it is not for:

- It is not a single point guarantee of output and not a replacement for a grid operator's
  judgment. The quantile band is a planning aid, not a control signal.
- It is not validated for direct, unsupervised use in a safety critical or
  protection critical control loop. Do not wire its output into automated dispatch,
  protection, or curtailment that affects grid stability without independent validation and
  a human or rule based check in the loop.

Evaluated conditions and known limits:

- Evaluated only on GEFCom2014 (3 solar zones, 10 wind zones) under the Task 15 protocol.
  Performance on other sites, climates, turbine types, or NWP feeds is not characterized
  here and should be validated before operational use.
- The model is a tie with a gradient boosted (LightGBM) baseline on raw accuracy and is a
  few percent behind the best published diffusion/VAE on wind. If raw pinball loss is the
  only thing that matters and device size does not, those baselines are reasonable
  alternatives. The reason to choose this model is the on station, sub megabyte,
  sub millisecond, network gapped deployment.
- A separate test on SDWPF (Baidu KDD Cup 2022), a harder modern wind farm benchmark, did
  not transfer well and is not claimed here. The genuine climate win is GEFCom2014.
- The quantile outputs are calibrated against the GEFCom2014 evaluation only. Verify
  calibration on your own data before relying on the P10 to P90 band for reserve sizing.

Privacy:

- The model runs on station and offline. When deployed on device, the site's operational
  and weather data does not leave the device, so there is no cloud round trip and no data
  shared with Lowdown Labs or any third party.

# How to cite

Model and technical note:

```
@misc{lowdownlabs_grid_renewable,
  title  = {FELA Grid Renewable: on station probabilistic solar and wind power forecasting},
  author = {Lowdown Labs},
  year   = {2026},
  note   = {Model card}
}
```

You must also cite the benchmark dataset and the core libraries:

- Hong, T., Pinson, P., Fan, S., Zareipour, H., Troccoli, A., Hyndman, R. J. (2016).
  Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond.
  International Journal of Forecasting, 32(3), 896 to 913.
- Li, Z., Kovachki, N., Azizzadenesheli, K., Liu, B., Bhattacharya, K., Stuart, A.,
  Anandkumar, A. (2021). Fourier Neural Operator for Parametric Partial Differential
  Equations. International Conference on Learning Representations (ICLR).
- Paszke, A. et al. (2019). PyTorch: An Imperative Style, High-Performance Deep Learning
  Library. NeurIPS.

# Acknowledgements and references

- GEFCom2014: Hong et al. (2016), International Journal of Forecasting 32(3), 896 to 913.
- Fourier Neural Operator: Li et al. (2021), ICLR. The architecture is built on the FNO.
- LightGBM (our reference quantile baseline): Ke, G. et al. (2017). LightGBM: A Highly
  Efficient Gradient Boosting Decision Tree. NeurIPS.
- PyTorch: Paszke et al. (2019), NeurIPS.

# Model family

This is part of the FELA family from Lowdown Labs: one FNO architecture across many
modalities, all CPU native and subquadratic. This repo is published as
`lowdown-labs/fela-power-grid`. The sibling repos are:

- `lowdown-labs/fela-genomics`: DNA sequence classification.
- `lowdown-labs/fela-pdm`: rotating machinery and turbofan health.
- `lowdown-labs/fela-power-grid` (this repo): probabilistic solar and wind power forecasting.
- `lowdown-labs/fela-video`: video moment retrieval and temporal grounding.
- `lowdown-labs/fela-streaming-asr`: streaming CPU speech recognition.

These are grouped under the FELA Collection on Hugging Face. The models are independently
trained per modality and do not share 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.