#gpu #monitoring #hardware #managment #nvidia

nvml-wrapper

一个安全且易于使用的 Rust 对 NVIDIA 管理库(NVML)的封装

每月 9 次重大发布

0.10.0 2024 年 2 月 10 日
0.9.0 2023 年 1 月 21 日
0.8.0 2022 年 5 月 27 日
0.7.0 2020 年 12 月 7 日
0.3.0 2017 年 7 月 20 日

#7硬件支持

Download history 7839/week @ 2024-05-01 6619/week @ 2024-05-08 5877/week @ 2024-05-15 6463/week @ 2024-05-22 7290/week @ 2024-05-29 6756/week @ 2024-06-05 7838/week @ 2024-06-12 7944/week @ 2024-06-19 7373/week @ 2024-06-26 6691/week @ 2024-07-03 6255/week @ 2024-07-10 7861/week @ 2024-07-17 6875/week @ 2024-07-24 8618/week @ 2024-07-31 17537/week @ 2024-08-07 14189/week @ 2024-08-14

48,916 每月下载量
用于 27 个crates(22 个直接使用)

MIT/Apache

760KB
14K SLoC

nvml-wrapper

Docs.rs docs Crates.io version Crates.io downloads CI dependency status

nvml-wrapper 是 NVIDIA 管理库(NVML)的一个安全且易于使用的 Rust 封装,NVML 是一个基于 C 的程序接口,用于监控和管理 NVIDIA GPU 中的各种状态。

use nvml_wrapper::Nvml;

let nvml = Nvml::init()?;
// Get the first `Device` (GPU) in the system
let device = nvml.device_by_index(0)?;

let brand = device.brand()?; // GeForce on my system
let fan_speed = device.fan_speed(0)?; // Currently 17% on my system
let power_limit = device.enforced_power_limit()?; // 275k milliwatts on my system
let encoder_util = device.encoder_utilization()?; // Currently 0 on my system; Not encoding anything
let memory_info = device.memory_info()?; // Currently 1.63/6.37 GB used on my system

// ... and there's a whole lot more you can do. Most everything in NVML is wrapped and ready to go

在您的系统上尝试 basic_usage 示例

NVML 旨在作为第三方应用程序的平台,也是 NVIDIA nvidia-smi 工具的底层库。

用法

nvml-wrapper 在 NVML 的生成绑定之上构建,这些绑定使用了 libloading crate。这意味着 NVML 库在调用 Nvml::init 时被加载,如果 NVML 不存在,则可以返回错误,使得在缺乏相关硬件的系统上运行时可以动态删除与 NVIDIA 相关的功能。

Nvml::init 成功执行意味着

  • NVML 库存在于系统上并且可以打开
  • 初始化 NVML 的函数符号已成功加载和调用
  • 已尝试加载所有其他 NVML 函数符号

从 NVML 库中调用 Nvml::init 调用期间无法加载的每个函数都将返回错误。

请注意,不建议重复调用 Nvml::init,因为构造函数每次被调用时都必须从库中加载函数符号。相反,调用一次 Nvml::init 并将结果 Nvml 实例存储到某处,以便在整个程序生命周期中访问(例如,在 once_cell 中)。

NVML 支持

本包装器正在针对 NVML 版本 11 进行开发,并目前支持该版本。根据 NVIDIA 的保证,NVML 的每个新版本都将向后兼容,因此,无论 NVML 版本如何升级,本包装器都应该能够继续正常运行,而不会出现任何问题。

旧版功能

在新版 NVML 的发布中,有时会出现 API 版本级别的升级。例如

nvmlDeviceGetComputeRunningProcesses
nvmlDeviceGetComputeRunningProcesses_v2
nvmlDeviceGetComputeRunningProcesses_v3

旧版函数通常可以与新版的 NVML 版本一起工作;然而,新版的函数版本不能与旧版的 NVML 安装兼容。

默认情况下,此包装器仅提供对新版函数版本的访问。如果您需要调用旧版函数的能力,请启用 legacy-functions 功能。

MSRV

当前最低支持的 Rust 版本是 1.60.0。我不会刻意避免升级这个版本。

Cargo 功能

可以通过切换 serde 功能来为每个 NVML 数据结构启用 #[derive(Serialize, Deserialize)]

许可

根据您的选择,可在 Apache License, Version 2.0MIT 许可证 下使用。
除非您明确说明,否则根据 Apache-2.0 许可证定义的,您提交的旨在包含在此软件包中的任何有意贡献,将根据上述许可进行双重许可,而不附加任何其他条款或条件。

依赖关系

~0.8–6MB
~29K SLoC