如何在 Python 中获取每秒的 GPU 使用率

Posted

技术标签:

【中文标题】如何在 Python 中获取每秒的 GPU 使用率【英文标题】:How to get every second's GPU usage in Python 【发布时间】:2021-08-14 20:52:11 【问题描述】:

我有一个由tensorflow-gpu 运行的模型,我的设备是nvidia。我想列出每一秒的 GPU 使用率,以便我可以测量平均/最大 GPU 使用率。我可以通过打开两个终端手动执行此操作,一个是运行模型,另一个是通过nvidia-smi -l 1 测量。当然,这不是一个好方法。我也尝试使用Thread 来做到这一点,就是这样。

import subprocess as sp
import os
from threading import Thread

class MyThread(Thread):
    def __init__(self, func, args):
        super(MyThread, self).__init__()
        self.func = func
        self.args = args

    def run(self):
        self.result = self.func(*self.args)

    def get_result(self):
        return self.result

def get_gpu_memory():
   output_to_list = lambda x: x.decode('ascii').split('\n')[:-1]
   ACCEPTABLE_AVAILABLE_MEMORY = 1024
   COMMAND = "nvidia-smi -l 1 --query-gpu=memory.used --format=csv"
   memory_use_info = output_to_list(sp.check_output(COMMAND.split()))[1:]
   memory_use_values = [int(x.split()[0]) for i, x in enumerate(memory_use_info)]
   return memory_use_values

def run():
   pass

t1 = MyThread(run, args=())
t2 = MyThread(get_gpu_memory, args=())

t1.start()
t2.start()
t1.join()
t2.join()
res1 = t2.get_result()

但是,这也不会返回每一秒的使用情况。有好的解决办法吗?

【问题讨论】:

【参考方案1】:

在命令nvidia-smi -l 1 --query-gpu=memory.used --format=csv

-l 代表:

-l, --loop= 以指定的第二个间隔探测直到 Ctrl+C。

所以命令:

COMMAND = 'nvidia-smi -l 1 --query-gpu=memory.used --format=csv'
sp.check_output(COMMAND.split())

永远不会终止并返回。

如果你将事件循环从命令(nvidia-smi) 中删除到 python,它就可以工作。

代码如下:

import subprocess as sp
import os
from threading import Thread , Timer
import sched, time

def get_gpu_memory():
    output_to_list = lambda x: x.decode('ascii').split('\n')[:-1]
    ACCEPTABLE_AVAILABLE_MEMORY = 1024
    COMMAND = "nvidia-smi --query-gpu=memory.used --format=csv"
    try:
        memory_use_info = output_to_list(sp.check_output(COMMAND.split(),stderr=sp.STDOUT))[1:]
    except sp.CalledProcessError as e:
        raise RuntimeError("command '' return with error (code ): ".format(e.cmd, e.returncode, e.output))
    memory_use_values = [int(x.split()[0]) for i, x in enumerate(memory_use_info)]
    # print(memory_use_values)
    return memory_use_values


def print_gpu_memory_every_5secs():
    """
        This function calls itself every 5 secs and print the gpu_memory.
    """
    Timer(5.0, print_gpu_memory_every_5secs).start()
    print(get_gpu_memory())

print_gpu_memory_every_5secs()

"""
Do stuff.
"""

【讨论】:

以上是关于如何在 Python 中获取每秒的 GPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 和 Numba 获取 GPU 中的 CUDA 内核数量?

在python中获取gif的每秒帧数?

在没有管理员访问权限的情况下使用 Python 获取 CPU 和 GPU 温度 - Windows

如何在 C++ 中急切提交分配的内存?

使用 Python Windows 获取 CPU 和 GPU 温度

华为OD机试真题 Python 实现执行时长GPU算力