tensorgrad 0.0.4 → 0.0.7
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/adam.d.ts +28 -6
- package/dist/adam.d.ts.map +1 -1
- package/dist/adam.js +45 -11
- package/dist/adam.js.map +1 -1
- package/dist/codegen.js +16 -5
- package/dist/codegen.js.map +1 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +30 -33
- package/dist/compile.js.map +1 -1
- package/dist/grad.js +5 -16
- package/dist/grad.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/ir.d.ts +1 -0
- package/dist/ir.d.ts.map +1 -1
- package/dist/ir.js.map +1 -1
- package/dist/module.d.ts +8 -0
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +19 -3
- package/dist/module.js.map +1 -1
- package/dist/nn.d.ts +12 -0
- package/dist/nn.d.ts.map +1 -1
- package/dist/nn.js +57 -1
- package/dist/nn.js.map +1 -1
- package/dist/ops.d.ts +14 -1
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js +58 -2
- package/dist/ops.js.map +1 -1
- package/dist/runtime.d.ts +35 -29
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +28 -25
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
- package/src/adam.ts +74 -14
- package/src/codegen.ts +16 -5
- package/src/compile.ts +39 -31
- package/src/grad.ts +5 -16
- package/src/index.ts +3 -3
- package/src/ir.ts +15 -3
- package/src/module.ts +24 -2
- package/src/nn.ts +60 -1
- package/src/ops.ts +68 -4
- package/src/runtime.ts +58 -47
package/dist/runtime.d.ts
CHANGED
|
@@ -27,17 +27,38 @@ export interface RunWithCaptures {
|
|
|
27
27
|
output: Float32Array;
|
|
28
28
|
captures: Record<string, Float32Array>;
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
*
|
|
30
|
+
/** Common surface for both training and forward-only compiled runtimes. */
|
|
31
|
+
export interface CompiledBase {
|
|
32
|
+
/** Param name -> the underlying GPUBuffer. Pass to a sibling compile via
|
|
33
|
+
* `sharedParams` to share without copies. */
|
|
34
34
|
params: Map<string, GPUBuffer>;
|
|
35
|
+
/** Shape of each tensor registered via `capture(name, t)`. Static after
|
|
36
|
+
* compile — reshape readbacks without recomputing strides. */
|
|
37
|
+
captureShapes: Record<string, number[]>;
|
|
38
|
+
/** Shape of the graph's output (loss scalar `[]` for training; the user's
|
|
39
|
+
* returned tensor for forward-only compiles). */
|
|
40
|
+
outputShape: number[];
|
|
35
41
|
/** Upload parameter Float32Arrays to their GPU buffers. By default, requires
|
|
36
42
|
* *all* params to be present; throws on any unknown or missing key. Pass
|
|
37
43
|
* `{ partial: true }` to skip the missing-key check. */
|
|
38
44
|
uploadParams(params: Record<string, Float32Array>, opts?: UploadParamsOptions): void;
|
|
39
45
|
/** Read all parameters back as Float32Arrays — used for UI panels. */
|
|
40
46
|
downloadParams(): Promise<Record<string, Float32Array>>;
|
|
47
|
+
/** Free GPU resources. */
|
|
48
|
+
destroy(): void;
|
|
49
|
+
}
|
|
50
|
+
/** Run a dispatch and read back the full output tensor (and any registered
|
|
51
|
+
* captures if requested). Forward-only compiles use this as their primary
|
|
52
|
+
* surface; training compiles also expose it but `step()` is more convenient
|
|
53
|
+
* there because the output is a scalar loss. */
|
|
54
|
+
export interface RunFn {
|
|
55
|
+
(inputs: Record<string, Int32Array | Float32Array>): Promise<Float32Array>;
|
|
56
|
+
(inputs: Record<string, Int32Array | Float32Array>, opts: {
|
|
57
|
+
withCaptures: true;
|
|
58
|
+
}): Promise<RunWithCaptures>;
|
|
59
|
+
(inputs: Record<string, Int32Array | Float32Array>, opts: RunOptions): Promise<Float32Array | RunWithCaptures>;
|
|
60
|
+
}
|
|
61
|
+
export interface CompiledRuntime extends CompiledBase {
|
|
41
62
|
/** Read all parameter gradients back. Mostly for verification / debugging. */
|
|
42
63
|
downloadParamGrads(): Promise<Record<string, Float32Array>>;
|
|
43
64
|
/**
|
|
@@ -54,35 +75,18 @@ export interface CompiledRuntime {
|
|
|
54
75
|
withCaptures: true;
|
|
55
76
|
}): Promise<StepWithCaptures>;
|
|
56
77
|
step(inputs: Record<string, Int32Array | Float32Array>, opts: StepOptions): Promise<number | StepWithCaptures>;
|
|
57
|
-
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
run
|
|
61
|
-
run(inputs: Record<string, Int32Array | Float32Array>, opts: {
|
|
62
|
-
withCaptures: true;
|
|
63
|
-
}): Promise<RunWithCaptures>;
|
|
64
|
-
run(inputs: Record<string, Int32Array | Float32Array>, opts: RunOptions): Promise<Float32Array | RunWithCaptures>;
|
|
78
|
+
/** Same dispatch as step() but returns the full output Float32Array — for
|
|
79
|
+
* training graphs the output is a scalar loss, so step() is usually more
|
|
80
|
+
* convenient. Provided for parity with `compileForward`. */
|
|
81
|
+
run: RunFn;
|
|
65
82
|
/** Re-zero all optimizer state buffers (Adam's m/v) in place. Pair with
|
|
66
83
|
* `uploadInitialParams()` for a full training reset without recompile. */
|
|
67
84
|
resetOptimizerState(): void;
|
|
68
|
-
/** Free GPU resources. */
|
|
69
|
-
destroy(): void;
|
|
70
85
|
}
|
|
71
86
|
/** Forward-only compiled runtime — produced by `compileForward`. No optimizer,
|
|
72
87
|
* no backward. Returns the output tensor (not just a scalar) per `run()` call. */
|
|
73
|
-
export interface CompiledForward {
|
|
74
|
-
|
|
75
|
-
uploadParams(params: Record<string, Float32Array>, opts?: UploadParamsOptions): void;
|
|
76
|
-
downloadParams(): Promise<Record<string, Float32Array>>;
|
|
77
|
-
/** Forward-only dispatch. Returns the graph's output tensor as a Float32Array
|
|
78
|
-
* (the user's returned tensor from the forward function, in row-major order).
|
|
79
|
-
* With `{ withCaptures: true }`, returns `{ output, captures }`. */
|
|
80
|
-
run(inputs: Record<string, Int32Array | Float32Array>): Promise<Float32Array>;
|
|
81
|
-
run(inputs: Record<string, Int32Array | Float32Array>, opts: {
|
|
82
|
-
withCaptures: true;
|
|
83
|
-
}): Promise<RunWithCaptures>;
|
|
84
|
-
run(inputs: Record<string, Int32Array | Float32Array>, opts: RunOptions): Promise<Float32Array | RunWithCaptures>;
|
|
85
|
-
destroy(): void;
|
|
88
|
+
export interface CompiledForward extends CompiledBase {
|
|
89
|
+
run: RunFn;
|
|
86
90
|
}
|
|
87
91
|
export interface RuntimeOpts {
|
|
88
92
|
/** Pre-acquired GPUDevice. If omitted, runtime requests its own. */
|
|
@@ -95,7 +99,9 @@ export interface RuntimeOpts {
|
|
|
95
99
|
sharedParams?: Map<string, GPUBuffer>;
|
|
96
100
|
}
|
|
97
101
|
export declare function createRuntime(plan: BufferPlan, kernels: KernelSpec[], lossBufferId: number, opts?: RuntimeOpts): Promise<CompiledRuntime>;
|
|
98
|
-
/** Same machinery as `createRuntime`, narrower public
|
|
99
|
-
*
|
|
102
|
+
/** Same machinery as `createRuntime`, narrower public type: a forward-only
|
|
103
|
+
* graph exposes `run()` instead of `step()` (no optimizer state, no scalar-
|
|
104
|
+
* loss readback). The full runtime object is built once and projected by
|
|
105
|
+
* `compileForward` to the public shape. */
|
|
100
106
|
export declare function createForwardRuntime(plan: BufferPlan, kernels: KernelSpec[], outputBufferId: number, opts?: RuntimeOpts): Promise<CompiledForward>;
|
|
101
107
|
//# sourceMappingURL=runtime.d.ts.map
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAM9C,MAAM,WAAW,mBAAmB;IAClC;;0EAEsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B;;;4EAGwE;IACxE,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,UAAU;IACzB;;qDAEiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -34,14 +34,8 @@ export async function createRuntime(plan, kernels, lossBufferId, opts = {}) {
|
|
|
34
34
|
label: spec.name ?? `t${spec.id}-${spec.kind}`,
|
|
35
35
|
});
|
|
36
36
|
buffers.set(spec.id, buf);
|
|
37
|
-
if (spec.kind === 'state')
|
|
38
|
-
|
|
39
|
-
const elements = spec.byteSize / 4;
|
|
40
|
-
const init = spec.dtype === 'f32'
|
|
41
|
-
? new Float32Array(elements).fill(spec.initValue ?? 0)
|
|
42
|
-
: new Int32Array(elements).fill(Math.trunc(spec.initValue ?? 0));
|
|
43
|
-
queue.writeBuffer(buf, 0, init);
|
|
44
|
-
}
|
|
37
|
+
if (spec.kind === 'state')
|
|
38
|
+
fillStateBuffer(spec, buf);
|
|
45
39
|
}
|
|
46
40
|
// Track which params are externally owned — those are skipped on destroy().
|
|
47
41
|
const ownedBufferIds = new Set();
|
|
@@ -262,15 +256,20 @@ export async function createRuntime(plan, kernels, lossBufferId, opts = {}) {
|
|
|
262
256
|
}
|
|
263
257
|
return out;
|
|
264
258
|
}
|
|
259
|
+
// Fill a state buffer with its declared initValue (typically 0). Float and
|
|
260
|
+
// int both serialize to 4 bytes per element. Used at allocation time and on
|
|
261
|
+
// resetOptimizerState() — same logic, two callers.
|
|
262
|
+
function fillStateBuffer(spec, target) {
|
|
263
|
+
const elements = spec.byteSize / 4;
|
|
264
|
+
const init = spec.dtype === 'f32'
|
|
265
|
+
? new Float32Array(elements).fill(spec.initValue ?? 0)
|
|
266
|
+
: new Int32Array(elements).fill(Math.trunc(spec.initValue ?? 0));
|
|
267
|
+
queue.writeBuffer(target, 0, init);
|
|
268
|
+
}
|
|
265
269
|
function resetOptimizerState() {
|
|
266
270
|
for (const spec of plan.buffers) {
|
|
267
|
-
if (spec.kind
|
|
268
|
-
|
|
269
|
-
const elements = spec.byteSize / 4;
|
|
270
|
-
const init = spec.dtype === 'f32'
|
|
271
|
-
? new Float32Array(elements).fill(spec.initValue ?? 0)
|
|
272
|
-
: new Int32Array(elements).fill(Math.trunc(spec.initValue ?? 0));
|
|
273
|
-
queue.writeBuffer(buffers.get(spec.id), 0, init);
|
|
271
|
+
if (spec.kind === 'state')
|
|
272
|
+
fillStateBuffer(spec, buffers.get(spec.id));
|
|
274
273
|
}
|
|
275
274
|
}
|
|
276
275
|
// Build the params map AFTER buffer allocation so it points at the actual
|
|
@@ -279,6 +278,13 @@ export async function createRuntime(plan, kernels, lossBufferId, opts = {}) {
|
|
|
279
278
|
for (const [name, bufId] of plan.paramsByName) {
|
|
280
279
|
params.set(name, buffers.get(bufId));
|
|
281
280
|
}
|
|
281
|
+
// Static-after-compile shape metadata so users don't have to recompute
|
|
282
|
+
// strides to interpret a flat capture readback.
|
|
283
|
+
const captureShapes = {};
|
|
284
|
+
for (const [name, bufId] of plan.capturesByName) {
|
|
285
|
+
captureShapes[name] = [...plan.buffers[bufId].shape];
|
|
286
|
+
}
|
|
287
|
+
const outputShape = [...plan.buffers[lossBufferId].shape];
|
|
282
288
|
const destroy = () => {
|
|
283
289
|
for (const [id, b] of buffers) {
|
|
284
290
|
if (ownedBufferIds.has(id))
|
|
@@ -291,6 +297,8 @@ export async function createRuntime(plan, kernels, lossBufferId, opts = {}) {
|
|
|
291
297
|
};
|
|
292
298
|
return {
|
|
293
299
|
params,
|
|
300
|
+
captureShapes,
|
|
301
|
+
outputShape,
|
|
294
302
|
uploadParams,
|
|
295
303
|
downloadParams: () => downloadFromMap(plan.paramsByName),
|
|
296
304
|
downloadParamGrads: () => downloadFromMap(plan.paramGradsByName),
|
|
@@ -300,17 +308,12 @@ export async function createRuntime(plan, kernels, lossBufferId, opts = {}) {
|
|
|
300
308
|
destroy,
|
|
301
309
|
};
|
|
302
310
|
}
|
|
303
|
-
/** Same machinery as `createRuntime`, narrower public
|
|
304
|
-
*
|
|
311
|
+
/** Same machinery as `createRuntime`, narrower public type: a forward-only
|
|
312
|
+
* graph exposes `run()` instead of `step()` (no optimizer state, no scalar-
|
|
313
|
+
* loss readback). The full runtime object is built once and projected by
|
|
314
|
+
* `compileForward` to the public shape. */
|
|
305
315
|
export async function createForwardRuntime(plan, kernels, outputBufferId, opts = {}) {
|
|
306
|
-
|
|
307
|
-
return {
|
|
308
|
-
params: full.params,
|
|
309
|
-
uploadParams: full.uploadParams,
|
|
310
|
-
downloadParams: full.downloadParams,
|
|
311
|
-
run: full.run,
|
|
312
|
-
destroy: full.destroy,
|
|
313
|
-
};
|
|
316
|
+
return await createRuntime(plan, kernels, outputBufferId, opts);
|
|
314
317
|
}
|
|
315
318
|
async function acquireDevice() {
|
|
316
319
|
if (typeof navigator === 'undefined' || !navigator.gpu) {
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tensorgrad",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "Tiny TypeScript-native tensor library with autograd, compiling to WebGPU. Train small models in the browser without hand-writing kernels.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ben Albahari",
|
package/src/adam.ts
CHANGED
|
@@ -15,6 +15,12 @@
|
|
|
15
15
|
// `sqrt(1-b2^t)/(1-b1^t)`; that's why convergence isn't affected by the
|
|
16
16
|
// first-step warmup that bias-correction-free Adam suffers.
|
|
17
17
|
//
|
|
18
|
+
// **Static vs scheduled lr.** When `config.lr` is a number, decayShrink is
|
|
19
|
+
// baked into the kernel as a literal. When it's a function `(step) => lr`,
|
|
20
|
+
// decayShrink for decayed params becomes a per-step scalar input that the
|
|
21
|
+
// runtime updates each call (computed from the current step's lr). lrt is
|
|
22
|
+
// always per-step; the bias-correction factor changes every step regardless.
|
|
23
|
+
//
|
|
18
24
|
// Returns writeback declarations the buffer planner uses to wire up the
|
|
19
25
|
// "after step, copy the new value into the persistent home" path. m and v
|
|
20
26
|
// are state_inputs (zero-initialized, persistent across steps); the param
|
|
@@ -27,7 +33,11 @@ import { traceInto, stateInput, tensorInput } from './trace.js'
|
|
|
27
33
|
import { adamUpdateM, adamUpdateV, adamUpdateP } from './ops.js'
|
|
28
34
|
|
|
29
35
|
export interface AdamConfig {
|
|
30
|
-
|
|
36
|
+
/** Constant scalar (e.g., `0.005`) or a per-step schedule function
|
|
37
|
+
* `(step) => lr`. Schedule fn lets the user implement linear/cosine decay
|
|
38
|
+
* or warmup; first call passes `step=1`. Decay-shrink (AdamW) updates
|
|
39
|
+
* per-step automatically when this is a function. */
|
|
40
|
+
lr: number | ((step: number) => number)
|
|
31
41
|
b1?: number // default 0.9
|
|
32
42
|
b2?: number // default 0.999
|
|
33
43
|
eps?: number // default 1e-8
|
|
@@ -42,14 +52,30 @@ export interface AdamConfig {
|
|
|
42
52
|
decayFilter?: (paramName: string) => boolean
|
|
43
53
|
}
|
|
44
54
|
|
|
55
|
+
/** Resolved hyperparameters: lr is the schedule fn (constants are wrapped). */
|
|
56
|
+
export interface AdamResolvedConfig {
|
|
57
|
+
lr: (step: number) => number
|
|
58
|
+
b1: number
|
|
59
|
+
b2: number
|
|
60
|
+
eps: number
|
|
61
|
+
weightDecay: number
|
|
62
|
+
decayFilter: (name: string) => boolean
|
|
63
|
+
/** True iff the user supplied an lr function (vs a constant). When false,
|
|
64
|
+
* decayShrink is baked at compile time and never updated. */
|
|
65
|
+
lrIsScheduled: boolean
|
|
66
|
+
}
|
|
67
|
+
|
|
45
68
|
export interface AdamResult {
|
|
46
69
|
/** Writebacks the buffer planner should wire into the runtime. */
|
|
47
70
|
writebacks: WritebackDecl[]
|
|
48
71
|
/** Name of the per-step scalar tensor_input. The runtime fills this each call
|
|
49
72
|
* with `lr * sqrt(1-b2^t)/(1-b1^t)` (Adam's bias-corrected effective LR). */
|
|
50
73
|
lrtInputName: string
|
|
51
|
-
/**
|
|
52
|
-
|
|
74
|
+
/** Name of the per-step decayShrink scalar tensor_input, or null when lr is
|
|
75
|
+
* static (decayShrink baked into the kernel) or no params are decayed. */
|
|
76
|
+
decayShrinkInputName: string | null
|
|
77
|
+
/** Hyperparameters as captured (so the runtime can compute lrt and decayShrink). */
|
|
78
|
+
config: AdamResolvedConfig
|
|
53
79
|
}
|
|
54
80
|
|
|
55
81
|
/**
|
|
@@ -69,23 +95,55 @@ export function appendAdam(
|
|
|
69
95
|
paramGrads: Record<string, Tensor>,
|
|
70
96
|
paramTensors: Record<string, Tensor>,
|
|
71
97
|
config: AdamConfig,
|
|
98
|
+
/** Per-param decay flags from `materializeParams`. When supplied, overrides
|
|
99
|
+
* `config.decayFilter` for any name in the map; falls back to `decayFilter`
|
|
100
|
+
* for names not present (e.g., for low-level callers using `compile()`
|
|
101
|
+
* directly without a Module). */
|
|
102
|
+
decayFlags?: Record<string, boolean>,
|
|
72
103
|
): AdamResult {
|
|
73
|
-
const
|
|
74
|
-
|
|
104
|
+
const lrIsScheduled = typeof config.lr === 'function'
|
|
105
|
+
const lrFn = lrIsScheduled
|
|
106
|
+
? config.lr as (step: number) => number
|
|
107
|
+
: (() => config.lr as number)
|
|
108
|
+
const initialLr = lrFn(1)
|
|
109
|
+
const fullConfig: AdamResolvedConfig = {
|
|
110
|
+
lr: lrFn,
|
|
75
111
|
b1: config.b1 ?? 0.9,
|
|
76
112
|
b2: config.b2 ?? 0.999,
|
|
77
113
|
eps: config.eps ?? 1e-8,
|
|
78
114
|
weightDecay: config.weightDecay ?? 0,
|
|
79
115
|
decayFilter: config.decayFilter ?? (() => true),
|
|
116
|
+
lrIsScheduled,
|
|
80
117
|
}
|
|
81
118
|
const writebacks: WritebackDecl[] = []
|
|
82
119
|
const lrtInputName = '_adam_lrt'
|
|
120
|
+
// Tensor input for runtime-updated decayShrink (only created when lr is a
|
|
121
|
+
// schedule fn AND at least one param will receive weight decay).
|
|
122
|
+
let decayShrinkInputName: string | null = null
|
|
83
123
|
|
|
84
124
|
return traceInto(graph, () => {
|
|
85
|
-
// One scalar lrt input shared by every adam_update_p call. Runtime supplies
|
|
86
|
-
// it per step as `lr * sqrt(1-b2^t) / (1-b1^t)`.
|
|
87
125
|
const lrt = tensorInput(lrtInputName, [], 'f32')
|
|
88
126
|
|
|
127
|
+
// Up-front: which params receive weight decay? Per-param decayFlags (set
|
|
128
|
+
// by Module.param's options) wins; falls back to decayFilter for names
|
|
129
|
+
// not in the map. Empty when weightDecay = 0 so the rest of the function
|
|
130
|
+
// can just ask "is this name in the set?".
|
|
131
|
+
const decayedNames = new Set<string>(
|
|
132
|
+
fullConfig.weightDecay > 0
|
|
133
|
+
? Object.keys(paramGrads).filter(name =>
|
|
134
|
+
(decayFlags && name in decayFlags) ? decayFlags[name]! : fullConfig.decayFilter(name))
|
|
135
|
+
: [],
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
// We only need a runtime decayShrink scalar when lr varies per step AND
|
|
139
|
+
// at least one param is being decayed. Otherwise the value is constant
|
|
140
|
+
// and bakes into the kernel as a literal.
|
|
141
|
+
let decayShrinkScalar: Tensor | null = null
|
|
142
|
+
if (lrIsScheduled && decayedNames.size > 0) {
|
|
143
|
+
decayShrinkInputName = '_adam_decay_shrink'
|
|
144
|
+
decayShrinkScalar = tensorInput(decayShrinkInputName, [], 'f32')
|
|
145
|
+
}
|
|
146
|
+
|
|
89
147
|
for (const name of Object.keys(paramGrads)) {
|
|
90
148
|
const p = paramTensors[name]
|
|
91
149
|
const g = paramGrads[name]
|
|
@@ -95,12 +153,14 @@ export function appendAdam(
|
|
|
95
153
|
const mState = stateInput(`adam_m_${name}`, p.shape, 'f32', 0)
|
|
96
154
|
const vState = stateInput(`adam_v_${name}`, p.shape, 'f32', 0)
|
|
97
155
|
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
156
|
+
// Choose the decayShrink form per param:
|
|
157
|
+
// - non-decayed params: literal 1 (kernel multiply folds out).
|
|
158
|
+
// - decayed + scheduled lr: tensor input updated per step.
|
|
159
|
+
// - decayed + static lr: literal `1 - lr * wd` baked at compile.
|
|
160
|
+
const decayShrink: number | Tensor =
|
|
161
|
+
!decayedNames.has(name) ? 1
|
|
162
|
+
: decayShrinkScalar !== null ? decayShrinkScalar
|
|
163
|
+
: 1 - initialLr * fullConfig.weightDecay
|
|
104
164
|
|
|
105
165
|
// Three fused kernels per parameter — one for each of m_new / v_new / p_new.
|
|
106
166
|
const newM = adamUpdateM(mState, g, fullConfig.b1)
|
|
@@ -111,6 +171,6 @@ export function appendAdam(
|
|
|
111
171
|
writebacks.push({ source: newV, destName: `adam_v_${name}`, destKind: 'state' })
|
|
112
172
|
writebacks.push({ source: newP, destName: name, destKind: 'param' })
|
|
113
173
|
}
|
|
114
|
-
return { writebacks, lrtInputName, config: fullConfig }
|
|
174
|
+
return { writebacks, lrtInputName, decayShrinkInputName, config: fullConfig }
|
|
115
175
|
})
|
|
116
176
|
}
|
package/src/codegen.ts
CHANGED
|
@@ -557,23 +557,34 @@ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
|
557
557
|
case 'adam_update_p': {
|
|
558
558
|
// p_new = decayShrink * p - lrt[0] * m_new / (sqrt(v_new) + eps).
|
|
559
559
|
// lrt is supplied per-step from CPU (already includes bias correction).
|
|
560
|
-
// decayShrink
|
|
561
|
-
//
|
|
560
|
+
// decayShrink is either baked as a literal (no schedule, fixed lr) or
|
|
561
|
+
// bound as a per-step scalar input (when the user supplies an lr
|
|
562
|
+
// schedule via `adam: { lr: (step) => ... }`). When literal=1 the WGSL
|
|
563
|
+
// compiler folds the multiply away.
|
|
562
564
|
const out = tof(op.out)
|
|
563
565
|
const total = shapeSize(out.shape)
|
|
566
|
+
const dynamicShrink = op.decayShrinkTensor !== null
|
|
567
|
+
const shrinkExpr = dynamicShrink ? 'decayShrink[0]' : wgslLiteral(op.decayShrink, 'f32')
|
|
568
|
+
const shrinkBinding = dynamicShrink
|
|
569
|
+
? `@group(0) @binding(4) var<storage, read> decayShrink : array<f32>;\n` +
|
|
570
|
+
`@group(0) @binding(5) var<storage, read_write> out : array<f32>;`
|
|
571
|
+
: `@group(0) @binding(4) var<storage, read_write> out : array<f32>;`
|
|
564
572
|
const wgsl = `
|
|
565
573
|
@group(0) @binding(0) var<storage, read> p : array<f32>;
|
|
566
574
|
@group(0) @binding(1) var<storage, read> mNew : array<f32>;
|
|
567
575
|
@group(0) @binding(2) var<storage, read> vNew : array<f32>;
|
|
568
576
|
@group(0) @binding(3) var<storage, read> lrt : array<f32>;
|
|
569
|
-
|
|
577
|
+
${shrinkBinding}
|
|
570
578
|
@compute @workgroup_size(${WG_SIZE})
|
|
571
579
|
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
572
580
|
let i = gid.x + gid.y * 16776960u;
|
|
573
581
|
if (i >= ${total}u) { return; }
|
|
574
|
-
out[i] = ${
|
|
582
|
+
out[i] = ${shrinkExpr} * p[i] - lrt[0] * mNew[i] / (sqrt(vNew[i]) + ${wgslLiteral(op.eps, 'f32')});
|
|
575
583
|
}`.trim()
|
|
576
|
-
|
|
584
|
+
const bindings = dynamicShrink
|
|
585
|
+
? [buf(op.p), buf(op.mNew), buf(op.vNew), buf(op.lrt), buf(op.decayShrinkTensor!), buf(op.out)]
|
|
586
|
+
: [buf(op.p), buf(op.mNew), buf(op.vNew), buf(op.lrt), buf(op.out)]
|
|
587
|
+
return { opIndex, opKind: op.kind, wgsl, bindings, threads: total, workgroupSize: WG_SIZE }
|
|
577
588
|
}
|
|
578
589
|
|
|
579
590
|
case 'sum_to_shape': {
|
package/src/compile.ts
CHANGED
|
@@ -93,7 +93,7 @@ export async function compileModule<M extends Module>(
|
|
|
93
93
|
): Promise<CompiledRuntime & { ir: CompiledIR; uploadInitialParams: () => void }> {
|
|
94
94
|
const inputDecls = opts.inputs ?? []
|
|
95
95
|
const model = modelFactory()
|
|
96
|
-
let materialized: ReturnType<typeof materializeParams> = { tensors: {}, initFns: {} }
|
|
96
|
+
let materialized: ReturnType<typeof materializeParams> = { tensors: {}, initFns: {}, decayFlags: {} }
|
|
97
97
|
const graph = trace(() => {
|
|
98
98
|
materialized = materializeParams(model)
|
|
99
99
|
const inputTensors = inputDecls.map(d => tensorInput(d.name, d.shape, d.dtype ?? 'f32'))
|
|
@@ -104,7 +104,7 @@ export async function compileModule<M extends Module>(
|
|
|
104
104
|
|
|
105
105
|
let adamResult: ReturnType<typeof appendAdam> | undefined
|
|
106
106
|
if (opts.adam) {
|
|
107
|
-
adamResult = appendAdam(graph, paramGrads, materialized.tensors, opts.adam)
|
|
107
|
+
adamResult = appendAdam(graph, paramGrads, materialized.tensors, opts.adam, materialized.decayFlags)
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
const plan = planBuffers(graph, paramGrads, adamResult?.writebacks ?? [])
|
|
@@ -112,13 +112,15 @@ export async function compileModule<M extends Module>(
|
|
|
112
112
|
const lossBufferId = plan.tensorToBuffer.get(loss.id)!
|
|
113
113
|
const runtime = await createRuntime(plan, kernels, lossBufferId, opts)
|
|
114
114
|
|
|
115
|
-
// If Adam is enabled, wrap step() to track the step count and supply lrt
|
|
115
|
+
// If Adam is enabled, wrap step() to track the step count and supply lrt
|
|
116
|
+
// (and optionally decayShrink, when the user passed a per-step lr schedule).
|
|
116
117
|
// Wrap resetOptimizerState() too, so a reset zeros m/v *and* the bias-correction
|
|
117
118
|
// counter — otherwise the next step would skip Adam's warmup phase.
|
|
118
119
|
if (adamResult) {
|
|
119
|
-
const { lrtInputName, config } = adamResult
|
|
120
|
+
const { lrtInputName, decayShrinkInputName, config } = adamResult
|
|
120
121
|
let t = 0
|
|
121
122
|
const lrtBuf = new Float32Array(1)
|
|
123
|
+
const decayShrinkBuf = decayShrinkInputName ? new Float32Array(1) : null
|
|
122
124
|
const innerStep = runtime.step.bind(runtime) as CompiledRuntime['step']
|
|
123
125
|
const innerReset = runtime.resetOptimizerState.bind(runtime)
|
|
124
126
|
const wrappedStep = (
|
|
@@ -126,8 +128,13 @@ export async function compileModule<M extends Module>(
|
|
|
126
128
|
opts?: { withCaptures?: boolean },
|
|
127
129
|
): Promise<number | { loss: number; captures: Record<string, Float32Array> }> => {
|
|
128
130
|
t++
|
|
129
|
-
|
|
130
|
-
|
|
131
|
+
const lrNow = config.lr(t)
|
|
132
|
+
lrtBuf[0] = lrNow * Math.sqrt(1 - Math.pow(config.b2, t)) / (1 - Math.pow(config.b1, t))
|
|
133
|
+
const merged: Record<string, Int32Array | Float32Array> = { ...inputs, [lrtInputName]: lrtBuf }
|
|
134
|
+
if (decayShrinkBuf && decayShrinkInputName) {
|
|
135
|
+
decayShrinkBuf[0] = 1 - lrNow * config.weightDecay
|
|
136
|
+
merged[decayShrinkInputName] = decayShrinkBuf
|
|
137
|
+
}
|
|
131
138
|
return opts?.withCaptures ? innerStep(merged, { withCaptures: true }) : innerStep(merged)
|
|
132
139
|
}
|
|
133
140
|
runtime.step = wrappedStep as CompiledRuntime['step']
|
|
@@ -137,16 +144,8 @@ export async function compileModule<M extends Module>(
|
|
|
137
144
|
}
|
|
138
145
|
}
|
|
139
146
|
|
|
140
|
-
const { initFns } = materialized
|
|
141
147
|
const uploadInitialParams = () => {
|
|
142
|
-
const out
|
|
143
|
-
for (const [name, bufId] of plan.paramsByName) {
|
|
144
|
-
const shape = plan.buffers[bufId]!.shape
|
|
145
|
-
const size = shape.reduce((a, b) => a * b, 1)
|
|
146
|
-
const initFn = initFns[name]
|
|
147
|
-
if (!initFn) throw new Error(`uploadInitialParams: no init for param '${name}'`)
|
|
148
|
-
out[name] = initFn(size, shape)
|
|
149
|
-
}
|
|
148
|
+
const out = buildInitialParamUploads(plan, materialized.initFns)
|
|
150
149
|
runtime.uploadParams(out)
|
|
151
150
|
}
|
|
152
151
|
|
|
@@ -154,6 +153,28 @@ export async function compileModule<M extends Module>(
|
|
|
154
153
|
return Object.assign(runtime, { ir, uploadInitialParams })
|
|
155
154
|
}
|
|
156
155
|
|
|
156
|
+
// Build a Record<paramName, Float32Array> by running each param's init
|
|
157
|
+
// function against its shape. Shared by compileModule and compileForward.
|
|
158
|
+
// `sharedParams`, when supplied, skips any name it covers (those are owned
|
|
159
|
+
// by the sibling compile and already initialized there).
|
|
160
|
+
type InitFn = (size: number, shape: readonly number[]) => Float32Array
|
|
161
|
+
function buildInitialParamUploads(
|
|
162
|
+
plan: BufferPlan,
|
|
163
|
+
initFns: Record<string, InitFn>,
|
|
164
|
+
sharedParams?: Map<string, GPUBuffer>,
|
|
165
|
+
): Record<string, Float32Array> {
|
|
166
|
+
const out: Record<string, Float32Array> = {}
|
|
167
|
+
for (const [name, bufId] of plan.paramsByName) {
|
|
168
|
+
if (sharedParams?.has(name)) continue
|
|
169
|
+
const shape = plan.buffers[bufId]!.shape
|
|
170
|
+
const size = shape.reduce((a, b) => a * b, 1)
|
|
171
|
+
const initFn = initFns[name]
|
|
172
|
+
if (!initFn) throw new Error(`uploadInitialParams: no init for param '${name}'`)
|
|
173
|
+
out[name] = initFn(size, shape)
|
|
174
|
+
}
|
|
175
|
+
return out
|
|
176
|
+
}
|
|
177
|
+
|
|
157
178
|
// ============================================================================
|
|
158
179
|
// Forward-only compile
|
|
159
180
|
// ============================================================================
|
|
@@ -180,7 +201,7 @@ export async function compileForward<M extends Module>(
|
|
|
180
201
|
): Promise<CompiledForward & { ir: CompiledIR; uploadInitialParams: () => void }> {
|
|
181
202
|
const inputDecls = opts.inputs ?? []
|
|
182
203
|
const model = modelFactory()
|
|
183
|
-
let materialized: ReturnType<typeof materializeParams> = { tensors: {}, initFns: {} }
|
|
204
|
+
let materialized: ReturnType<typeof materializeParams> = { tensors: {}, initFns: {}, decayFlags: {} }
|
|
184
205
|
const graph = trace(() => {
|
|
185
206
|
materialized = materializeParams(model)
|
|
186
207
|
const inputTensors = inputDecls.map(d => tensorInput(d.name, d.shape, d.dtype ?? 'f32'))
|
|
@@ -194,22 +215,9 @@ export async function compileForward<M extends Module>(
|
|
|
194
215
|
const runtime = await createForwardRuntime(plan, kernels, outputBufferId, opts)
|
|
195
216
|
|
|
196
217
|
const sharedParams = opts.sharedParams
|
|
197
|
-
const { initFns } = materialized
|
|
198
218
|
const uploadInitialParams = () => {
|
|
199
|
-
const out
|
|
200
|
-
|
|
201
|
-
for (const [name, bufId] of plan.paramsByName) {
|
|
202
|
-
// Skip params covered by sharedParams — those are owned by the providing
|
|
203
|
-
// compile and already initialized there.
|
|
204
|
-
if (sharedParams?.has(name)) continue
|
|
205
|
-
const shape = plan.buffers[bufId]!.shape
|
|
206
|
-
const size = shape.reduce((a, b) => a * b, 1)
|
|
207
|
-
const initFn = initFns[name]
|
|
208
|
-
if (!initFn) throw new Error(`uploadInitialParams: no init for param '${name}'`)
|
|
209
|
-
out[name] = initFn(size, shape)
|
|
210
|
-
needsUpload = true
|
|
211
|
-
}
|
|
212
|
-
if (needsUpload) runtime.uploadParams(out, { partial: !!sharedParams })
|
|
219
|
+
const out = buildInitialParamUploads(plan, materialized.initFns, sharedParams)
|
|
220
|
+
if (Object.keys(out).length > 0) runtime.uploadParams(out, { partial: !!sharedParams })
|
|
213
221
|
}
|
|
214
222
|
|
|
215
223
|
// CompiledIR.loss is the field name; for forward-only, it carries the user's
|