Pyjoule ist ein Software -Toolkit, mit dem der Energieausdruck eines Host -Computers entlang der Ausführung eines Python -Code -Stücks misst. Es überwacht die Energie, die durch ein bestimmtes Gerät des Host -Computers verbraucht wird, wie z. B.:
Pyjoule verwendet die RAPL -Technologie (Intel Laufen Durchschnittsleistungslimit "(RAPL), die den Stromverbrauch der CPU, RAM und integrierten GPU schätzt. Diese Technologie ist seit der Sandy Bridge Generation (2010) auf Intel CPU erhältlich.
Pyjoule verwendet die NVIDIA -Technologie " Nvidia Management Library ", um den Energieverbrauch von NVIDIA -Geräten zu messen. Die Energiemess -API ist nur bei NVIDIA GPU mit Volta Architecture (2018) erhältlich
Der Moment ist nur GNU/Linux -Unterstützung verfügbar. Wir arbeiten an der MAC -Unterstützung
Rapl Energy Counters überflutet nach einigen Minuten oder Stunden und verursacht möglicherweise falsch negative Energiewerte.
Pyjoule berücksichtigt dies und fügt den maximal möglichen Wert des Zählers, max_energy_range_uj , zu negativen Energiemessungen hinzu. Wenn ein Zähler während einer einzelnen Energiemessung zweimal überläuft, ist die gemeldete Energie max_energy_range_uj weniger als der erwartete Wert.
Pyjoule Verwenden Sie Hardware -Messwerkzeuge (Intel Rapl, Nvidia GPU -Tools, ...), um den Energieverbrauch des Geräts zu messen. Diese Tools haben eine Mesasurierungsfrequenz, die vom Gerät abhängt. Daher können Sie Pyjoule nicht verwenden, um den Energieverbrauch während eines Zeitraums zu messen, der kürzer ist als die Frequenz der Geräteergiemessung. Pyjoule gibt Nullwerte zurück, wenn die Messzeit zu kurz ist.
Sie können Pyjoule mit PIP: pip install pyJoules
Wenn Sie Pyjoule verwenden möchten, um auch den NVIDIA -GPU -Energieverbrauch zu messen, müssen Sie ihn mit diesem Befehl mit Nvidia -Treiber unterstützen: pip install pyJoules[nvidia] .
Diese Readme beschreibt die grundlegende Verwendung von Pyjoule. Eine ausführlichere Beschreibung finden Sie in der Dokumentation hier
Hier sind einige grundlegende Verwendung von Pyjoule . Bitte beachten Sie, dass der gemeldete Energieverbrauch nicht nur der Energieverbrauch des von Ihnen ausgeführten Codes ist. Dies schließt den globalen Energieverbrauch des gesamten Prozesses ein, der in diesem Zeitraum auf der Maschine ausgeführt wird, wodurch das Betriebssystem und andere Anwendungen einbezogen werden. Aus diesem Grund empfehlen wir, zusätzliche Programme zu beseitigen, die den Energieverbrauch der Maschinen -Hosting -Experimente verändern können, und nur den Code unter Messung zu halten ( dh keine zusätzlichen Anwendungen, wie z. B. grafische Schnittstelle, Hintergrundausgangsaufgabe ...). Dies wird dem realen Energieverbrauch des gemessenen Code am nächsten kommen.
Um die von der Maschine konsumierte Energie während der Ausführung der Funktion foo() zu messen. Führen Sie den folgenden Code aus:
from pyJoules . energy_meter import measure_energy
@ measure_energy
def foo ():
# Instructions to be evaluated.
foo () Dadurch wird während der Ausführung von foo auf der Konsole den aufgezeichneten Energieverbrauch aller überwachbaren Geräte gedruckt.
Der Dekorateur Basic Nutzung druckt mit diesem Format eine Ausstimmung:
begin timestamp : XXX; tag : YYY; duration : ZZZ;device_name: AAAA
mit :
begin timestamp : Überwachte Funktionsstartzeittag : Tag des Maßes, wenn nichts angegeben ist, ist dies der Funktionsnameduration : Funktionsausführungsdauerdevice_name : Stromverbrauch des Geräte device_name in UJFür CPU- und RAM -Geräte stimmen Device_Name mit der auf dem Bild unten beschriebenen RapL -Domäne und der CPU -Socket -ID überein. Die Rapl -Domäne werden hier beschrieben
Sie können einfach konfigurieren, welches Gerät mit den Parametern des measureit -Dekors zu überwachen ist. Beispielsweise überwacht das folgende Beispiel nur den CPU -Stromverbrauch in der CPU -Socket 1 und der NVIDIA GPU 0 . Standardmäßig überwacht Pyjoule alle verfügbaren Geräte der CPU -Sockets.
from pyJoules . energy_meter import measure_energy
from pyJoules . device . rapl_device import RaplPackageDomain
from pyJoules . device . nvidia_device import NvidiaGPUDomain
@ measure_energy ( domains = [ RaplPackageDomain ( 1 ), NvidiaGPUDomain ( 0 )])
def foo ():
# Instructions to be evaluated.
foo () Sie können die folgende Domänenliste anhängen, um sie zu überwachen:
pyJoules.device.rapl_device.RaplPackageDomain : cpu (Geben Sie die Socket -ID im Parameter an)pyJoules.device.rapl_device.RaplDramDomain : RAM (Geben Sie die Socket -ID im Parameter an)pyJoules.device.rapl_device.RaplUncoreDomain : Integrierte GPU (Geben Sie die Socket -ID im Parameter an)pyJoules.device.rapl_device.RaplCoreDomain : Rapl -Kerndomäne (Geben Sie die Socket -ID in Parameter an)pyJoules.device.nvidia_device.NvidiaGPUDomain : nvidia gpu (Geben Sie die Socket -ID in Parameter an)Um zu verstehen, welchen Par der CPU jeder Rapl -Domänenmonitor finden Sie unter diesem Abschnitt
Wenn Sie Daten mit einer anderen Ausgabe als dem Standard behandeln möchten, können Sie den Dekorateator mit einer EnergyHandler -Instanz aus dem pyJoules.handler -Modul konfigurieren.
Als Beispiel möchten Sie den aufgezeichneten Energieverbrauch in einer .csv -Datei schreiben:
from pyJoules . energy_meter import measure_energy
from pyJoules . handler . csv_handler import CSVHandler
csv_handler = CSVHandler ( 'result.csv' )
@ measure_energy ( handler = csv_handler )
def foo ():
# Instructions to be evaluated.
for _ in range ( 100 ):
foo ()
csv_handler . save_data () Dadurch wird eine CSV -Datei mit 100 Zeilen erzeugt. Jede Zeile, die den Energieverbrauch enthält, der während einer Ausführung der Funktion foo aufgezeichnet wurde. Es gibt andere vordefinierte Handler , um Daten in MongoDB und Panda DataFrame zu exportieren.
Wenn Sie wissen möchten, wo sich die " Hot Spots " befinden, an denen Ihr Python -Code die meiste Energie verbraucht, können Sie während des Messprozesses " Breakpoints " hinzufügen und sie markieren, um die zwischen diesen Haltepunkten verbrauchte Energie zu kennen.
Hierzu müssen Sie einen Kontextmanager verwenden, um den Energieverbrauch zu messen. Es ist als Dekorateur konfigurierbar. Zum Beispiel verwenden wir hier einen EnergyContext , um den Stromverbrauch von CPU 1 und NVIDIA GPU 0 zu messen und ihn in einer CSV -Datei zu melden:
from pyJoules . energy_meter import EnergyContext
from pyJoules . device . rapl_device import RaplPackageDomain
from pyJoules . device . nvidia_device import NvidiaGPUDomain
from pyJoules . handler . csv_handler import CSVHandler
csv_handler = CSVHandler ( 'result.csv' )
with EnergyContext ( handler = csv_handler , domains = [ RaplPackageDomain ( 1 ), NvidiaGPUDomain ( 0 )], start_tag = 'foo' ) as ctx :
foo ()
ctx . record ( tag = 'bar' )
bar ()
csv_handler . save_data ()Dies erfasst die verbrauchte Energie:
EnergyContext und dem Ruf der ctx.record -Methodectx.record -Methode und dem Ende des EnergyContextJeder gemessene Teil wird in der CSV -Datei geschrieben. Eine Linie pro Teil.
RAPL -Domänen stimmen mit einem Teil der CPU -Socket überein, wie in diesem Bild beschrieben:
Pyjoule ist ein Open-Source-Projekt, das von der Spirals Research Group (University of Lille und INRIA) entwickelt wurde und Teil der PowerAPI-Initiative ist.
Die Dokumentation ist hier verfügbar.
Sie können die neuesten Nachrichten folgen und Fragen stellt, indem Sie unsere Mailingliste abonnieren.
Wenn Sie Code beitragen möchten, können Sie dies über GitHub tun, indem Sie das Repository verlassen und eine Pull -Anfrage senden.
Bemerken Sie beim Senden von Code alle Anstrengungen, um vorhandene Codierungskonventionen und -Stile zu folgen, um den Code so lesbar wie möglich zu halten.