Pyjoules es un conjunto de herramientas de software para medir la huella de energía de una máquina host a lo largo de la ejecución de un código de Python. Monitorea la energía consumida por el dispositivo específico de la máquina host, como:
Pyjoules utiliza la tecnología Intel " Ejecutar el límite de potencia promedio " (RAPL) que estima el consumo de energía de la CPU, RAM y GPU integrada. Esta tecnología está disponible en la CPU Intel desde la Generación Sandy Bridge (2010).
Pyjoules utiliza la tecnología NVIDIA " Nvidia Management Library " para medir el consumo de energía de los dispositivos NVIDIA. La API de medición de energía solo está disponible en NVIDIA GPU con Volta Architecture (2018)
Solo el soporte GNU/Linux está disponible por el momento. Estamos trabajando en el soporte de Mac
Los contadores de energía RAPL se desbordan después de varios minutos o horas, lo que puede causar lecturas de energía falsas negativas.
Pyjoules tiene esto en cuenta y agrega el valor máximo posible del contador, max_energy_range_uj , a mediciones de energía negativas. Sin embargo, si un contador se desborda dos veces durante una sola medición de energía, la energía reportada será max_energy_range_uj menor que el valor esperado.
Pyjoule use herramientas de medición de hardware (Intel Rapl, herramientas de GPU NVIDIA, ...) para medir el consumo de energía del dispositivo. Estas herramientas tienen una frecuencia de mesasuración que depende del dispositivo. Por lo tanto, no puede usar Pyjoule para medir el consumo de energía durante un período más corto que la frecuencia de medición de energía del dispositivo. Pyjoule devolverá los valores nulos si el período de medición es demasiado corto.
Puede instalar Pyjoules con PIP: pip install pyJoules
Si desea usar Pyjoule para medir también el consumo de energía de la GPU de NVIDIA, debe instalarlo con el soporte del controlador NVIDIA utilizando este comando: pip install pyJoules[nvidia] .
Este readme describe el uso básico de Pyjoules. Para una descripción más profunda, lea la documentación aquí
Aquí hay algunos usos básicos de Pyjoules . Tenga en cuenta que el consumo de energía informado no es solo el consumo de energía del código que está ejecutando. Esto incluye el consumo global de energía de todo el proceso que se ejecuta en la máquina durante este período, incluidos así el sistema operativo y otras aplicaciones. Es por eso que recomendamos eliminar cualquier programa adicional que pueda alterar el consumo de energía de los experimentos de alojamiento de la máquina y mantener solo el código en medición ( es decir , sin aplicaciones adicionales, como la interfaz gráfica, la tarea de ejecución de fondo ...). Esto dará la medida más cercana al consumo de energía real del código medido.
Para medir la energía consumida por la máquina durante la ejecución de la función foo() ejecute el siguiente código:
from pyJoules . energy_meter import measure_energy
@ measure_energy
def foo ():
# Instructions to be evaluated.
foo () Esto imprimirá en la consola el consumo de energía registrado de todos los dispositivos monitorizables durante la ejecución de la función foo .
El uso básico del decorador imprimirá Iformation con este formato:
begin timestamp : XXX; tag : YYY; duration : ZZZ;device_name: AAAA
con :
begin timestamp : tiempo de lanzamiento de la función monitoreadatag : Etiqueta de la medida, si no se especifica nada, este será el nombre de la funciónduration : ejecución de funciones Duracióndevice_name : consumo de energía del dispositivo device_name en UJPara dispositivos CPU y RAM, dispositivos de dispositivos, el dominio RAPL descrito en la imagen a continuación más la ID de enchufe de CPU. El dominio RAPL se describe aquí
Puede configurar fácilmente qué dispositivo monitorear el uso de los parámetros del decorador measureit . Por ejemplo, el siguiente ejemplo solo monitorea el consumo de energía de la CPU en el enchufe de la CPU 1 y la GPU NVIDIA 0 . Por defecto, Pyjoules monitorea todos los dispositivos disponibles de los enchufes 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 () Puede agregar la siguiente lista de dominio para monitorearlos:
pyJoules.device.rapl_device.RaplPackageDomain : CPU (especifique la ID de socket en el parámetro)pyJoules.device.rapl_device.RaplDramDomain : RAM (especifique la ID de socket en el parámetro)pyJoules.device.rapl_device.RaplUncoreDomain : GPU integrado (especifique la ID de socket en el parámetro)pyJoules.device.rapl_device.RaplCoreDomain : dominio de núcleo RAPL (especifique la ID de socket en el parámetro)pyJoules.device.nvidia_device.NvidiaGPUDomain : nvidia gpu (especifique la identificación del socket en el parámetro)Para comprender qué par de la CPU cada monitor de dominio RAPL, consulte esta sección
Si desea manejar datos con una salida diferente al estándar, puede configurar el decorador con una instancia EnergyHandler desde el módulo pyJoules.handler .
Como ejemplo, si desea escribir el consumo de energía grabado en un archivo .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 () Esto producirá un archivo CSV de 100 líneas. Cada línea que contiene el consumo de energía registrado durante una ejecución de la función foo . Existen otras clases Handler predefinidos para exportar datos a MongoDB y Panda DataFrame.
Si desea saber dónde están los " puntos calientes " donde su código Python consumen la mayor energía, puede agregar " puntos de interrupción " durante el proceso de medición y etiquetarlos para conocer la cantidad de energía consumida entre estos puntos de interrupción.
Para esto, debe usar un administrador de contexto para medir el consumo de energía. Es configurable como el decorador. Por ejemplo, aquí usamos un EnergyContext para medir el consumo de energía de CPU 1 y NVIDIA GPU 0 e informarlo en un archivo 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 ()Esto registrará la energía consumida:
EnergyContext y la llamada del método ctx.recordctx.record y el final del EnergyContextCada parte medida se escribirá en el archivo CSV. Una línea por parte.
Los dominios RAPL coinciden con la parte del enchufe de la CPU como se describe en esta imagen:
Pyjoules es un proyecto de código abierto desarrollado por Spirals Research Group (Universidad de Lille e Inria) que forma parte de la iniciativa PowerAPI.
La documentación está disponible aquí.
Puede seguir las últimas noticias y hacer preguntas suscribiéndose a nuestra lista de correo.
Si desea contribuir con código, puede hacerlo a través de GitHub bifurcando el repositorio y enviando una solicitud de extracción.
Al enviar el código, haga todo lo posible para seguir las convenciones de codificación existentes y el estilo para mantener el código lo más legible posible.