Framework Comparison & Selection Guide¶
Detailed Comparison Matrix¶
Feature vLLM TensorRT DeepSpeed Ollama PyTorch
─────────────────────────────────────────────────────────────────
Setup Complexity Easy Hard Hard Easy Easy
Performance
Latency (ms) 70 40 70 150 200
Throughput (tok/s) 1200 1500 1200 300 100
Multi-GPU
Distributed
LoRA Support
Quantization
API Style Python Config Python CLI Python
OpenAI Compatible
Docker
Community Large Medium Large Growing Medium
Maturity High High High Medium High
Cost (for 100k tok) $0.30 $0.25 $0.30 $0.50 $1.00
(estimated GPU cost)
Scenario-Based Selection¶
Scenario 1: Fast Prototyping (Local Development)¶
Requirements:
- Quick setup (< 5 minutes)
- Single GPU
- Local only
- Not production
Best choice: Ollama
Why:
- One-liner: ollama run llama2
- Models auto-downloaded
- Great for testing
- Works on consumer GPU
Runner-up: PyTorch with Hugging Face
- More control
- Python API
- Familiar to ML engineers
Code:
```bash
# Ollama
ollama run llama2
# PyTorch
from transformers import pipeline
pipe = pipeline("text-generation", model="llama2")
pipe("Hello world")
### Scenario 2: Production Web Service (Single GPU)
Requirements:
- High throughput (1000+ tok/s)
- Low latency (<100ms)
- OpenAI API compatible
- Easy deployment
Best choice: vLLM
Why:
- Simple Python setup
- OpenAI-compatible (drop-in)
- Great performance
- Docker-ready
Code:
from vllm import LLM, SamplingParams
llm = LLM(model="meta-llama/Llama-2-7b-hf")
outputs = llm.generate(prompts, SamplingParams())
# Or via OpenAI API:
# python -m vllm.entrypoints.openai.api_server
Docker:
FROM nvidia/cuda:12.1-runtime
RUN pip install vllm
CMD ["python", "-m", "vllm.entrypoints.openai.api_server", \
"--model", "meta-llama/Llama-2-7b-hf"]
### Scenario 3: Production, Multi-GPU Cluster
Requirements:
- Maximum throughput
- Distribute across GPUs
- LoRA support
- Production monitoring
Best choice: vLLM with multi-GPU
Why:
- Tensor parallelism built-in
- LoRA support
- Mature, widely tested
- Great community support
Code:
from vllm import LLM, SamplingParams
# 8 GPUs
llm = LLM(
model="meta-llama/Llama-2-70b-hf",
tensor_parallel_size=8,
)
outputs = llm.generate(prompts, SamplingParams())
Performance:
- Throughput: 10K+ tokens/sec
- Latency: 50-100ms
- Concurrent users: 100-200
### Scenario 4: Ultra-Low Latency Required (<50ms)
Requirements:
- Absolute lowest latency
- Interactive experience critical
- Willing to optimize more
- Production grade
Best choice: TensorRT-LLM
Why:
- Compiled kernels (fastest)
- 30-50ms latency achievable
- Proven in high-traffic systems
- Best for real-time
Trade-offs: More complex setup Requires model compilation Less flexible than vLLM
Code:
# Compile model for TensorRT
trtllm-build \
--checkpoint_dir./checkpoint/llama-7b \
--output_dir./trt_engines/llama-7b
# Run inference
python run.py --model_path./trt_engines/llama-7b
### Scenario 5: CPU-Only or Edge Deployment
Requirements:
- No GPU available
- Mobile/edge device
- Moderate latency OK
- Memory constrained
Best choice: llama.cpp
Why:
- CPU-optimized C++
- Quantization (4-bit, 8-bit)
- Tiny binary (small download)
- No GPU needed
Alternative: ONNX Runtime
- Cross-platform support
- CPU/GPU flexible
- Production-ready
Code:
# llama.cpp
./main -m model.gguf -n 128 -p "Hello world"
# Or Python:
from llama_cpp import Llama
llm = Llama(model_path="./model.gguf")
output = llm("Hello world", max_tokens=128)
---
## Decision Tree: Final Choice
Start: Which inference framework? │
- Do you have GPUs? │ │
- No → llama.cpp or ONNX (CPU-optimized) │ │
- Yes → Continue below │
- Is this production critical? │ │
- No → Ollama (quick prototyping) │ │
- Yes → Continue below │
- Do you need <50ms latency? │ │
- Yes → TensorRT-LLM (if you can handle complexity) │ │
- No → Continue below │
- Do you need multiple GPUs? │ │
- Yes → vLLM (easiest distributed) or DeepSpeed │ │
- No → vLLM (single GPU works great) │
- Do you need LoRA support? │
- Yes → vLLM (best support) │
- No → Any of the above
-
## Performance Benchmarks: Real Numbers
Benchmark Setup:
- Model: LLaMA-7B
- GPU: A100 (80GB)
- Batch Size: 32
- Max Sequence: 2048
Results (tokens/sec):
Framework FP16 INT8 INT4 ──────────────────────────────── PyTorch 100 150 200 Ollama 150 200 250 vLLM 1200 1500 1800 TensorRT-LLM 1500 2000 2200 DeepSpeed 1000 1300 1600
Latency (first token, empty queue):
Framework Latency ────────────────────── PyTorch 200ms Ollama 150ms vLLM 75ms TensorRT-LLM 40ms DeepSpeed 80ms
Memory Usage (MB):
Framework Batch 1 Batch 32 ──────────────────────────── PyTorch 20GB 23GB vLLM 14GB 18GB TensorRT-LLM 14GB 16GB DeepSpeed 14GB 19GB
Key insight: vLLM is sweet spot (great perf, easy setup)
---
## Migration Paths
### From PyTorch to vLLM
```python
# BEFORE
from transformers import pipeline
pipe = pipeline("text-generation", model="llama2")
output = pipe("Hello", max_new_tokens=50)
# AFTER
from vllm import LLM, SamplingParams
llm = LLM(model="llama2")
output = llm.generate(["Hello"], SamplingParams(max_tokens=50))
# Minimal code changes needed!
From vLLM to TensorRT (if needed)¶
# Export vLLM model to TensorRT
# 1. Export to ONNX
# 2. Compile with TensorRT
# 3. Run with TensorRT runtime
# Tool:
trtllm-build --checkpoint_dir <vllm_model>
-
Cost Analysis¶
Scenario: Serve 1M tokens per day
Framework GPU Cost Time per day Cost/day
───────────────────────────────────────────────
PyTorch $1000 40 hours $1.66
Ollama $1000 10 hours $0.42
vLLM $1000 1 hour $0.04
TensorRT $1000 45 min $0.03
Annual cost:
PyTorch: $606
Ollama: $153
vLLM: $15
TensorRT: $11
Lesson: Framework choice >> Hardware choice for costs!
Key Takeaways¶
vLLM: Best all-around (performance + simplicity) TensorRT: Best latency if setup complexity acceptable Ollama: Best for prototyping and learning llama.cpp: Best for CPU and edge Framework choice affects cost more than hardware!
-
Related Notes in Inference Frameworks Subdirectory¶
- Inference Frameworks Fundamentals - Overview
- Vllm - Most popular choice
- 03 Tensorrt Llm - Best latency