LMFuser 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
lmfuser/__init__.py ADDED
File without changes
@@ -0,0 +1,33 @@
1
+ from os import PathLike
2
+
3
+ from torch import nn
4
+ from lmfuser_data.interfaces import SubclassTracer
5
+ from hyperargs import Conf, StrArg, OptionArg
6
+
7
+
8
+ class ModelLoader(SubclassTracer):
9
+ def __init__(self, model_path: str | PathLike):
10
+ self.model_path = model_path
11
+
12
+ def load_model(self) -> nn.Module:
13
+ raise NotImplementedError(f'Not implemented load_model for {self.__class__.__name__}')
14
+
15
+ @classmethod
16
+ def save_model(cls, model: nn.Module, directory: str | PathLike) -> None:
17
+ raise NotImplementedError(f'Not implemented save_model for {model.__class__.__name__}')
18
+
19
+ def find_model_loader_names() -> list[str]:
20
+ return list(ModelLoader.all_subclass_names()) + ['ModelLoader']
21
+
22
+
23
+ class ModelLoaderConf(Conf):
24
+ model_path = StrArg('please set model path here!')
25
+ model_type = OptionArg(default='ModelLoader', option_fn=find_model_loader_names)
26
+
27
+ def get_model_loader(self) -> ModelLoader:
28
+ name = self.model_type.value()
29
+ path = self.model_path.value()
30
+ assert name is not None and path is not None
31
+ if name == 'ModelLoader':
32
+ return ModelLoader(path)
33
+ return ModelLoader.all_subclass_map()[name](path)
lmfuser/optimizers.py ADDED
@@ -0,0 +1,162 @@
1
+ from typing import Iterable
2
+
3
+ import torch
4
+ from torch.nn.parameter import Parameter as Parameter
5
+ from torch.optim import (
6
+ Optimizer,
7
+ Adam,
8
+ AdamW,
9
+ SGD,
10
+ Adadelta,
11
+ Adagrad
12
+ )
13
+ from hyperargs import Conf, OptionArg, FloatArg, BoolArg, add_dependency, monitor_on
14
+
15
+
16
+ class OptimizerConfigBase(Conf):
17
+
18
+ def init_optimzier(
19
+ self,
20
+ params: Iterable[Parameter],
21
+ ) -> Optimizer:
22
+ raise NotImplementedError(
23
+ 'Please Implement this method in child classes!'
24
+ )
25
+
26
+
27
+ class AdamWConfig(OptimizerConfigBase):
28
+
29
+ lr = FloatArg(5e-5, min_value=0.0)
30
+ beta1 = FloatArg(0.9, min_value=0.0, max_value=1.0)
31
+ beta2 = FloatArg(0.999, min_value=0.0, max_value=1.0)
32
+ eps = FloatArg(1e-8, min_value=0.0, max_value=1.0)
33
+ weight_decay = FloatArg(0.01, min_value=0.0, max_value=1.0)
34
+ amsgrad = BoolArg(False)
35
+
36
+ def init_optimzier(
37
+ self,
38
+ params: Iterable[Parameter],
39
+ ) -> Optimizer:
40
+ return AdamW(
41
+ params=params,
42
+ lr=self.lr.value(), # type: ignore
43
+ betas=(self.beta1.value(), self.beta2.value()), # type: ignore
44
+ eps=self.eps.value(), # type: ignore
45
+ weight_decay=self.weight_decay.value(), # type: ignore
46
+ amsgrad=self.amsgrad.value() # type: ignore
47
+ )
48
+
49
+
50
+ class AdamConfig(OptimizerConfigBase):
51
+
52
+ lr = FloatArg(5e-5, min_value=0.0)
53
+ beta1 = FloatArg(0.9, min_value=0.0, max_value=1.0)
54
+ beta2 = FloatArg(0.999, min_value=0.0, max_value=1.0)
55
+ eps = FloatArg(1e-8, min_value=0.0, max_value=1.0)
56
+ weight_decay = FloatArg(0.01, min_value=0.0, max_value=1.0)
57
+ amsgrad = BoolArg(False)
58
+
59
+ def init_optimzier(
60
+ self,
61
+ params: Iterable[Parameter]
62
+ ) -> Optimizer:
63
+ return Adam(
64
+ params=params,
65
+ lr=self.lr.value(), # type: ignore
66
+ betas=(self.beta1.value(), self.beta2.value()), # type: ignore
67
+ eps=self.eps.value(), # type: ignore
68
+ weight_decay=self.weight_decay.value(), # type: ignore
69
+ amsgrad=self.amsgrad.value() # type: ignore
70
+ )
71
+
72
+
73
+ class SGDConfig(OptimizerConfigBase):
74
+
75
+ lr = FloatArg(5e-5, min_value=0.0)
76
+ momentum = FloatArg(0.90, min_value=0.0, max_value=1.0)
77
+ dampening = FloatArg(0.0, min_value=0.0, max_value=1.0)
78
+ weight_decay = FloatArg(0.0, min_value=0.0, max_value=1.0)
79
+ nesterov = BoolArg(False)
80
+
81
+ def init_optimzier(
82
+ self,
83
+ params: Iterable[Parameter],
84
+ ) -> Optimizer:
85
+ return SGD(
86
+ params=params,
87
+ lr=self.lr.value(), # type: ignore
88
+ momentum=self.momentum.value(), # type: ignore
89
+ weight_decay=self.weight_decay.value(), # type: ignore
90
+ nesterov=self.nesterov.value() # type: ignore
91
+ )
92
+
93
+
94
+ class AdadeltaConfig(OptimizerConfigBase):
95
+
96
+ lr = FloatArg(1.0, min_value=0.0)
97
+ rho = FloatArg(0.9, min_value=0.0, max_value=1.0)
98
+ eps = FloatArg(1e-6, min_value=0.0, max_value=1.0)
99
+ weight_decay = FloatArg(0.0, min_value=0.0, max_value=1.0)
100
+
101
+ def init_optimzier(
102
+ self,
103
+ params: Iterable[Parameter]
104
+ ) -> Optimizer:
105
+ return Adadelta(
106
+ params=params,
107
+ lr=self.lr.value(), # type: ignore
108
+ rho=self.rho.value(), # type: ignore
109
+ eps=self.eps.value(), # type: ignore
110
+ weight_decay=self.weight_decay.value() # type: ignore
111
+ )
112
+
113
+
114
+ class AdagradConfig(OptimizerConfigBase):
115
+
116
+ lr = FloatArg(0.01, min_value=0.0)
117
+ lr_decay = FloatArg(0.0, min_value=0.0, max_value=1.0)
118
+ weight_decay = FloatArg(0.0, min_value=0.0, max_value=1.0)
119
+ initial_accumulator_value = FloatArg(0.0, min_value=0.0, max_value=1.0)
120
+ eps = FloatArg(1e-10, min_value=0.0, max_value=1.0)
121
+
122
+ def init_optimzier(
123
+ self,
124
+ params: Iterable[Parameter]
125
+ ) -> Optimizer:
126
+ return Adagrad(
127
+ params=params,
128
+ lr=self.lr.value(), # type: ignore
129
+ lr_decay=self.lr_decay.value(), # type: ignore
130
+ weight_decay=self.weight_decay.value(), # type: ignore
131
+ initial_accumulator_value=self.initial_accumulator_value.value(), # type: ignore
132
+ eps=self.eps.value() # type: ignore
133
+ )
134
+
135
+
136
+ @add_dependency('optimizer_type', 'optimizer')
137
+ class OptimizerConfig(Conf):
138
+ optimizer_type = OptionArg('AdamW', options=['AdamW', 'Adam', 'SGD', 'Adadelta', 'Adagrad'])
139
+ optimizer: OptimizerConfigBase = AdamWConfig()
140
+
141
+ @monitor_on('optimizer_type')
142
+ def set_optimizer(self) -> None:
143
+ if self.optimizer_type.value() == 'AdamW' and not isinstance(self.optimizer, AdamWConfig):
144
+ self.optimizer = AdamWConfig()
145
+ elif self.optimizer_type.value() == 'Adam' and not isinstance(self.optimizer, AdamConfig):
146
+ self.optimizer = AdamConfig()
147
+ elif self.optimizer_type.value() == 'SGD' and not isinstance(self.optimizer, SGDConfig):
148
+ self.optimizer = SGDConfig()
149
+ elif self.optimizer_type.value() == 'Adadelta' and not isinstance(self.optimizer, AdadeltaConfig):
150
+ self.optimizer = AdadeltaConfig()
151
+ elif self.optimizer_type.value() == 'Adagrad' and not isinstance(self.optimizer, AdagradConfig):
152
+ self.optimizer = AdagradConfig()
153
+
154
+ def init_optimzier(
155
+ self,
156
+ params: Iterable[Parameter]
157
+ ) -> Optimizer:
158
+ return self.optimizer.init_optimzier(params)
159
+
160
+ if __name__ == '__main__':
161
+ conf = OptimizerConfig.parse_command_line()
162
+ print(conf)
@@ -0,0 +1 @@
1
+ from .ddp_runner import DDPRunner, DDPRunnerConfig