Back to Blog
EngineeringFebruary 3, 2025

GPU Utilization: The Lie Your Dashboard Tells You

Packet.ai EngineeringInfrastructure Team
12 min read

GPU Utilization: The Lie Your Dashboard Tells You

You're watching your dashboard. GPU utilization: 95%. Memory usage: 18GB out of 24GB. Everything looks perfect.

But your training is taking forever. Your inference latency is terrible. Your batch jobs are crawling.

Your GPU utilization metric is lying to you. Here's why, and what Packet.ai is doing about it.

The Problem with GPU_UTIL

When you run nvidia-smi or check any standard GPU monitoring tool, you see "GPU Utilization" (GPU_UTIL). Most developers assume this means "percentage of GPU compute power being used."

It doesn't.

GPU_UTIL measures something far more primitive: the percentage of time over the sample period that at least one kernel was running on the GPU. That's it. If any single CUDA kernel is executing—even if it's using 0.1% of the GPU's actual compute capacity—the utilization counter reads high.

Here's the horrifying truth: an NVIDIA H100 has 132 Streaming Multiprocessors (SMs). If a single SM is running at 100%, and the other 131 are completely idle, GPU_UTIL can still show high utilization. Your GPU is doing work. It's just not doing much work.

A Real Example

Let's say you're running inference on a small model. Your batch size is 1 (common in real-time applications). The GPU loads your tiny batch, fires up a handful of SMs, executes a few kernels, and waits for the next request.

nvidia-smi output:
GPU Utilization: 85%
Memory: 8GB / 24GB

What's actually happening:
- SM Activity: 8%
- Memory Bandwidth: 12%
- 90% of compute capacity sitting idle

You're paying for a $30,000 GPU and using it like a $500 one. GPU_UTIL told you everything was fine.

What You Actually Want: SM Activity

Streaming Multiprocessors (SMs) are the actual compute units inside an NVIDIA GPU. An H100 has 132 of them. An A100 has 108. An RTX 4090 has 128.

SM Activity measures the percentage of time that SMs are actually doing compute work. This is the metric that correlates with actual throughput.

Here's the relationship:

ScenarioGPU_UTILSM ActivityWhat's Happening
Idle0%0%Nothing running
Memory-bound80%15%Waiting for data
Compute-bound95%85%Actually working
Communication-bound90%10%Waiting for network/PCIe

The first column tells you nothing. The second tells you everything.

Why This Happens

Modern GPU workloads are rarely pure compute. They're a complex dance of:

  1. Memory transfers - Moving data between GPU memory and compute units
  2. PCIe transfers - Moving data between CPU and GPU
  3. Network I/O - In distributed training, GPUs wait for gradient synchronization
  4. Host-side processing - Data preprocessing, loading batches from disk
  5. Kernel launch overhead - Each CUDA operation has microsecond-level overhead

Any of these can keep a kernel "running" (GPU_UTIL high) while the SMs twiddle their thumbs (SM Activity low).

The Distributed Training Trap

This problem is especially severe in distributed training across multiple GPUs. During the AllReduce phase, GPUs must synchronize gradients. One common pattern:

  1. Forward pass completes (high SM activity)
  2. Backward pass completes (high SM activity)
  3. AllReduce begins (SM activity plummets)
  4. GPU sits at "95% utilization" while waiting for network

The collective communication libraries (NCCL, etc.) keep kernels running to manage the communication, but your expensive tensor cores are effectively idle.

Packet.ai's Solution: Advanced Metrics Dashboard

Starting today, Packet.ai's dashboard shows you what's actually happening inside your GPU. Click "Show Advanced Metrics" on any GPU card to see:

SM Activity

The percentage of time Streaming Multiprocessors were actively computing. This is the "real" utilization.

Memory Bandwidth Utilization

Percentage of theoretical memory bandwidth being used. High memory bandwidth + low SM activity = memory-bound workload.

Efficiency Score

A computed ratio: SM Activity / GPU Utilization × 100

An efficiency score of 100 means your GPU_UTIL accurately reflects actual compute. A score of 20 means you're wasting 80% of what you're paying for.

Automatic Alerts

When we detect a pattern like:

  • GPU Utilization ≥ 80%
  • SM Activity < 30%

We show an alert: "Your GPU shows high utilization but low compute activity. This often indicates a communication or memory bottleneck."

This isn't just a dashboard flourish. It's actionable intelligence that can save you thousands of dollars in wasted compute.

How to Fix Low SM Activity

Once you know you have a problem, here's how to fix it:

1. Increase Batch Size

The single biggest lever. Larger batches mean more parallelism, which means more SMs working simultaneously.

# Before: batch_size=8, SM Activity ~15%
# After: batch_size=64, SM Activity ~70%

trainer = Trainer(
    per_device_train_batch_size=64,  # Increase this
    gradient_accumulation_steps=4,    # If memory-limited
)

2. Use Async Data Loading

Don't make the GPU wait for data:

train_dataloader = DataLoader(
    dataset,
    batch_size=64,
    num_workers=8,        # Parallel data loading
    pin_memory=True,      # Faster CPU->GPU transfer
    prefetch_factor=4,    # Prefetch next batches
)

3. Optimize Collective Communication

For distributed training:

  • Gradient Compression: Reduce bytes transferred
  • Overlap Communication: Overlap AllReduce with compute
  • Better Topology: Ring vs tree AllReduce based on network
# PyTorch DDP with overlap
model = DistributedDataParallel(
    model,
    bucket_cap_mb=25,     # Smaller buckets = more overlap
    find_unused_parameters=False
)

4. Use Flash Attention / Memory-Efficient Kernels

Flash Attention can increase SM activity by 2-4x for transformer inference:

# Install: pip install flash-attn
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    attn_implementation="flash_attention_2",  # Use Flash Attention
    torch_dtype=torch.float16,
)

5. Right-Size Your GPU

Sometimes the answer is using a smaller (cheaper) GPU. If your SM Activity is 10% on an H100, you might get the same throughput on an A100—or even an RTX 4090—at a fraction of the cost.

Packet.ai's per-second billing makes it easy to experiment: spin up different GPUs, run your workload, compare actual throughput.

Technical Implementation

For the curious, here's how we collect SM Activity metrics. We use nvidia-smi dmon which provides real-time monitoring data not available in standard queries:

# Standard nvidia-smi gives you GPU_UTIL
nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits
# Output: 95

# dmon gives you SM-level activity
nvidia-smi dmon -s u -c 1
#   gpu   sm   mem   enc   dec
#     0   15    23     0     0
# SM activity is column 2: 15%

We sample this every time you check your dashboard, with no measurable impact on your workload (nvidia-smi is read-only, directly reading hardware counters).

The Efficiency Alert Algorithm

Our alert triggers when:

if (utilization >= 80 && smActivity < 30) {
  // Communication or memory bottleneck
  alert = "Your GPU shows high utilization but low compute activity..."
} else if (utilization >= 50 && (smActivity / utilization) < 0.3) {
  // General inefficiency
  alert = "GPU efficiency is low. Workload may be I/O bound..."
}

Simple heuristics, but they catch the majority of "GPU looks busy but isn't working" scenarios.

What's Next

We're working on:

  1. Historical SM Activity Tracking - See your efficiency over time, not just now
  2. Automatic Optimization Suggestions - Based on your workload pattern, specific recommendations
  3. Cost Calculator - "You could save $X/month by fixing this bottleneck"
  4. Tensor Core Activity - For mixed-precision workloads, are your tensor cores actually engaged?

Conclusion

GPU_UTIL is a legacy metric from an era when GPUs ran simple, compute-bound workloads. Modern AI workloads are complex orchestrations of compute, memory, and communication. The old metric lies by omission.

SM Activity tells you the truth. Now you can see it in your Packet.ai dashboard.

Stop trusting GPU utilization. Start measuring SM activity.


This feature is live now on all Packet.ai GPU instances. Log into your dashboard, click any GPU card, and hit "Show Advanced Metrics" to see your actual efficiency.

Further Reading