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.
Files changed (65) hide show
  1. {pytinytensor-0.1.2/pytinytensor.egg-info → pytinytensor-0.1.4}/PKG-INFO +16 -1
  2. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/README.md +15 -0
  3. {pytinytensor-0.1.2 → pytinytensor-0.1.4/pytinytensor.egg-info}/PKG-INFO +16 -1
  4. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/pytinytensor.egg-info/SOURCES.txt +3 -23
  5. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/setup.py +1 -1
  6. {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/nn/activations.py +1 -0
  7. pytinytensor-0.1.4/tinytensor/nn/dropout.py +23 -0
  8. {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/nn/modules.py +8 -7
  9. {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/optim/optimizer.py +13 -6
  10. {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/utils/__init__.py +3 -2
  11. pytinytensor-0.1.4/tinytensor/utils/summary.py +49 -0
  12. pytinytensor-0.1.2/tinytensor/nn/activations.py +0 -36
  13. pytinytensor-0.1.2/tinytensor/nn/modules.py +0 -63
  14. pytinytensor-0.1.2/tinytensor/optim/optimizer.py +0 -72
  15. pytinytensor-0.1.2/tinytensor/setup.py +0 -81
  16. pytinytensor-0.1.2/tinytensor/tinytensor/__init__.py +0 -0
  17. pytinytensor-0.1.2/tinytensor/tinytensor/backends/__init__.py +0 -0
  18. pytinytensor-0.1.2/tinytensor/tinytensor/backends/cpu_numpy.py +0 -0
  19. pytinytensor-0.1.2/tinytensor/tinytensor/config.py +0 -20
  20. pytinytensor-0.1.2/tinytensor/tinytensor/core/__init__.py +0 -0
  21. pytinytensor-0.1.2/tinytensor/tinytensor/core/autograd.py +0 -22
  22. pytinytensor-0.1.2/tinytensor/tinytensor/core/ops.py +0 -1
  23. pytinytensor-0.1.2/tinytensor/tinytensor/core/tensor.py +0 -288
  24. pytinytensor-0.1.2/tinytensor/tinytensor/data/__init__.py +0 -5
  25. pytinytensor-0.1.2/tinytensor/tinytensor/data/dataloader.py +0 -41
  26. pytinytensor-0.1.2/tinytensor/tinytensor/data/dataset.py +0 -19
  27. pytinytensor-0.1.2/tinytensor/tinytensor/nn/__init__.py +0 -0
  28. pytinytensor-0.1.2/tinytensor/tinytensor/nn/linear.py +0 -18
  29. pytinytensor-0.1.2/tinytensor/tinytensor/nn/losses.py +0 -12
  30. pytinytensor-0.1.2/tinytensor/tinytensor/optim/__init__.py +0 -11
  31. pytinytensor-0.1.2/tinytensor/utils/__init__.py +0 -4
  32. pytinytensor-0.1.2/tinytensor/utils/bar.py +0 -26
  33. pytinytensor-0.1.2/tinytensor/utils/early_stopping.py +0 -64
  34. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/LICENSE +0 -0
  35. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/pyproject.toml +0 -0
  36. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/pytinytensor.egg-info/dependency_links.txt +0 -0
  37. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/pytinytensor.egg-info/requires.txt +0 -0
  38. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/pytinytensor.egg-info/top_level.txt +0 -0
  39. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/setup.cfg +0 -0
  40. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_autograd.py +0 -0
  41. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_data.py +0 -0
  42. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_losses.py +0 -0
  43. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_nn.py +0 -0
  44. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_optim.py +0 -0
  45. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tests/test_tensor_math.py +0 -0
  46. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/__init__.py +0 -0
  47. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/backends/__init__.py +0 -0
  48. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/backends/cpu_numpy.py +0 -0
  49. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/backends/cuda_binding.cpp +0 -0
  50. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/backends/cuda_gpu.cu +0 -0
  51. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/backends/cuda_gpu.py +0 -0
  52. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/config.py +0 -0
  53. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/core/__init__.py +0 -0
  54. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/core/autograd.py +0 -0
  55. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/core/ops.py +0 -0
  56. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/core/tensor.py +0 -0
  57. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/data/__init__.py +0 -0
  58. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/data/dataloader.py +0 -0
  59. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/data/dataset.py +0 -0
  60. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/nn/__init__.py +0 -0
  61. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/nn/linear.py +0 -0
  62. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/nn/losses.py +0 -0
  63. {pytinytensor-0.1.2 → pytinytensor-0.1.4}/tinytensor/optim/__init__.py +0 -0
  64. {pytinytensor-0.1.2/tinytensor → pytinytensor-0.1.4}/tinytensor/utils/bar.py +0 -0
  65. {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.2
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.2
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
@@ -113,7 +113,7 @@ else:
113
113
 
114
114
  setup(
115
115
  name="pytinytensor",
116
- version="0.1.2",
116
+ version="0.1.4",
117
117
  description="мини ИИ фреймворк от IbrokimN ( github/IbrokhimN )",
118
118
  long_description=long_description,
119
119
  long_description_content_type="text/markdown",
@@ -7,6 +7,7 @@ class ReLU(Module):
7
7
  class LeReLU(Module):
8
8
  # у нас есть тут альфа
9
9
  def __init__(self, alpha=0.01):
10
+ super().__init__()
10
11
  self.alpha = alpha
11
12
 
12
13
  def forward(self, x):
@@ -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
- p.data -= self.lr * (m_hat / denom + self.weight_decay * p.data)
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
- __all__ = ["progress_bar", "train_bar",
4
- "EarlyStopping"]
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
@@ -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
- # пока что побудет пустым