Downloads · 30 days
41
100% of all-time downloads
idle-intelligence/t0-beta-q4_0-webgpu
t0-beta-q4_0-webgpu is a time series forecasting model from idle-intelligence. Use it for the time series forecasting task on the model card, and read the license before you ship it in a product. The card lists the license as apache-2.0.
Q40-quantized weights for theforecastingcompany/t0-beta, packaged for client-side browser forecasting via WASM + WebGPU.
Downloads · 30 days
41
100% of all-time downloads
All-time downloads
41
Public
Repo size
149 MB
Likes
0
Public
Click a slice to open those files.
.gguf149 MB · 100%
From the Hugging Face model README
Q4_0-quantized weights for theforecastingcompany/t0-beta, packaged for client-side browser forecasting via WASM + WebGPU.
Runs entirely in the browser, no server required. Probabilistic multi-horizon time-series forecasting, 256M parameters, smallest/fastest quant in this release.
You trade more accuracy than on t0-alpha for a much smaller file: 149.5 MB, 0.14x the F32 weights. Point drift worst-case against our F32 reference is 14.6%, looser than t0-alpha's own Q4_0 (8.4%) and looser than either quant level of this checkpoint should be for production use. There is no full-97-config GIFT-Eval run for t0-beta at any quant level, only the 8-config subset below. Use Q8_0 for this checkpoint unless file size is the binding constraint.
| File | Size | Description |
|---|---|---|
t0-beta-q4_0.gguf | 149.5 MB | Forecasting transformer weights (Q4_0 quantized) |
config.json | <1 KB | Model architecture and quantile-level configuration |
These weights are consumed by t0-web, a Rust/WASM + WebGPU forecasting engine built with Burn.
await t0wasm.initBackend();
const modelBuf = await fetch('t0-beta-q4_0.gguf').then(r => r.arrayBuffer());
const model = t0wasm.T0Wasm.load(new Uint8Array(modelBuf));
const context = series.slice(-512);
const quantiles = await model.forecast(context, 32);
Weights are fetched from this repo and cached by the browser.
Series → patches of 32 (96-vector each)
→ 24 transformer blocks [WASM, WebGPU] → time and group attention, embed 1024
→ 32-step quantile decoder → 21 quantile levels
→ autoregressive rollout for longer horizons
| quant | mean drift worst % | point drift worst % |
|---|---|---|
| this Q4_0 | 2.55 | 14.58 |
| Official published t0-beta INT8 card | 0.23 | 9.39 |
Q4_0's point drift exceeds the official published INT8 card's on this checkpoint. Wider embed_dim (1024 vs t0-alpha's 512) gives Q8_0's per-channel blocks more values to average error over, but Q4_0's fixed 32-value block granularity does not scale with that width the same way.
| f32 (original weights) | this Q4_0 | |
|---|---|---|
| CRPS (aggregate, 8 configs) | 0.0749 | 0.0752 |
| MASE (aggregate, 8 configs) | 1.0522 | 1.0552 |
Within 0.4% relative of the f32 reference on this small subset, a looser signal than the drift table above. This 8-config subset is not comparable to the published 97-config headline numbers (CRPS 0.4738 / MASE 0.6865); no full-97-config run exists for this checkpoint.
| quant | single (ms/signal) | batch-24 (ms/signal) |
|---|---|---|
| this Q4_0 | 145.3 | 54.5 |
Measured with t0-fast on raw wgpu/Apple Metal, context 512, horizon 32. No headless-Chromium browser run exists for t0-beta; do not read this as a browser latency figure.
attention.wQKV.weight, attention.wO.weight, mlp.0.weight, mlp.2.weight per layer; norms, embeddings, biases, and the quantile head kept at f16Weights-only quantization using standard GGUF Q4_0 blocks (32 values per block, fp16 scale), in ggml-compatible layout, dequantized on-GPU inside the WGSL matmul with F32 compute. Exported from the F32 safetensors by t0-web's own packer. The F32 path itself matches the PyTorch reference to 3.2e-6 max-abs.
@misc{tfc-t0,
title = {t0: A time-series forecasting foundation model},
author = {The Forecasting Company},
year = {2026},
url = {https://huggingface.co/theforecastingcompany/t0-beta},
}
This is an independent port by ilnmtlbnm@idle-intelligence, not affiliated with or endorsed by The Forecasting Company. Forecast values may differ slightly from the original PyTorch implementation due to quantization.