Pyjoules est une boîte à outils logicielle pour mesurer l'empreinte énergétique d'une machine hôte le long de l'exécution d'un morceau de code Python. Il surveille l'énergie consommée par un dispositif spécifique de la machine hôte telle que:
Pyjoules utilise la technologie Intel " Running Might Power Limit " (RAPL) qui estime la consommation d'énergie du CPU, de la RAM et du GPU intégré. Cette technologie est disponible sur Intel CPU depuis le Sandy Bridge Generation (2010).
Pyjoules utilise la technologie Nvidia " Nvidia Management Library " pour mesurer la consommation d'énergie des appareils Nvidia. L'API de mesure de l'énergie est uniquement disponible sur Nvidia GPU avec Volta Architecture (2018)
Seule la prise en charge GNU / Linux est disponible pour le moment. Nous travaillons sur le support Mac
Rapl Energy Compters déborde après plusieurs minutes ou quelques heures, provoquant potentiellement des lectures d'énergie faussement négatives.
Pyjoules prend cela en compte et ajoute la valeur maximale possible du compteur, max_energy_range_uj , aux mesures d'énergie négatives. Cependant, si un compteur déborde deux fois pendant une seule mesure d'énergie, l'énergie signalée sera max_energy_range_uj inférieure à la valeur attendue.
PyJoule utilise des outils de mesure matérielle (Intel Rapl, Nvidia GPU Tools, ...) pour mesurer la consommation d'énergie de l'appareil. Ces outils ont une fréquence de mésasaire qui dépend de l'appareil. Ainsi, vous ne pouvez pas utiliser Pyjoule pour mesurer la consommation d'énergie pendant une période plus courte que la fréquence de mesure de l'énergie de l'appareil. Pyjoule renverra les valeurs nulles si la période de mesure est à court.
Vous pouvez installer des pyjoules avec pip: pip install pyJoules
Si vous souhaitez utiliser Pyjoule pour mesurer également la consommation d'énergie NVIDIA GPU, vous devez l'installer avec la prise en charge du pilote NVIDIA en utilisant cette commande: pip install pyJoules[nvidia] .
Cette lecture décrit l'usage de base des pyjoules. Pour une description plus approfondie, lisez la documentation ici
Voici quelques usages de base des pyjoules . Veuillez noter que la consommation d'énergie signalée n'est pas seulement la consommation d'énergie du code que vous exécutez. Cela comprend la consommation d'énergie mondiale de tout le processus fonctionnant sur la machine au cours de cette période, y compris ainsi le système d'exploitation et d'autres applications. C'est pourquoi nous vous recommandons d'éliminer tout programme supplémentaire qui peut modifier la consommation d'énergie des expériences d'hébergement de la machine et de conserver uniquement le code sous mesure ( c'est-à-dire pas d'applications supplémentaires, telles que l'interface graphique, la tâche d'exécution d'arrière-plan ...). Cela donnera la mesure la plus proche de la consommation d'énergie réelle du code mesuré.
Pour mesurer l'énergie consommée par la machine lors de l'exécution de la fonction foo() exécutez le code suivant:
from pyJoules . energy_meter import measure_energy
@ measure_energy
def foo ():
# Instructions to be evaluated.
foo () Cela imprimera sur la console la consommation d'énergie enregistrée de tous les dispositifs surveillables pendant l'exécution de la fonction foo .
L'utilisation de base du décorateur imprimera iformation avec ce format:
begin timestamp : XXX; tag : YYY; duration : ZZZ;device_name: AAAA
avec :
begin timestamp : temps de lancement de la fonction surveilléetag : étiquette de la mesure, si rien n'est spécifié, ce sera le nom de la fonctionduration : fonction d'exécution de la fonctiondevice_name : consommation d'alimentation du périphérique device_name dans UJPour les périphériques CPU et RAM, Device_name correspond au domaine RAPL décrit sur l'image ci-dessous plus l'ID de socket CPU. Le domaine RAPL est décrit ici
Vous pouvez facilement configurer le périphérique à surveiller à l'aide des paramètres du décorateur measureit . Par exemple, l'exemple suivant ne surveille que la consommation d'énergie du CPU sur le socket CPU 1 et le GPU Nvidia 0 . Par défaut, Pyjoules surveille tous les appareils disponibles des sockets CPU.
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 () Vous pouvez ajouter la liste de domaines suivante pour les surveiller:
pyJoules.device.rapl_device.RaplPackageDomain : CPU (spécifiez l'ID de socket dans le paramètre)pyJoules.device.rapl_device.RaplDramDomain : RAM (spécifiez l'ID de socket dans le paramètre)pyJoules.device.rapl_device.RaplUncoreDomain : GPU intégré (spécifiez l'ID de socket dans le paramètre)pyJoules.device.rapl_device.RaplCoreDomain : Rapl Core Domain (Spécifiez l'ID de socket dans le paramètre)pyJoules.device.nvidia_device.NvidiaGPUDomain : nvidia gpu (spécifiez l'ID de socket dans le paramètre)Pour comprendre quel parcing du CPU chaque moniteur de domaine RAPL, voir cette section
Si vous souhaitez gérer les données avec une sortie différente de celle standard, vous pouvez configurer le décorateur avec une instance EnergyHandler du module pyJoules.handler .
Par exemple, si vous souhaitez écrire la consommation d'énergie enregistrée dans un fichier .csv:
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 () Cela produira un fichier CSV de 100 lignes. Chaque ligne contenant la consommation d'énergie enregistrée lors d'une exécution de la fonction foo . D'autres classes Handler prédéfinies existent pour exporter des données vers MongoDB et Panda DataFrame.
Si vous voulez savoir où se trouvent les " points chauds " où votre code Python consomme le plus d'énergie que vous puissiez ajouter des " points d'arrêt " pendant le processus de mesure et les étiqueter pour connaître la quantité d'énergie consommée entre ces points d'arrêt.
Pour cela, vous devez utiliser un gestionnaire de contexte pour mesurer la consommation d'énergie. Il est configurable comme décorateur. Par exemple, nous utilisons ici un EnergyContext pour mesurer la consommation d'énergie de CPU 1 et NVIDIA GPU 0 et le signaler dans un fichier CSV:
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 ()Cela enregistrera l'énergie consommée:
EnergyContext et l'appel de la méthode ctx.recordctx.record et la fin de l' EnergyContextChaque partie mesurée sera écrite dans le fichier CSV. Une ligne par pièce.
Les domaines RAPL correspondent à la partie de la prise CPU comme décrit dans cette image:
Pyjoules est un projet open source développé par le groupe de recherche Spirals (Université de Lille et Inria) qui fait partie de l'initiative Powerapi.
La documentation est disponible ici.
Vous pouvez suivre les dernières nouvelles et poser des questions en vous abonnant à notre liste de diffusion.
Si vous souhaitez contribuer du code, vous pouvez le faire via GitHub en fournissant le référentiel et en envoyant une demande de traction.
Lors de la soumission du code, veuillez vous efforcer de suivre les conventions et le style de codage existants afin de maintenir le code aussi lisible que possible.