最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Python實(shí)時(shí)檢測(cè)CPU和GPU的功耗

 更新時(shí)間:2023年01月28日 09:40:53   作者:小鋒學(xué)長(zhǎng)生活大爆炸  
本文主要介紹了淺談Python實(shí)時(shí)檢測(cè)CPU和GPU的功耗,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

相關(guān)一些檢測(cè)工具挺多的,比如powertop、powerstat、s-tui等。但如何通過(guò)代碼的方式來(lái)實(shí)時(shí)檢測(cè),是個(gè)麻煩的問(wèn)題。通過(guò)許久的搜索和自己的摸索,發(fā)現(xiàn)了可以檢測(cè)CPU和GPU功耗的方法。如果有什么不對(duì),或有更好的方法,歡迎評(píng)論留言!

文末附完整功耗分析的示例代碼!

GPU功耗檢測(cè)方法

如果是常規(guī)的工具,可以使用官方的NVML。但這里需要Python控制,所以使用了對(duì)應(yīng)的封裝:pynvml。

先安裝:

pip install pynvml

關(guān)于這個(gè)庫(kù),網(wǎng)上的使用教程挺多的。這里直接給出簡(jiǎn)單的示例代碼:

import pynvml
pynvml.nvmlInit()
 
handle = pynvml.nvmlDeviceGetHandleByIndex(0)
powerusage = pynvml.nvmlDeviceGetPowerUsage(handle) / 1000

這個(gè)方法獲取的值,跟使用“nvidia-smi”指令得到的是一樣的。

附贈(zèng)一個(gè)來(lái)自網(wǎng)上的獲取更詳細(xì)信息的函數(shù):

def get_sensor_values():
    """
    get Sensor values
    :return:
    """
    values = list()
    # get gpu driver version
    version = pynvml.nvmlSystemGetDriverVersion()
    values.append("GPU_device_driver_version:" + version.decode())
    gpucount = pynvml.nvmlDeviceGetCount()  # 顯示有幾塊GPU
    for gpu_id in range(gpucount):
        handle = pynvml.nvmlDeviceGetHandleByIndex(gpu_id)
        name = pynvml.nvmlDeviceGetName(handle).decode()
        meminfo = pynvml.nvmlDeviceGetMemoryInfo(handle)
        # print(meminfo.total)  # 顯卡總的顯存大小
        gpu_id = str(gpu_id)
        values.append("GPU " + gpu_id + " " + name + " 總共顯存大小:" + str(common.bytes2human(meminfo.total)))
        # print(meminfo.used)  # 顯存使用大小
        values.append("GPU " + gpu_id + " " + name + " 顯存使用大小:" + str(common.bytes2human(meminfo.used)))
        # print(meminfo.free)  # 顯卡剩余顯存大小
        values.append("GPU " + gpu_id + " " + name + " 剩余顯存大小:" + str(common.bytes2human(meminfo.free)))
        values.append("GPU " + gpu_id + " " + name + " 剩余顯存比例:" + str(int((meminfo.free / meminfo.total) * 100)))
 
        utilization = pynvml.nvmlDeviceGetUtilizationRates(handle)
        # print(utilization.gpu)  # gpu利用率
        values.append("GPU " + gpu_id + " " + name + " GPU利用率:" + str(utilization.gpu))
 
        powerusage = pynvml.nvmlDeviceGetPowerUsage(handle)
        # print(powerusage / 1000) # 當(dāng)前功耗, 原始單位是mWa
        values.append("GPU " + gpu_id + " " + name + " 當(dāng)前功耗(W):" + str(powerusage / 1000))
 
        # 當(dāng)前gpu power capacity
        # pynvml.nvmlDeviceGetEnforcedPowerLimit(handle)
 
        # 通過(guò)以下方法可以獲取到gpu的溫度,暫時(shí)采用ipmi sdr獲取gpu的溫度,此處暫不處理
        # temp = pynvml.nvmlDeviceGetTemperature(handle,0)
    print('\n'.join(values))
    return values

CPU功耗檢測(cè)方法

這個(gè)沒(méi)有找到開(kāi)源可以直接用的庫(kù)。但經(jīng)過(guò)搜索,發(fā)現(xiàn)大家都在用的s-tui工具是開(kāi)源的!通過(guò)查看源碼,發(fā)現(xiàn)他是有獲取CPU功耗部分的代碼,所以就參考他的源碼寫(xiě)了一下。

先安裝:

sudo apt install s-tui
pip install s-tui

先直接運(yùn)行工具看一下效果(不使用sudo是不會(huì)出來(lái)Power的):

sudo s-tui

 說(shuō)明這個(gè)工具確實(shí)能獲取到CPU的功耗。其中package就是2個(gè)CPU,dram是內(nèi)存條功耗(一般不準(zhǔn),可以不用)。

直接給出簡(jiǎn)單的示例代碼:

from s_tui.sources.rapl_power_source import RaplPowerSource
 
source.update()
summary = dict(source.get_sensors_summary())
 
cpu_power_total = str(sum(list(map(float, [summary[key] for key in summary.keys() if key.startswith('package')]))))

不過(guò)注意!由于需要sudo權(quán)限,所以運(yùn)行這個(gè)py文件時(shí)候,也需要sudo方式,比如:

sudo python demo.py

sudo的困擾與解決

上面提到,由于必須要sudo方式,但sudo python就換了運(yùn)行腳本的環(huán)境了呀,這個(gè)比較棘手。后來(lái)想了個(gè)方法,曲線救國(guó)一下。通過(guò)sudo運(yùn)行一個(gè)腳本,并開(kāi)啟socket監(jiān)聽(tīng);而我們自己真正的腳本,在需要獲取CPU功耗時(shí)候,連接一下socket就行。

為什么這里使用socket而不是http呢?因?yàn)閟ocket更高效一點(diǎn)!

我們寫(xiě)一個(gè)“power_listener.py”來(lái)監(jiān)聽(tīng):

from s_tui.sources.rapl_power_source import RaplPowerSource
import socket
import json
 
def output_to_terminal(source):
    results = {}
    if source.get_is_available():
        source.update()
        source_name = source.get_source_name()
        results[source_name] = source.get_sensors_summary()
    for key, value in results.items():
        print(str(key) + ": ")
        for skey, svalue in value.items():
            print(str(skey) + ": " + str(svalue) + ", ")
 
 
source = RaplPowerSource()
# output_to_terminal(source)
 
s = socket.socket()
host = socket.gethostname()
port = 8888
s.bind((host, port))
s.listen(5)
print("等待客戶端連接...")
while True:
    c, addr = s.accept()
    source.update()
    summary = dict(source.get_sensors_summary())
    #msg = json.dumps(summary)
    # package表示CPU,dram表示內(nèi)存(一般不準(zhǔn))
    power_total = str(sum(list(map(float, [summary[key] for key in summary.keys() if key.startswith('package')]))))
    print(f'發(fā)送給{addr}:{power_total}')
    c.send(power_total.encode('utf-8'))
    c.close()                # 關(guān)閉連接

因此,在需要獲取CPU功耗時(shí)候,只需要:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 8888
s.connect((host, port))
msg = s.recv(1024)
s.close()
power_usage_cpu = float(msg.decode('utf-8'))

完整功耗分析示例代碼

提供一個(gè)我自己編寫(xiě)和使用的功耗分析代碼,僅供參考。(注意上面的power_listener.py需要運(yùn)行著)

import cv2
import socket
import sys
import threading
import json
import statistics
from psutil import _common as common
import pynvml
pynvml.nvmlInit()
 
class Timer: 
    def __init__(self, name = '', is_verbose = False):
        self._name = name 
        self._is_verbose = is_verbose
        self._is_paused = False 
        self._start_time = None 
        self._accumulated = 0 
        self._elapsed = 0         
        self.start()
 
    def start(self):
        self._accumulated = 0         
        self._start_time = cv2.getTickCount()
 
    def pause(self): 
        now_time = cv2.getTickCount()
        self._accumulated += (now_time - self._start_time)/cv2.getTickFrequency() 
        self._is_paused = True   
 
    def resume(self): 
        if self._is_paused: # considered only if paused 
            self._start_time = cv2.getTickCount()
            self._is_paused = False                      
 
    def elapsed(self):
        if self._is_paused:
            self._elapsed = self._accumulated
        else:
            now = cv2.getTickCount()
            self._elapsed = self._accumulated + (now - self._start_time)/cv2.getTickFrequency()        
        if self._is_verbose is True:      
            name =  self._name
            if self._is_paused:
                name += ' [paused]'
            message = 'Timer::' + name + ' - elapsed: ' + str(self._elapsed) 
            timer_print(message)
        return self._elapsed   
 
class PowerUsage:
    '''
    demo:
        power_usage = PowerUsage()
        power_usage.analyze_start()
        time.sleep(2)
        time_used, power_usage_gpu, power_usage_cpu = power_usage.analyze_end()
        print(time_used)
        print(power_usage_gpu)
        print(power_usage_cpu)
    '''
    def __init__(self):
        self.start_analyze = False
        self.power_usage_gpu_values = list()
        self.power_usage_cpu_values = list()
        self.thread = None
        self.timer = Timer(name='GpuPowerUsage', is_verbose=False)
 
    def analyze_start(self, gpu_id=0, delay=0.1):
        handle = pynvml.nvmlDeviceGetHandleByIndex(gpu_id)
        def start():
            self.power_usage_gpu_values.clear()
            self.power_usage_cpu_values.clear()
            self.start_analyze = True
            self.timer.start()
            while self.start_analyze:
                powerusage = pynvml.nvmlDeviceGetPowerUsage(handle)
                self.power_usage_gpu_values.append(powerusage/1000)
 
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                host = socket.gethostname()
                port = 8888
                s.connect((host, port))
                msg = s.recv(1024)
                s.close()
                self.power_usage_cpu_values.append(float(msg.decode('utf-8')))
 
                time.sleep(delay)
        self.thread = threading.Thread(target=start, daemon=True)
        self.thread.start()
 
    def analyze_end(self, mean=True):
        self.start_analyze = False
        while self.thread and self.thread.isAlive():
            time.sleep(0.01)
        time_used = self.timer.elapsed()
        self.thread = None
        power_usage_gpu = statistics.mean(self.power_usage_gpu_values) if mean else self.power_usage_gpu_values
        power_usage_cpu = statistics.mean(self.power_usage_cpu_values) if mean else self.power_usage_cpu_values
        return time_used, power_usage_gpu, power_usage_cpu
 
 
power_usage = PowerUsage()
def power_usage_api(func, note=''):
    @wraps(func)
    def wrapper(*args, **kwargs):
        power_usage.analyze_start()
        result = func(*args, **kwargs)
        print(f'{note}{power_usage.analyze_end()}')
        return result
    return wrapper
 
def power_usage_api2(note=''):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            power_usage.analyze_start()
            result = func(*args, **kwargs)
            print(f'{note}{power_usage.analyze_end()}')
            return result
        return wrapper
    return decorator

用法示例:

power_usage = PowerUsage()
power_usage.analyze_start()
# ----------------------
# xxx 某一段待分析的代碼
# 這里以sleep表示運(yùn)行時(shí)長(zhǎng)
time.sleep(2)
# ----------------------
time_used, power_usage_gpu, power_usage_cpu = power_usage.analyze_end()
print(f'time_used: {time_used}')
print(f'power_usage_gpu: {power_usage_gpu}')
print(f'power_usage_cpu: {power_usage_cpu}')

 到此這篇關(guān)于淺談Python實(shí)時(shí)檢測(cè)CPU和GPU的功耗的文章就介紹到這了,更多相關(guān)Python CPU和GPU功耗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 用python打包exe應(yīng)用程序及PyInstaller安裝方式

    用python打包exe應(yīng)用程序及PyInstaller安裝方式

    PyInstaller 制作出來(lái)的執(zhí)行文件并不是跨平臺(tái)的,如果需要為不同平臺(tái)打包,就要在相應(yīng)平臺(tái)上運(yùn)行PyInstaller進(jìn)行打包。今天通過(guò)本文給大家介紹用python打包exe應(yīng)用程序及PyInstaller安裝方式,感興趣的朋友一起看看吧
    2021-12-12
  • Python socket網(wǎng)絡(luò)編程TCP/IP服務(wù)器與客戶端通信

    Python socket網(wǎng)絡(luò)編程TCP/IP服務(wù)器與客戶端通信

    這篇文章主要介紹了Python socket網(wǎng)絡(luò)編程TCP/IP服務(wù)器與客戶端通信的相關(guān)資料,這里對(duì)Scoket 進(jìn)行詳解并創(chuàng)建TCP服務(wù)器及TCP 客戶端實(shí)例代碼,需要的朋友可以參考下
    2017-01-01
  • python time.strptime格式化實(shí)例詳解

    python time.strptime格式化實(shí)例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于python time.strptime格式化實(shí)例詳解內(nèi)容,對(duì)此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • 在Python中使用K-Means聚類和PCA主成分分析進(jìn)行圖像壓縮

    在Python中使用K-Means聚類和PCA主成分分析進(jìn)行圖像壓縮

    這篇文章主要介紹了在Python中使用K-Means聚類和PCA主成分分析進(jìn)行圖像壓縮,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Python?time時(shí)間格式化操作指南

    Python?time時(shí)間格式化操作指南

    這篇文章主要給大家介紹了關(guān)于Python?time時(shí)間格式化操作的相關(guān)資料,Python中日期格式化是非常常見(jiàn)的操作,Python中能用很多方式處理日期和時(shí)間,轉(zhuǎn)換日期格式是一個(gè)常見(jiàn)的功能,需要的朋友可以參考下
    2023-10-10
  • 解決pycharm每次新建項(xiàng)目都要重新安裝一些第三方庫(kù)的問(wèn)題

    解決pycharm每次新建項(xiàng)目都要重新安裝一些第三方庫(kù)的問(wèn)題

    今天小編就為大家分享一篇解決pycharm每次新建項(xiàng)目都要重新安裝一些第三方庫(kù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 詳解Python中 __get__和__getattr__和__getattribute__的區(qū)別

    詳解Python中 __get__和__getattr__和__getattribute__的區(qū)別

    __get__、__getattr__、__getattribute都是訪問(wèn)屬性的方法,但作用不太相同,這里我們就來(lái)詳解Python中 __get__和__getattr__和__getattribute__的區(qū)別:
    2016-06-06
  • python 使用elasticsearch 實(shí)現(xiàn)翻頁(yè)的三種方式

    python 使用elasticsearch 實(shí)現(xiàn)翻頁(yè)的三種方式

    這篇文章主要介紹了python 使用elasticsearch 實(shí)現(xiàn)翻頁(yè)的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python判斷變量是否為Json格式的字符串示例

    Python判斷變量是否為Json格式的字符串示例

    這篇文章主要給大家介紹了利用Python判斷變量是否為Json格式的字符串的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。
    2017-05-05
  • Python中如何使用Pandas庫(kù)自定義函數(shù)

    Python中如何使用Pandas庫(kù)自定義函數(shù)

    Pandas是Python中用于數(shù)據(jù)分析和處理的強(qiáng)大庫(kù),它提供了豐富的功能,可以輕松地處理各種類型的數(shù)據(jù),在實(shí)際應(yīng)用中,我們經(jīng)常需要對(duì)數(shù)據(jù)進(jìn)行復(fù)雜的轉(zhuǎn)換、計(jì)算或聚合操作,而這些操作往往不能僅靠Pandas內(nèi)置的函數(shù)完成,這時(shí),自定義函數(shù)就顯得尤為重要
    2025-01-01

最新評(píng)論

铅山县| 昆山市| 婺源县| 巫溪县| 沙田区| 芜湖市| 临泉县| 宁都县| 鹰潭市| 扎鲁特旗| 滨州市| 岳普湖县| 如皋市| 平陆县| 海兴县| 托克逊县| 洪雅县| 海阳市| 渑池县| 山东| 桃园市| 定结县| 额济纳旗| 沈阳市| 务川| 天祝| 资阳市| 界首市| 盐津县| 横峰县| 正安县| 丽水市| 云梦县| 丽江市| 伊金霍洛旗| 阳原县| 平定县| 且末县| 林西县| 萍乡市| 彭泽县|