Observed since 20 Oct, 17:55 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Cross-accelerator (NVIDIA GPU / AWS Neuron) experiment store + profiling-analysis MCP.
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.
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".
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.
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.
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 var | Meaning |
|---|---|
MCP_MLFLOW_TRACKING_URI | MLflow tracking server — URI or SageMaker MLflow ARN (required) |
MCP_AWS_REGION | AWS region of the object store (required) |
MCP_TRACE_BUCKET | bucket holding the run artifacts (required) |
MCP_MOUNT_BASE | directory where <alias>/<run_id>/ files are readable — required by the file-reading tools (stage_run / resolve_artifacts / analyze) |
MCP_PORT | listen port (default 8080) |
MCP_ANALYZERS | JSON 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:
| Tool | What 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.
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.)
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.
MCP_PORT.pip install "mlflow[mcp]", mlflow mcp run) — run discovery and
search, which accelprof deliberately does not duplicate.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.
pypistats · 48 observations shown. Missing days are unknown. Source category: overall: without mirrors.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-16 – 2026-10-16 | 1 | 2026-10-20T22:11:18.2458317Z |
| 2026-10-14 – 2026-10-14 | 18 | 2026-10-20T22:11:18.2458317Z |
| 2026-10-13 – 2026-10-13 | 7 | 2026-10-20T22:11:18.2458317Z |
| 2026-10-11 – 2026-10-11 | 1 | 2026-10-20T22:11:18.2458317Z |
| 2026-10-10 – 2026-10-10 | 5 | 2026-10-20T22:11:18.2458317Z |
| 2026-10-09 – 2026-10-09 | 2 | 2026-10-20T22:11:18.2458317Z |
| 2026-10-08 – 2026-10-08 | 7 | 2026-10-20T22:11:18.2458317Z |
| 2026-10-07 – 2026-10-07 | 2 | 2026-10-20T22:11:18.2458317Z |
| 2026-10-06 – 2026-10-06 | 2 | 2026-10-20T22:11:18.2458317Z |
| 2026-10-04 – 2026-10-04 | 2 | 2026-10-20T22:11:18.2458317Z |
| 2026-10-01 – 2026-10-01 | 2 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-30 – 2026-09-30 | 3 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-29 – 2026-09-29 | 5 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-28 – 2026-09-28 | 4 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-27 – 2026-09-27 | 2 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-26 – 2026-09-26 | 3 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-25 – 2026-09-25 | 3 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-24 – 2026-09-24 | 3 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-21 – 2026-09-21 | 2 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-18 – 2026-09-18 | 11 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-17 – 2026-09-17 | 3 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-16 – 2026-09-16 | 10 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-15 – 2026-09-15 | 1 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-14 – 2026-09-14 | 5 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-12 – 2026-09-12 | 9 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-10 – 2026-09-10 | 1 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-09 – 2026-09-09 | 8 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-07 – 2026-09-07 | 10 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-06 – 2026-09-06 | 13 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-05 – 2026-09-05 | 8 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-04 – 2026-09-04 | 8 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-03 – 2026-09-03 | 12 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-02 – 2026-09-02 | 11 | 2026-10-20T22:11:18.2458317Z |
| 2026-09-01 – 2026-09-01 | 6 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-31 – 2026-08-31 | 9 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-30 – 2026-08-30 | 90 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-29 – 2026-08-29 | 19 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-28 – 2026-08-28 | 22 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-27 – 2026-08-27 | 31 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-26 – 2026-08-26 | 143 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-25 – 2026-08-25 | 5 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-24 – 2026-08-24 | 18 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-23 – 2026-08-23 | 13 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-21 – 2026-08-21 | 3 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-20 – 2026-08-20 | 1 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-18 – 2026-08-18 | 21 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-17 – 2026-08-17 | 21 | 2026-10-20T22:11:18.2458317Z |
| 2026-08-16 – 2026-08-16 | 129 | 2026-10-20T22:11:18.2458317Z |
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.3 | 30 Aug 2026 | 7 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 17:55 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:2550cac74b90195899c8853633e09f2b18b7740cf0340abab20939e0c0cdb28c