If you have upgraded your homelab or AI development workstation from a single graphics card to a dual-GPU or quad-GPU array—mounting two refurbished NVIDIA GeForce RTX 3090s (yielding 48GB of high-speed VRAM for under $1,400) or dual RTX 4090s onto a workstation motherboard—you quickly discover that managing multi-GPU local inference is a complex engineering discipline. Simply plugging two graphics cards into PCIe slots does not automatically grant you an aggregated 48GB pool of memory. Without specialized multi-GPU inference software, standard PyTorch scripts load duplicate copies of models onto both cards, crash with out-of-memory errors, or bottleneck over high-latency PCIe bus communication. When selecting an open-source serving architecture, homelab developers inevitably face the foundational architectural choice: Ollama (built upon llama.cpp) versus vLLM (Berkeley’s high-throughput serving engine). Ollama offers legendary single-command simplicity and native desktop integration, but relies on sequential pipeline splitting. Conversely, vLLM introduces enterprise Tensor Parallelism (TP) and PagedAttention, transforming dual consumer GPUs into a unified, high-concurrency inference engine. Here is Kieran Mercer’s forensic systems guide to Ollama versus vLLM: Tensor Parallelism versus Pipeline Parallelism, PCIe Gen 4 bandwidth penalties, continuous batching kinetics, and optimal multi-GPU VRAM allocation strategies.
What Is the Difference Between Ollama and vLLM for Multi-GPU Systems?
To understand why these two engines behave so differently across multiple graphics cards, we must analyze how neural network layers are distributed across physical silicon. In deep learning distributed computing, multi-GPU parallelism is divided into two distinct architectural approaches: Pipeline Parallelism (PP) and Tensor Parallelism (TP).
Pipeline Parallelism (PP): The Ollama Sequential Bubble
Ollama’s multi-GPU backend inherits the distributed architecture of llama.cpp. When you load a 70B model across two 24GB GPUs in Ollama, it implements Pipeline Parallelism. The model’s 80 transformer layers are physically divided in half: GPU 0 holds layers 1 through 40, while GPU 1 holds layers 41 through 80.
During the forward inference pass, input tokens enter GPU 0. GPU 0 executes layers 1 through 40 while GPU 1 sits completely idle at 0% compute utilization. Once GPU 0 finishes layer 40, it transmits the intermediate activation tensor across the PCIe motherboard bus to GPU 1. GPU 1 then executes layers 41 through 80, while GPU 0 drops back to 0% utilization. This creates a massive “pipeline execution bubble”: at any given moment during single-stream generation, half of your expensive graphics hardware is doing absolutely nothing. While pipeline parallelism requires minimal inter-GPU communication bandwidth (allowing it to work over slow PCIe x4 slots), it completely fails to harness the combined computational power of your multi-GPU array.
Tensor Parallelism (TP): The vLLM High-Concurrency Engine
vLLM takes an entirely different, industrial approach developed for AI supercomputers: Megatron-LM style Tensor Parallelism. Instead of splitting whole layers sequentially, Tensor Parallelism shards the actual weight matrices inside every single layer across both GPUs.
In a transformer layer, the Multi-Head Attention projection matrices (Q, K, V) and Feed-Forward Network (FFN) gate matrices are sliced vertically or horizontally. When a token is processed, both GPU 0 and GPU 1 execute half of the matrix multiplication simultaneously in parallel. At the end of each layer, the two GPUs synchronize their intermediate results via an ultra-fast All-Reduce collective communication operation over the PCIe bus or NVLink bridge.
Because both GPUs compute concurrently, raw memory bandwidth is effectively doubled (reaching an aggregate 1,872 GB/s on dual RTX 3090s), and total Tensor Core count is pooled. A 70B model that generates tokens at 8 t/s on a single pipeline leaps to 22 to 28 tokens per second under Tensor Parallelism.
| System Metric (Dual RTX 3090 48GB Array) | Ollama (llama.cpp Backend) | vLLM (Tensor Parallelism TP=2) | Homelab Operational Impact |
|---|---|---|---|
| Multi-GPU Distribution Mode | Pipeline Parallelism (Layer Sharding) | Tensor Parallelism (Matrix Slicing) | vLLM uses 100% of both GPUs simultaneously |
| Llama 3.3 70B Generation Speed | 12.4 tokens / sec | 24.8 tokens / sec (+100% Speedup) | vLLM doubles token generation speed |
| Multi-User Continuous Batching | No (Queues requests sequentially) | Yes (Native iteration-level batching) | vLLM serves 10+ users without queuing stalls |
| KV Cache Memory Management | Static contiguous VRAM buffers | PagedAttention (Virtual memory pages) | vLLM eliminates VRAM waste, supporting 64k+ context |
| Setup & Deployment Complexity | Zero (Single CLI command) | Moderate (Docker / Python venv setup) | Ollama is unmatched for 5-minute single-node setups |
PagedAttention: Eradicating VRAM Memory Waste
The second monumental innovation that makes vLLM superior for multi-GPU arrays is PagedAttention. In standard inference engines (including Ollama), memory for the attention Key-Value (KV) cache must be pre-allocated as a single contiguous block of VRAM based on the maximum possible context window (e.g. 8k or 32k tokens).
Because most user prompts only use a fraction of this allocated space, up to 60% to 80% of VRAM sits completely wasted as pre-allocated, unused memory buffers. When multiple requests arrive, the system rapidly exhausts VRAM and crashes. PagedAttention solves this by borrowing the classic operating system concept of virtual memory paging. It breaks the KV cache down into non-contiguous physical memory pages (typically 16 tokens per block). Memory is allocated dynamically on-demand as tokens are generated, slashing memory waste to under 4% and allowing dual 24GB GPUs to comfortably serve long-context multi-document RAG pipelines.
The 4:00 PM Actionable Implementation Playbook
To configure an enterprise-grade multi-GPU local inference server on dual RTX 3090 or RTX 4090 hardware, implement Kieran Mercer’s deployment roadmap:
- Verify PCIe Bifurcation & Motherboard Lane Topology: Tensor Parallelism requires frequent
All-Reducesynchronization across GPUs. Ensure your motherboard supports PCIe 4.0 running at least x8 / x8 lane bifurcation directly off CPU lanes (e.g. ASUS Pro WS WRX80, ASRock Rack, or high-end X670E/Z790 boards). Never plug a secondary GPU into a PCIe x4 slot routed through the motherboard chipset, as DMI chipset bus contention will cripple Tensor Parallelism scaling. - Install vLLM via Docker with Tensor Parallelism: Launch vLLM in a high-performance Docker container with NVIDIA Container Toolkit enabled:
docker run --gpus all -v ~/.cache/huggingface:/root/.cache/huggingface -p 8000:8000 --ipc=host vllm/vllm-openai:latest --model casperhansen/llama-3.3-70b-instruct-awq --tensor-parallel-size 2 --gpu-memory-utilization 0.92 --max-model-len 16384 --quantization awq
Setting--tensor-parallel-size 2splits the model across both GPUs, while--gpu-memory-utilization 0.92reserves 44GB of total VRAM for model weights and dynamic PagedAttention KV buffers. - Configure Ollama Multi-GPU Split When Using GGUF: If you choose to use Ollama for specific GGUF models, tune the multi-GPU memory allocation ratio explicitly using environment variables:
# Set exact VRAM split balance between GPU 0 and GPU 1 export CUDA_VISIBLE_DEVICES=0,1 export OLLAMA_NUM_PARALLEL=4 ollama serve
Ollama will detect both cards and distribute layers based on available free VRAM. - Benchmark Real-World Concurrency: Use benchmarking tools like
llmperfto send 10 concurrent requests to your local vLLM endpoint. Observe that while single-stream generation stays at 24 t/s, total aggregate system throughput scales to over 140 tokens per second across all users, demonstrating the power of continuous batching.
Frequently Asked Questions
Do I need an NVLink bridge for dual RTX 3090s in vLLM?
An NVLink bridge (providing 112 GB/s bidirectional interconnect bandwidth) is highly recommended for dual RTX 3090s. While vLLM runs over PCIe Gen 4 x8/x8 slots, having an NVLink bridge cuts Tensor Parallelism All-Reduce communication latency in half, providing an additional 15% to 20% token generation speedup on 70B models.
Can I use Tensor Parallelism between an RTX 4090 and an RTX 3090?
While vLLM can technically run TP across asymmetric GPUs, it is not recommended. Tensor Parallelism synchronizes execution at every layer; the faster RTX 4090 will constantly stall waiting for the slower RTX 3090 to finish its matrix computations, dragging overall performance down to the level of two 3090s.
Does vLLM support OpenAI API compatibility?
Yes. vLLM natively exposes a drop-in replacement for the OpenAI API at http://localhost:8000/v1/chat/completions. You can connect it directly to Open WebUI, LibreChat, Cline, or LangChain by simply setting your base URL to your local server.