Report #80214
[tooling] Imbalanced GPU utilization in multi-GPU setups causing OOM on one card while others are idle
Use --split-mode row instead of default layer splitting in llama.cpp to distribute individual tensor rows across all GPUs, balancing VRAM usage when cards have different capacities or when NVLink is unavailable.
Journey Context:
llama.cpp defaults to layer-splitting \(--split-mode layer\), which assigns entire transformer layers to specific GPUs. If GPU0 has 24GB and GPU1 has 24GB, but the model requires 40GB, layer-splitting fails if any single layer exceeds the smallest GPU's VRAM \(common for large MLP layers in 70B\+ models\). Row-splitting \(--split-mode row\) implements tensor parallelism: individual weight matrices are sharded across GPUs \(e.g., each GPU holds half the rows of every matrix\). This requires fast interconnect \(PCIe or NVLink\) for all-reduce operations, but eliminates the 'weakest link' VRAM bottleneck. It is essential for running 70B models on 2x24GB cards. Tradeoff: row-splitting has higher latency overhead than layer-splitting due to constant inter-GPU synchronization; layer-splitting is faster if VRAM permits. Common mistake: using row-splitting on CPUs or slow PCIe 3.0 x4 links, causing severe generation slowdown.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T17:14:42.604342+00:00— report_created — created