Running a 70B model on heterogeneous hardware exposes Ollama's core architectural constraint: it ships pre-compiled GGML kernels optimized for generic x86/ARM profiles. Your M2 Max, RTX 4090, or AMD 7950X all run the same matrix multiplication routines, ignoring chip-specific SIMD widths, cache hierarchies, and memory bandwidth characteristics.
The symptom: identical models produce wildly different time-to-first-token (TTFT) and tokens-per-second across nominally similar hardware configs. Worse, KV-cache thrashing under long contexts (8K+) can degrade throughput by 40% as the static memory allocator fails to adapt to your actual VRAM/RAM split.
Magnitude (https://github.com/magnitudedev/magnitude) takes a different path: on first model load, it benchmarks matrix ops, attention mechanisms, and memory transfer patterns directly on your silicon, then compiles optimized kernels for that exact configuration.
I tested Llama-3.1-8B-Instruct (Q4_K_M quantization) across three machines:
Test script measures cold-start latency, TTFT at 2K/4K/8K context, and sustained throughput over 512-token generation:
import asyncio
import aiohttp
import time
import statistics
async def benchmark_inference(endpoint, prompt, context_len):
payload = {
"model": "llama-3.1-8b-instruct",
"prompt": prompt * (context_len // len(prompt)),
"max_tokens": 512,
"stream": True
}
ttft = None
tokens = []
start = time.perf_counter()
async with aiohttp.ClientSession() as session:
async with session.post(endpoint, json=payload) as resp:
async for line in resp.content:
if not line:
continue
if ttft is None:
ttft = time.perf_counter() - start
tokens.append(time.perf_counter())
total_time = time.perf_counter() - start
tps = len(tokens) / (total_time - ttft) if ttft else 0
return {"ttft_ms": ttft * 1000, "tps": tps, "total_s": total_time}
async def run_suite(endpoint, iterations=5):
results = {"2k": [], "4k": [], "8k": []}
for ctx in [2048, 4096, 8192]:
for _ in range(iterations):
res = await benchmark_inference(
endpoint,
"Explain quantum entanglement in detail: ",
ctx
)
results[f"{ctx//1024}k"].append(res)
await asyncio.sleep(2) # cooldown
for ctx, runs in results.items():
ttft_med = statistics.median([r["ttft_ms"] for r in runs])
tps_med = statistics.median([r["tps"] for r in runs])
print(f"{ctx} context: TTFT {ttft_med:.1f}ms, {tps_med:.1f} tok/s")
if __name__ == "__main__":
asyncio.run(run_suite("http://localhost:11434/api/generate"))
| Hardware | Engine | TTFT (8K ctx) | Throughput (tok/s) |
|---|---|---|---|
| M2 Max | Ollama | 420ms | 18.2 |
| M2 Max | Magnitude | 210ms | 38.7 |
| RTX 4090 | Ollama | 180ms | 52.1 |
| RTX 4090 | Magnitude | 85ms | 119.3 |
| 7950X (CPU) | Ollama | 1840ms | 6.8 |
| 7950X (CPU) | Magnitude | 950ms | 12.4 |
The GPU deltas are dramatic: Magnitude's CUDA kernel auto-tuning exploits the 4090's tensor cores for INT4 operations that Ollama's generic path misses. On Apple Silicon, the Metal shader compiler leverages unified memory to eliminate CPU↔GPU transfers Ollama still performs.
Profiling with nvprof revealed Ollama spends 22% of wall time in cudaMemcpy calls during KV-cache updates at 8K context. Magnitude's tuned kernel fuses cache writes with attention compute, dropping transfer overhead to 4%.
On the M2, Magnitude detected the 100GB/s memory bandwidth ceiling and automatically switched to a lower-precision accumulator that doubled effective throughput without accuracy loss.
FROM llama-3.1-8b-instruct-q4km.gguf
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER repeat_penalty 1.1
PARAMETER num_ctx 8192
PARAMETER magnitude.cache_kernels true
PARAMETER magnitude.tune_on_load true
SYSTEM You are a helpful assistant.
First load takes 45–90 seconds for kernel tuning (one-time cost). Subsequent starts use cached kernels and match Ollama's cold-start time.
Magnitude's tuning assumes stable hardware. If you're running in a VM with fluctuating CPU quotas or shared GPU slices (Kubernetes with MIG), the tuned kernels can mispredict and underperform Ollama's conservative but robust defaults.
For rapid model-switching workflows (testing 20+ models/hour), the cumulative tuning overhead outweighs per-request gains.
For production services with fixed hardware and traffic patterns (customer-facing chatbots, internal doc Q&A), Magnitude's 2x latency reduction directly translates to halved instance counts or doubled request capacity.
For exploratory research and model evaluation pipelines, Ollama's zero-config startup remains the faster path to first answer.
Full benchmark scripts and tuning logs: https://github.com/magnitudedev/magnitude