mltop 0.1.0

Resource monitor for ML engineers written in Rust
use nvml_wrapper::{error::NvmlError, Nvml};

use nvml_wrapper::enum_wrappers::device::TemperatureSensor;

#[derive(Clone)]
pub struct Gpu {
    pub name: String,
    pub temperature: u32,

    pub max_memory: u64,
    pub used_memory: Vec<u64>,

    pub utilization: Vec<u32>,

    pub max_power: u32,
    pub power_usage: u32,

    pub fan_speed: u32,
}

impl Gpu {
    pub fn new(nvml: &Option<Nvml>) -> Result<Gpu, NvmlError> {
        let nvml = match nvml.as_ref() {
            Some(b) => Ok(b),
            None => Err(NvmlError::LibraryNotFound),
        };

        let device = nvml?.device_by_index(0)?;
        let memory_info = device.memory_info()?;

        Ok(Gpu {
            name: device.name()?,
            temperature: device.temperature(TemperatureSensor::Gpu)?,
            max_memory: memory_info.total,
            used_memory: vec![memory_info.used],
            utilization: vec![device.utilization_rates()?.gpu],
            max_power: device.power_management_limit()?,
            power_usage: device.power_usage()?,
            fan_speed: device.fan_speed(0)?,
        })
    }

    pub fn update(&mut self, nvml: &Option<Nvml>) -> Result<(), NvmlError> {
        let nvml = match nvml.as_ref() {
            Some(b) => Ok(b),
            None => Err(NvmlError::LibraryNotFound),
        };

        let device = nvml?.device_by_index(0)?;

        let memory_info = device.memory_info()?;
        self.temperature = device.temperature(TemperatureSensor::Gpu)?;
        self.used_memory.push(memory_info.used);
        self.utilization.push(device.utilization_rates()?.gpu);

        self.power_usage = device.power_usage()?;
        Ok(())
    }
}