From 35069a9d069c20ce7320d67b35fafe473b0d17fd Mon Sep 17 00:00:00 2001 From: "Nagaraj, Sriraksha" Date: Sun, 27 Apr 2025 19:56:45 -0500 Subject: [PATCH] [Misc] fix the agent_id field (#297) * fix the agent_id field * Fix shebang --------- Co-authored-by: Jonathan R. Madsen --- source/CMakeLists.txt | 2 +- source/share/CMakeLists.txt | 1 + .../rocprofiler-sdk}/CMakeLists.txt | 0 .../convert-counters-collection-format.py | 66 ++++++++++++++--- tests/conversion-script/CMakeLists.txt | 73 ++++++++++++++----- tests/conversion-script/conftest.py | 8 ++ tests/conversion-script/validate.py | 11 ++- 7 files changed, 127 insertions(+), 34 deletions(-) create mode 100644 source/share/CMakeLists.txt rename source/{scripts => share/rocprofiler-sdk}/CMakeLists.txt (100%) rename source/{scripts => share/rocprofiler-sdk}/convert-counters-collection-format.py (74%) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index ec8d12b383..0642bc0f06 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -17,4 +17,4 @@ add_subdirectory(lib) add_subdirectory(libexec) add_subdirectory(bin) add_subdirectory(docs) -add_subdirectory(scripts) +add_subdirectory(share) diff --git a/source/share/CMakeLists.txt b/source/share/CMakeLists.txt new file mode 100644 index 0000000000..533ef2f93d --- /dev/null +++ b/source/share/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(rocprofiler-sdk) diff --git a/source/scripts/CMakeLists.txt b/source/share/rocprofiler-sdk/CMakeLists.txt similarity index 100% rename from source/scripts/CMakeLists.txt rename to source/share/rocprofiler-sdk/CMakeLists.txt diff --git a/source/scripts/convert-counters-collection-format.py b/source/share/rocprofiler-sdk/convert-counters-collection-format.py similarity index 74% rename from source/scripts/convert-counters-collection-format.py rename to source/share/rocprofiler-sdk/convert-counters-collection-format.py index 0a796d4816..a7b5ca1ca9 100755 --- a/source/scripts/convert-counters-collection-format.py +++ b/source/share/rocprofiler-sdk/convert-counters-collection-format.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # MIT License # # Copyright (c) 2023-2025 Advanced Micro Devices, Inc. All rights reserved. @@ -20,7 +21,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -#!/usr/bin/env python3 import os import pandas as pd import argparse @@ -69,6 +69,10 @@ def write_to_file(df, args): directory, file_path = os.path.split(args.output) if directory: os.makedirs(directory, exist_ok=True) + + if not args.retain_agent_prefix: + df["Agent_Id"] = df["Agent_Id"].apply(lambda x: x.split(" ")[-1]) + df.to_csv(args.output, index=False) @@ -100,15 +104,6 @@ def main(args): if col not in columns: logging.debug(f"Unexpected column {col} found in rocprofv3 input file") - non_index_columns = [ - "Correlation_Id", - "Start_Timestamp", - "End_Timestamp", - "Process_Id", - "Thread_Id", - "Kernel_Id", - ] - # Convert indexes = [ "Dispatch_Id", @@ -136,7 +131,51 @@ def main(args): write_to_file(pivoted_data, args) +def strtobool(val): + """Convert a string representation of truth to true or false. + True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values + are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if + 'val' is anything else. + """ + if isinstance(val, (list, tuple)): + if len(val) > 1: + val_type = type(val).__name__ + raise ValueError(f"invalid truth value {val} (type={val_type})") + else: + val = val[0] + + if isinstance(val, bool): + return val + elif isinstance(val, str) and val.lower() in ("y", "yes", "t", "true", "on", "1"): + return True + elif isinstance(val, str) and val.lower() in ("n", "no", "f", "false", "off", "0"): + return False + else: + val_type = type(val).__name__ + raise ValueError(f"invalid truth value {val} (type={val_type})") + + +class booleanArgAction(argparse.Action): + def __call__(self, parser, args, value, option_string=None): + setattr(args, self.dest, strtobool(value)) + + +def add_parser_bool_argument(gparser, *args, **kwargs): + gparser.add_argument( + *args, + **kwargs, + action=booleanArgAction, + nargs="?", + const=True, + type=str, + required=False, + metavar="BOOL", + default=False, + ) + + def parse_args(): + parser = argparse.ArgumentParser() parser.add_argument( "-i", @@ -171,6 +210,13 @@ def parse_args(): dest="loglevel", const=logging.INFO, ) + advanced_options = parser.add_argument_group("Advanced options") + add_parser_bool_argument( + advanced_options, + "--retain-agent-prefix", + help="retains the agent prefix", + ) + return parser.parse_args() diff --git a/tests/conversion-script/CMakeLists.txt b/tests/conversion-script/CMakeLists.txt index 57382fcd2b..95fcc80c0f 100644 --- a/tests/conversion-script/CMakeLists.txt +++ b/tests/conversion-script/CMakeLists.txt @@ -51,26 +51,59 @@ set_tests_properties( PROPERTIES TIMEOUT 45 LABELS "integration-tests" ENVIRONMENT "${cc-env-pmc}" FAIL_REGULAR_EXPRESSION "${ROCPROFILER_DEFAULT_FAIL_REGEX}") -add_test( - NAME test-conversion-script-convert - COMMAND - ${Python3_EXECUTABLE} - $ --input - ${CMAKE_CURRENT_BINARY_DIR}/out_conversion_script --output - ${CMAKE_CURRENT_BINARY_DIR}/out_conversion_script/converted.csv) +set(convert_tests test-conversion-script-convert-no-agent-prefix + test-conversion-script-convert-agent-prefix) -set_tests_properties( - test-conversion-script-convert - PROPERTIES TIMEOUT 45 LABELS "integration-tests" DEPENDS - test-conversion-script-execute FAIL_REGULAR_EXPRESSION - "${ROCPROFILER_DEFAULT_FAIL_REGEX}") +set(validate_tests test-conversion-script-validate-no-agent-prefix + test-conversion-script-validate-agent-prefix) -add_test(NAME test-conversion-script-validate - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/validate.py --input - ${CMAKE_CURRENT_BINARY_DIR}/out_conversion_script/converted.csv) +set(output_dir ${CMAKE_CURRENT_BINARY_DIR}/out_conversion_script_no_agent_prefix + ${CMAKE_CURRENT_BINARY_DIR}/out_conversion_script_agent_prefix) -set_tests_properties( - test-conversion-script-validate - PROPERTIES TIMEOUT 45 LABELS "integration-tests" DEPENDS - test-conversion-script-convert FAIL_REGULAR_EXPRESSION - "${ROCPROFILER_DEFAULT_FAIL_REGEX}") +set(agent_index_flag false true) + +list(LENGTH convert_tests convert_test_length) + +foreach(i RANGE 0 ${convert_test_length}) + if(${i} EQUAL ${convert_test_length}) + break() + endif() + list(GET convert_tests ${i} test_name) + list(GET output_dir ${i} output) + list(GET agent_index_flag ${i} flag) + list(GET validate_tests ${i} validate_test_name) + if(${flag}) + add_test( + NAME ${test_name} + COMMAND + ${Python3_EXECUTABLE} + $ + --input ${CMAKE_CURRENT_BINARY_DIR}/out_conversion_script --output + ${output} --retain-agent-prefix) + + add_test(NAME ${validate_test_name} + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/validate.py + --input ${output} --retain-agent-prefix true) + else() + add_test( + NAME ${test_name} + COMMAND + ${Python3_EXECUTABLE} + $ + --input ${CMAKE_CURRENT_BINARY_DIR}/out_conversion_script --output + ${output}) + + add_test(NAME ${validate_test_name} + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/validate.py + --input ${output} --retain-agent-prefix false) + endif() + set_tests_properties( + ${test_name} + PROPERTIES TIMEOUT 45 LABELS "integration-tests" DEPENDS + test-conversion-script-execute FAIL_REGULAR_EXPRESSION + "${ROCPROFILER_DEFAULT_FAIL_REGEX}") + set_tests_properties( + ${validate_test_name} + PROPERTIES TIMEOUT 45 LABELS "integration-tests" DEPENDS ${test_name} + FAIL_REGULAR_EXPRESSION "${ROCPROFILER_DEFAULT_FAIL_REGEX}") +endforeach() diff --git a/tests/conversion-script/conftest.py b/tests/conversion-script/conftest.py index d88216b94c..0d780e7808 100644 --- a/tests/conversion-script/conftest.py +++ b/tests/conversion-script/conftest.py @@ -29,6 +29,9 @@ import pandas as pd def pytest_addoption(parser): parser.addoption("--input", action="store", help="Path to csv file.") + parser.addoption( + "--retain-agent-prefix", action="store", help="retain agent prefix flag." + ) @pytest.fixture @@ -36,3 +39,8 @@ def input_data(request): filename = request.config.getoption("--input") with open(filename, "r") as inp: return pd.read_csv(inp) + + +@pytest.fixture +def retain_agent_prefix_flag(request): + return request.config.getoption("--retain-agent-prefix") diff --git a/tests/conversion-script/validate.py b/tests/conversion-script/validate.py index 0974c4812d..5057fa55dd 100644 --- a/tests/conversion-script/validate.py +++ b/tests/conversion-script/validate.py @@ -35,11 +35,16 @@ kernel_list = sorted( counters_list = ["SQ_WAVES", "GRBM_GUI_ACTIVE"] -def test_validate_counter_collection_pmc1(input_data: pd.DataFrame): +def test_validate_counter_collection_pmc1( + input_data: pd.DataFrame, retain_agent_prefix_flag +): df = input_data assert not df.empty - df_agent_id = df["Agent_Id"].str.split(" ").str[-1] - assert (df_agent_id.astype(int).values >= 0).all() + if retain_agent_prefix_flag == "true": + df_agent_id = df["Agent_Id"].str.split(" ").str[-1] + assert (df_agent_id.astype(int).values >= 0).all() + else: + assert (df["Agent_Id"].astype(int).values > 0).all() assert (df["Queue_Id"].astype(int).values > 0).all() assert len(df["Kernel_Name"]) > 0