From 93c5112cdf149a2d10a9d1a1d449055752da932d Mon Sep 17 00:00:00 2001 From: Maisam Arif Date: Fri, 22 Sep 2023 06:19:38 -0500 Subject: [PATCH] Corrected mem_usage command Dropped redundant fb_usage argument Signed-off-by: Maisam Arif Change-Id: I85d72683085270415f735e9817e359baf6b36773 --- amdsmi_cli/README.md | 2 +- amdsmi_cli/amdsmi_commands.py | 154 ++++++++++++++++------------------ amdsmi_cli/amdsmi_parser.py | 6 +- 3 files changed, 77 insertions(+), 85 deletions(-) diff --git a/amdsmi_cli/README.md b/amdsmi_cli/README.md index e290c226a6..040df80721 100644 --- a/amdsmi_cli/README.md +++ b/amdsmi_cli/README.md @@ -147,6 +147,7 @@ Static Arguments: -r, --ras Displays RAS features information -B, --board All board information -u, --numa All numa node information + -v, --vram All vram information Command Modifiers: --json Displays output in JSON format (human readable by default). @@ -197,7 +198,6 @@ Metric arguments: -W total_loop_time, --watch_time total_loop_time The total time to watch the given command -i number_of_iterations, --iterations number_of_iterations Total number of iterations to loop on the given command -u, --usage Displays engine usage information - -b, --fb-usage Total and used framebuffer -p, --power Current power usage -c, --clock Average, max, and current clock frequencies -t, --temperature Current temperatures diff --git a/amdsmi_cli/amdsmi_commands.py b/amdsmi_cli/amdsmi_commands.py index e57cc4f0fc..66f2c53bd7 100644 --- a/amdsmi_cli/amdsmi_commands.py +++ b/amdsmi_cli/amdsmi_commands.py @@ -693,7 +693,7 @@ class AMDSMICommands(): def metric(self, args, multiple_devices=False, watching_output=False, gpu=None, - usage=None, watch=None, watch_time=None, iterations=None, fb_usage=None, power=None, + usage=None, watch=None, watch_time=None, iterations=None, power=None, clock=None, temperature=None, ecc=None, ecc_block=None, pcie=None, fan=None, voltage_curve=None, overdrive=None, perf_level=None, replay_count=None, xgmi_err=None, energy=None, mem_usage=None): @@ -708,7 +708,6 @@ class AMDSMICommands(): watch (Positive int, optional): Value override for args.watch. Defaults to None. watch_time (Positive int, optional): Value override for args.watch_time. Defaults to None. iterations (Positive int, optional): Value override for args.iterations. Defaults to None. - fb_usage (bool, optional): Value override for args.fb_usage. Defaults to None. power (bool, optional): Value override for args.power. Defaults to None. clock (bool, optional): Value override for args.clock. Defaults to None. temperature (bool, optional): Value override for args.temperature. Defaults to None. @@ -739,10 +738,9 @@ class AMDSMICommands(): args.watch_time = watch_time if iterations: args.iterations = iterations - if fb_usage: - args.fb_usage = fb_usage - if mem_usage: - args.mem_usage = mem_usage + if self.helpers.is_linux(): + if mem_usage: + args.mem_usage = mem_usage if not self.helpers.is_virtual_os(): if replay_count: @@ -818,18 +816,18 @@ class AMDSMICommands(): # Check if any of the options have been set, if not then set them all to true if self.helpers.is_linux() and self.helpers.is_virtual_os(): - if not any([args.fb_usage, args.mem_usage]): - args.fb_usage = args.mem_usage = self.all_arguments = True + if not any([args.mem_usage]): + args.mem_usage = self.all_arguments = True if self.helpers.is_linux() and self.helpers.is_baremetal(): - if not any([args.usage, args.fb_usage, args.power, args.clock, args.temperature, + if not any([args.usage, args.mem_usage, args.power, args.clock, args.temperature, args.ecc, args.ecc_block, args.pcie, args.fan, args.voltage_curve, args.overdrive, args.perf_level, args.replay_count, args.xgmi_err, - args.energy, args.mem_usage]): - args.usage = args.fb_usage = args.power = args.clock = args.temperature = \ + args.energy]): + args.usage = args.mem_usage = args.power = args.clock = args.temperature = \ args.ecc = args.ecc_block = args.pcie = args.fan = args.voltage_curve = \ args.overdrive = args.perf_level = args.replay_count = args.xgmi_err = \ - args.energy = args.mem_usage = self.all_arguments = True + args.energy = self.all_arguments = True # Add timestamp and store values for specified arguments values_dict = {} @@ -852,26 +850,6 @@ class AMDSMICommands(): except amdsmi_exception.AmdSmiLibraryException as e: values_dict['usage'] = "N/A" logging.debug("Failed to get gpu activity for gpu %s | %s", args.gpu, e.get_error_info()) - - if args.fb_usage: - try: - vram_usage = amdsmi_interface.amdsmi_get_gpu_vram_usage(args.gpu) - - if self.logger.is_gpuvsmi_compatibility(): - vram_usage['fb_total'] = vram_usage.pop('vram_total') - vram_usage['fb_used'] = vram_usage.pop('vram_used') - - if self.logger.is_human_readable_format(): - unit = 'MB' - for vram_name, vram_value in vram_usage.items(): - vram_usage[vram_name] = f"{vram_value} {unit}" - - values_dict['fb_usage'] = vram_usage - except amdsmi_exception.AmdSmiLibraryException as e: - values_dict['fb_usage'] = "N/A" - logging.debug("Failed to get gpu vram usage for gpu %s | %s", args.gpu, e.get_error_info()) - - if self.helpers.is_linux() and self.helpers.is_baremetal(): if args.power: power_dict = {'current_power': "N/A", 'current_gfx_voltage': "N/A", @@ -925,7 +903,6 @@ class AMDSMICommands(): except amdsmi_exception.AmdSmiLibraryException as e: values_dict['clock'] = "N/A" logging.debug("Failed to get gfx & mem clock info for gpu %s | %s", args.gpu, e.get_error_info()) - if args.temperature: try: temperature_edge_current = amdsmi_interface.amdsmi_get_temp_metric( @@ -977,7 +954,6 @@ class AMDSMICommands(): temperatures[temperature_key] = f"{temperature_value} {unit}" values_dict['temperature'] = temperatures - if args.ecc: ecc_count = {} try: @@ -990,7 +966,6 @@ class AMDSMICommands(): logging.debug("Failed to get ecc count for gpu %s | %s", args.gpu, e.get_error_info()) values_dict['ecc'] = ecc_count - if args.ecc_block: ecc_dict = {} try: @@ -1086,7 +1061,6 @@ class AMDSMICommands(): except amdsmi_exception.AmdSmiLibraryException as e: values_dict['voltage_curve'] = "N/A" logging.debug("Failed to get voltage curve for gpu %s | %s", args.gpu, e.get_error_info()) - if args.overdrive: try: overdrive_level = amdsmi_interface.amdsmi_get_gpu_overdrive_level(args.gpu) @@ -1099,7 +1073,6 @@ class AMDSMICommands(): except amdsmi_exception.AmdSmiLibraryException as e: values_dict['overdrive'] = "N/A" logging.debug("Failed to get overdrive level for gpu %s | %s", args.gpu, e.get_error_info()) - if args.perf_level: try: perf_level = amdsmi_interface.amdsmi_get_gpu_perf_level(args.gpu) @@ -1127,53 +1100,74 @@ class AMDSMICommands(): if args.energy: pass - if args.mem_usage: - memory_total = {} - try: - memory_total_vram = amdsmi_interface.amdsmi_get_gpu_memory_total(args.gpu, amdsmi_interface.AmdSmiMemoryType.VRAM) - memory_total_vis_vram = amdsmi_interface.amdsmi_get_gpu_memory_total(args.gpu, amdsmi_interface.AmdSmiMemoryType.VIS_VRAM) - memory_total_gtt = amdsmi_interface.amdsmi_get_gpu_memory_total(args.gpu, amdsmi_interface.AmdSmiMemoryType.GTT) + if self.helpers.is_linux() and (self.helpers.is_baremetal() or self.helpers.is_virtual_os()): + if args.mem_usage: + unit = 'MB' + memory_usage = {'total_vram': "N/A", + 'used_vram': "N/A", + 'free_vram': "N/A", + 'total_visible_vram': "N/A", + 'used_visible_vram': "N/A", + 'free_visible_vram': "N/A", + 'total_gtt': "N/A", + 'used_gtt': "N/A", + 'free_gtt': "N/A"} - # Convert mem_usage to megabytes - memory_total['vram'] = memory_total_vram // (1024*1024) - memory_total['vis_vram'] = memory_total_vis_vram // (1024*1024) - memory_total['gtt'] = memory_total_gtt // (1024*1024) + # Total VRAM + try: + total_vram = amdsmi_interface.amdsmi_get_gpu_memory_total(args.gpu, amdsmi_interface.AmdSmiMemoryType.VRAM) + memory_usage['total_vram'] = total_vram // (1024*1024) + except amdsmi_exception.AmdSmiLibraryException as e: + logging.debug("Failed to get total VRAM memory for gpu %s | %s", args.gpu, e.get_error_info()) + + try: + total_visible_vram = amdsmi_interface.amdsmi_get_gpu_memory_total(args.gpu, amdsmi_interface.AmdSmiMemoryType.VIS_VRAM) + memory_usage['total_visible_vram'] = total_visible_vram // (1024*1024) + except amdsmi_exception.AmdSmiLibraryException as e: + logging.debug("Failed to get total VIS VRAM memory for gpu %s | %s", args.gpu, e.get_error_info()) + + try: + total_gtt = amdsmi_interface.amdsmi_get_gpu_memory_total(args.gpu, amdsmi_interface.AmdSmiMemoryType.GTT) + memory_usage['total_gtt'] = total_gtt // (1024*1024) + except amdsmi_exception.AmdSmiLibraryException as e: + logging.debug("Failed to get total GTT memory for gpu %s | %s", args.gpu, e.get_error_info()) + + # Used VRAM + try: + used_vram = amdsmi_interface.amdsmi_get_gpu_memory_usage(args.gpu, amdsmi_interface.AmdSmiMemoryType.VRAM) + memory_usage['used_vram'] = used_vram // (1024*1024) + + except amdsmi_exception.AmdSmiLibraryException as e: + logging.debug("Failed to get used VRAM memory for gpu %s | %s", args.gpu, e.get_error_info()) + + try: + used_visible_vram = amdsmi_interface.amdsmi_get_gpu_memory_usage(args.gpu, amdsmi_interface.AmdSmiMemoryType.VIS_VRAM) + memory_usage['used_visible_vram'] = used_visible_vram // (1024*1024) + except amdsmi_exception.AmdSmiLibraryException as e: + logging.debug("Failed to get used VIS VRAM memory for gpu %s | %s", args.gpu, e.get_error_info()) + + try: + used_gtt = amdsmi_interface.amdsmi_get_gpu_memory_usage(args.gpu, amdsmi_interface.AmdSmiMemoryType.GTT) + memory_usage['used_gtt'] = used_gtt // (1024*1024) + except amdsmi_exception.AmdSmiLibraryException as e: + logging.debug("Failed to get used GTT memory for gpu %s | %s", args.gpu, e.get_error_info()) + + # Free VRAM + if memory_usage['total_vram'] != "N/A" and memory_usage['used_vram'] != "N/A": + memory_usage['free_vram'] = memory_usage['total_vram'] - memory_usage['used_vram'] + + if memory_usage['total_visible_vram'] != "N/A" and memory_usage['used_visible_vram'] != "N/A": + memory_usage['free_visible_vram'] = memory_usage['total_visible_vram'] - memory_usage['used_visible_vram'] + + if memory_usage['total_gtt'] != "N/A" and memory_usage['used_gtt'] != "N/A": + memory_usage['free_gtt'] = memory_usage['total_gtt'] - memory_usage['used_gtt'] if self.logger.is_human_readable_format(): - unit = 'MB' - energy = f"{energy} {unit}" - memory_total['vram'] = f"{memory_total['vram']} {unit}" - memory_total['vis_vram'] = f"{memory_total['vis_vram']} {unit}" - memory_total['gtt'] = f"{memory_total['gtt']} {unit}" + for key, value in memory_usage.items(): + if value != "N/A": + memory_usage[key] = f"{value} {unit}" - except amdsmi_exception.AmdSmiLibraryException as e: - memory_total['vram'] = "N/A" - memory_total['vis_vram'] = "N/A" - memory_total['gtt'] = "N/A" - logging.debug("Failed to get memory total info for gpu %s | %s", args.gpu, e.get_error_info()) - - try: - total_used_vram = amdsmi_interface.amdsmi_get_gpu_memory_usage(args.gpu, amdsmi_interface.AmdSmiMemoryType.VRAM) - total_used_vis_vram = amdsmi_interface.amdsmi_get_gpu_memory_usage(args.gpu, amdsmi_interface.AmdSmiMemoryType.VIS_VRAM) - total_used_gtt = amdsmi_interface.amdsmi_get_gpu_memory_usage(args.gpu, amdsmi_interface.AmdSmiMemoryType.GTT) - - # Convert mem_usage to megabytes - memory_total['used_vram'] = total_used_vram // (1024*1024) - memory_total['used_vis_vram'] = total_used_vis_vram // (1024*1024) - memory_total['used_gtt'] = total_used_gtt // (1024*1024) - - if self.logger.is_human_readable_format(): - memory_total['used_vram'] = f"{memory_total['used_vram']} {unit}" - memory_total['used_vis_vram'] = f"{memory_total['used_vis_vram']} {unit}" - memory_total['used_gtt'] = f"{memory_total['used_gtt']} {unit}" - - except amdsmi_exception.AmdSmiLibraryException as e: - memory_total['used_vram'] = "N/A" - memory_total['used_vis_vram'] = "N/A" - memory_total['used_gtt'] = "N/A" - logging.debug("Failed to get memory usage info for gpu %s | %s", args.gpu, e.get_error_info()) - - values_dict['mem_usage'] = memory_total + values_dict['mem_usage'] = memory_usage # Store timestamp first if watching_output is enabled if watching_output: diff --git a/amdsmi_cli/amdsmi_parser.py b/amdsmi_cli/amdsmi_parser.py index 53bb1a954c..95f8d1761e 100644 --- a/amdsmi_cli/amdsmi_parser.py +++ b/amdsmi_cli/amdsmi_parser.py @@ -417,7 +417,7 @@ class AMDSMIParser(argparse.ArgumentParser): usage_help = "Displays engine usage information" # Help text for Arguments only Available on Virtual OS and Baremetal platforms - fb_usage_help = "Total and used framebuffer" + mem_usage_help = "Memory usage per block" # Help text for Arguments only on Hypervisor and Baremetal platforms power_help = "Current power usage" @@ -435,7 +435,6 @@ class AMDSMIParser(argparse.ArgumentParser): replay_count_help = "PCIe replay count" xgmi_err_help = "XGMI error information since last read" energy_help = "Amount of energy consumed" - mem_usage_help = "Memory usage per block" # Help text for Arguments only on Hypervisors schedule_help = "All scheduling information" @@ -457,11 +456,11 @@ class AMDSMIParser(argparse.ArgumentParser): # Optional Args for Virtual OS and Baremetal systems if self.helpers.is_virtual_os() or self.helpers.is_baremetal(): - metric_parser.add_argument('-b', '--fb-usage', action='store_true', required=False, help=fb_usage_help) metric_parser.add_argument('-m', '--mem-usage', action='store_true', required=False, help=mem_usage_help) # Optional Args for Hypervisors and Baremetal systems if self.helpers.is_hypervisor() or self.helpers.is_baremetal(): + metric_parser.add_argument('-u', '--usage', action='store_true', required=False, help=usage_help) metric_parser.add_argument('-p', '--power', action='store_true', required=False, help=power_help) metric_parser.add_argument('-c', '--clock', action='store_true', required=False, help=clock_help) metric_parser.add_argument('-t', '--temperature', action='store_true', required=False, help=temperature_help) @@ -469,7 +468,6 @@ class AMDSMIParser(argparse.ArgumentParser): metric_parser.add_argument('-k', '--ecc-block', action='store_true', required=False, help=ecc_block_help) metric_parser.add_argument('-r', '--replay-count', action='store_true', required=False, help=replay_count_help) metric_parser.add_argument('-P', '--pcie', action='store_true', required=False, help=pcie_help) - metric_parser.add_argument('-u', '--usage', action='store_true', required=False, help=usage_help) # Optional Args for Linux Baremetal Systems if self.helpers.is_baremetal() and self.helpers.is_linux():