pytensorforge 0.1.0__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.
Files changed (146) hide show
  1. cli.py +604 -0
  2. pytensorforge-0.1.0.dist-info/METADATA +103 -0
  3. pytensorforge-0.1.0.dist-info/RECORD +146 -0
  4. pytensorforge-0.1.0.dist-info/WHEEL +5 -0
  5. pytensorforge-0.1.0.dist-info/entry_points.txt +2 -0
  6. pytensorforge-0.1.0.dist-info/top_level.txt +2 -0
  7. src/__init__.py +0 -0
  8. src/activations/Activation.py +4 -0
  9. src/activations/ELU.py +11 -0
  10. src/activations/GELU.py +6 -0
  11. src/activations/ReLU.py +27 -0
  12. src/activations/SELU.py +14 -0
  13. src/activations/Sigmoid.py +27 -0
  14. src/activations/Softmax.py +84 -0
  15. src/activations/Tanh.py +29 -0
  16. src/activations/__init__.py +17 -0
  17. src/config.py +120 -0
  18. src/core/Matrix.py +3 -0
  19. src/core/Scalar.py +18 -0
  20. src/core/Tensor.py +866 -0
  21. src/core/Vector.py +31 -0
  22. src/core/__init__.py +0 -0
  23. src/data/__init__.py +0 -0
  24. src/data/chat_dataset.py +188 -0
  25. src/data/corpus.py +104 -0
  26. src/data/document_stream.py +178 -0
  27. src/data/parallel_encode.py +86 -0
  28. src/data/prefetch.py +62 -0
  29. src/data/shard_builder.py +119 -0
  30. src/data/shard_writer.py +81 -0
  31. src/data/sharded_dataset.py +112 -0
  32. src/data/streaming_dataset.py +132 -0
  33. src/data/validation.py +212 -0
  34. src/inference/__init__.py +0 -0
  35. src/inference/chat_template.py +384 -0
  36. src/inference/config.py +48 -0
  37. src/inference/engine.py +241 -0
  38. src/inference/export.py +133 -0
  39. src/inference/kv_cache.py +65 -0
  40. src/inference/runtime.py +161 -0
  41. src/inference/sampling.py +42 -0
  42. src/inference/scheduler.py +473 -0
  43. src/inference/text.py +67 -0
  44. src/initializers/Constant.py +9 -0
  45. src/initializers/GlorotNormal.py +15 -0
  46. src/initializers/GlorotUniform.py +26 -0
  47. src/initializers/HeNormal.py +15 -0
  48. src/initializers/HeUniform.py +14 -0
  49. src/initializers/Initializer.py +4 -0
  50. src/initializers/LecunNormal.py +16 -0
  51. src/initializers/LecunUniform.py +14 -0
  52. src/initializers/Ones.py +6 -0
  53. src/initializers/Orthogonal.py +14 -0
  54. src/initializers/RandomNormal.py +14 -0
  55. src/initializers/RandomUniform.py +14 -0
  56. src/initializers/Zeros.py +8 -0
  57. src/initializers/__init__.py +17 -0
  58. src/loss/CategoricalCrossEntropy.py +9 -0
  59. src/loss/CrossEntropyLoss.py +34 -0
  60. src/loss/CrossEntropyWithLogitsLoss.py +59 -0
  61. src/loss/Hinge.py +5 -0
  62. src/loss/Huber.py +22 -0
  63. src/loss/Loss.py +6 -0
  64. src/loss/MSE.py +7 -0
  65. src/loss/MSELoss.py +10 -0
  66. src/loss/SparseCategoricalCrossEntropy.py +15 -0
  67. src/loss/__init__.py +18 -0
  68. src/loss/bce.py +34 -0
  69. src/loss/mae.py +16 -0
  70. src/math/__init__.py +0 -0
  71. src/math/clip.py +37 -0
  72. src/math/exp.py +27 -0
  73. src/math/log.py +25 -0
  74. src/math/sigmoid.py +5 -0
  75. src/models/__init__.py +0 -0
  76. src/models/embedding/Embedding.py +65 -0
  77. src/models/embedding/__init__.py +0 -0
  78. src/models/gpt/__init__.py +0 -0
  79. src/models/gpt/attention.py +158 -0
  80. src/models/gpt/block.py +74 -0
  81. src/models/gpt/config.py +103 -0
  82. src/models/gpt/context.py +44 -0
  83. src/models/gpt/model.py +165 -0
  84. src/models/gpt/recompute.py +35 -0
  85. src/models/gpt/rope.py +84 -0
  86. src/models/regression/Linear.py +51 -0
  87. src/models/regression/Logistic.py +36 -0
  88. src/models/regression/__init__.py +0 -0
  89. src/models/seq/Sequential.py +297 -0
  90. src/models/seq/__init__.py +0 -0
  91. src/models/svm/__init__.py +0 -0
  92. src/models/tokenizer/BPETokenizer.py +228 -0
  93. src/models/tokenizer/__init__.py +0 -0
  94. src/models/transformers/Dropout.py +35 -0
  95. src/models/transformers/LastToken.py +10 -0
  96. src/models/transformers/LayerNorm.py +54 -0
  97. src/models/transformers/Linear.py +18 -0
  98. src/models/transformers/MultiHeadAttention.py +130 -0
  99. src/models/transformers/TransformerBlock.py +79 -0
  100. src/models/transformers/__init__.py +0 -0
  101. src/neural/Dense.py +58 -0
  102. src/neural/LSTM.py +167 -0
  103. src/neural/Layer.py +72 -0
  104. src/neural/Parameter.py +30 -0
  105. src/neural/RNN.py +83 -0
  106. src/neural/__init__.py +0 -0
  107. src/ops/__init__.py +0 -0
  108. src/ops/stack.py +40 -0
  109. src/optimizers/Adagrad.py +31 -0
  110. src/optimizers/Adam.py +98 -0
  111. src/optimizers/AdamW.py +84 -0
  112. src/optimizers/Batch.py +11 -0
  113. src/optimizers/Nesterov.py +35 -0
  114. src/optimizers/Optimizer.py +18 -0
  115. src/optimizers/RMSProp.py +35 -0
  116. src/optimizers/SGD.py +30 -0
  117. src/optimizers/SGDMomentum.py +28 -0
  118. src/optimizers/__init__.py +9 -0
  119. src/scaling/StandardScaler.py +15 -0
  120. src/scaling/__init__.py +0 -0
  121. src/serialization/__init__.py +0 -0
  122. src/serialization/checkpoint.py +58 -0
  123. src/serialization/modelio.py +132 -0
  124. src/serving/__init__.py +0 -0
  125. src/serving/app.py +792 -0
  126. src/serving/config.py +216 -0
  127. src/serving/errors.py +51 -0
  128. src/serving/http.py +599 -0
  129. src/serving/metrics.py +293 -0
  130. src/serving/model_server.py +287 -0
  131. src/serving/protocol.py +377 -0
  132. src/serving/security.py +200 -0
  133. src/serving/server.py +121 -0
  134. src/tokenization/__init__.py +0 -0
  135. src/tokenization/base.py +75 -0
  136. src/tokenization/bpe.py +190 -0
  137. src/tokenization/bytebpe.py +476 -0
  138. src/tokenization/registry.py +28 -0
  139. src/training/__init__.py +0 -0
  140. src/training/checkpoint_manager.py +101 -0
  141. src/training/experiment.py +71 -0
  142. src/training/losses.py +42 -0
  143. src/training/precision.py +141 -0
  144. src/training/profiler.py +38 -0
  145. src/training/scheduler.py +50 -0
  146. src/training/trainer.py +594 -0
@@ -0,0 +1,75 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class Tokenizer(ABC):
5
+
6
+ @property
7
+ @abstractmethod
8
+ def vocab_size(self):
9
+ raise NotImplementedError
10
+
11
+ @property
12
+ @abstractmethod
13
+ def bos_id(self):
14
+ raise NotImplementedError
15
+
16
+ @property
17
+ @abstractmethod
18
+ def eos_id(self):
19
+ raise NotImplementedError
20
+
21
+ @property
22
+ def pad_id(self):
23
+ return None
24
+
25
+ @property
26
+ def special_tokens(self):
27
+ return {}
28
+
29
+ def token_to_id(self, token):
30
+ return self.special_tokens.get(token)
31
+
32
+ @property
33
+ @abstractmethod
34
+ def identity(self):
35
+ raise NotImplementedError
36
+
37
+ @abstractmethod
38
+ def encode(self, text, add_bos=False, add_eos=False):
39
+ raise NotImplementedError
40
+
41
+ @abstractmethod
42
+ def decode(self, ids):
43
+ raise NotImplementedError
44
+
45
+ def batch_encode(self, texts, add_bos=False, add_eos=False):
46
+ return [
47
+ self.encode(text, add_bos=add_bos, add_eos=add_eos)
48
+ for text in texts
49
+ ]
50
+
51
+ def batch_decode(self, batches):
52
+ return [self.decode(ids) for ids in batches]
53
+
54
+ def encode_stream(self, texts, add_bos=False, add_eos=False):
55
+ for text in texts:
56
+ for token_id in self.encode(text, add_bos=add_bos, add_eos=add_eos):
57
+ yield token_id
58
+
59
+ @abstractmethod
60
+ def save(self, path):
61
+ raise NotImplementedError
62
+
63
+ @classmethod
64
+ @abstractmethod
65
+ def load(cls, path):
66
+ raise NotImplementedError
67
+
68
+
69
+ def identity_matches(saved, current):
70
+ if not saved or not current:
71
+ return False
72
+
73
+ shared = set(saved) & set(current)
74
+
75
+ return "type" in shared and all(saved[k] == current[k] for k in shared)
@@ -0,0 +1,190 @@
1
+ import hashlib
2
+ import json
3
+
4
+ from src.models.tokenizer.BPETokenizer import BPETokenizer
5
+ from src.tokenization.base import Tokenizer
6
+
7
+ TOKENIZER_FORMAT_VERSION = 1
8
+
9
+
10
+ class PTFBPETokenizer(Tokenizer):
11
+
12
+ def __init__(
13
+ self,
14
+ vocab_size=30000,
15
+ lowercase=True,
16
+ bos_token="<bos>",
17
+ eos_token="<eos>",
18
+ pad_token="<pad>",
19
+ unk_token="<unk>",
20
+ ):
21
+ self._base = BPETokenizer(vocab_size=vocab_size, lowercase=lowercase)
22
+
23
+ self.bos_token = bos_token
24
+ self.eos_token = eos_token
25
+ self.pad_token = pad_token
26
+ self.unk_token = unk_token
27
+
28
+ self._bos_id = None
29
+ self._eos_id = None
30
+ self._pad_id = None
31
+ self._unk_id = None
32
+
33
+ self._fitted = False
34
+
35
+ def fit(self, texts, max_chars=None):
36
+ collected = []
37
+ total_chars = 0
38
+
39
+ for text in texts:
40
+ collected.append(text)
41
+ total_chars += len(text)
42
+
43
+ if max_chars is not None and total_chars >= max_chars:
44
+ break
45
+
46
+ self._base.fit(collected)
47
+ self._register_special_tokens()
48
+ self._fitted = True
49
+
50
+ def _register_special_tokens(self):
51
+ next_id = len(self._base.word_to_index)
52
+
53
+ for token in (self.bos_token, self.eos_token, self.pad_token, self.unk_token):
54
+ if token not in self._base.word_to_index:
55
+ self._base.word_to_index[token] = next_id
56
+ self._base.index_to_word[next_id] = token
57
+ next_id += 1
58
+
59
+ self._bos_id = self._base.word_to_index[self.bos_token]
60
+ self._eos_id = self._base.word_to_index[self.eos_token]
61
+ self._pad_id = self._base.word_to_index[self.pad_token]
62
+ self._unk_id = self._base.word_to_index[self.unk_token]
63
+
64
+ @property
65
+ def vocab_size(self):
66
+ return len(self._base.word_to_index)
67
+
68
+ @property
69
+ def bos_id(self):
70
+ return self._bos_id
71
+
72
+ @property
73
+ def eos_id(self):
74
+ return self._eos_id
75
+
76
+ @property
77
+ def pad_id(self):
78
+ return self._pad_id
79
+
80
+ @property
81
+ def unk_id(self):
82
+ return self._unk_id
83
+
84
+ @property
85
+ def special_tokens(self):
86
+ return {
87
+ self.bos_token: self._bos_id,
88
+ self.eos_token: self._eos_id,
89
+ self.pad_token: self._pad_id,
90
+ self.unk_token: self._unk_id,
91
+ }
92
+
93
+ def _fingerprint(self):
94
+ digest = hashlib.sha256()
95
+ digest.update(json.dumps([list(m) for m in self._base.merges]).encode())
96
+ digest.update(json.dumps(sorted(self._base.word_to_index.items())).encode())
97
+ return digest.hexdigest()[:16]
98
+
99
+ @property
100
+ def identity(self):
101
+ return {
102
+ "type": "bpe",
103
+ "format_version": TOKENIZER_FORMAT_VERSION,
104
+ "vocab_size": self.vocab_size,
105
+ "lowercase": self._base.lowercase,
106
+ "fingerprint": self._fingerprint(),
107
+ }
108
+
109
+ def _encode_word_safe(self, word):
110
+ try:
111
+ return self._base.encode_word(word)
112
+ except KeyError:
113
+ return [self._unk_id] if self._unk_id is not None else []
114
+
115
+ def encode(self, text, add_bos=False, add_eos=False):
116
+ if self._base.lowercase:
117
+ text = text.lower()
118
+
119
+ ids = []
120
+
121
+ if add_bos and self._bos_id is not None:
122
+ ids.append(self._bos_id)
123
+
124
+ for word in text.split():
125
+ ids.extend(self._encode_word_safe(word))
126
+
127
+ if add_eos and self._eos_id is not None:
128
+ ids.append(self._eos_id)
129
+
130
+ return ids
131
+
132
+ def decode(self, ids):
133
+ specials = {self._bos_id, self._eos_id, self._pad_id}
134
+
135
+ pieces = [
136
+ self._base.index_to_word[i]
137
+ for i in ids
138
+ if i in self._base.index_to_word and i not in specials
139
+ ]
140
+
141
+ text = "".join(pieces).replace("</w>", " ")
142
+
143
+ return " ".join(text.split())
144
+
145
+ def save(self, path):
146
+ state = {
147
+ "type": "bpe",
148
+ "vocab_size": self._base.vocab_size,
149
+ "lowercase": self._base.lowercase,
150
+ "merges": [list(pair) for pair in self._base.merges],
151
+ "word_to_index": self._base.word_to_index,
152
+ "bos_token": self.bos_token,
153
+ "eos_token": self.eos_token,
154
+ "pad_token": self.pad_token,
155
+ "unk_token": self.unk_token,
156
+ "format_version": TOKENIZER_FORMAT_VERSION,
157
+ }
158
+
159
+ with open(path, "w") as f:
160
+ json.dump(state, f)
161
+
162
+ @classmethod
163
+ def load(cls, path):
164
+ with open(path) as f:
165
+ state = json.load(f)
166
+
167
+ tok = cls(
168
+ vocab_size=state["vocab_size"],
169
+ lowercase=state["lowercase"],
170
+ bos_token=state["bos_token"],
171
+ eos_token=state["eos_token"],
172
+ pad_token=state["pad_token"],
173
+ unk_token=state["unk_token"],
174
+ )
175
+
176
+ tok._base.merges = [tuple(pair) for pair in state["merges"]]
177
+ tok._base.word_to_index = {
178
+ k: int(v) for k, v in state["word_to_index"].items()
179
+ }
180
+ tok._base.index_to_word = {
181
+ v: k for k, v in tok._base.word_to_index.items()
182
+ }
183
+
184
+ tok._bos_id = tok._base.word_to_index[tok.bos_token]
185
+ tok._eos_id = tok._base.word_to_index[tok.eos_token]
186
+ tok._pad_id = tok._base.word_to_index[tok.pad_token]
187
+ tok._unk_id = tok._base.word_to_index[tok.unk_token]
188
+ tok._fitted = True
189
+
190
+ return tok