NVIDIA深入理解之pynvml库

一、前言

写在前面

该文章是对我之前文章《Fedora上安装NVIDIA闭源显卡驱动》的一个拓展,正好寒假闲的没事干不如加深一下对NVIDIA的了解。Python是当前非常流行的一门编程语言,它以kiss为设计思想,能封装就能封装,给用户提供比较良好且便于理解的编程体验,那么我们尽量要了解的这个库叫做pynvml,它是Python的一个第三方库,提供了对NVIDIA的管理库(NVML)的接口,使得开发者在正确安装NVIDIA闭源驱动(无论是run包还是包管理器封装的驱动)后,都可以使用该库与NVIDIA GPU进行交互,以获取GPU当前的一些状态信息和参数。为了简便称呼,我以下提及的“GPU”专门指的是NVIDIA显卡,本文章默认你已经安装好了闭源驱动,如果没有正确安装,可以去我之前的文章看一看。

在Windows操作系统中,我们去查看GPU信息是一件非常简单且合理的事情,实际上只要打开Windows任务管理器,里面就已经有GPU的各种信息,有一个图形界面就是好。但是在Linux中,查看GPU信息真是一件貌似不太容易的事情,实际上也是非常容易的,你看完我的文章就会清楚了。

实际上我们并不一定要通过pynvml这个库去了解GPU状态信息,实际上等你安装好闭源驱动之后,它本身就提供了一个脚本去查看一些信息,比如nvidia-smi。这个我们在之前的文章里就已经演示过了,这里不再赘述(你在terminal直接敲这个命令就好了)。这里我再推荐若干好用的工具帮你查看GPU信息。

当你学习并了解了NVIDIA显卡驱动的API使用,你也许会好奇AMD显卡和Intel显卡驱动是否也提供若干API以供用户参考和使用,很抱歉我没有搭载AMD显卡的设备,不能实操说明,不过你可以搜索rocm-smi这个工具,并且py3nvml库虽然是主要为NVIDIA显卡设计的,但是它也貌似支持AMD显卡的基本信息显示,你可以试一试,然后告诉我。

工具介绍

1、Linux风格的工具  --  nvtop

        大家知道在Linux中查看进程/内存占用等信息的工具叫top,那么nvtop就是专门用来查看GPU显卡信息的工具,是非常*iux的工具。

sudo dnf install nvtop

效果如图所示,大家在使用Linux时一定要使用这种terminal风格的信息显示,特别是服务器管理的时候很少是安装了图形界面的,因此命令行才是最高效的查看和管理服务器的方法。

2、Windows风格的工具 -- Mission Center

Mission Center | Flathub

这是flathub上一个非常有名的模仿Windows风格任务管理器的资源查看器。

只有在安装NVIDIA闭源驱动之后GPU0那一项才会显示,否则是没有那一项的,请大家注意。

3、KDE桌面自带了资源显示功能 

上图中左下角黑框框里面的就是GPU信息,可以放在桌面上实时查看,是不是非常炫酷呢?

二、正文

简单介绍pynvml的含义

好了,以上都是前言部分,下面我们开始正式介绍pynvml库(是不是都快忘记主题了)。

首先我们必须清楚pynvml为什么叫这个名字,我一开始了解的时候也感觉很困惑,这个名字太奇怪了,老是敲错这个nvml.NVML是NVIDIA Manager Lib的简写,它是由NVIDIA官方使用c语言编写的、用于管理和控制NVIDIA硬件的一组程序。NVML提供一组API,开发者可以通过API来查询和控制NVIDIA显卡的状态和配置,比如电源管理、温度控制、性能监控等。NVML和CUDA都是NVIDIA提供的工具,它们通常被显卡开发者同时使用以发挥GPU的最大性能。

NVIDIA Management Library (NVML) | NVIDIA Developer

NVML的官方解释在这里

虽然NVIDIA驱动是闭源的,但是这个驱动对外提供的接口是开放的,NVIDIA官网也有给出详细的函数说明,不过我们使用c/c++去查看显卡信息确实是小题大做了,没有这个必要,这是GPU驱动开发人员应该做的事情。那么对于非NVIDIA驱动开发人员来说,不需要深入挖掘NVIDIA的功能。pynvml这个命名也是一个经典组合,它意味着该库是NVML的Python绑定,除此之外还有PYQT、pygtk等库也是这个命名。

pynvml编程实践

1、安装pynvml

pip install pynvml

Linux环境中如果没有pip,需要先安装pip。

我这里需要说明一下pynvml是比较早期的一个库了,它是兼容Python2和Python3的,我们目前都是使用Python3居多,因此有一个名叫py3nvml的新库只支持Python3,大家也可以使用这个库。

pip install py3nvml

pynvml库开源项目

py3nvml库开源项目

有感兴趣开发可以关注这两个开源项目,可以提交pr给开源做贡献。

2、编程思路

使用pynvml库的基本思路如下:

注意这里说的是基本思路,如果您是驱动开发者,可以不遵守基本思路。

①导包

Python库使用前必须import,导包使用固定格式就好

②初始化

第二步和第五步是成双成对的,由于pynvml会调用显卡驱动程序,因此pynvml在使用前要建立和NVIDIA驱动的连接,在连接的时候是要占用一些系统资源的(比如内存缓冲区、CPU时间),然后使用完了之后需要释放这些资源,因此我们要遵守开发规范。

③获取设备句柄(Handle)

有很多计算机设备是不止一个GPU的,比如一台计算机有两个GPU(核显与独显),甚至多个GPU组成阵列也是非常正常的,因此你得告诉pynvml你要观察的是哪一块GPU,不能张冠李戴啊。

④调用函数

当你获取到Handle之后,也就是告诉pynvml你要观察的GPU号,然后就可以获取信息了,那么获取信息要调用库函数。

⑤释放NVML

有申请就有释放。

那么以下是一个符合开发规范的简单的例子:

编程环境:

OS:Fedora Linux

IDE:vscode

解释器版本:Python3.12.1

from pynvml import * #导包
import humanfriendlynvmlInit()  #初始化handle = nvml.nvmlDeviceGetHandleByIndex(0) #获取句柄#获取GPU温度信息
temperature = nvmlDeviceGetTemperature(handle,NVML_TEMPERATURE_GPU)
print("GPU Temperature:",temperature)#获取GPU显存信息
memory_info = nvmlDeviceGetMemoryInfo(handle)
print("Tota memory",humanfriendly.format_size(memory_info.total))
print("Free memory",humanfriendly.format_size(memory_info.free))
print("Used memroy",humanfriendly.format_size(memory_info.used))nvmlShutdown()  #释放

除了pynvml库我们还使用了humanfriendly库,这个库也是需要安装的。

输出结果:

GPU Temperature: 41
Tota memory 6.44 GB
Free memory 5.32 GB
Used memroy 1.12 GB

当前GPU的温度是41摄氏度,显存是6.44GB,已经使用了1.12GB,还剩5.32GB。

我的代码中,直接使用了nvmlDeviceGetHandleByIndex(0)来获取句柄,这是因为我只有一块显卡,所以我知道它就是GPU0,计算机从0开始计数,如果你不知道你的GPU编号的话,可以遍历一遍所有GPU,以确定你要观察哪一块GPU.

from pynvml import *nvmlInit()GPU_count = nvmlDeviceGetCount()
print(GPU_count)for i in range(GPU_count):handle = nvmlDeviceGetHandleByIndex(i)name = nvmlDeviceGetName(handle=handle)print(name.encode('utf-8'))nvmlShutdown()

输出结果:

1
b'NVIDIA GeForce GTX 1660 Ti'

也就是我总共只有一块GPU,并且这块GPU的名字是GTX 1660Ti 。

我首先获取了我的GPU设备的数量,然后遍历这些GPU设备分别获取它们的句柄,再通过函数调用获得显卡名字,最后打印出来,思路应该比较清晰。

相信大家也看出来了,导包、初始化、获取句柄、释放,这几个操作几乎都是固定搭配,不用修改的,就是函数调用这一步需要学习,那么我们就重点讲函数调用。

我们分析一下这几个函数的名字特点:

其实它们虽然看起来名字长很复杂,其实拆分开来看是相当有规律的,是小驼峰命名法。

nvml + Device + Get + 你要获取什么信息

比如你要获取内存信息:nvmlDeviceGetMemoryInfo

 然后函数调用的时候必须携带句柄信息。

了解到这些原则之后编程就简单起来了。

我列出一下一些函数,以供大家参考:

nvmlDeviceGetCount()获取系统中的GPU设备数量
nvmlDeviceGetHandleByIndex(index)根据设备的索引号获取设备的句柄
nvmlDeviceGetName(handle)根据设备的句柄获取设备的名称
nvmlDeviceGetMemoryInfo(handle)根据设备的句柄获取设备的内存信息
nvmlDeviceGetTemperature(handle, sensorType)根据设备的句柄和传感器类型获取设备的温度
nvmlDeviceGetFanSpeed(handle)根据设备的句柄获取设备的风扇速度
nvmlDeviceGetPowerState(handle)根据设备的句柄获取设备的电源状态
nvmlDeviceGetUtilizationRates(handle)根据设备的句柄获取设备的使用率
nvmlDeviceGetPerformanceState(handle)根据设备的句柄获取设备的性能状态
nvmlDeviceGetPowerManagementMode(handle)根据设备的句柄获取设备的电源管理模式
nvmlDeviceGetPowerUsage(handle)根据设备的句柄获取设备的电源使用情况
nvmlDeviceGetPowerLimit(handle)根据设备的句柄获取设备的电源限制

这里要提醒一下,并不是所有设备都支持以上的函数,越新的设备会有更多的传感器,会支持更多的函数,旧设备也许因为一些问题,比如没有对应的传感器或缺少部分驱动导致一些函数调用失败,那么如果失败的话是会报错了,大家在编程的时候要注意报错的可能性。

Traceback (most recent call last):
  File "/home/april_zhao/文档/practice/Python/nvidia/test2.py", line 19, in <module>
    print(nvmlDeviceGetFanSpeed(handle))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/april_zhao/.local/lib/python3.12/site-packages/pynvml/nvml.py", line 2275, in nvmlDeviceGetFanSpeed
    _nvmlCheckReturn(ret)
  File "/home/april_zhao/.local/lib/python3.12/site-packages/pynvml/nvml.py", line 833, in _nvmlCheckReturn
    raise NVMLError(ret)
pynvml.nvml.NVMLError_NotSupported: Not Supported

比如我的这张1660Ti显卡就不支持获取显卡风扇转速,也许是因为笔记本显卡的原因,硬件上可能没有单独的GPU风扇,散热归主板管了,显卡驱动没有能力查看其他硬件的风扇情况。因此这里是直接报错的,"Not Supported",表明不支持该函数,可以使用try语句去解决这个问题。

 除了打印GPU整体信息外,我们还可以打印占用GPU的进程的信息。

from pynvml import *
import humanfriendlynvmlInit()handle = nvmlDeviceGetHandleByIndex(0)processes = nvmlDeviceGetComputeRunningProcesses(handle=handle)
for process in processes:print("Process ID:",process.pid)print("Memory Used:",humanfriendly.format_size(process.usedGpuMemory))nvmlShutdown()

它可以去检查占用当前GPU的进程的信息。

输出:

Process ID: 3811
Memory Used: 232.57 MB

那么PID为3811是哪一个进程呢?

原来是我们的Chrome浏览器正在占用GPU,因为我现在正在写文章,所以Chrome肯定是开着的。

该文章需要更加深入的总结,请给我一点点时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux Shell】11. 输入/输出 重定向

文章目录 【 1. 重定向简介 】【 2. 输出重定向 】【 3. 输入重定向 】【 4. Here Document 】【 5. /dev/null 文件 】 【 1. 重定向简介 】 大多数 UNIX 系统命令从终端接受输入并将所产生的输出发送回​​到原来输入的终端。一个命令通常从标准输入的地方读取输入&#xff…

信号的互相关计算及时延估计

1. 信号的互相关计算 互相关反映向量x和移位&#xff08;滞后&#xff09;向量y之间的相似性。 最直观的解释是&#xff1a;互相关的作用是为了找到信号在哪一时刻与另一信号最像&#xff08;另一信号为本身时就是自相关&#xff09;&#xff01; 滑动求互相关&#xff08;图…

海康威视摄像头+服务器+录像机配置校园围墙安全侦测区域入侵侦测+越界侦测

一、适用场景 1、校园内&#xff0c;防止课外时间翻越围墙到校外、从校外翻越围墙到校内&#xff1b; 2、通过服务器摄像头的侦测功能及时抓图保存&#xff0c;为不安全因素提供数字化依据&#xff1b; 3、网络录像机保存监控视频&#xff0c;服务器保存抓拍到的入侵与越界&am…

【React】02-如何理解React通过对DOM的模拟,最大限度地减少与DOM的交互

如何理解React通过对DOM的模拟&#xff0c;最大限度地减少与DOM的交互 背景分析关于虚拟DOM 背景 在学习React的过程中&#xff0c;发现很多文档上关于React的高效都有这么一句话的描述——React通过对DOM的模拟&#xff0c;最大限度地减少与DOM的交互&#xff0c;对于我这种前…

mysql服务多实例运行

1、官网下载mysql安装包 https://downloads.mysql.com/archives/community/ 2、解压安装包 tar -zxvf mysql-8.1.0-linux-glibc2.28-aarch64.tar.xz -C /usr/localmv /usr/local/mysql-8.1.0-linux-glibc2.28-aarch64 /usr/local/mysql 3、创建mysql用户组 groupadd…

Java面试汇总——redis篇

1、什么是缓存穿透 ? 怎么解决 ? 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存就形同虚设&#xff08;只有数据库查到了&#xff0c;才会让redis缓存&#xff0c;但现在的问题是查不到&#xff09;&#xff0c;会频繁的去访问数据库。 解决…

这款Web剪藏工具绝了,支持10+平台内容剪辑同步!

前言 Web Clipper 是一个开源项目&#xff0c;旨在帮助用户轻松地保存和组织网页内容。它可以作为浏览器插件安装到常见的浏览器中&#xff0c;如Chrome、Firefox 等&#xff0c;用户可以使用它来保存网页、截取文章、添加标签和注释等操作&#xff0c;从而方便地管理和分享自…

任务调度中心

可以服务器配置和权限&#xff0c;分配任务执行。当服务器下线后&#xff0c;任务会被在线服务器接管&#xff0c;当重新上线后会在次执行任务。接管任务的服务器会释放任务。调度过程的实现&#xff0c;可以二次开发。基于 netty tcp 通信开发。 下载地址&#xff1a; http:/…

4.4 TILING FOR REDUCED MEMORY TRAFFIC

我们在CUDA中使用设备内存方面有一个内在的权衡&#xff1a;全局内存大但速度慢&#xff0c;而共享内存小但速度快。一个常见的策略是将数据划分为称为tile的子集&#xff0c;以便每个tile都适合共享内存。tile一词”借鉴了一个类比&#xff0c;即大墙&#xff08;即全局内存数…

VSCode搭建 .netcore 开发环境

一、MacOS 笔者笔记本电脑上安装的是macOS High Sierra(10.13)&#xff0c;想要尝试一下新版本的.netcore&#xff0c;之前系统是10.12时&#xff0c;.netcore 3.1刚出来时安装过3.1版本&#xff0c;很久没更新了&#xff0c;最近.net8出来了&#xff0c;想试一下&#xff0c;…

多模态推荐系统综述:四、模型优化

四、模型优化 由于多模态信息的存在&#xff0c;当多模态编码器和推荐模型一起训练时&#xff0c;模型训练的计算要求大大增加。因此&#xff0c;多模态推荐模型在训练过程中可以分为两类&#xff1a;端到端训练和两步训练。 端到端训练可以利用反向传播获得的每个梯度来更新模…

【算法设计与分析】网络流

目录 max-flow 和 min-cut流网络 Flow network最小割 Min-cut最大流 Max-flow Greedy algorithmFord–Fulkerson algorithm剩余网络 Residual networkFord–Fulkerson algorithm算法流程 最大流最小割理论 max-flow min-cut theorem容量扩展算法 capacity-scaling algorithm时间…

【读书笔记】《我的天才女友》

这套书一共有四本&#xff0c;这个是第一本&#xff0c;作者意大利人埃莱娜费兰特&#xff0c;这个只是她的笔名&#xff0c;至今还不知道这位作者是谁&#xff0c;她以每年一本书的速度出了“那不勒斯四部曲”&#xff0c;这四本书以两个女主人公莉拉和莱农的友情为主线。 莉拉…

ElasticSearch 集群搭建与状态监控cerebro

单机的elasticsearch做数据存储&#xff0c;必然面临两个问题:海量数据存储问题、单点故障问题。为了解决存储能力上上限问题就可以用到集群部署。 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard)&#xff0c;存储到多个节点单点故障问题:将分片数据在不同节点备份 (r…

力扣题:高精度运算-1.3

力扣题-1.3 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;43. 字符串相乘 解题思想&#xff1a;类似计算时采用的竖式乘法。首先取得num2的低位&#xff0c;并补齐对应的0&#xff0c;然后与num1进行相乘&#xff0c;然后进行字符串的相加操作。…

腾讯云com域名注册1元条件说明

腾讯云com域名注册优惠价格1元首年&#xff0c;条件是企业新用户&#xff0c;个人新用户注册com域名是33元首年&#xff0c;第二年续费价格85元一年。活动 txybk.com/go/domain-sales 活动打开如下图&#xff1a; 腾讯云com域名注册优惠价格 腾讯云com域名注册原价是85元一年&a…

数据结构—图(下)

文章目录 12.图(下)(4).生成树和最小生成树#1.什么是生成树和最小生成树&#xff1f;i.生成树ii.最小生成树 #2.Prim算法i.算法思想ii.看看例子iii.代码实现 #3.Kruskal算法i.算法思想ii.看看例子iii.代码实现 #4.次小生成树 (5).最短路径问题#1.加权有向图的最短路径问题#2.单…

【QML COOK】- 002-添加一个图片

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {anchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"} }将Window的width和height都改成800&#xff0c;因为我们要添加的图片大…

x-cmd pkg | you-get - web 媒体内容下载工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 You-Get 是一个开源的命令行小型下载工具&#xff0c;用于从各种网站下载视频、音频和其他媒体文件。 它可以解析和下载嵌套在网页中的媒体&#xff0c;能从 YouTube、优酷、Niconico 、bilibili 等热门网站下载视频、…

用RASP五步轻松保护云端无服务器架构

近年来无服务器架构发展势头正猛&#xff0c;预计未来十年将增长近25%。据称&#xff0c;2022年无服务器架构市场的规模超过了90亿美元&#xff0c;年复合增长率预计将增加。到2032年&#xff0c;市场规模可能超过900亿美元。 这表明&#xff0c;在组织日益采用DevOps的影响下&…