Files
wehub-resource-sync e64161ec32
Release / release_and_publish (push) Waiting to run
CI / ci (3.11) (push) Has been cancelled
CI / ci (3.10) (push) Has been cancelled
CI / dependabot (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:36:15 +08:00

69 lines
2.5 KiB
Python

"""Utilities shared by benchmark evaluators."""
from __future__ import annotations
import importlib
import logging
import re
from typing import Dict, Iterable, List
logger = logging.getLogger(__name__)
def _guess_dataset_var(mod_path: str) -> str:
"""Guess the dataset variable name from an OpenCompass module path.
Convention: ``opencompass.configs.datasets.<name>.<name>_gen_<hash>``
exports ``<name>_datasets``. E.g.:
- ``bbh.bbh_gen_ee62e9`` → ``bbh_datasets``
- ``gsm8k.gsm8k_gen_1d7fe4`` → ``gsm8k_datasets``
- ``ARC_c.ARC_c_gen_1e0de5`` → ``ARC_c_datasets``
"""
# Take the parent package name (e.g. "bbh" from "...datasets.bbh.bbh_gen_xxx")
parts = mod_path.rsplit(".", 2)
if len(parts) >= 2:
parent = parts[-2] # e.g. "bbh", "gsm8k", "ARC_c"
return f"{parent}_datasets"
return "datasets"
def build_dataset_imports_explicit(dataset_imports: str | Iterable[str]) -> List[Dict[str, object]]:
"""Build explicit dataset import specs for the OpenCompass config template.
Resolve explicit dataset variable names to avoid `import *`, which leaks
non-serializable objects (e.g. `os`, `f` from BBH) and breaks mmengine's
config dump+reload in the CLI.
The returned structure matches `opencompass_template.yaml` expectation:
`[{ "module": "...", "names": ["datasets", "..._datasets"] }, ...]`.
"""
modules = [dataset_imports] if isinstance(dataset_imports, str) else list(dataset_imports)
explicit: List[Dict[str, object]] = []
for mod_path in modules:
try:
mod = importlib.import_module(mod_path)
names = [
attr
for attr in dir(mod)
if (attr == "datasets" or attr.endswith("_datasets")) and isinstance(getattr(mod, attr), list)
]
if not names:
guessed = _guess_dataset_var(mod_path)
logger.warning(
"No dataset variables found in %s, guessing '%s'",
mod_path,
guessed,
)
names = [guessed]
explicit.append({"module": mod_path, "names": names})
except Exception as e:
guessed = _guess_dataset_var(mod_path)
logger.warning(
"Failed to import %s for explicit name resolution: %s. " "Guessing variable name '%s'.",
mod_path,
e,
guessed,
)
explicit.append({"module": mod_path, "names": [guessed]})
return explicit