Back to blog
Benchmarks 6 min read

ShadowStack Stress Test: Running Production 32B Models on Consumer Hardware

Christopher Maher
Christopher Maher

Last night, we ran ShadowStack through its most demanding test yet: three consecutive 32-billion parameter models with 10 iterations each. No thermal throttling. No OOM crashes. No compromises. Here's what we learned about running production-grade LLMs on consumer hardware.

The Mission: Heavy Lifting

We've benchmarked plenty of 3B and 7B models. Those are great for RAG pipelines and structured data extraction. But when your defense contractor needs a model that can reason about classified threat intelligence, or your hospital wants AI that understands nuanced clinical terminology, you need something bigger. You need 32B.

The problem? Most teams assume 32B models require datacenter hardware. A100s. H100s. Enterprise budgets. We wanted to prove you could run production workloads on hardware a mid-sized organization can actually afford.

The Hardware: ShadowStack

Our testing rig consists of:

  • 2x NVIDIA RTX 5060 Ti (16GB each, Blackwell architecture)
  • 32GB total VRAM across both GPUs
  • CUDA acceleration with layer-based sharding
  • LLMKube v0.4.9 orchestrating deployment and failover

This is not exotic hardware. These are consumer GPUs you can order today. Total cost is under $1,200. Yet we're about to run models that most people think require $30,000 datacenter cards.

The Models: Three Flavors of 32B

We tested three different 32-billion parameter models to stress different inference patterns:

1. Qwen 2.5 32B Instruct

The general-purpose workhorse. Strong reasoning, good multilingual support, excellent for chat applications.

✅ Generation Speed: 16.6 tok/s
📊 P50 Latency: 4.4s
📊 P99 Latency: 4.9s
💾 VRAM Usage: 18-24GB
⚡ Model Load Time: 18s

2. Qwen 2.5 Coder 32B Instruct

Code-specialized variant. Trained on massive code corpora, handles multi-file refactoring and complex logic.

✅ Generation Speed: 16.5 tok/s
📊 P50 Latency: 4.9s
📊 P99 Latency: 5.9s
💾 VRAM Usage: 18-24GB
⚡ Model Load Time: 32s

3. Qwen 3 32B

Latest generation with architectural improvements. Tested to validate forward compatibility.

✅ Generation Speed: 16.2 tok/s
📊 P50 Latency: 15.8s
📊 P99 Latency: 15.9s
💾 VRAM Usage: 18-24GB
⚡ Model Load Time: 28s

What the Numbers Mean

Let's translate these metrics into real-world impact:

16.5 tok/s: Faster Than You Think

At 16.5 tokens per second, you're generating roughly 12-13 words per second. That's fast enough for real-time chat interfaces where users see responses stream in smoothly. It's also plenty for batch processing tasks like document summarization or code generation.

Sub-5s P99 Latency: Production Ready

Two of our three models hit P99 latencies under 6 seconds. That means 99% of your requests complete in under 6 seconds. For most enterprise applications, that's more than acceptable. You're not running a consumer chatbot competing with ChatGPT's instant responses. You're running specialized intelligence for internal teams who value accuracy over millisecond optimizations.

18-32s Load Times: Why It Matters

Model load time is often overlooked, but it's critical for kubernetes environments where pods restart. Our fastest load was 18 seconds. That's the time from cold start to first token. In practice, LLMKube keeps models warm, so this only happens during deployments or node failures.

Zero Failures: The Real Victory

We ran 30 total iterations (10 per model) plus 6 warmup requests. Not a single OOM error. Not a single thermal throttle. Not a single failed deployment. This is the kind of stability you need for production. Your air-gapped SCIF environment can't afford crashes at 2 AM.

The Qwen 3 Latency Anomaly

Sharp-eyed readers will notice that Qwen 3 32B had significantly higher latency (15.8s P50) compared to Qwen 2.5 (4.4s P50). This isn't a performance regression. It's a configuration difference.

Qwen 3 uses different context window defaults and attention mechanisms. Our benchmark ran with catalog defaults, which means Qwen 3 was processing longer contexts. In production, you'd tune this based on your specific use case. The key takeaway is that the hardware handled it without breaking.

What This Means for Your Deployment

If you're evaluating whether your organization can run local LLMs at scale, this test proves several critical points:

  • Consumer GPUs work. You don't need datacenter hardware to run 32B models. Two mid-range cards give you production-grade performance.
  • Multi-GPU sharding is stable. LLMKube's layer-based distribution across GPUs worked flawlessly across all models.
  • Thermal management is a non-issue. Extended stress testing didn't cause throttling or crashes.
  • Different models have different profiles. You can benchmark your specific use case and choose the right model for your latency requirements.

Try It Yourself

Want to replicate these benchmarks? LLMKube v0.4.9 includes the built-in benchmark tool we used:

# Benchmark Qwen 2.5 32B with 10 iterations
llmkube benchmark catalog \
  --models qwen-2.5-32b \
  --iterations 10 \
  --gpu-count 2 \
  --accelerator cuda

The tool handles deployment, warmup, iteration loops, and cleanup automatically. Results are exported as markdown for easy analysis.

What's Next: Pushing to 70B

32B models prove that mid-range hardware can handle serious workloads. But we're not stopping here. Our next stress test will evaluate 70B models with quantization and more aggressive sharding strategies.

The goal remains the same: prove that organizations with real constraints (budget, air-gap requirements, data sovereignty) can still deploy state-of-the-art AI. You don't need a hyperscaler budget. You need the right infrastructure.

About ShadowStack: Our on-premises testing lab for air-gapped LLM deployments. We run real hardware with real constraints to validate that LLMKube works in production environments, not just cloud demos.

Get LLMKube: View on GitHub or check out our getting started guide.