Files
rocm-systems/src/argparser.py
T

551 خطوط
18 KiB
Python

2023-02-13 09:26:12 -06:00
##############################################################################bl
# MIT License
2023-02-13 14:50:24 -06:00
#
2024-01-24 17:11:39 -06:00
# Copyright (c) 2021 - 2024 Advanced Micro Devices, Inc. All Rights Reserved.
2023-02-13 14:50:24 -06:00
#
2022-11-04 14:49:36 -05:00
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
2023-02-13 14:50:24 -06:00
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
2023-02-13 14:50:24 -06:00
#
2022-11-04 14:49:36 -05:00
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2022-11-04 14:49:36 -05:00
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
2023-02-13 09:26:12 -06:00
##############################################################################el
2022-11-04 14:49:36 -05:00
import argparse
2023-04-18 09:50:50 -05:00
import shutil
2023-10-31 15:11:17 -05:00
import os
2024-02-16 15:34:28 -06:00
def print_avail_arch(avail_arch: list):
ret_str = "\t\tList all available metrics for analysis on specified arch:"
for arch in avail_arch:
ret_str += "\n\t\t {}".format(arch)
return ret_str
2023-04-18 09:50:50 -05:00
def add_general_group(parser, rocprof_compute_version):
2023-10-31 15:11:17 -05:00
general_group = parser.add_argument_group("General Options")
2024-02-16 15:34:28 -06:00
general_group.add_argument(
"-v",
"--version",
action="version",
version=rocprof_compute_version["ver_pretty"],
2024-02-16 15:34:28 -06:00
)
general_group.add_argument(
"-V",
"--verbose",
help="Increase output verbosity (use multiple times for higher levels)",
action="count",
default=0,
)
general_group.add_argument(
"-q", "--quiet", action="store_true", help="Reduce output and run quietly."
)
# Nowhere to load specs from in db mode
if "database" not in parser.usage:
general_group.add_argument(
"-s", "--specs", action="store_true", help="Print system specs and exit."
)
def omniarg_parser(
parser, rocprof_compute_home, supported_archs, rocprof_compute_version
):
# -----------------------------------------
# Parse arguments (dependent on mode)
# -----------------------------------------
## General Command Line Options
## ----------------------------
add_general_group(parser, rocprof_compute_version)
parser._positionals.title = "Modes"
parser._optionals.title = "Help"
2022-11-04 14:49:36 -05:00
2023-10-31 15:11:17 -05:00
subparsers = parser.add_subparsers(
2022-11-04 14:49:36 -05:00
dest="mode", help="Select mode of interaction with the target application:"
)
## Profile Command Line Options
## ----------------------------
profile_parser = subparsers.add_parser(
"profile",
help="Profile the target application",
usage="""
rocprof-compute profile --name <workload_name> [profile options] [roofline options] -- <profile_cmd>
2024-03-05 18:13:31 -06:00
---------------------------------------------------------------------------------
Examples:
\trocprof-compute profile -n vcopy_all -- ./vcopy -n 1048576 -b 256
\trocprof-compute profile -n vcopy_SPI_TCC -b SQ TCC -- ./vcopy -n 1048576 -b 256
\trocprof-compute profile -n vcopy_kernel -k vecCopy -- ./vcopy -n 1048576 -b 256
\trocprof-compute profile -n vcopy_disp -d 0 -- ./vcopy -n 1048576 -b 256
\trocprof-compute profile -n vcopy_roof --roof-only -- ./vcopy -n 1048576 -b 256
2024-03-05 18:13:31 -06:00
---------------------------------------------------------------------------------
2023-10-31 15:11:17 -05:00
""",
2022-11-04 14:49:36 -05:00
prog="tool",
allow_abbrev=False,
formatter_class=lambda prog: argparse.RawTextHelpFormatter(
prog, max_help_position=40
),
)
profile_parser._optionals.title = "Help"
2023-10-31 15:11:17 -05:00
add_general_group(profile_parser, rocprof_compute_version)
2022-11-04 14:49:36 -05:00
profile_group = profile_parser.add_argument_group("Profile Options")
roofline_group = profile_parser.add_argument_group("Standalone Roofline Options")
profile_group.add_argument(
"-n",
"--name",
type=str,
metavar="",
dest="name",
required=True,
help="\t\t\tAssign a name to workload.",
)
profile_group.add_argument("--target", type=str, default=None, help=argparse.SUPPRESS)
profile_group.add_argument(
"-p",
"--path",
metavar="",
type=str,
dest="path",
2023-10-31 15:11:17 -05:00
default=os.path.join(os.getcwd(), "workloads"),
2022-11-04 14:49:36 -05:00
required=False,
help="\t\t\tSpecify path to save workload.\n\t\t\t(DEFAULT: {}/workloads/<name>)".format(
os.getcwd()
),
)
profile_group.add_argument(
"-k",
"--kernel",
type=str,
dest="kernel",
metavar="",
required=False,
nargs="+",
default=None,
help="\t\t\tKernel filtering.",
)
2023-10-31 15:11:17 -05:00
profile_group.add_argument(
"-d",
"--dispatch",
type=str,
metavar="",
nargs="+",
dest="dispatch",
required=False,
help="\t\t\tDispatch ID filtering.",
)
profile_group.add_argument(
"-b",
"--block",
2023-10-31 15:11:17 -05:00
type=str,
dest="ipblocks",
metavar="",
nargs="+",
required=False,
choices=["SQ", "SQC", "TA", "TD", "TCP", "TCC", "SPI", "CPC", "CPF"],
help="\t\t\tHardware block filtering:\n\t\t\t SQ\n\t\t\t SQC\n\t\t\t TA\n\t\t\t TD\n\t\t\t TCP\n\t\t\t TCC\n\t\t\t SPI\n\t\t\t CPC\n\t\t\t CPF",
2023-10-31 15:11:17 -05:00
)
2023-04-18 09:50:50 -05:00
result = shutil.which("rocscope")
if result:
profile_group.add_argument(
"-l",
"--i-feel-lucky",
required=False,
default=False,
action="store_true",
dest="lucky",
help="\t\t\tProfile only the most time consuming kernels.",
)
profile_group.add_argument(
"-r",
"--use-rocscope",
required=False,
default=False,
action="store_true",
dest="use_rocscope",
help="\t\t\tUse rocscope for profiling",
)
profile_group.add_argument(
"-s",
"--kernel-summaries",
required=False,
default=False,
action="store_true",
dest="summaries",
help="\t\t\tCreate kernel summaries.",
)
else:
2023-01-23 16:08:42 -06:00
profile_group.add_argument(
"--i-feel-lucky", default=False, dest="lucky", help=argparse.SUPPRESS
)
profile_group.add_argument(
"--use-rocscope", default=False, dest="use_rocscope", help=argparse.SUPPRESS
)
profile_group.add_argument(
"--kernel-summaries",
default=False,
dest="summaries",
help=argparse.SUPPRESS,
2023-01-23 16:08:42 -06:00
)
profile_group.add_argument(
"--join-type",
metavar="",
required=False,
choices=["kernel", "grid"],
default="grid",
help="\t\t\tChoose how to join rocprof runs: (DEFAULT: grid)\n\t\t\t kernel (i.e. By unique kernel name dispatches)\n\t\t\t grid (i.e. By unique kernel name + grid size dispatches)",
)
2022-11-04 14:49:36 -05:00
profile_group.add_argument(
"--no-roof",
required=False,
default=False,
action="store_true",
help="\t\t\tProfile without collecting roofline data.",
)
profile_group.add_argument(
"remaining",
metavar="-- [ ...]",
default=None,
nargs=argparse.REMAINDER,
help="\t\t\tProvide command for profiling after double dash.",
)
## Roofline Command Line Options
roofline_group.add_argument(
"--roof-only",
required=False,
default=False,
action="store_true",
help="\t\t\tProfile roofline data only.",
)
roofline_group.add_argument(
"--sort",
required=False,
metavar="",
type=str,
default="kernels",
choices=["kernels", "dispatches"],
2022-11-04 14:49:36 -05:00
help="\t\t\tOverlay top kernels or top dispatches: (DEFAULT: kernels)\n\t\t\t kernels\n\t\t\t dispatches",
)
roofline_group.add_argument(
"-m",
"--mem-level",
required=False,
choices=["HBM", "L2", "vL1D", "LDS"],
metavar="",
nargs="+",
2022-11-04 14:49:36 -05:00
type=str,
default="ALL",
help="\t\t\tFilter by memory level: (DEFAULT: ALL)\n\t\t\t HBM\n\t\t\t L2\n\t\t\t vL1D\n\t\t\t LDS",
)
roofline_group.add_argument(
"--device",
metavar="",
required=False,
default=-1,
type=int,
help="\t\t\tTarget GPU device ID. (DEFAULT: ALL)",
2022-11-04 14:49:36 -05:00
)
roofline_group.add_argument(
"--kernel-names",
required=False,
default=False,
action="store_true",
help="\t\t\tInclude kernel names in roofline plot.",
)
2022-11-04 14:49:36 -05:00
# roofline_group.add_argument('-w', '--workgroups', required=False, default=-1, type=int, help="\t\t\tNumber of kernel workgroups (DEFAULT: 1024)")
# roofline_group.add_argument('--wsize', required=False, default=-1, type=int, help="\t\t\tWorkgroup size (DEFAULT: 256)")
# roofline_group.add_argument('--dataset', required=False, default = -1, type=int, help="\t\t\tDataset size (DEFAULT: 536M)")
# roofline_group.add_argument('-e', '--experiments', required=False, default=-1, type=int, help="\t\t\tNumber of experiments (DEFAULT: 100)")
# roofline_group.add_argument('--iter', required=False, default=-1, type=int, help="\t\t\tNumber of iterations (DEFAULT: 10)")
## Database Command Line Options
## ----------------------------
db_parser = subparsers.add_parser(
"database",
help="Interact with rocprofiler-compute database",
2022-11-04 14:49:36 -05:00
usage="""
\nrocprof-compute database <interaction type> [connection options]
2022-11-04 14:49:36 -05:00
2023-10-31 15:11:17 -05:00
\n\n-------------------------------------------------------------------------------
\nExamples:
\n\trocprof-compute database --import -H pavii1 -u temp -t asw -w workloads/vcopy/mi200/
\n\trocprof-compute database --remove -H pavii1 -u temp -w rocprofiler-compute_asw_sample_mi200
2023-10-31 15:11:17 -05:00
\n-------------------------------------------------------------------------------\n
""",
2022-11-04 14:49:36 -05:00
prog="tool",
allow_abbrev=False,
formatter_class=lambda prog: argparse.RawTextHelpFormatter(
prog, max_help_position=40
),
)
db_parser._optionals.title = "Help"
add_general_group(db_parser, rocprof_compute_version)
2022-11-04 14:49:36 -05:00
interaction_group = db_parser.add_argument_group("Interaction Type")
connection_group = db_parser.add_argument_group("Connection Options")
interaction_group.add_argument(
"-i",
"--import",
required=False,
dest="upload",
action="store_true",
help="\t\t\t\tImport workload to rocprofiler-compute DB",
2022-11-04 14:49:36 -05:00
)
interaction_group.add_argument(
"-r",
"--remove",
required=False,
dest="remove",
action="store_true",
help="\t\t\t\tRemove a workload from rocprofiler-compute DB",
2022-11-04 14:49:36 -05:00
)
connection_group.add_argument(
"-H",
"--host",
required=True,
metavar="",
help="\t\t\t\tName or IP address of the server host.",
)
connection_group.add_argument(
"-P",
"--port",
required=False,
metavar="",
help="\t\t\t\tTCP/IP Port. (DEFAULT: 27018)",
default=27018,
)
connection_group.add_argument(
"-u",
"--username",
required=True,
metavar="",
help="\t\t\t\tUsername for authentication.",
)
connection_group.add_argument(
"-p",
"--password",
metavar="",
help="\t\t\t\tThe user's password. (will be requested later if it's not set)",
default="",
)
connection_group.add_argument(
"-t", "--team", required=False, metavar="", help="\t\t\t\tSpecify Team prefix."
)
connection_group.add_argument(
"-w",
"--workload",
required=True,
metavar="",
dest="workload",
help="\t\t\t\tSpecify name of workload (to remove) or path to workload (to import)",
)
2024-03-12 15:54:52 -05:00
connection_group.add_argument(
"--kernel-verbose",
required=False,
metavar="",
help="\t\tSpecify Kernel Name verbose level 1-5. Lower the level, shorter the kernel name. (DEFAULT: 5) (DISABLE: 5)",
default=5,
type=int,
)
2022-11-04 14:49:36 -05:00
## Analyze Command Line Options
## ----------------------------
analyze_parser = subparsers.add_parser(
"analyze",
help="Analyze existing profiling results at command line",
usage="""
rocprof-compute analyze --path <workload_path> [analyze options]
2022-11-04 14:49:36 -05:00
-----------------------------------------------------------------------------------
Examples:
\trocprof-compute analyze -p workloads/vcopy/mi200/ --list-metrics gfx90a
\trocprof-compute analyze -p workloads/mixbench/mi200/ --dispatch 12 34 --decimal 3
\trocprof-compute analyze -p workloads/mixbench/mi200/ --gui
-----------------------------------------------------------------------------------
2023-10-31 15:11:17 -05:00
""",
2022-11-04 14:49:36 -05:00
prog="tool",
allow_abbrev=False,
formatter_class=lambda prog: argparse.RawTextHelpFormatter(
prog, max_help_position=40
),
)
analyze_parser._optionals.title = "Help"
add_general_group(analyze_parser, rocprof_compute_version)
2022-11-04 14:49:36 -05:00
analyze_group = analyze_parser.add_argument_group("Analyze Options")
2023-10-31 15:11:17 -05:00
analyze_advanced_group = analyze_parser.add_argument_group("Advanced Options")
2022-11-04 14:49:36 -05:00
analyze_group.add_argument(
"-p",
"--path",
dest="path",
required=False,
metavar="",
nargs="+",
action="append",
help="\t\tSpecify the raw data root dirs or desired results directory.",
)
analyze_group.add_argument(
"--list-stats",
action="store_true",
help="\t\tList all detected kernels and kernel dispatches.",
2022-11-04 14:49:36 -05:00
)
analyze_group.add_argument(
"--list-metrics",
metavar="",
2024-02-16 15:34:28 -06:00
choices=supported_archs.keys(), # ["gfx906", "gfx908", "gfx90a"],
help=print_avail_arch(supported_archs.keys()),
2022-11-04 14:49:36 -05:00
)
analyze_group.add_argument(
"-k",
"--kernel",
2022-11-04 14:49:36 -05:00
metavar="",
type=int,
dest="gpu_kernel",
nargs="+",
action="append",
help="\t\tSpecify kernel id(s) from --list-stats for filtering.",
2022-11-04 14:49:36 -05:00
)
analyze_group.add_argument(
"-d",
"--dispatch",
2022-11-04 14:49:36 -05:00
dest="gpu_dispatch_id",
metavar="",
nargs="+",
action="append",
help="\t\tSpecify dispatch id(s) for filtering.",
2022-11-04 14:49:36 -05:00
)
2023-10-31 15:11:17 -05:00
analyze_group.add_argument(
"-b",
"--block",
2023-10-31 15:11:17 -05:00
dest="filter_metrics",
metavar="",
nargs="+",
help="\t\tSpecify hardware block/metric id(s) from --list-metrics for filtering.",
2023-10-31 15:11:17 -05:00
)
2022-11-04 14:49:36 -05:00
analyze_group.add_argument(
"--gpu-id",
2022-11-04 14:49:36 -05:00
dest="gpu_id",
metavar="",
nargs="+",
help="\t\tSpecify GPU id(s) for filtering.",
2022-11-04 14:49:36 -05:00
)
analyze_group.add_argument(
2023-10-31 15:11:17 -05:00
"-o",
"--output",
2022-11-04 14:49:36 -05:00
metavar="",
2023-10-31 15:11:17 -05:00
dest="output_file",
help="\t\tSpecify an output file to save analysis results.",
2022-11-04 14:49:36 -05:00
)
analyze_group.add_argument(
2023-10-31 15:11:17 -05:00
"--gui",
type=int,
nargs="?",
const=8050,
help="\t\tActivate a GUI to interate with rocprofiler-compute metrics.\n\t\tOptionally, specify port to launch application (DEFAULT: 8050)",
2023-10-31 15:11:17 -05:00
)
analyze_advanced_group.add_argument(
"--random-port",
action="store_true",
help="\t\tRandomly generate a port to launch GUI application.\n\t\tRegistered Ports range inclusive (1024-49151).",
)
analyze_advanced_group.add_argument(
"--max-stat-num",
dest="max_stat_num",
metavar="",
type=int,
default=10,
2024-02-16 15:34:28 -06:00
help='\t\tSpecify the maximum number of stats shown in "Top Stats" tables (DEFAULT: 10)',
)
2023-10-31 15:11:17 -05:00
analyze_advanced_group.add_argument(
"-n",
"--normal-unit",
dest="normal_unit",
2022-11-04 14:49:36 -05:00
metavar="",
2023-10-31 15:11:17 -05:00
default="per_wave",
choices=["per_wave", "per_cycle", "per_second", "per_kernel"],
help="\t\tSpecify the normalization unit: (DEFAULT: per_wave)\n\t\t per_wave\n\t\t per_cycle\n\t\t per_second\n\t\t per_kernel",
2022-11-04 14:49:36 -05:00
)
2023-10-31 15:11:17 -05:00
analyze_advanced_group.add_argument(
2022-11-04 14:49:36 -05:00
"-t",
"--time-unit",
dest="time_unit",
metavar="",
default="ns",
choices=["s", "ms", "us", "ns"],
help="\t\tSpecify display time unit in kernel top stats: (DEFAULT: ns)\n\t\t s\n\t\t ms\n\t\t us\n\t\t ns",
)
2023-10-31 15:11:17 -05:00
analyze_advanced_group.add_argument(
2022-11-04 14:49:36 -05:00
"--decimal",
type=int,
metavar="",
default=2,
2023-10-31 15:11:17 -05:00
help="\t\tSpecify desired decimal precision of analysis results. (DEFAULT: 2)",
2022-11-04 14:49:36 -05:00
)
2023-10-31 15:11:17 -05:00
analyze_advanced_group.add_argument(
"--config-dir",
dest="config_dir",
metavar="",
help="\t\tSpecify the directory of customized configs.",
default=rocprof_compute_home.joinpath("rocprof_compute_soc/analysis_configs/"),
2023-10-31 15:11:17 -05:00
)
analyze_advanced_group.add_argument(
2023-05-03 17:45:29 -06:00
"--save-dfs",
dest="df_file_dir",
metavar="",
help="\t\tSpecify the dirctory to save analysis dataframe csv files.",
)
2023-10-31 15:11:17 -05:00
analyze_advanced_group.add_argument(
2022-11-04 14:49:36 -05:00
"--cols",
type=int,
dest="cols",
metavar="",
nargs="+",
help="\t\tSpecify column indices to display.",
)
2024-02-16 15:34:28 -06:00
analyze_advanced_group.add_argument(
"-g", dest="debug", action="store_true", help="\t\tDebug single metric."
)
2023-10-31 15:11:17 -05:00
analyze_advanced_group.add_argument(
"--dependency",
action="store_true",
help="\t\tList the installation dependency.",
2022-11-04 14:49:36 -05:00
)
2023-10-31 15:11:17 -05:00
analyze_advanced_group.add_argument(
"--kernel-verbose",
2023-08-10 11:13:27 -05:00
required=False,
metavar="",
2023-08-15 14:00:36 -05:00
help="\t\tSpecify Kernel Name verbose level 1-5. Lower the level, shorter the kernel name. (DEFAULT: 5) (DISABLE: 5)",
default=5,
2023-08-10 11:13:27 -05:00
type=int,
)
2023-10-31 15:11:17 -05:00
analyze_advanced_group.add_argument(
"--report-diff", default=0, nargs="?", type=int, help=argparse.SUPPRESS
)
analyze_advanced_group.add_argument(
"--specs-correction",
type=str,
metavar="",
2024-02-16 15:34:28 -06:00
help="\t\tSpecify the specs to correct.",
)