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 humanfriendly

nvmlInit()  #初始化

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 humanfriendly

nvmlInit()

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肯定是开着的。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tmux 使用小记

本文参考自 阮一峰老师Tmux 使用教程[1] Tmux,不仅仅是分屏那么简单。。。 与tmux类似的工具是screen 会话管理 将窗口与会话"解绑" 对于没有图形界面只有shell的场景(如服务器)&#xff0c;尤其有用..这是其最核心解决的问题(窗口管理啥的只能算锦上添花的辅助功能)…

想要成为机器学习领域的高手吗?这里有五本必读免费书,订阅周报发链接 (下)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

腾讯云com域名注册1元一年,非常可以!

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

2024年数学建模美赛能用chatGPT之类的AI吗?官方给了明确规定!

这两年chatGPT等大语言模型火了&#xff0c;能对话&#xff0c;自然也能回答数学建模方面的问题。 那美赛能不能用这些AI呢&#xff1f;2024年美赛官方对chatGPT等的使用做出了明确的规定&#xff08;其中的VI. Contest Instructions部分&#xff09;&#xff1a; https://ww…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票创建页面实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

程序猿的时间管理和生产力

文章目录 为什么时间管理很重要&#xff1f;如何管理时间&#xff1f;心理维度生理维度技术尺寸 时间管理技巧每周计划基于目标的规划番茄钟为什么是25分钟&#xff1f;番茄钟为什么有效&#xff1f;艾森豪威尔矩阵这一切都是从开发者的角度来看的 也许我从开始学习或从事软件开…

企鹅目标检测数据集VOC格式400张

企鹅&#xff0c;一种可爱而独特的鸟类&#xff0c;以其圆滚滚的身体、黑白相间的羽毛和独特的行走方式而备受人们喜爱。 企鹅是鸟纲、企鹅科的动物&#xff0c;它们生活在南半球&#xff0c;特别是南极地区。企鹅的体型短而肥胖&#xff0c;有着流线型的身体和黑白相间的羽毛…

支持API文档生成,API管理工具:Apipost

随着数字化转型的加速&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为企业间沟通和数据交换的关键。而在API开发和管理过程中&#xff0c;API文档、调试、Mock和测试的协作显得尤为重要。Apipost正是这样一款一体化协作平台&#xff0c;旨在解决这些问题&#xf…

条款19:设计class犹如设计type

设计class时&#xff0c;都要面对如下问题&#xff0c;答案通常会导致你的设计规范&#xff1a; 如何创建和销毁新类型的对象&#xff1f;这将影响 类的构造函数和析构函数的设计 内存分配和释放函数的设计 (operator new, operator new[], operator delete, operator delete[…

CSS基础选择器

1.CSS选择器&#xff08;重点&#xff09; 理解 能说出选择器的作用 id选择器和类选择器的区别 应用 能够使用基础选择器给页面元素添加样式 如图所以&#xff0c;要把里面的小黄人分为2组&#xff0c;最快的方法怎办&#xff1f; 1.1 选择器的作用 找到特定的HTML页面元…

金蝶EAS pdfviewlocal.jsp接口存在任意文件读取漏洞 附POC软件

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 金蝶EAS简介 微信公众号搜索:南风漏洞复现文库 该…

分布式「走进分布式一致性协议」从2PC、3PC、Paxos 到 ZAB

设计一个分布式系统必定会遇到一个问题—— 因为分区容忍性&#xff08;partition tolerance&#xff09;的存在&#xff0c;就必定要求我们需要在系统可用性&#xff08;availability&#xff09;和数据一致性&#xff08;consistency&#xff09;中做出权衡 。这就是著名的 C…

跨平台的传输协议@WebDav协议@windows系统配置WedDav服务器@局域网内的WebDav传输系统

文章目录 WebDav协议基本信息启用必要的windows功能启动站点管理器IIS站点根目录访问权限设置站点的功能设置端口通行防火墙IMME文件类型(文件后缀)其他设备登录和访问本机的WebDav服务站点 小结优点缺点 refs WebDav 协议基本信息 来自wikipedia:基于Web的分布式编写和版本控…

【Linux】Linux系统编程——Linux命令解析器

【Linux】Linux系统编程——Linux命令解析器 什么是Linux 命令解析器&#xff1f; Linux 命令解析器&#xff0c;通常被称为 shell&#xff0c;是 Linux 操作系统中的一个关键组件。它充当用户和系统内核之间的接口&#xff0c;允许用户通过输入命令来控制和管理操作系统和应…

洗地机什么牌子好?目前口碑最好的洗地机

如今&#xff0c;人们的生活中&#xff0c;洗地机已经成为了越来越受欢迎的清洁工具&#xff0c;洗地机能迅速而有效地清理地板、地毯以及其他硬表面&#xff0c;为用户提供更加方便快捷的洗地机体验。那么&#xff0c;洗地机什么牌子好?我们一起来看看目前口碑最好的洗地机有…

【亲测】申请腾讯云免费服务器流程,2024新版教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云百科txybk.com分享2024年最新腾讯云免费服务器…

(2022|CVPR,非自回归,掩蔽图像生成,迭代译码)MaskGIT:掩蔽生成式图像 Transformer

MaskGIT: Masked Generative Image Transformer 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 训练中的掩蔽视觉标记建模&#xff08;Masked Visual Token Mod…

Java课程设计个人博客

目录 引言&#xff1a;在此说明在本次课设过程中所遇到的困难&#xff01; 一、项目搭建的问题 Q1:Web项目应用啥么编译器编写&#xff1f; Q2:如何创建Web项目(MAVEN)&#xff1f; Q3:Tomcat服务器开头控制台显示乱码如何解决&#xff1f; Q4:Tomcat服务器怎么设置项目的…

代码随想录算法训练营第三十天|总结、332.重新安排行程、51.N皇后、37.解数独

代码随想录 (programmercarl.com) 总结 332.重新安排行程 欧拉通路和欧拉回路&#xff1a; 欧拉通路&#xff1a;对于图G来说&#xff0c;如果存在一条通路包含G的所有边&#xff0c;则该通路称为欧拉通路&#xff0c;也称欧拉路径。欧拉回路&#xff1a;如果欧拉路径是一条…