Scale
Scaling AI systems involves architecting infrastructure and applications to handle growth in traffic, data, and complexity — anticipating 10× traffic spikes, planning for data growth, and building systems that degrade gracefully under load while maintaining performance and cost efficiency.
What Is AI Scaling?
- Definition: Preparing systems to handle increased demand.
- Dimensions: Traffic (requests), data (storage), complexity (features).
- Approach: Horizontal scaling, caching, optimization, load management.
- Goal: Maintain performance and cost efficiency as usage grows.
Why Scaling AI Is Challenging
- Resource Intensive: Each request may need GPU compute.
- Variable Latency: Responses take 100ms to 30s.
- Memory Pressure: KV cache grows with concurrency.
- Cost Sensitivity: Scaling linearly with traffic can be expensive.
- Stateful Sessions: Conversation context must be maintained.
Scaling Dimensions
Traffic Scaling:
Level | Requests/sec | Challenge
-------------|--------------|----------------------------
Small | <10 | Single instance sufficient
Medium | 10-100 | Load balancing, caching
Large | 100-1000 | Multi-region, optimization
Enterprise | 1000+ | Distributed, sophisticatedData Scaling:
Data Type | Growth Pattern | Solution
-------------|--------------------|-----------------------
Vector DB | Linear with docs | Sharding, tiered storage
Logs | Exponential | Retention policies, sampling
Models | Step function | Model versioning
Cache | Linear with users | TTL, eviction policiesHorizontal Scaling
Load Balancing:
Auto-Scaling:
# Kubernetes HPA
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: llm-inference
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: requests_per_second
target:
type: AverageValue
averageValue: "100"Caching Strategies
Multi-Level Cache:
Layer 1: Response Cache (Redis)
- Full response for exact prompts
- TTL: 1-24 hours
- Hit rate: 10-40% typical
Layer 2: Embedding Cache
- Skip embedding computation
- TTL: Days-weeks
- Hit rate: 50-80%
Layer 3: KV Cache (vLLM)
- Prefix caching for system prompts
- TTL: Session/hours
- Speeds up TTFTCache Implementation:
import hashlib
import redis
cache = redis.Redis()
def cached_generate(prompt: str, ttl: int = 3600):
cache_key = hashlib.sha256(prompt.encode()).hexdigest()
# Check cache
cached = cache.get(cache_key)
if cached:
return json.loads(cached)
# Generate
response = llm.generate(prompt)
# Store
cache.setex(cache_key, ttl, json.dumps(response))
return responseLoad Management
Rate Limiting:
from fastapi import HTTPException
from collections import defaultdict
import time
request_counts = defaultdict(list)
async def rate_limit(user_id: str, limit: int = 100, window: int = 60):
now = time.time()
# Clean old requests
request_counts[user_id] = [
t for t in request_counts[user_id]
if now - t < window
]
# Check limit
if len(request_counts[user_id]) >= limit:
raise HTTPException(429, "Rate limit exceeded")
request_counts[user_id].append(now)Graceful Degradation:
async def generate_with_fallback(request):
# Try primary (best quality)
if system_load < 0.8:
return await generate_primary(request)
# Fall back to faster model under load
if system_load < 0.95:
return await generate_fallback(request)
# Extreme load: queue or reject
return {"status": "queued", "message": "System busy"}Capacity Planning
Estimation Formula:
Required GPUs = (Peak RPS × Avg Latency) / (Batch Size × GPU Throughput)
Example:
- Peak: 1000 RPS
- Avg latency: 2s
- Batch size: 8
- GPU throughput: 100 tokens/sec
GPUs = (1000 × 2) / (8 × 100) = 2.5 → 3 GPUs minimum
Add 50% headroom → 5 GPUsPerformance Testing:
# Load test with hey
hey -n 10000 -c 100 -m POST
-H "Content-Type: application/json"
-d '{"prompt": "test"}'
http://localhost:8000/generateScaling AI systems requires proactive architecture decisions — systems that weren't designed for scale will hit walls that require rewrites, so planning for 10× growth from day one prevents painful migrations and outages as adoption grows.