File size: 1,113 Bytes
c323b52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from pynvml import *
import time


class GPUEnergyTracker:
    """

    GPU energy monitor using NVIDIA NVML.



    Measures instantaneous power and integrates

    it over time to estimate total GPU energy

    consumption.

    Units

    Power  : Watts

    Energy : Joules

    """

    def __init__(self, gpu_index=0):
        nvmlInit()

        self.handle = nvmlDeviceGetHandleByIndex(gpu_index)

        self.energy_joules = 0.0

        self.last_time = time.time()

        self.last_power = self._read_power()

    def _read_power(self):
        power_mw = nvmlDeviceGetPowerUsage(self.handle)

        return power_mw / 1000.0

    def step(self):
        current_time = time.time()

        power = self._read_power()

        dt = current_time - self.last_time

        # trapezoidal integration
        self.energy_joules += 0.5 * (self.last_power + power) * dt

        self.last_power = power
        self.last_time = current_time

    def total_energy(self):
        return self.energy_joules

    def current_power(self):
        return self.last_power