mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 21:14:14 +08:00
Pull Request resolved: https://github.com/pytorch/pytorch/pull/164688 Approved by: https://github.com/pianpwk ghstack dependencies: #164432, #164434, #164514, #164646, #164647, #164649, #164687
134 lines
4.2 KiB
Python
134 lines
4.2 KiB
Python
"""
|
|
Program runner utilities for PyTorch fuzzer.
|
|
This module handles running and testing generated PyTorch programs.
|
|
"""
|
|
|
|
import os
|
|
import random
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
class ProgramRunner:
|
|
"""Runs generated PyTorch programs and handles output/error reporting."""
|
|
|
|
def __init__(self):
|
|
pass
|
|
|
|
def run_program(self, program_path):
|
|
"""
|
|
Run a generated Python program and handle output/errors.
|
|
|
|
Args:
|
|
program_path: Path to the Python program to run
|
|
|
|
Returns:
|
|
bool: True if program ran successfully, False otherwise
|
|
"""
|
|
abs_path = os.path.abspath(program_path)
|
|
print(f"Running: {abs_path}")
|
|
|
|
# Select a random CUDA device if available
|
|
cuda_visible_devices = os.environ.get("CUDA_VISIBLE_DEVICES")
|
|
if cuda_visible_devices:
|
|
devices = [d.strip() for d in cuda_visible_devices.split(",") if d.strip()]
|
|
else:
|
|
# Default to all GPUs if not set
|
|
try:
|
|
import torch
|
|
|
|
num_gpus = torch.cuda.device_count()
|
|
devices = [str(i) for i in range(num_gpus)]
|
|
except ImportError:
|
|
devices = []
|
|
if devices:
|
|
selected_device = random.choice(devices)
|
|
env = os.environ.copy()
|
|
env["CUDA_VISIBLE_DEVICES"] = selected_device
|
|
print(f"Selected CUDA_VISIBLE_DEVICES={selected_device}")
|
|
else:
|
|
env = None # No GPU available or torch not installed
|
|
|
|
try:
|
|
result = subprocess.run(
|
|
[sys.executable, abs_path],
|
|
capture_output=True,
|
|
text=True,
|
|
check=True,
|
|
env=env,
|
|
)
|
|
print("=== Program Output ===")
|
|
print(result.stdout)
|
|
print(result.stderr)
|
|
return True
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
print("=== Program Output (Failure) ===")
|
|
print(e.stdout)
|
|
print(e.stderr)
|
|
print("===============================")
|
|
print("=== Program Source ===")
|
|
with open(abs_path) as f:
|
|
print(f.read())
|
|
print("======================")
|
|
print(f"Program exited with code: {e.returncode}")
|
|
sys.exit(1)
|
|
|
|
def run_and_validate(self, program_path):
|
|
"""
|
|
Run a program and return detailed results for validation.
|
|
|
|
Args:
|
|
program_path: Path to the Python program to run
|
|
|
|
Returns:
|
|
dict: Dictionary with 'success', 'stdout', 'stderr', 'returncode'
|
|
"""
|
|
abs_path = os.path.abspath(program_path)
|
|
|
|
# Select a random CUDA device if available
|
|
cuda_visible_devices = os.environ.get("CUDA_VISIBLE_DEVICES")
|
|
if cuda_visible_devices:
|
|
devices = [d.strip() for d in cuda_visible_devices.split(",") if d.strip()]
|
|
else:
|
|
try:
|
|
import torch
|
|
|
|
num_gpus = torch.cuda.device_count()
|
|
if num_gpus > 1:
|
|
devices = [str(i) for i in range(1, num_gpus)]
|
|
else:
|
|
devices = [str(i) for i in range(num_gpus)]
|
|
except ImportError:
|
|
devices = []
|
|
if devices:
|
|
selected_device = random.choice(devices)
|
|
env = os.environ.copy()
|
|
env["CUDA_VISIBLE_DEVICES"] = selected_device
|
|
print(f"Selected CUDA_VISIBLE_DEVICES={selected_device}")
|
|
else:
|
|
env = None
|
|
|
|
try:
|
|
result = subprocess.run(
|
|
[sys.executable, abs_path],
|
|
capture_output=True,
|
|
text=True,
|
|
check=True,
|
|
env=env,
|
|
)
|
|
return {
|
|
"success": True,
|
|
"stdout": result.stdout,
|
|
"stderr": result.stderr,
|
|
"returncode": result.returncode,
|
|
}
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
return {
|
|
"success": False,
|
|
"stdout": e.stdout,
|
|
"stderr": e.stderr,
|
|
"returncode": e.returncode,
|
|
}
|