inference/research
verifiedmedium · 0.80minorupdated 2026-10-15

Dual-socket EPYC does not double 70B decode - NUMA domain splitting gives ~1.3-1.6x

[minor] config

Fields

id
gotchas/gotcha-dual-socket-numa-does-not-double-decode
Class
config
Severity
minor
Symptom
A 2P Genoa box (24 channels, ~920 GB/s aggregate) reads like it should double single-socket 70B decode. It does not: NUMA domain splitting means the model spans both sockets memory unevenly and the interconnect tax eats the gain, so measured uplift is ~1.3-1.6x a single socket.
Root cause
llama.cpp --numa distribute and RPC backends help but cannot fully hide socket-to-socket bandwidth asymmetry on a model split across two NUMA domains; the CPU-side interconnect is not transparent like a GPU NVLink plane.
Workaround
Populate every channel on BOTH sockets (see gotcha-cpu-inference-must-populate-all-memory-channels) and use ik_llama.cpp -numa distribute or RPC backends; expect ~1.3-1.6x not 2x.
notes
Dual EPYC 9334 measured ~26-28 tok/s on gpt-oss-20b / DeepSeek-8B Q4-class (LeaseWeb 2026). For a single-user 70B decode, a fully-populated 1P Genoa at ~7 tok/s is usually the better buy than 2P complexity.

Notes

Dual EPYC 9334 measured ~26-28 tok/s on gpt-oss-20b / DeepSeek-8B Q4-class (LeaseWeb 2026). For a single-user 70B decode, a fully-populated 1P Genoa at ~7 tok/s is usually the better buy than 2P complexity.

Cross-references