@genai-fi/nanogpt 0.22.0 → 0.24.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 (51) hide show
  1. package/dist/{DatasetBuilder-Ctb425Id.js → DatasetBuilder-DU1G1OKX.js} +143 -117
  2. package/dist/Generator.js +1 -1
  3. package/dist/TeachableLLM.d.ts +1 -2
  4. package/dist/TeachableLLM.js +1 -1
  5. package/dist/Trainer-Cr7csbTD.js +228 -0
  6. package/dist/Trainer.d.ts +3 -2
  7. package/dist/Trainer.js +1 -1
  8. package/dist/data/stream.d.ts +6 -6
  9. package/dist/data/stream.js +1 -1
  10. package/dist/data/textLoader.js +1 -1
  11. package/dist/{BaseTokeniser-C9TSv4th.js → eventemitter3-D_qV3Lof.js} +2 -132
  12. package/dist/loader/load.js +1 -1
  13. package/dist/loader/loadHF.js +1 -1
  14. package/dist/loader/loadTransformers.js +2 -2
  15. package/dist/loader/newZipLoad.js +1 -1
  16. package/dist/loader/oldZipLoad.js +1 -1
  17. package/dist/loader/save.js +1 -1
  18. package/dist/{main-Bgc7_9kb.js → main-Dz72vadm.js} +2742 -2976
  19. package/dist/main.d.ts +3 -10
  20. package/dist/main.js +12 -10
  21. package/dist/models/NanoGPTV1.js +1 -1
  22. package/dist/models/NanoGPTV2.js +1 -1
  23. package/dist/models/factory.js +1 -1
  24. package/dist/models/model.js +1 -1
  25. package/dist/{stream-DKl3GTDL.js → stream-BpAwcvHz.js} +563 -550
  26. package/dist/tokeniser/BaseTokeniser.js +135 -2
  27. package/dist/tokeniser/CharTokeniser.js +17 -19
  28. package/dist/tokeniser/bpe.js +16 -20
  29. package/dist/training/DatasetBuilder.d.ts +19 -3
  30. package/dist/training/DatasetBuilder.js +2 -2
  31. package/dist/training/PreTrainer.js +1 -1
  32. package/dist/training/SFTTrainer.js +1 -1
  33. package/dist/training/tasks/TokenStore.d.ts +47 -0
  34. package/dist/training/tasks/TokenStore.js +218 -0
  35. package/dist/training/tasks/tokenStream.d.ts +16 -0
  36. package/dist/training/tasks/tokenStream.js +46 -0
  37. package/dist/training/validation.d.ts +4 -2
  38. package/dist/training/validation.js +23 -2
  39. package/dist/utilities/random.d.ts +1 -0
  40. package/dist/utilities/random.js +19 -0
  41. package/package.json +1 -1
  42. package/dist/training/tasks/ConversationTask.d.ts +0 -17
  43. package/dist/training/tasks/ConversationTask.js +0 -29
  44. package/dist/training/tasks/PretrainingTask.d.ts +0 -17
  45. package/dist/training/tasks/PretrainingTask.js +0 -42
  46. package/dist/training/tasks/StartSentenceTask.d.ts +0 -18
  47. package/dist/training/tasks/StartSentenceTask.js +0 -45
  48. package/dist/training/tasks/Task.d.ts +0 -20
  49. package/dist/training/tasks/Task.js +0 -42
  50. package/dist/training/tasks/splitter.d.ts +0 -5
  51. package/dist/training/tasks/splitter.js +0 -18
@@ -1,2 +1,23 @@
1
- import { o as e } from "../main-Bgc7_9kb.js";
2
- export { e as createTrainValidationSplit };
1
+ import { TokenStore as e, createTokenStore as t } from "./tasks/TokenStore.js";
2
+ //#region lib/training/validation.ts
3
+ async function n(e, n) {
4
+ let r = await t("training-tokens", n.id, n.datasetID ?? "");
5
+ return e.forEach((e) => {
6
+ r.appendShard(e);
7
+ }), await r.finish(), r;
8
+ }
9
+ async function r(t, r, i, a, o) {
10
+ let s = t instanceof e ? t : await n(t, i), c = r instanceof e ? r : await n(r, i), l = s.getTokenCount(), { dataset: u, state: d } = await a.createTextDataset(s, { batchSize: o }), { dataset: f, state: p } = await a.createTextDataset(c, {
11
+ batchSize: o,
12
+ shuffleFirst: !0
13
+ });
14
+ return {
15
+ trainDataset: u,
16
+ validationDataset: f,
17
+ size: l,
18
+ validationState: p,
19
+ trainState: d
20
+ };
21
+ }
22
+ //#endregion
23
+ export { r as createTrainValidationDatasets, n as storeFromArray };
@@ -0,0 +1 @@
1
+ export declare function seededRng(seed: string | number): () => number;
@@ -0,0 +1,19 @@
1
+ //#region lib/utilities/random.ts
2
+ function e(e) {
3
+ let t = 1779033703 ^ e.length;
4
+ for (let n = 0; n < e.length; n++) t = Math.imul(t ^ e.charCodeAt(n), 3432918353), t = t << 13 | t >>> 19;
5
+ return () => (t = Math.imul(t ^ t >>> 16, 2246822507), t = Math.imul(t ^ t >>> 13, 3266489909), (t ^= t >>> 16) >>> 0);
6
+ }
7
+ function t(e) {
8
+ let t = e >>> 0;
9
+ return () => {
10
+ t += 1831565813;
11
+ let e = Math.imul(t ^ t >>> 15, t | 1);
12
+ return e ^= e + Math.imul(e ^ e >>> 7, e | 61), ((e ^ e >>> 14) >>> 0) / 4294967296;
13
+ };
14
+ }
15
+ function n(n) {
16
+ return t(typeof n == "number" ? n >>> 0 : e(n)());
17
+ }
18
+ //#endregion
19
+ export { n as seededRng };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genai-fi/nanogpt",
3
- "version": "0.22.0",
3
+ "version": "0.24.0",
4
4
  "type": "module",
5
5
  "main": "dist/main.js",
6
6
  "types": "dist/main.d.ts",
@@ -1,17 +0,0 @@
1
- import { Conversation, ConversationStream, ITokeniser } from '../../../main';
2
- import { Task } from './Task';
3
- export default class ConversationTask extends Task {
4
- private streams;
5
- private streamIndex;
6
- private currentCursor;
7
- get length(): number;
8
- constructor(conversations: ConversationStream[]);
9
- hasMoreConversations(): boolean;
10
- nextConversation(): Promise<Conversation[] | null>;
11
- nextTokens(tokeniser: ITokeniser): Promise<number[] | null>;
12
- nextTokens(tokeniser: ITokeniser, masking: boolean): Promise<{
13
- tokens: number[];
14
- mask: boolean[];
15
- } | null>;
16
- estimateTokens(tokeniser: ITokeniser): Promise<number>;
17
- }
@@ -1,29 +0,0 @@
1
- import { Task as e } from "./Task.js";
2
- //#region lib/training/tasks/ConversationTask.ts
3
- var t = class extends e {
4
- streams;
5
- streamIndex = 0;
6
- currentCursor = null;
7
- get length() {
8
- return this.streams.length;
9
- }
10
- constructor(e) {
11
- super(), this.streams = e;
12
- }
13
- hasMoreConversations() {
14
- return this.streamIndex < this.streams.length;
15
- }
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;
18
- }
19
- async nextTokens(e, t) {
20
- let n = await this.nextConversation();
21
- return n ? e.encodeConversation(n, !1, t) : null;
22
- }
23
- async estimateTokens(e) {
24
- let t = await this.streams[0].cursor().next();
25
- return t ? e.encodeConversation(t).length * this.length : 0;
26
- }
27
- };
28
- //#endregion
29
- export { t as default };
@@ -1,17 +0,0 @@
1
- import { Conversation, ITokeniser } from '../../../main';
2
- import { Task } from './Task';
3
- export default class PretrainingTask extends Task {
4
- private rawText;
5
- private index;
6
- get length(): number;
7
- constructor(texts: string[]);
8
- hasMoreConversations(): boolean;
9
- nextConversation(): Promise<Conversation[] | null>;
10
- nextTokens(tokeniser: ITokeniser): Promise<number[] | null>;
11
- nextTokens(tokeniser: ITokeniser, masking: boolean): Promise<{
12
- tokens: number[];
13
- mask: boolean[];
14
- } | null>;
15
- shuffle(): void;
16
- estimateTokens(tokeniser: ITokeniser): Promise<number>;
17
- }
@@ -1,42 +0,0 @@
1
- import { Task as e } from "./Task.js";
2
- //#region lib/training/tasks/PretrainingTask.ts
3
- var t = class extends e {
4
- rawText;
5
- index = 0;
6
- get length() {
7
- return this.rawText.length;
8
- }
9
- constructor(e) {
10
- super(), this.rawText = e;
11
- }
12
- hasMoreConversations() {
13
- return this.index < this.rawText.length;
14
- }
15
- async nextConversation() {
16
- if (this.index >= this.rawText.length) return null;
17
- let e = {
18
- role: "assistant",
19
- content: this.rawText[this.index]
20
- };
21
- return this.index++, [e];
22
- }
23
- async nextTokens(e, t) {
24
- if (this.index >= this.rawText.length) return null;
25
- let n = e.encodeSequence(this.rawText[this.index]);
26
- return this.index++, t ? {
27
- tokens: n,
28
- mask: Array(n.length).fill(!0)
29
- } : n;
30
- }
31
- shuffle() {
32
- this.index = 0;
33
- }
34
- async estimateTokens(e) {
35
- return e.encodeConversation([{
36
- role: "assistant",
37
- content: this.rawText[0]
38
- }]).length * this.length;
39
- }
40
- };
41
- //#endregion
42
- export { t as default };
@@ -1,18 +0,0 @@
1
- import { Conversation, ITokeniser } from '../../../main';
2
- import { Task } from './Task';
3
- export default class StartSentenceTask extends Task {
4
- private rawText;
5
- private index;
6
- get length(): number;
7
- constructor(texts: string[]);
8
- hasMoreConversations(): boolean;
9
- nextConversation(): Promise<Conversation[] | null>;
10
- nextTokens(tokeniser: ITokeniser): Promise<number[] | null>;
11
- nextTokens(tokeniser: ITokeniser, masking: boolean): Promise<{
12
- tokens: number[];
13
- mask: boolean[];
14
- } | null>;
15
- shuffle(): void;
16
- private conversationFromString;
17
- estimateTokens(tokeniser: ITokeniser): Promise<number>;
18
- }
@@ -1,45 +0,0 @@
1
- import { Task as e } from "./Task.js";
2
- //#region lib/training/tasks/StartSentenceTask.ts
3
- var t = class extends e {
4
- rawText;
5
- index = 0;
6
- get length() {
7
- return this.rawText.length;
8
- }
9
- constructor(e) {
10
- super(), this.rawText = e;
11
- }
12
- hasMoreConversations() {
13
- return this.index < this.rawText.length;
14
- }
15
- async nextConversation() {
16
- if (this.index >= this.rawText.length) return null;
17
- let e = this.rawText[this.index];
18
- return this.index++, this.conversationFromString(e);
19
- }
20
- async nextTokens(e, t) {
21
- let n = await this.nextConversation();
22
- return n ? e.encodeConversation(n, !1, t) : null;
23
- }
24
- shuffle() {
25
- this.index = 0;
26
- }
27
- conversationFromString(e) {
28
- let t = e.indexOf(".");
29
- return t === -1 ? [{
30
- role: "assistant",
31
- content: this.rawText[this.index]
32
- }] : [{
33
- role: "user",
34
- content: e.slice(0, t + 1).trim()
35
- }, {
36
- role: "assistant",
37
- content: e.slice(t + 1).trim()
38
- }];
39
- }
40
- async estimateTokens(e) {
41
- return (await e.encodeConversation(this.conversationFromString(this.rawText[0]))).length * this.length;
42
- }
43
- };
44
- //#endregion
45
- export { t as default };
@@ -1,20 +0,0 @@
1
- import { Conversation, ITokeniser } from '../../../main';
2
- export declare abstract class Task {
3
- abstract get length(): number;
4
- abstract hasMoreConversations(): boolean;
5
- abstract nextConversation(): Promise<Conversation[] | null>;
6
- abstract nextTokens(tokeniser: ITokeniser): Promise<number[] | null>;
7
- abstract nextTokens(tokeniser: ITokeniser, masking: boolean): Promise<{
8
- tokens: number[];
9
- mask: boolean[];
10
- } | null>;
11
- abstract nextTokens(tokeniser: ITokeniser, masking?: boolean): Promise<number[] | {
12
- tokens: number[];
13
- mask: boolean[];
14
- } | null>;
15
- }
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[];
20
- }>;
@@ -1,42 +0,0 @@
1
- import { yieldIfNeeded as e } from "../../utilities/yielder.js";
2
- //#region lib/training/tasks/Task.ts
3
- var t = class {};
4
- async function n(e, t, n, r, i, a) {
5
- for (let o of e) {
6
- let e = await o.nextTokens(n, a ? !0 : void 0);
7
- if (e) {
8
- let n = Array.isArray(e) ? e : e.tokens;
9
- r.total += n.length;
10
- let o = t[t.length - 1], s = a ? a[a.length - 1] : null;
11
- if (r.offset + n.length > o.length) {
12
- let c = o.length - r.offset;
13
- o.set(n.slice(0, c), r.offset);
14
- let l = n.length - c;
15
- if (l > i) throw Error(`Estimated tokens (${i}) is too small for the next batch of tokens (${l}).`);
16
- let u = new Uint16Array(i);
17
- if (u.set(n.slice(c), 0), t.push(u), a && s && !Array.isArray(e)) {
18
- s.set(e.mask.slice(0, c).map((e) => +!!e), r.offset);
19
- let t = new Uint8Array(u.length);
20
- t.set(e.mask.slice(c).map((e) => +!!e), 0), a.push(t);
21
- }
22
- r.offset = n.length - c;
23
- } else o.set(n, r.offset), s && !Array.isArray(e) && s.set(e.mask.map((e) => +!!e), r.offset), r.offset += n.length;
24
- }
25
- }
26
- }
27
- async function r(t, r, i, a) {
28
- let o = 1e4 * 1024, s = [new Uint16Array(o)], c = a ? [new Uint8Array(o)] : null, l = {
29
- offset: 0,
30
- 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);
40
- }
41
- //#endregion
42
- export { t as Task, r as tokensFromTasks };
@@ -1,5 +0,0 @@
1
- import { Task } from './Task';
2
- export default function splitValidation(tasks: Task[], validationSplit: number): Promise<{
3
- training: Task;
4
- validation: Task;
5
- }>;
@@ -1,18 +0,0 @@
1
- import { n as e } from "../../stream-DKl3GTDL.js";
2
- import t from "./ConversationTask.js";
3
- //#region lib/training/tasks/splitter.ts
4
- async function n(n, r) {
5
- if (r <= 0 || r >= 1) throw Error("validationSplit must be between 0 and 1");
6
- let i = [], a = [];
7
- for (let e of n) for (; e.hasMoreConversations();) {
8
- let t = await e.nextConversation();
9
- if (!t) break;
10
- Math.random() < r ? a.push(t) : i.push(t);
11
- }
12
- return {
13
- training: new t([new e(i)]),
14
- validation: new t([new e(a)])
15
- };
16
- }
17
- //#endregion
18
- export { n as default };