Skip to main content

TraceML: Lightweight runtime bottleneck diagnostics for PyTorch training.

Project description

TraceML

Low-overhead PyTorch training performance diagnostics. Every step, every run.

PyPI version CI CodeQL Python 3.10+ License GitHub stars Discord

QuickstartCompare RunsRead OutputUse With Your StackFAQ

TraceML runs alongside your training loop and writes a compact performance report at the end of each run — with <2% overhead in current benchmarks, across the full job, not just sampled steps. It helps answer:

  • Are my GPUs waiting on a slow dataloader?
  • Is one distributed rank consistently slower than the others?
  • Is memory usage silently creeping upward during the run?
  • Did a recent code, data, or infrastructure change slow training down?

Where TraceML Fits

Tool Use it for Not for
TraceML Full-run bottlenecks and rank skew Kernel/operator timelines
torch.profiler / Kineto Op/CUDA traces for selected steps Always-on summaries
Nsight Systems GPU/kernel timeline debugging Everyday training triage
Holistic Trace Analysis Analyzing profiler traces Live/full-run collection
W&B / MLflow Experiment tracking and run history Runtime bottleneck diagnosis

Start with TraceML to find the bottleneck category; open deeper profilers when you need operator- or kernel-level detail.


3-Minute Quickstart

1. Install the package

pip install traceml-ai

Using Hugging Face Trainer, PyTorch Lightning, Ray Train, W&B, or MLflow? Start with the native integration path in Use With Your Stack.

2. Wrap your training step

Add TraceML around the core training step. You do not need to change your model, optimizer, loss function, or dataloader.

import traceml_ai as traceml

traceml.init(mode="auto")

for batch in dataloader:
    with traceml.trace_step(model):
        optimizer.zero_grad(set_to_none=True)
        outputs = model(batch["x"])
        loss = criterion(outputs, batch["y"])
        loss.backward()
        optimizer.step()

3. Run your script

traceml run train.py

For DDP, FSDP, and multi-node runs, see Distributed Training.


What You Get

TraceML writes two end-of-run artifacts:

logs/<run_name>/final_summary.json
logs/<run_name>/final_summary.txt

You can re-print a saved summary later without rerunning training:

traceml view logs/<run_name>/final_summary.json

Want a shareable report? Add --html-report to also write a self-contained final_summary.html, or render one from a saved run after the fact:

traceml run train.py --html-report
traceml view logs/<run_name>/final_summary.json --html   # writes <...>.html

For very large or slow multi-node jobs, TraceML waits at shutdown for late telemetry, SQLite checkpointing, and final summary writing. Tune that single end-of-run budget with --finalize-timeout-sec or TRACEML_FINALIZE_TIMEOUT_SEC when running on slow filesystems or congested networks.

Instead of guessing where step time and memory went, you get a compact diagnosis at the end of every run.

Example TraceML output:

+----------------------------------------------------------------------------+
|  Step Time                                                                 |
|  - Diagnosis: INPUT STRAGGLER                                              |
|  - Scope: compared over last 460 aligned steps across 4 global ranks       |
|  - Stats: total 303.7ms | input 254.5ms | compute 259.5ms             |
|  - Residual: 40.5ms                                                       |
|  - Why: r0 input was slower than median global rank (254.5/3.8ms).         |
+----------------------------------------------------------------------------+

In this example, rank 0 is the slow input rank, which can hold back the aligned distributed step.

For experiment trackers, call traceml.summary() near the end of your script to get a flat dict of diagnosis statuses and average metrics. Keep final_summary.json when you want the full run artifact or an input for traceml compare.


What TraceML Helps You Triage

Use TraceML as the first check before opening a heavier profiler — it surfaces the likely bottleneck area so you know where to look next.

Area What TraceML surfaces What to inspect next
Input pipeline High input time or slow input rank num_workers, pin_memory, transforms, tokenization, collate_fn, dataset/storage latency
GPU utilization / residual Step time split across input, compute, and residual input pipeline, CPU/GPU handoff, synchronization, distributed coordination
Distributed skew One DDP/FSDP rank slower than the others rank-local dataloading, data imbalance, node variance, storage/network differences
Memory creep Memory usage growing during the run retained tensors, logging references, loss accumulation, cached activations
Run regression Changed metrics versus a known-good run code changes, data changes, batch size, container, driver, hardware, infrastructure
Compute-heavy runs Most time is spent in compute open torch.profiler or Nsight for operator/kernel-level detail

Catching Regressions with Compare Mode

Compare a slow run against a known good baseline to identify which metrics changed:

traceml compare input_slow/final_summary.json input_fixed/final_summary.json
+--------------------------------------------------------------------------------------+
|  TraceML Compare                                                                     |
+--------------------------------------------------------------------------------------+
|  Verdict: IMPROVEMENT                                                                |
|  Why: Step time decreased by 95.6%.                                                  |
|                                                                                      |
|  Metric                         A                B                Delta              |
|  Total step                     294.0 ms         13.0 ms          -280.9 ms (-95.6%) |
|  Input                          66.4 ms          2.7 ms           -63.7 ms (-95.9%)  |
+--------------------------------------------------------------------------------------+

See Compare Runs for the full report format.


Display Modes

TraceML controls what you see during training with the --mode flag, without changing the final saved artifacts.

Mode flag Experience during training Supported topology
--mode=summary (default) Silent execution Single-node and multi-node multi-GPU
--mode=cli Live terminal display Single-node, including multi-GPU
--mode=dashboard Live browser display Single-node; requires pip install "traceml-ai[dashboard]"

Current Support

Works today:

  • Single GPU training
  • Single-node multi-GPU DDP / FSDP
  • Multi-node DDP summary reports
  • Multi-node runs on Slurm (sbatch template + guide)
  • Run-to-run comparison from final_summary.json
  • Custom PyTorch loops, Hugging Face, PyTorch Lightning, and Ray Train

On the roadmap:

  • Multi-node live CLI / browser dashboard
  • Explicit collective / NCCL timing

Overhead

In our benchmark runs, TraceML adds:

  • <2% overhead on single GPU at default settings
  • <1% overhead on single-node multi-GPU at default settings

Troubleshooting Guides

These guides cover the common bottlenecks TraceML is designed to identify:


Feedback

For bugs, unexpected results, or feature requests, open a GitHub issue and use the matching issue template. The templates ask for the details we need to reproduce training-environment problems, including hardware, topology, launch command, TraceML version, PyTorch/CUDA versions, and redacted summary output.

GitHub issues: open an issue

If TraceML helped you find a real bottleneck, use the "I found a bottleneck" issue template. These reports help other training teams recognize similar problems.

Security reports: see SECURITY.md

Email: support@traceopt.ai


Contributing

Contributions are welcome, especially:

  • real slowdown examples and repros
  • distributed training edge cases
  • docs improvements
  • framework integrations

See CONTRIBUTING.md for development setup and contribution guidelines.


License

Apache 2.0. See LICENSE.

TraceOpt is a trademark of OptAI UG (haftungsbeschränkt).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

traceml_ai-0.3.2.tar.gz (387.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

traceml_ai-0.3.2-py3-none-any.whl (516.3 kB view details)

Uploaded Python 3

File details

Details for the file traceml_ai-0.3.2.tar.gz.

File metadata

  • Download URL: traceml_ai-0.3.2.tar.gz
  • Upload date:
  • Size: 387.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for traceml_ai-0.3.2.tar.gz
Algorithm Hash digest
SHA256 a7f0d6aacbcce49a3397d7720fedf07a5fe6e678e0449e1b865265a051928ce3
MD5 939b01fc19bcc3de62896fdf9b4b9576
BLAKE2b-256 853b11e3919674d417ad744c45229ac48eb01a7ec9088c9aae500a6bd43c5905

See more details on using hashes here.

File details

Details for the file traceml_ai-0.3.2-py3-none-any.whl.

File metadata

  • Download URL: traceml_ai-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 516.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for traceml_ai-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 58f78c77f865471b47b5c66a8e59351d54979306a2ad8125d4c1d66a84fcb3f3
MD5 b6c834c81a4bf9623d4f44be150227ee
BLAKE2b-256 3d1e5c20a721bcc2ec58544ebd06d084a6a1a7658f43c27cb0fa00736c3e60d7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page