Downloads · 30 days
0
SCS-Lab/FUSE29-Pedestal-model
FUSE29-Pedestal-model is a machine learning model from SCS-Lab. Use it for the machine learning task on the model card, and read the license before you ship it in a product. It is set up for onnx. The card lists the license as mit.
A 29-input, 6-layer Mamba-2 state-space model that predicts nine pedestal quantities at ρtor = 0.85 from DIII-D actuator settings, at 20 Hz, with a strictly causal O(1)-per-tick inference path suitable for real-time c…
Downloads · 30 days
0
Access
Public
Updated Sep 3, 2026
Repo size
724 MB
Likes
0
Public
Click a slice to open those files.
.onnx724 MB · 100%
From the Hugging Face model README
A 29-input, 6-layer Mamba-2 state-space model that predicts nine pedestal quantities at ρ_tor = 0.85 from DIII-D actuator settings, at 20 Hz, with a strictly causal O(1)-per-tick inference path suitable for real-time control.
Packaged as two ONNX graphs with normalisation baked in: raw physical units in, physical units out.
| Parameters | 11,254,425 |
| Architecture | Mamba-2 (SSD), 6 layers, d_model 512, d_state 128 |
| Inputs | 29 actuator channels, physical units |
| Outputs | 9 heads, physical units |
| Cadence | 20 Hz (50 ms) |
| Precision | float32 |
| ONNX opset | 17 |
| Step latency | ~2.9 ms/tick, CPU, batch 1 |
| License | MIT |
Predicting pedestal density, temperature, rotation, heights and locations from the actuator request, inside FUSE or an equivalent DIII-D control or analysis pipeline. The step graph is designed for the 50 ms control cycle; the sequence graph is for offline scoring and replay.
Not intended for other machines, other radial locations, or as a safety-critical interlock. It has no uncertainty estimate and no out-of-distribution detector.
pip install numpy onnxruntime
from fuse29.runtime import Fuse29Predictor
predictor = Fuse29Predictor.from_pretrained("SCS-Lab/FUSE29-Pedestal-model") # loads seed 0
state = predictor.init_state()
for actuators in shot: # (29,) float32, raw physical units
out, state = predictor.step(actuators, state)
if out.is_hmode:
print(out.ne, out.te_ped, out.neped_prmtan)
Or straight from onnxruntime, with no Python package — the full contract is
about fifteen lines and is written out in docs/ONNX.md.
Per seed (s0/ … s7/):
| File | |
|---|---|
fuse29_step.onnx | one 50 ms tick, carries state, no length limit |
fuse29_seq.onnx | whole shot at a fixed 256 ticks |
model_config.json | I/O contract: names, order, units, sources, shapes |
norms.json | the statistics baked into the graphs |
actuator_ranges.json | training-split distribution, for checking your units |
provenance.json | source checkpoint SHA-256, library versions, artefact hashes |
Plus manifest.json at the root. Seed 0 is the champion and the default.
29 DIII-D actuator channels in raw physical units: beam power (MW) and torque,
ECH power, the eighteen shaping F-coil currents (A), both E-coil currents (A),
five gas valve flows (Torr·L/s), and the toroidal field (T). Order is
load-bearing; see docs/IO_CONTRACT.md.
pohm, ip and ipspr15v are deliberately excluded — they are plasma
responses, not commands, and a model predicting the response must not be
handed it.
| # | Head | Units |
|---|---|---|
| 0 | ne | 10¹⁹ m⁻³ |
| 1 | te_ped | keV |
| 2 | ti_ped | keV |
| 3 | t_rot_ped | krad/s |
| 4 | neped_prmtan * | 10¹⁹ m⁻³ |
| 5 | teped_prmtan * | keV |
| 6 | rho_sym * | ρ_tor |
| 7 | ne_top_loc * | ρ_tor |
| 8 | hmode | probability |
* H-mode only. See the limitations below.
Seed 0, scored with the exported ONNX graph on 4087 held-out shots. Median of per-shot RMSE:
| Head | Median per-shot RMSE | Units |
|---|---|---|
ne | 0.3057 | 10¹⁹ m⁻³ |
te_ped | 0.0605 | keV |
ti_ped | 0.1065 | keV |
t_rot_ped | 4.1497 | krad/s |
neped_prmtan * | 0.3950 | 10¹⁹ m⁻³ |
teped_prmtan * | 0.0783 | keV |
rho_sym * | 0.0113 | ρ_tor |
ne_top_loc * | 0.0134 | ρ_tor |
hmode | 0.9443 accuracy, 0.9476 F1 | — |
ONNX-vs-PyTorch parity is within 2.5e-05 of a head's training standard
deviation across all eight seeds and both graphs. Full protocol:
docs/VALIDATION.md.
~40 900 DIII-D shots, 20 Hz, labels as trailing-bin means with empty bins masked rather than filled. Stratified random 80/10/10 split (seed 20260829). AdamW, lr 2e-4, cosine schedule, 25 epochs, batch 128. Checkpoint selected on lowest total validation loss across all nine heads.
Eight seeds are published; they differ only in weight initialisation and data
ordering. Full recipe in docs/TRAINING.md.
neped_prmtan, teped_prmtan,
rho_sym and ne_top_loc were trained only on H-mode ticks. The graph
emits them unconditionally anyway. You must gate on the model's own hmode
output, which is ~94% accurate with errors concentrated at L–H transitions.
See docs/GATING.md.fuse29_s*)
could not see pinj because a corrupted shot set the divisor to 194 MW.
These weights were retrained against winsorised actuator statistics; a
half-range pinj swing now moves ne by 0.79. Isolated sweeps are not a
real power scan — other actuators stay at recorded values. See
docs/LIMITATIONS.md.pinj is MW, not W. A unit error produces
confident nonsense rather than an exception; run
predictor.check_units(shot) once during integration.Full discussion in docs/LIMITATIONS.md.