All models

EEG reconstruction · fp32 profiles

ZUNA1.1 · Core ML

Missing channels, estimated on device.

Zyphra’s ZUNA1.1 on Apple platforms: EEG denoising, missing-channel reconstruction, and spatial superresolution in Core ML.

Open on Hugging Face
Upstream
Zyphra ZUNA1.1 · 380M
Window
5 s at 256 Hz
Precision
fp32 only
Default profile
14 channels, EPOC X layout
License
Apache-2.0
Updated
18 Aug 2026

Overview

ZUNA1.1 is Zyphra’s masked diffusion autoencoder for scalp EEG. Given a subset of channels and their 3D electrode positions, it denoises what was measured, estimates what was not, and can predict signals at new positions on the scalp.

This release brings the pretrained model to Apple platforms as fixed Core ML profiles. The default profile matches the 14-channel Emotiv EPOC X layout, so a consumer headset’s recording can be cleaned and extended on the device that receives it.

Fig. 01 · Illustration

Fourteen electrodes, three missing

ZUNA takes the channels that were recorded, with their 3D positions, and estimates the ones that were not by iterative denoising.

AF3F7F3FC5T7P7O1O2P8T8FC6F4F8AF4
5 s window · 256 Hzstep 20 / 20
F3measured
T7estimated
O2estimated
F4estimated
P8measured
Electrode positions are the real EPOC X layout (MNE standard_1005). The traces are synthetic, drawn to show the task: not recorded EEG and not model output.

How it works

Fig. 02 · Inference

Encode once, denoise N times

  1. 01

    EEG window

    5 s · 256 Hz · C channels

  2. 02

    Tokens

    32 samples each · {x, y, z, t}

  3. 03

    ZunaEncoder

    runs once

  4. 04

    ZunaDecoderStep

    repeated N diffusion steps

  5. 05

    Signal

    denoised and estimated channels

Throughput depends strongly on N. Fewer steps are useful for rapid iteration; more steps improve reconstruction.

Each channel’s five-second window is cut into 40 coarse time tokens of 32 samples. A token’s index carries its electrode position and time, {x, y, z, t}, which is why coordinates are part of the input contract. The encoder runs once; the decoder then denoises a latent over a fixed number of diffusion steps before the tokens are turned back into signal.

Why fp32 only

The original ZUNA runs in fp16: its 14-, 16-, 32- and 64-channel fp16 profiles pass their parity gates. ZUNA1.1 does not. The base model was trained in bf16, and its decoder activations exceed the fp16 range, so no fp16 profile passes parity. Every ZUNA1.1 profile ships in fp32; the 14-channel profile is the default.

A proposed fix for Core ML itself

The port surfaced a bug in coremltools. Its rms_norm translation rescales the input by its maximum before squaring, to protect fp16 on the Neural Engine, but adds epsilon after the rescale. Algebraically the epsilon is inflated by max(|x|)². On spiky activations, which are common in transformer residual streams, that changes outputs by whole percents rather than rounding error, even at fp32 on the CPU.

It was reported as apple/coremltools#2821, with a proposed fix in #2822: rescale epsilon by 1/m², clamp the scale so all-zero rows no longer divide 0 by 0, and add regression tests for both.

Fig. 03 · The bug, in one line

Epsilon, inflated by the rescale

What the conversion computed

rms = √( mean((x / m)²) + ε ) · m = √( mean(x²) + ε · m² )

After the fix

m ← max(m, 1),  ε ← ε / m² ⇒ √( mean(x²) + ε )

m = max |x|. When one activation is much larger than the rest, m² is large and the added term stops being negligible.

Source: the proposed fix in apple/coremltools#2822, commit “Fix rms_norm eps inflation from max-rescale; guard zero input”.

Input contract

Sampling rate
256 Hz
Window
5 seconds, 1,280 samples
Tokens
32 samples each, 40 per channel
Positions
3D electrode coordinates in meters, part of every token
Normalization
Aligned with upstream inference, data_norm = 10
Default profile
14ch-fp32, EPOC X channel order

Know the boundaries

  • Reconstructed and superresolved channels are estimates. Do not present them as measurements.
  • Reconstruction is not decoding. This model does not infer intent, commands, or language.
  • Research and engineering use only. Not validated for diagnosis, treatment, or clinical decisions.
  • Keep the exact preprocessing: the pretrained weights were optimized for it.

About this page

Summarized from the public model card and its published files. Repository updated 18 Aug 2026; reviewed 26 Sep 2026. The Hugging Face card is the source of truth for licenses and current details.

Upstream: Zyphra / ZUNA1.1