-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtrain.py
More file actions
102 lines (82 loc) · 2.64 KB
/
Copy pathtrain.py
File metadata and controls
102 lines (82 loc) · 2.64 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
import logging
from dataclasses import dataclass
from typing import Any
import hydra
import torch
from omegaconf import DictConfig
from pkg.data import BaseData
from pkg.logic.trainer import Trainer
from pkg.model import BaseModel
from pkg.utils.logging import save_snapshot_of_source_code
from pkg.utils.reproduce import save_config, seed_everything
from pkg.utils.setup import set_device
logger: logging.Logger = logging.getLogger(__name__)
@dataclass
class TrainConfig(DictConfig):
trainer: Any
model: Any
data: Any
optimizer: Any
seed: int
device: str
debug: bool
@hydra.main(config_path="pkg/config", config_name="train", version_base="1.3")
def main(config: TrainConfig) -> float:
# config
config.seed = config.seed # in case we are using a resolver for `config.seed`
save_config(config=config)
# save code
save_snapshot_of_source_code(file_name=__file__)
# device
device = set_device(device=config.device)
# data
seed_everything(seed=config.seed)
data: BaseData = hydra.utils.instantiate(config.data, data_path=config.data_path)
# model
seed_everything(seed=config.seed)
model: BaseModel = hydra.utils.instantiate(
config.model,
num_concepts=data.num_concepts,
num_questions=data.num_questions,
max_concepts=data.max_concepts,
max_len=data.max_len,
)
model.to(device)
# optimizer
if (
hasattr(model, "attn_variant")
and model.attn_variant.startswith("learnable")
and ("theta_lr" in config.optimizer)
):
other_params = (
p for n, p in model.named_parameters() if not n.endswith("thetas")
)
theta_params = (p for n, p in model.named_parameters() if n.endswith("thetas"))
list_of_optimizer_params = [
{
"params": theta_params,
"lr": config.optimizer.theta_lr,
},
{"params": other_params},
]
del config.optimizer.theta_lr
optimizer: torch.optim.Optimizer = hydra.utils.instantiate(
config.optimizer,
list_of_optimizer_params,
)
else:
if "theta_lr" in config.optimizer:
del config.optimizer.theta_lr
optimizer: torch.optim.Optimizer = hydra.utils.instantiate(
config.optimizer,
params=model.parameters(),
)
# dispatch to trainer
trainer: Trainer = hydra.utils.instantiate(
config.trainer, data=data, model=model, optimizer=optimizer, device=device
)
best_value = trainer.run()
logger.info("Done")
return best_value
if __name__ == "__main__":
main()