QaaS: Neural States on TPU
Last updated · 14 min read · ZKSF team
A neural network quantum state represents a wavefunction as a neural network and trains it by variational Monte Carlo. The idea is about a decade old and it has become a serious classical competitor in one specific place: states whose entanglement does not follow an area law, where tensor networks stop being efficient. That is also, not coincidentally, the regime where quantum advantage is usually argued for.
It is worth being clear about which direction this runs in, because the two are easy to confuse. Quantum machine learning puts a quantum circuit inside a machine learning model, as a trainable layer. This is the mirror image: a machine learning model standing in for the quantum state itself, with no circuit anywhere. Same two fields, opposite directions, and completely different claims.
The method has one persistent gap, and it is the reason this post exists. Results from neural quantum states are almost always published as a number. An energy, a comparison against a reference where one happens to exist, and nothing that says how wrong the number could be when no reference exists. For a method whose entire purpose is reaching where you cannot check, that is the wrong thing to omit.
It is also unnecessary, and that is the interesting part. The bound is already being computed.
The quantity you are already measuring
Variational Monte Carlo works by sampling configurations from the trial state and averaging a local energy over them. You get the mean, which is your energy estimate. You also get, for free and from the same samples, the variance of that local energy.
The variance is not a diagnostic. It is the bound. An exact eigenstate has zero energy variance, because every configuration returns the same local energy. A state that is not an eigenstate has variance in proportion to how far from one it is, and that relationship is an inequality rather than an intuition.
So the accuracy statement costs nothing beyond the run itself. It cannot be omitted for reasons of expense, because there is no expense. It falls out of the sampling you already did.
Two figures, and they are not equally strong
What comes out is a ceiling and a floor, and the most important thing we can tell you about them is that they are not the same kind of statement.
The ceiling is unconditional. The variational principle says the expectation value of the Hamiltonian in any normalised state is at or above the true ground-state energy. Any state, any parameters, converged or not. So the measured energy, widened by the sampling error on the mean, is an upper bound on the ground state and nothing about the optimiser's behaviour can break it.
The floor is conditional, and it rests on Weinstein's inequality: given the energy and its variance, the nearest eigenvalue lies within a computable distance. Weinstein's bound holds while the trial state is closer to the ground state than to the first excited state. A run cannot check that about itself. If the optimiser settled into an excited basin, the arithmetic is still valid and it brackets the wrong level.
This is why we report them separately rather than as one symmetric interval. Flattening them into a single error bar would hide the fact that one half is a theorem and the other half is a theorem plus an assumption you cannot verify from inside the run.
What the restarts are for, and what they are not
The evidence for the floor's assumption is independent restarts. Run the optimisation several times from different random initialisations and see whether they agree. Agreement is evidence they found the same basin.
It is evidence, not proof, and we can put a number on how good the evidence is. Across 140 measured runs during development, restart agreement caught most cases where the floor would have been wrong, and missed two. Both misses were at a vanishing spectral gap, which is exactly where you would expect the assumption to fail and exactly where the diagnostic is least able to see it. The restarts ship with the result so you can weigh that yourself rather than take our word for it.
In the same 140 runs, the ceiling was violated zero times. That asymmetry is the whole design.
A run where the estimate was wrong and the bound was right
The clearest case we have is a production run from 12 September 2026, on an 8-spin transverse-field Ising ring, on a Google Cloud TPU v5e. 60.4 seconds of variational Monte Carlo.
ceiling -10.2499758 <- the certified claim
point estimate -10.2522907
exact ground state -10.2516623 <- computed independently, same machine
energy variance 5.53e-04
restarts 3 of 3 agreed, spread 1.1e-03
R-hat 1.0014Look at the middle row. The point estimate came out below the true ground-state energy, by 0.00063. The variational principle forbids the real expectation value from being there. What is allowed to be there is a Monte Carlo *mean* of a finite sample, and 0.00063 is 1.4 standard errors of this one's sampling noise. Nothing is broken; the estimate is a random variable and it landed on the low side.
But consider what that means for publishing. If we certified the point estimate, we would have shipped a number that contradicts the principle we sell. The ceiling carries the sampling noise inside it by construction, and the ceiling sits above the exact answer where it must. The certificate is correct precisely where the headline number is not. That certificate is public.
This is not a subtle statistical footnote. It is the reason to certify a bound rather than a value, and it is a thing you can only see when you have an exact reference to check against, which is to say in the regime where you do not need the method.
Three failures worth knowing about
Zero variance identifies an eigenstate, not the ground state. A run that settles onto an excited level reports near-zero variance and a tight, confident interval around the wrong energy. It looks like the best result you have ever seen. We reproduced this from three independent causes while building the engine. It is the single most misleading output the method can produce, and it is why the floor is labelled conditional in the certificate rather than in a footnote.
Unmixed Markov chains break the guarantee itself, not just the precision. This one surprised us. If the sampler has not mixed, the reported mean is not an expectation value under the state's own distribution at all. The variational principle says nothing about it, so the ceiling does not apply either. It is not a noisier answer, it is a different quantity. We measure Gelman-Rubin R-hat across chains and a run that fails it is refused rather than returned with a warning, because a number carrying a bound that does not hold is worse than no number.
A real-valued network cannot represent a sign structure. On frustrated rings, where the ground-state amplitudes need negative signs, a real restricted Boltzmann machine failed 17 times out of 17. Not degraded: failed. The fix is complex parameters, and it is a good illustration that the ansatz is a modelling choice with consequences rather than a black box you scale up.
The TPU part, and why it is not the headline
Variational Monte Carlo is a training loop dominated by dense matrix multiplication against batches of sampled configurations. That is the workload a Tensor Processing Unit exists for, so running this method on one is a natural fit in a way that running a statevector simulation on one is not.
We have written before that a TPU is a poor quantum simulation backend, and that argument was about statevector simulation and still holds. We hit its central point directly, as a refusal from the hardware itself:
Element type C128 is not supported on TPUThere is no complex128. The engine narrows to complex64 and records on the certificate that it did, because reduced precision moves the variance floor, and a variance sitting at the arithmetic floor must not be read as a converged ground state. The chip's precision bias is real. It is survivable for this method and would not be for a 30-qubit statevector.
The honest summary is that the chip follows the method, not the other way round. A statevector wants a GPU, a stabilizer circuit wants a CPU, a neural wavefunction wants a TPU. Asking which chip is fastest without naming the method is the wrong question.
Running it
The engines take a Hamiltonian rather than a circuit, so they are reached through `/solve` rather than `/jobs`. Send a circuit to one and it refuses with a pointer to the right endpoint instead of a bare rejection.
job = client.solve(
hamiltonian=[(-1.0, "ZZIIIIII"), (-1.0, "IZZIIIII"), ...],
qubits=8,
engine="neural.cpu", # or neural.tpu
)
print(job.result["ground_state"]["ceiling"])
print(job.result["error_info"]["conditional"]["restart_evidence"])This is the part that makes it a service rather than a paper. You do not provision anything, install netket, or hold a TPU reservation. You send a Hamiltonian to an endpoint and a certified bound comes back, and the machine that computed it no longer exists by the time you read the answer.
`neural.cpu` runs in our workers at the ordinary CPU rate. `neural.tpu` runs the identical code on a Cloud TPU created for the job and deleted when it finishes, at $0.70 per chip-hour billed by the second. A TPU has to be provisioned and booted before it computes anything, so a short search can spend more time starting than solving; the estimate you are quoted includes that, and unused seconds are refunded. Price a run before you commit with `POST /solve/estimate`.
What this does not claim
It does not claim neural quantum states beat tensor networks generally. Where an area law holds, an MPS is faster, cheaper and carries a tighter bound. Use the right tool.
It does not claim the optimiser found the ground state. The ceiling is a statement about where the ground state cannot be, which is a weaker and far more defensible thing than a claim about where it is.
And it does not claim the floor is a bound in the sense the ceiling is. It rests on an assumption the run cannot verify, we say so on the certificate, and we give you the restart evidence to judge it.
That is the whole pitch, and it is deliberately narrow. The method reaches somewhere useful, the bound was already being computed, and the only novel part is refusing to publish the number without it.
Run your own 100-qubit circuit, with an error bar.
