繁体   English   中英

如何分析Python脚本的CPU使用情况?

[英]How to profile CPU usage of a Python script?

理想情况下,我想要的是记录执行深度神经网络Keras模型的Python脚本的CPU使用情况。 我正在寻找与memory_profiler相当的CPU,它提供了进程的内存消耗。

我已经看过使用psutil (在这个答案中建议),这表明我的脚本可能包含一些变体

p = psutil.Process(current_pid)
p.cpu_percent()

但问题是重要的函数调用我真的想要捕获的效果将是模型的推理阶段

model.predict(x_test)

如果我在此步骤之前/之后运行psutil,则记录的CPU使用率将不会真实反映进程的CPU使用情况。

那么我想我可以使用top / htop之类的东西将脚本的CPU使用率记录到某个文件中,捕获进程运行时的CPU使用量波动,然后计算事后的平均值(或类似值)。 然而,我看到的问题是,我不需要知道使用top的PID,那么如何在执行之前使用top监视脚本(甚至还没有分配PID)?

我可以看到这个排名很高的答案表明cProfile给出了脚本中函数的运行时间。 虽然这不是我想要的,但我注意到它返回CPU秒的总数,这至少可以让我比较这方面的CPU使用率。

您可以在子model.predict(x_test)运行model.predict(x_test)并在主进程中同时记录其CPU使用情况。 例如,

import time
import multiprocessing as mp
import psutil
import numpy as np
from keras.models import load_model

def run_predict():
    model = load_model('1.h5')
    x_test = np.random.rand(10000, 1000)
    time.sleep(1)

    for _ in range(3):
        model.predict(x_test)
        time.sleep(0.5)

def monitor(target):
    worker_process = mp.Process(target=target)
    worker_process.start()
    p = psutil.Process(worker_process.pid)

    # log cpu usage of `worker_process` every 10 ms
    cpu_percents = []
    while worker_process.is_alive():
        cpu_percents.append(p.cpu_percent())
        time.sleep(0.01)

    worker_process.join()
    return cpu_percents

cpu_percents = monitor(target=run_predict)

上述脚本的cpu_percents中的值类似于:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM