Pyjoules é um kit de ferramentas de software para medir a pegada de energia de uma máquina host ao longo da execução de um pedaço de código Python. Ele monitora a energia consumida pelo dispositivo específico da máquina host, como:
Pyjoules usa a tecnologia Intel " RupL Limite médio de potência " (RAPL) que estima o consumo de energia da CPU, RAM e GPU integrado. Esta tecnologia está disponível na Intel CPU desde a geração de ponte Sandy (2010).
Pyjoules usa a tecnologia da NVIDIA " NVIDIA Management Library " para medir o consumo de energia dos dispositivos NVIDIA. A API de medição de energia está disponível apenas na NVIDIA GPU com a Arquitetura Volta (2018)
Somente suporte ao GNU/Linux está disponível para o momento. Estamos trabalhando no suporte MAC
Os contadores de energia do RAPL transbordam após vários minutos ou horas, causando leituras de energia falsa negativa.
Pyjoules leva isso em consideração e adiciona o valor máximo possível do contador, max_energy_range_uj , a medições de energia negativa. No entanto, se um contador transbordar duas vezes durante uma única medição de energia, a energia relatada será max_energy_range_uj menor que o valor esperado.
Pyjoule Use ferramentas de medição de hardware (Intel Rapl, NVIDIA GPU Tools, ...) para medir o consumo de energia do dispositivo. Tesses ferramentas têm uma frequência de mescleamento que depende do dispositivo. Assim, você não pode usar o Pyjoule para medir o consumo de energia durante um período mais curto que a frequência de medição de energia do dispositivo. Pyjoule retornará valores nulos se o período de medição for curto.
Você pode instalar pyjoules com pip: pip install pyJoules
Se você deseja usar o Pyjoule para medir também o consumo de energia da GPU da NVIDIA, você deve instalá -lo com o suporte ao driver da NVIDIA usando este comando: pip install pyJoules[nvidia] .
Este readme descreve o uso básico de Pyjoules. Para uma descrição mais detalhada, leia a documentação aqui
Aqui estão alguns usos básicos de Pyjoules . Observe que o consumo de energia relatado não é apenas o consumo de energia do código que você está executando. Isso inclui o consumo global de energia de todo o processo em execução na máquina durante esse período, incluindo o sistema operacional e outras aplicações. É por isso que recomendamos eliminar programas extras que possam alterar o consumo de energia dos experimentos de hospedagem de máquinas e manter apenas o código sob medição ( ou seja , nenhum aplicativo extra, como interface gráfica, tarefa em execução em segundo plano ...). Isso dará a medida mais próxima do consumo de energia real do código medido.
Para medir a energia consumida pela máquina durante a execução da função foo() execute o seguinte código:
from pyJoules . energy_meter import measure_energy
@ measure_energy
def foo ():
# Instructions to be evaluated.
foo () Isso imprimirá no console o consumo de energia registrado de todos os dispositivos monitoráveis durante a execução da função foo .
O uso básico do decorador imprimirá a formação com este formato:
begin timestamp : XXX; tag : YYY; duration : ZZZ;device_name: AAAA
com :
begin timestamp : Hora de lançamento de função monitoradatag : tag da medida, se nada for especificado, este será o nome da funçãoduration : duração da execução da funçãodevice_name : Consumo de energia do dispositivo device_name em UJPara dispositivos de CPU e RAM, o Device_Name corresponde ao domínio RAPL descrito na imagem abaixo mais o ID do soquete da CPU. O domínio Rapl é descrito aqui
Você pode configurar facilmente qual dispositivo monitorar usando os parâmetros do decorador measureit . Por exemplo, o exemplo a seguir monitora apenas o consumo de energia da CPU no soquete 1 da CPU e no NVIDIA GPU 0 . Por padrão, Pyjoules monitora todos os dispositivos disponíveis dos soquetes da 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 () Você pode anexar a seguinte lista de domínio para monitorá -los:
pyJoules.device.rapl_device.RaplPackageDomain : CPU (especifique o ID do soquete no parâmetro)pyJoules.device.rapl_device.RaplDramDomain : RAM (especifique o ID do soquete no parâmetro)pyJoules.device.rapl_device.RaplUncoreDomain : GPU integrado (especifique o ID do soquete no parâmetro)pyJoules.device.rapl_device.RaplCoreDomain : Rapl Core Domínio (especifique o ID do soquete no parâmetro)pyJoules.device.nvidia_device.NvidiaGPUDomain : nvidia gpu (especifique o ID do soquete no parâmetro)Para entender qual par da CPU cada monitor de domínio RAPL, consulte esta seção
Se você deseja lidar com dados com saída diferente do padrão, poderá configurar o decorador com uma instância EnergyHandler do módulo pyJoules.handler .
Como exemplo, se você deseja escrever o consumo de energia gravado em um arquivo .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 () Isso produzirá um arquivo CSV de 100 linhas. Cada linha que contém o consumo de energia registrada durante uma execução da função foo . Outras classes Handler predefinidos existem para exportar dados para MongoDB e DataFrame de PANDA .
Se você quiser saber onde estão os " pontos quentes ", onde o código do Python consome mais energia que você pode adicionar " pontos de interrupção " durante o processo de medição e marcá -los para saber a quantidade de energia consumida entre esses pontos de interrupção.
Para isso, você deve usar um gerente de contexto para medir o consumo de energia. É configurável como decorador. Por exemplo, aqui usamos um EnergyContext para medir o consumo de energia da CPU 1 e NVIDIA GPU 0 e relatá -lo em um arquivo 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 ()Isso registrará a energia consumida:
EnergyContext e a chamada do método ctx.recordctx.record e o final do EnergyContextCada peça medida será gravada no arquivo CSV. Uma linha por parte.
Os domínios RAPL correspondem à parte do soquete da CPU, conforme descrito nesta imagem:
Pyjoules é um projeto de código aberto desenvolvido pelo Spirals Research Group (Universidade de Lille e Inria) que faz parte da iniciativa Powerapi.
A documentação está disponível aqui.
Você pode seguir as últimas notícias e fazer perguntas assinando nossa lista de discussão.
Se você deseja contribuir com o código, pode fazê -lo via Github, comprando o repositório e enviando uma solicitação de tração.
Ao enviar o código, faça todos os esforços para seguir convenções e estilo de codificação existentes para manter o código o mais legível possível.