Catalog PyPI
PACKAGE EXPLORERView in registry

accelprof

PyPI

Cross-accelerator (NVIDIA GPU / AWS Neuron) experiment store + profiling-analysis MCP.

Versions collected1
Direct dependencies7From release 0.1.3
Last observed20 Oct, 17:55 UTC

README

Version 0.1.3 documentation

accelprof

ci python license

Give every GPU and Neuron run one identity, then turn its profiler artifacts into advice over MCP.

accelprof is two things that share one convention:

  • experiment_store — a small library. A producer calls log(...) to record a run; a consumer calls resolve(...) / locate(...) to find it again. Runs live under a deterministic s3://<bucket>/<alias>/<run_id>/ prefix with MLflow as the searchable index.
  • accelprof-analysis-mcp — an MCP server. It maps a run to its artifact files on a directory it can read, runs an analyzer over them, and returns the finding as text. The trace itself — often multiple gigabytes — is read in place and never sent to the client.

It assumes no orchestrator; Kubernetes is one way to host the MCP, not a requirement.

Fixed IDs, open content

A run is addressed by a fixed set of reserved tags — alias, chip, region, workload_id, artifacts_uri, schema_version — and nothing else is constrained. Metrics, parameters, free-form tags, and the set of artifact files are recorded verbatim; the store never enumerates or normalizes them. So GPU and Neuron runs — profiled by different tools with different keys — share one index without a fixed schema of what is "comparable".

Install

pip install accelprof            # the experiment_store library
pip install "accelprof[mcp]"     # + the accelprof-analysis-mcp server

Requirements: Python 3.10+, an S3-compatible object store for artifacts, an MLflow tracking server (self-hosted, or SageMaker-managed via the [sagemaker] extra), and AWS credentials on the standard chain (environment, shared config, or an instance/Pod role). The base install imports as experiment_store; the [mcp] extra adds the analysis_mcp module and the console script.

Record a run (producer)

from experiment_store import ExperimentStore

store = ExperimentStore.build(region=REGION, trace_bucket=TRACE_BUCKET, tracking_uri=MLFLOW_URI)
store.log(
    "llama3-8b-parity",                 # alias — the experiment this run belongs to
    chip="gpu", region=REGION, workload_id="prefill-bs1",
    metrics={"cosine": 0.9997},         # open content: any keys you measure
    tags={"run_no": "1"},
    artifacts=["/tmp/run.nsys-rep"],    # uploaded under s3://<bucket>/<alias>/<run_id>/
)

The store sets artifacts_uri and schema_version, and a successful log() marks the run FINISHED. A consumer finds the run again and reads its artifacts in place — no download. To use locate, pass mount_base= to build:

runs = store.resolve("llama3-8b-parity")     # FINISHED runs under the alias -> list[RunRef]
local_dir = store.locate(runs[0])            # the run's directory on the mounted bucket

examples/ holds copy-and-adapt producer templates: an nsys GPU producer (examples/gpu_nsys/produce.py), a device-free Neuron compile recipe (examples/neuron_cpu_compile.py), and a benchmark-iteration template (examples/benchmark_iteration/). They are not shipped in the wheel.

Analyze a run (the MCP)

MCP_MLFLOW_TRACKING_URI=<uri> MCP_AWS_REGION=<region> MCP_TRACE_BUCKET=<bucket> \
  MCP_MOUNT_BASE=/path/to/artifacts accelprof-analysis-mcp     # streamable-http on MCP_PORT (8080)
Env varMeaning
MCP_MLFLOW_TRACKING_URIMLflow tracking server — URI or SageMaker MLflow ARN (required)
MCP_AWS_REGIONAWS region of the object store (required)
MCP_TRACE_BUCKETbucket holding the run artifacts (required)
MCP_MOUNT_BASEdirectory where <alias>/<run_id>/ files are readable — required by the file-reading tools (stage_run / resolve_artifacts / analyze)
MCP_PORTlisten port (default 8080)
MCP_ANALYZERSJSON map registering extra command/server analyzers (e.g. nsys, neuron)

Register it with any MCP client — for example Claude Code:

claude mcp add --transport http accelprof http://127.0.0.1:8080/mcp

The server exposes three tools. Run discovery is intentionally not among them — find the run_id with the MLflow MCP (see docs/mlflow-mcp.md), then:

ToolWhat it does
stage_run(run_id)Ensure the run's artifacts are readable under MCP_MOUNT_BASE (triggers a lazy mount import, no copy) and return the local dir + file inventory.
resolve_artifacts(run_id | alias+chip, pattern="*")Return the absolute path(s) of artifact files matching a glob (e.g. *.nsys-rep, *.neff); alias+chip picks the latest FINISHED run of that chip. Hand the paths to an analyzer or any tool reading the same mount.
analyze(run_id, analyzer="inventory")Run an analyzer over the staged dir and return the finding as text.

The built-in inventory analyzer needs no external tool and confirms the stage → analyze path end to end:

{
  "run_id": "a1b2c3…", "chip": "gpu", "analyzer": "inventory",
  "dir": "/path/to/artifacts/llama3-8b-parity/a1b2c3…",
  "advice": "inventory of …:\n  run.nsys-rep\t734003200\ntotal_files=1 total_bytes=734003200"
}

A deployment registers real tools through MCP_ANALYZERS — a JSON map of name → spec, where a spec is an argv list (a command analyzer) or an object with type: command | server. Argv templates use {dir} / {file:GLOB} / {files:GLOB} placeholders, the tool runs without a shell, and its stdout becomes the advice:

MCP_ANALYZERS='{"nsys-stats": ["nsys","stats","{file:*.nsys-rep}"]}'   # type defaults to "command"

A server-type spec ({"type":"server","start":[…],"ready_port":3002,"query":[…]}) drives a tool that serves results rather than printing them (e.g. neuron-explorer for Neuron).

How MCP_MOUNT_BASE gets populated is your choice: an S3 Files read-only mount, an NFS export, or a local sync.

Testing

pip install -e ".[mcp,test]"
MLFLOW_ALLOW_FILE_STORE=true python -m pytest experiment_store/ analysis_mcp/ examples/ -q

The suite runs with no cloud: a mocked S3 (moto) and a file-store MLflow stand in for the services, and a temporary directory stands in for the artifact mount — so you can exercise the full log → resolve → stage → analyze path before wiring anything real. (MLFLOW_ALLOW_FILE_STORE is this repo's own opt-in to run the tests against MLflow's file store.)

Hosting

Dockerfile.analysis-mcp is a reference image that installs the package and runs the console script; Dockerfile.analysis-mcp-nsys layers the Nsight Systems CLI so an nsys stats analyzer can be registered, and Dockerfile.neuron-cc layers the Neuron compiler for the device-free compile recipe. Provisioning the object store, MLflow, and the artifact mount, and hosting this MCP alongside others, is handled by a separate deployment repo (distributed-ai). See docs/PLATFORM.md for the architecture.

The server authenticates to S3 and MLflow via the standard AWS credential chain, and serves plain streamable-http with no built-in authentication — bind it to loopback and reach it with kubectl port-forward, or front it with your own auth layer. stage_run only verifies the files are readable (triggering a lazy S3 mount import if the backend needs one); it never copies data.

  • accelprof-knowledge — a knowledge MCP of GPU/Neuron tuning playbooks. Pair it with this one to turn a finding into a next step. When hosting both, give each its own MCP_PORT.
  • The official MLflow MCP (pip install "mlflow[mcp]", mlflow mcp run) — run discovery and search, which accelprof deliberately does not duplicate.

Contributing & license

Add a profiling tool by registering a command/server analyzer via MCP_ANALYZERS — no code change. Add a serving framework to the benchmark example by dropping an adapter under examples/benchmark_iteration/adapters/. Keep the test command above green.

Licensed under the Apache License 2.0 — see LICENSE.

Downloads & popularity

1downloads
1-day window · source-reported counts16 Oct 2026
14371.50
2026-08-16: 129 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-16–2026-08-162026-08-17: 21 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-17–2026-08-172026-08-18: 21 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-18–2026-08-182026-08-20: 1 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-20–2026-08-202026-08-21: 3 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-21–2026-08-212026-08-23: 13 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-23–2026-08-232026-08-24: 18 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-24–2026-08-242026-08-25: 5 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-25–2026-08-252026-08-26: 143 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-26–2026-08-262026-08-27: 31 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-27–2026-08-272026-08-28: 22 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-28–2026-08-282026-08-29: 19 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-29–2026-08-292026-08-30: 90 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-30–2026-08-302026-08-31: 9 · observed 2026-10-20T22:11:18.2458317Z · period 2026-08-31–2026-08-312026-09-01: 6 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-01–2026-09-012026-09-02: 11 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-02–2026-09-022026-09-03: 12 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-03–2026-09-032026-09-04: 8 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-04–2026-09-042026-09-05: 8 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-05–2026-09-052026-09-06: 13 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-06–2026-09-062026-09-07: 10 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-07–2026-09-072026-09-09: 8 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-09–2026-09-092026-09-10: 1 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-10–2026-09-102026-09-12: 9 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-12–2026-09-122026-09-14: 5 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-14–2026-09-142026-09-15: 1 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-15–2026-09-152026-09-16: 10 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-16–2026-09-162026-09-17: 3 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-17–2026-09-172026-09-18: 11 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-18–2026-09-182026-09-21: 2 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-21–2026-09-212026-09-24: 3 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-24–2026-09-242026-09-25: 3 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-25–2026-09-252026-09-26: 3 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-26–2026-09-262026-09-27: 2 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-27–2026-09-272026-09-28: 4 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-28–2026-09-282026-09-29: 5 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-29–2026-09-292026-09-30: 3 · observed 2026-10-20T22:11:18.2458317Z · period 2026-09-30–2026-09-302026-10-01: 2 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-01–2026-10-012026-10-04: 2 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-04–2026-10-042026-10-06: 2 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-06–2026-10-062026-10-07: 2 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-07–2026-10-072026-10-08: 7 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-08–2026-10-082026-10-09: 2 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-09–2026-10-092026-10-10: 5 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-10–2026-10-102026-10-11: 1 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-11–2026-10-112026-10-13: 7 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-13–2026-10-132026-10-14: 18 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-14–2026-10-142026-10-16: 1 · observed 2026-10-20T22:11:18.2458317Z · period 2026-10-16–2026-10-16
16 Aug16 Oct

pypistats · 48 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-16 – 2026-10-1612026-10-20T22:11:18.2458317Z
2026-10-14 – 2026-10-14182026-10-20T22:11:18.2458317Z
2026-10-13 – 2026-10-1372026-10-20T22:11:18.2458317Z
2026-10-11 – 2026-10-1112026-10-20T22:11:18.2458317Z
2026-10-10 – 2026-10-1052026-10-20T22:11:18.2458317Z
2026-10-09 – 2026-10-0922026-10-20T22:11:18.2458317Z
2026-10-08 – 2026-10-0872026-10-20T22:11:18.2458317Z
2026-10-07 – 2026-10-0722026-10-20T22:11:18.2458317Z
2026-10-06 – 2026-10-0622026-10-20T22:11:18.2458317Z
2026-10-04 – 2026-10-0422026-10-20T22:11:18.2458317Z
2026-10-01 – 2026-10-0122026-10-20T22:11:18.2458317Z
2026-09-30 – 2026-09-3032026-10-20T22:11:18.2458317Z
2026-09-29 – 2026-09-2952026-10-20T22:11:18.2458317Z
2026-09-28 – 2026-09-2842026-10-20T22:11:18.2458317Z
2026-09-27 – 2026-09-2722026-10-20T22:11:18.2458317Z
2026-09-26 – 2026-09-2632026-10-20T22:11:18.2458317Z
2026-09-25 – 2026-09-2532026-10-20T22:11:18.2458317Z
2026-09-24 – 2026-09-2432026-10-20T22:11:18.2458317Z
2026-09-21 – 2026-09-2122026-10-20T22:11:18.2458317Z
2026-09-18 – 2026-09-18112026-10-20T22:11:18.2458317Z
2026-09-17 – 2026-09-1732026-10-20T22:11:18.2458317Z
2026-09-16 – 2026-09-16102026-10-20T22:11:18.2458317Z
2026-09-15 – 2026-09-1512026-10-20T22:11:18.2458317Z
2026-09-14 – 2026-09-1452026-10-20T22:11:18.2458317Z
2026-09-12 – 2026-09-1292026-10-20T22:11:18.2458317Z
2026-09-10 – 2026-09-1012026-10-20T22:11:18.2458317Z
2026-09-09 – 2026-09-0982026-10-20T22:11:18.2458317Z
2026-09-07 – 2026-09-07102026-10-20T22:11:18.2458317Z
2026-09-06 – 2026-09-06132026-10-20T22:11:18.2458317Z
2026-09-05 – 2026-09-0582026-10-20T22:11:18.2458317Z
2026-09-04 – 2026-09-0482026-10-20T22:11:18.2458317Z
2026-09-03 – 2026-09-03122026-10-20T22:11:18.2458317Z
2026-09-02 – 2026-09-02112026-10-20T22:11:18.2458317Z
2026-09-01 – 2026-09-0162026-10-20T22:11:18.2458317Z
2026-08-31 – 2026-08-3192026-10-20T22:11:18.2458317Z
2026-08-30 – 2026-08-30902026-10-20T22:11:18.2458317Z
2026-08-29 – 2026-08-29192026-10-20T22:11:18.2458317Z
2026-08-28 – 2026-08-28222026-10-20T22:11:18.2458317Z
2026-08-27 – 2026-08-27312026-10-20T22:11:18.2458317Z
2026-08-26 – 2026-08-261432026-10-20T22:11:18.2458317Z
2026-08-25 – 2026-08-2552026-10-20T22:11:18.2458317Z
2026-08-24 – 2026-08-24182026-10-20T22:11:18.2458317Z
2026-08-23 – 2026-08-23132026-10-20T22:11:18.2458317Z
2026-08-21 – 2026-08-2132026-10-20T22:11:18.2458317Z
2026-08-20 – 2026-08-2012026-10-20T22:11:18.2458317Z
2026-08-18 – 2026-08-18212026-10-20T22:11:18.2458317Z
2026-08-17 – 2026-08-17212026-10-20T22:11:18.2458317Z
2026-08-16 – 2026-08-161292026-10-20T22:11:18.2458317Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.1.330 Aug 20267

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
littlemex/accelprof

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 17:55 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:2550cac74b90195899c8853633e09f2b18b7740cf0340abab20939e0c0cdb28c