Pyjoules是一种软件工具包,可在执行Python代码的执行情况下测量主机的能量足迹。它监视主机机器特定设备消耗的能量,例如:
Pyjoules使用Intel“平均功率限制”(RAPL)技术,该技术估计了CPU,RAM和集成GPU的功耗。自Sandy Bridge Generation(2010)以来,该技术可在英特尔CPU上获得。
Pyjoules使用NVIDIA“ NVIDIA管理库”技术来衡量NVIDIA设备的能源消耗。能量测量API仅在Volta Architecture(2018)的NVIDIA GPU上可用
目前只有GNU/Linux支持。我们正在研究Mac支持
RAPL能量反击几分钟或几个小时后溢出,可能导致虚假的能量读数。
Pyjoules考虑了这一点,并将计数器的最大可能值( max_energy_range_uj )添加到负能量测量中。但是,如果一个计数器在单个能量测量过程中溢出两次,则报告的能量将为max_energy_range_uj小于预期值。
Pyjoule使用硬件测量工具(Intel Rapl,Nvidia GPU工具,...)来测量设备能耗。这些工具具有依赖设备的中性频率。因此,您不能使用Pyjoule在短时间内测量比设备能量测量频率的能量消耗。如果测量周期短,Pyjoule将返回零值。
您可以使用pip安装pyjoules : pip install pyJoules
如果您想使用Pyjoule还测量NVIDIA GPU能耗,则必须使用此命令在NVIDIA驱动程序支持下安装它: pip install pyJoules[nvidia] 。
此读数描述了Pyjoules的基本用法。有关深度描述的更多信息,请在此处阅读文档
这是Pyjoules的一些基本用法。请注意,报告的能源消耗不仅是您正在运行的代码的能耗。这包括在此期间在机器上运行的所有过程的全球能源消耗,因此包括操作系统和其他应用程序。这就是为什么我们建议消除任何可能改变机器托管实验能源消耗的额外程序,并仅将代码保留在测量中(即,没有额外的应用程序,例如图形接口,背景运行任务...)。这将提供最接近测量代码的真实能源消耗。
在执行函数foo()执行过程中,计算机消耗的能量运行以下代码:
from pyJoules . energy_meter import measure_energy
@ measure_energy
def foo ():
# Instructions to be evaluated.
foo ()这将在执行功能foo期间所有可监视设备的记录的所有可监视设备的记录能源消耗上。
Decorator的基本用法将使用这种格式打印iFormation:
begin timestamp : XXX; tag : YYY; duration : ZZZ;device_name: AAAA
和 :
begin timestamp :监视功能启动时间tag :该度量的标签,如果未指定任何指定,这将是函数名称duration :功能执行持续时间device_name :uj中设备device_name的功耗对于CPU和RAM设备,Device_name匹配下图上描述的RAPL域以及CPU套接字ID。这里描述了Rapl域
您可以使用measureit Decorator的参数轻松配置用于监视的设备。例如,以下示例仅监视CPU插座1和NVIDIA GPU 0上的CPU功耗。默认情况下, Pyjoules监视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 () 您可以附加以下域列表以监视它们:
pyJoules.device.rapl_device.RaplPackageDomain :CPU(在参数中指定套接字ID)pyJoules.device.rapl_device.RaplDramDomain :RAM(在参数中指定套接字ID)pyJoules.device.rapl_device.RaplUncoreDomain :Integrated GPU(在参数中指定套接字ID)pyJoules.device.rapl_device.RaplCoreDomain :Rapl核心域(在参数中指定套接字ID)pyJoules.device.nvidia_device.NvidiaGPUDomain :nvidia gpu(在参数中指定套接字ID)要了解每个RAPL域监视器的CPU的哪个标准杆,请参阅此部分
如果要处理与标准数据不同的输出的数据,则可以使用pyJoules.handler模块的EnergyHandler实例配置装饰器。
例如,如果您想在.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 ()这将产生100行的CSV文件。每行包含在函数foo执行过程中记录的能耗。存在其他预定义的Handler程序类,以将数据导出到MongoDB和Panda数据框架。
如果您想知道“热点”在哪里,您的python代码在测量过程中消耗了最多的能量,可以在测量过程中添加“断点”,并标记它们以了解该断点之间消耗的能量量。
为此,您必须使用上下文管理器来衡量能耗。它可以配置为装饰器。例如,在这里,我们使用EnergyContext来测量CPU 1和NVIDIA GPU 0的功耗,并将其报告在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 ()这将记录消耗的能量:
EnergyContext的开头和ctx.record的呼叫之间ctx.record方法的呼叫和EnergyContext的末尾之间每个测量的零件将写在CSV文件中。每部分一行。
RAPL域匹配CPU插座的一部分,如本图像中所述:
Pyjoules是由Spirals Research Group(Lille和Inria)开发的开源项目,是Powerapi倡议的一部分。
该文档可在此处找到。
您可以遵循最新消息,并通过订阅我们的邮件列表来提出问题。
如果您想撰写代码,则可以通过GitHub拨打存储库并发送拉动请求来通过GitHub进行。
提交代码时,请尽一切努力遵循现有的编码约定和样式,以使代码尽可能可读。