workloadtruth-cli 0.1.0__tar.gz → 0.1.1__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.
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/CHANGELOG.md +6 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/PKG-INFO +36 -1
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/README.md +35 -0
- workloadtruth_cli-0.1.1/docs/demo.gif +0 -0
- workloadtruth_cli-0.1.1/docs/demo.tape +18 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/npm-shim/package.json +1 -1
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/pyproject.toml +1 -1
- workloadtruth_cli-0.1.1/src/workloadtruth/__init__.py +1 -0
- workloadtruth_cli-0.1.0/src/workloadtruth/__init__.py +0 -1
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/.github/CODEOWNERS +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/.github/workflows/ci.yml +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/.github/workflows/no-internal-docs.yml +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/.github/workflows/publish-npm.yml +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/.github/workflows/publish-pypi.yml +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/.gitignore +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/.well-known/agent.json +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/CONTRIBUTING.md +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/LICENSE +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/SECURITY.md +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/npm-shim/bin/workloadtruth-cli.js +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/npm-shim/package-lock.json +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/scripts/check-no-internal-docs.sh +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/audit_log.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/benchmark.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/classifier/__init__.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/classifier/experimental.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/classifier/rules.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/cli.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/mcp_server.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/telemetry/__init__.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/telemetry/base.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/telemetry/nvml_backend.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/telemetry/synthetic_backend.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/types.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/tests/test_audit_log.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/tests/test_benchmark.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/tests/test_classifier.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/tests/test_cli.py +0 -0
- {workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/tests/test_synthetic_backend.py +0 -0
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.1 -- 2026-07-19
|
|
4
|
+
|
|
5
|
+
Docs-only release. README gets a real demo GIF, a table of contents, a
|
|
6
|
+
dedicated "What is WorkloadTruth" section, and 3 more FAQ entries
|
|
7
|
+
(comparison, platform compatibility, licensing). No code changes.
|
|
8
|
+
|
|
3
9
|
## 0.1.0 -- 2026-07-19
|
|
4
10
|
|
|
5
11
|
Initial release.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: workloadtruth-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
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
|
|
@@ -41,11 +41,31 @@ Description-Content-Type: text/markdown
|
|
|
41
41
|
**Classify a GPU workload as `TRAINING`, `INFERENCE`, or `IDLE` from telemetry alone. No code changes to the workload, no self-reported job labels.**
|
|
42
42
|
|
|
43
43
|
[](https://github.com/RudrenduPaul/WorkloadTruth/actions/workflows/ci.yml)
|
|
44
|
+
[](https://pypi.org/project/workloadtruth-cli/)
|
|
44
45
|
[](LICENSE)
|
|
45
46
|
[](pyproject.toml)
|
|
46
47
|
|
|
48
|
+

|
|
49
|
+
|
|
47
50
|
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
51
|
|
|
52
|
+
## Table of contents
|
|
53
|
+
|
|
54
|
+
- [Quick summary](#quick-summary)
|
|
55
|
+
- [Install](#install)
|
|
56
|
+
- [Quickstart](#quickstart)
|
|
57
|
+
- [How classification works](#how-classification-works)
|
|
58
|
+
- [Benchmark](#benchmark)
|
|
59
|
+
- [CLI reference](#cli-reference)
|
|
60
|
+
- [Agent-native (MCP + A2A)](#agent-native-mcp--a2a)
|
|
61
|
+
- [Audit log](#audit-log)
|
|
62
|
+
- [Why two registries](#why-two-registries)
|
|
63
|
+
- [Comparison](#comparison)
|
|
64
|
+
- [What is WorkloadTruth, and why does it exist](#what-is-workloadtruth-and-why-does-it-exist)
|
|
65
|
+
- [Relationship to prior research](#relationship-to-prior-research)
|
|
66
|
+
- [What WorkloadTruth is not](#what-workloadtruth-is-not)
|
|
67
|
+
- [FAQ](#faq)
|
|
68
|
+
|
|
49
69
|
## Quick summary
|
|
50
70
|
|
|
51
71
|
- **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 +200,12 @@ WorkloadTruth's implementation is Python. NVML access (`pynvml`/`nvidia-ml-py`)
|
|
|
180
200
|
|
|
181
201
|
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
202
|
|
|
203
|
+
## What is WorkloadTruth, and why does it exist
|
|
204
|
+
|
|
205
|
+
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.
|
|
206
|
+
|
|
207
|
+
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).
|
|
208
|
+
|
|
183
209
|
## Relationship to prior research
|
|
184
210
|
|
|
185
211
|
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 +237,15 @@ Not yet, and the benchmark section above is the honest reason why: 0% accuracy o
|
|
|
211
237
|
**Why not just use the ML classifier from the paper?**
|
|
212
238
|
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
239
|
|
|
240
|
+
**How is this different from run:ai or NVIDIA DCGM?**
|
|
241
|
+
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).
|
|
242
|
+
|
|
243
|
+
**Does this work on Windows, macOS, and Linux?**
|
|
244
|
+
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.
|
|
245
|
+
|
|
246
|
+
**What license is this under, and can I use it commercially?**
|
|
247
|
+
Apache 2.0. Commercial use, modification, and redistribution are all permitted under its terms; see [LICENSE](LICENSE).
|
|
248
|
+
|
|
214
249
|
## Contributing
|
|
215
250
|
|
|
216
251
|
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
|
[](https://github.com/RudrenduPaul/WorkloadTruth/actions/workflows/ci.yml)
|
|
6
|
+
[](https://pypi.org/project/workloadtruth-cli/)
|
|
6
7
|
[](LICENSE)
|
|
7
8
|
[](pyproject.toml)
|
|
8
9
|
|
|
10
|
+

|
|
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
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "workloadtruth-cli"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.1"
|
|
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"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.1"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.1.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/classifier/__init__.py
RENAMED
|
File without changes
|
{workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/classifier/experimental.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/telemetry/nvml_backend.py
RENAMED
|
File without changes
|
{workloadtruth_cli-0.1.0 → workloadtruth_cli-0.1.1}/src/workloadtruth/telemetry/synthetic_backend.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|