Pyjoules هي مجموعة أدوات للبرمجيات لقياس بصمة الطاقة لجهاز المضيف على طول تنفيذ قطعة من رمز Python. يراقب الطاقة التي تستهلكها جهاز معين من الجهاز المضيف مثل:
يستخدم Pyjoules تقنية Intel " متوسط الحد من الطاقة " (RAPL) التي تقدر استهلاك الطاقة في وحدة المعالجة المركزية ، وذاكرة الوصول العشوائي و GPU المتكاملة. هذه التقنية متوفرة على وحدة المعالجة المركزية Intel منذ Sandy Bridge Generation (2010).
يستخدم Pyjoules تقنية Nvidia " Nvidia Management Library " لقياس استهلاك الطاقة لأجهزة NVIDIA. واجهة برمجة تطبيقات قياس الطاقة متاحة فقط على NVIDIA GPU مع فولتا بنية (2018)
يتوفر دعم GNU/Linux فقط في الوقت الحالي. نحن نعمل على دعم Mac
تفيض عدادات الطاقة RAPL بعد عدة دقائق أو ساعات ، مما قد يتسبب في قراءات الطاقة السلبية الخاطئة.
يأخذ Pyjoules هذا في الاعتبار ويضيف أقصى قيمة ممكنة للعداد ، max_energy_range_uj ، إلى قياسات الطاقة السلبية. ومع ذلك ، إذا كان هناك عداد يفيض مرتين أثناء قياس طاقة واحد ، فستكون الطاقة المبلغ عنها max_energy_range_uj أقل من القيمة المتوقعة.
استخدم Pyjoule أدوات قياس الأجهزة (Intel Rapl ، Nvidia GPU Tools ، ...) لقياس استهلاك طاقة الجهاز. أدوات الأطروحات لها تردد mesasurement يعتمد على الجهاز. وبالتالي ، لا يمكنك استخدام Pyjoule لقياس استهلاك الطاقة خلال فترة أقصر من تردد قياس طاقة الجهاز. سيعود Pyjoule قيمًا فارغة إذا كانت فترة القياس قصيرة.
يمكنك تثبيت Pyjoules مع PIP: pip install pyJoules
إذا كنت ترغب في استخدام Pyjoule لقياس استهلاك الطاقة NVIDIA GPU ، فيجب عليك تثبيته مع دعم برنامج تشغيل NVIDIA باستخدام هذا الأمر: pip install pyJoules[nvidia] .
هذا readme تصف الاستخدام الأساسي لل pyjoules. لمزيد من الوصف المتعمق ، اقرأ الوثائق هنا
فيما يلي بعض الاستخدامات الأساسية من Pyjoules . يرجى ملاحظة أن استهلاك الطاقة المبلغ عنه ليس فقط استهلاك الطاقة للرمز الذي تقوم بتشغيله. ويشمل ذلك استهلاك الطاقة العالمي لجميع العمليات التي تعمل على الجهاز خلال هذه الفترة ، وبالتالي بما في ذلك نظام التشغيل والتطبيقات الأخرى. لهذا السبب نوصي بإزالة أي برامج إضافية قد تغير استهلاك الطاقة لتجارب استضافة الماكينة وللحفاظ على الكود فقط قيد القياس ( أي ، لا توجد تطبيقات إضافية ، مثل الواجهة الرسومية ، مهمة تشغيل الخلفية ...). سيعطي هذا أقرب مقياس لاستهلاك الطاقة الحقيقي للرمز المقاس.
لقياس الطاقة التي تستهلكها الجهاز أثناء تنفيذ الوظيفة foo() قم بتشغيل الكود التالي:
from pyJoules . energy_meter import measure_energy
@ measure_energy
def foo ():
# Instructions to be evaluated.
foo () سيطبع هذا على وحدة التحكم استهلاك الطاقة المسجل لجميع الأجهزة القابلة للمراقبة أثناء تنفيذ الوظيفة foo .
سوف يطبع الاستخدام الأساسي للديكور مع هذا التنسيق:
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 Decorator. على سبيل المثال ، يقوم المثال التالي بمراقبة استهلاك طاقة وحدة المعالجة المركزية فقط على مقبس وحدة المعالجة المركزية 1 و NVIDIA GPU 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 : وحدة المعالجة المركزية (حدد معرف المقبس في المعلمة)pyJoules.device.rapl_device.RaplDramDomain : RAM (حدد معرف المقبس في المعلمة)pyJoules.device.rapl_device.RaplUncoreDomain : وحدة معالجة الرسومات المتكاملة (حدد معرف المقبس في المعلمة)pyJoules.device.rapl_device.RaplCoreDomain : مجال RAPL Core Comain (حدد معرف المقبس في المعلمة)pyJoules.device.nvidia_device.NvidiaGPUDomain : Nvidia GPU (حدد معرف المقبس في المعلمة)لفهم أي مساواة في وحدة المعالجة المركزية كل شاشة مجال 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 لقياس استهلاك الطاقة في وحدة المعالجة المركزية 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 و Call of the ctx.recordctx.record ونهاية EnergyContextسيتم كتابة كل جزء مقاس في ملف CSV. سطر واحد لكل جزء.
تطابق مجالات Rapl جزءًا من مقبس وحدة المعالجة المركزية كما هو موضح في هذه الصورة:
Pyjoules هو مشروع مفتوح المصدر تم تطويره من قبل مجموعة Silals Research Group (جامعة Lille و INRIA) وهو جزء من مبادرة Powerapi.
الوثائق متوفرة هنا.
يمكنك متابعة آخر الأخبار وتطرح أسئلة من خلال الاشتراك في قائمتنا البريدية.
إذا كنت ترغب في المساهمة في رمز ، فيمكنك القيام بذلك عبر Github عن طريق ربط المستودع وإرسال طلب سحب.
عند إرسال الرمز ، يرجى بذل كل جهد ممكن لمتابعة اتفاقيات الترميز والأناقة الحالية للحفاظ على الكود قابل للقراءة قدر الإمكان.