-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgpu_monitor.py
More file actions
86 lines (71 loc) · 2.75 KB
/
Copy pathgpu_monitor.py
File metadata and controls
86 lines (71 loc) · 2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import gpustat
import time
import threading
import logging
import datetime
import csv
logger = logging.getLogger(__name__)
class NvidiaPowerMonitor:
def __init__(self, log_file="gpu_power_log.csv"):
self.log_file = log_file
self.monitor_thread = None
self._stop_event = threading.Event()
self.measurements = []
def _monitor_power(self, interval):
"""
Monitors GPU power usage and logs it at specified intervals.
"""
with open(self.log_file, 'w', newline='') as csvfile:
fieldnames = ['timestamp', 'gpu', 'power.draw', 'power.limit']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
while not self._stop_event.is_set():
stats = gpustat.new_query()
for gpu in stats.gpus:
measurement = {
'timestamp': datetime.datetime.now(),
'gpu': gpu.index,
'power.draw': gpu.power_draw,
# 'power.limit': gpu.enforced_power_limit
}
writer.writerow(measurement)
self.measurements.append(measurement)
logger.info(f"Logged power usage for GPU {gpu.index}: {measurement}")
time.sleep(interval)
def start_monitoring(self, interval=1):
"""
Starts the GPU power monitoring in a separate thread.
"""
self._stop_event.clear()
self.monitor_thread = threading.Thread(target=self._monitor_power, args=(interval,))
self.monitor_thread.start()
logger.info(f"Started GPU power monitoring, logging to {self.log_file}")
def stop_monitoring(self):
"""
Stops the GPU power monitoring process.
"""
self._stop_event.set()
if self.monitor_thread is not None:
self.monitor_thread.join()
logger.info("Stopped GPU power monitoring")
def get_measurements(self):
"""
Returns the recorded measurements.
"""
return self.measurements
# Example usage
def main():
logging.basicConfig(level=logging.INFO)
log_file_path = "gpu_power_log.csv"
try:
monitor = NvidiaPowerMonitor(log_file=log_file_path)
monitor.start_monitoring(interval=1)
print("GPU power monitoring started. Press Enter to stop monitoring...")
time.sleep(1)
monitor.stop_monitoring()
# measurements = monitor.get_measurements()
print(f"Log file created at: {log_file_path}")
except Exception as e:
logger.error(f"Error: {e}")
if __name__ == "__main__":
main()