gpu-burn 2.2.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.
gpu_burn-2.2.1/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 gpu-burn contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1 @@
1
+ include tests/real_gpu_dynamic.py
@@ -0,0 +1,193 @@
1
+ Metadata-Version: 2.4
2
+ Name: gpu-burn
3
+ Version: 2.2.1
4
+ Summary: Control GPU compute utilization with a managed PaddlePaddle workload
5
+ License-Expression: MIT
6
+ Project-URL: Source, https://github.com/cangtianhuang/gpu-burn
7
+ Project-URL: Issues, https://github.com/cangtianhuang/gpu-burn/issues
8
+ Project-URL: PaddlePaddle, https://www.paddlepaddle.org.cn/
9
+ Keywords: gpu,paddlepaddle,cuda,stress-test,utilization
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Intended Audience :: System Administrators
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: System :: Hardware
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: paddlepaddle-gpu<4.0.0,>=2.6.2
24
+ Dynamic: license-file
25
+
26
+ # gpu-burn
27
+
28
+ `gpu-burn` runs a configurable matrix-multiplication workload on one or more
29
+ NVIDIA GPUs using PaddlePaddle. It dynamically yields each GPU when another
30
+ process starts using a configured percentage of device memory, then resumes after
31
+ that GPU has remained idle for the configured period.
32
+
33
+ This project is not related to the CUDA/C++ project
34
+ [`wilicc/gpu-burn`](https://github.com/wilicc/gpu-burn). It does not validate
35
+ calculation results and should not be used as a hardware fault or ECC diagnostic.
36
+
37
+ ## Requirements
38
+
39
+ - Linux and Python 3.10 or newer
40
+ - NVIDIA GPU and a compatible CUDA driver
41
+ - **PaddlePaddle with CUDA support**
42
+
43
+ The PyPI package explicitly depends on `paddlepaddle-gpu>=2.6.2,<4.0.0`.
44
+ PaddlePaddle publishes different packages and indexes for some CUDA versions, so
45
+ install the build recommended by the
46
+ [official PaddlePaddle installation guide](https://www.paddlepaddle.org.cn/install/quick)
47
+ when the default PyPI build does not match your CUDA environment.
48
+
49
+ ## Installation
50
+
51
+ Install from PyPI:
52
+
53
+ ```bash
54
+ python -m pip install gpu-burn
55
+ ```
56
+
57
+ For a CUDA-specific PaddlePaddle build, install PaddlePaddle first and then avoid
58
+ letting pip replace it:
59
+
60
+ ```bash
61
+ # Install the appropriate paddlepaddle-gpu build from the official Paddle index.
62
+ python -m pip install --no-deps gpu-burn
63
+ ```
64
+
65
+ Install from a source checkout:
66
+
67
+ ```bash
68
+ python -m pip install .
69
+ ```
70
+
71
+ ## Usage
72
+
73
+ Run on all detected GPUs in the foreground at full utilization:
74
+
75
+ ```bash
76
+ gpu-burn run
77
+ ```
78
+
79
+ Select devices and target an approximate compute duty cycle:
80
+
81
+ ```bash
82
+ gpu-burn run --devs 0,2-3 --util 60
83
+ ```
84
+
85
+ Configure adaptive yielding with hysteresis. This pauses only the affected GPU
86
+ when external compute processes use at least 5% of its total memory. Its worker
87
+ restarts after usage remains at or below 2% for 5 continuous minutes:
88
+
89
+ ```bash
90
+ gpu-burn run -d 0,2-3 -u 60 -P 5 -R 2 -i 5 -p 1
91
+ ```
92
+
93
+ Run as a per-user background process:
94
+
95
+ ```bash
96
+ gpu-burn start --gpus 2 --util 80
97
+ gpu-burn status
98
+ gpu-burn logs -f
99
+ gpu-burn stop
100
+ ```
101
+
102
+ With no options, `gpu-burn start` selects every Paddle-visible GPU and uses:
103
+
104
+ - `16384x16384` float16 matrix multiplication
105
+ - 100% compute duty-cycle target
106
+ - pause at 5% external memory, resume at or below 2%
107
+ - 5 continuous idle minutes before restart
108
+ - 1-second monitoring interval
109
+
110
+ After the supervisor becomes ready, startup output includes the resolved GPU
111
+ count, each device's running or paused state, worker PIDs, workload, adaptive
112
+ policy, supervisor PID, and log path:
113
+
114
+ ```text
115
+ ✓ gpu-burn is ready
116
+
117
+ gpu-burn 2.2.1 started
118
+ supervisor : pid 42000
119
+ devices : 2 selected, 2 running, 0 paused
120
+ gpu:0 : running (pid 42010)
121
+ gpu:1 : running (pid 42011)
122
+ workload : 16384x16384 float16, util 100%
123
+ adaptive : pause >= 5%, resume <= 2%, idle 5 min, poll 1s
124
+ log : /tmp/gpu-burn-1000/gpu-burn.log
125
+ ```
126
+
127
+ On an interactive terminal, the first line is an animated spinner while Paddle
128
+ and NVIDIA devices are checked. Redirected output automatically uses plain text.
129
+ Set `GPU_BURN_NO_SPINNER=1` to disable animation explicitly.
130
+
131
+ The main workload options are:
132
+
133
+ | Option | Meaning | Default |
134
+ | --- | --- | --- |
135
+ | `-g`, `--gpus N` | Use the first `N` visible GPUs | all |
136
+ | `-d`, `--devs LIST` | Device IDs/ranges such as `0,2-3` | all |
137
+ | `-u`, `--util PERCENT` | Approximate compute duty cycle in `(0, 100]` | `100` |
138
+ | `-m`, `--size N` | Square matrix dimension | `16384` |
139
+ | `-t`, `--type TYPE` | `float16` or `float32` | `float16` |
140
+ | `-l`, `--log-int SECONDS` | Worker progress log interval | `30` |
141
+ | `-P`, `--pause PERCENT` | Pause at this external memory percentage | `5` |
142
+ | `-R`, `--resume PERCENT` | Start the idle timer at or below this percentage | `2` |
143
+ | `-i`, `--idle MINUTES` | Continuous idle minutes before restart | `5` |
144
+ | `-p`, `--poll SECONDS` | Memory polling interval | `1` |
145
+
146
+ `--gpus` and `--devs` are mutually exclusive. Lower utilization is
147
+ implemented by alternating synchronized matrix multiplication with idle time, so
148
+ the value observed by monitoring tools can vary with sampling intervals and GPU
149
+ power-management behavior.
150
+
151
+ The supervisor queries `nvidia-smi` compute applications and excludes its own
152
+ worker PIDs. Memory from other compute processes is summed per selected GPU and
153
+ divided by that GPU's total physical memory. At `--pause`, only that GPU's
154
+ worker is stopped, which releases its PaddlePaddle tensors and GPU memory. Once
155
+ usage reaches `--resume` or lower, it must remain there for `--idle` minutes
156
+ before a new worker starts. `--resume` must be lower than `--pause`; this
157
+ hysteresis prevents repeated stop/start cycles near one threshold. Display-only
158
+ contexts absent from NVIDIA's compute-app list are not considered.
159
+ Numeric and UUID-based `CUDA_VISIBLE_DEVICES` remapping is honored, so CLI device
160
+ IDs remain the same logical IDs that PaddlePaddle exposes.
161
+
162
+ ## State and cleanup
163
+
164
+ Only one managed instance is allowed per user. Runtime state and logs are stored
165
+ under `$GPU_BURN_STATE_DIR`, `$XDG_RUNTIME_DIR/gpu-burn`, or
166
+ `/tmp/gpu-burn-$UID`, in that order. `gpu-burn stop --force` sends `SIGKILL` if a
167
+ worker does not stop before the configured timeout.
168
+
169
+ ## Development
170
+
171
+ The PEP 517 build requirement uses a compatible lower bound
172
+ (`setuptools>=77`) instead of pinning one exact backend release. An exact pin
173
+ makes builds byte-for-byte easier to reproduce, but also forces every source
174
+ installer to download that precise release and can unnecessarily break offline
175
+ or constrained environments. This pure-Python project does not need `wheel` in
176
+ `build-system.requires`; setuptools implements the wheel build hook itself.
177
+ Release CI pins the user-facing `build` and `twine` tools separately.
178
+
179
+ ```bash
180
+ python -m pip install --no-deps -e .
181
+ python -m pytest
182
+ python -m build
183
+ ```
184
+
185
+ Run the opt-in adaptive lifecycle test on a real GPU:
186
+
187
+ ```bash
188
+ GPU_BURN_TEST_DEVICE=0 python tests/real_gpu_dynamic.py
189
+ ```
190
+
191
+ ## License
192
+
193
+ MIT
@@ -0,0 +1,168 @@
1
+ # gpu-burn
2
+
3
+ `gpu-burn` runs a configurable matrix-multiplication workload on one or more
4
+ NVIDIA GPUs using PaddlePaddle. It dynamically yields each GPU when another
5
+ process starts using a configured percentage of device memory, then resumes after
6
+ that GPU has remained idle for the configured period.
7
+
8
+ This project is not related to the CUDA/C++ project
9
+ [`wilicc/gpu-burn`](https://github.com/wilicc/gpu-burn). It does not validate
10
+ calculation results and should not be used as a hardware fault or ECC diagnostic.
11
+
12
+ ## Requirements
13
+
14
+ - Linux and Python 3.10 or newer
15
+ - NVIDIA GPU and a compatible CUDA driver
16
+ - **PaddlePaddle with CUDA support**
17
+
18
+ The PyPI package explicitly depends on `paddlepaddle-gpu>=2.6.2,<4.0.0`.
19
+ PaddlePaddle publishes different packages and indexes for some CUDA versions, so
20
+ install the build recommended by the
21
+ [official PaddlePaddle installation guide](https://www.paddlepaddle.org.cn/install/quick)
22
+ when the default PyPI build does not match your CUDA environment.
23
+
24
+ ## Installation
25
+
26
+ Install from PyPI:
27
+
28
+ ```bash
29
+ python -m pip install gpu-burn
30
+ ```
31
+
32
+ For a CUDA-specific PaddlePaddle build, install PaddlePaddle first and then avoid
33
+ letting pip replace it:
34
+
35
+ ```bash
36
+ # Install the appropriate paddlepaddle-gpu build from the official Paddle index.
37
+ python -m pip install --no-deps gpu-burn
38
+ ```
39
+
40
+ Install from a source checkout:
41
+
42
+ ```bash
43
+ python -m pip install .
44
+ ```
45
+
46
+ ## Usage
47
+
48
+ Run on all detected GPUs in the foreground at full utilization:
49
+
50
+ ```bash
51
+ gpu-burn run
52
+ ```
53
+
54
+ Select devices and target an approximate compute duty cycle:
55
+
56
+ ```bash
57
+ gpu-burn run --devs 0,2-3 --util 60
58
+ ```
59
+
60
+ Configure adaptive yielding with hysteresis. This pauses only the affected GPU
61
+ when external compute processes use at least 5% of its total memory. Its worker
62
+ restarts after usage remains at or below 2% for 5 continuous minutes:
63
+
64
+ ```bash
65
+ gpu-burn run -d 0,2-3 -u 60 -P 5 -R 2 -i 5 -p 1
66
+ ```
67
+
68
+ Run as a per-user background process:
69
+
70
+ ```bash
71
+ gpu-burn start --gpus 2 --util 80
72
+ gpu-burn status
73
+ gpu-burn logs -f
74
+ gpu-burn stop
75
+ ```
76
+
77
+ With no options, `gpu-burn start` selects every Paddle-visible GPU and uses:
78
+
79
+ - `16384x16384` float16 matrix multiplication
80
+ - 100% compute duty-cycle target
81
+ - pause at 5% external memory, resume at or below 2%
82
+ - 5 continuous idle minutes before restart
83
+ - 1-second monitoring interval
84
+
85
+ After the supervisor becomes ready, startup output includes the resolved GPU
86
+ count, each device's running or paused state, worker PIDs, workload, adaptive
87
+ policy, supervisor PID, and log path:
88
+
89
+ ```text
90
+ ✓ gpu-burn is ready
91
+
92
+ gpu-burn 2.2.1 started
93
+ supervisor : pid 42000
94
+ devices : 2 selected, 2 running, 0 paused
95
+ gpu:0 : running (pid 42010)
96
+ gpu:1 : running (pid 42011)
97
+ workload : 16384x16384 float16, util 100%
98
+ adaptive : pause >= 5%, resume <= 2%, idle 5 min, poll 1s
99
+ log : /tmp/gpu-burn-1000/gpu-burn.log
100
+ ```
101
+
102
+ On an interactive terminal, the first line is an animated spinner while Paddle
103
+ and NVIDIA devices are checked. Redirected output automatically uses plain text.
104
+ Set `GPU_BURN_NO_SPINNER=1` to disable animation explicitly.
105
+
106
+ The main workload options are:
107
+
108
+ | Option | Meaning | Default |
109
+ | --- | --- | --- |
110
+ | `-g`, `--gpus N` | Use the first `N` visible GPUs | all |
111
+ | `-d`, `--devs LIST` | Device IDs/ranges such as `0,2-3` | all |
112
+ | `-u`, `--util PERCENT` | Approximate compute duty cycle in `(0, 100]` | `100` |
113
+ | `-m`, `--size N` | Square matrix dimension | `16384` |
114
+ | `-t`, `--type TYPE` | `float16` or `float32` | `float16` |
115
+ | `-l`, `--log-int SECONDS` | Worker progress log interval | `30` |
116
+ | `-P`, `--pause PERCENT` | Pause at this external memory percentage | `5` |
117
+ | `-R`, `--resume PERCENT` | Start the idle timer at or below this percentage | `2` |
118
+ | `-i`, `--idle MINUTES` | Continuous idle minutes before restart | `5` |
119
+ | `-p`, `--poll SECONDS` | Memory polling interval | `1` |
120
+
121
+ `--gpus` and `--devs` are mutually exclusive. Lower utilization is
122
+ implemented by alternating synchronized matrix multiplication with idle time, so
123
+ the value observed by monitoring tools can vary with sampling intervals and GPU
124
+ power-management behavior.
125
+
126
+ The supervisor queries `nvidia-smi` compute applications and excludes its own
127
+ worker PIDs. Memory from other compute processes is summed per selected GPU and
128
+ divided by that GPU's total physical memory. At `--pause`, only that GPU's
129
+ worker is stopped, which releases its PaddlePaddle tensors and GPU memory. Once
130
+ usage reaches `--resume` or lower, it must remain there for `--idle` minutes
131
+ before a new worker starts. `--resume` must be lower than `--pause`; this
132
+ hysteresis prevents repeated stop/start cycles near one threshold. Display-only
133
+ contexts absent from NVIDIA's compute-app list are not considered.
134
+ Numeric and UUID-based `CUDA_VISIBLE_DEVICES` remapping is honored, so CLI device
135
+ IDs remain the same logical IDs that PaddlePaddle exposes.
136
+
137
+ ## State and cleanup
138
+
139
+ Only one managed instance is allowed per user. Runtime state and logs are stored
140
+ under `$GPU_BURN_STATE_DIR`, `$XDG_RUNTIME_DIR/gpu-burn`, or
141
+ `/tmp/gpu-burn-$UID`, in that order. `gpu-burn stop --force` sends `SIGKILL` if a
142
+ worker does not stop before the configured timeout.
143
+
144
+ ## Development
145
+
146
+ The PEP 517 build requirement uses a compatible lower bound
147
+ (`setuptools>=77`) instead of pinning one exact backend release. An exact pin
148
+ makes builds byte-for-byte easier to reproduce, but also forces every source
149
+ installer to download that precise release and can unnecessarily break offline
150
+ or constrained environments. This pure-Python project does not need `wheel` in
151
+ `build-system.requires`; setuptools implements the wheel build hook itself.
152
+ Release CI pins the user-facing `build` and `twine` tools separately.
153
+
154
+ ```bash
155
+ python -m pip install --no-deps -e .
156
+ python -m pytest
157
+ python -m build
158
+ ```
159
+
160
+ Run the opt-in adaptive lifecycle test on a real GPU:
161
+
162
+ ```bash
163
+ GPU_BURN_TEST_DEVICE=0 python tests/real_gpu_dynamic.py
164
+ ```
165
+
166
+ ## License
167
+
168
+ MIT
@@ -0,0 +1,46 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "gpu-burn"
7
+ dynamic = ["version"]
8
+ description = "Control GPU compute utilization with a managed PaddlePaddle workload"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = "MIT"
12
+ keywords = ["gpu", "paddlepaddle", "cuda", "stress-test", "utilization"]
13
+ classifiers = [
14
+ "Development Status :: 4 - Beta",
15
+ "Environment :: Console",
16
+ "Intended Audience :: Developers",
17
+ "Intended Audience :: System Administrators",
18
+ "Operating System :: POSIX :: Linux",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3.10",
21
+ "Programming Language :: Python :: 3.11",
22
+ "Programming Language :: Python :: 3.12",
23
+ "Topic :: System :: Hardware",
24
+ ]
25
+ dependencies = [
26
+ "paddlepaddle-gpu>=2.6.2,<4.0.0",
27
+ ]
28
+
29
+ [project.urls]
30
+ Source = "https://github.com/cangtianhuang/gpu-burn"
31
+ Issues = "https://github.com/cangtianhuang/gpu-burn/issues"
32
+ PaddlePaddle = "https://www.paddlepaddle.org.cn/"
33
+
34
+ [project.scripts]
35
+ gpu-burn = "gpu_burn.cli:main"
36
+
37
+ [tool.setuptools.packages.find]
38
+ where = ["src"]
39
+
40
+ [tool.setuptools.dynamic]
41
+ version = {attr = "gpu_burn.__version__"}
42
+
43
+ [tool.pytest.ini_options]
44
+ addopts = "-ra"
45
+ pythonpath = ["src"]
46
+ testpaths = ["tests"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ """PaddlePaddle GPU utilization workload."""
2
+
3
+ __version__ = "2.2.1"
@@ -0,0 +1,8 @@
1
+ import sys
2
+
3
+ from .cli import main
4
+
5
+
6
+ if __name__ == "__main__":
7
+ sys.argv[0] = "gpu-burn"
8
+ raise SystemExit(main())