workloadtruth-cli 0.1.0__tar.gz → 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/CHANGELOG.md +12 -0
  2. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/PKG-INFO +39 -2
  3. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/README.md +35 -0
  4. workloadtruth_cli-0.1.2/docs/demo.gif +0 -0
  5. workloadtruth_cli-0.1.2/docs/demo.tape +18 -0
  6. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/npm-shim/package.json +1 -1
  7. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/pyproject.toml +4 -2
  8. workloadtruth_cli-0.1.2/src/workloadtruth/__init__.py +1 -0
  9. workloadtruth_cli-0.1.0/src/workloadtruth/__init__.py +0 -1
  10. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/.github/CODEOWNERS +0 -0
  11. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/.github/workflows/ci.yml +0 -0
  12. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/.github/workflows/no-internal-docs.yml +0 -0
  13. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/.github/workflows/publish-npm.yml +0 -0
  14. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/.github/workflows/publish-pypi.yml +0 -0
  15. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/.gitignore +0 -0
  16. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/.well-known/agent.json +0 -0
  17. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/CONTRIBUTING.md +0 -0
  18. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/LICENSE +0 -0
  19. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/SECURITY.md +0 -0
  20. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/npm-shim/bin/workloadtruth-cli.js +0 -0
  21. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/npm-shim/package-lock.json +0 -0
  22. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/scripts/check-no-internal-docs.sh +0 -0
  23. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/audit_log.py +0 -0
  24. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/benchmark.py +0 -0
  25. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/classifier/__init__.py +0 -0
  26. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/classifier/experimental.py +0 -0
  27. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/classifier/rules.py +0 -0
  28. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/cli.py +0 -0
  29. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/mcp_server.py +0 -0
  30. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/telemetry/__init__.py +0 -0
  31. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/telemetry/base.py +0 -0
  32. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/telemetry/nvml_backend.py +0 -0
  33. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/telemetry/synthetic_backend.py +0 -0
  34. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/src/workloadtruth/types.py +0 -0
  35. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/tests/test_audit_log.py +0 -0
  36. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/tests/test_benchmark.py +0 -0
  37. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/tests/test_classifier.py +0 -0
  38. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/tests/test_cli.py +0 -0
  39. {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.2}/tests/test_synthetic_backend.py +0 -0
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.2 -- 2026-07-19
4
+
5
+ Metadata-only release. Adds the second co-author (Sourav Nandy) to PyPI's
6
+ `authors`/`project.urls`, matching this maintainer's other published
7
+ `-cli` packages. No code changes.
8
+
9
+ ## 0.1.1 -- 2026-07-19
10
+
11
+ Docs-only release. README gets a real demo GIF, a table of contents, a
12
+ dedicated "What is WorkloadTruth" section, and 3 more FAQ entries
13
+ (comparison, platform compatibility, licensing). No code changes.
14
+
3
15
  ## 0.1.0 -- 2026-07-19
4
16
 
5
17
  Initial release.
@@ -1,12 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workloadtruth-cli
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Classify a GPU workload as inference or training from telemetry alone, no application changes required.
5
5
  Project-URL: Homepage, https://github.com/RudrenduPaul/WorkloadTruth
6
6
  Project-URL: Repository, https://github.com/RudrenduPaul/WorkloadTruth
7
7
  Project-URL: Issues, https://github.com/RudrenduPaul/WorkloadTruth/issues
8
8
  Project-URL: Changelog, https://github.com/RudrenduPaul/WorkloadTruth/blob/main/CHANGELOG.md
9
- Author: Rudrendu Paul
9
+ Project-URL: Author - Rudrendu Paul, https://github.com/RudrenduPaul
10
+ Project-URL: Author - Sourav Nandy, https://github.com/Sourav-nandy-ai
11
+ Author: Rudrendu Paul, Sourav Nandy
10
12
  License-Expression: Apache-2.0
11
13
  License-File: LICENSE
12
14
  Keywords: agent-tools,ai-governance,compute-monitoring,cuda,finops,gpu,mcp,mlops,nvml,observability
@@ -41,11 +43,31 @@ Description-Content-Type: text/markdown
41
43
  **Classify a GPU workload as `TRAINING`, `INFERENCE`, or `IDLE` from telemetry alone. No code changes to the workload, no self-reported job labels.**
42
44
 
43
45
  [![CI](https://github.com/RudrenduPaul/WorkloadTruth/actions/workflows/ci.yml/badge.svg)](https://github.com/RudrenduPaul/WorkloadTruth/actions/workflows/ci.yml)
46
+ [![PyPI](https://img.shields.io/pypi/v/workloadtruth-cli)](https://pypi.org/project/workloadtruth-cli/)
44
47
  [![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
45
48
  [![Python 3.9+](https://img.shields.io/badge/python-3.9%2B-blue)](pyproject.toml)
46
49
 
50
+ ![WorkloadTruth classifying a synthetic training workload, then running the evasion-robustness benchmark](https://raw.githubusercontent.com/RudrenduPaul/WorkloadTruth/main/docs/demo.gif)
51
+
47
52
  Every GPU scheduler in common use today, including [run:ai](https://docs.run.ai/v2.20/Researcher/workloads/inference/inference-overview/), Slurm, and Kubernetes GPU operators, asks you to *declare* whether a job is training or inference at submission time. None of them check. WorkloadTruth reads GPU telemetry (utilization, memory pattern, power draw) and answers the question independently, so a mislabeled or misbehaving job doesn't go unnoticed.
48
53
 
54
+ ## Table of contents
55
+
56
+ - [Quick summary](#quick-summary)
57
+ - [Install](#install)
58
+ - [Quickstart](#quickstart)
59
+ - [How classification works](#how-classification-works)
60
+ - [Benchmark](#benchmark)
61
+ - [CLI reference](#cli-reference)
62
+ - [Agent-native (MCP + A2A)](#agent-native-mcp--a2a)
63
+ - [Audit log](#audit-log)
64
+ - [Why two registries](#why-two-registries)
65
+ - [Comparison](#comparison)
66
+ - [What is WorkloadTruth, and why does it exist](#what-is-workloadtruth-and-why-does-it-exist)
67
+ - [Relationship to prior research](#relationship-to-prior-research)
68
+ - [What WorkloadTruth is not](#what-workloadtruth-is-not)
69
+ - [FAQ](#faq)
70
+
49
71
  ## Quick summary
50
72
 
51
73
  - **Install:** `pip install "workloadtruth-cli[nvml]"` for real GPU access, or `pip install workloadtruth-cli` to try it with the synthetic backend, no GPU needed
@@ -180,6 +202,12 @@ WorkloadTruth's implementation is Python. NVML access (`pynvml`/`nvidia-ml-py`)
180
202
 
181
203
  Checked directly against each project's own documentation: [DCGM exporter docs](https://docs.nvidia.com/datacenter/dcgm/latest/gpu-telemetry/dcgm-exporter.html), [run:ai inference overview](https://docs.run.ai/v2.20/Researcher/workloads/inference/inference-overview/), [W&B system metrics docs](https://docs.wandb.ai/models/ref/python/experiments/system-metrics). None of these classify workload type from telemetry alone. That gap is what WorkloadTruth fills.
182
204
 
205
+ ## What is WorkloadTruth, and why does it exist
206
+
207
+ WorkloadTruth is an open-source command-line tool and MCP server that classifies a running GPU workload as `TRAINING`, `INFERENCE`, or `IDLE` using only GPU-level telemetry (utilization, memory pattern, power draw), with no changes to the workload's own code and no reliance on a self-reported job label.
208
+
209
+ It exists because every mainstream GPU scheduler asks the job's owner to declare its type at submission time and never checks that declaration against what the hardware is actually doing. That gap has two real consequences: cost misallocation (a job scheduled at low-priority "inference" pricing that is actually running full training) and unauthorized workload changes (an inference endpoint that quietly starts training on live traffic). WorkloadTruth closes that verification gap today, and doubles as the first open, installable implementation of a real academic research thread on verifying AI training runs from hardware telemetry (see below).
210
+
183
211
  ## Relationship to prior research
184
212
 
185
213
  WorkloadTruth's core technique, classifying training vs. non-training GPU activity from telemetry, is not novel. It's the direct application of a real, active research thread:
@@ -211,6 +239,15 @@ Not yet, and the benchmark section above is the honest reason why: 0% accuracy o
211
239
  **Why not just use the ML classifier from the paper?**
212
240
  Its trained weights and dataset were never published. Reimplementing an ML classifier without real training data would produce an unvalidated accuracy claim, not a measured one. See [How classification works](#how-classification-works).
213
241
 
242
+ **How is this different from run:ai or NVIDIA DCGM?**
243
+ run:ai and DCGM both expose or use GPU telemetry, but neither classifies workload type from that telemetry. run:ai relies entirely on the label the job's owner declares at submission; DCGM just exposes raw utilization and memory metrics for something else to interpret. WorkloadTruth is the layer that actually looks at the telemetry and answers the question. See the [comparison table](#comparison).
244
+
245
+ **Does this work on Windows, macOS, and Linux?**
246
+ The `synthetic` backend runs anywhere Python 3.9+ runs, including this project's own macOS build environment (which has no NVIDIA GPU). The `nvml` backend requires an NVIDIA GPU and driver, which in practice means Linux or Windows with NVIDIA hardware; NVML itself is not available on macOS.
247
+
248
+ **What license is this under, and can I use it commercially?**
249
+ Apache 2.0. Commercial use, modification, and redistribution are all permitted under its terms; see [LICENSE](LICENSE).
250
+
214
251
  ## Contributing
215
252
 
216
253
  See [CONTRIBUTING.md](CONTRIBUTING.md). Security issues: see [SECURITY.md](SECURITY.md).
@@ -3,11 +3,31 @@
3
3
  **Classify a GPU workload as `TRAINING`, `INFERENCE`, or `IDLE` from telemetry alone. No code changes to the workload, no self-reported job labels.**
4
4
 
5
5
  [![CI](https://github.com/RudrenduPaul/WorkloadTruth/actions/workflows/ci.yml/badge.svg)](https://github.com/RudrenduPaul/WorkloadTruth/actions/workflows/ci.yml)
6
+ [![PyPI](https://img.shields.io/pypi/v/workloadtruth-cli)](https://pypi.org/project/workloadtruth-cli/)
6
7
  [![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
7
8
  [![Python 3.9+](https://img.shields.io/badge/python-3.9%2B-blue)](pyproject.toml)
8
9
 
10
+ ![WorkloadTruth classifying a synthetic training workload, then running the evasion-robustness benchmark](https://raw.githubusercontent.com/RudrenduPaul/WorkloadTruth/main/docs/demo.gif)
11
+
9
12
  Every GPU scheduler in common use today, including [run:ai](https://docs.run.ai/v2.20/Researcher/workloads/inference/inference-overview/), Slurm, and Kubernetes GPU operators, asks you to *declare* whether a job is training or inference at submission time. None of them check. WorkloadTruth reads GPU telemetry (utilization, memory pattern, power draw) and answers the question independently, so a mislabeled or misbehaving job doesn't go unnoticed.
10
13
 
14
+ ## Table of contents
15
+
16
+ - [Quick summary](#quick-summary)
17
+ - [Install](#install)
18
+ - [Quickstart](#quickstart)
19
+ - [How classification works](#how-classification-works)
20
+ - [Benchmark](#benchmark)
21
+ - [CLI reference](#cli-reference)
22
+ - [Agent-native (MCP + A2A)](#agent-native-mcp--a2a)
23
+ - [Audit log](#audit-log)
24
+ - [Why two registries](#why-two-registries)
25
+ - [Comparison](#comparison)
26
+ - [What is WorkloadTruth, and why does it exist](#what-is-workloadtruth-and-why-does-it-exist)
27
+ - [Relationship to prior research](#relationship-to-prior-research)
28
+ - [What WorkloadTruth is not](#what-workloadtruth-is-not)
29
+ - [FAQ](#faq)
30
+
11
31
  ## Quick summary
12
32
 
13
33
  - **Install:** `pip install "workloadtruth-cli[nvml]"` for real GPU access, or `pip install workloadtruth-cli` to try it with the synthetic backend, no GPU needed
@@ -142,6 +162,12 @@ WorkloadTruth's implementation is Python. NVML access (`pynvml`/`nvidia-ml-py`)
142
162
 
143
163
  Checked directly against each project's own documentation: [DCGM exporter docs](https://docs.nvidia.com/datacenter/dcgm/latest/gpu-telemetry/dcgm-exporter.html), [run:ai inference overview](https://docs.run.ai/v2.20/Researcher/workloads/inference/inference-overview/), [W&B system metrics docs](https://docs.wandb.ai/models/ref/python/experiments/system-metrics). None of these classify workload type from telemetry alone. That gap is what WorkloadTruth fills.
144
164
 
165
+ ## What is WorkloadTruth, and why does it exist
166
+
167
+ WorkloadTruth is an open-source command-line tool and MCP server that classifies a running GPU workload as `TRAINING`, `INFERENCE`, or `IDLE` using only GPU-level telemetry (utilization, memory pattern, power draw), with no changes to the workload's own code and no reliance on a self-reported job label.
168
+
169
+ It exists because every mainstream GPU scheduler asks the job's owner to declare its type at submission time and never checks that declaration against what the hardware is actually doing. That gap has two real consequences: cost misallocation (a job scheduled at low-priority "inference" pricing that is actually running full training) and unauthorized workload changes (an inference endpoint that quietly starts training on live traffic). WorkloadTruth closes that verification gap today, and doubles as the first open, installable implementation of a real academic research thread on verifying AI training runs from hardware telemetry (see below).
170
+
145
171
  ## Relationship to prior research
146
172
 
147
173
  WorkloadTruth's core technique, classifying training vs. non-training GPU activity from telemetry, is not novel. It's the direct application of a real, active research thread:
@@ -173,6 +199,15 @@ Not yet, and the benchmark section above is the honest reason why: 0% accuracy o
173
199
  **Why not just use the ML classifier from the paper?**
174
200
  Its trained weights and dataset were never published. Reimplementing an ML classifier without real training data would produce an unvalidated accuracy claim, not a measured one. See [How classification works](#how-classification-works).
175
201
 
202
+ **How is this different from run:ai or NVIDIA DCGM?**
203
+ run:ai and DCGM both expose or use GPU telemetry, but neither classifies workload type from that telemetry. run:ai relies entirely on the label the job's owner declares at submission; DCGM just exposes raw utilization and memory metrics for something else to interpret. WorkloadTruth is the layer that actually looks at the telemetry and answers the question. See the [comparison table](#comparison).
204
+
205
+ **Does this work on Windows, macOS, and Linux?**
206
+ The `synthetic` backend runs anywhere Python 3.9+ runs, including this project's own macOS build environment (which has no NVIDIA GPU). The `nvml` backend requires an NVIDIA GPU and driver, which in practice means Linux or Windows with NVIDIA hardware; NVML itself is not available on macOS.
207
+
208
+ **What license is this under, and can I use it commercially?**
209
+ Apache 2.0. Commercial use, modification, and redistribution are all permitted under its terms; see [LICENSE](LICENSE).
210
+
176
211
  ## Contributing
177
212
 
178
213
  See [CONTRIBUTING.md](CONTRIBUTING.md). Security issues: see [SECURITY.md](SECURITY.md).
Binary file
@@ -0,0 +1,18 @@
1
+ Output docs/demo.gif
2
+
3
+ Set Shell "bash"
4
+ Set FontSize 16
5
+ Set Width 1000
6
+ Set Height 560
7
+ Set Padding 20
8
+ Set Theme "Dracula"
9
+
10
+ Type "workloadtruth classify --backend synthetic --profile training --samples 10 --interval 0"
11
+ Sleep 500ms
12
+ Enter
13
+ Sleep 3s
14
+
15
+ Type "workloadtruth benchmark --trials 30 --window 20"
16
+ Sleep 500ms
17
+ Enter
18
+ Sleep 4s
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workloadtruth-cli",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Classify a GPU workload as inference or training from telemetry alone, no application changes required.",
5
5
  "keywords": [
6
6
  "gpu",
@@ -4,12 +4,12 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "workloadtruth-cli"
7
- version = "0.1.0"
7
+ version = "0.1.2"
8
8
  description = "Classify a GPU workload as inference or training from telemetry alone, no application changes required."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
11
11
  requires-python = ">=3.9"
12
- authors = [{ name = "Rudrendu Paul" }]
12
+ authors = [{ name = "Rudrendu Paul" }, { name = "Sourav Nandy" }]
13
13
  keywords = [
14
14
  "gpu",
15
15
  "nvml",
@@ -54,6 +54,8 @@ Homepage = "https://github.com/RudrenduPaul/WorkloadTruth"
54
54
  Repository = "https://github.com/RudrenduPaul/WorkloadTruth"
55
55
  Issues = "https://github.com/RudrenduPaul/WorkloadTruth/issues"
56
56
  Changelog = "https://github.com/RudrenduPaul/WorkloadTruth/blob/main/CHANGELOG.md"
57
+ "Author - Rudrendu Paul" = "https://github.com/RudrenduPaul"
58
+ "Author - Sourav Nandy" = "https://github.com/Sourav-nandy-ai"
57
59
 
58
60
  [project.scripts]
59
61
  workloadtruth = "workloadtruth.cli:main"
@@ -0,0 +1 @@
1
+ __version__ = "0.1.2"
@@ -1 +0,0 @@
1
- __version__ = "0.1.0"