Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
b97cff1
Add github workflows to automate IFU (#2688) (#2748)
pragupta Oct 27, 2025
db39cf7
CONSOLIDATED COMMITS: Triton build updates
pruthvistony Mar 8, 2024
d28eca7
[rocm7.1_internal_testing] Change pytorch-triton-rocm to pytorch-trit…
ethanwee1 Aug 12, 2025
6b3a141
[rocm7.1_internal_testing] Add triton_kernels wheel generation (#2566)
pragupta Aug 22, 2025
c440bc6
CONSOLIDATED COMMITS: Implementation of PyTorch ut parsing script - Q…
BLOrange-AMD Apr 18, 2024
25a18ab
[rocm6.4_internal_testing] Enable wheels (#1884) (#1907)
ethanwee1 Feb 20, 2025
70a5f9f
ROCm: Enable tf32 testing on test_nn (#55)
jagadish-amd Apr 19, 2025
d14e5a9
[AUTOGENERATED] [rocm6.5_internal_testing] Remove --no-index and --no…
okakarpa May 13, 2025
b296de5
[rocm7.0_internal_testing] upgrading numpy (#2256)
ethanwee1 Jun 10, 2025
a016608
[rocm7.0_internal_testing] Use different package versions for py3.9 (…
jithunnair-amd Jun 13, 2025
451567e
[rocm7.0_internal_testing] fix enabling sparse tests fp16/bf16 for ro…
dnikolaev-amd Jun 30, 2025
c2d4e99
[rocm7.0_internal_testing] upgrade tensorboard compatible with numpy …
ethanwee1 Jul 9, 2025
30a23df
[rocm7.1_internal_testing] Pin requirements (#2526)
ethanwee1 Aug 15, 2025
11ca2d0
Enable gesvda for ROCM >= 6.1 (#1339)
xinyazhang Dec 20, 2023
629e824
Remove ROCmloops specific test
pruthvistony Mar 12, 2024
ab4714d
Bump triton to 3.5.x and update related_commits
pragupta Oct 29, 2025
2536631
Revert to prev sccache by ROCm
jagadish-amd Apr 1, 2025
777e73c
pytorch_ifu.yml: Change date format (#2776)
pragupta Nov 3, 2025
56002f4
create_ifu_tag: updates from testing on rocm fork
pragupta Nov 4, 2025
223b9c5
Merge remote-tracking branch 'upstream/main' into develop_IFU_20251104
github-actions[bot] Nov 4, 2025
b4c1e1e
Fix merge conflict
pragupta Nov 4, 2025
3d74218
Merge pull request #2784 from ROCm/develop_IFU_20251104
pragupta Nov 4, 2025
da5ac4a
Merge remote-tracking branch 'upstream/main' into develop_IFU_20251118
github-actions[bot] Nov 18, 2025
a3c49a9
Fix conflicts and move triton ver to 3.5.0
Nov 19, 2025
5ca076d
Merge pull request #2812 from ROCm/develop_IFU_20251118
pragupta Nov 19, 2025
ecdea86
Merge remote-tracking branch 'upstream/main' into develop_IFU_20251124
github-actions[bot] Nov 24, 2025
f742da3
Merge pull request #2827 from ROCm/develop_IFU_20251124
pragupta Nov 25, 2025
979dce4
Merge remote-tracking branch 'upstream/main' into develop_IFU_20260119
github-actions[bot] Jan 19, 2026
7e17fb9
Fix merge conflicts + bump triton to 3.6.x branch
pragupta Jan 19, 2026
4d67363
Remove stale opentelemetry-cpp submodule
Jan 20, 2026
fe101ec
Merge pull request #2915 from ROCm/develop_IFU_20260119
pragupta Jan 20, 2026
241aa87
Merge remote-tracking branch 'upstream/main' into develop_IFU_20260211
github-actions[bot] Feb 11, 2026
3ee04a9
Fix merge conflicts
pragupta Feb 12, 2026
cc3acaf
Merge pull request #2969 from ROCm/develop_IFU_20260211
pragupta Feb 12, 2026
3fb1b1c
Merge remote-tracking branch 'upstream/main' into develop_IFU_20260218
github-actions[bot] Feb 18, 2026
02bdd61
Automate IFU issue creation and author assignment (#2997)
chinmaydk99 Feb 27, 2026
a0f3692
Merge pull request #2989 from ROCm/develop_IFU_20260218
pragupta Feb 27, 2026
af4f7f5
Fix Issue creation workflow to filter ROCM-only commits (#3017)
chinmaydk99 Mar 2, 2026
7735e5b
Fix automatic issue creation workflow to filter ROCM-only commits (#3…
chinmaydk99 Mar 2, 2026
44ed9df
Merge remote-tracking branch 'upstream/main' into develop_IFU_20260316
github-actions[bot] Mar 16, 2026
0168e75
Fix merge conflicts
pragupta Mar 16, 2026
ebc32c3
Merge pull request #3069 from ROCm/develop_IFU_20260316
pragupta Mar 16, 2026
fb6e4ef
[develop] Update create_ifu_tag to run via workflow_dispatch and PR n…
pragupta Mar 17, 2026
79e8877
[CI]Add parity report scripts and workflow (#3094)
ethanwee1 Apr 10, 2026
16e431d
[CI] Improve summary output and add log based failure detection for p…
ethanwee1 Apr 13, 2026
1b685db
Add Docker build workflow using public TheRock wheels (#3149)
ethanwee1 Apr 15, 2026
e0f6b16
Fix Docker Hub secret names for build_portable_linux_pytorch_dockers …
ethanwee1 Apr 15, 2026
293ee53
Make gfx94x-dcgpu the default since theRock CI currently runs full te…
jithunnair-amd Apr 16, 2026
9f8ad3e
[CI] Show only ROCm failures in parity summary and add cross-arch col…
ethanwee1 Apr 23, 2026
f401954
Ensure one of pr_id/sha1 is provided to download_testlogs
jithunnair-amd Apr 30, 2026
2479e0e
download_testlogs: use CUDA OSDC test names (#3199)
ethanwee1 May 4, 2026
467069a
[CI] Update MI355 parity shard counts (#3213)
ethanwee1 May 12, 2026
73d3e63
Update Github token used for parity.yml (#3224)
jithunnair-amd May 14, 2026
1d74079
download_testlogs: select CUDA test artifact kind dynamically (#3226)
ethanwee1 May 14, 2026
69b53d4
download_testlogs: use mi200-specific parity jobs (#3229)
ethanwee1 May 18, 2026
029ac70
[CI] Handle large parity summary CSV fields (#3240)
ethanwee1 May 20, 2026
2a10123
[ROCm] Fix TorchScript JIT BF16 HIPRTC overload conflict (ROCM-23829)
srinivamd May 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 178 additions & 0 deletions .automation_scripts/parse_xml_results.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
""" The Python PyTorch testing script.
##
# Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved.
#
# 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:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# 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
# 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.
"""

import xml.etree.ElementTree as ET
from pathlib import Path
from typing import Any, Dict, Tuple

# Backends list
BACKENDS_LIST = [
"dist-gloo",
"dist-nccl"
]

TARGET_WORKFLOW = "--rerun-disabled-tests"

def get_job_id(report: Path) -> int:
# [Job id in artifacts]
# Retrieve the job id from the report path. In our GHA workflows, we append
# the job id to the end of the report name, so `report` looks like:
# unzipped-test-reports-foo_5596745227/test/test-reports/foo/TEST-foo.xml
# and we want to get `5596745227` out of it.
try:
return int(report.parts[0].rpartition("_")[2])
except ValueError:
return -1

def is_rerun_disabled_tests(root: ET.ElementTree) -> bool:
"""
Check if the test report is coming from rerun_disabled_tests workflow
"""
skipped = root.find(".//*skipped")
# Need to check against None here, if not skipped doesn't work as expected
if skipped is None:
return False

message = skipped.attrib.get("message", "")
return TARGET_WORKFLOW in message or "num_red" in message

def parse_xml_report(
tag: str,
report: Path,
workflow_id: int,
workflow_run_attempt: int,
work_flow_name: str
) -> Dict[Tuple[str], Dict[str, Any]]:
"""Convert a test report xml file into a JSON-serializable list of test cases."""
print(f"Parsing {tag}s for test report: {report}")

job_id = get_job_id(report)
print(f"Found job id: {job_id}")

test_cases: Dict[Tuple[str], Dict[str, Any]] = {}

root = ET.parse(report)
# TODO: unlike unittest, pytest-flakefinder used by rerun disabled tests for test_ops
# includes skipped messages multiple times (50 times by default). This slows down
# this script too much (O(n)) because it tries to gather all the stats. This should
# be fixed later in the way we use pytest-flakefinder. A zipped test report from rerun
# disabled test is only few MB, but will balloon up to a much bigger XML file after
# extracting from a dozen to few hundred MB
if is_rerun_disabled_tests(root):
return test_cases

for test_case in root.iter(tag):
case = process_xml_element(test_case)
if tag == 'testcase':
case["workflow_id"] = workflow_id
case["workflow_run_attempt"] = workflow_run_attempt
case["job_id"] = job_id
case["work_flow_name"] = work_flow_name

# [invoking file]
# The name of the file that the test is located in is not necessarily
# the same as the name of the file that invoked the test.
# For example, `test_jit.py` calls into multiple other test files (e.g.
# jit/test_dce.py). For sharding/test selection purposes, we want to
# record the file that invoked the test.
#
# To do this, we leverage an implementation detail of how we write out
# tests (https://bit.ly/3ajEV1M), which is that reports are created
# under a folder with the same name as the invoking file.
case_name = report.parent.name
for ind in range(len(BACKENDS_LIST)):
if BACKENDS_LIST[ind] in report.parts:
case_name = case_name + "_" + BACKENDS_LIST[ind]
break
case["invoking_file"] = case_name
test_cases[ ( case["invoking_file"], case["classname"], case["name"], case["work_flow_name"] ) ] = case
elif tag == 'testsuite':
case["work_flow_name"] = work_flow_name
case["invoking_xml"] = report.name
case["running_time_xml"] = case["time"]
case_name = report.parent.name
for ind in range(len(BACKENDS_LIST)):
if BACKENDS_LIST[ind] in report.parts:
case_name = case_name + "_" + BACKENDS_LIST[ind]
break
case["invoking_file"] = case_name

test_cases[ ( case["invoking_file"], case["invoking_xml"], case["work_flow_name"] ) ] = case

return test_cases

def process_xml_element(element: ET.Element) -> Dict[str, Any]:
"""Convert a test suite element into a JSON-serializable dict."""
ret: Dict[str, Any] = {}

# Convert attributes directly into dict elements.
# e.g.
# <testcase name="test_foo" classname="test_bar"></testcase>
# becomes:
# {"name": "test_foo", "classname": "test_bar"}
ret.update(element.attrib)

# The XML format encodes all values as strings. Convert to ints/floats if
# possible to make aggregation possible in Rockset.
for k, v in ret.items():
try:
ret[k] = int(v)
except ValueError:
pass
try:
ret[k] = float(v)
except ValueError:
pass

# Convert inner and outer text into special dict elements.
# e.g.
# <testcase>my_inner_text</testcase> my_tail
# becomes:
# {"text": "my_inner_text", "tail": " my_tail"}
if element.text and element.text.strip():
ret["text"] = element.text
if element.tail and element.tail.strip():
ret["tail"] = element.tail

# Convert child elements recursively, placing them at a key:
# e.g.
# <testcase>
# <foo>hello</foo>
# <foo>world</foo>
# <bar>another</bar>
# </testcase>
# becomes
# {
# "foo": [{"text": "hello"}, {"text": "world"}],
# "bar": {"text": "another"}
# }
for child in element:
if child.tag not in ret:
ret[child.tag] = process_xml_element(child)
else:
# If there are multiple tags with the same name, they should be
# coalesced into a list.
if not isinstance(ret[child.tag], list):
ret[child.tag] = [ret[child.tag]]
ret[child.tag].append(process_xml_element(child))
return ret
Loading