Files
wehub-resource-sync 593b94c120
pytest / Unit Tests (push) Has been cancelled
pytest / Integration (integration_tests_a) (push) Has been cancelled
pytest / Integration (integration_tests_b) (push) Has been cancelled
pytest / Integration (integration_tests_c) (push) Has been cancelled
pytest / Integration (integration_tests_d) (push) Has been cancelled
pytest / Integration (integration_tests_e) (push) Has been cancelled
pytest / Integration (integration_tests_f) (push) Has been cancelled
pytest / Integration (integration_tests_g) (push) Has been cancelled
pytest / Integration (integration_tests_h) (push) Has been cancelled
pytest / Integration (integration_tests_i) (push) Has been cancelled
pytest / Integration (integration_tests_j) (push) Has been cancelled
pytest / Distributed (distributed_a) (push) Has been cancelled
pytest / Distributed (distributed_b) (push) Has been cancelled
pytest / Distributed (distributed_c) (push) Has been cancelled
pytest / Distributed (distributed_d) (push) Has been cancelled
pytest / Distributed (distributed_e) (push) Has been cancelled
pytest / Distributed (distributed_f) (push) Has been cancelled
pytest / Minimal Install (push) Has been cancelled
pytest / Event File (push) Has been cancelled
pytest (slow) / py-slow (push) Has been cancelled
Publish JSON Schema / publish-schema (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:49:20 +08:00

85 lines
3.8 KiB
Python

import os
import pytest
from expected_metric import ExpectedMetric
from ludwig.benchmarking.benchmark import benchmark
from ludwig.utils.data_utils import load_yaml
from tests.integration_tests.utils import parse_flag_from_env
SKIPPED_CONFIG_ISSUES = {
"mercedes_benz_greener.ecd.yaml": "https://github.com/ludwig-ai/ludwig/issues/2978",
"sarcos.ecd.yaml": "Takes more than 300s",
"ames_housing.ecd.yaml": "https://github.com/ludwig-ai/ludwig/issues/3344",
"adult_census_income.ecd.yaml": "UCI ML repo (archive.ics.uci.edu) is unavailable, dataset cannot be downloaded",
}
CONFIGS_REQUIRING_DATASET_CREDENTIALS = {
"mercedes_benz_greener.ecd.yaml",
"ames_housing.ecd.yaml",
}
RUN_PRIVATE = parse_flag_from_env("RUN_PRIVATE", default=False)
def update_skipped_configs_issues(config_filename):
if not RUN_PRIVATE and config_filename in CONFIGS_REQUIRING_DATASET_CREDENTIALS:
SKIPPED_CONFIG_ISSUES[config_filename] = "Requires credentials. Can't run from a forked repo."
def get_test_config_filenames() -> list[str]:
"""Return list of the config filenames used for benchmarking."""
benchmark_directory = "/".join(__file__.split("/")[:-1] + ["configs"])
return [config_fp for config_fp in os.listdir(benchmark_directory)]
def get_dataset_from_config_path(config_path: str) -> str:
"""path/to/config/<dataset>.<descriptors>.yaml -> dataset."""
return os.path.basename(config_path).split(".")[0]
@pytest.mark.benchmark
@pytest.mark.parametrize("config_filename", get_test_config_filenames())
def test_performance(config_filename, tmpdir):
update_skipped_configs_issues(config_filename)
if config_filename in SKIPPED_CONFIG_ISSUES:
pytest.skip(reason=SKIPPED_CONFIG_ISSUES[config_filename])
return
benchmark_directory = "/".join(__file__.split("/")[:-1])
config_path = os.path.join(benchmark_directory, "configs", config_filename)
expected_test_statistics_fp = os.path.join(benchmark_directory, "expected_metrics", config_filename)
dataset_name = get_dataset_from_config_path(config_path)
if not os.path.exists(expected_test_statistics_fp):
raise FileNotFoundError("""No corresponding expected metrics found for benchmarking config '{config_path}'.
Please add a new metrics YAML file '{expected_test_statistics_fp}'. Suggested content:
metrics:
- output_feature_name: <YOUR_OUTPUT_FEATURE e.g. SalePrice>
metric_name: <YOUR METRIC NAME e.g. accuracy>
expected_value: <A FLOAT VALUE>
tolerance_percent: 0.15""")
expected_metrics_dict = load_yaml(expected_test_statistics_fp)
benchmarking_config = {
"experiment_name": "regression_test",
"export": {"export_artifacts": True, "export_base_path": tmpdir},
"experiments": [{"dataset_name": dataset_name, "config_path": config_path}],
}
benchmarking_artifacts = benchmark(benchmarking_config)
experiment_artifact, err = benchmarking_artifacts[dataset_name]
if err is not None:
raise err
expected_metrics: list[ExpectedMetric] = [
ExpectedMetric.from_dict(expected_metric) for expected_metric in expected_metrics_dict["metrics"]
]
for expected_metric in expected_metrics:
tolerance = expected_metric.tolerance_percentage * expected_metric.expected_value
output_feature_name = expected_metric.output_feature_name
metric_name = expected_metric.metric_name
experiment_metric_value = experiment_artifact.test_statistics[output_feature_name][metric_name]
assert abs(expected_metric.expected_value - experiment_metric_value) <= tolerance, (
f"The obtained {metric_name} value ({experiment_metric_value}) was not within"
f" {100 * expected_metric.tolerance_percentage}% of the expected value ({expected_metric.expected_value})."
)