Source code for delu.hardware

"""Tools related to devices, memory, etc."""

from typing import Any, Dict

from ._utils import deprecated
from .cuda import free_memory as free_memory_original

try:
    import pynvml
except ImportError:
    pynvml = None
if pynvml is not None:
    from pynvml import NVMLError_LibraryNotFound


def _to_str(x):
    if isinstance(x, str):
        return x
    elif isinstance(x, bytes):
        return str(x, 'utf-8')
    else:
        raise ValueError('Internal error')


[docs]@deprecated('Instead, use `delu.cuda.free_memory`.') def free_memory(*args, **kwargs) -> None: """ <DEPRECATION MESSAGE> """ return free_memory_original(*args, **kwargs)
[docs]@deprecated('Instead, use functions from `torch.cuda`') def get_gpus_info() -> Dict[str, Any]: """Get information about GPU devices: driver version, memory, utilization etc. <DEPRECATION MESSAGE> The example below shows what kind of information is returned as the result. All figures about memory are given in bytes. Returns: Information about GPU devices. Warning: The 'devices' value contains information about *all* gpus regardless of the value of ``CUDA_VISIBLE_DEVICES``. Examples: .. code-block:: print(delu.hardware.get_gpu_info()) Output example (formatted for convenience): .. code-block:: none { 'driver': '440.33.01', 'devices': [ { 'name': 'GeForce RTX 2080 Ti', 'memory_total': 11554717696, 'memory_free': 11554652160, 'memory_used': 65536, 'utilization': 0, }, { 'name': 'GeForce RTX 2080 Ti', 'memory_total': 11552096256, 'memory_free': 11552030720, 'memory_used': 65536, 'utilization': 0, }, ], } """ if pynvml is None: raise RuntimeError( 'To use this function, install pynvml via `pip install pynvml<12.0`' ) try: pynvml.nvmlInit() except NVMLError_LibraryNotFound as err: raise RuntimeError( 'Failed to get information about GPU memory. ' 'Make sure that you actually have GPU and all relevant software installed.' ) from err n_devices = pynvml.nvmlDeviceGetCount() devices = [] for device_id in range(n_devices): handle = pynvml.nvmlDeviceGetHandleByIndex(device_id) memory_info = pynvml.nvmlDeviceGetMemoryInfo(handle) devices.append( { 'name': _to_str(pynvml.nvmlDeviceGetName(handle)), 'memory_total': memory_info.total, 'memory_free': memory_info.free, 'memory_used': memory_info.used, 'utilization': pynvml.nvmlDeviceGetUtilizationRates(handle).gpu, } ) return { 'driver': _to_str(pynvml.nvmlSystemGetDriverVersion()), 'devices': devices, }