halib 0.1.60__py3-none-any.whl → 0.1.61__py3-none-any.whl
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.
- halib/utils/gpu_mon.py +58 -0
- {halib-0.1.60.dist-info → halib-0.1.61.dist-info}/METADATA +3 -2
- {halib-0.1.60.dist-info → halib-0.1.61.dist-info}/RECORD +6 -5
- {halib-0.1.60.dist-info → halib-0.1.61.dist-info}/LICENSE.txt +0 -0
- {halib-0.1.60.dist-info → halib-0.1.61.dist-info}/WHEEL +0 -0
- {halib-0.1.60.dist-info → halib-0.1.61.dist-info}/top_level.txt +0 -0
halib/utils/gpu_mon.py
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# install `pynvml_utils` package first
|
2
|
+
# see this repo: https://github.com/gpuopenanalytics/pynvml
|
3
|
+
from pynvml_utils import nvidia_smi
|
4
|
+
import time
|
5
|
+
import threading
|
6
|
+
from rich.pretty import pprint
|
7
|
+
|
8
|
+
class GPUMonitor:
|
9
|
+
def __init__(self, gpu_index=0, interval=0.01):
|
10
|
+
self.nvsmi = nvidia_smi.getInstance()
|
11
|
+
self.gpu_index = gpu_index
|
12
|
+
self.interval = interval
|
13
|
+
self.gpu_stats = []
|
14
|
+
self._running = False
|
15
|
+
self._thread = None
|
16
|
+
|
17
|
+
def _monitor(self):
|
18
|
+
while self._running:
|
19
|
+
stats = self.nvsmi.DeviceQuery("power.draw, memory.used")["gpu"][
|
20
|
+
self.gpu_index
|
21
|
+
]
|
22
|
+
# pprint(stats)
|
23
|
+
self.gpu_stats.append(
|
24
|
+
{
|
25
|
+
"power": stats["power_readings"]["power_draw"],
|
26
|
+
"power_unit": stats["power_readings"]["unit"],
|
27
|
+
"memory": stats["fb_memory_usage"]["used"],
|
28
|
+
"memory_unit": stats["fb_memory_usage"]["unit"],
|
29
|
+
}
|
30
|
+
)
|
31
|
+
time.sleep(self.interval)
|
32
|
+
|
33
|
+
def start(self):
|
34
|
+
if not self._running:
|
35
|
+
self._running = True
|
36
|
+
# clear previous stats
|
37
|
+
self.gpu_stats.clear()
|
38
|
+
self._thread = threading.Thread(target=self._monitor)
|
39
|
+
self._thread.start()
|
40
|
+
|
41
|
+
def stop(self):
|
42
|
+
if self._running:
|
43
|
+
self._running = False
|
44
|
+
self._thread.join()
|
45
|
+
# clear the thread reference
|
46
|
+
self._thread = None
|
47
|
+
|
48
|
+
def get_stats(self):
|
49
|
+
## return self.gpu_stats
|
50
|
+
assert self._running is False, "GPU monitor is still running. Stop it first."
|
51
|
+
|
52
|
+
powers = [s["power"] for s in self.gpu_stats if s["power"] is not None]
|
53
|
+
memories = [s["memory"] for s in self.gpu_stats if s["memory"] is not None]
|
54
|
+
avg_power = sum(powers) / len(powers) if powers else 0
|
55
|
+
max_memory = max(memories) if memories else 0
|
56
|
+
# power_unit = self.gpu_stats[0]["power_unit"] if self.gpu_stats else "W"
|
57
|
+
# memory_unit = self.gpu_stats[0]["memory_unit"] if self.gpu_stats else "MiB"
|
58
|
+
return {"gpu_avg_power": avg_power, "gpu_avg_max_memory": max_memory}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: halib
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.61
|
4
4
|
Summary: Small library for common tasks
|
5
5
|
Author: Hoang Van Ha
|
6
6
|
Author-email: hoangvanhauit@gmail.com
|
@@ -45,9 +45,10 @@ Requires-Dist: dataclass-wizard
|
|
45
45
|
|
46
46
|
Helper package for coding and automation
|
47
47
|
|
48
|
-
**Version 0.1.
|
48
|
+
**Version 0.1.61**
|
49
49
|
|
50
50
|
+ add `util/video`: add `VideoUtils` class to handle common video-related tasks
|
51
|
+
+ add `util/gpu_mon`: add `GPUMonitor` class to monitor GPU usage and performance
|
51
52
|
|
52
53
|
**Version 0.1.59**
|
53
54
|
|
@@ -44,11 +44,12 @@ halib/system/filesys.py,sha256=ERpnELLDKJoTIIKf-AajgkY62nID4qmqmX5TkE95APU,2931
|
|
44
44
|
halib/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
45
45
|
halib/utils/dataclass_util.py,sha256=rj2IMLlUzbm2OlF5_B2dRTk9njZOaF7tTjYkOsq8uLY,1416
|
46
46
|
halib/utils/dict_op.py,sha256=wYE6Iw-_CnCWdMg9tpJ2Y2-e2ESkW9FxmdBkZkbUh80,299
|
47
|
+
halib/utils/gpu_mon.py,sha256=vD41_ZnmPLKguuq9X44SB_vwd9JrblO4BDzHLXZhhFY,2233
|
47
48
|
halib/utils/listop.py,sha256=Vpa8_2fI0wySpB2-8sfTBkyi_A4FhoFVVvFiuvW8N64,339
|
48
49
|
halib/utils/tele_noti.py,sha256=-4WXZelCA4W9BroapkRyIdUu9cUVrcJJhegnMs_WpGU,5928
|
49
50
|
halib/utils/video.py,sha256=mJQFHFbijmu3lo0NZk4Ed64Tfa1u5KxNJpd_TuckpPU,2228
|
50
|
-
halib-0.1.
|
51
|
-
halib-0.1.
|
52
|
-
halib-0.1.
|
53
|
-
halib-0.1.
|
54
|
-
halib-0.1.
|
51
|
+
halib-0.1.61.dist-info/LICENSE.txt,sha256=qZssdna4aETiR8znYsShUjidu-U4jUT9Q-EWNlZ9yBQ,1100
|
52
|
+
halib-0.1.61.dist-info/METADATA,sha256=1s7ikn1n88Ix9c_rB4OqSY9hmQ12sJMM-LE_4aIDWNM,5039
|
53
|
+
halib-0.1.61.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
54
|
+
halib-0.1.61.dist-info/top_level.txt,sha256=7AD6PLaQTreE0Fn44mdZsoHBe_Zdd7GUmjsWPyQ7I-k,6
|
55
|
+
halib-0.1.61.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|