From 91021da055136a7f71575894a85a6516b9ae6881 Mon Sep 17 00:00:00 2001 From: "Pham, Gabriel" Date: Mon, 2 Jun 2025 17:15:15 -0500 Subject: [PATCH] [SWDEV-446039] Added Flat Process table to default output (#425) Signed-off-by: gabrpham_amdeng Signed-off-by: Maisam Arif Co-authored-by: Maisam Arif --- CHANGELOG.md | 21 +++++++++++++++++++++ amdsmi_cli/amdsmi_commands.py | 30 ++++++++++++++++-------------- amdsmi_cli/amdsmi_logger.py | 34 +++++++++++++++++++--------------- 3 files changed, 56 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 374c917236..b064d2732d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,27 @@ Full documentation for amd_smi_lib is available at [https://rocm.docs.amd.com/pr | 0000:df:00.0 AMD Instinct MI300X | 0 % 40 °C 0 138/750 W | | 7 7 6 SPX/NPS1 | 0 % N/A 283/196592 MB | +--------------------------------------+---------------------------------------+ + +------------------------------------------------------------------------------+ + | Processes: | + | GPU PID Process Name VRAM_MEM MEM_USAGE NUM_CU | + |==============================================================================| + | 0 269867 rvs 17.9 GB 19.2 GB 38 | + | 0 269888 rvs 17.9 GB 19.2 GB 38 | + | 1 269867 rvs 17.9 GB 19.2 GB 38 | + | 1 269888 rvs 17.9 GB 19.2 GB 38 | + | 2 269867 rvs 17.9 GB 19.2 GB 38 | + | 2 269888 rvs 17.9 GB 19.2 GB 38 | + | 3 269867 rvs 17.9 GB 19.2 GB 76 | + | 3 269888 rvs 17.9 GB 19.2 GB 0 | + | 4 269867 rvs 17.9 GB 19.0 GB 37 | + | 4 269888 rvs 17.9 GB 19.2 GB 36 | + | 5 269867 rvs 17.9 GB 19.0 GB 76 | + | 5 269888 rvs 17.9 GB 19.2 GB 0 | + | 6 269867 rvs 17.9 GB 19.0 GB 76 | + | 6 269888 rvs 17.9 GB 19.2 GB 0 | + | 7 269867 rvs 17.9 GB 19.2 GB 34 | + | 7 269888 rvs 17.9 GB 19.2 GB 38 | + +------------------------------------------------------------------------------+ ``` - **Added support for GPU metrics 1.8**. diff --git a/amdsmi_cli/amdsmi_commands.py b/amdsmi_cli/amdsmi_commands.py index dbe5a5b5e1..bb031b6725 100644 --- a/amdsmi_cli/amdsmi_commands.py +++ b/amdsmi_cli/amdsmi_commands.py @@ -6526,9 +6526,9 @@ class AMDSMICommands(): default_table_info_dict.update({"version_info": version_info}) gpu_info_list = [] - # all_process_list = [] + all_process_list = [] + all_process_list = [] - # TODO: create new logger function to display table? or modify table? # get info for each processor to display in default output for processor in processors: gpu_info_dict = {} @@ -6651,20 +6651,22 @@ class AMDSMICommands(): gpu_info_list.append(gpu_info_dict) # Running Processes - # try: - # raw_process_list = amdsmi_interface.amdsmi_get_gpu_process_list(processor) - # proc_info_dict = {"gpu": "N/A", "pid": "N/A", "name": "N/A", "vram": "N/A"} - # for proc in raw_process_list: - # proc_info_dict['gpu'] = gpu_id - # proc_info_dict['pid'] = proc['pid'] - # proc_info_dict['name'] = proc['container_name'] - # proc_info_dict['vram'] = str(proc['memory_usage']['vram_mem']) + " MB" - # all_process_list.append(proc_info_dict) - # except amdsmi_exception.AmdSmiLibraryException as e: - # logging.debug("Failed to get process list for gpu %s | %s", gpu_id, e.get_error_info()) + try: + raw_process_list = amdsmi_interface.amdsmi_get_gpu_process_list(processor) + for proc in raw_process_list: + proc_info_dict = {"gpu": "N/A", "pid": "N/A", "name": "N/A", "vram": "N/A", "mem_usage": "N/A", "cu_occupancy": "N/A"} + proc_info_dict['gpu'] = gpu_id + proc_info_dict['pid'] = proc['pid'] + proc_info_dict['name'] = proc['name'] + proc_info_dict['vram'] = self.helpers.convert_bytes_to_readable(proc['memory_usage']['vram_mem']) + proc_info_dict['mem_usage'] = self.helpers.convert_bytes_to_readable(proc['mem']) + proc_info_dict['cu_occupancy'] = str(proc['cu_occupancy']) + all_process_list.append(proc_info_dict) + except amdsmi_exception.AmdSmiLibraryException as e: + logging.debug("Failed to get process list for gpu %s | %s", gpu_id, e.get_error_info()) default_table_info_dict.update({f"gpu_info_list": gpu_info_list}) - # default_table_info_dict.update({"processes": all_process_list}) + default_table_info_dict.update({"processes": all_process_list}) if self.logger.is_json_format(): self.logger.output = default_table_info_dict diff --git a/amdsmi_cli/amdsmi_logger.py b/amdsmi_cli/amdsmi_logger.py index ae5bd2a08e..452b67ad86 100644 --- a/amdsmi_cli/amdsmi_logger.py +++ b/amdsmi_cli/amdsmi_logger.py @@ -965,6 +965,7 @@ class AMDSMILogger(): default_line_2 = "|--------------------------------------+---------------------------------------|" default_line_3 = "|======================================+=======================================|" default_line_4 = "+--------------------------------------+---------------------------------------+" + default_line_5 = "|==============================================================================|" # print the version information first amd_smi_version = str(output['version_info']['amd-smi']) @@ -1043,18 +1044,21 @@ class AMDSMILogger(): print(default_line_4) - # # print process list of all GPUs last - # print(default_line_1) - # print("| Processes: |") - # print("| GPU PID Process name VRAM_MEM |") - # print(default_line_5) - # if len(output['processes']) != 0: - # for process in output['processes']: - # gpu_id = str(process['gpu']).rjust(4) - # pid = str(process['pid']).ljust(7) - # process_name = str(process['name']).ljust(25) - # vram_mem = str(process['vram']).rjust(18) - # print("| {0:4s} {1:7s} {2:25s} {3:18s} |".format(gpu_id, pid, process_name, vram_mem)) - # else: - # print("| No running processes found |") - # print(default_line_1) \ No newline at end of file + # print process list of all GPUs last + print(default_line_1) + print("| Processes: |") + print("| GPU PID Process Name VRAM_MEM MEM_USAGE NUM_CU |") + print(default_line_5) + if len(output['processes']) != 0: + for process in output['processes']: + gpu_id = str(process['gpu']).rjust(4) + pid = str(process['pid']).rjust(9) + process_name = str(process['name']).ljust(29) + vram_mem = str(process['vram']).rjust(9) + mem_usage = str(process['mem_usage']).rjust(9) + cu_occupancy = str(process['cu_occupancy']).rjust(6) + print("| {0:4s} {1:9s} {2:29s} {3:9s} {4:9s} {5:6s} |".format( + gpu_id, pid, process_name, vram_mem, mem_usage, cu_occupancy)) + else: + print("| No running processes found |") + print(default_line_1) \ No newline at end of file