mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-21 21:49:24 +08:00
Pull Request resolved: https://github.com/pytorch/pytorch/pull/129375 Approved by: https://github.com/malfet
169 lines
5.0 KiB
Python
169 lines
5.0 KiB
Python
from __future__ import annotations
|
|
|
|
import argparse
|
|
import os
|
|
from typing import cast
|
|
|
|
from ..util.setting import (
|
|
CompilerType,
|
|
JSON_FOLDER_BASE_DIR,
|
|
LOG_DIR,
|
|
Option,
|
|
Test,
|
|
TestList,
|
|
TestType,
|
|
)
|
|
from ..util.utils import (
|
|
clean_up,
|
|
create_folder,
|
|
print_log,
|
|
raise_no_test_found_exception,
|
|
remove_file,
|
|
remove_folder,
|
|
)
|
|
from ..util.utils_init import add_arguments_utils, create_folders, get_options
|
|
from .utils import (
|
|
clean_up_gcda,
|
|
detect_compiler_type,
|
|
get_llvm_tool_path,
|
|
get_oss_binary_folder,
|
|
get_pytorch_folder,
|
|
)
|
|
|
|
|
|
BLOCKED_PYTHON_TESTS = {
|
|
"run_test.py",
|
|
"test_dataloader.py",
|
|
"test_multiprocessing.py",
|
|
"test_multiprocessing_spawn.py",
|
|
"test_utils.py",
|
|
}
|
|
|
|
|
|
def initialization() -> tuple[Option, TestList, list[str]]:
|
|
# create folder if not exists
|
|
create_folders()
|
|
# add arguments
|
|
parser = argparse.ArgumentParser()
|
|
parser = add_arguments_utils(parser)
|
|
parser = add_arguments_oss(parser)
|
|
# parse arguments
|
|
(options, args_interested_folder, args_run_only, arg_clean) = parse_arguments(
|
|
parser
|
|
)
|
|
# clean up
|
|
if arg_clean:
|
|
clean_up_gcda()
|
|
clean_up()
|
|
# get test lists
|
|
test_list = get_test_list(args_run_only)
|
|
# get interested folder -- final report will only over these folders
|
|
interested_folders = empty_list_if_none(args_interested_folder)
|
|
# print initialization information
|
|
print_init_info()
|
|
# remove last time's log
|
|
remove_file(os.path.join(LOG_DIR, "log.txt"))
|
|
return (options, test_list, interested_folders)
|
|
|
|
|
|
def add_arguments_oss(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
|
|
parser.add_argument(
|
|
"--run-only",
|
|
help="only run certain test(s), for example: atest test_nn.py.",
|
|
nargs="*",
|
|
default=None,
|
|
)
|
|
|
|
return parser
|
|
|
|
|
|
def parse_arguments(
|
|
parser: argparse.ArgumentParser,
|
|
) -> tuple[Option, list[str] | None, list[str] | None, bool | None]:
|
|
# parse args
|
|
args = parser.parse_args()
|
|
# get option
|
|
options = get_options(args)
|
|
return (options, args.interest_only, args.run_only, args.clean)
|
|
|
|
|
|
def get_test_list_by_type(run_only: list[str] | None, test_type: TestType) -> TestList:
|
|
test_list: TestList = []
|
|
binary_folder = get_oss_binary_folder(test_type)
|
|
g = os.walk(binary_folder)
|
|
for _, _, file_list in g:
|
|
for file_name in file_list:
|
|
if run_only is not None and file_name not in run_only:
|
|
continue
|
|
# target pattern in oss is used in printing report -- which tests we have run
|
|
test: Test = Test(
|
|
name=file_name,
|
|
target_pattern=file_name,
|
|
test_set="",
|
|
test_type=test_type,
|
|
)
|
|
test_list.append(test)
|
|
return test_list
|
|
|
|
|
|
def get_test_list(run_only: list[str] | None) -> TestList:
|
|
test_list: TestList = []
|
|
# add c++ test list
|
|
test_list.extend(get_test_list_by_type(run_only, TestType.CPP))
|
|
# add python test list
|
|
py_run_only = get_python_run_only(run_only)
|
|
test_list.extend(get_test_list_by_type(py_run_only, TestType.PY))
|
|
|
|
# not find any test to run
|
|
if not test_list:
|
|
raise_no_test_found_exception(
|
|
get_oss_binary_folder(TestType.CPP), get_oss_binary_folder(TestType.PY)
|
|
)
|
|
return test_list
|
|
|
|
|
|
def empty_list_if_none(arg_interested_folder: list[str] | None) -> list[str]:
|
|
if arg_interested_folder is None:
|
|
return []
|
|
# if this argument is specified, just return itself
|
|
return arg_interested_folder
|
|
|
|
|
|
def gcc_export_init() -> None:
|
|
remove_folder(JSON_FOLDER_BASE_DIR)
|
|
create_folder(JSON_FOLDER_BASE_DIR)
|
|
|
|
|
|
def get_python_run_only(args_run_only: list[str] | None) -> list[str]:
|
|
# if user specifies run-only option
|
|
if args_run_only:
|
|
return args_run_only
|
|
|
|
# if not specified, use default setting, different for gcc and clang
|
|
if detect_compiler_type() == CompilerType.GCC:
|
|
return ["run_test.py"]
|
|
else:
|
|
# for clang, some tests will result in too large intermediate files that can't be merged by llvm, we need to skip them
|
|
run_only: list[str] = []
|
|
binary_folder = get_oss_binary_folder(TestType.PY)
|
|
g = os.walk(binary_folder)
|
|
for _, _, file_list in g:
|
|
for file_name in file_list:
|
|
if file_name in BLOCKED_PYTHON_TESTS or not file_name.endswith(".py"):
|
|
continue
|
|
run_only.append(file_name)
|
|
# only run tests in the first-level folder in test/
|
|
break
|
|
return run_only
|
|
|
|
|
|
def print_init_info() -> None:
|
|
print_log("pytorch folder: ", get_pytorch_folder())
|
|
print_log("cpp test binaries folder: ", get_oss_binary_folder(TestType.CPP))
|
|
print_log("python test scripts folder: ", get_oss_binary_folder(TestType.PY))
|
|
print_log("compiler type: ", cast(CompilerType, detect_compiler_type()).value)
|
|
print_log(
|
|
"llvm tool folder (only for clang, if you are using gcov please ignore it): ",
|
|
get_llvm_tool_path(),
|
|
)
|