diff --git a/projects/amdsmi/CHANGELOG.md b/projects/amdsmi/CHANGELOG.md index bea6fc8981..03ee2bbe02 100644 --- a/projects/amdsmi/CHANGELOG.md +++ b/projects/amdsmi/CHANGELOG.md @@ -12,6 +12,9 @@ Full documentation for amd_smi_lib is available at [https://rocm.docs.amd.com/]( ### Changed +- **Removed `amdsmi_get_gpu_process_info` from python library** +amdsmi_get_gpu_process_info was removed from the C library in an earlier build, but the API was still in the python interface + - **Updated metrics --clocks** Output for `amd-smi metric --clock` is updated to reflect each engine and bug fixes for the clock lock status and deep sleep status. diff --git a/projects/amdsmi/amdsmi_cli/amdsmi_commands.py b/projects/amdsmi/amdsmi_cli/amdsmi_commands.py index ee6159e5ed..31c32f0aa4 100644 --- a/projects/amdsmi/amdsmi_cli/amdsmi_commands.py +++ b/projects/amdsmi/amdsmi_cli/amdsmi_commands.py @@ -2576,28 +2576,38 @@ class AMDSMICommands(): raise e filtered_process_values = [] - for process in process_list: - try: - process_info = amdsmi_interface.amdsmi_get_gpu_process_info(args.gpu, process) - except amdsmi_exception.AmdSmiLibraryException as e: - process_info = "N/A" - logging.debug("Failed to get process info for process %s on gpu %s | %s", process, gpu_id, e.get_error_info()) - filtered_process_values.append({'process_info': process_info}) - continue - + for process_info in process_list: process_info['mem_usage'] = process_info.pop('mem') process_info['usage'] = process_info.pop('engine_usage') + engine_usage_unit = "ns" + memory_usage_unit = "B" + if self.logger.is_human_readable_format(): process_info['mem_usage'] = self.helpers.convert_bytes_to_readable(process_info['mem_usage']) - engine_usage_unit = "ns" for usage_metric in process_info['usage']: process_info['usage'][usage_metric] = f"{process_info['usage'][usage_metric]} {engine_usage_unit}" for usage_metric in process_info['memory_usage']: process_info['memory_usage'][usage_metric] = self.helpers.convert_bytes_to_readable(process_info['memory_usage'][usage_metric]) + elif self.logger.is_json_format(): + process_info['mem_usage'] = {"value" : process_info['mem_usage'], + "unit" : memory_usage_unit} + for usage_metric in process_info['usage']: + process_info['usage'][usage_metric] = {"value" : process_info['usage'][usage_metric], + "unit" : engine_usage_unit} + + for usage_metric in process_info['memory_usage']: + process_info['memory_usage'][usage_metric] = {"value" : process_info['memory_usage'][usage_metric], + "unit" : memory_usage_unit} + + filtered_process_values.append({'process_info': process_info}) + + if not filtered_process_values: + process_info = "N/A" + logging.debug("Failed to detect any process on gpu %s", gpu_id) filtered_process_values.append({'process_info': process_info}) # Arguments will filter the populated processes @@ -2641,7 +2651,7 @@ class AMDSMICommands(): # Convert and store output by pid for csv format if self.logger.is_csv_format(): # Check for empty list first - if filtered_process_values == []: + if not filtered_process_values: self.logger.store_output(args.gpu, 'process_info', 'No running processes detected') else: for process_info in filtered_process_values: @@ -2660,7 +2670,7 @@ class AMDSMICommands(): self.logger.store_output(args.gpu, 'timestamp', int(time.time())) # Store values in logger.output - if filtered_process_values == []: + if not filtered_process_values: self.logger.store_output(args.gpu, 'process_info', 'No running processes detected') else: for process_info in filtered_process_values: diff --git a/projects/amdsmi/py-interface/README.md b/projects/amdsmi/py-interface/README.md index 19454121ae..41468bd9a3 100644 --- a/projects/amdsmi/py-interface/README.md +++ b/projects/amdsmi/py-interface/README.md @@ -882,13 +882,21 @@ except AmdSmiException as e: ### amdsmi_get_gpu_process_list -Description: Returns the list of processes running on the target GPU. +Description: Returns the list of processes running on the target GPU; May require root level access Input parameters: * `processor_handle` device which to query -Output: List of `amdsmi_proc_info_t` process objects running on the target GPU; can be empty +Output: List of Dictionaries with the corresponding fields; empty list if no running process are detected + +Field | Description +---|--- +`name` | Name of process +`pid` | Process ID +`mem` | Process memory usage +`engine_usage` |
Subfield Description
`gfx`GFX engine usage in ns
`enc`Encode engine usage in ns
+`memory_usage` |
Subfield Description
`gtt_mem`GTT memory usage
`cpu_mem`CPU memory usage
`vram_mem`VRAM memory usage
Exceptions that can be thrown by `amdsmi_get_gpu_process_list` function: @@ -910,50 +918,7 @@ try: print("No processes running on this GPU") else: for process in processes: - print(amdsmi_get_gpu_process_info(device, process)) -except AmdSmiException as e: - print(e) -``` - -### amdsmi_get_gpu_process_info - -Description: Returns info about process given the target GPU and the corresponding `amdsmi_proc_info_t` object - -Input parameters: - -* `processor_handle` device which to query - -Output: Dictionary with fields - -Field | Description ----|--- -`name` | Name of process -`pid` | Process ID -`mem` | Process memory usage -`engine_usage` |
Subfield Description
`gfx`GFX engine usage in ns
`enc`Encode engine usage in ns
-`memory_usage` |
Subfield Description
`gtt_mem`GTT memory usage
`cpu_mem`CPU memory usage
`vram_mem`VRAM memory usage
Dict[str, Any]: - if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): - raise AmdSmiParameterException( - processor_handle, amdsmi_wrapper.amdsmi_processor_handle - ) - - if not isinstance(process, amdsmi_wrapper.amdsmi_proc_info_t): - raise AmdSmiParameterException( - process, amdsmi_wrapper.amdsmi_proc_info_t) - - return { - "name": process.name.decode("utf-8"), - "pid": process.pid, - "mem": process.mem, - "engine_usage": { - "gfx": process.engine_usage.gfx, - "enc": process.engine_usage.enc - }, - "memory_usage": { - "gtt_mem": process.memory_usage.gtt_mem, - "cpu_mem": process.memory_usage.cpu_mem, - "vram_mem": process.memory_usage.vram_mem, - }, - } - - def amdsmi_get_gpu_device_uuid(processor_handle: amdsmi_wrapper.amdsmi_processor_handle) -> str: if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): raise AmdSmiParameterException(