Time Series Forecasting
Transformers
Safetensors
fela_grid_renewable
feature-extraction
fela
fourier-neural-operator
fno
cpu
on-device
energy-forecasting
solar-power
wind-power
probabilistic-forecasting
quantile-regression
custom_code
Instructions to use lowdown-labs/fela-power-grid with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use lowdown-labs/fela-power-grid with Transformers:
# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("lowdown-labs/fela-power-grid", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
| 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. | |