Skip to content

[ROCm][Windows] Fixing undefined symbol linker error after exposing MIOpen symbols #2415

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 33 commits into
base: release/2.8
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
8734655
[release/2.8] Enable wheels
jithunnair-amd Apr 22, 2025
dc95b0c
Updates to build for Noble (Ubuntu 24.04) and py3.12
jithunnair-amd Jul 15, 2025
b741af3
[release/2.8] Make triton build ROCm version agnostic
ethanwee1 May 20, 2025
b4c293a
[release/2.8] Replace upstream install_rocm_magma.sh with rocm fork v…
jithunnair-amd Jul 16, 2025
9ed3d2e
[release/2.8] Upgrade numpy versions; Use different package versions …
jithunnair-amd Jul 16, 2025
12508fd
[release/2.8] Removing --user flag from all pip install commands
ethanwee1 Jun 19, 2025
90d7d4b
[ROCm] Remove use of warpsize on host-side compilation (pytorch#156979)
jithunnair-amd Jul 16, 2025
186180d
[release/2.8] Improve C10_WARP_SIZE compatibility
xinyazhang Jul 16, 2025
8e7b99f
Fix sha256 for aotriton ROCm7.0 tarball
jithunnair-amd Jul 16, 2025
d7c64fc
Update third_party/composable_kernel submodule commit as per https://…
jithunnair-amd Jul 16, 2025
b81d4d1
Use ROCm/triton and update triton.txt
jithunnair-amd Jul 16, 2025
98e9537
Add related_commits file (#2396)
pragupta Jul 22, 2025
12a145a
Add QA automation scripts for running PyTorch unit tests
jithunnair-amd Feb 19, 2025
3c7ddbf
[release/2.6] enable NHWC batchnorm with MIOpen (#2023)
dnikolaev-amd Apr 11, 2025
fb20451
test_decompose_mem_bound_mm.py tolerance increase for navi3x
iupaikov-amd May 13, 2025
32449c9
[release/2.7] enable NHWC batchnorm by default on ROCm7.0+ (#2180)
dnikolaev-amd May 22, 2025
23f0b5f
[release/2.7] import 'Dict' to fix common_utils.py (#2181)
dnikolaev-amd May 24, 2025
48630d8
[AUTOGENERATED] [release/2.7] [rocm6.4_internal_testing] Replaced ROC…
okakarpa May 29, 2025
ae17c3a
[release/2.7] [SWDEV-535259] enable miopen channels last 3d for conv …
okakarpa Jun 4, 2025
e4d62b1
[AUTOGENERATED] [release/2.7] Add 3D batchnorm tests (#2243)
okakarpa Jun 4, 2025
d40f3c8
[AUTOGENERATED] [release/2.5] [ROCm][layer_norm] Use __builtin_amdgcn…
rocm-mici Dec 18, 2024
dbb9f2a
[release/2.6] remove xfail from 'batch_norm_with_update' (#2070)
dnikolaev-amd Apr 30, 2025
e62e394
[release/2.7] Enable mx fp8 support on ROCm (#2199)
jagadish-amd Jun 4, 2025
e0160f1
Extend CK gemm/sdpa support to gfx950 (#45)
alugorey Apr 2, 2025
08390c7
[release/2.6] [SWDEV-529824] Fix Float16 CooperativeReduction Test Fa…
pmaybank May 29, 2025
01857c6
[ROCm] Set thread_work_size to 16 for vectorized elementwise kernels …
jerrymannil Jun 10, 2025
e60c0c4
[release/2.7] Fix SDPA skip logic (#2281)
AmdSampsa Jun 19, 2025
01eaee8
[release/2.7] Update test_binary_ufuncs.py after numpy upgrade (#2289)
ethanwee1 Jul 1, 2025
80e8974
[AUTOGENERATED] [release/2.7] fix jit_utils.cpp (#2320)
okakarpa Jul 8, 2025
bb44c0c
Clean up CUDA state between tests (#2335)
rraminen Jul 14, 2025
1f312c4
cublaslt/hipblaslt persistent workspace (#156495)
jeffdaily Jun 28, 2025
3b7f377
[AUTOGENERATED] [release/2.7] [release/2.6] Fix dtype before comparin…
okakarpa Jul 15, 2025
8b23614
[ROCm][Windows] Fixing undefined symbol linker error after exposing M…
tvukovic-amd Jun 27, 2025
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