-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheval.py
More file actions
105 lines (77 loc) · 3.17 KB
/
Copy patheval.py
File metadata and controls
105 lines (77 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
from typing import Any
import hydra
from lightning import Callback, LightningDataModule, LightningModule, Trainer
from lightning.pytorch.loggers import Logger
from omegaconf import DictConfig
from genesis.utils import (
RankedLogger,
extras,
instantiate_callbacks,
instantiate_loggers,
log_hyperparameters,
pre_hydra_routine,
task_wrapper,
)
log = RankedLogger(__name__, rank_zero_only=True)
@task_wrapper
def evaluate(cfg: DictConfig) -> tuple[dict[str, Any], dict[str, Any]]:
"""Evaluates given checkpoint on a datamodule test set.
This method is wrapped in optional @task_wrapper decorator, that controls the behavior during failure. Useful for
multiruns, saving info about the crash, etc.
Args:
cfg: DictConfig configuration composed by Hydra.
Returns:
A pair of dictionaries containing metrics and all instantiated objects, respectively.
"""
assert cfg.ckpt_path
log.info(f"Instantiating datamodule <{cfg.data._target_}>")
datamodule: LightningDataModule = hydra.utils.instantiate(cfg.data)
log.info(f"Instantiating model <{cfg.model._target_}>")
model: LightningModule = hydra.utils.instantiate(cfg.model)
log.info("Instantiating callbacks...")
callbacks: list[Callback] = instantiate_callbacks(cfg.get("callbacks"))
log.info("Instantiating loggers...")
logger: list[Logger] = instantiate_loggers(cfg.get("logger"))
log.info(f"Instantiating trainer <{cfg.trainer._target_}>")
trainer: Trainer = hydra.utils.instantiate(cfg.trainer, callbacks=callbacks, logger=logger)
object_dict = {
"cfg": cfg,
"datamodule": datamodule,
"model": model,
"callbacks": callbacks,
"logger": logger,
"trainer": trainer,
}
if logger:
log.info("Logging hyperparameters!")
log_hyperparameters(object_dict)
log.info("Starting testing!")
trainer.test(model=model, datamodule=datamodule, ckpt_path=cfg.ckpt_path, weights_only=False)
metric_dict = trainer.callback_metrics
# for predictions use trainer.predict(...)
if cfg.get("predict"):
log.info("Starting predicting!")
trainer.predict(
model=model, dataloaders=datamodule.test_dataloader(), ckpt_path=cfg.ckpt_path, weights_only=False
)
return metric_dict, object_dict
@hydra.main(version_base=None, config_path="configs", config_name="eval.yaml")
def hydra_main(cfg: DictConfig) -> None:
"""Hydra entry point for evaluation.
Args:
cfg: DictConfig configuration composed by Hydra.
"""
# apply extra utilities
# (e.g. ask for tags if none are provided in cfg, print cfg tree, etc.)
extras(cfg)
evaluate(cfg)
def main() -> None:
"""Main entry point for training, before Hydra is called.
This is a workaround for issues with Python packaging tools requiring a function to target for script entrypoints.
It provides a target for entrypoints that comes before Hydra is called, allowing for pre-Hydra routines to be run
(e.g. setting up environment variables, registering custom OmegaConf resolvers etc.)
"""
pre_hydra_routine()
hydra_main()
if __name__ == "__main__":
main()