Inspiration
Vehicle aerodynamics is settled by CFD, and a single solve of one car shape costs hours of compute. That price is why a designer tries a handful of shapes instead of thousands, and why automated shape search mostly stays in papers.
A fast surrogate removes the price and creates a new problem. A model that answers in a quarter of a millisecond will answer just as confidently for a shape unlike anything it was trained on, and an optimiser will find exactly those shapes, because that is where the error lives. We wanted a design loop that shows its progress and its limits in the same interface.
What it does
You adjust sixteen DrivAerNet morph parameters on a fastback, notchback or estateback body. The service returns a drag coefficient, its standard deviation, and a verdict: it checks the predicted uncertainty and the Mahalanobis distance of the inputs from the training set, and refuses combinations it cannot support before they can count as anyone's best design.
NVIDIA Nemotron, through Nebius Token Factory, then designs with it. It proposes one or two parameter changes, states the effect it expects, calls the surrogate, and is told what actually happened. Every step lands in a logbook that records whether the observed change agreed with its hypothesis, so the transcript can be audited against results rather than against the model's own summary. Design constraints, evaluation counts, cancellation and spend caps are enforced in code, not asked for in the prompt.
Around that sit a 3D vehicle view, run history, comparison curves against CMA-ES and random search, and an independently graded results page. A separate experimental network can colour the viewer mesh by surface pressure. It does not drive the agent, and it has no established calibration on generated geometry.
How we built it
The drag model is a heteroscedastic PyTorch MLP trained on 4,165 CFD-labelled DrivAerNet designs, predicting a mean and a variance. It is trained in two phases: the mean on MSE, then the variance alone against a frozen mean, because training both together collapsed the uncertainty head to near-zero and left the gate with nothing to fire on.
FastAPI serves inference and the run lifecycle. The interface is plain JavaScript and three.js against a dynamic Python geometry endpoint. The whole thing ships as two Docker images driven by one Compose file.
NVIDIA Nemotron Super and Nano run through Nebius Token Factory with typed tool calls. Saved runs record the provider model, token usage, latency, cost and the checkpoint hash they were produced against. NVIDIA's DoMINO research informed the separate surface-pressure architecture.
We are not claiming a PhysicsNeMo runtime, a fine-tuned DoMINO checkpoint, Nebius H100 training, or Serverless Jobs. Token Factory is the Nebius service this project actually demonstrates.
What we measured
An independent harness grades every checkpoint, and reports a reference model beside it so the numbers mean something.
- Served drag model, 625 held-out designs: R2 0.8750, MAE 0.00616. A least-squares line on the same inputs gets R2 0.8352, so the network's margin over a linear fit is real but modest.
- Calibration is imperfect and we report it rather than smooth it. The nominal 90% interval covers 86.56% of held-out labels, and the 1-sigma band covers 64.48% against 68.3% ideal. The bars are slightly too narrow, and sigma barely ranks which individual design to distrust.
- Domain gate: it falsely flags 0.32% of ordinary test designs and flagged every jointly extreme corner we sampled. That is a result on those probes, not proof that all out-of-distribution designs are detectable.
- Held-out body style: a separate evaluation-only checkpoint trained without notchbacks scores R2 0.4792, MAE 0.01016 on 1,403 unseen notchbacks, with 1-sigma coverage 48.75%. Accuracy roughly halves on a shape family the model never saw. This checkpoint is never served.
- Nemotron against the optimisers: five fastback runs per method, 25 scored evaluations each, same start and same gate. Median predicted Cd reduction was 3.875% for Nemotron Super, 3.841% for CMA-ES and 2.793% for random search. The agent matches CMA-ES here. It does not beat it, and five runs is a description, not a significance test.
- More data helps: retrained on 146 to 2,915 designs, R2 rises from 0.77835 to 0.87852.
- Experimental surface pressure, 500,000 stored cells from five held-out cars: Cp R2 0.5080, MAE 0.14554. A pooled nearest-training-point reference does better, at R2 0.6905 and MAE 0.10251. Both numbers have to travel together: this network beats predicting a constant and loses to nearest-neighbour retrieval. Its 1-sigma band over-covers, at 79.94%. Pressure-only integrated drag has a per-car MAE of 0.0218 and a mean absolute relative error of 8.57%, excluding viscous drag entirely.
Challenges we ran into
The uncertainty head and the domain detector answer different questions, and conflating them would have been the easy mistake. Sigma says how wide the band is on average; the distance score says whether the inputs resemble the training set at all. We report them separately because only one of them works as a gate.
Detecting the held-out body style looks perfect and is not an achievement. With all nineteen inputs the detector catches 100% of unseen notchbacks at AUROC 1.00; with the three body-style indicators removed and only the sixteen shape dials left, it catches 2.6% at AUROC 0.536, which is chance. It was recognising a categorical label it had never seen, not novel aerodynamics. So the gate demonstration in the product is a combination of individually legal parameters that is jointly far from the data, which is the case where the distance score does real work.
A reporting bug cost us a claim. For a while the drag-field loss integrated twice along the same axis, which meant lift was never constrained and a lift-only error scored exactly zero. Once fixed and measured, lift gets the sign wrong on one of five held-out cars, so lift is served as a labelled placeholder and is not usable for decisions.
What we learned
Out-of-distribution detection works when the novelty is explicit in the input and fails when the model has to notice it from its own behaviour. Of four signals we tried, only parameter-space distance was trustworthy. Predicted sigma, feature-space distance and ensemble disagreement all degraded exactly where we needed them.
The honest reference is usually the more interesting number. A straight line reaches R2 0.8352 on the drag task, and nearest-neighbour retrieval beats our pressure network outright. Reporting those made the project easier to trust and told us where to work next.
What's next
Validate selected designs with new CFD solves, since every improvement here is a surrogate prediction and nothing in this project confirms one. Validate field orientation and calibration on generated geometry. Broaden the starting designs and constraints in the search study, and evaluate any recalibration against frozen held-out data rather than the split we tuned on.
Data and licences
Source code is MIT. The datasets are not, and their terms differ.
DrivAerNet, by Mohamed Elrefaie and collaborators, is CC BY-NC 4.0, non-commercial. DrivAerML, by Neil Ashton and collaborators, is CC BY-SA 4.0, which carries a share-alike obligation on redistributed adaptations. The MIT licence does not relicense either dataset or the weights derived from them. Attribution and provenance notices ship inside the model bundle.