java獲取nvidia顯卡信息的實(shí)現(xiàn)示例
前言
AI開發(fā)通常使用到GPU,但通常使用的是python、c++等語言,java用的則非常少。這也導(dǎo)致了java在gpu相關(guān)的庫比較少?,F(xiàn)在的需求是要獲取nvidia顯卡的使用情況,如剩余顯存。這里給出兩種較簡單的解決方案。
基于nivdia-smi工具
顯卡是硬件,當(dāng)然需要操作系統(tǒng)支持相關(guān)的驅(qū)動程序。首先要確保的正確安裝了nvidia的相關(guān)驅(qū)動程序。輸入命令nvidis-smi
后有類似下面的輸出,即證明當(dāng)前機(jī)器已安裝好了驅(qū)動程序。我們這個方案也是基于nvidia-smi
這個命令來做的。
我們可以看到上圖的輸出,表面了當(dāng)前的驅(qū)動版本、CUDA版本、顯卡數(shù)量、顯存、顯卡利用率,當(dāng)前使用進(jìn)程等信息。但是明顯是給人來看的,我們想放到程序中則需要進(jìn)行解析。好在該工具提供了xml格式輸出:
于是有了思路:
- 通過進(jìn)程調(diào)用
nvidia-smi
,并獲取xml輸出結(jié)果 - 解析xml格式,獲取需要的內(nèi)容
- 將需要的內(nèi)容轉(zhuǎn)為java bean以供使用
具體的xml格式使用"nvidia-smi -q -x"
一看便知,我在這里也就不贅述如何解析了。這里給出一個簡單的庫,目前只包含了顯存信息的解析,其余內(nèi)容沒有實(shí)現(xiàn):https://gitee.com/angelhand/vel-koz
基于nvml綁定庫
上面提到的nvidia-smi
工具實(shí)際上是英偉達(dá)基于工具nvml實(shí)現(xiàn)的,這里有對該工具的一些介紹:https://developer.nvidia.com/nvidia-management-library-nvml。
該工具是一個c編寫的管理工具,上面文檔有介紹具體的API。工具可以通過GPU Deployment Kit一并安裝,GPU Deployment Kit又是CUDA Toolkit的一部分。不過CUDA8.0之后,GPU Deployment Kit不再單獨(dú)提供,而是合并到了CUDA Toolkit里了。什么意思呢,就是CUDA8.0之后,要使用nvml,只需要安裝CUDA Toolkit:https://developer.nvidia.com/cuda-downloads。使用這個方案是一定要安裝的哦。不過Windows11環(huán)境下,使用系統(tǒng)更新自動安裝好的驅(qū)動就可以了,不需要額外下載(40系顯卡31版本驅(qū)動,舊版本不保證)。
環(huán)境安裝好之后使用https://github.com/henkelmax/nvmlj這個綁定庫。這里有同學(xué)要問綁定庫是什么意思,簡單解釋一下。前面提到的nvml工具是c寫的,提供了一個nvml.h
的頭文件,其他語言要使用就需要對這些功能做一個映射(綁定)。這個頭文件就類似于java中的接口。java對c的映射可以使用JNI技術(shù),另外還有比較簡單的JNA。我們這個庫就是基于JNA實(shí)現(xiàn)的。下面來展示如何使用。
首先修改一下源:
<repository> <id>henkelmax.public</id> <url>https://maven.maxhenkel.de/repository/public</url> </repository>
然后使用進(jìn)行依賴引入:
<dependency> <groupId>de.bommel24.nvmlj</groupId> <artifactId>nvmlj</artifactId> <version>1.0.2</version> </dependency>
使用起來也很簡單:
public class Main { public static void main(String[] args) throws NVMLJException { // The path to the nvml library (Defaults to C:/Program Files/NVIDIA Corporation/NVSMI/nvml.dll) // windows系統(tǒng)需要這樣設(shè)置 System.setProperty("nvml.path", "C:\\Windows\\System32\\nvml.dll"); // 這是我的wsl找到的,實(shí)體機(jī)可以whereis一下 System.setProperty("nvml.path", "/usr/lib/wsl/lib/libnvidia-ml.so.1"); NVMLJ.nvmlInit(); System.out.println(NVMLJ.nvmlDeviceGetCount()); // 不要忘記關(guān)閉資源 NVMLJ.nvmlShutdown(); } }
這里有個點(diǎn)需要注意一下,就是代碼里那行System.setProperty()
。set的內(nèi)容實(shí)際上就是nvml的動態(tài)鏈接庫。Windows較新版本的目錄就是上面提到的目錄,可以找一下是否存在。Linux下,我使用的是wsl ubuntu22.04系統(tǒng),在上面那個目錄里。如果你使用的是其他版本的系統(tǒng),可以whereis libnvidia-mi.so.1
來查找一下庫的具體位置。你可能會查出來多個位置,或者沒有。那么再查一下libnvidia-ml.so
(后面沒有.1
)。具體哪個管用試試就知道了,不過通常是會出現(xiàn)再usr
的lib
/lib32
/lib64
的子目錄或者子子(子…)目錄下了。
到此這篇關(guān)于java獲取nvidia顯卡信息的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)java獲取nvidia顯卡信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?Runnable和Thread實(shí)現(xiàn)多線程哪個更好你知道嗎
這篇文章主要為大家詳細(xì)介紹了Java?Runnable和Thread實(shí)現(xiàn)多線程哪個更好,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>2022-03-03Spring Security 強(qiáng)制退出指定用戶的方法
本篇文章主要介紹了Spring Security 強(qiáng)制退出指定用戶的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03