Skip to main content

metaflow-profiler

CI PyPI Python License

Add one decorator to any Metaflow step and get an interactive flamegraph card in the UI.


When a Metaflow step is slow or runs out of memory, finding the cause means adding profiling code, re-running locally, deciphering cProfile tables, and correlating a separate top session — all before you can start actually fixing anything.

@profile_card wraps any step with a single decorator. It captures the CPU call tree, memory allocations, and system resource usage, then renders a self-contained interactive card directly in the Metaflow UI — visible even when the step crashes.

Quick start

pip install metaflow-profiler[pyinstrument]
from metaflow import FlowSpec, step
from metaflow_extensions.profiler.plugins.profile_decorator import profile_card

class MyFlow(FlowSpec):

    @profile_card(profiler="pyinstrument")
    @step
    def train(self):
        # ... your heavy computation ...
        self.next(self.end)

    @step
    def end(self):
        pass

if __name__ == "__main__":
    MyFlow()
python flow.py run
python flow.py card view --id profile_card_train

What you get

Stats grid

Duration, sample count, peak/avg CPU, peak/avg memory — plus disk I/O, network, and GPU stats when present. Stat cards appear automatically and hide when zero.

Stats grid and CPU flamegraph header

CPU Flamegraph

Every function call is a coloured block; width represents time spent.

CPU flamegraph — full view

Search highlights matching frames across the whole tree while dimming everything else — useful for tracking down a specific function across multiple call paths.

CPU flamegraph — search: only "run_step" highlighted

Click to zoom into any frame. A breadcrumb trail lets you navigate back up the call stack.

CPU flamegraph — zoomed in with breadcrumb trail visible

Memory Flamegraph

When memray is installed (pip install metaflow-profiler[memray]), a second flamegraph shows which functions allocated the most memory at peak RSS, in MB.

Memory flamegraph — allocation tree by call stack

Resource Timeline + I/O Timeline

Dual-axis time-series charts polled every 500 ms throughout the step.

  • Resource Timeline — CPU % (left axis) and RSS memory in MB (right axis)
  • I/O Timeline — Disk read/write MB/s (left axis) and network recv/sent MB/s (right axis)

Both charts share the same time axis so you can correlate spikes across metrics.

Resource Timeline and I/O Timeline

cProfile backend

The cprofile backend uses Python's built-in profiler — no extra dependencies. It captures every function call so sample counts are much higher. The flamegraph is otherwise identical.

cprofile backend — stats grid and CPU flamegraph

Failed steps

The card renders even when the step raises an exception — it shows the full profile up to the point of failure with a red banner at the top.

Backends

Backend Install Overhead Notes
pyinstrument pip install metaflow-profiler[pyinstrument] ~1% Statistical; recommended
cprofile (built-in) Medium Deterministic; captures every call

Optional extras

Extra Install Adds
memray pip install metaflow-profiler[memray] Memory allocation flamegraph
gpu pip install metaflow-profiler[gpu] GPU utilisation % + GPU memory timeline
all pip install metaflow-profiler[all] Everything above

How it works

@profile_card decorator
    ↓  starts backend in task_pre_step, stops in task_post_step / task_exception
Card renderer (ProfileCard)
    ↓  reads artifact, renders self-contained HTML
Backend registry
    ↓  picks best available backend
Backend implementations (pyinstrument / cprofile)
    ↓  wraps _TimelineCollector (psutil) + _MemoryTracker (memray)
Abstract interface (ProfilerBackend / ProfileData)

No upward imports between layers — enforced by structural tests.

Development

git clone https://github.com/npow/metaflow-profiler
cd metaflow-profiler
pip install -e ".[pyinstrument,dev]"

# Lint + type check
ruff check src/ tests/
mypy src/

# Tests
pytest tests/unit/
pytest tests/structural/ -m structural

License

Apache 2.0 — see LICENSE.

Metadata

Release files for metaflow-profiler 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for metaflow-profiler 0.1.0
File Size Uploaded Provenance
metaflow_profiler-0.1.0.tar.gz 980.2 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for metaflow-profiler 0.1.0
File Interpreter ABI Platform
metaflow_profiler-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.0 MB

Release files / metaflow_profiler-0.1.0.tar.gz

Download URL metaflow_profiler-0.1.0.tar.gz
Size 980.2 kB
Tags Source
SHA-256 checksum
How to use checksums
864285ae7f163ab1cd39814e94382f04196b55b08e5a56a6734897f88e89375f
BLAKE2b-256 checksum
How to use checksums
ceccf38b5cc93d4431d54faf4e51f9358153cec6da1ae7504cd6a7cc2a783267
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 28, 2026.

Transparency log

Release files / metaflow_profiler-0.1.0-py3-none-any.whl

Download URL metaflow_profiler-0.1.0-py3-none-any.whl
Size 32.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
79c4061959d2565d3465f3cac7e836090597a1d5c7e6656f378327b2f450a579
BLAKE2b-256 checksum
How to use checksums
c43a2c83ae564eb9c68a466c4b75cb8bc36b617267b56fbfe81f6d6108561813
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 28, 2026.

Transparency log

Security for metaflow-profiler 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for metaflow_profiler-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page