TPU utilization
workload monitoring
cloud computing
machine learning
performance analysis

Check TPU workload/utilization

ML System Design practice on Codemia

Design recommenders, ranking systems and training pipelines the way ML interviews actually ask for them, with worked solutions.

Practice ML system design

Introduction

A TPU job can complete successfully while still wasting expensive accelerator time. Low utilization usually comes from input bottlenecks, host-side preprocessing, or unstable graph shapes that trigger recompilation. A good utilization workflow combines model-level timing, input pipeline diagnostics, and cloud metrics from the TPU environment.

Define Utilization Targets First

Before tuning, define what "good" means for your workload. Typical indicators include step time stability, examples per second, and idle periods between steps. For training, track both median and tail latency, because bursty stalls can hide behind good averages.

Write targets that are comparable across experiments, for example:

  • Step time median under a fixed threshold.
  • Examples per second above baseline by a target margin.
  • Limited variance after warmup phase.

Without a stable baseline, you cannot tell whether a change is real improvement or run-to-run noise.

Instrument Training Loop Metrics

Capture timing directly in code to correlate with external dashboards.

python
1import time
2
3def run_training(steps, train_step):
4    per_step = []
5    start = time.time()
6
7    for step in range(steps):
8        t0 = time.time()
9        train_step(step)
10        elapsed = time.time() - t0
11        per_step.append(elapsed)
12
13        if step % 20 == 0:
14            print(f"step={step} step_time={elapsed:.4f}s")
15
16    total = time.time() - start
17    print(f"total={total:.2f}s avg_step={sum(per_step)/len(per_step):.4f}s")

Keep logging lightweight. Heavy logging can distort measurements.

Optimize the Input Pipeline

Many low-utilization TPU runs are input bound. Use tf.data with batching, caching, and prefetch so host work overlaps accelerator compute.

python
1import tensorflow as tf
2
3def build_dataset():
4    ds = tf.data.Dataset.range(1_000_000)
5    ds = ds.shuffle(50_000)
6    ds = ds.batch(1024, drop_remainder=True)
7    ds = ds.prefetch(tf.data.AUTOTUNE)
8    return ds

If data comes from remote storage, measure read throughput and deserialization cost separately. TPU cannot stay busy when host cannot feed data fast enough.

Profile with TensorBoard TPU Tools

For TensorFlow workloads, run a profile capture and inspect trace breakdown. Look at time spent in input processing, host compute, and accelerator execution.

python
1import tensorflow as tf
2
3logdir = "logs/tpu"
4writer = tf.summary.create_file_writer(logdir)
5with writer.as_default():
6    tf.summary.scalar("examples_per_second", 12500.0, step=1)
7writer.flush()

Then launch TensorBoard profiler and inspect per-step timeline. You want minimal host gaps before TPU kernels.

Check Cloud-Level Signals

Model traces alone are incomplete. Also inspect TPU VM CPU usage, disk throughput, and network throughput. If VM CPU saturates while TPU compute is idle, input or preprocessing is the bottleneck.

On Google Cloud, gcloud and Cloud Monitoring dashboards can confirm whether bottleneck is in accelerator execution or host infrastructure. Correlate timestamps from training logs and cloud metrics to avoid guessing.

Use Synthetic Data to Isolate Bottlenecks

A reliable diagnostic is replacing real input with synthetic in-memory tensors. If utilization improves significantly, your model graph is likely fine and data path is the problem.

python
1import tensorflow as tf
2
3synthetic = tf.data.Dataset.from_tensors(tf.ones((1024, 224, 224, 3), dtype=tf.float32))
4synthetic = synthetic.repeat().prefetch(tf.data.AUTOTUNE)

Run the same training step count with synthetic and real datasets, then compare throughput and step variance.

Improve Stability Through Shape Consistency

Dynamic shapes can trigger retracing and recompilation, which lowers effective utilization. Keep shapes stable across steps where possible, especially in the compiled training step.

Prefer fixed-size batches and predictable tensor dimensions. If variable sequence lengths are required, bucket similar lengths to reduce compilation churn.

Evaluate Changes with Controlled Experiments

Change one parameter at a time, such as batch size, prefetch depth, or input parallelism. Record results in a table with baseline and delta values.

A simple experiment loop:

  1. Keep model and optimizer fixed.
  2. Change one pipeline setting.
  3. Run enough steps to pass warmup.
  4. Compare median step time and throughput.

This method prevents false wins caused by unrelated configuration drift.

Common Pitfalls

  • Focusing only on model code and ignoring host data pipeline limits.
  • Judging utilization from one short run without warmup separation.
  • Changing many parameters at once and losing attribution.
  • Using highly dynamic shapes that force frequent recompilation.
  • Reading only average throughput and ignoring step time variance.

Summary

  • Utilization means keeping TPU compute busy with minimal idle gaps.
  • Measure baseline metrics before tuning so improvements are provable.
  • Optimize tf.data input path to remove host-side stalls.
  • Use profiler traces and cloud metrics together for accurate diagnosis.
  • Validate each optimization with controlled, one-variable experiments.

Related reading
Course
Beginner
27 lessons
10 hours
System Design Fundamentals

Build a strong foundation in designing scalable, reliable distributed systems.

View the course
Track what you have practised

A free account saves your progress, solutions and study plan across every problem on Codemia.

ML System Design practice on Codemia

Design recommenders, ranking systems and training pipelines the way ML interviews actually ask for them, with worked solutions.

Practice ML system design

All Rights Reserved.