@genai-fi/nanogpt 0.21.0 → 0.23.0
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.
- package/dist/{DatasetBuilder-B9UGNQT5.js → DatasetBuilder-C0iJT29K.js} +122 -93
- package/dist/Generator.js +2 -2
- package/dist/TeachableLLM.d.ts +2 -1
- package/dist/TeachableLLM.js +1 -1
- package/dist/Trainer-DBsyWJ4s.js +228 -0
- package/dist/Trainer.d.ts +2 -1
- package/dist/Trainer.js +1 -1
- package/dist/data/stream.d.ts +24 -0
- package/dist/data/stream.js +2 -0
- package/dist/data/textLoader.d.ts +2 -2
- package/dist/data/textLoader.js +28 -67
- package/dist/{BaseTokeniser-C9TSv4th.js → eventemitter3-D_qV3Lof.js} +2 -132
- package/dist/loader/load.js +2 -2
- package/dist/loader/loadHF.js +1 -1
- package/dist/loader/loadTransformers.js +2 -2
- package/dist/loader/newZipLoad.js +1 -1
- package/dist/loader/oldZipLoad.js +1 -1
- package/dist/loader/save.js +1 -1
- package/dist/{main-DdsoTJAW.js → main-BSaDGH7I.js} +2686 -2912
- package/dist/main.d.ts +4 -0
- package/dist/main.js +20 -16
- package/dist/models/NanoGPTV1.js +1 -1
- package/dist/models/NanoGPTV2.js +1 -1
- package/dist/models/factory.js +1 -1
- package/dist/models/model.js +1 -1
- package/dist/stream-BjdpSNqB.js +2296 -0
- package/dist/tokeniser/BaseTokeniser.d.ts +2 -1
- package/dist/tokeniser/BaseTokeniser.js +135 -2
- package/dist/tokeniser/CharTokeniser.d.ts +2 -2
- package/dist/tokeniser/CharTokeniser.js +10 -14
- package/dist/tokeniser/bpe.d.ts +2 -2
- package/dist/tokeniser/bpe.js +23 -32
- package/dist/tokeniser/type.d.ts +3 -2
- package/dist/training/DatasetBuilder.d.ts +17 -1
- package/dist/training/DatasetBuilder.js +2 -2
- package/dist/training/PreTrainer.js +1 -1
- package/dist/training/SFTTrainer.js +1 -1
- package/dist/training/tasks/ConversationTask.d.ts +9 -10
- package/dist/training/tasks/ConversationTask.js +15 -24
- package/dist/training/tasks/PretrainingTask.d.ts +4 -4
- package/dist/training/tasks/PretrainingTask.js +2 -2
- package/dist/training/tasks/StartSentenceTask.d.ts +4 -4
- package/dist/training/tasks/StartSentenceTask.js +3 -3
- package/dist/training/tasks/Task.d.ts +19 -12
- package/dist/training/tasks/Task.js +25 -30
- package/dist/training/tasks/TokenStore.d.ts +46 -0
- package/dist/training/tasks/TokenStore.js +215 -0
- package/dist/training/tasks/splitter.d.ts +2 -2
- package/dist/training/tasks/splitter.js +11 -11
- package/dist/training/validation.d.ts +4 -2
- package/dist/training/validation.js +21 -2
- package/dist/utilities/tokens.d.ts +2 -0
- package/dist/utilities/tokens.js +40 -0
- package/dist/utilities/topP.js +6 -0
- package/package.json +2 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ConversationStream } from '../../data/stream';
|
|
1
2
|
import { Conversation, ITokeniser } from './type';
|
|
2
3
|
import { default as EE } from 'eventemitter3';
|
|
3
4
|
export declare const SPECIALS: string[];
|
|
@@ -15,7 +16,7 @@ export default abstract class BaseTokeniser extends EE<'trainStatus'> implements
|
|
|
15
16
|
protected addSpecialTokens(): void;
|
|
16
17
|
protected addSpecialToken(token: string, index: number): void;
|
|
17
18
|
generateID(): void;
|
|
18
|
-
abstract train(text:
|
|
19
|
+
abstract train(text: ConversationStream[], cb?: (vocab: number) => void, datasetID?: string): Promise<number>;
|
|
19
20
|
abstract getVocab(): string[];
|
|
20
21
|
abstract getMerges(): [string, string][];
|
|
21
22
|
abstract destroy(): void;
|
|
@@ -1,2 +1,135 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { t as e } from "../eventemitter3-D_qV3Lof.js";
|
|
2
|
+
//#region lib/tokeniser/BaseTokeniser.ts
|
|
3
|
+
var t = [
|
|
4
|
+
"<eos>",
|
|
5
|
+
"<bos>",
|
|
6
|
+
"",
|
|
7
|
+
"<pad>",
|
|
8
|
+
"<|user_start|>",
|
|
9
|
+
"<|user_end|>",
|
|
10
|
+
"<|assistant_start|>",
|
|
11
|
+
"<|assistant_end|>",
|
|
12
|
+
"<|system_start|>",
|
|
13
|
+
"<|system_end|>"
|
|
14
|
+
], n = class extends e {
|
|
15
|
+
id = "untrained";
|
|
16
|
+
datasetID;
|
|
17
|
+
specialTokens = /* @__PURE__ */ new Map();
|
|
18
|
+
specialTokenSet = /* @__PURE__ */ new Set();
|
|
19
|
+
isSpecialToken(e) {
|
|
20
|
+
return this.specialTokenSet.has(e);
|
|
21
|
+
}
|
|
22
|
+
addSpecialTokens() {
|
|
23
|
+
t.forEach((e, t) => {
|
|
24
|
+
this.addToken(e, t), this.specialTokens.set(e, t), this.specialTokenSet.add(t);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
addSpecialToken(e, t) {
|
|
28
|
+
this.specialTokens.set(e, t), this.specialTokenSet.add(t);
|
|
29
|
+
}
|
|
30
|
+
generateID() {
|
|
31
|
+
let e = this.getVocab(), t = 2166136261, n = 2654435769;
|
|
32
|
+
if (e.length === 0) {
|
|
33
|
+
this.id = "untrained";
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
for (let r = 0; r < e.length; r++) {
|
|
37
|
+
let i = e[r];
|
|
38
|
+
t ^= i.length, t = Math.imul(t, 16777619), n ^= r, n = Math.imul(n, 2246822507);
|
|
39
|
+
for (let e = 0; e < i.length; e++) {
|
|
40
|
+
let r = i.charCodeAt(e);
|
|
41
|
+
t ^= r, t = Math.imul(t, 16777619), n ^= r, n = Math.imul(n, 3266489909);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let r = (t >>> 0).toString(36), i = (n >>> 0).toString(36);
|
|
45
|
+
this.id = "tokeniser_" + r + "_" + i;
|
|
46
|
+
}
|
|
47
|
+
encodeSequence(e) {
|
|
48
|
+
let t = this.encode(e);
|
|
49
|
+
return [
|
|
50
|
+
this.bosToken,
|
|
51
|
+
...t,
|
|
52
|
+
this.eosToken
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
encodeAsSequence(e, t) {
|
|
56
|
+
let n = e.flatMap((e) => this.encode(e.content));
|
|
57
|
+
return t ? [
|
|
58
|
+
this.bosToken,
|
|
59
|
+
...n,
|
|
60
|
+
this.eosToken,
|
|
61
|
+
this.bosToken
|
|
62
|
+
] : [
|
|
63
|
+
this.bosToken,
|
|
64
|
+
...n,
|
|
65
|
+
this.eosToken
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
encodeConversation(e, t, n) {
|
|
69
|
+
let r = [[this.bosToken]], i;
|
|
70
|
+
n && (i = [[!1]]);
|
|
71
|
+
let a = [
|
|
72
|
+
this.getSpecialTokenIndex("<|user_start|>"),
|
|
73
|
+
this.getSpecialTokenIndex("<|assistant_start|>"),
|
|
74
|
+
this.getSpecialTokenIndex("<|system_start|>")
|
|
75
|
+
], o = [
|
|
76
|
+
this.getSpecialTokenIndex("<|user_end|>"),
|
|
77
|
+
this.getSpecialTokenIndex("<|assistant_end|>"),
|
|
78
|
+
this.getSpecialTokenIndex("<|system_end|>")
|
|
79
|
+
];
|
|
80
|
+
for (let t of e) {
|
|
81
|
+
let e = !1, s = this.encode(t.content);
|
|
82
|
+
switch (t.role) {
|
|
83
|
+
case "user":
|
|
84
|
+
r.push([a[0]]), e = !0;
|
|
85
|
+
break;
|
|
86
|
+
case "assistant":
|
|
87
|
+
r.push([a[1]]);
|
|
88
|
+
break;
|
|
89
|
+
case "system":
|
|
90
|
+
r.push([a[2]]), e = !0;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
switch (r.push(s), t.role) {
|
|
94
|
+
case "user":
|
|
95
|
+
r.push([o[0]]);
|
|
96
|
+
break;
|
|
97
|
+
case "assistant":
|
|
98
|
+
r.push([o[1]]);
|
|
99
|
+
break;
|
|
100
|
+
case "system":
|
|
101
|
+
r.push([o[2]]);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
n && i && e ? (i.push([!1]), i.push(s.map(() => !1)), i.push([!1])) : n && i && (i.push([!1]), i.push(s.map(() => !0)), i.push([!0]));
|
|
105
|
+
}
|
|
106
|
+
let s = r.flat();
|
|
107
|
+
return t ? (s.push(a[1]), n && i && i.push([!1])) : (s.push(this.eosToken), n && i && i.push([!0])), n && i ? {
|
|
108
|
+
tokens: s,
|
|
109
|
+
mask: i.flat()
|
|
110
|
+
} : s;
|
|
111
|
+
}
|
|
112
|
+
decodeConversation(e) {
|
|
113
|
+
let t = [], n = 0;
|
|
114
|
+
for (; n < e.length;) {
|
|
115
|
+
let r = e[n], i = null;
|
|
116
|
+
if (r === this.getSpecialTokenIndex("<|user_start|>") ? i = "user" : r === this.getSpecialTokenIndex("<|assistant_start|>") ? i = "assistant" : r === this.getSpecialTokenIndex("<|system_start|>") ? i = "system" : r === this.bosToken || (r === this.eosToken ? i = null : (i = "text", n--)), i) {
|
|
117
|
+
n++;
|
|
118
|
+
let r = [];
|
|
119
|
+
for (; n < e.length && e[n] !== this.getSpecialTokenIndex(`<|${i}_end|>`) && e[n] !== this.eosToken;) r.push(e[n]), n++;
|
|
120
|
+
let a = this.decode(r);
|
|
121
|
+
t.push({
|
|
122
|
+
role: i,
|
|
123
|
+
content: a
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
n++;
|
|
127
|
+
}
|
|
128
|
+
return t;
|
|
129
|
+
}
|
|
130
|
+
getSpecialTokenIndex(e) {
|
|
131
|
+
return this.specialTokens.get(e);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
//#endregion
|
|
135
|
+
export { t as SPECIALS, n as default };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { default as BaseTokeniser } from './BaseTokeniser';
|
|
2
|
-
import {
|
|
2
|
+
import { ConversationStream } from '../../data/stream';
|
|
3
3
|
export default class CharTokeniser extends BaseTokeniser {
|
|
4
4
|
vocabSize: number;
|
|
5
5
|
eosToken: number;
|
|
@@ -12,7 +12,7 @@ export default class CharTokeniser extends BaseTokeniser {
|
|
|
12
12
|
addToken(token: string, index?: number): number;
|
|
13
13
|
get trained(): boolean;
|
|
14
14
|
destroy(): void;
|
|
15
|
-
train(text:
|
|
15
|
+
train(text: ConversationStream[], cb?: (vocab: number) => void, datasetID?: string): Promise<number>;
|
|
16
16
|
tokenise(text: string[], numeric: true): number[][];
|
|
17
17
|
tokenise(text: string[]): string[][];
|
|
18
18
|
detokenise(tokens: (number[] | Uint16Array)[]): string[];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { yieldIfNeeded as e } from "../utilities/yielder.js";
|
|
2
|
-
import
|
|
2
|
+
import t, { SPECIALS as n } from "./BaseTokeniser.js";
|
|
3
3
|
//#region lib/tokeniser/CharTokeniser.ts
|
|
4
|
-
var r = ["<eos>", "<unk>"], i = class extends
|
|
4
|
+
var r = ["<eos>", "<unk>"], i = class extends t {
|
|
5
5
|
vocabSize = 0;
|
|
6
6
|
eosToken = 0;
|
|
7
7
|
bosToken = 0;
|
|
@@ -11,7 +11,7 @@ var r = ["<eos>", "<unk>"], i = class extends n {
|
|
|
11
11
|
_trained = !1;
|
|
12
12
|
constructor(e) {
|
|
13
13
|
if (super(), Array.isArray(e)) {
|
|
14
|
-
if (this.vocab = e, this.vocab.length > 0) this.vocabSize = this.vocab.length,
|
|
14
|
+
if (this.vocab = e, this.vocab.length > 0) this.vocabSize = this.vocab.length, n.forEach((e) => {
|
|
15
15
|
let t = this.vocab.indexOf(e);
|
|
16
16
|
t !== -1 && this.addSpecialToken(e, t);
|
|
17
17
|
}), this.eosToken = this.getSpecialTokenIndex("<eos>"), this.bosToken = this.getSpecialTokenIndex("<bos>") ?? this.eosToken, this.unkToken = this.getSpecialTokenIndex("") ?? -1, this.unkToken === -1 && (this.unkToken = this.vocab.indexOf("<unk>")), this.unkToken === -1 && (this.unkToken = this.vocab.indexOf("<pad>")), this.unkToken === -1 && (this.unkToken = this.vocab.indexOf("_")), this.unkToken === -1 && (this.unkToken = this.vocab.indexOf(" ")), this.unkToken === -1 && (this.unkToken = this.eosToken), this.vocab = this.vocab.map((e) => e === "<pad>" ? "" : e), this.vocab.forEach((e, t) => {
|
|
@@ -38,19 +38,15 @@ var r = ["<eos>", "<unk>"], i = class extends n {
|
|
|
38
38
|
async train(t, n, i) {
|
|
39
39
|
this.datasetID = i;
|
|
40
40
|
let a = /* @__PURE__ */ new Set(), o = performance.now();
|
|
41
|
-
for (let r of t)
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
for (let r of t) {
|
|
42
|
+
let t = r.cursor(), i = await t.next();
|
|
43
|
+
for (; i !== null;) i.forEach((e) => {
|
|
44
|
+
for (let t of e.content) a.add(t);
|
|
45
|
+
}), o = await e(o, n, 0), i = await t.next();
|
|
46
|
+
}
|
|
44
47
|
let s = Array.from(a), c = this.vocab.indexOf("", this.unkToken + 1), l = this.vocabSize - r.length;
|
|
45
48
|
if (c === -1) return this.generateID(), this.vocabSize;
|
|
46
|
-
if (this._trained = !0, s.length > l)
|
|
47
|
-
let e = /* @__PURE__ */ new Map();
|
|
48
|
-
t.forEach((t) => {
|
|
49
|
-
t.forEach((t) => {
|
|
50
|
-
for (let n of t.content) e.set(n, (e.get(n) || 0) + 1);
|
|
51
|
-
});
|
|
52
|
-
}), s.sort((t, n) => (e.get(t) || 0) - (e.get(n) || 0)), s.splice(0, s.length - l);
|
|
53
|
-
}
|
|
49
|
+
if (this._trained = !0, s.length > l) throw Error("too_small_vocab");
|
|
54
50
|
let u = c;
|
|
55
51
|
if (u !== -1) {
|
|
56
52
|
let e = new Set(this.vocab);
|
package/dist/tokeniser/bpe.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { default as BaseTokeniser } from './BaseTokeniser';
|
|
2
|
-
import {
|
|
2
|
+
import { ConversationStream } from '../../data/stream';
|
|
3
3
|
export default class BPETokeniser extends BaseTokeniser {
|
|
4
4
|
private targetSize;
|
|
5
5
|
private vocab;
|
|
@@ -15,7 +15,7 @@ export default class BPETokeniser extends BaseTokeniser {
|
|
|
15
15
|
get eosToken(): number;
|
|
16
16
|
get bosToken(): number;
|
|
17
17
|
get unkToken(): number;
|
|
18
|
-
train(text?:
|
|
18
|
+
train(text?: ConversationStream[], cb?: (vocab: number) => void, datasetID?: string): Promise<number>;
|
|
19
19
|
getVocab(): string[];
|
|
20
20
|
getMerges(): [string, string][];
|
|
21
21
|
private tokeniseWord;
|
package/dist/tokeniser/bpe.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { yieldIfNeeded as e } from "../utilities/yielder.js";
|
|
2
|
-
import
|
|
2
|
+
import t, { SPECIALS as n } from "./BaseTokeniser.js";
|
|
3
3
|
import r from "../utilities/tokenParse.js";
|
|
4
4
|
//#region lib/tokeniser/bpe.ts
|
|
5
5
|
function i(e, t) {
|
|
@@ -58,16 +58,16 @@ function l(e, t) {
|
|
|
58
58
|
e.tokens[n] = i;
|
|
59
59
|
}), e.pairs.delete(i(t.a, t.b));
|
|
60
60
|
}
|
|
61
|
-
var u = class extends
|
|
61
|
+
var u = class extends t {
|
|
62
62
|
targetSize;
|
|
63
63
|
vocab = /* @__PURE__ */ new Set();
|
|
64
64
|
vocabIndex = /* @__PURE__ */ new Map();
|
|
65
65
|
merges = [];
|
|
66
66
|
pretokenMap = /* @__PURE__ */ new Map();
|
|
67
|
-
constructor(e,
|
|
67
|
+
constructor(e, t) {
|
|
68
68
|
super(), Array.isArray(e) ? (e.forEach((e, t) => {
|
|
69
69
|
this.vocab.add(e), this.vocabIndex.set(e, t);
|
|
70
|
-
}),
|
|
70
|
+
}), t && (this.merges = t), this.targetSize = e.length, n.forEach((t) => {
|
|
71
71
|
let n = e.indexOf(t);
|
|
72
72
|
n !== -1 && this.addSpecialToken(t, n);
|
|
73
73
|
})) : (this.addSpecialTokens(), this.targetSize = e);
|
|
@@ -84,7 +84,7 @@ var u = class extends n {
|
|
|
84
84
|
this.vocab.clear(), this.vocabIndex.clear(), this.merges = [], this.pretokenMap.clear();
|
|
85
85
|
}
|
|
86
86
|
get trained() {
|
|
87
|
-
return this.vocab.size >
|
|
87
|
+
return this.vocab.size > n.length && this.vocab.size <= this.targetSize;
|
|
88
88
|
}
|
|
89
89
|
get vocabSize() {
|
|
90
90
|
return this.vocab.size;
|
|
@@ -100,40 +100,31 @@ var u = class extends n {
|
|
|
100
100
|
}
|
|
101
101
|
async train(t = [], n, i) {
|
|
102
102
|
this.datasetID = i;
|
|
103
|
-
let o = performance.now(), c =
|
|
104
|
-
for (let i = 0; i < t.length; i++) {
|
|
105
|
-
let a = t[i], s = Array(a.length);
|
|
106
|
-
for (let e = 0; e < a.length; e++) s[e] = r(a[e].content);
|
|
107
|
-
o = await e(o, n, this.vocab.size), c[i] = s;
|
|
108
|
-
}
|
|
109
|
-
let u = c.flat(2), d = new Set(u);
|
|
103
|
+
let o = performance.now(), c = /* @__PURE__ */ new Set();
|
|
110
104
|
this.vocab = /* @__PURE__ */ new Set(), this.pretokenMap.clear(), this.merges = [], this.addSpecialTokens();
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
let t = Array.from(e.entries()).sort((e, t) => t[1] - e[1]);
|
|
121
|
-
this.vocab = /* @__PURE__ */ new Set(), this.addSpecialTokens(), t.slice(0, this.targetSize - this.vocab.size).map(([e]) => e).forEach((e) => this.vocab.add(e)), this.vocabIndex.clear();
|
|
122
|
-
let n = 0;
|
|
123
|
-
for (let e of this.vocab.keys()) this.vocabIndex.set(e, n++);
|
|
124
|
-
return this.generateID(), this.emit("trainStatus", "trained"), this.vocab.size;
|
|
105
|
+
for (let i of t) {
|
|
106
|
+
let t = i.cursor(), a = await t.next();
|
|
107
|
+
for (; a !== null;) {
|
|
108
|
+
for (let e of a) {
|
|
109
|
+
let t = r(e.content);
|
|
110
|
+
for (let e of t) c.has(e) || (c.add(e), Array.from(e).forEach((e) => this.vocab.add(e)));
|
|
111
|
+
}
|
|
112
|
+
o = await e(o, n, this.vocab.size), a = await t.next();
|
|
113
|
+
}
|
|
125
114
|
}
|
|
115
|
+
let u = Array.from(c), d = u.map((e) => Array.from(e)), f = a(d);
|
|
116
|
+
if (o = await e(o, n, this.vocab.size), this.vocab.size >= this.targetSize) throw console.warn("Initial vocab size is greater than or equal to target size. No merges will be performed.", this.vocab.size, this.targetSize), Error("too_small_vocab");
|
|
126
117
|
for (; this.vocab.size < this.targetSize && this.merges.length < this.targetSize;) {
|
|
127
|
-
let t = s(
|
|
118
|
+
let t = s(f);
|
|
128
119
|
if (!t) break;
|
|
129
|
-
this.merges.push([t.a, t.b]), this.vocab.add(t.a + t.b), l(
|
|
120
|
+
this.merges.push([t.a, t.b]), this.vocab.add(t.a + t.b), l(f, t), o = await e(o, n, this.vocab.size);
|
|
130
121
|
}
|
|
131
|
-
|
|
132
|
-
let n =
|
|
122
|
+
u.forEach((e, t) => {
|
|
123
|
+
let n = d[t];
|
|
133
124
|
this.pretokenMap.set(e, n);
|
|
134
125
|
}), this.vocabIndex.clear();
|
|
135
|
-
let
|
|
136
|
-
for (let e of this.vocab.keys()) this.vocabIndex.set(e,
|
|
126
|
+
let p = 0;
|
|
127
|
+
for (let e of this.vocab.keys()) this.vocabIndex.set(e, p++);
|
|
137
128
|
return this.generateID(), this.emit("trainStatus", "trained"), this.vocab.size;
|
|
138
129
|
}
|
|
139
130
|
getVocab() {
|
package/dist/tokeniser/type.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { default as EE } from 'eventemitter3';
|
|
2
|
+
import { ConversationStream } from '../data/stream';
|
|
2
3
|
export type Roles = 'user' | 'assistant' | 'system' | 'text';
|
|
3
4
|
export interface Conversation {
|
|
4
5
|
role: Roles;
|
|
5
6
|
content: string;
|
|
6
7
|
}
|
|
7
|
-
export interface ITokeniser extends EE<'trainStatus'> {
|
|
8
|
+
export interface ITokeniser extends EE<'trainStatus' | 'error'> {
|
|
8
9
|
id: string;
|
|
9
10
|
datasetID?: string;
|
|
10
|
-
train(text:
|
|
11
|
+
train(text: ConversationStream[], cb?: (vocab: number) => void, datasetID?: string): Promise<number>;
|
|
11
12
|
getVocab(): string[];
|
|
12
13
|
getMerges(): [string, string][];
|
|
13
14
|
destroy(): void;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Tensor } from '@tensorflow/tfjs-core';
|
|
2
2
|
import { Conversation, ITokeniser } from '../tokeniser/type';
|
|
3
3
|
import { Dataset } from '@tensorflow/tfjs-data';
|
|
4
|
+
import { TokenStore } from './tasks/TokenStore';
|
|
4
5
|
export declare function flattenTokens(textData: Conversation[][], tokenizer: ITokeniser): Uint16Array;
|
|
5
6
|
export declare function flattenTokensWithMask(textData: Conversation[][], tokenizer: ITokeniser): {
|
|
6
7
|
tokens: Uint16Array;
|
|
@@ -8,14 +9,28 @@ export declare function flattenTokensWithMask(textData: Conversation[][], tokeni
|
|
|
8
9
|
};
|
|
9
10
|
export declare function shuffle(array: Uint32Array): Uint32Array;
|
|
10
11
|
export interface DatasetState {
|
|
12
|
+
shuffledShards: Uint32Array;
|
|
11
13
|
shuffledIndexes: Uint32Array;
|
|
14
|
+
lastShardIndexes: Uint32Array;
|
|
15
|
+
currentShard: Uint16Array | null;
|
|
16
|
+
nextShard: Uint16Array | null;
|
|
17
|
+
currentMask: Uint8Array | null;
|
|
18
|
+
nextMask: Uint8Array | null;
|
|
19
|
+
shardIndex: number;
|
|
12
20
|
step: number;
|
|
13
21
|
}
|
|
22
|
+
export declare function moveToNext(state: DatasetState, store: TokenStore, noShuffle?: boolean): Promise<void>;
|
|
23
|
+
interface DatasetOptions {
|
|
24
|
+
batchSize: number;
|
|
25
|
+
noShuffle?: boolean;
|
|
26
|
+
ignoreIndex?: number;
|
|
27
|
+
shuffleFirst?: boolean;
|
|
28
|
+
}
|
|
14
29
|
export declare class DatasetBuilder {
|
|
15
30
|
tokenizer: ITokeniser;
|
|
16
31
|
blockSize: number;
|
|
17
32
|
constructor(tokenizer: ITokeniser, blockSize?: number);
|
|
18
|
-
createTextDataset(
|
|
33
|
+
createTextDataset(store: TokenStore, options?: DatasetOptions): Promise<{
|
|
19
34
|
dataset: Dataset<{
|
|
20
35
|
xs: Tensor;
|
|
21
36
|
ys: Tensor;
|
|
@@ -23,3 +38,4 @@ export declare class DatasetBuilder {
|
|
|
23
38
|
state: DatasetState;
|
|
24
39
|
}>;
|
|
25
40
|
}
|
|
41
|
+
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
1
|
+
import { a as e, i as t, n, r, t as i } from "../DatasetBuilder-C0iJT29K.js";
|
|
2
|
+
export { i as DatasetBuilder, n as flattenTokens, r as flattenTokensWithMask, t as moveToNext, e as shuffle };
|
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import { Conversation, ITokeniser } from '../../../main';
|
|
1
|
+
import { Conversation, ConversationStream, ITokeniser } from '../../../main';
|
|
2
2
|
import { Task } from './Task';
|
|
3
3
|
export default class ConversationTask extends Task {
|
|
4
|
-
private
|
|
5
|
-
private
|
|
6
|
-
private
|
|
4
|
+
private streams;
|
|
5
|
+
private streamIndex;
|
|
6
|
+
private currentCursor;
|
|
7
7
|
get length(): number;
|
|
8
|
-
constructor(conversations:
|
|
8
|
+
constructor(conversations: ConversationStream[]);
|
|
9
9
|
hasMoreConversations(): boolean;
|
|
10
|
-
nextConversation(): Conversation[] | null
|
|
11
|
-
nextTokens(tokeniser: ITokeniser): number[] | null
|
|
12
|
-
nextTokens(tokeniser: ITokeniser, masking: boolean): {
|
|
10
|
+
nextConversation(): Promise<Conversation[] | null>;
|
|
11
|
+
nextTokens(tokeniser: ITokeniser): Promise<number[] | null>;
|
|
12
|
+
nextTokens(tokeniser: ITokeniser, masking: boolean): Promise<{
|
|
13
13
|
tokens: number[];
|
|
14
14
|
mask: boolean[];
|
|
15
|
-
} | null
|
|
16
|
-
shuffle(): void;
|
|
15
|
+
} | null>;
|
|
17
16
|
estimateTokens(tokeniser: ITokeniser): Promise<number>;
|
|
18
17
|
}
|
|
@@ -1,38 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Task as t } from "./Task.js";
|
|
1
|
+
import { Task as e } from "./Task.js";
|
|
3
2
|
//#region lib/training/tasks/ConversationTask.ts
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
var t = class extends e {
|
|
4
|
+
streams;
|
|
5
|
+
streamIndex = 0;
|
|
6
|
+
currentCursor = null;
|
|
8
7
|
get length() {
|
|
9
|
-
return this.
|
|
8
|
+
return this.streams.length;
|
|
10
9
|
}
|
|
11
10
|
constructor(e) {
|
|
12
|
-
super(), this.
|
|
11
|
+
super(), this.streams = e;
|
|
13
12
|
}
|
|
14
13
|
hasMoreConversations() {
|
|
15
|
-
return this.
|
|
14
|
+
return this.streamIndex < this.streams.length;
|
|
16
15
|
}
|
|
17
|
-
nextConversation() {
|
|
18
|
-
|
|
19
|
-
let e = this.rawConvo[this.shuffledIndices ? this.shuffledIndices[this.index] : this.index];
|
|
20
|
-
return this.index++, e;
|
|
16
|
+
async nextConversation() {
|
|
17
|
+
return this.streamIndex < this.streams.length ? (this.currentCursor ||= this.streams[this.streamIndex].cursor(), await this.currentCursor.next() || (this.streamIndex++, this.currentCursor = null, this.nextConversation())) : null;
|
|
21
18
|
}
|
|
22
|
-
nextTokens(e, t) {
|
|
23
|
-
let n = this.nextConversation();
|
|
19
|
+
async nextTokens(e, t) {
|
|
20
|
+
let n = await this.nextConversation();
|
|
24
21
|
return n ? e.encodeConversation(n, !1, t) : null;
|
|
25
22
|
}
|
|
26
|
-
shuffle() {
|
|
27
|
-
if (!this.shuffledIndices) {
|
|
28
|
-
this.shuffledIndices = new Uint32Array(this.rawConvo.length);
|
|
29
|
-
for (let e = 0; e < this.rawConvo.length; e++) this.shuffledIndices[e] = e;
|
|
30
|
-
}
|
|
31
|
-
e(this.shuffledIndices), this.index = 0;
|
|
32
|
-
}
|
|
33
23
|
async estimateTokens(e) {
|
|
34
|
-
|
|
24
|
+
let t = await this.streams[0].cursor().next();
|
|
25
|
+
return t ? e.encodeConversation(t).length * this.length : 0;
|
|
35
26
|
}
|
|
36
27
|
};
|
|
37
28
|
//#endregion
|
|
38
|
-
export {
|
|
29
|
+
export { t as default };
|
|
@@ -6,12 +6,12 @@ export default class PretrainingTask extends Task {
|
|
|
6
6
|
get length(): number;
|
|
7
7
|
constructor(texts: string[]);
|
|
8
8
|
hasMoreConversations(): boolean;
|
|
9
|
-
nextConversation(): Conversation[] | null
|
|
10
|
-
nextTokens(tokeniser: ITokeniser): number[] | null
|
|
11
|
-
nextTokens(tokeniser: ITokeniser, masking: boolean): {
|
|
9
|
+
nextConversation(): Promise<Conversation[] | null>;
|
|
10
|
+
nextTokens(tokeniser: ITokeniser): Promise<number[] | null>;
|
|
11
|
+
nextTokens(tokeniser: ITokeniser, masking: boolean): Promise<{
|
|
12
12
|
tokens: number[];
|
|
13
13
|
mask: boolean[];
|
|
14
|
-
} | null
|
|
14
|
+
} | null>;
|
|
15
15
|
shuffle(): void;
|
|
16
16
|
estimateTokens(tokeniser: ITokeniser): Promise<number>;
|
|
17
17
|
}
|
|
@@ -12,7 +12,7 @@ var t = class extends e {
|
|
|
12
12
|
hasMoreConversations() {
|
|
13
13
|
return this.index < this.rawText.length;
|
|
14
14
|
}
|
|
15
|
-
nextConversation() {
|
|
15
|
+
async nextConversation() {
|
|
16
16
|
if (this.index >= this.rawText.length) return null;
|
|
17
17
|
let e = {
|
|
18
18
|
role: "assistant",
|
|
@@ -20,7 +20,7 @@ var t = class extends e {
|
|
|
20
20
|
};
|
|
21
21
|
return this.index++, [e];
|
|
22
22
|
}
|
|
23
|
-
nextTokens(e, t) {
|
|
23
|
+
async nextTokens(e, t) {
|
|
24
24
|
if (this.index >= this.rawText.length) return null;
|
|
25
25
|
let n = e.encodeSequence(this.rawText[this.index]);
|
|
26
26
|
return this.index++, t ? {
|
|
@@ -6,12 +6,12 @@ export default class StartSentenceTask extends Task {
|
|
|
6
6
|
get length(): number;
|
|
7
7
|
constructor(texts: string[]);
|
|
8
8
|
hasMoreConversations(): boolean;
|
|
9
|
-
nextConversation(): Conversation[] | null
|
|
10
|
-
nextTokens(tokeniser: ITokeniser): number[] | null
|
|
11
|
-
nextTokens(tokeniser: ITokeniser, masking: boolean): {
|
|
9
|
+
nextConversation(): Promise<Conversation[] | null>;
|
|
10
|
+
nextTokens(tokeniser: ITokeniser): Promise<number[] | null>;
|
|
11
|
+
nextTokens(tokeniser: ITokeniser, masking: boolean): Promise<{
|
|
12
12
|
tokens: number[];
|
|
13
13
|
mask: boolean[];
|
|
14
|
-
} | null
|
|
14
|
+
} | null>;
|
|
15
15
|
shuffle(): void;
|
|
16
16
|
private conversationFromString;
|
|
17
17
|
estimateTokens(tokeniser: ITokeniser): Promise<number>;
|
|
@@ -12,13 +12,13 @@ var t = class extends e {
|
|
|
12
12
|
hasMoreConversations() {
|
|
13
13
|
return this.index < this.rawText.length;
|
|
14
14
|
}
|
|
15
|
-
nextConversation() {
|
|
15
|
+
async nextConversation() {
|
|
16
16
|
if (this.index >= this.rawText.length) return null;
|
|
17
17
|
let e = this.rawText[this.index];
|
|
18
18
|
return this.index++, this.conversationFromString(e);
|
|
19
19
|
}
|
|
20
|
-
nextTokens(e, t) {
|
|
21
|
-
let n = this.nextConversation();
|
|
20
|
+
async nextTokens(e, t) {
|
|
21
|
+
let n = await this.nextConversation();
|
|
22
22
|
return n ? e.encodeConversation(n, !1, t) : null;
|
|
23
23
|
}
|
|
24
24
|
shuffle() {
|
|
@@ -1,22 +1,29 @@
|
|
|
1
1
|
import { Conversation, ITokeniser } from '../../../main';
|
|
2
|
+
import { TokenStore } from './TokenStore';
|
|
2
3
|
export declare abstract class Task {
|
|
3
4
|
abstract get length(): number;
|
|
4
5
|
abstract hasMoreConversations(): boolean;
|
|
5
|
-
abstract nextConversation(): Conversation[] | null
|
|
6
|
-
abstract nextTokens(tokeniser: ITokeniser): number[] | null
|
|
7
|
-
abstract nextTokens(tokeniser: ITokeniser, masking: boolean): {
|
|
6
|
+
abstract nextConversation(): Promise<Conversation[] | null>;
|
|
7
|
+
abstract nextTokens(tokeniser: ITokeniser): Promise<number[] | null>;
|
|
8
|
+
abstract nextTokens(tokeniser: ITokeniser, masking: boolean): Promise<{
|
|
8
9
|
tokens: number[];
|
|
9
10
|
mask: boolean[];
|
|
10
|
-
} | null
|
|
11
|
-
abstract nextTokens(tokeniser: ITokeniser, masking?: boolean): number[] | {
|
|
11
|
+
} | null>;
|
|
12
|
+
abstract nextTokens(tokeniser: ITokeniser, masking?: boolean): Promise<number[] | {
|
|
12
13
|
tokens: number[];
|
|
13
14
|
mask: boolean[];
|
|
14
|
-
} | null
|
|
15
|
-
abstract estimateTokens(tokeniser: ITokeniser): Promise<number>;
|
|
16
|
-
abstract shuffle(): void;
|
|
15
|
+
} | null>;
|
|
17
16
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
interface TokensFromTasksOptions {
|
|
18
|
+
masking?: boolean;
|
|
19
|
+
maxCachedShards?: number;
|
|
20
|
+
noOPFS?: boolean;
|
|
21
|
+
shardSize?: number;
|
|
22
|
+
validationSplit?: number;
|
|
23
|
+
cb?: (tokens: number) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare function tokensFromTasks(tasks: Task[], tokenizer: ITokeniser, options?: TokensFromTasksOptions): Promise<{
|
|
26
|
+
trainingTokens: TokenStore;
|
|
27
|
+
validationTokens?: TokenStore;
|
|
22
28
|
}>;
|
|
29
|
+
export {};
|