Files
TheRock/external-builds/pytorch/run_pytorch_smoke_tests.py
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

155 lines
4.5 KiB
Python

# Copyright Advanced Micro Devices, Inc.
# SPDX-License-Identifier: MIT
"""PyTorch ROCm Smoke Tests Runner.
This script runs PyTorch smoke tests using pytest.
Usage Examples
--------------
Basic usage (auto-detect GPU):
$ python run_pytorch_smoke_tests.py
Specify GPU family:
$ python run_pytorch_smoke_tests.py --amdgpu-family gfx942
Pass additional pytest arguments after "--":
$ python run_pytorch_smoke_tests.py -- -m "slow"
$ python run_pytorch_tests.py -- --tb=short -x
"""
import argparse
import os
import subprocess
import sys
from pathlib import Path
from pytorch_utils import (
get_unique_supported_devices,
reconcile_agent_visibility_env,
set_gpu_execution_policy,
)
THIS_SCRIPT_DIR = Path(__file__).resolve().parent
def setup_env() -> None:
"""Set up environment variables required for the smoke tests."""
reconcile_agent_visibility_env()
def cmd_arguments(argv: list[str]) -> tuple[argparse.Namespace, list[str]]:
"""Parse command line arguments.
Args:
argv: Command line arguments (without program name).
Returns:
Tuple of (parsed args, passthrough pytest args passed after "--").
"""
# Extract passthrough pytest args after "--"
try:
rest_pos = argv.index("--")
except ValueError:
passthrough_pytest_args = []
else:
passthrough_pytest_args = argv[rest_pos + 1 :]
argv = argv[:rest_pos]
parser = argparse.ArgumentParser(
description="""
Runs PyTorch smoke-tests for AMD GPUs.
All arguments after "--" are passed directly to pytest (e.g. -p no:cacheprovider).
"""
)
parser.add_argument(
"--amdgpu-family",
type=str,
default=os.getenv("AMDGPU_FAMILY", ""),
required=False,
help="""Amdgpu family (e.g. "gfx942").
Select (potentially) additional tests to be skipped based on the amdgpu family""",
)
args = parser.parse_args(argv)
return args, passthrough_pytest_args
def main() -> int:
"""Main entry point for the PyTorch smoke-tests runner.
Returns:
Exit code from pytest (0 for success, non-zero for failures).
Returns non-zero if any device's tests fail.
"""
try:
args, passthrough_pytest_args = cmd_arguments(sys.argv[1:])
# Assumes that the smoke-tests are located in the same directory as this script
smoke_tests_dir = THIS_SCRIPT_DIR / "smoke-tests"
if not smoke_tests_dir.exists():
print(f"ERROR: Directory at '{smoke_tests_dir}' does not exist.")
sys.exit(1)
setup_env()
# CRITICAL: Query unique devices for iteration.
# HIP_VISIBLE_DEVICES will be set inside set_gpu_execution_policy.
unique_devices = get_unique_supported_devices(args.amdgpu_family)
print(f"Will run smoke tests on {len(unique_devices)} unique device(s)")
# Track overall success
overall_retcode = 0
pytest_args = [
f"{smoke_tests_dir}",
]
# Append any passthrough pytest args passed after "--"
pytest_args.extend(passthrough_pytest_args)
# Run smoke tests for each unique device iteratively using offset
for offset in range(len(unique_devices)):
# Set HIP_VISIBLE_DEVICES for this specific device using "single" policy
((arch, device_idx),) = set_gpu_execution_policy(
unique_devices, policy="single", offset=offset
)
print(f"\n{'='*60}")
print(f"Running smoke tests on device {device_idx} ({arch})")
print(f"{'='*60}")
# Use a subprocess so PyTorch re-reads HIP_VISIBLE_DEVICES per device.
result = subprocess.run(
[sys.executable, "-m", "pytest", *pytest_args],
env=os.environ.copy(),
)
retcode = result.returncode
print(
f"Pytest finished for device {device_idx} ({arch}) with return code: {retcode}"
)
# Track if any test run failed
if retcode != 0:
overall_retcode = retcode
print(f"\n{'='*60}")
print(f"All smoke tests completed. Overall return code: {overall_retcode}")
print(f"{'='*60}")
return overall_retcode
except (ValueError, IndexError) as e:
print(f"[ERROR] Exception in PyTorch smoke-tests runner: {e}")
sys.exit(1)
if __name__ == "__main__":
# Lets make this script return pytest exit code (success or failure)
sys.exit(main())