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.
- cli.py +604 -0
- pytensorforge-0.1.0.dist-info/METADATA +103 -0
- pytensorforge-0.1.0.dist-info/RECORD +146 -0
- pytensorforge-0.1.0.dist-info/WHEEL +5 -0
- pytensorforge-0.1.0.dist-info/entry_points.txt +2 -0
- pytensorforge-0.1.0.dist-info/top_level.txt +2 -0
- src/__init__.py +0 -0
- src/activations/Activation.py +4 -0
- src/activations/ELU.py +11 -0
- src/activations/GELU.py +6 -0
- src/activations/ReLU.py +27 -0
- src/activations/SELU.py +14 -0
- src/activations/Sigmoid.py +27 -0
- src/activations/Softmax.py +84 -0
- src/activations/Tanh.py +29 -0
- src/activations/__init__.py +17 -0
- src/config.py +120 -0
- src/core/Matrix.py +3 -0
- src/core/Scalar.py +18 -0
- src/core/Tensor.py +866 -0
- src/core/Vector.py +31 -0
- src/core/__init__.py +0 -0
- src/data/__init__.py +0 -0
- src/data/chat_dataset.py +188 -0
- src/data/corpus.py +104 -0
- src/data/document_stream.py +178 -0
- src/data/parallel_encode.py +86 -0
- src/data/prefetch.py +62 -0
- src/data/shard_builder.py +119 -0
- src/data/shard_writer.py +81 -0
- src/data/sharded_dataset.py +112 -0
- src/data/streaming_dataset.py +132 -0
- src/data/validation.py +212 -0
- src/inference/__init__.py +0 -0
- src/inference/chat_template.py +384 -0
- src/inference/config.py +48 -0
- src/inference/engine.py +241 -0
- src/inference/export.py +133 -0
- src/inference/kv_cache.py +65 -0
- src/inference/runtime.py +161 -0
- src/inference/sampling.py +42 -0
- src/inference/scheduler.py +473 -0
- src/inference/text.py +67 -0
- src/initializers/Constant.py +9 -0
- src/initializers/GlorotNormal.py +15 -0
- src/initializers/GlorotUniform.py +26 -0
- src/initializers/HeNormal.py +15 -0
- src/initializers/HeUniform.py +14 -0
- src/initializers/Initializer.py +4 -0
- src/initializers/LecunNormal.py +16 -0
- src/initializers/LecunUniform.py +14 -0
- src/initializers/Ones.py +6 -0
- src/initializers/Orthogonal.py +14 -0
- src/initializers/RandomNormal.py +14 -0
- src/initializers/RandomUniform.py +14 -0
- src/initializers/Zeros.py +8 -0
- src/initializers/__init__.py +17 -0
- src/loss/CategoricalCrossEntropy.py +9 -0
- src/loss/CrossEntropyLoss.py +34 -0
- src/loss/CrossEntropyWithLogitsLoss.py +59 -0
- src/loss/Hinge.py +5 -0
- src/loss/Huber.py +22 -0
- src/loss/Loss.py +6 -0
- src/loss/MSE.py +7 -0
- src/loss/MSELoss.py +10 -0
- src/loss/SparseCategoricalCrossEntropy.py +15 -0
- src/loss/__init__.py +18 -0
- src/loss/bce.py +34 -0
- src/loss/mae.py +16 -0
- src/math/__init__.py +0 -0
- src/math/clip.py +37 -0
- src/math/exp.py +27 -0
- src/math/log.py +25 -0
- src/math/sigmoid.py +5 -0
- src/models/__init__.py +0 -0
- src/models/embedding/Embedding.py +65 -0
- src/models/embedding/__init__.py +0 -0
- src/models/gpt/__init__.py +0 -0
- src/models/gpt/attention.py +158 -0
- src/models/gpt/block.py +74 -0
- src/models/gpt/config.py +103 -0
- src/models/gpt/context.py +44 -0
- src/models/gpt/model.py +165 -0
- src/models/gpt/recompute.py +35 -0
- src/models/gpt/rope.py +84 -0
- src/models/regression/Linear.py +51 -0
- src/models/regression/Logistic.py +36 -0
- src/models/regression/__init__.py +0 -0
- src/models/seq/Sequential.py +297 -0
- src/models/seq/__init__.py +0 -0
- src/models/svm/__init__.py +0 -0
- src/models/tokenizer/BPETokenizer.py +228 -0
- src/models/tokenizer/__init__.py +0 -0
- src/models/transformers/Dropout.py +35 -0
- src/models/transformers/LastToken.py +10 -0
- src/models/transformers/LayerNorm.py +54 -0
- src/models/transformers/Linear.py +18 -0
- src/models/transformers/MultiHeadAttention.py +130 -0
- src/models/transformers/TransformerBlock.py +79 -0
- src/models/transformers/__init__.py +0 -0
- src/neural/Dense.py +58 -0
- src/neural/LSTM.py +167 -0
- src/neural/Layer.py +72 -0
- src/neural/Parameter.py +30 -0
- src/neural/RNN.py +83 -0
- src/neural/__init__.py +0 -0
- src/ops/__init__.py +0 -0
- src/ops/stack.py +40 -0
- src/optimizers/Adagrad.py +31 -0
- src/optimizers/Adam.py +98 -0
- src/optimizers/AdamW.py +84 -0
- src/optimizers/Batch.py +11 -0
- src/optimizers/Nesterov.py +35 -0
- src/optimizers/Optimizer.py +18 -0
- src/optimizers/RMSProp.py +35 -0
- src/optimizers/SGD.py +30 -0
- src/optimizers/SGDMomentum.py +28 -0
- src/optimizers/__init__.py +9 -0
- src/scaling/StandardScaler.py +15 -0
- src/scaling/__init__.py +0 -0
- src/serialization/__init__.py +0 -0
- src/serialization/checkpoint.py +58 -0
- src/serialization/modelio.py +132 -0
- src/serving/__init__.py +0 -0
- src/serving/app.py +792 -0
- src/serving/config.py +216 -0
- src/serving/errors.py +51 -0
- src/serving/http.py +599 -0
- src/serving/metrics.py +293 -0
- src/serving/model_server.py +287 -0
- src/serving/protocol.py +377 -0
- src/serving/security.py +200 -0
- src/serving/server.py +121 -0
- src/tokenization/__init__.py +0 -0
- src/tokenization/base.py +75 -0
- src/tokenization/bpe.py +190 -0
- src/tokenization/bytebpe.py +476 -0
- src/tokenization/registry.py +28 -0
- src/training/__init__.py +0 -0
- src/training/checkpoint_manager.py +101 -0
- src/training/experiment.py +71 -0
- src/training/losses.py +42 -0
- src/training/precision.py +141 -0
- src/training/profiler.py +38 -0
- src/training/scheduler.py +50 -0
- src/training/trainer.py +594 -0
src/tokenization/base.py
ADDED
|
@@ -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)
|
src/tokenization/bpe.py
ADDED
|
@@ -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
|