Files
2026-07-13 13:17:40 +08:00

123 lines
3.7 KiB
Python

import logging
import os
from functools import lru_cache
from importlib.util import find_spec
from typing import List, Optional, Tuple
from ray._private.accelerators.accelerator import AcceleratorManager
from ray._private.ray_constants import env_bool
logger = logging.getLogger(__name__)
HABANA_VISIBLE_DEVICES_ENV_VAR = "HABANA_VISIBLE_MODULES"
NOSET_HABANA_VISIBLE_MODULES_ENV_VAR = "RAY_EXPERIMENTAL_NOSET_HABANA_VISIBLE_MODULES"
@lru_cache()
def is_package_present(package_name: str) -> bool:
try:
return find_spec(package_name) is not None
except ModuleNotFoundError:
return False
HPU_PACKAGE_AVAILABLE = is_package_present("habana_frameworks")
class HPUAcceleratorManager(AcceleratorManager):
"""Intel Habana(HPU) accelerators."""
@staticmethod
def get_resource_name() -> str:
return "HPU"
@staticmethod
def get_visible_accelerator_ids_env_var() -> str:
return HABANA_VISIBLE_DEVICES_ENV_VAR
@staticmethod
def get_current_process_visible_accelerator_ids() -> Optional[List[str]]:
hpu_visible_devices = os.environ.get(
HPUAcceleratorManager.get_visible_accelerator_ids_env_var(), None
)
if hpu_visible_devices is None:
return None
if hpu_visible_devices == "":
return []
return list(hpu_visible_devices.split(","))
@staticmethod
def get_current_node_num_accelerators() -> int:
"""Attempt to detect the number of HPUs on this machine.
Returns:
The number of HPUs if any were detected, otherwise 0.
"""
if HPU_PACKAGE_AVAILABLE:
import habana_frameworks.torch.hpu as torch_hpu
if torch_hpu.is_available():
return torch_hpu.device_count()
else:
logging.info("HPU devices not available")
return 0
else:
return 0
@staticmethod
def is_initialized() -> bool:
"""Attempt to check if HPU backend is initialized.
Returns:
True if backend initialized else False.
"""
if HPU_PACKAGE_AVAILABLE:
import habana_frameworks.torch.hpu as torch_hpu
if torch_hpu.is_available() and torch_hpu.is_initialized():
return True
else:
return False
else:
return False
@staticmethod
def get_current_node_accelerator_type() -> Optional[str]:
"""Attempt to detect the HPU family type.
Returns:
The device name (GAUDI, GAUDI2) if detected else None.
"""
if HPUAcceleratorManager.is_initialized():
import habana_frameworks.torch.hpu as torch_hpu
return f"Intel-{torch_hpu.get_device_name()}"
else:
logging.info("HPU type cannot be detected")
return None
@staticmethod
def validate_resource_request_quantity(
quantity: float,
) -> Tuple[bool, Optional[str]]:
if isinstance(quantity, float) and not quantity.is_integer():
return (
False,
f"{HPUAcceleratorManager.get_resource_name()} resource quantity"
" must be whole numbers. "
f"The specified quantity {quantity} is invalid.",
)
else:
return (True, None)
@staticmethod
def set_current_process_visible_accelerator_ids(
visible_hpu_devices: List[str],
) -> None:
if env_bool(NOSET_HABANA_VISIBLE_MODULES_ENV_VAR, False):
return
os.environ[
HPUAcceleratorManager.get_visible_accelerator_ids_env_var()
] = ",".join([str(i) for i in visible_hpu_devices])