Pyjoules เป็นชุดเครื่องมือซอฟต์แวร์ในการวัดรอยเท้าพลังงานของเครื่องโฮสต์ตามการดำเนินการของรหัส Python มันตรวจสอบพลังงานที่ใช้โดยอุปกรณ์เฉพาะของเครื่องโฮสต์เช่น:
Pyjoules ใช้เทคโนโลยี Intel " การใช้งานค่าเฉลี่ยพลังงานเฉลี่ย " (RAPL) ที่ประเมินการใช้พลังงานของ CPU, RAM และ GPU แบบบูรณาการ เทคโนโลยีนี้มีอยู่ใน Intel CPU ตั้งแต่รุ่น Sandy Bridge (2010)
Pyjoules ใช้เทคโนโลยี Nvidia " Nvidia Management Library " เพื่อวัดการใช้พลังงานของอุปกรณ์ Nvidia API การวัดพลังงานมีให้เฉพาะใน Nvidia GPU พร้อมสถาปัตยกรรม Volta (2018)
มีเพียงการสนับสนุน GNU/Linux เท่านั้นที่พร้อมใช้งานในขณะนี้ เรากำลังทำงานกับการสนับสนุน MAC
RAPL Energy Counters ล้นหลังจากหลายนาทีหรือหลายชั่วโมงอาจทำให้เกิดการอ่านพลังงานที่ผิดพลาด
Pyjoules คำนึงถึงสิ่งนี้และเพิ่มค่าสูงสุดที่เป็นไปได้ของตัวนับ max_energy_range_uj ไปยังการวัดพลังงานเชิงลบ อย่างไรก็ตามหากเคาน์เตอร์ล้นสองครั้งในระหว่างการวัดพลังงานเพียงครั้งเดียวพลังงานที่รายงานจะเป็น max_energy_range_uj น้อยกว่าค่าที่คาดไว้
Pyjoule ใช้เครื่องมือวัดฮาร์ดแวร์ (Intel Rapl, เครื่องมือ Nvidia GPU, ... ) เพื่อวัดการใช้พลังงานของอุปกรณ์ เครื่องมือเหล่านี้มีความถี่ mesasurement ที่ขึ้นอยู่กับอุปกรณ์ ดังนั้นคุณไม่สามารถใช้ pyjoule เพื่อวัดการใช้พลังงานในช่วงเวลาที่สั้นกว่าความถี่การวัดพลังงานของอุปกรณ์ Pyjoule จะส่งคืนค่า NULL หากระยะเวลาการวัดจะสั้น
คุณสามารถติดตั้ง 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
การใช้งานขั้นพื้นฐานของ Decorator จะพิมพ์ 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 ที่อธิบายไว้ในภาพด้านล่างบวกกับรหัสซ็อกเก็ต CPU โดเมน Rapl อธิบายไว้ที่นี่
คุณสามารถกำหนดค่าอุปกรณ์ใดที่จะตรวจสอบโดยใช้พารามิเตอร์ของมัณฑนากร measureit ตัวอย่างเช่นตัวอย่างต่อไปนี้จะตรวจสอบการใช้พลังงานของ CPU บนซ็อกเก็ต CPU 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 : CPU (ระบุซ็อกเก็ต ID ในพารามิเตอร์)pyJoules.device.rapl_device.RaplDramDomain : ram (ระบุซ็อกเก็ต ID ในพารามิเตอร์)pyJoules.device.rapl_device.RaplUncoreDomain : GPU แบบรวม (ระบุซ็อกเก็ต ID ในพารามิเตอร์)pyJoules.device.rapl_device.RaplCoreDomain : Rapl Core Domain (ระบุซ็อกเก็ต ID ในพารามิเตอร์)pyJoules.device.nvidia_device.NvidiaGPUDomain : Nvidia GPU (ระบุซ็อกเก็ต ID ในพารามิเตอร์)เพื่อให้เข้าใจว่า PAR ของ CPU แต่ละตัวตรวจสอบโดเมน 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 ตรงกับส่วนหนึ่งของซ็อกเก็ต CPU ตามที่อธิบายไว้ในภาพนี้:
Pyjoules เป็นโครงการโอเพ่นซอร์สที่พัฒนาโดยกลุ่มวิจัย Spirals (University of Lille และ Inria) ซึ่งเป็นส่วนหนึ่งของ Powerapi Initiative
เอกสารมีอยู่ที่นี่
คุณสามารถติดตามข่าวสารล่าสุดและถามคำถามโดยสมัครสมาชิกรายชื่อผู้รับจดหมายของเรา
หากคุณต้องการมีส่วนร่วมในรหัสคุณสามารถทำได้ผ่านทาง GitHub โดยการหาที่เก็บและส่งคำขอดึง
เมื่อส่งรหัสโปรดใช้ความพยายามทุกวิถีทางในการติดตามอนุสัญญาและรูปแบบการเข้ารหัสที่มีอยู่เพื่อให้รหัสอ่านได้มากที่สุด