py3nvml实现GPU相关信息读取
技术背景
随着模型运算量的增长和硬件技术的发展,使用GPU来完成各种任务的计算已经渐渐成为算法实现的主流手段。而对于运行期间的一些GPU的占用,比如每一步的显存使用率等诸如此类的信息,就需要一些比较细致的GPU信息读取的工具,这里我们重点推荐使用py3nvml来对python代码运行的一个过程进行监控。
常规信息读取
一般大家比较常用的就是nvidia-smi这个指令,来读取GPU的使用率和显存占用、驱动版本等信息:
$ nvidia-smi
Wed Jan 12 15:52:04 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.42.01 Driver Version: 470.42.01 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Quadro RTX 4000 On | 00000000:03:00.0 On | N/A |
| 30% 39C P8 20W / 125W | 538MiB / 7979MiB | 16% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 Quadro RTX 4000 On | 00000000:A6:00.0 Off | N/A |
| 30% 32C P8 7W / 125W | 6MiB / 7982MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1643 G /usr/lib/xorg/Xorg 412MiB |
| 0 N/A N/A 2940 G /usr/bin/gnome-shell 76MiB |
| 0 N/A N/A 47102 G ...AAAAAAAAA= --shared-files 35MiB |
| 0 N/A N/A 172424 G ...AAAAAAAAA= --shared-files 11MiB |
| 1 N/A N/A 1643 G /usr/lib/xorg/Xorg 4MiB |
+-----------------------------------------------------------------------------+
但是如果不使用profile仅仅使用nvidia-smi这个指令的输出的话,是没有办法非常细致的分析程序运行过程中的变化的。这里顺便推荐一个比较精致的跟nvidia-smi用法非常类似的小工具:gpustat。这个工具可以直接使用pip进行安装和管理:
$ python3 -m pip install gpustat
Collecting gpustat
Downloading gpustat-0.6.0.tar.gz (78 kB)
|████████████████████████████████| 78 kB 686 kB/s
Requirement already satisfied: six>=1.7 in /home/dechin/.local/lib/python3.8/site-packages (from gpustat) (1.16.0)
Collecting nvidia-ml-py3>=7.352.0
Downloading nvidia-ml-py3-7.352.0.tar.gz (19 kB)
Requirement already satisfied: psutil in /home/dechin/.local/lib/python3.8/site-packages (from gpustat) (5.8.0)
Collecting blessings>=1.6
Downloading blessings-1.7-py3-none-any.whl (18 kB)
Building wheels for collected packages: gpustat, nvidia-ml-py3
Building wheel for gpustat (setup.py) ... done
Created wheel for gpustat: filename=gpustat-0.6.0-py3-none-any.whl size=12617 sha256=4158e741b609c7a1bc6db07d76224db51cd7656a6f2e146e0b81185ce4e960ba
Stored in directory: /home/dechin/.cache/pip/wheels/0d/d9/80/b6cbcdc9946c7b50ce35441cc9e7d8c5a9d066469ba99bae44
Building wheel for nvidia-ml-py3 (setup.py) ... done
Created wheel for nvidia-ml-py3: filename=nvidia_ml_py3-7.352.0-py3-none-any.whl size=19191 sha256=70cd8ffc92286944ad9f5dc4053709af76fc0e79928dc61b98a9819a719f1e31
Stored in directory: /home/dechin/.cache/pip/wheels/b9/b1/68/cb4feab29709d4155310d29a421389665dcab9eb3b679b527b
Successfully built gpustat nvidia-ml-py3
Installing collected packages: nvidia-ml-py3, blessings, gpustat
Successfully installed blessings-1.7 gpustat-0.6.0 nvidia-ml-py3-7.352.0
使用的时候也是跟nvidia-smi非常类似的操作:
$ watch --color -n1 gpustat -cpu
返回结果如下所示:
Every 1.0s: gpustat -cpu ubuntu2004: Wed Jan 12 15:58:59 2022
ubuntu2004 Wed Jan 12 15:58:59 2022 470.42.01
[0] Quadro RTX 4000 | 39'C, 3 % | 537 / 7979 MB | root:Xorg/1643(412M) de
chin:gnome-shell/2940(75M) dechin:slack/47102(35M) dechin:chrome/172424(11M)
[1] Quadro RTX 4000 | 32'C, 0 % | 6 / 7982 MB | root:Xorg/1643(4M)
通过gpustat返回的结果,包含了GPU的型号、使用率和显存使用大小和GPU当前的温度等常规信息。
py3nvml的安装与使用
接下来正式看下py3nvml的安装和使用方法,这是一个可以在python中实时查看和监测GPU信息的一个库,可以通过pip来安装和管理:
$ python3 -m pip install py3nvml
Collecting py3nvml
Downloading py3nvml-0.2.7-py3-none-any.whl (55 kB)
|████████████████████████████████| 55 kB 650 kB/s
Requirement already satisfied: xmltodict in /home/dechin/anaconda3/lib/python3.8/site-packages (from py3nvml) (0.12.0)
Installing collected packages: py3nvml
Successfully installed py3nvml-0.2.7
py3nvml绑定GPU卡
有一些框架为了性能的最大化,在初始化的时候就会默认去使用到整个资源池里面的所有GPU卡,比如如下使用Jax来演示的一个案例:
In [1]: import py3nvml
In [2]: from jax import numpy as jnp
In [3]: x = jnp.ones(1000000000)
In [4]: !nvidia-smi
Wed Jan 12 16:08:32 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.42.01 Driver Version: 470.42.01 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Quadro RTX 4000 On | 00000000:03:00.0 On | N/A |
| 30% 41C P0 38W / 125W | 7245MiB / 7979MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 Quadro RTX 4000 On | 00000000:A6:00.0 Off | N/A |
| 30% 35C P0 35W / 125W | 101MiB / 7982MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1643 G /usr/lib/xorg/Xorg 412MiB |
| 0 N/A N/A 2940 G /usr/bin/gnome-shell 75MiB |
| 0 N/A N/A 47102 G ...AAAAAAAAA= --shared-files 35MiB |
| 0 N/A N/A 172424 G ...AAAAAAAAA= --shared-files 11MiB |
| 0 N/A N/A 812125 C /usr/local/bin/python 6705MiB |
| 1 N/A N/A 1643 G /usr/lib/xorg/Xorg 4MiB |
| 1 N/A N/A 812125 C /usr/local/bin/python 93MiB |
+-----------------------------------------------------------------------------+
在这个案例中我们只是在显存中分配了一块空间用于存储一个向量,但是Jax在初始化之后,自动占据了本地的2张GPU卡。根据Jax官方提供的方法,我们可以使用如下的操作配置环境变量,使得Jax只能看到其中的1张卡,这样就不会扩张:
In [1]: import os
In [2]: os.environ["CUDA_VISIBLE_DEVICES"] = "1"
In [3]: from jax import numpy as jnp
In [4]: x = jnp.ones(1000000000)
In [5]: !nvidia-smi
Wed Jan 12 16:10:36 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.42.01 Driver Version: 470.42.01 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Quadro RTX 4000 On | 00000000:03:00.0 On | N/A |
| 30% 40C P8 19W / 125W | 537MiB / 7979MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 Quadro RTX 4000 On | 00000000:A6:00.0 Off | N/A |
| 30% 35C P0 35W / 125W | 7195MiB / 7982MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1643 G /usr/lib/xorg/Xorg 412MiB |
| 0 N/A N/A 2940 G /usr/bin/gnome-shell 75MiB |
| 0 N/A N/A 47102 G ...AAAAAAAAA= --shared-files 35MiB |
| 0 N/A N/A 172424 G ...AAAAAAAAA= --shared-files 11MiB |
| 1 N/A N/A 1643 G /usr/lib/xorg/Xorg 4MiB |
| 1 N/A N/A 813030 C /usr/local/bin/python 7187MiB |
+-----------------------------------------------------------------------------+
可以看到结果中已经是只使用了1张GPU卡,达到了我们的目的,但是这种通过配置环境变量来实现的功能还是着实不够pythonic,因此py3nvml中也提供了这样的功能,可以指定某一系列的GPU卡用于执行任务:
In [1]: import py3nvml
In [2]: from jax import numpy as jnp
In [3]: py3nvml.grab_gpus(num_gpus=1,gpu_select=[1])
Out[3]: 1
In [4]: x = jnp.ones(1000000000)
In [5]: !nvidia-smi
Wed Jan 12 16:12:37 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.42.01 Driver Version: 470.42.01 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Quadro RTX 4000 On | 00000000:03:00.0 On | N/A |
| 30% 40C P8 20W / 125W | 537MiB / 7979MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 Quadro RTX 4000 On | 00000000:A6:00.0 Off | N/A |
| 30% 36C P0 35W / 125W | 7195MiB / 7982MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1643 G /usr/lib/xorg/Xorg 412MiB |
| 0 N/A N/A 2940 G /usr/bin/gnome-shell 75MiB |
| 0 N/A N/A 47102 G ...AAAAAAAAA= --shared-files 35MiB |
| 0 N/A N/A 172424 G ...AAAAAAAAA= --shared-files 11MiB |
| 1 N/A N/A 1643 G /usr/lib/xorg/Xorg 4MiB |
| 1 N/A N/A 814673 C /usr/local/bin/python 7187MiB |
+-----------------------------------------------------------------------------+
可以看到结果中也是只使用了1张GPU卡,达到了跟上一步的操作一样的效果。
查看空闲GPU
对于环境中可用的GPU,py3nvml的判断标准就是在这个GPU上已经没有任何的进程,那么这个就是一张可用的GPU卡:
In [1]: import py3nvml
In [2]: free_gpus = py3nvml.get_free_gpus()
In [3]: free_gpus
Out[3]: [True, True]
当然这里需要说明的是,系统应用在这里不会被识别,应该是会判断守护进程。
命令行信息获取
跟nvidia-smi非常类似的,py3nvml也可以在命令行中通过调用py3smi来使用。值得一提的是,如果需要用nvidia-smi来实时的监测GPU的使用信息,往往是需要配合watch -n来使用的,但是如果是py3smi则不需要,直接用py3smi -l就可以实现类似的功能。
$ py3smi -l 5
Wed Jan 12 16:17:37 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI Driver Version: 470.42.01 |
+---------------------------------+---------------------+---------------------+
| GPU Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
+=================================+=====================+=====================+
| 0 30% 39C 8 19W / 125W | 537MiB / 7979MiB | 0% Default |
| 1 30% 33C 8 7W / 125W | 6MiB / 7982MiB | 0% Default |
+---------------------------------+---------------------+---------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU Owner PID Uptime Process Name Usage |
+=============================================================================+
+-----------------------------------------------------------------------------+
可以看到略有区别的是,这里并不像nvidia-smi列出来的进程那么多,应该是自动忽略了系统进程。
单独查看驱动版本和显卡型号
在py3nvml中把查看驱动和型号的功能单独列了出来:
In [1]: from py3nvml.py3nvml import *
In [2]: nvmlInit()
Out[2]: <CDLL 'libnvidia-ml.so.1', handle 560ad4d07a60 at 0x7fd13aa52340>
In [3]: print("Driver Version: {}".format(nvmlSystemGetDriverVersion()))
Driver Version: 470.42.01
In [4]: deviceCount = nvmlDeviceGetCount()
...: for i in range(deviceCount):
...: handle = nvmlDeviceGetHandleByIndex(i)
...: print("Device {}: {}".format(i, nvmlDeviceGetName(handle)))
...:
Device 0: Quadro RTX 4000
Device 1: Quadro RTX 4000
In [5]: nvmlShutdown()
这样也不需要我们自己再去逐个的筛选,从灵活性和可扩展性上来说还是比较方便的。
单独查看显存信息
这里同样的也是把显存的使用信息单独列了出来,不需要用户再去单独筛选这个信息,相对而言比较细致:
In [1]: from py3nvml.py3nvml import *
In [2]: nvmlInit()
Out[2]: <CDLL 'libnvidia-ml.so.1', handle 55ae42aadd90 at 0x7f39c700e040>
In [3]: handle = nvmlDeviceGetHandleByIndex(0)
In [4]: info = nvmlDeviceGetMemoryInfo(handle)
In [5]: print("Total memory: {}MiB".format(info.total >> 20))
Total memory: 7979MiB
In [6]: print("Free memory: {}MiB".format(info.free >> 20))
Free memory: 7441MiB
In [7]: print("Used memory: {}MiB".format(info.used >> 20))
Used memory: 537MiB
如果把这些代码插入到程序中,就可以获悉每一步所占用的显存的变化。
总结概要
在深度学习或者其他类型的GPU运算过程中,对于GPU信息的监测也是一个非常常用的功能。如果仅仅是使用系统级的GPU监测工具,就没办法非常细致的去跟踪每一步的显存和使用率的变化。如果是用profiler,又显得过于细致,而且环境配置、信息输出和筛选并不是很方便。此时就可以考虑使用py3nvml这样的工具,针对于GPU任务执行的过程进行细化的分析,有助于提升GPU的利用率和程序执行的性能。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/py3nvml.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958
参考链接
py3nvml实现GPU相关信息读取的更多相关文章
- CentOS查看显卡及GPU相关信息
lspci | grep -i vga 这样就可以显示机器上的显卡信息,比如 [root@localhost conf]# lspci | grep -i vga01:00.0 VGA compat ...
- Android根据文件路径使用File类获取文件相关信息
Android通过文件路径如何得到文件相关信息,如 文件名称,文件大小,创建时间,文件的相对路径,文件的绝对路径等: 如图: 代码: public class MainActivity extends ...
- node-webkit教程(13)gpu支持信息查看
node-webkit教程(13)gpu支持信息查看 文/玄魂 目录 node-webkit教程(13)gpu支持信息查看 前言 13.1操作步骤 (一)打开node-webkit,输入chrome: ...
- 『Python』 爬取 WooYun 论坛所有漏洞条目的相关信息
每个漏洞条目包含: 乌云ID,漏洞标题,漏洞所属厂商,白帽子,漏洞类型,厂商或平台给的Rank值 主要是做数据分析使用:可以分析某厂商的各类型漏洞的统计:或者对白帽子的能力进行分析..... 数据更新 ...
- 【爬虫问题】爬取tv.sohu.com的页面, 提取视频相关信息
尝试解决下面的问题 问题: 爬取tv.sohu.com的页面, 提取视频相关信息,不可用爬虫框架完成 何为视频i关信息?属性有哪些? 需求: 做到最大可能的页面覆盖率 *使用httpClient 模拟 ...
- stat(),lstat(),fstat() 获取文件/目录的相关信息
stat 的使用 Linux有个命令,ls -l,效果如下: 这个命令能显示文件的类型.操作权限.硬链接数量.属主.所属组.大小.修改时间.文件名.它是怎么获得这些信息的呢,请看下面的讲解. stat ...
- 总结描述用户和组管理类命令的使用方法,系统用户相关信息,取出主机IP地址
1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. [root@db146 ~]# who|cut -f1 -d' ' |sort -u root 2.取出最后 ...
- 编程实战——电影管理器之利用MediaInfo获取高清视频文件的相关信息
随着高速(20M)宽带.HTPC.大容量硬盘(3T)的普及,下载高清片并利用大屏幕观看也成为普通的事情. 随着下载影片的增多,管理就有了问题,有时在茫茫文件夹下找寻一个影片也是一件费时费力的事. 于是 ...
- android--------根据文件路径使用File类获取文件相关信息
Android通过文件路径如何得到文件相关信息,如 文件名称,文件大小,创建时间,文件的相对路径,文件的绝对路径等. 如图: public class MainActivity extends Act ...
随机推荐
- 新建日历(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 默认的标准日历设置好了以后,问题又来了:出现某些特殊的原因,可能还需要一个与标准日历设置不同的日历,这个可怎么弄? 没关系 ...
- LuoguP7008 [CERC2013]What does the fox say? 题解
Content 森林里面有很多声响,你想知道有哪些声响是由狐狸发出来的. 已知你搜集到了 \(n\) 个声响,并且还知道某些其他动物能够发出的声响,已知如果没有哪一个声响是由其他任何一种动物发出来的话 ...
- IIS部署,发布网站
一.IIS部署 1.打开控制面板,选择 '程序' 2.程序和功能下,选择打开或关闭Windows功能 3.等待加载,选择Internet信息服务,勾选如下选项 在弹出的"windows功能& ...
- Java面向对象~类和对象&方法,类方法
面向对象 概念: 1.同一类事物的抽象描述,不是具体的 2.类和对象的关系: 类 是抽象的. 对象 是具体的. 3.对象的体征,称为"属性&q ...
- Mysql 表名忽略大小写-连接字符集随笔记录
1.参数说明: lower_case_table_names=0 表名存储为给定的大小和比较是区分大小写的 lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候 ...
- SpringBoot中Post请求提交富文本数据量过大参数无法获取的问题
yml增加配置 # 开发环境配置 server: tomcat: max-http-form-post-size: -1
- RPA项目POC指南:概念、步骤与技巧
"为什么部署RPA前要进行POC?RPA不是开箱即用吗?" 其实,RPA的实施并非总是一帆风顺,"碰坑"在所难免. 据安永报告显示,30%至50%的初始RPA项 ...
- Qt5绘制仪表盘dashboard
说明 本文演示Qt版本: Qt5.14. 本文将使用QPainter一步一步绘制仪表盘:刻度.指针.刻度值 注意: 绘制顺序,如果先绘制,则后来绘制的将会覆盖住先前绘制的. 如果需要绘制半透明, 请设 ...
- 【LeetCode】604. Design Compressed String Iterator 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 维护当前字符和次数 日期 题目地址:https://l ...
- 【LeetCode】453. Minimum Moves to Equal Array Elements 解题报告(Java & Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:模拟过程 方法二:求和-n*最小值 方法三: ...