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 +0 -0
- lmfuser/model_loader.py +33 -0
- lmfuser/optimizers.py +162 -0
- lmfuser/runners/__init__.py +1 -0
- lmfuser/runners/ddp_runner.py +619 -0
- lmfuser/runners/runner.py +40 -0
- lmfuser/schedulers.py +210 -0
- lmfuser/task.py +287 -0
- lmfuser/utils.py +249 -0
- lmfuser-0.0.1.dist-info/METADATA +30 -0
- lmfuser-0.0.1.dist-info/RECORD +13 -0
- lmfuser-0.0.1.dist-info/WHEEL +4 -0
- lmfuser-0.0.1.dist-info/licenses/LICENSE +21 -0
lmfuser/__init__.py
ADDED
|
File without changes
|
lmfuser/model_loader.py
ADDED
|
@@ -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
|