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 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)
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.
- 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.
- 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.
- 03
Fleets of thousands of units
Operators run BBUs by the thousand, yet there is no per-unit remaining useful life (RUL) prediction.
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
- 01 / 04
The load jumps
every 100 ms.AI rack power switches back and forth between 56 and 104 kW, once every 100 ms.
- 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.
- 03 / 04
The battery only
holds steady.The LFP sees only the filtered average power and settles steadily around 80 kW.
- 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).
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.
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]
—
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
1912.5 kJ / 72000 kJ
alarm threshold 50°C
+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.
Data: model_validation.json (predicted_vs_actual, 188 entries; metrics; uncertainty; model.n_parameters) · log scale, unit: cycles
- 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.mdV5 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-3206System 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.
- Implemented
- Simulated data
- Concept design
- Data flow
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.
All cross-checks passfull run 6/6, V1 skipped · 55.2 s (verify_all_report.json) · XCHECK 43/43 (README.md:70)
Honest limitations
- 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
- 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
- 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
- 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
- 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.
-
A1 · Frequency domain
What 5.7× means
Definition corrected5.7× upper bound→fc 0.318 HzOriginal claimLFP 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 finding5.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 claim5.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
-
A2 · Power electronics
The ratio with DC-DC included
Partly withdrawn2.4–3.9×→3.1–3.9×power onlyOriginal claimWith 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 findingAfter 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 claimOnly 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
-
A2 · Spec limits
Capacitor out of spec
Out of spec · redesigned51.3 V→13S3P39 LIC cells recommendedOriginal claimThe 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 findingModule 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 claimRecomputed 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
-
A3 · ML method
The Severson headline
Headline revised down8.38%→12.69%nested selectionOriginal claimMAPE 8.38% on the Severson dataset, "better than" the paper's 9.1%.
→ Audit finding8.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 claimUnder 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
-
A3 · ML method
The TCN lifetime model
Model demoted18.15%→28.2%GBT 14.4%Original claimTCN test MAPE 18.15%, with a conformal-calibrated 90% prediction interval.
→ Audit finding18.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 claimAccuracy 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.
- /twinDigital twinFull interactive pages for transients, outage, N−1, aging and model validation
- /dashboardFleet dashboardHealth and replacement queue for 1000 BBUs · simulated data
- GitHubSource code and verification chainClone it and run make verify to re-run V1–V5, V8 and XCHECK; V7 is a standalone script