Pyjoules - это программный инструментарий для измерения энергетического следа хост -машины вдоль выполнения куска кода Python. Он контролирует энергию, потребляемую конкретным устройством хост -машины, например:
Pyjoules использует технологию Intel « Среднее ограничение мощности » (RAPL), которая оценивает потребление мощности процессора, оперативной памяти и интегрированного графического процессора. Эта технология доступна на процессоре Intel с момента генерации Sandy Bridge (2010).
Pyjoules использует технологию NVIDIA « Библиотека управления NVIDIA » для измерения потребления энергии устройств NVIDIA. API измерения энергии доступен только на графическом процессоре Nvidia с архитектурой Volta (2018)
Только поддержка GNU/Linux доступна на данный момент. Мы работаем над поддержкой Mac
Счетчики энергии RAPL переполняются через несколько минут или часов, что может вызвать ложные показания энергии.
Pyjoules учитывает это и добавляет максимально возможное значение счетчика, max_energy_range_uj , к отрицательным измерениям энергии. Однако, если счетчик переполняется дважды во время одного измерения энергии, сообщаемая энергия будет max_energy_range_uj меньше, чем ожидаемое значение.
Pyjoule Используйте аппаратные инструменты измерения (Intel RAPL, NVIDIA GPU инструменты, ...) для измерения энергопотребления устройства. Эти инструменты имеют частоту меза, которая зависит от устройства. Таким образом, вы не можете использовать Pyjoule для измерения потребления энергии в течение периода короче частоты измерения энергии устройства. Pyjoule вернет нулевые значения, если период измерения будет коротким.
Вы можете установить Pyjoules с PIP: pip install pyJoules
Если вы хотите использовать Pyjoule, чтобы также измерить потребление энергии GPU NVIDIA, вы должны установить его с поддержкой драйверов 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 .
Основное использование декоратора будет напечатать iformation с помощью этого формата:
begin timestamp : XXX; tag : YYY; duration : ZZZ;device_name: AAAA
с :
begin timestamp : контролируемая функция время запускаtag : тег меры, если ничего не указано, это будет имя функцииduration : Продолжительность выполнения функцииdevice_name : энергопотребление устройства device_name в UJДля устройств CPU и RAM Device_Name соответствует домену RAPL, описанному на изображении ниже, плюс идентификатор сокета ЦП. Домен rapl описан здесь
Вы можете легко настроить, какое устройство контролировать, используя параметры measureit . Например, в следующем примере только контролирует энергопотребление процессора в сокете 1 и графическом процессоре Nvidia 0 . По умолчанию Pyjoules отслеживает все доступные устройства гнезда процессора.
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 (укажите идентификатор сокета в параметре)pyJoules.device.rapl_device.RaplDramDomain : Ram (укажите идентификатор сокета в параметре)pyJoules.device.rapl_device.RaplUncoreDomain : интегрированный GPU (укажите идентификатор сокета в параметре)pyJoules.device.rapl_device.RaplCoreDomain : домен ядра Rapl (укажите идентификатор сокета в параметре)pyJoules.device.nvidia_device.NvidiaGPUDomain : nvidia gpu (укажите идентификатор сокета в параметре)Чтобы понять, какой PAR из процессора каждый монитор домена RAPL см. В этом разделе
Если вы хотите обрабатывать данные с отличным выходом, чем стандартный, вы можете настроить декоратор с помощью экземпляра EnergyHandler от модуля pyJoules.handler .
В качестве примера, если вы хотите написать записанное потребление энергии в файле .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 () Это создаст файл CSV из 100 строк. Каждая строка, содержащая потребление энергии, записанное во время одного выполнения функции foo . Другие предопределенные классы Handler существуют для экспорта данных в MongoDB и Panda DataFrame.
Если вы хотите знать, где находятся « горячие точки », где ваш код 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.recordctx.record и окончанием EnergyContextКаждая измеренная часть будет записана в файле CSV. Одна линия на часть.
Домены RAPL совпадают с частью сокета процессора, как описано на этом изображении:
Pyjoules -это проект с открытым исходным кодом, разработанный Исследовательской группой Spirals (Университет Лилля и INRIA), который является частью инициативы PowerAPI.
Документация доступна здесь.
Вы можете следить за последними новостями и задавать вопросы, подписываясь на наш список рассылки.
Если вы хотите внести код, вы можете сделать это через GitHub, разбив репозиторий и отправив запрос на вытяжение.
При отправке кода, пожалуйста, приложите все усилия, чтобы следовать существующим соглашениям и стилю кодирования, чтобы сохранить код как можно более читаемым.