[rocprofiler-compute] Improve amdsmi interface (#2245)

* Improve amdsmi interface

* Fix issue where max mem clock was being set as max gfx clock

* Handle the case when all device handles might not be usable due to
  devices being hidden by ROCR and HIP environment variables

* Fix get gpu vram size to return str in KB

* Improve testing of amdsmi interface functions
This commit is contained in:
vedithal-amd
2025-12-12 09:02:37 -05:00
committed by GitHub
parent ca0f3a6b5a
commit 793732a04e
3 changed files with 116 additions and 86 deletions
@@ -76,111 +76,131 @@ def amdsmi_ctx() -> Iterator[None]:
# Ignore undefined name amdsmi since it's dynamically imported
def get_device_handle() -> "amdsmi.ProcessorHandle | None": # noqa: F821
"""Get the first AMD device handle."""
def get_device_handles() -> "list[amdsmi.ProcessorHandle]": # noqa: F821
"""
Get all AMD device handles.
We query all handles since some handles cannot be
used as they are hidden by ROCR or HIP environment variables.
"""
amdsmi = import_amdsmi_module()
try:
devices = amdsmi.amdsmi_get_processor_handles()
if len(devices) == 0:
console_warning("No AMD GPU detected!")
return None
if not devices:
console_warning("No AMD device(s) detected!")
return []
console_debug(f"Found {len(devices)} AMD device(s).")
return devices[0]
return devices
except Exception as e:
console_warning(f"Error getting device handle: {e}")
return None
console_warning(f"Error getting device handles: {e}")
return []
def get_mem_max_clock() -> float:
"""Get the maximum memory clock of the device."""
amdsmi = import_amdsmi_module()
try:
return amdsmi.amdsmi_get_clock_info(
get_device_handle(), amdsmi.AmdSmiClkType.GFX
)["max_clk"]
except Exception as e:
console_warning(f"Error getting memory clocks: {e}")
return 0.0
error = None
for device in get_device_handles():
try:
return amdsmi.amdsmi_get_clock_info(device, amdsmi.AmdSmiClkType.MEM)[
"max_clk"
]
except Exception as e:
error = e
console_warning(f"Error getting max memory clock: {error}")
return 0.0
def get_gpu_model() -> str:
"""Get the GPU model name."""
def get_gpu_model() -> tuple[str, str, str]:
"""Get GPU model related names."""
amdsmi = import_amdsmi_module()
try:
gpu_model_info = (
# board -> product_name
amdsmi.amdsmi_get_gpu_board_info(get_device_handle())["product_name"],
# asic -> market_name
amdsmi.amdsmi_get_gpu_asic_info(get_device_handle())["market_name"],
# vbios -> name
amdsmi.amdsmi_get_gpu_vbios_info(get_device_handle())["name"],
)
console_debug(f"gpu model info: {str(gpu_model_info)}")
return gpu_model_info
except Exception as e:
console_warning(f"Error getting gpu model info: {e}")
return "N/A"
error = None
for device in get_device_handles():
try:
gpu_model_info = (
amdsmi.amdsmi_get_gpu_board_info(device)["product_name"],
amdsmi.amdsmi_get_gpu_asic_info(device)["market_name"],
amdsmi.amdsmi_get_gpu_vbios_info(device)["name"],
)
console_debug(f"gpu model info: {str(gpu_model_info)}")
return gpu_model_info
except Exception as e:
error = e
console_warning(f"Error getting gpu model info: {error}")
return ("N/A", "N/A", "N/A")
def get_gpu_vbios_part_number() -> str:
"""Get the GPU VBIOS part number."""
amdsmi = import_amdsmi_module()
try:
vbios_part_number = amdsmi.amdsmi_get_gpu_vbios_info(get_device_handle())[
"part_number"
]
console_debug(f"GPU VBIOS Part Number: {vbios_part_number}")
return vbios_part_number
except Exception as e:
console_warning(f"Error getting GPU VBIOS part number: {e}")
return "N/A"
error = None
for device in get_device_handles():
try:
vbios_part_number = amdsmi.amdsmi_get_gpu_vbios_info(device)["part_number"]
console_debug(f"GPU VBIOS Part Number: {vbios_part_number}")
return vbios_part_number
except Exception as e:
error = e
console_warning(f"Error getting GPU VBIOS part number: {error}")
return "N/A"
def get_gpu_compute_partition() -> str:
"""Get the GPU compute partition."""
amdsmi = import_amdsmi_module()
try:
compute_partition = amdsmi.amdsmi_get_gpu_compute_partition(get_device_handle())
console_debug(f"GPU Compute Partition: {compute_partition}")
return compute_partition
except Exception as e:
console_warning(f"Error getting GPU compute partition: {e}")
return "N/A"
error = None
for device in get_device_handles():
try:
compute_partition = amdsmi.amdsmi_get_gpu_compute_partition(device)
console_debug(f"GPU Compute Partition: {compute_partition}")
return compute_partition
except Exception as e:
error = e
console_warning(f"Error getting GPU compute partition: {error}")
return "N/A"
def get_gpu_memory_partition() -> str:
"""Get the GPU memory partition."""
amdsmi = import_amdsmi_module()
try:
memory_partition = amdsmi.amdsmi_get_gpu_memory_partition(get_device_handle())
console_debug(f"GPU Memory Partition: {memory_partition}")
return memory_partition
except Exception as e:
console_warning(f"Error getting GPU memory partition: {e}")
return "N/A"
error = None
for device in get_device_handles():
try:
memory_partition = amdsmi.amdsmi_get_gpu_memory_partition(device)
console_debug(f"GPU Memory Partition: {memory_partition}")
return memory_partition
except Exception as e:
error = e
console_warning(f"Error getting GPU memory partition: {error}")
return "N/A"
def get_amdgpu_driver_version() -> str:
"""Get the AMDGPU driver version."""
amdsmi = import_amdsmi_module()
try:
driver_info = amdsmi.amdsmi_get_gpu_driver_info(get_device_handle())
driver_version = driver_info["driver_version"]
console_debug(f"AMDGPU Driver Version: {driver_version}")
return driver_version
except Exception as e:
console_warning(f"Error getting AMDGPU driver version: {e}")
return "N/A"
error = None
for device in get_device_handles():
try:
driver_info = amdsmi.amdsmi_get_gpu_driver_info(device)
driver_version = driver_info["driver_version"]
console_debug(f"AMDGPU Driver Version: {driver_version}")
return driver_version
except Exception as e:
error = e
console_warning(f"Error getting AMDGPU driver version: {error}")
return "N/A"
def get_gpu_vram_size() -> int:
"""Get the GPU VRAM size in MB."""
def get_gpu_vram_size() -> str:
"""Get the GPU VRAM size in KB."""
amdsmi = import_amdsmi_module()
try:
vram_info = amdsmi.amdsmi_get_gpu_vram_info(get_device_handle())
vram_size = str(int(vram_info["vram_size"]) * 1024) # MB -> KB
console_debug(f"GPU VRAM Size: {vram_size} MB")
return vram_size
except Exception as e:
console_warning(f"Error getting GPU VRAM size: {e}")
return 0
error = None
for device in get_device_handles():
try:
vram_info = amdsmi.amdsmi_get_gpu_vram_info(device)
vram_size = str(int(vram_info["vram_size"]) * 1024) # MB -> KB
console_debug(f"GPU VRAM Size: {vram_size} KB")
return vram_size
except Exception as e:
error = e
console_warning(f"Error getting GPU VRAM size: {error}")
return "0"