Pyjoules adalah toolkit perangkat lunak untuk mengukur jejak energi mesin host di sepanjang pelaksanaan sepotong kode Python. Ini memantau energi yang dikonsumsi oleh perangkat spesifik dari mesin host seperti:
Pyjoules menggunakan teknologi Intel " Running Average Power Limit " (RAPL) yang memperkirakan konsumsi daya CPU, RAM dan GPU terintegrasi. Teknologi ini tersedia di Intel CPU sejak Generasi Jembatan Sandy (2010).
Pyjoules menggunakan teknologi NVIDIA " NVIDIA Management Library " untuk mengukur konsumsi energi perangkat NVIDIA. API Pengukuran Energi hanya tersedia di NVIDIA GPU dengan Volta Architecture (2018)
Hanya dukungan GNU/Linux yang tersedia untuk saat ini. Kami sedang mengerjakan dukungan Mac
Penghitung energi rapl meluap setelah beberapa menit atau jam, berpotensi menyebabkan pembacaan energi negatif palsu.
Pyjoules memperhitungkan ini dan menambahkan nilai maksimum penghitung yang mungkin, max_energy_range_uj , ke pengukuran energi negatif. Namun, jika counter meluap dua kali selama pengukuran energi tunggal, energi yang dilaporkan akan menjadi max_energy_range_uj kurang dari nilai yang diharapkan.
Pyjoule menggunakan alat pengukuran perangkat keras (Intel RAPL, alat GPU NVIDIA, ...) untuk mengukur konsumsi energi perangkat. Alat tesis ini memiliki frekuensi mesasurement yang bergantung pada perangkat. Dengan demikian, Anda tidak dapat menggunakan pyjoule untuk mengukur konsumsi energi selama periode lebih pendek dari frekuensi pengukuran energi perangkat. Pyjoule akan mengembalikan nilai nol jika periode pengukuran pendek.
Anda dapat memasang pyjoule dengan pip: pip install pyJoules
Jika Anda ingin menggunakan Pyjoule untuk juga mengukur konsumsi energi GPU NVIDIA, Anda harus menginstalnya dengan dukungan driver NVIDIA menggunakan perintah ini: pip install pyJoules[nvidia] .
Readme ini menggambarkan penggunaan dasar pyjoule. Untuk lebih lanjut deskripsi mendalam, baca dokumentasi di sini
Berikut adalah beberapa penggunaan dasar pyjoule . Harap dicatat bahwa konsumsi energi yang dilaporkan bukan hanya konsumsi energi dari kode yang Anda jalankan. Ini termasuk konsumsi energi global dari semua proses yang berjalan pada mesin selama periode ini, sehingga termasuk sistem operasi dan aplikasi lainnya. Itulah sebabnya kami merekomendasikan untuk menghilangkan program tambahan yang dapat mengubah konsumsi energi dari eksperimen hosting mesin dan hanya menyimpan kode di bawah pengukuran ( yaitu , tidak ada aplikasi tambahan, seperti antarmuka grafis, tugas menjalankan latar belakang ...). Ini akan memberikan ukuran terdekat dengan konsumsi energi nyata dari kode yang diukur.
Untuk mengukur energi yang dikonsumsi oleh mesin selama pelaksanaan fungsi foo() jalankan kode berikut:
from pyJoules . energy_meter import measure_energy
@ measure_energy
def foo ():
# Instructions to be evaluated.
foo () Ini akan mencetak pada konsol konsumsi energi yang direkam dari semua perangkat yang dapat dipantau selama pelaksanaan fungsi foo .
Dekorator Penggunaan Dasar Akan Mencetak Iformasi Dengan Format Ini:
begin timestamp : XXX; tag : YYY; duration : ZZZ;device_name: AAAA
dengan :
begin timestamp : waktu peluncuran fungsi yang dipantautag : Tag ukuran, jika tidak ada yang ditentukan, ini akan menjadi nama fungsiduration : Durasi Eksekusi Fungsidevice_name : Konsumsi daya perangkat device_name di UJUntuk perangkat CPU dan RAM, Device_Name cocok dengan domain RAPL yang dijelaskan pada gambar di bawah ini ditambah ID soket CPU. Domain rapl dijelaskan di sini
Anda dapat dengan mudah mengkonfigurasi perangkat mana yang akan dipantau menggunakan parameter dekorator measureit . Misalnya, contoh berikut hanya memantau konsumsi daya CPU pada soket CPU 1 dan NVIDIA GPU 0 . Secara default, Pyjoule memantau semua perangkat soket CPU yang tersedia.
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 () Anda dapat menambahkan daftar domain berikut untuk memantau mereka:
pyJoules.device.rapl_device.RaplPackageDomain : cpu (tentukan ID soket dalam parameter)pyJoules.device.rapl_device.RaplDramDomain : RAM (tentukan ID soket dalam parameter)pyJoules.device.rapl_device.RaplUncoreDomain : GPU terintegrasi (tentukan ID soket dalam parameter)pyJoules.device.rapl_device.RaplCoreDomain : domain inti rapl (tentukan ID soket dalam parameter)pyJoules.device.nvidia_device.NvidiaGPUDomain : nvidia gpu (tentukan ID soket dalam parameter)Untuk memahami par mana dari CPU masing -masing monitor domain rapl, lihat bagian ini
Jika Anda ingin menangani data dengan output yang berbeda dari yang standar, Anda dapat mengonfigurasi dekorator dengan instance EnergyHandler dari modul pyJoules.handler .
Sebagai contoh, jika Anda ingin menulis konsumsi energi yang direkam dalam file .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 () Ini akan menghasilkan file CSV 100 baris. Setiap baris yang berisi konsumsi energi yang dicatat selama satu eksekusi fungsi foo . Kelas Handler yang telah ditentukan sebelumnya ada untuk mengekspor data ke MongoDB dan Panda DataFrame.
Jika Anda ingin tahu di mana " hot spot " di mana kode Python Anda mengkonsumsi energi terbanyak yang dapat Anda tambahkan " breakpoint " selama proses pengukuran dan menandai mereka untuk mengetahui jumlah energi yang dikonsumsi di antara breakpoint ini.
Untuk ini, Anda harus menggunakan manajer konteks untuk mengukur konsumsi energi. Ini dapat dikonfigurasi sebagai dekorator. Misalnya, di sini kami menggunakan EnergyContext untuk mengukur konsumsi daya CPU 1 dan NVIDIA GPU 0 dan melaporkannya dalam file 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 ()Ini akan mencatat energi yang dikonsumsi:
EnergyContext dan panggilan metode ctx.recordctx.record dan akhir EnergyContextSetiap bagian yang diukur akan ditulis dalam file CSV. Satu baris per bagian.
Domain RAPL cocok dengan bagian dari soket CPU seperti yang dijelaskan dalam gambar ini:
Pyjoules adalah proyek open-source yang dikembangkan oleh The Spiral Research Group (University of Lille dan Inria) yang merupakan bagian dari Inisiatif Powerapi.
Dokumentasi tersedia di sini.
Anda dapat mengikuti berita terbaru dan mengajukan pertanyaan dengan berlangganan milis kami.
Jika Anda ingin menyumbangkan kode, Anda dapat melakukannya melalui GitHub dengan membayar repositori dan mengirim permintaan tarik.
Saat mengirimkan kode, silakan lakukan segala upaya untuk mengikuti konvensi dan gaya pengkodean yang ada untuk menjaga kode tersebut dapat dibaca sebanyak mungkin.