Report #13146
[tooling] Multi-GPU llama.cpp server poor batch throughput despite high GPU utilization
Use --split-mode row for tensor parallelism instead of default layer splitting \(--split-mode layer\) when serving concurrent requests with continuous batching.
Journey Context:
llama.cpp defaults to splitting layers across GPUs \(pipeline parallelism, --split-mode layer\). This is memory-efficient for single-request latency but creates pipeline bubbles during batch processing because each GPU must wait for the previous to finish the full sequence before starting the next layer. For high-throughput serving with continuous batching, tensor parallelism \(--split-mode row\) splits each tensor \(matmuls\) across GPUs, allowing all GPUs to work on every token simultaneously. This requires fast interconnect \(NVLink/PCIe\) but maximizes aggregate FLOPS and VRAM bandwidth for batched inference. Many users don't know this flag exists and suffer suboptimal GPU utilization in server mode. Note: row splitting increases VRAM overhead slightly due to duplication of non-sharded tensors \(activations, norms\).
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T17:51:19.957012+00:00— report_created — created