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-decodeClass
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.