Uncategorized

Two RTX 3090s, one box, and the upgrade I almost bought for nothing

I had two RTX 3090s and the compute of roughly one. This is the rebuild that put both cards on native PCIe in a single box — and the measurement, three weeks later, that showed why the obvious upgrade after that is probably not the one you would guess.

Where this started

The old arrangement was two machines pretending to be one. A Windows workstation held the first RTX 3090. A small NUC held the second one, attached over Thunderbolt through an external GPU enclosure. On paper: 48 GB of VRAM. In practice: a fragile link, a cold-load fault that surfaced mid-session often enough to earn its own workaround script, and a second card that spent most of its life being addressed over the network.

The workstation itself was still a good platform — an X299 board with plenty of PCIe lanes, which is exactly what a dual-GPU box needs and exactly what mainstream desktop boards do not have. So the plan was not “buy a new machine”. It was: take the good platform, put both cards in it, and turn the whole thing from a Windows box into a hypervisor host.

A G.SKILL Trident Z RGB DDR4 box next to a CPU in its plastic clamshell
Out with the old: the CPU and memory that came out of the workstation.

The build

New CPU into the LGA2066 socket — an Intel Core i9-10920X, twelve cores, which is unremarkable in 2026 and completely fine for the job. A GPU host spends its CPU budget on scheduling, tokenizing, and I/O, not on the model itself.

An Intel Core i9-10920X seated in an LGA2066 socket
The i9-10920X in the socket. Twelve cores is plenty when the GPUs do the work.

A dual-tower air cooler on top. No liquid loop: this machine is meant to run unattended for months, and the failure mode of a pump is worse than the failure mode of a fan.

A large dual-tower CPU cooler being screwed onto a motherboard
Mounting the cooler. The board is an X299 platform — chosen for PCIe lanes, not for looks.

The least glamorous and most overdue part of the job:

A dust-caked 140mm case fan
Every case fan looked like this. If you are wondering why your rig throttles, start here.

Storage went onto a passive carrier card that turns one x16 slot into four M.2 slots — four NVMe drives, mixed capacities, which later became the ZFS layout for VM images, model files, and backups.

A PCIe carrier card populated with four Samsung NVMe SSDs, label area deliberately blurred
Four NVMe on one x16 carrier. The label area is blurred on purpose — see the note at the end.

Then cabling, which on a build with two triple-slot cards and a carrier card is most of the actual work.

The rear compartment of a PC case with routed cables and a 2.5 inch SSD
The back side. Nobody photographs this, which is why nobody plans for it.
The interior of a PC case lit green, showing an EVGA GeForce RTX 3090 and a be quiet! Dark Power Pro power supply
First card in, machine alive.

And two days later, the part this was all for:

Two GeForce RTX graphics cards installed in one case, one lit blue and one lit green
Both 3090s on native PCIe, in one chassis. Note that they are from two different vendors — that detail comes back later.

What actually improved

The honest list is shorter than the build photos suggest, but every item on it is real:

  • The Thunderbolt link is gone. That was the single most failure-prone component in the old setup, and removing a failure mode is worth more than most performance work.
  • Warm reloads went from minutes to seconds. Not because of the rebuild itself — because the host now has enough RAM that the inference server stops disabling memory-mapped model loading. On the old box, a memory-starved container silently turned every model switch into a physical multi-gigabyte disk read. Hundreds of them per day.
  • One machine to reason about. Both cards visible to one hypervisor, one place to look when something is wrong.
Top-down view into the finished machine showing both graphics cards, cooler and drive cage
The finished machine, three weeks in.

The uncomfortable part: 48 GB is not 2× the speed

Here is the finding I did not expect to have to write down.

When a model is too large for one card, the usual inference stack splits it by layers: layers 0 to n go on card 0, the rest on card 1. A token enters card 0, works its way up, crosses to card 1, works its way up again, and comes out. That crossing happens once per token and moves a few megabytes — nothing that stresses a PCIe link.

But look at what the cards are doing while that happens. Card 1 sits idle while card 0 computes. Then card 0 sits idle while card 1 computes. At any instant, one of your two GPUs is waiting. Layer splitting buys you memory capacity. It does not buy you throughput.

That reframes the obvious upgrade. The instinct, once you have two cards in one box, is to bridge them — and for these cards a bridge exists. But a faster link between two components that never talk much cannot help. The bottleneck is not the wire; it is that half the silicon is idle.

There is a mode that does use both cards at once: splitting the tensors themselves rather than the layers, so both GPUs work on every layer together. That mode does generate constant inter-GPU traffic — and that is the one where a fast bridge would matter. Which turns “should I buy a bridge?” from an opinion into a measurement:

  • Tensor split is faster over the existing link → free performance, no purchase needed.
  • Tensor split is slower → the interconnect is provably the limit, and a bridge would pay for itself.
  • No meaningful difference → a bridge would be money spent on inference for nothing, and only training would justify it.

That measurement is scheduled. I am writing the question down before I know the answer, because a prediction recorded afterwards is not a prediction.

One practical wrinkle that the build photo already hints at: my two cards are from different vendors. Bridges come in fixed slot spacings, and coolers of different thickness are a common reason a bridge that should fit does not. Measure before you buy.

The reality of a home lab

A large PC tower standing on a tiled floor next to a chest of drawers, with a pedestal fan pointed at it and a UPS on the floor
The cooling strategy, in full.

This is what it actually looks like. A tower on a tiled floor, a household pedestal fan aimed at the intake because two 3090s under sustained load put out more heat than the room can shed on its own, and a UPS on the floor because the alternative is discovering what an unclean shutdown does to a ZFS pool.

I am including this photo deliberately. Build write-ups tend to end at the glamour shot, and that quietly misrepresents what running hardware at home is like. The fan is not a joke — it is load-bearing.

What I would tell my past self

  • Buy the platform for the lanes. The CPU generation barely matters for a GPU host. The number of PCIe lanes decides whether a second card and an NVMe carrier can coexist.
  • Removing a fragile link beats adding performance. The Thunderbolt enclosure worked, right up until it did not, and always at the worst moment.
  • Give the host enough RAM even though the model lives on the GPU. Memory-mapped loading is the difference between a two-second model switch and a two-minute one, and the software will disable it silently when memory is tight.
  • Two cards are a capacity upgrade, not a speed upgrade — unless you deliberately change how the model is split, and then you have a whole new variable to measure.
  • Clean the fans. Genuinely.

A note on the blurred photo

The SSD carrier picture has its label area blurred. Those labels carry each drive’s PSID — the code that lets anyone with physical access cryptographically reset a self-encrypting drive. It is printed on the sticker precisely because it is meant to be an out-of-band reset path, and it was legible as text and as a scannable code in the original frame.

While checking that, I found something worse: every photo in this article was carrying GPS coordinates in its EXIF metadata. Every single one. Phone cameras geotag by default, and a build photo taken at home is a photo of where you live. All twelve images were stripped of metadata before upload — and I verified the stripping against an untouched original, because a check that always says “clean” is not a check.

If you post hardware photos, do both: strip EXIF, and look at what is written on your components before the internet does.