Battery backup units (BBU) for AI data centers · LFP + LIC hybrid storage × digital twin

Peaks and swings go to the capacitors.

AI rack power swings constantly, and when utility power fails, each backup battery has to carry a peak of about 6C instantly. HyperBuffer lets a lithium-ion capacitor (LIC) bank absorb the peaks and transients first, leaves the LFP battery to deliver steady output, and uses a digital twin to predict each unit's remaining useful life.

2.66%
Rack depth of discharge over a 60 s outage
8 BBUs in parallel · simulated
43/43
Cross-checks, all passing
$ make verify
2nd
23rd ATCC national final
2026.07

2.66 is read at load time from rack_60s_graceful.json (stats.dod_pct) · 43 is the number of XCHECK assertions (output of scripts/check_whitepaper_numbers.py, not saved as JSON)

Scroll down to take it apart

01The problem

Swings and peaksshouldn't all hit the battery.

Backup power in AI data centers faces three problems at once. They span electrochemistry, power electronics and machine learning, which makes integration expensive.

  1. 01

    Second-scale power swings + outage peaks

    The power draw of AI training racks oscillates at 0.2–3 Hz (Choukse et al. 2025, arXiv 2508.14318 §III-A); when utility power fails, each BBU has to carry a peak of about 6C instantly.Under ORv3, BBUs do not discharge in normal operation. Using the hybrid topology to smooth power while utility power is available is a next step, not a result this project has verified.

  2. 02

    48 V → ±400 V HVDC transition

    Data center power distribution is moving to a new generation; after 2027, installed BBUs will need to be replaced in bulk.

  3. 03

    Fleets of thousands of units

    Operators run BBUs by the thousand, yet there is no per-unit remaining useful life (RUL) prediction.

Same load, two BBUs. Thin lines mark each upward load step: at that same instant, the battery-only cell voltage drops. Hover over the chart to read the values at any moment.
Load power P_LOADBattery-only BBUHyperBuffer (LFP + LIC)
Cell voltage, steady-state peak-to-peak61.6 → 17.5 mV
Battery-side power std. dev. · ~5.7×, illustrative value over the full 10 s window24.0 → 4.2 kW
Load waveform · custom illustrative waveform56 ↔ 104 kW · switches every 100 ms

How to read this ratio. The ~5.7× is an illustrative value computed over the full 0–10 s window, including the filter's start-up transient; it is neither an upper bound nor a lifetime multiplier. The frequency response is the more accurate guide: with τ = 0.5 s the cutoff frequency is 0.318 Hz, and at 1 Hz the LFP still carries about 30% of the swing; at 0.2–0.25 Hz (the low end of the Choukse 2025 main band) almost nothing is diverted, and the LFP still carries 96–99% of the peak-to-peak. See self-audit A1

Data: transient_lfp_only / _hybrid.json (PyBaMM DFN; stats.v_cell_pp_stable over the 4–6 s steady-state window, p_lfp_std_kw) · all simulated · with the DC-DC current loop included (bandwidth assumed at 26–42 Hz), the power std. dev. falls by about 3.1–3.9×; the earlier "voltage peak-to-peak 2.4–3.2×" could not be reproduced and has been withdrawn · Audit: docs/audit/A1-frequency.md, A2-power-electronics.md

02Live simulation · transient_hybrid.json

Hybrid storage, live simulation

  1. 01 / 04

    The load jumps
    every 100 ms.

    AI rack power switches back and forth between 56 and 104 kW, once every 100 ms.

  2. 02 / 04

    Capacitors
    catch the spikes first.

    The LIC delivers up to 47.5 kW instantly; when the load drops back, the battery slowly recharges it.

  3. 03 / 04

    The battery only
    holds steady.

    The LFP sees only the filtered average power and settles steadily around 80 kW.

  4. 04 / 04

    τ = 0.5 s
    splits high from low.

    A first-order complementary filter allocates power in a 1 kHz control loop. What you see is the actual output of the PyBaMM simulation (slowed down).

P_LOAD load—kW
P_LIC bank—kW—
P_LFP battery—kWV_cell — V
Isometric view: the LFP battery on the left (cutaway showing electrodes and charge level), the LIC bank in the middle and the AI rack on the right, connected by busbars on the base plate. During load spikes the LIC glows green and energy particles flow to the rack; the LFP delivers steady output.
00.000 s
PyBaMM 26.4.1 DFN · 10 s / 800 points · slow motion · all simulated, not measured on hardware

03Frequency split

One τ decideswho carries what.

Load power first passes through a first-order low-pass filter: the low frequencies go to the LFP, and the LIC absorbs the remaining high frequencies. Drag τ to see how the power each side receives changes.

τ0.50 s

Adopted value · same control law as the PyBaMM simulation

Cutoff frequency fc = 1/(2πτ)
0.32 Hz
LFP steady-state ripple (peak-to-peak)
4.7 kW
LIC peak power
47.1 kW
LIC energy swing
13.5 kJ

P_LFP[n] = P_LFP[n−1] + Δt/(τ+Δt)·(P_LOAD[n] − P_LFP[n−1])
P_LIC[n] = P_LOAD[n] − P_LFP[n]

P_LOADP_LFP (computed in browser)P_LIC (computed in browser)PyBaMM P_LFP (τ = 0.5 s)

—

Data: transient_hybrid.json (series.p_total_kw, series.p_lfp_kw) · ripple = mean peak-to-peak per 200 ms period for t ≥ 5 s; LIC peak and energy swing taken over the full 10 s · curves for τ ≠ 0.5 s are illustrative, computed live in the browser with the same control law; they are not PyBaMM simulation results

0460 s outage · all simulated

60 s without power,
eight units carry the rack.

8 BBUs in parallel, 2.5 kWh each. The load first surges to 120 kW, then ramps down to 30 kW continuous within 1.5 s. Switch to N−1 to see how the remaining 7 units share the load after one is pulled at t = 15 s.

P_RACK load
—kW
Peak hold
P_LIC bank
—kW
Standby
C-rate per unit
—C
8 units running
Cell temperature
—°C
Alarm 50°C
Isometric view: a BBU cabinet holding 8 BBU drawers, with the LIC bank on top. During playback each unit's load bar follows the data; in the N−1 scenario one unit goes offline at 15 s.
    00.0 / 60 s
    2.66%Rack depth of discharge (simulated)
    1912.5 kJ / 72000 kJ
    37.6×Energy headroom
    25.1°CPeak cell temperature
    alarm threshold 50°C
    1.71CPer-unit continuous after N−1
    +14.3%, limit 2.5C

    Timeline 0–3 s zoomed · per-unit depth of discharge is computed in the browser by integrating P_LFP · all simulated. Data: rack_60s_graceful.json (stats.dod_pct, energy_headroom_ratio, t_cell_max_c, stages) · rack_n_minus_1.json (stats.c_rate_continuous_post_fault, c_rate_post_increase_pct, pass_criteria; fault_injection.fault_time_s) · the unit shown going offline is BBU-8; the data does not specify which unit

    05AI lifetime prediction

    Predict the lifetime,and say how unsure it is.

    A temporal convolutional network (TCN) predicts remaining useful life from each cell's cycling features, and split conformal calibrates a 90% prediction interval. We show both where it is accurate and where it is not.

    Train 114 + calibration 37 cellsTest 37 cellsSynthetic BBU duty (subset)Predicted = actual

    Data: model_validation.json (predicted_vs_actual, 188 entries; metrics; uncertainty; model.n_parameters) · log scale, unit: cycles

    Self-audit · 2026-10-09 · how to read the numbers in this chart 18.15% comes from a single split and a single seed, and early stopping looked at the test set.
    TCN · leak-free, 10 seeds
    28.2% median
    bagged-GBT · same splits
    14.4% · wins 10/10
    conformal 90% · new batch
    39.8% coverage

    With early stopping on a separate validation set and 10 seeds, the TCN's median is 28.2%, and 3 seeds exceed 60%; on the same splits, bagged-GBT reaches 14.4 ± 1.9% and beats the TCN on every seed. The conformal 90% interval holds only in-distribution (91.6% in-distribution; on an entire unseen batch, Severson b3, it falls to 39.8%). Accuracy claims rest on the GBT. The TCN is kept solely because it supports full static INT8 quantization; it serves only as a deployment-pipeline demo.

    scripts/audit/ml_e1_tcn_multiseed.py → data/processed/audit/ml_e1_tcn_multiseed.json · docs/audit/A3-ml-rigor.md
    MODELTCN · 31,281 parameters4 dilated conv layers · input 99 × 7 features
    TEST · n = 37MAPE 18.15% · R² 0.892random 60/20/20 split · single seed (seed 42) · FP32 · audit below the scatter plot
    90% prediction interval · median width (cycles)
    MC-Dropout, raw2,697
    Split conformal1,359
    Test-set coverage 100% (37 cells, in-distribution)
    LATENCYp99 0.098 mslaptop CPU · ONNX Runtime · not yet measured on an edge NPU
    V5 · publicly disclosed · bagged-GBT baselineWhen the baseline model is applied to BBU duty, its error rises from 9.04% to 80.20%.

    V5 tests the bagged-GBT baseline trained on Severson lab cycling conditions, not the TCN above. The sharp rise in error when the baseline is applied directly to BBU duty quantifies the gap between operating conditions. This is currently the largest known limitation.

    severson_transfer_mape.json:5, :31-32

    06System architecture

    Five layers,one verification chain.

    From the electrochemical model to the fleet dashboard, each layer's output is the next layer's input, and each layer has a matching verification gate that can be re-run. Layers that do not have a gate yet are labeled plainly as concept design or simulated data.

    SYSTEM MAP · click any layer or verification node for details
    • Implemented
    • Simulated data
    • Concept design
    • Data flow
      VERIFY CHAINVerification gate for each layer ● pass ● publicly disclosed
      $ make verify 0/43PASS

      All numbers are taken from the project's data files and the technical report; edge inference is a concept design, and the fleet data is simulated.

      07Verification and limitations

      If it can be re-run,it counts.

      A single command, make verify, re-runs V1–V5, V8 and XCHECK (V1 needs a separate download of about 8.3 GB of data); V7 is a standalone script. Anyone with the repo can re-run it, and can also see what we have not done yet.

        $ make verify
        0/43PASS

        All cross-checks passfull run 6/6, V1 skipped · 55.2 s (verify_all_report.json) · XCHECK 43/43 (README.md:70)

        Honest limitations

        1. No physical hardware prototype. The 8S test unit was returned on 2026-05-27, so the project is currently a digital twin only; hardware waveform measurements, closed-loop power-electronics validation and UL 9540 / 9540A testing have not been done yet.README.md:14 · technical report:82, :120
        2. The firmware is only a skeleton. The STM32 firmware is a skeleton; the Python simulator is the reference for the control law.firmware/stm32_hybrid_control/README.md:14
        3. The fleet data is simulated. All 1000 devices and sites are synthetic; the dashboard carries a full-page disclaimer, and the fleet-data panels carry a simulation watermark.fleet_devices.json → disclaimer
        4. Large cross-duty transfer error. V5 (bagged-GBT baseline): MAPE rises from 9.04% to 80.20%, so the model cannot yet be applied directly to field BBU data.severson_transfer_mape.json:5, :31-32
        5. Edge inference not yet measured. The STM32N6 NPU is a concept design; the only measured latency so far comes from a laptop CPU.model_validation.json → latency · README.md:390

        08Self-audit · 2026-10-09

        Before the oral defense,I turned the same chainon my own claims.

        The technical report has been submitted and will not be changed. After submitting it, I put the headline numbers from the competition back through the same verification chain: re-run them, change the protocol, look for counterexamples. The five items below are claims that needed correcting. Each one lists what was originally said, what the audit measured, and what is said now. All of it is recomputation on simulations or public datasets, with the assumptions written under each item.

        1. A1 · Frequency domain

          What 5.7× means

          Definition corrected

          5.7× upper boundfc 0.318 Hz

          Original claim

          LFP power fluctuation reduced 5.7×, written up as an "ideal lossless upper bound"; a code comment attributed the ±30%, 100 ms-switching demo waveform to Choukse 2025.

          → Audit finding

          5.7× is the std-dev ratio over the full 0–10 s window, which includes the filter's start-up transient. In steady state the same waveform gives 17.2×, and a clean square wave over a long window gives 17.4× (analytical 17.36×), so it is not an upper bound. Choukse 2025 reports no ±30% or 100 ms swing; its main band is 0.2–3 Hz. At 0.2–0.25 Hz with τ = 0.5 s, the LFP still carries 96–99% of the peak-to-peak.

          → Current claim

          5.7× is used only as an "illustrative value over the full 10 s window"; its definition is flawed, so the explanation now uses the frequency response: with τ = 0.5 s the cutoff frequency is 0.318 Hz. Covering 0.2 Hz would require τ of about 5 s, which lowers the LFP share to about 25% and raises the LIC energy swing to about 103 kJ.

          Assumptions Choukse-style waveform is assumed: 120 kW rack, 30% TDP during communication phases, 50% duty square wave; the LIC energy estimate does not account for ESR losses or the UVLO floorscripts/audit/a1_freq_split_audit.py · a1_dfn_cases.py

        2. A2 · Power electronics

          The ratio with DC-DC included

          Partly withdrawn

          2.4–3.9×3.1–3.9×power only

          Original claim

          With DC-DC included, typically about 2.4–3.9×, of which voltage peak-to-peak 2.4–3.2×. This range was an estimate from the post-competition review, with no corresponding script.

          → Audit finding

          After adding an average-value model of the bidirectional DC-DC, cutting the power std. dev. by 3.1× and 3.9× requires current-loop bandwidths of about 26 Hz and 42 Hz respectively. With loop bandwidth ≤ 1 kHz, the voltage peak-to-peak ratio is below 1 in every case (0.55–0.57), worse than having no LIC at all; the claim could not be reproduced.

          → Current claim

          Only the power ratio, 3.1–3.9×, is stated, together with the assumed loop bandwidth of 26–42 Hz; the voltage half is withdrawn. High frequencies also depend on the loop: a 200 Hz waveform needs about 340 Hz of bandwidth to reach 1.5×.

          Assumptions Average-value model: first-order current loop, 50 µs control delay, η 0.95, no bulk bus capacitance, ideal square wave; all assumedscripts/audit/a2_dcdc_average_model.py

        3. A2 · Spec limits

          Capacitor out of spec

          Out of spec · redesigned

          51.3 V13S3P39 LIC cells recommended

          Original claim

          The LIC parameters were anchored to the Eaton XLR-48R6167-R, and the simulation set the full-charge voltage at 51.3 V. That part is actually an EDLC, which was disclosed after the competition.

          → Audit finding

          Module terminal voltage peaks at 51.81 V, above the 48.6 V spec limit, in all three scenarios. Under the 5 Hz demo waveform, RMS current per module is 233 A, 2.7 times the 86 A continuous rating; the 463–877 A peaks stay within the 2200 A 1-second peak rating.

          → Current claim

          Recomputed with 3300 F-class LIC cells: recommended 13 in series, 3 in parallel, 39 cells in total (minimum feasible 36; the recommended value additionally requires a voltage-reference feasible window ≥ 0.2 V/cell), with a midpoint of about 3.5 V/cell. With the DC-DC limited to 60 kW, the recommendation is 14 in series, 2 in parallel, 28 cells (minimum 26). What sets the size is per-cell peak current and ESR voltage drop, not energy.

          Assumptions LIC cell parameters are provisional values from a 2012 prototype, not a production datasheet; Eaton's 86 A / 2200 A figures come only from an excerpt on its websitescripts/audit/a2_spec_bounds_lic_sizing.py

        4. A3 · ML method

          The Severson headline

          Headline revised down

          8.38%12.69%nested selection

          Original claim

          MAPE 8.38% on the Severson dataset, "better than" the paper's 9.1%.

          → Audit finding

          8.38% reproduces digit for digit, but it is the minimum of 24 "filter × model" combinations compared on the test set, and it used a cycle_life ≥ 400 filter. With nested selection (settings chosen only by cross-validation within the training data), the median under the paper's filter (≥ 200) is 12.69%; the ≥ 400 filter gives 9.47%, but that test population has already excluded the shortest-lived cells.

          → Current claim

          Under the paper's filter condition, we did not beat the paper. The headline now cites the nested-selection 12.69% (median over 10 seeds).

          Assumptions Random 70/30 split, 10 seeds; the paper's fixed split was not reproduced, so the two cannot be ranked directlyscripts/audit/ml_e3_severson_nested.py

        5. A3 · ML method

          The TCN lifetime model

          Model demoted

          18.15%28.2%GBT 14.4%

          Original claim

          TCN test MAPE 18.15%, with a conformal-calibrated 90% prediction interval.

          → Audit finding

          18.15% is a single split and a single seed, and early stopping also looked at the test set. With a separate validation set and 10 seeds: median 28.2%, with 3 seeds above 60%; bagged-GBT on the same splits gets 14.4 ± 1.9% and wins on all 10 seeds. Conformal coverage is 91.6% in-distribution, but only 39.8% when the whole test batch is swapped for Severson b3.

          → Current claim

          Accuracy claims rest on the GBT. The only reason to keep the TCN is its deployment format (it supports full static INT8 quantization); it serves only as a deployment-pipeline demo. The conformal interval is claimed to hold only in-distribution; a new batch must be recalibrated with field data.

          Assumptions 37 test cells per seed; the BBU cells among them are synthetic, with labels and features from the same generator, so they do not represent real BBU accuracyscripts/audit/ml_e1_tcn_multiseed.py

        There is also A4: a comparison against public component-level prices and public competitor specs. It only estimates the order of magnitude of component prices, is not a production quote, and appears only in the documents. The scripts, output JSON and figures for all four audits are in the repo, each with a re-run command. The audit did not change any existing simulated value: the simulated numbers in the sections above stay as they were, and what changed is how they are described.

        09Go deeper

        Want more?Open the twin.

        The links below open in a new window. All device data in the dashboard is simulated.