@genai-fi/nanogpt 0.22.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.
Files changed (38) hide show
  1. package/dist/{DatasetBuilder-Ctb425Id.js → DatasetBuilder-C0iJT29K.js} +145 -116
  2. package/dist/Generator.js +2 -2
  3. package/dist/TeachableLLM.js +1 -1
  4. package/dist/Trainer-DBsyWJ4s.js +228 -0
  5. package/dist/Trainer.d.ts +2 -1
  6. package/dist/Trainer.js +1 -1
  7. package/dist/data/stream.js +1 -1
  8. package/dist/data/textLoader.js +1 -1
  9. package/dist/{BaseTokeniser-C9TSv4th.js → eventemitter3-D_qV3Lof.js} +2 -132
  10. package/dist/loader/load.js +2 -2
  11. package/dist/loader/loadHF.js +1 -1
  12. package/dist/loader/loadTransformers.js +2 -2
  13. package/dist/loader/newZipLoad.js +1 -1
  14. package/dist/loader/oldZipLoad.js +1 -1
  15. package/dist/loader/save.js +1 -1
  16. package/dist/{main-Bgc7_9kb.js → main-BSaDGH7I.js} +2686 -2913
  17. package/dist/main.d.ts +1 -0
  18. package/dist/main.js +20 -18
  19. package/dist/models/NanoGPTV1.js +1 -1
  20. package/dist/models/NanoGPTV2.js +1 -1
  21. package/dist/models/factory.js +1 -1
  22. package/dist/models/model.js +1 -1
  23. package/dist/{stream-DKl3GTDL.js → stream-BjdpSNqB.js} +31 -22
  24. package/dist/tokeniser/BaseTokeniser.js +135 -2
  25. package/dist/tokeniser/CharTokeniser.js +3 -3
  26. package/dist/tokeniser/bpe.js +8 -8
  27. package/dist/training/DatasetBuilder.d.ts +17 -1
  28. package/dist/training/DatasetBuilder.js +2 -2
  29. package/dist/training/PreTrainer.js +1 -1
  30. package/dist/training/SFTTrainer.js +1 -1
  31. package/dist/training/tasks/Task.d.ts +13 -4
  32. package/dist/training/tasks/Task.js +22 -14
  33. package/dist/training/tasks/TokenStore.d.ts +46 -0
  34. package/dist/training/tasks/TokenStore.js +215 -0
  35. package/dist/training/tasks/splitter.js +1 -1
  36. package/dist/training/validation.d.ts +4 -2
  37. package/dist/training/validation.js +21 -2
  38. package/package.json +1 -1
package/dist/main.d.ts CHANGED
@@ -28,6 +28,7 @@ export type { GPTConfig } from './models/config';
28
28
  export { estimateParameterCount, estimateMemoryUsage, estimateTrainingMemoryUsage, estimateResources, validateConfig, } from './utilities/parameters';
29
29
  export { default as topP } from './utilities/topP';
30
30
  export { sliceUint16Shards, sliceUint8Shards } from './utilities/tokens';
31
+ export { TokenStore, createTokenStore } from './training/tasks/TokenStore';
31
32
  export { Task, tokensFromTasks } from './training/tasks/Task';
32
33
  export declare const tasks: {
33
34
  PretrainingTask: typeof PretrainingTask;
package/dist/main.js CHANGED
@@ -1,18 +1,20 @@
1
- import { a as e, b as t, i as n, n as r, r as i, s as a, t as o, y as s } from "./main-Bgc7_9kb.js";
2
- import c from "./tokeniser/CharTokeniser.js";
3
- import l from "./tokeniser/bpe.js";
4
- import { AdamWOptimizer as u } from "./training/AdamW.js";
5
- import d from "./utilities/topP.js";
6
- import f from "./training/Evaluator.js";
7
- import { sliceUint16Shards as p, sliceUint8Shards as m } from "./utilities/tokens.js";
8
- import h from "./utilities/waitForModel.js";
9
- import g from "./utilities/datasetID.js";
10
- import { n as _ } from "./stream-DKl3GTDL.js";
11
- import v from "./data/textLoader.js";
12
- import { estimateMemoryUsage as y, estimateParameterCount as b, estimateResources as x, estimateTrainingMemoryUsage as S, validateConfig as C } from "./utilities/parameters.js";
13
- import { Task as w, tokensFromTasks as T } from "./training/tasks/Task.js";
14
- import { selectBackend as E } from "./backend.js";
15
- import D from "./utilities/performance.js";
16
- import O from "./checks/index.js";
17
- import { sentenceEmbeddings as k, sentenceEmbeddingsTensor as A } from "./utilities/sentences.js";
18
- export { u as AdamWOptimizer, l as BPETokeniser, c as CharTokeniser, f as Evaluator, a as Generator, _ as MemoryConversationStream, t as Model, s as NanoGPT, w as Task, n as TeachableLLM, e as Trainer, O as checks, y as estimateMemoryUsage, b as estimateParameterCount, x as estimateResources, S as estimateTrainingMemoryUsage, g as generateDatasetID, o as layers, v as loadTextData, r as ops, D as performanceTest, E as selectBackend, k as sentenceEmbeddings, A as sentenceEmbeddingsTensor, p as sliceUint16Shards, m as sliceUint8Shards, i as tasks, T as tokensFromTasks, d as topP, C as validateConfig, h as waitForModel };
1
+ import { _ as e, a as t, i as n, n as r, r as i, t as a, v as o } from "./main-BSaDGH7I.js";
2
+ import s from "./tokeniser/CharTokeniser.js";
3
+ import c from "./tokeniser/bpe.js";
4
+ import { AdamWOptimizer as l } from "./training/AdamW.js";
5
+ import u from "./utilities/topP.js";
6
+ import d from "./training/Evaluator.js";
7
+ import { TokenStore as f, createTokenStore as p } from "./training/tasks/TokenStore.js";
8
+ import { Task as m, tokensFromTasks as h } from "./training/tasks/Task.js";
9
+ import { t as g } from "./Trainer-DBsyWJ4s.js";
10
+ import _ from "./utilities/waitForModel.js";
11
+ import v from "./utilities/datasetID.js";
12
+ import { n as y } from "./stream-BjdpSNqB.js";
13
+ import b from "./data/textLoader.js";
14
+ import { estimateMemoryUsage as x, estimateParameterCount as S, estimateResources as C, estimateTrainingMemoryUsage as w, validateConfig as T } from "./utilities/parameters.js";
15
+ import { sliceUint16Shards as E, sliceUint8Shards as D } from "./utilities/tokens.js";
16
+ import { selectBackend as O } from "./backend.js";
17
+ import k from "./utilities/performance.js";
18
+ import A from "./checks/index.js";
19
+ import { sentenceEmbeddings as j, sentenceEmbeddingsTensor as M } from "./utilities/sentences.js";
20
+ export { l as AdamWOptimizer, c as BPETokeniser, s as CharTokeniser, d as Evaluator, t as Generator, y as MemoryConversationStream, o as Model, e as NanoGPT, m as Task, n as TeachableLLM, f as TokenStore, g as Trainer, A as checks, p as createTokenStore, x as estimateMemoryUsage, S as estimateParameterCount, C as estimateResources, w as estimateTrainingMemoryUsage, v as generateDatasetID, a as layers, b as loadTextData, r as ops, k as performanceTest, O as selectBackend, j as sentenceEmbeddings, M as sentenceEmbeddingsTensor, E as sliceUint16Shards, D as sliceUint8Shards, i as tasks, h as tokensFromTasks, u as topP, T as validateConfig, _ as waitForModel };
@@ -1,2 +1,2 @@
1
- import { y as e } from "../main-Bgc7_9kb.js";
1
+ import { _ as e } from "../main-BSaDGH7I.js";
2
2
  export { e as default };
@@ -1,2 +1,2 @@
1
- import { v as e } from "../main-Bgc7_9kb.js";
1
+ import { g as e } from "../main-BSaDGH7I.js";
2
2
  export { e as default };
@@ -1,2 +1,2 @@
1
- import { _ as e } from "../main-Bgc7_9kb.js";
1
+ import { h as e } from "../main-BSaDGH7I.js";
2
2
  export { e as default };
@@ -1,2 +1,2 @@
1
- import { b as e } from "../main-Bgc7_9kb.js";
1
+ import { v as e } from "../main-BSaDGH7I.js";
2
2
  export { e as default };
@@ -2225,41 +2225,50 @@ function vi(e) {
2225
2225
  }];
2226
2226
  }
2227
2227
  }
2228
- var yi = class {
2228
+ var yi = 100, bi = 1e3, xi = class {
2229
2229
  sourceFactory;
2230
2230
  constructor(e) {
2231
2231
  this.sourceFactory = e;
2232
2232
  }
2233
2233
  cursor() {
2234
- let e = !1, t = null, n = new TextDecoder(), r = "", i = !1, a = [], o = async () => {
2234
+ let e = !1, t = null, n = new TextDecoder(), r = "", i = !1, a = !1, o = [], s = async () => {
2235
2235
  e ||= (t = (await this.sourceFactory()).getReader(), !0);
2236
- }, s = async () => {
2237
- for (await o(); a.length === 0 && !i;) {
2238
- let e = await t.read();
2239
- if (e.done) {
2240
- r += n.decode(), i = !0;
2241
- let e = r.trim();
2242
- e.length > 0 && a.push(vi(e)), r = "";
2243
- break;
2244
- }
2245
- r += n.decode(e.value, { stream: !0 });
2246
- let o = r.split("\n");
2247
- r = o.pop() ?? "";
2248
- for (let e of o) {
2249
- let t = e.trim();
2250
- t.length !== 0 && a.push(vi(t));
2236
+ }, c = null, l = async () => {
2237
+ if (!a) {
2238
+ for (a = !0, await s(); o.length < bi && !i;) {
2239
+ let e = await t.read();
2240
+ if (c && o.length > 0 && (c(), c = null), e.done) {
2241
+ r += n.decode(), i = !0;
2242
+ let e = r.trim();
2243
+ e.length > 0 && o.push(vi(e)), r = "";
2244
+ break;
2245
+ }
2246
+ r += n.decode(e.value, { stream: !0 });
2247
+ let a = r.split("\n");
2248
+ r = a.pop() ?? "";
2249
+ for (let e of a) {
2250
+ let t = e.trim();
2251
+ t.length !== 0 && o.push(vi(t));
2252
+ }
2251
2253
  }
2254
+ a = !1, c && (o.length > 0 || i) && (c(), c = null);
2252
2255
  }
2253
- };
2256
+ }, u = null;
2254
2257
  return { async next() {
2255
- return a.length > 0 || await s(), a.shift() ?? null;
2258
+ o.length < yi && !i && !a && (u = l().then(() => {
2259
+ u = null;
2260
+ })), o.length === 0 && u && await new Promise((e) => {
2261
+ c = e;
2262
+ }), o.length === 0 && !i && console.warn("Queue is empty but not done");
2263
+ let e = o.length > 0 ? o.shift() ?? null : null;
2264
+ return e === null && !i && console.warn("Queue is empty and not done"), e;
2256
2265
  } };
2257
2266
  }
2258
- }, bi = class extends yi {
2267
+ }, Si = class extends xi {
2259
2268
  constructor(e) {
2260
2269
  super(async () => e.stream());
2261
2270
  }
2262
- }, xi = class extends yi {
2271
+ }, Ci = class extends xi {
2263
2272
  constructor(e, t) {
2264
2273
  super(async () => {
2265
2274
  let n = new wr(), r = e.stream().pipeThrough(n).getReader(), i = null;
@@ -2284,4 +2293,4 @@ var yi = class {
2284
2293
  }
2285
2294
  };
2286
2295
  //#endregion
2287
- export { gi as n, xi as r, bi as t };
2296
+ export { gi as n, Ci as r, Si as t };
@@ -1,2 +1,135 @@
1
- import { n as e, t } from "../BaseTokeniser-C9TSv4th.js";
2
- export { e as SPECIALS, t as default };
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,7 +1,7 @@
1
1
  import { yieldIfNeeded as e } from "../utilities/yielder.js";
2
- import { n as t, t as n } from "../BaseTokeniser-C9TSv4th.js";
2
+ import t, { SPECIALS as n } from "./BaseTokeniser.js";
3
3
  //#region lib/tokeniser/CharTokeniser.ts
4
- var r = ["<eos>", "<unk>"], i = class extends n {
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, t.forEach((e) => {
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) => {
@@ -1,5 +1,5 @@
1
1
  import { yieldIfNeeded as e } from "../utilities/yielder.js";
2
- import { n as t, t as n } from "../BaseTokeniser-C9TSv4th.js";
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 n {
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, n) {
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
- }), n && (this.merges = n), this.targetSize = e.length, t.forEach((t) => {
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 > t.length && this.vocab.size <= this.targetSize;
87
+ return this.vocab.size > n.length && this.vocab.size <= this.targetSize;
88
88
  }
89
89
  get vocabSize() {
90
90
  return this.vocab.size;
@@ -101,18 +101,18 @@ var u = class extends n {
101
101
  async train(t = [], n, i) {
102
102
  this.datasetID = i;
103
103
  let o = performance.now(), c = /* @__PURE__ */ new Set();
104
+ this.vocab = /* @__PURE__ */ new Set(), this.pretokenMap.clear(), this.merges = [], this.addSpecialTokens();
104
105
  for (let i of t) {
105
106
  let t = i.cursor(), a = await t.next();
106
107
  for (; a !== null;) {
107
108
  for (let e of a) {
108
109
  let t = r(e.content);
109
- for (let e of t) c.add(e);
110
+ for (let e of t) c.has(e) || (c.add(e), Array.from(e).forEach((e) => this.vocab.add(e)));
110
111
  }
111
112
  o = await e(o, n, this.vocab.size), a = await t.next();
112
113
  }
113
114
  }
114
- this.vocab = /* @__PURE__ */ new Set(), this.pretokenMap.clear(), this.merges = [], this.addSpecialTokens();
115
- let u = Array.from(c), d = u.map((e) => Array.from(e).map((e) => (this.vocab.add(e), e))), f = a(d);
115
+ let u = Array.from(c), d = u.map((e) => Array.from(e)), f = a(d);
116
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");
117
117
  for (; this.vocab.size < this.targetSize && this.merges.length < this.targetSize;) {
118
118
  let t = s(f);
@@ -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(flatTokens: Uint16Array[], batchSize?: number, indexes?: Uint32Array, mask?: Uint8Array[], ignoreIndex?: number): Promise<{
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 { i as e, n as t, r as n, t as r } from "../DatasetBuilder-Ctb425Id.js";
2
- export { r as DatasetBuilder, t as flattenTokens, n as flattenTokensWithMask, e as shuffle };
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,4 +1,4 @@
1
- import { t as e } from "../DatasetBuilder-Ctb425Id.js";
1
+ import { t as e } from "../DatasetBuilder-C0iJT29K.js";
2
2
  import t from "./BasicTrainer.js";
3
3
  //#region lib/training/PreTrainer.ts
4
4
  var n = {
@@ -1,4 +1,4 @@
1
- import { t as e } from "../DatasetBuilder-Ctb425Id.js";
1
+ import { t as e } from "../DatasetBuilder-C0iJT29K.js";
2
2
  import t from "./BasicTrainer.js";
3
3
  //#region lib/training/SFTTrainer.ts
4
4
  var n = {
@@ -1,4 +1,5 @@
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;
@@ -13,8 +14,16 @@ export declare abstract class Task {
13
14
  mask: boolean[];
14
15
  } | null>;
15
16
  }
16
- export declare function tokensFromTasks(tasks: Task[], tokenizer: ITokeniser, cb?: (tokens: number) => void): Promise<Uint16Array[]>;
17
- export declare function tokensFromTasks(tasks: Task[], tokenizer: ITokeniser, cb?: (tokens: number) => void, masking?: boolean): Promise<{
18
- tokens: Uint16Array[];
19
- mask: Uint8Array[];
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;
20
28
  }>;
29
+ export {};
@@ -1,7 +1,8 @@
1
1
  import { yieldIfNeeded as e } from "../../utilities/yielder.js";
2
+ import { createTokenStore as t, deleteTokenStore as n } from "./TokenStore.js";
2
3
  //#region lib/training/tasks/Task.ts
3
- var t = class {};
4
- async function n(e, t, n, r, i, a) {
4
+ var r = class {};
5
+ async function i(e, t, n, r, i, a) {
5
6
  for (let o of e) {
6
7
  let e = await o.nextTokens(n, a ? !0 : void 0);
7
8
  if (e) {
@@ -24,19 +25,26 @@ async function n(e, t, n, r, i, a) {
24
25
  }
25
26
  }
26
27
  }
27
- async function r(t, r, i, a) {
28
- let o = 1e4 * 1024, s = [new Uint16Array(o)], c = a ? [new Uint8Array(o)] : null, l = {
28
+ async function a(r, a, o) {
29
+ await n("training-tokens");
30
+ let s = await t("training-tokens", a.id, a.datasetID ?? "", o);
31
+ await n("validation-tokens");
32
+ let c = o?.validationSplit && o.validationSplit > 0 ? await t("validation-tokens", a.id, a.datasetID ?? "", o) : void 0, l = [new Uint16Array(s.shardSize)], u = o?.masking ? [new Uint8Array(s.shardSize)] : null, d = {
29
33
  offset: 0,
30
34
  total: 0
31
- }, u = performance.now();
32
- for (; await n(t, s, r, l, o, c || void 0), !t.every((e) => !e.hasMoreConversations());) u = await e(u, i, l.total);
33
- return s.length === 1 ? c ? {
34
- tokens: [s[0].subarray(0, l.offset)],
35
- mask: [c[0].subarray(0, l.offset)]
36
- } : [s[0].subarray(0, l.offset)] : (s[s.length - 1] = s[s.length - 1].subarray(0, l.offset), c ? (c[c.length - 1] = c[c.length - 1].subarray(0, l.offset), {
37
- tokens: s,
38
- mask: c
39
- }) : s);
35
+ }, f = o?.validationSplit && o.validationSplit > 0 ? [new Uint16Array(c.shardSize)] : void 0, p = o?.masking && f ? [new Uint8Array(c.shardSize)] : null, m = {
36
+ offset: 0,
37
+ total: 0
38
+ }, h = performance.now();
39
+ for (;;) {
40
+ let t = o?.validationSplit && o.validationSplit > 0 && Math.random() < o.validationSplit, n = t ? f : l, g = t ? m : d, _ = t ? p : u, v = t ? c : s;
41
+ if (await i(r, n, a, g, v.shardSize, _ || void 0), n.length > 1 && (v.appendShard(n[0], _ ? _[0] : void 0), n.shift(), _ && _.shift()), r.every((e) => !e.hasMoreConversations())) break;
42
+ h = await e(h, o?.cb, d.total);
43
+ }
44
+ return l.length === 1 && (l[0] = l[0].subarray(0, d.offset), await s.appendShard(l[0], u ? u[0].subarray(0, d.offset) : void 0)), f && f.length === 1 && (f[0] = f[0].subarray(0, m.offset), await c.appendShard(f[0], p ? p[0].subarray(0, m.offset) : void 0)), {
45
+ trainingTokens: s,
46
+ validationTokens: f ? c : void 0
47
+ };
40
48
  }
41
49
  //#endregion
42
- export { t as Task, r as tokensFromTasks };
50
+ export { r as Task, a as tokensFromTasks };
@@ -0,0 +1,46 @@
1
+ export declare class TokenStore {
2
+ readonly name: string;
3
+ readonly tokeniserId: string;
4
+ readonly datasetId: string;
5
+ private shards;
6
+ private masks?;
7
+ private shardCount;
8
+ private lastShardLength;
9
+ private _shardSize;
10
+ private dirHandle;
11
+ private opfsAvailable;
12
+ private lru;
13
+ private maxCachedShards;
14
+ constructor(tokeniserId: string, datasetId: string, name?: string, maxCachedShards?: number, shardSize?: number);
15
+ get shardSize(): number;
16
+ hasMask(): boolean;
17
+ getShardLength(index: number): number;
18
+ slice(start: number, end: number): Promise<Uint16Array>;
19
+ init(): Promise<void>;
20
+ private writeManifest;
21
+ private readManifest;
22
+ private shardFilename;
23
+ private maskFilename;
24
+ private writeShardToOPFS;
25
+ private writeMaskToOPFS;
26
+ private readShardFromOPFS;
27
+ private readMaskFromOPFS;
28
+ private touchLRU;
29
+ private evictIfNeeded;
30
+ getShard(index: number): Promise<Uint16Array>;
31
+ getMask(index: number): Promise<Uint8Array | undefined>;
32
+ getShardCount(): number;
33
+ getTokenCount(): number;
34
+ appendShard(shard: Uint16Array, mask?: Uint8Array): Promise<void>;
35
+ dispose(): Promise<void>;
36
+ clear(): Promise<void>;
37
+ }
38
+ export declare function getTokenStore(name: string, tokeniserId: string, datasetId: string): TokenStore | null;
39
+ export declare function deleteTokenStore(name: string): Promise<void>;
40
+ interface TokenStoreOptions {
41
+ maxCachedShards?: number;
42
+ shardSize?: number;
43
+ noOPFS?: boolean;
44
+ }
45
+ export declare function createTokenStore(name: string, tokeniserId: string, datasetId: string, options?: TokenStoreOptions): Promise<TokenStore>;
46
+ export {};