What fits, and what does not#

Everything on this page was measured, not estimated, and everything here can be reproduced with the commands the documentation gives. It exists because a buyer’s first questions are “does it run on my hardware” and “where is it slower” — and the honest answer is more useful than a brochure.

Model size against the card#

Card

The largest model that runs

Memory

Loading

6 GB

3B in mx8

3.15 GB

13.5 s

6 GB

3B in mx16

does not fit (5.77 GB at the peak)

—

6 GB

8B in any format

does not fit — 7.7 GB are needed

—

16 GB

8B in mx8

~4 GB

to be measured on a rented card

24 GB

8B in mx16, 14B in mx8

~8 GB

to be measured on a rented card

What does not fit in one card is not a dead end: it is what the cluster is for. An 8B split across two machines runs at 6.8 tokens/s and gives the same bits as a single machine — the split costs speed, never correctness.

The two “to be measured” rows are honest about being open: the machine this was developed on has 6 GB, and the continuous integration runs on a virtual M1. The plan for those classes is written down in the repository.

Where we are not the fastest#

Against

Distance

Why

PyTorch with CUDA, exact arithmetic, one card

1.70× faster

tensor cores cannot be used without changing the bits

cuBLAS int8

we are ahead (21.2 against 19.2 TOPS on the same card)

integer matrix products are exact by construction

Mojo / MAX on Apple Silicon

they reach the matrix units natively; we reach them with f16 arithmetic only

their compiler emits Metal directly; WebGPU does not expose the exact path

llama.cpp

comparable on the MX formats

different formats, both quantized

None of this is a rounding error, and none of it is hidden: the number that matters for a customer is whether the result can be defended, and that is the one we optimise.

Where another stack is the better choice#

If the goal is the shortest training run, the answer is a CUDA stack with tensor cores: this engine deliberately gives up 15% to 40% of throughput (and much more in half precision) to keep every value identical on every device.

If you already run Mojo, PyTorch or a closed simulator and need to defend its number, the answer is the other way round: keep your stack and certify its output. The certify command recomputes the same program here and reports the difference in ULP — identical, or how many values and how far — in a receipt that can be signed.

What is not supported yet#

Status

AMD GPUs

not tested on real hardware; the conformance kit is ready to run on one

Windows

runs (DX12 through WARP in the integration); not tested on a discrete GPU

f16 and bf16 arithmetic

deliberately not used: they would break the identical bits between vendors

float64

not available on the GPU (the shader language has no float64)

Tensor units on Apple Silicon

reachable only with f16 arithmetic, which is a different contract

Large-model training

not the goal: training is for small models and fine-tuning, where the receipt matters

Model families

Llama, Qwen and Mistral-shaped decoders, and GGUF files of those

How to check any of this on your own machine#

vision devices                        # what the machine offers
vision variants --device 0            # which paths this device takes, and why
vision conformance                    # 60 checks against the frozen signatures
vision certify result.npy --program heat.vis --device numpy

The conformance kit is the one that answers “will my hardware give the same bits”: it compares this machine with the reference signatures, and a difference is a finding, not a failure of the kit.