@genai-fi/nanogpt 1.0.1 → 1.0.2

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.
@@ -115,17 +115,17 @@ var o = class {
115
115
  this.setState(e, "error", t);
116
116
  }));
117
117
  }
118
- async job(e, a = [], o, s) {
119
- if (this.assertValidOptions(e), this.assertValidDataInput(a), this.assertValidDatasets(o), s && s instanceof t && s.tokeniserId !== this._tokeniser.id) throw Error("tokeniser_mismatch");
120
- let c = Array.from(this._jobs.keys());
121
- for (let t of c) {
118
+ async job(e, o = [], s, c) {
119
+ if (this.assertValidOptions(e), this.assertValidDataInput(o), this.assertValidDatasets(s), c && c instanceof t && c.tokeniserId !== this._tokeniser.id) throw Error("tokeniser_mismatch");
120
+ let l = Array.from(this._jobs.keys());
121
+ for (let t of l) {
122
122
  let n = this._jobs.get(t);
123
123
  if (n && n.id !== e.previous_job_id) {
124
124
  if (n.options.method.type === e.method.type && n.state !== "running") n.trainer.dispose(), this._jobs.delete(n.id);
125
125
  else if (n.options.method.type === e.method.type && n.state === "running") throw Error("training_in_progress");
126
126
  }
127
127
  }
128
- let l = e.previous_job_id ? this.getJob(e.previous_job_id) : {
128
+ let u = e.previous_job_id ? this.getJob(e.previous_job_id) : {
129
129
  id: n(),
130
130
  state: "pending",
131
131
  trainer: r(this._model, this._tokeniser, e),
@@ -134,40 +134,36 @@ var o = class {
134
134
  remaining: 0,
135
135
  options: e,
136
136
  totalTokens: 0,
137
- datasets: o,
137
+ datasets: s,
138
138
  breakOnLog: !1
139
139
  };
140
- if (!l) throw Error("invalid_previous_job_id");
141
- if (this._jobs.set(l.id, l), this.setState(l, "pending"), a instanceof t) {
142
- if (l.datasetId && a.datasetId !== l.datasetId) {
143
- let e = /* @__PURE__ */ Error("dataset_mismatch");
144
- throw this.setState(l, "error", e), e;
145
- }
146
- if (a.tokeniserId !== this._tokeniser.id) {
140
+ if (!u) throw Error("invalid_previous_job_id");
141
+ if (this._jobs.set(u.id, u), this.setState(u, "pending"), o instanceof t) {
142
+ if (u.datasetId && o.datasetId !== u.datasetId && console.warn("TokenStore dataset ID does not match job dataset ID, proceeding anyway"), o.tokeniserId !== this._tokeniser.id) {
147
143
  let e = /* @__PURE__ */ Error("tokeniser_mismatch");
148
- throw this.setState(l, "error", e), e;
144
+ throw this.setState(u, "error", e), e;
149
145
  }
150
- l.datasetId = a.datasetId;
146
+ u.datasetId = o.datasetId;
151
147
  }
152
- if (!l.trainDataset) try {
153
- let t = await i(e, this._model, this._tokeniser, a, s, o);
154
- l.trainDataset = t.trainDataset, l.validationDataset = t.validationDataset, l.totalTokens = t.totalTokens;
148
+ if (!u.trainDataset) try {
149
+ let t = await i(e, this._model, this._tokeniser, o, u.datasetId ?? a(s), c, s);
150
+ u.trainDataset = t.trainDataset, u.validationDataset = t.validationDataset, u.totalTokens = t.totalTokens;
155
151
  } catch (e) {
156
- throw this.setState(l, "error", /* @__PURE__ */ Error("prepare_data_failed")), l.trainer.dispose(), this._jobs.delete(l.id), e;
152
+ throw this.setState(u, "error", /* @__PURE__ */ Error("prepare_data_failed")), u.trainer.dispose(), this._jobs.delete(u.id), e;
157
153
  }
158
154
  if (e.previous_job_id) {
159
- this.assertValidOptions(e), l.options = e;
155
+ this.assertValidOptions(e), u.options = e;
160
156
  try {
161
- l.trainer.configure(e);
157
+ u.trainer.configure(e);
162
158
  } catch (e) {
163
- throw this.setState(l, "error", /* @__PURE__ */ Error("trainer_configuration_failed")), l.trainer.dispose(), this._jobs.delete(l.id), e;
159
+ throw this.setState(u, "error", /* @__PURE__ */ Error("trainer_configuration_failed")), u.trainer.dispose(), this._jobs.delete(u.id), e;
164
160
  }
165
161
  } else try {
166
- l.trainer.configure(e);
162
+ u.trainer.configure(e);
167
163
  } catch (e) {
168
- throw this.setState(l, "error", /* @__PURE__ */ Error("trainer_configuration_failed")), l.trainer.dispose(), this._jobs.delete(l.id), e;
164
+ throw this.setState(u, "error", /* @__PURE__ */ Error("trainer_configuration_failed")), u.trainer.dispose(), this._jobs.delete(u.id), e;
169
165
  }
170
- return this.launchJob(l), l;
166
+ return this.launchJob(u), u;
171
167
  }
172
168
  getJob(e) {
173
169
  return this.assertValidJobId(e), this._jobs.get(e) ?? null;
@@ -18,5 +18,5 @@ interface PrepareDataResult {
18
18
  totalTokens: number;
19
19
  }
20
20
  /** Take our training options, model, tokeniser, and tasks, and prepare the training and validation datasets in Tensorflow format. */
21
- export default function prepareData(options: TrainingOptions, model: Model<ModelForwardAttributes>, tokeniser: ITokeniser, tasks: ConversationStream[] | Uint16Array[] | TokenStore, validation?: Uint16Array[] | TokenStore, datasets?: DatasetMetadata[]): Promise<PrepareDataResult>;
21
+ export default function prepareData(options: TrainingOptions, model: Model<ModelForwardAttributes>, tokeniser: ITokeniser, tasks: ConversationStream[] | Uint16Array[] | TokenStore, datasetId: string, validation?: Uint16Array[] | TokenStore, datasets?: DatasetMetadata[]): Promise<PrepareDataResult>;
22
22
  export {};
@@ -3,45 +3,45 @@ import { tokensFromStreams as t } from "./tasks/tokenStream.js";
3
3
  import { t as n } from "../DatasetBuilder-DU1G1OKX.js";
4
4
  import { createTrainValidationDatasets as r, storeFromArray as i } from "./validation.js";
5
5
  //#region lib/training/prepareData.ts
6
- async function a(a, o, s, c, l, u) {
7
- let d = a.loraName || a.loraConfig;
8
- if (u && d) throw Error("Cannot specify datasets when using LoRA fine-tuning");
9
- if (!u && !d) throw Error("Must specify datasets for non-LoRA training");
10
- if (u) {
6
+ async function a(a, o, s, c, l, u, d) {
7
+ let f = a.loraName || a.loraConfig;
8
+ if (d && f) throw Error("Cannot specify datasets when using LoRA fine-tuning");
9
+ if (!d && !f) throw Error("Must specify datasets for non-LoRA training");
10
+ if (d) {
11
11
  let e = o.metaData.pretrainingData || [], t = [...e], n = !1;
12
- for (let r of u) e.some((e) => e.id === r.id) || t.push({
12
+ for (let r of d) e.some((e) => e.id === r.id) || t.push({
13
13
  id: r.id,
14
14
  name: r.name,
15
15
  conversational: r.conversational
16
16
  }), r.conversational && (n = !0);
17
17
  o.metaData.pretrainingData = t, n ? o.metaData.mode = "conversational" : o.metaData.mode !== "conversational" && (o.metaData.mode = "completion");
18
18
  } else o.metaData.mode !== "conversational" && (o.metaData.mode = "completion");
19
- let f = a.maskedLoss ?? a.method.type === "supervised", p, m = l;
20
- if (Array.isArray(c)) if (c[0] instanceof Uint16Array) p = c;
19
+ let p = a.maskedLoss ?? a.method.type === "supervised", m, h = u;
20
+ if (Array.isArray(c)) if (c[0] instanceof Uint16Array) m = c;
21
21
  else {
22
- let e = await t(c, s, {
23
- masking: f,
22
+ let e = await t(c, s, l, {
23
+ masking: p,
24
24
  validationSplit: a.validationSplit
25
25
  });
26
- p = e.trainingTokens, l || (m = e.validationTokens);
26
+ m = e.trainingTokens, u || (h = e.validationTokens);
27
27
  }
28
- else p = c;
29
- let h = p instanceof e ? p.getTokenCount() : p.reduce((e, t) => e + t.length, 0);
30
- a.epochSteps = Math.ceil(h / ((a?.batchSize || 32) * o.config.blockSize));
31
- let g = new n(s, o.config.blockSize);
32
- if (m) {
33
- let { trainDataset: e, validationDataset: t } = await r(p, m, s, g, a?.batchSize || 32);
28
+ else m = c;
29
+ let g = m instanceof e ? m.getTokenCount() : m.reduce((e, t) => e + t.length, 0);
30
+ a.epochSteps = Math.ceil(g / ((a?.batchSize || 32) * o.config.blockSize));
31
+ let _ = new n(s, o.config.blockSize);
32
+ if (h) {
33
+ let { trainDataset: e, validationDataset: t } = await r(m, h, s, _, a?.batchSize || 32);
34
34
  return {
35
35
  trainDataset: e,
36
36
  validationDataset: t,
37
- totalTokens: h
37
+ totalTokens: g
38
38
  };
39
39
  } else {
40
- let t = p instanceof e ? p : await i(p, s);
40
+ let t = m instanceof e ? m : await i(m, s);
41
41
  return {
42
- trainDataset: (await g.createTextDataset(t, a)).dataset,
42
+ trainDataset: (await _.createTextDataset(t, a)).dataset,
43
43
  validationDataset: void 0,
44
- totalTokens: h
44
+ totalTokens: g
45
45
  };
46
46
  }
47
47
  }
@@ -10,7 +10,7 @@ interface TokensFromTasksOptions {
10
10
  validationSeed?: string | number;
11
11
  cb?: (tokens: number) => void;
12
12
  }
13
- export declare function tokensFromStreams(tasks: ConversationStream[], tokenizer: ITokeniser, options?: TokensFromTasksOptions): Promise<{
13
+ export declare function tokensFromStreams(tasks: ConversationStream[], tokenizer: ITokeniser, datasetId: string, options?: TokensFromTasksOptions): Promise<{
14
14
  trainingTokens: TokenStore;
15
15
  validationTokens?: TokenStore;
16
16
  }>;
@@ -22,24 +22,24 @@ function r(e, t, n, r, i, a) {
22
22
  } else n.set(e, r.offset), s && !Array.isArray(o) && s.set(o.mask.map((e) => +!!e), r.offset), r.offset += e.length;
23
23
  }
24
24
  }
25
- async function i(i, a, o) {
25
+ async function i(i, a, o, s) {
26
26
  await t("training-tokens");
27
- let s = await e("training-tokens", a.id, a.datasetID ?? "", o);
27
+ let c = await e("training-tokens", a.id, o, s);
28
28
  await t("validation-tokens");
29
- let c = o?.validationSplit && o.validationSplit > 0 ? await e("validation-tokens", a.id, a.datasetID ?? "", o) : void 0, l = [new Uint16Array(s.shardSize)], u = o?.masking ? [new Uint8Array(s.shardSize)] : null, d = {
29
+ let l = s?.validationSplit && s.validationSplit > 0 ? await e("validation-tokens", a.id, o, s) : void 0, u = [new Uint16Array(c.shardSize)], d = s?.masking ? [new Uint8Array(c.shardSize)] : null, f = {
30
30
  offset: 0,
31
31
  total: 0
32
- }, f = o?.validationSplit && o.validationSplit > 0 ? [new Uint16Array(c.shardSize)] : void 0, p = o?.masking && f ? [new Uint8Array(c.shardSize)] : null, m = {
32
+ }, p = s?.validationSplit && s.validationSplit > 0 ? [new Uint16Array(l.shardSize)] : void 0, m = s?.masking && p ? [new Uint8Array(l.shardSize)] : null, h = {
33
33
  offset: 0,
34
34
  total: 0
35
- }, h = 0, g = o?.cb, _ = o?.validationSeed === void 0 ? Math.random : n(o.validationSeed);
36
- for (; h < i.length;) await i[h++].begin((e) => {
37
- let t = o?.validationSplit && o.validationSplit > 0 && _() < o.validationSplit, n = t ? f : l, i = t ? m : d, h = t ? p : u, g = t ? c : s;
38
- r(e, n, a, i, g.shardSize, h || void 0), n.length > 1 && (g.appendShard(n[0], h ? h[0] : void 0), n.shift(), h && h.shift());
39
- }, g ? () => g(d.total) : void 0);
40
- return l.length === 1 && (l[0] = l[0].subarray(0, d.offset), 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), c.appendShard(f[0], p ? p[0].subarray(0, m.offset) : void 0)), await s.finish(), c && await c.finish(), {
41
- trainingTokens: s,
42
- validationTokens: f ? c : void 0
35
+ }, g = 0, _ = s?.cb, v = s?.validationSeed === void 0 ? Math.random : n(s.validationSeed);
36
+ for (; g < i.length;) await i[g++].begin((e) => {
37
+ let t = s?.validationSplit && s.validationSplit > 0 && v() < s.validationSplit, n = t ? p : u, i = t ? h : f, o = t ? m : d, g = t ? l : c;
38
+ r(e, n, a, i, g.shardSize, o || void 0), n.length > 1 && (g.appendShard(n[0], o ? o[0] : void 0), n.shift(), o && o.shift());
39
+ }, _ ? () => _(f.total) : void 0);
40
+ return u.length === 1 && (u[0] = u[0].subarray(0, f.offset), c.appendShard(u[0], d ? d[0].subarray(0, f.offset) : void 0)), p && p.length === 1 && (p[0] = p[0].subarray(0, h.offset), l.appendShard(p[0], m ? m[0].subarray(0, h.offset) : void 0)), await c.finish(), l && await l.finish(), {
41
+ trainingTokens: c,
42
+ validationTokens: p ? l : void 0
43
43
  };
44
44
  }
45
45
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genai-fi/nanogpt",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "type": "module",
5
5
  "main": "dist/main.js",
6
6
  "types": "dist/main.d.ts",