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進行。
提交代碼時,請盡一切努力遵循現有的編碼約定和样式,以使代碼盡可能可讀。