pytinytensor 0.1.2__tar.gz → 0.1.4__tar.gz
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.
- {pytinytensor-0.1.2/pytinytensor.egg-info → pytinytensor-0.1.4}/PKG-INFO +16 -1
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/README.md +15 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4/pytinytensor.egg-info}/PKG-INFO +16 -1
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/pytinytensor.egg-info/SOURCES.txt +3 -23
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/setup.py +1 -1
- {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/nn/activations.py +1 -0
- pytinytensor-0.1.4/tinytensor/nn/dropout.py +23 -0
- {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/nn/modules.py +8 -7
- {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/optim/optimizer.py +13 -6
- {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/utils/__init__.py +3 -2
- pytinytensor-0.1.4/tinytensor/utils/summary.py +49 -0
- pytinytensor-0.1.2/tinytensor/nn/activations.py +0 -36
- pytinytensor-0.1.2/tinytensor/nn/modules.py +0 -63
- pytinytensor-0.1.2/tinytensor/optim/optimizer.py +0 -72
- pytinytensor-0.1.2/tinytensor/setup.py +0 -81
- pytinytensor-0.1.2/tinytensor/tinytensor/__init__.py +0 -0
- pytinytensor-0.1.2/tinytensor/tinytensor/backends/__init__.py +0 -0
- pytinytensor-0.1.2/tinytensor/tinytensor/backends/cpu_numpy.py +0 -0
- pytinytensor-0.1.2/tinytensor/tinytensor/config.py +0 -20
- pytinytensor-0.1.2/tinytensor/tinytensor/core/__init__.py +0 -0
- pytinytensor-0.1.2/tinytensor/tinytensor/core/autograd.py +0 -22
- pytinytensor-0.1.2/tinytensor/tinytensor/core/ops.py +0 -1
- pytinytensor-0.1.2/tinytensor/tinytensor/core/tensor.py +0 -288
- pytinytensor-0.1.2/tinytensor/tinytensor/data/__init__.py +0 -5
- pytinytensor-0.1.2/tinytensor/tinytensor/data/dataloader.py +0 -41
- pytinytensor-0.1.2/tinytensor/tinytensor/data/dataset.py +0 -19
- pytinytensor-0.1.2/tinytensor/tinytensor/nn/__init__.py +0 -0
- pytinytensor-0.1.2/tinytensor/tinytensor/nn/linear.py +0 -18
- pytinytensor-0.1.2/tinytensor/tinytensor/nn/losses.py +0 -12
- pytinytensor-0.1.2/tinytensor/tinytensor/optim/__init__.py +0 -11
- pytinytensor-0.1.2/tinytensor/utils/__init__.py +0 -4
- pytinytensor-0.1.2/tinytensor/utils/bar.py +0 -26
- pytinytensor-0.1.2/tinytensor/utils/early_stopping.py +0 -64
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/LICENSE +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/pyproject.toml +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/pytinytensor.egg-info/dependency_links.txt +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/pytinytensor.egg-info/requires.txt +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/pytinytensor.egg-info/top_level.txt +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/setup.cfg +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_autograd.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_data.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_losses.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_nn.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_optim.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_tensor_math.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/__init__.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/backends/__init__.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/backends/cpu_numpy.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/backends/cuda_binding.cpp +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/backends/cuda_gpu.cu +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/backends/cuda_gpu.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/config.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/core/__init__.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/core/autograd.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/core/ops.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/core/tensor.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/data/__init__.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/data/dataloader.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/data/dataset.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/nn/__init__.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/nn/linear.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/nn/losses.py +0 -0
- {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/optim/__init__.py +0 -0
- {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/utils/bar.py +0 -0
- {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/utils/early_stopping.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pytinytensor
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: мини ИИ фреймворк от IbrokimN ( github/IbrokhimN )
|
|
5
5
|
Home-page: https://github.com/IbrokhimN/tinytensor
|
|
6
6
|
Author: IbrokhimN
|
|
@@ -33,6 +33,7 @@ Dynamic: summary
|
|
|
33
33
|
## Содержание
|
|
34
34
|
|
|
35
35
|
- [Установка](#установка)
|
|
36
|
+
- [Документация](#документация)
|
|
36
37
|
- [Быстрый старт](#быстрый-старт)
|
|
37
38
|
- [Как работает autograd](#как-работает-autograd)
|
|
38
39
|
- [API](#api)
|
|
@@ -59,6 +60,20 @@ pip install -r requirements.txt
|
|
|
59
60
|
|
|
60
61
|
Зависимость одна - numpy.
|
|
61
62
|
|
|
63
|
+
## Документация
|
|
64
|
+
|
|
65
|
+
Все подробности разложены по [`docs/`](docs/), README тут больше как входная дверь:
|
|
66
|
+
|
|
67
|
+
- [docs/getting_started.md](docs/getting_started.md) - установка, quickstart
|
|
68
|
+
- [docs/tensor_and_autograd.md](docs/tensor_and_autograd.md) - как устроен Tensor и backward
|
|
69
|
+
- [docs/nn.md](docs/nn.md) - Module, Linear, активации, Dropout, MSELoss
|
|
70
|
+
- [docs/optim.md](docs/optim.md) - SGD, AdamW
|
|
71
|
+
- [docs/data.md](docs/data.md) - Dataset, DataLoader
|
|
72
|
+
- [docs/utils.md](docs/utils.md) - progress_bar, EarlyStopping
|
|
73
|
+
- [docs/model_saving.md](docs/model_saving.md) - save/load модели
|
|
74
|
+
- [docs/cuda.md](docs/cuda.md) - опциональный cuda-бэкенд
|
|
75
|
+
- [docs/faq.md](docs/faq.md) - грабли, на которые уже наступили
|
|
76
|
+
|
|
62
77
|
## Быстрый старт
|
|
63
78
|
|
|
64
79
|
```python
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
## Содержание
|
|
11
11
|
|
|
12
12
|
- [Установка](#установка)
|
|
13
|
+
- [Документация](#документация)
|
|
13
14
|
- [Быстрый старт](#быстрый-старт)
|
|
14
15
|
- [Как работает autograd](#как-работает-autograd)
|
|
15
16
|
- [API](#api)
|
|
@@ -36,6 +37,20 @@ pip install -r requirements.txt
|
|
|
36
37
|
|
|
37
38
|
Зависимость одна - numpy.
|
|
38
39
|
|
|
40
|
+
## Документация
|
|
41
|
+
|
|
42
|
+
Все подробности разложены по [`docs/`](docs/), README тут больше как входная дверь:
|
|
43
|
+
|
|
44
|
+
- [docs/getting_started.md](docs/getting_started.md) - установка, quickstart
|
|
45
|
+
- [docs/tensor_and_autograd.md](docs/tensor_and_autograd.md) - как устроен Tensor и backward
|
|
46
|
+
- [docs/nn.md](docs/nn.md) - Module, Linear, активации, Dropout, MSELoss
|
|
47
|
+
- [docs/optim.md](docs/optim.md) - SGD, AdamW
|
|
48
|
+
- [docs/data.md](docs/data.md) - Dataset, DataLoader
|
|
49
|
+
- [docs/utils.md](docs/utils.md) - progress_bar, EarlyStopping
|
|
50
|
+
- [docs/model_saving.md](docs/model_saving.md) - save/load модели
|
|
51
|
+
- [docs/cuda.md](docs/cuda.md) - опциональный cuda-бэкенд
|
|
52
|
+
- [docs/faq.md](docs/faq.md) - грабли, на которые уже наступили
|
|
53
|
+
|
|
39
54
|
## Быстрый старт
|
|
40
55
|
|
|
41
56
|
```python
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pytinytensor
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: мини ИИ фреймворк от IbrokimN ( github/IbrokhimN )
|
|
5
5
|
Home-page: https://github.com/IbrokhimN/tinytensor
|
|
6
6
|
Author: IbrokhimN
|
|
@@ -33,6 +33,7 @@ Dynamic: summary
|
|
|
33
33
|
## Содержание
|
|
34
34
|
|
|
35
35
|
- [Установка](#установка)
|
|
36
|
+
- [Документация](#документация)
|
|
36
37
|
- [Быстрый старт](#быстрый-старт)
|
|
37
38
|
- [Как работает autograd](#как-работает-autograd)
|
|
38
39
|
- [API](#api)
|
|
@@ -59,6 +60,20 @@ pip install -r requirements.txt
|
|
|
59
60
|
|
|
60
61
|
Зависимость одна - numpy.
|
|
61
62
|
|
|
63
|
+
## Документация
|
|
64
|
+
|
|
65
|
+
Все подробности разложены по [`docs/`](docs/), README тут больше как входная дверь:
|
|
66
|
+
|
|
67
|
+
- [docs/getting_started.md](docs/getting_started.md) - установка, quickstart
|
|
68
|
+
- [docs/tensor_and_autograd.md](docs/tensor_and_autograd.md) - как устроен Tensor и backward
|
|
69
|
+
- [docs/nn.md](docs/nn.md) - Module, Linear, активации, Dropout, MSELoss
|
|
70
|
+
- [docs/optim.md](docs/optim.md) - SGD, AdamW
|
|
71
|
+
- [docs/data.md](docs/data.md) - Dataset, DataLoader
|
|
72
|
+
- [docs/utils.md](docs/utils.md) - progress_bar, EarlyStopping
|
|
73
|
+
- [docs/model_saving.md](docs/model_saving.md) - save/load модели
|
|
74
|
+
- [docs/cuda.md](docs/cuda.md) - опциональный cuda-бэкенд
|
|
75
|
+
- [docs/faq.md](docs/faq.md) - грабли, на которые уже наступили
|
|
76
|
+
|
|
62
77
|
## Быстрый старт
|
|
63
78
|
|
|
64
79
|
```python
|
|
@@ -15,7 +15,6 @@ tests/test_optim.py
|
|
|
15
15
|
tests/test_tensor_math.py
|
|
16
16
|
tinytensor/__init__.py
|
|
17
17
|
tinytensor/config.py
|
|
18
|
-
tinytensor/setup.py
|
|
19
18
|
tinytensor/backends/__init__.py
|
|
20
19
|
tinytensor/backends/cpu_numpy.py
|
|
21
20
|
tinytensor/backends/cuda_binding.cpp
|
|
@@ -30,32 +29,13 @@ tinytensor/data/dataloader.py
|
|
|
30
29
|
tinytensor/data/dataset.py
|
|
31
30
|
tinytensor/nn/__init__.py
|
|
32
31
|
tinytensor/nn/activations.py
|
|
32
|
+
tinytensor/nn/dropout.py
|
|
33
33
|
tinytensor/nn/linear.py
|
|
34
34
|
tinytensor/nn/losses.py
|
|
35
35
|
tinytensor/nn/modules.py
|
|
36
36
|
tinytensor/optim/__init__.py
|
|
37
37
|
tinytensor/optim/optimizer.py
|
|
38
|
-
tinytensor/tinytensor/__init__.py
|
|
39
|
-
tinytensor/tinytensor/config.py
|
|
40
|
-
tinytensor/tinytensor/backends/__init__.py
|
|
41
|
-
tinytensor/tinytensor/backends/cpu_numpy.py
|
|
42
|
-
tinytensor/tinytensor/core/__init__.py
|
|
43
|
-
tinytensor/tinytensor/core/autograd.py
|
|
44
|
-
tinytensor/tinytensor/core/ops.py
|
|
45
|
-
tinytensor/tinytensor/core/tensor.py
|
|
46
|
-
tinytensor/tinytensor/data/__init__.py
|
|
47
|
-
tinytensor/tinytensor/data/dataloader.py
|
|
48
|
-
tinytensor/tinytensor/data/dataset.py
|
|
49
|
-
tinytensor/tinytensor/nn/__init__.py
|
|
50
|
-
tinytensor/tinytensor/nn/activations.py
|
|
51
|
-
tinytensor/tinytensor/nn/linear.py
|
|
52
|
-
tinytensor/tinytensor/nn/losses.py
|
|
53
|
-
tinytensor/tinytensor/nn/modules.py
|
|
54
|
-
tinytensor/tinytensor/optim/__init__.py
|
|
55
|
-
tinytensor/tinytensor/optim/optimizer.py
|
|
56
|
-
tinytensor/tinytensor/utils/__init__.py
|
|
57
|
-
tinytensor/tinytensor/utils/bar.py
|
|
58
|
-
tinytensor/tinytensor/utils/early_stopping.py
|
|
59
38
|
tinytensor/utils/__init__.py
|
|
60
39
|
tinytensor/utils/bar.py
|
|
61
|
-
tinytensor/utils/early_stopping.py
|
|
40
|
+
tinytensor/utils/early_stopping.py
|
|
41
|
+
tinytensor/utils/summary.py
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#функция дропаута это короче нужно чтоб вырубать нейроны во время обучения чтоб остальные нейроны обучились хорошо тоже
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from tinytensor.nn.modules import Module
|
|
5
|
+
from tinytensor.core.tensor import Tensor
|
|
6
|
+
|
|
7
|
+
class Dropout(Module):
|
|
8
|
+
def __init__(self, p=0.5):
|
|
9
|
+
super().__init__()
|
|
10
|
+
# p это вероятност типа 0.5 это половина нейронов вырубается
|
|
11
|
+
self.p = p
|
|
12
|
+
|
|
13
|
+
def forward(self, x):
|
|
14
|
+
# если не обучаемся то скип
|
|
15
|
+
if not self.training or self.p == 0:
|
|
16
|
+
return x
|
|
17
|
+
mask_data = (np.random.rand(*x.data.shape) > self.p) / (1.0 - self.p)
|
|
18
|
+
|
|
19
|
+
#маску в тензор превращаем
|
|
20
|
+
mask = Tensor(mask_data, requires_grad=False)
|
|
21
|
+
|
|
22
|
+
#тк маска состоит из 0 и 1 умножение как раз некоторые нейроны вырубит
|
|
23
|
+
return x * mask
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from tinytensor.core.tensor import Tensor
|
|
2
2
|
import pickle
|
|
3
|
-
|
|
4
3
|
#кароч модуль от которого будут наследоваться все слои
|
|
5
4
|
class Module:
|
|
6
5
|
def __init__(self):
|
|
@@ -8,27 +7,31 @@ class Module:
|
|
|
8
7
|
|
|
9
8
|
def __call__(self, *args, **kwargs):
|
|
10
9
|
return self.forward(*args, **kwargs)
|
|
11
|
-
|
|
12
10
|
#щас это просто заглушка для прямого вызова, а в реале у всех должны быть свои реализации forward, так что это роль не играет
|
|
13
11
|
def forward(self, *args, **kwargs):
|
|
14
12
|
raise NotImplementedError(...)
|
|
15
|
-
|
|
16
13
|
# сохраняет обучаемые веса, и если в модуле есть еще какие то модули то он их тоже открывает
|
|
17
14
|
def parameters(self):
|
|
18
15
|
params = []
|
|
19
16
|
for atr in self.__dict__.values():
|
|
20
17
|
if isinstance(atr, Tensor) and atr.requires_grad == True:
|
|
21
18
|
params.append(atr)
|
|
22
|
-
|
|
23
19
|
elif isinstance(atr, Module):
|
|
24
20
|
params.extend(atr.parameters())
|
|
25
21
|
return params
|
|
26
|
-
|
|
27
22
|
#обнуляет градиенты
|
|
28
23
|
def zero_grad(self):
|
|
29
24
|
for atr in self.parameters():
|
|
30
25
|
atr.grad = None
|
|
31
26
|
|
|
27
|
+
def train(self, mode=True):
|
|
28
|
+
self.training = mode
|
|
29
|
+
for atr in self.__dict__.values():
|
|
30
|
+
if isinstance(atr, Module):
|
|
31
|
+
atr.train(mode)
|
|
32
|
+
return self
|
|
33
|
+
def eval(self):
|
|
34
|
+
return self.train(False)
|
|
32
35
|
def state_dict(self):
|
|
33
36
|
#вытащим все веса параметров
|
|
34
37
|
sdict = {}
|
|
@@ -41,7 +44,6 @@ class Module:
|
|
|
41
44
|
for name, param in self._get_named_params().items():
|
|
42
45
|
if name in sdict:
|
|
43
46
|
param.data = sdict[name]
|
|
44
|
-
|
|
45
47
|
def _get_named_params(self, prefix=""):
|
|
46
48
|
named = {}
|
|
47
49
|
for attr_name, attr in self.__dict__.items():
|
|
@@ -56,7 +58,6 @@ class Module:
|
|
|
56
58
|
def save(self,filepath):
|
|
57
59
|
with open(filepath, "wb") as f:
|
|
58
60
|
pickle.dump(self.state_dict(), f)
|
|
59
|
-
|
|
60
61
|
# загрузка весов обратно
|
|
61
62
|
def load(self, filepath):
|
|
62
63
|
with open(filepath, "rb") as f:
|
|
@@ -17,27 +17,30 @@ class Optimizer:
|
|
|
17
17
|
# SGD
|
|
18
18
|
# w = w - lr*dw
|
|
19
19
|
class SGD(Optimizer):
|
|
20
|
-
def __init__(self, parameters, lr = 0.01, momentum = 0.0):
|
|
20
|
+
def __init__(self, parameters, lr = 0.01, momentum = 0.0, weight_decay = 0.0):
|
|
21
21
|
super().__init__(parameters)
|
|
22
22
|
self.lr = lr
|
|
23
23
|
self.momentum = momentum
|
|
24
|
+
self.weight_decay = weight_decay
|
|
24
25
|
# буфера
|
|
25
26
|
self.velocities = [np.zeros_like(p.data) for p in self.parameters] if momentum > 0 else None
|
|
26
27
|
|
|
27
28
|
def step(self):
|
|
28
|
-
for i,p in enumerate(self.parameters):
|
|
29
|
+
for i, p in enumerate(self.parameters):
|
|
29
30
|
if p.grad is None:
|
|
30
31
|
continue
|
|
31
|
-
grad = p.grad
|
|
32
|
+
grad = p.grad
|
|
33
|
+
if self.weight_decay != 0:
|
|
34
|
+
grad = grad + self.weight_decay * p.data
|
|
32
35
|
|
|
33
|
-
if self.momentum>0:
|
|
36
|
+
if self.momentum > 0:
|
|
34
37
|
self.velocities[i] = self.momentum * self.velocities[i] + grad
|
|
35
38
|
grad = self.velocities[i]
|
|
39
|
+
|
|
36
40
|
# шаг
|
|
37
41
|
p.data -= self.lr * grad
|
|
38
42
|
|
|
39
43
|
|
|
40
|
-
|
|
41
44
|
#Adamw
|
|
42
45
|
# слишком много формул мне впадлу писать
|
|
43
46
|
class AdamW(Optimizer):
|
|
@@ -69,4 +72,8 @@ class AdamW(Optimizer):
|
|
|
69
72
|
v_hat = self.v[i] / (1.0 - self.beta2 ** self.t)
|
|
70
73
|
# адапт шаг и разделение затухания весов
|
|
71
74
|
denom = np.sqrt(v_hat) + self.eps
|
|
72
|
-
|
|
75
|
+
|
|
76
|
+
if self.weight_decay != 0:
|
|
77
|
+
p.data -= self.lr * self.weight_decay * p.data
|
|
78
|
+
|
|
79
|
+
p.data -= self.lr * (m_hat / denom)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from tinytensor.utils.bar import progress_bar, train_bar
|
|
2
2
|
from tinytensor.utils.early_stopping import EarlyStopping
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
from tinytensor.utils.summary import summary
|
|
4
|
+
|
|
5
|
+
__all__ = ["progress_bar", "train_bar", "EarlyStopping", "summary"]
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from tinytensor.core.tensor import Tensor
|
|
3
|
+
from tinytensor.nn.modules import Module
|
|
4
|
+
|
|
5
|
+
def summary(model: Module, input_shape: tuple):
|
|
6
|
+
# печает инфу о модели
|
|
7
|
+
print("\n" + "=" * 50)
|
|
8
|
+
print(f"{'layer (type)':<20} {'output shape':<18} {'param #':<10}")
|
|
9
|
+
print("-" * 50)
|
|
10
|
+
|
|
11
|
+
total_params = 0
|
|
12
|
+
trainable_params = 0
|
|
13
|
+
|
|
14
|
+
dummy_input = Tensor(np.zeros(input_shape), requires_grad=False)
|
|
15
|
+
x = dummy_input
|
|
16
|
+
|
|
17
|
+
layers = []
|
|
18
|
+
for attr in model.__dict__.values():
|
|
19
|
+
if isinstance(attr, Module):
|
|
20
|
+
layers.append(attr)
|
|
21
|
+
elif isinstance(attr, (list, tuple)):
|
|
22
|
+
for item in attr:
|
|
23
|
+
if isinstance(item, Module):
|
|
24
|
+
layers.append(item)
|
|
25
|
+
|
|
26
|
+
for layer in layers:
|
|
27
|
+
layer_name = layer.__class__.__name__
|
|
28
|
+
|
|
29
|
+
layer_params = 0
|
|
30
|
+
for p in layer.parameters():
|
|
31
|
+
num_params = int(np.prod(p.data.shape))
|
|
32
|
+
layer_params += num_params
|
|
33
|
+
if p.requires_grad:
|
|
34
|
+
trainable_params += num_params
|
|
35
|
+
total_params += num_params
|
|
36
|
+
|
|
37
|
+
try:
|
|
38
|
+
x = layer(x)
|
|
39
|
+
out_shape = str(tuple(x.data.shape))
|
|
40
|
+
except Exception as e:
|
|
41
|
+
out_shape = "Ошибка"
|
|
42
|
+
|
|
43
|
+
print(f"{layer_name:<20} {out_shape:<18} {layer_params:<10,}")
|
|
44
|
+
|
|
45
|
+
print("-" * 50)
|
|
46
|
+
print(f"Total params: {total_params:,}")
|
|
47
|
+
print(f"Trainable params: {trainable_params:,}")
|
|
48
|
+
print(f"Non-trainable params: {total_params - trainable_params:,}")
|
|
49
|
+
print("=" * 50 + "\n")
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
from tinytensor.nn.modules import Module
|
|
2
|
-
|
|
3
|
-
class ReLU(Module):
|
|
4
|
-
def forward(self, x):
|
|
5
|
-
return x.relu()
|
|
6
|
-
|
|
7
|
-
class LeReLU(Module):
|
|
8
|
-
# у нас есть тут альфа
|
|
9
|
-
def __init__(self, alpha=0.01):
|
|
10
|
-
self.alpha = alpha
|
|
11
|
-
|
|
12
|
-
def forward(self, x):
|
|
13
|
-
return x.leaky_relu(alpha=self.alpha)
|
|
14
|
-
|
|
15
|
-
class Sigmod(Module):
|
|
16
|
-
def forward(self, x):
|
|
17
|
-
return x.sigmoid()
|
|
18
|
-
|
|
19
|
-
class Tanh(Module):
|
|
20
|
-
def forward(self, x):
|
|
21
|
-
return x.tanh()
|
|
22
|
-
|
|
23
|
-
class GELU(Module):
|
|
24
|
-
def forward(self, x):
|
|
25
|
-
return x.gelu()
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
# ToDo:
|
|
31
|
-
# ReLU [x]
|
|
32
|
-
# LeReLU [x]
|
|
33
|
-
# Sigmoid [x]
|
|
34
|
-
# Tanh [x]
|
|
35
|
-
# GELU [x]
|
|
36
|
-
# kama soska
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
from tinytensor.core.tensor import Tensor
|
|
2
|
-
import pickle
|
|
3
|
-
|
|
4
|
-
#кароч модуль от которого будут наследоваться все слои
|
|
5
|
-
class Module:
|
|
6
|
-
def __init__(self):
|
|
7
|
-
self.training = True
|
|
8
|
-
|
|
9
|
-
def __call__(self, *args, **kwargs):
|
|
10
|
-
return self.forward(*args, **kwargs)
|
|
11
|
-
|
|
12
|
-
#щас это просто заглушка для прямого вызова, а в реале у всех должны быть свои реализации forward, так что это роль не играет
|
|
13
|
-
def forward(self, *args, **kwargs):
|
|
14
|
-
raise NotImplementedError(...)
|
|
15
|
-
|
|
16
|
-
# сохраняет обучаемые веса, и если в модуле есть еще какие то модули то он их тоже открывает
|
|
17
|
-
def parameters(self):
|
|
18
|
-
params = []
|
|
19
|
-
for atr in self.__dict__.values():
|
|
20
|
-
if isinstance(atr, Tensor) and atr.requires_grad == True:
|
|
21
|
-
params.append(atr)
|
|
22
|
-
|
|
23
|
-
elif isinstance(atr, Module):
|
|
24
|
-
params.extend(atr.parameters())
|
|
25
|
-
return params
|
|
26
|
-
|
|
27
|
-
#обнуляет градиенты
|
|
28
|
-
def zero_grad(self):
|
|
29
|
-
for atr in self.parameters():
|
|
30
|
-
atr.grad = None
|
|
31
|
-
|
|
32
|
-
def state_dict(self):
|
|
33
|
-
#вытащим все веса параметров
|
|
34
|
-
sdict = {}
|
|
35
|
-
for name, param in self._get_named_params().items():
|
|
36
|
-
sdict[name] = param.data
|
|
37
|
-
|
|
38
|
-
def load_state_dict(self, sdict):
|
|
39
|
-
#запихиваем обратно
|
|
40
|
-
for name, param in self._get_named_params().items():
|
|
41
|
-
if name in sdict:
|
|
42
|
-
param.data = sdict[name]
|
|
43
|
-
|
|
44
|
-
def _get_named_params(self, prefix=""):
|
|
45
|
-
named = {}
|
|
46
|
-
for attr_name, attr in self.__dict__.items():
|
|
47
|
-
key = f"{prefix}.{attr_name}" if prefix else attr_name
|
|
48
|
-
if isinstance(attr, Tensor):
|
|
49
|
-
named[key] = attr
|
|
50
|
-
elif isinstance(attr, Module):
|
|
51
|
-
named.update(attr._get_named_params(prefix=key))
|
|
52
|
-
return named
|
|
53
|
-
|
|
54
|
-
#сохранение модели
|
|
55
|
-
def save(self,filepath):
|
|
56
|
-
with open(filepath, "wb") as f:
|
|
57
|
-
pickle.dump(self.state_dict(), f)
|
|
58
|
-
|
|
59
|
-
# загрузка весов обратно
|
|
60
|
-
def load(self, filepath):
|
|
61
|
-
with open(filepath, "wb") as f:
|
|
62
|
-
sd = pickle.load(f)
|
|
63
|
-
self.load_state_dict(sd)
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# я допил свой чай, теперь хочу еще но мне лень вставать
|
|
2
|
-
import numpy as np
|
|
3
|
-
|
|
4
|
-
class Optimizer:
|
|
5
|
-
def __init__ (self, parameters):
|
|
6
|
-
# в лист если через генератор model параметры выдано
|
|
7
|
-
self.parameters = list(parameters)
|
|
8
|
-
|
|
9
|
-
def step(self):
|
|
10
|
-
#у каждого свой
|
|
11
|
-
raise NotImplementedError
|
|
12
|
-
|
|
13
|
-
def zero_grad(self):
|
|
14
|
-
for p in self.parameters:
|
|
15
|
-
p.grad = None
|
|
16
|
-
|
|
17
|
-
# SGD
|
|
18
|
-
# w = w - lr*dw
|
|
19
|
-
class SGD(Optimizer):
|
|
20
|
-
def __init__(self, parameters, lr = 0.01, momentum = 0.0):
|
|
21
|
-
super().__init__(parameters)
|
|
22
|
-
self.lr = lr
|
|
23
|
-
self.momentum = momentum
|
|
24
|
-
# буфера
|
|
25
|
-
self.velocities = [np.zeros_like(p.data) for p in self.parameters] if momentum > 0 else None
|
|
26
|
-
|
|
27
|
-
def step(self):
|
|
28
|
-
for i,p in enumerate(self.parameters):
|
|
29
|
-
if p.grad is None:
|
|
30
|
-
continue
|
|
31
|
-
grad = p.grad
|
|
32
|
-
|
|
33
|
-
if self.momentum>0:
|
|
34
|
-
self.velocities[i] = self.momentum * self.velocities[i] + grad
|
|
35
|
-
grad = self.velocities[i]
|
|
36
|
-
# шаг
|
|
37
|
-
p.data -= self.lr * grad
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
#Adamw
|
|
42
|
-
# слишком много формул мне впадлу писать
|
|
43
|
-
class AdamW(Optimizer):
|
|
44
|
-
def __init__(self, parameters, lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01):
|
|
45
|
-
super().__init__(parameters)
|
|
46
|
-
self.lr = lr
|
|
47
|
-
self.beta1, self.beta2 = betas
|
|
48
|
-
self.eps = eps
|
|
49
|
-
self.weight_decay = weight_decay
|
|
50
|
-
|
|
51
|
-
self.t = 0
|
|
52
|
-
|
|
53
|
-
self.m = [np.zeros_like(p.data) for p in self.parameters]
|
|
54
|
-
self.v = [np.zeros_like(p.data) for p in self.parameters]
|
|
55
|
-
|
|
56
|
-
def step(self):
|
|
57
|
-
self.t += 1
|
|
58
|
-
|
|
59
|
-
for i, p in enumerate(self.parameters):
|
|
60
|
-
if p.grad is None:
|
|
61
|
-
continue
|
|
62
|
-
|
|
63
|
-
grad = p.grad
|
|
64
|
-
# обновка m и v мометы
|
|
65
|
-
self.m[i] = self.beta1 * self.m[i] + (1.0 - self.beta1) * grad
|
|
66
|
-
self.v[i] = self.beta2 * self.v[i] + (1.0 - self.beta2) * (grad ** 2)
|
|
67
|
-
# корекция баяса
|
|
68
|
-
m_hat = self.m[i] / (1.0 - self.beta1 ** self.t)
|
|
69
|
-
v_hat = self.v[i] / (1.0 - self.beta2 ** self.t)
|
|
70
|
-
# адапт шаг и разделение затухания весов
|
|
71
|
-
denom = np.sqrt(v_hat) + self.eps
|
|
72
|
-
p.data -= self.lr * (m_hat / denom + self.weight_decay * p.data)
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import subprocess
|
|
3
|
-
import pybind11
|
|
4
|
-
from setuptools import setup, find_packages, Extension
|
|
5
|
-
from setuptools.command.build_ext import build_ext
|
|
6
|
-
|
|
7
|
-
def check_cuda():
|
|
8
|
-
try:
|
|
9
|
-
subprocess.check_output(["nvcc", "--version"])
|
|
10
|
-
return True
|
|
11
|
-
except (FileNotFoundError, subprocess.CalledProcessError):
|
|
12
|
-
return False
|
|
13
|
-
|
|
14
|
-
class CUDABuildExt(build_ext):
|
|
15
|
-
def build_extensions(self):
|
|
16
|
-
self.compiler.src_extensions.append('.cu')
|
|
17
|
-
original_compile = self.compiler._compile
|
|
18
|
-
|
|
19
|
-
def custom_compile(obj, src, ext, cc_args, extra_postargs, pp_opts):
|
|
20
|
-
# extra_postargs может приходить как список или словарь — обрабатываем оба случая
|
|
21
|
-
if isinstance(extra_postargs, dict):
|
|
22
|
-
gcc_postargs = extra_postargs.get('gcc', [])
|
|
23
|
-
nvcc_postargs = extra_postargs.get('nvcc', [])
|
|
24
|
-
else:
|
|
25
|
-
gcc_postargs = extra_postargs or []
|
|
26
|
-
nvcc_postargs = []
|
|
27
|
-
|
|
28
|
-
if os.path.splitext(src)[1] == '.cu':
|
|
29
|
-
# nvcc собирает .cu файл
|
|
30
|
-
inc_flags = [f"-I{inc}" for inc in self.compiler.include_dirs]
|
|
31
|
-
cmd = ['nvcc', '-c', src, '-o', obj] + inc_flags + nvcc_postargs
|
|
32
|
-
self.spawn(cmd)
|
|
33
|
-
else:
|
|
34
|
-
# g++ собирает .cpp файл (с pybind11)
|
|
35
|
-
original_compile(obj, src, ext, cc_args, gcc_postargs, pp_opts)
|
|
36
|
-
|
|
37
|
-
self.compiler._compile = custom_compile
|
|
38
|
-
super().build_extensions()
|
|
39
|
-
|
|
40
|
-
ext_modules = []
|
|
41
|
-
|
|
42
|
-
if check_cuda():
|
|
43
|
-
cuda_module = Extension(
|
|
44
|
-
'tinytensor.cuda_ops',
|
|
45
|
-
sources=[
|
|
46
|
-
'tinytensor/backends/cuda_gpu.cu', # Компилируется nvcc
|
|
47
|
-
'tinytensor/backends/cuda_binding.cpp' # Компилируется g++
|
|
48
|
-
],
|
|
49
|
-
include_dirs=[
|
|
50
|
-
pybind11.get_include(),
|
|
51
|
-
'/usr/local/cuda/include',
|
|
52
|
-
os.path.expanduser('~/.local/include')
|
|
53
|
-
],
|
|
54
|
-
library_dirs=['/usr/local/cuda/lib64'],
|
|
55
|
-
libraries=['cudart', 'cublas'],
|
|
56
|
-
extra_compile_args={
|
|
57
|
-
'gcc': ['-O3', '-fPIC', '-std=c++17'],
|
|
58
|
-
'nvcc': ['-O3', '-Xcompiler', '-fPIC']
|
|
59
|
-
}
|
|
60
|
-
)
|
|
61
|
-
ext_modules.append(cuda_module)
|
|
62
|
-
print("🔥 CUDA найдена! Собираем cuBLAS бэкенд...")
|
|
63
|
-
else:
|
|
64
|
-
print("⚠️ CUDA не найдена. Сборка продолжится на CPU (NumPy).")
|
|
65
|
-
|
|
66
|
-
setup(
|
|
67
|
-
name="tinytensor",
|
|
68
|
-
version="0.1.0",
|
|
69
|
-
description="мини ИИ фреймворк от IbrokimN ( github/IbrokhimN )",
|
|
70
|
-
packages=find_packages(include=["tinytensor", "tinytensor.*"]),
|
|
71
|
-
ext_modules=ext_modules,
|
|
72
|
-
cmdclass={'build_ext': CUDABuildExt},
|
|
73
|
-
install_requires=[
|
|
74
|
-
"numpy>=1.23",
|
|
75
|
-
"pybind11>=2.10",
|
|
76
|
-
],
|
|
77
|
-
extras_require={
|
|
78
|
-
"dev": ["pytest>=7.0"],
|
|
79
|
-
},
|
|
80
|
-
python_requires=">=3.9",
|
|
81
|
-
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
import numpy as np
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
@dataclass
|
|
6
|
-
class Config:
|
|
7
|
-
# базовый сид будет 67
|
|
8
|
-
seed: int = 67
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
config = Config()
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def set_seed(seed: int):
|
|
15
|
-
# автоматически устанавливаем сид для воспроизведения и тд
|
|
16
|
-
config.seed = seed
|
|
17
|
-
np.random.seed(seed)
|
|
18
|
-
|
|
19
|
-
# ну все при импорте будет устанавливаться
|
|
20
|
-
np.random.seed(config.seed)
|
|
File without changes
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def backward(target_tensor):
|
|
5
|
-
# эт я вообще сделал чтоб файл не пустовал, но это архитектура micrograd как у Андрея Карпатова,
|
|
6
|
-
# если кто то шарит за нормальный движок autograd, то PRните
|
|
7
|
-
topo = []
|
|
8
|
-
visited = set()
|
|
9
|
-
|
|
10
|
-
def build_topo(v):
|
|
11
|
-
if v not in visited:
|
|
12
|
-
visited.add(v)
|
|
13
|
-
for child in v._prev:
|
|
14
|
-
build_topo(child)
|
|
15
|
-
topo.append(v)
|
|
16
|
-
|
|
17
|
-
build_topo(target_tensor)
|
|
18
|
-
|
|
19
|
-
target_tensor.grad = np.ones_like(target_tensor.data, dtype=np.float32)
|
|
20
|
-
|
|
21
|
-
for v in reversed(topo):
|
|
22
|
-
v._backward()
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# пока что побудет пустым
|