| |
| |
| |
| |
|
|
| import logging |
| import os |
| from typing import Any |
|
|
| import torch |
| from omegaconf import OmegaConf |
|
|
| import dinov3.distributed |
| from dinov3.eval import results |
|
|
| logger = logging.getLogger("dinov3") |
|
|
| CONFIG_FILE_KEY = "config_file" |
| EVAL_CONFIG_FNAME = "eval_config.yaml" |
|
|
|
|
| def write_results(results_dict, output_dir, results_filename) -> None: |
| """Save only on main if cuda is available""" |
| if torch.cuda.is_available() and not dinov3.distributed.is_main_process(): |
| return |
| results_path = os.path.join(output_dir, results_filename) |
| logger.info(f"Saving results to {results_path}") |
| results.save_from_dict(results_dict=results_dict, results_path=results_path) |
|
|
|
|
| def args_dict_to_dataclass(eval_args: dict[str, object], config_dataclass, save_config: bool = True) -> tuple[Any, str]: |
| """ |
| eval_args : arguments passed to create the eval config. |
| `CONFIG_FILE_KEY` is a reserved name to load a set of parameters from a config file. |
| config_dataclass: a dataclass used to define the config arguments, types and default values |
| save_config : whether to save the config in a file named `EVAL_CONFIG_FNAME` in the output_dir |
| """ |
| if CONFIG_FILE_KEY in eval_args: |
| config_file = eval_args.pop(CONFIG_FILE_KEY) |
| eval_args_config = OmegaConf.merge(OmegaConf.load(config_file), OmegaConf.create(eval_args)) |
| else: |
| eval_args_config = OmegaConf.create(eval_args) |
|
|
| structured_config = OmegaConf.merge(OmegaConf.structured(config_dataclass), eval_args_config) |
| logger.info(f"Evaluation Configuration:\n{OmegaConf.to_yaml(structured_config)}") |
| output_dir = structured_config.output_dir |
|
|
| if save_config and dinov3.distributed.is_main_process(): |
| OmegaConf.save(config=structured_config, f=os.path.join(output_dir, EVAL_CONFIG_FNAME)) |
|
|
| return OmegaConf.to_object(structured_config), output_dir |
|
|
|
|
| def cli_parser(argv: list[str]) -> tuple[dict[str, Any]]: |
| """ |
| a method to parse argv and output a dict of eval arguments, and model building arguments. |
| - `argv` can come from the command line directly, or from a subset of the command line arguments, |
| as in dinov3.run.submitit |
| - `output_dir` can either be passed as `output_dir=` or `--output-dir=` (to support dinov3.run.submitit) |
| """ |
| cli_eval_args_dict = OmegaConf.to_container(OmegaConf.from_cli(argv)) |
| if "output_dir" not in cli_eval_args_dict: |
| cli_eval_args_dict["output_dir"] = cli_eval_args_dict.pop("--output-dir", ".") |
| return cli_eval_args_dict |
|
|