@omnid/tinyemo 0.0.0-stage → 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packed-assets.js","sourceRoot":"","sources":["../src/packed-assets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAe,CAAC;AAEzD,MAAM,CAAC,MAAM,aAAa,GAAuB;IAC/C,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,GAAG;IACd,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE,GAAG;IACV,aAAa,EAAE,GAAG;IAClB,UAAU,EAAE,GAAG;IACf,YAAY,EAAE,EAAE;IAChB,cAAc,EAAE,EAAE;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAsB,CAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,aAAa,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,CAAC;AAEjoI;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAW,0mXAA0mX,CAAC;AAEvpX;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAW,k8pwCAAk8pwC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { TinyEmoModelConfig } from "./types.js";
2
+ import type { PackedGpuWeights } from "./weights.js";
3
+ export declare const IN_INT_STRIDE = 224;
4
+ export declare const IN_FLT_STRIDE = 196;
5
+ export declare const WS_NG_OFF = 0;
6
+ export declare const WS_X_OFF = 16;
7
+ export declare const WS_QKV_OFF = 2064;
8
+ export declare const WS_FF1_OFF = 8208;
9
+ export declare const WS_POOL_SCORE_OFF = 12304;
10
+ export declare const WS_HEAD1_OFF = 12320;
11
+ export declare const WS_STRIDE = 12448;
12
+ /**
13
+ * Generate the complete WGSL compute shader module source for TinyEmo WebGPU inference.
14
+ */
15
+ export declare function createTinyEmoShaderSource(cfg: TinyEmoModelConfig, offsets: PackedGpuWeights["offsets"]): string;
16
+ //# sourceMappingURL=shaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaders.d.ts","sourceRoot":"","sources":["../src/shaders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,UAAU,OAAO,CAAC;AAC/B,eAAO,MAAM,UAAU,OAAO,CAAC;AAC/B,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AACvC,eAAO,MAAM,YAAY,QAAQ,CAAC;AAClC,eAAO,MAAM,SAAS,QAAQ,CAAC;AAE/B;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,GACnC,MAAM,CAgfR"}
@@ -0,0 +1,509 @@
1
+ export const IN_INT_STRIDE = 224; // 16 tok_ids + 16 tok_mask + 96*2 ng_bucket
2
+ export const IN_FLT_STRIDE = 196; // 96*2 ng_sign + 1 ng_count + 3 padding
3
+ export const WS_NG_OFF = 0; // 16 floats
4
+ export const WS_X_OFF = 16; // 16 * 128 = 2048 floats (16..2063)
5
+ export const WS_QKV_OFF = 2064; // 16 * 384 = 6144 floats (2064..8207)
6
+ export const WS_FF1_OFF = 8208; // 16 * 256 = 4096 floats (8208..12303)
7
+ export const WS_POOL_SCORE_OFF = 12304; // 16 floats (12304..12319)
8
+ export const WS_HEAD1_OFF = 12320; // 128 floats (12320..12447)
9
+ export const WS_STRIDE = 12448;
10
+ /**
11
+ * Generate the complete WGSL compute shader module source for TinyEmo WebGPU inference.
12
+ */
13
+ export function createTinyEmoShaderSource(cfg, offsets) {
14
+ const headDim = cfg.d_model / cfg.n_heads;
15
+ const invSqrtHd = (1.0 / Math.sqrt(headDim)).toFixed(10);
16
+ const invSqrtD = (1.0 / Math.sqrt(cfg.d_model)).toFixed(10);
17
+ const concatDim = cfg.ng_dim + cfg.d_model;
18
+ return /* wgsl */ `
19
+ struct Params {
20
+ batch_size: u32,
21
+ norm1_w: u32,
22
+ norm1_b: u32,
23
+ qkv_w: u32,
24
+ qkv_b: u32,
25
+ proj_w: u32,
26
+ proj_b: u32,
27
+ norm2_w: u32,
28
+ norm2_b: u32,
29
+ ff1_w: u32,
30
+ ff1_b: u32,
31
+ ff2_w: u32,
32
+ ff2_b: u32,
33
+ pad0: u32,
34
+ pad1: u32,
35
+ pad2: u32,
36
+ };
37
+
38
+ @group(0) @binding(0) var<uniform> params: Params;
39
+ @group(0) @binding(1) var<storage, read> weights: array<f32>;
40
+ @group(0) @binding(2) var<storage, read> inputs_int: array<u32>;
41
+ @group(0) @binding(3) var<storage, read> inputs_float: array<f32>;
42
+ @group(0) @binding(4) var<storage, read_write> workspace: array<f32>;
43
+ @group(0) @binding(5) var<storage, read_write> logits: array<f32>;
44
+
45
+ const N_BUCKETS: u32 = ${cfg.n_buckets}u;
46
+ const NG_DIM: u32 = ${cfg.ng_dim}u;
47
+ const TOK_DIM: u32 = ${cfg.tok_dim}u;
48
+ const D_MODEL: u32 = ${cfg.d_model}u;
49
+ const N_HEADS: u32 = ${cfg.n_heads}u;
50
+ const HEAD_DIM: u32 = ${headDim}u;
51
+ const FFN_DIM: u32 = ${cfg.ffn}u;
52
+ const HEAD_HIDDEN: u32 = ${cfg.head_hidden}u;
53
+ const N_LABELS: u32 = ${cfg.n_labels}u;
54
+ const MAX_TOKENS: u32 = ${cfg.max_tokens}u;
55
+ const MAX_FEATURES: u32 = ${cfg.max_features}u;
56
+ const CONCAT_DIM: u32 = ${concatDim}u;
57
+
58
+ const INV_SQRT_HD: f32 = ${invSqrtHd};
59
+ const INV_SQRT_D: f32 = ${invSqrtD};
60
+ const LN_EPS: f32 = 1e-5;
61
+
62
+ const IN_INT_STRIDE: u32 = ${IN_INT_STRIDE}u;
63
+ const IN_FLT_STRIDE: u32 = ${IN_FLT_STRIDE}u;
64
+ const WS_NG_OFF: u32 = ${WS_NG_OFF}u;
65
+ const WS_X_OFF: u32 = ${WS_X_OFF}u;
66
+ const WS_QKV_OFF: u32 = ${WS_QKV_OFF}u;
67
+ const WS_FF1_OFF: u32 = ${WS_FF1_OFF}u;
68
+ const WS_POOL_SCORE_OFF: u32 = ${WS_POOL_SCORE_OFF}u;
69
+ const WS_HEAD1_OFF: u32 = ${WS_HEAD1_OFF}u;
70
+ const WS_STRIDE: u32 = ${WS_STRIDE}u;
71
+
72
+ const OFF_POS_EMB: u32 = ${offsets.posEmb}u;
73
+ const OFF_POOL_Q: u32 = ${offsets.poolQ}u;
74
+ const OFF_TOK_EMB: u32 = ${offsets.tokEmbWeight}u;
75
+ const OFF_TOK_PROJ: u32 = ${offsets.tokProjWeight}u;
76
+ const OFF_NG_EMB: u32 = ${offsets.ngEmbWeight}u;
77
+ const OFF_NG_NORM_W: u32 = ${offsets.ngNormWeight}u;
78
+ const OFF_NG_NORM_B: u32 = ${offsets.ngNormBias}u;
79
+ const OFF_FINAL_NORM_W: u32 = ${offsets.finalNormWeight}u;
80
+ const OFF_FINAL_NORM_B: u32 = ${offsets.finalNormBias}u;
81
+ const OFF_POOL_PROJ_W: u32 = ${offsets.poolProjWeight}u;
82
+ const OFF_POOL_PROJ_B: u32 = ${offsets.poolProjBias}u;
83
+ const OFF_POOL_NORM_W: u32 = ${offsets.poolNormWeight}u;
84
+ const OFF_POOL_NORM_B: u32 = ${offsets.poolNormBias}u;
85
+ const OFF_HEAD1_W: u32 = ${offsets.head1Weight}u;
86
+ const OFF_HEAD1_B: u32 = ${offsets.head1Bias}u;
87
+ const OFF_HEAD2_W: u32 = ${offsets.head2Weight}u;
88
+ const OFF_HEAD2_B: u32 = ${offsets.head2Bias}u;
89
+
90
+ // Exact GELU with A&S 7.1.26 erf approximation matching tinyemo/runtime.py
91
+ fn gelu(x: f32) -> f32 {
92
+ let z = x * 0.7071067811865475;
93
+ let a = abs(z);
94
+ let t = 1.0 / (1.0 + 0.3275911 * a);
95
+ let poly = t * (0.254829592 + t * (-0.284496736 + t * (1.421413741 + t * (-1.453152027 + t * 1.061405429))));
96
+ let s = select(-1.0, 1.0, z >= 0.0);
97
+ let erf_val = select(s * (1.0 - poly * exp(-a * a)), 0.0, x == 0.0);
98
+ return 0.5 * x * (1.0 + erf_val);
99
+ }
100
+
101
+ var<workgroup> ng_shared: array<f32, 16>;
102
+ var<workgroup> ng_stats: array<f32, 2>;
103
+
104
+ @compute @workgroup_size(16, 1, 1)
105
+ fn kernel_ngram(
106
+ @builtin(workgroup_id) wg_id: vec3<u32>,
107
+ @builtin(local_invocation_id) local_id: vec3<u32>
108
+ ) {
109
+ let b = wg_id.x;
110
+ let d = local_id.x;
111
+ let int_base = b * IN_INT_STRIDE + 32u;
112
+ let flt_base = b * IN_FLT_STRIDE;
113
+
114
+ var acc: f32 = 0.0;
115
+ let total_hashes = MAX_FEATURES * 2u;
116
+ for (var i: u32 = 0u; i < total_hashes; i = i + 1u) {
117
+ let raw_bucket = inputs_int[int_base + i];
118
+ let sign_val = inputs_float[flt_base + i];
119
+ let bucket = raw_bucket & (N_BUCKETS - 1u);
120
+ acc = acc + weights[OFF_NG_EMB + bucket * NG_DIM + d] * sign_val;
121
+ }
122
+
123
+ let count = max(inputs_float[flt_base + total_hashes], 1.0);
124
+ let val = acc / count;
125
+ ng_shared[d] = val;
126
+ workgroupBarrier();
127
+
128
+ if (d == 0u) {
129
+ var sum_v: f32 = 0.0;
130
+ for (var j: u32 = 0u; j < NG_DIM; j = j + 1u) {
131
+ sum_v = sum_v + ng_shared[j];
132
+ }
133
+ let mean = sum_v / f32(NG_DIM);
134
+ var var_v: f32 = 0.0;
135
+ for (var j: u32 = 0u; j < NG_DIM; j = j + 1u) {
136
+ let diff = ng_shared[j] - mean;
137
+ var_v = var_v + diff * diff;
138
+ }
139
+ ng_stats[0] = mean;
140
+ ng_stats[1] = 1.0 / sqrt(var_v / f32(NG_DIM) + LN_EPS);
141
+ }
142
+ workgroupBarrier();
143
+
144
+ let norm_val = (val - ng_stats[0]) * ng_stats[1] * weights[OFF_NG_NORM_W + d] + weights[OFF_NG_NORM_B + d];
145
+ workspace[b * WS_STRIDE + WS_NG_OFF + d] = norm_val;
146
+ }
147
+
148
+ var<workgroup> tok_shared: array<f32, 48>;
149
+
150
+ @compute @workgroup_size(128, 1, 1)
151
+ fn kernel_tok_embed(
152
+ @builtin(workgroup_id) wg_id: vec3<u32>,
153
+ @builtin(local_invocation_id) local_id: vec3<u32>
154
+ ) {
155
+ let t = wg_id.x;
156
+ let b = wg_id.y;
157
+ let d = local_id.x;
158
+
159
+ let tok_id = inputs_int[b * IN_INT_STRIDE + t];
160
+ if (d < TOK_DIM) {
161
+ tok_shared[d] = weights[OFF_TOK_EMB + tok_id * TOK_DIM + d];
162
+ }
163
+ workgroupBarrier();
164
+
165
+ var acc: f32 = 0.0;
166
+ let w_row = OFF_TOK_PROJ + d * TOK_DIM;
167
+ for (var k: u32 = 0u; k < TOK_DIM; k = k + 1u) {
168
+ acc = acc + tok_shared[k] * weights[w_row + k];
169
+ }
170
+ acc = acc + weights[OFF_POS_EMB + t * D_MODEL + d];
171
+ workspace[b * WS_STRIDE + WS_X_OFF + t * D_MODEL + d] = acc;
172
+ }
173
+
174
+ var<workgroup> vec_shared: array<f32, 128>;
175
+ var<workgroup> norm_shared: array<f32, 128>;
176
+ var<workgroup> ln_stats: array<f32, 2>;
177
+
178
+ @compute @workgroup_size(128, 1, 1)
179
+ fn kernel_ln1_qkv(
180
+ @builtin(workgroup_id) wg_id: vec3<u32>,
181
+ @builtin(local_invocation_id) local_id: vec3<u32>
182
+ ) {
183
+ let t = wg_id.x;
184
+ let b = wg_id.y;
185
+ let d = local_id.x;
186
+
187
+ let x_val = workspace[b * WS_STRIDE + WS_X_OFF + t * D_MODEL + d];
188
+ vec_shared[d] = x_val;
189
+ workgroupBarrier();
190
+
191
+ if (d == 0u) {
192
+ var s: f32 = 0.0;
193
+ for (var i: u32 = 0u; i < D_MODEL; i = i + 1u) {
194
+ s = s + vec_shared[i];
195
+ }
196
+ let m = s / f32(D_MODEL);
197
+ var v: f32 = 0.0;
198
+ for (var i: u32 = 0u; i < D_MODEL; i = i + 1u) {
199
+ let diff = vec_shared[i] - m;
200
+ v = v + diff * diff;
201
+ }
202
+ ln_stats[0] = m;
203
+ ln_stats[1] = 1.0 / sqrt(v / f32(D_MODEL) + LN_EPS);
204
+ }
205
+ workgroupBarrier();
206
+
207
+ norm_shared[d] = (x_val - ln_stats[0]) * ln_stats[1] * weights[params.norm1_w + d] + weights[params.norm1_b + d];
208
+ workgroupBarrier();
209
+
210
+ let qkv_base = b * WS_STRIDE + WS_QKV_OFF + t * 3u * D_MODEL;
211
+ for (var part: u32 = 0u; part < 3u; part = part + 1u) {
212
+ let c = part * D_MODEL + d;
213
+ var acc: f32 = weights[params.qkv_b + c];
214
+ let w_row = params.qkv_w + c * D_MODEL;
215
+ for (var k: u32 = 0u; k < D_MODEL; k = k + 1u) {
216
+ acc = acc + norm_shared[k] * weights[w_row + k];
217
+ }
218
+ workspace[qkv_base + c] = acc;
219
+ }
220
+ }
221
+
222
+ var<workgroup> attn_scores: array<f32, 64>;
223
+ var<workgroup> attn_probs: array<f32, 64>;
224
+
225
+ @compute @workgroup_size(128, 1, 1)
226
+ fn kernel_attn_proj(
227
+ @builtin(workgroup_id) wg_id: vec3<u32>,
228
+ @builtin(local_invocation_id) local_id: vec3<u32>
229
+ ) {
230
+ let t_q = wg_id.x;
231
+ let b = wg_id.y;
232
+ let tid = local_id.x;
233
+
234
+ if (tid < N_HEADS * MAX_TOKENS) {
235
+ let head = tid / MAX_TOKENS;
236
+ let t_k = tid % MAX_TOKENS;
237
+ let mask = inputs_int[b * IN_INT_STRIDE + MAX_TOKENS + t_k];
238
+ if (mask == 0u) {
239
+ attn_scores[tid] = -1e9;
240
+ } else {
241
+ let q_off = b * WS_STRIDE + WS_QKV_OFF + t_q * 3u * D_MODEL + head * HEAD_DIM;
242
+ let k_off = b * WS_STRIDE + WS_QKV_OFF + t_k * 3u * D_MODEL + D_MODEL + head * HEAD_DIM;
243
+ var dot_val: f32 = 0.0;
244
+ for (var m: u32 = 0u; m < HEAD_DIM; m = m + 1u) {
245
+ dot_val = dot_val + workspace[q_off + m] * workspace[k_off + m];
246
+ }
247
+ attn_scores[tid] = dot_val * INV_SQRT_HD;
248
+ }
249
+ }
250
+ workgroupBarrier();
251
+
252
+ if (tid < N_HEADS) {
253
+ let base_idx = tid * MAX_TOKENS;
254
+ var max_s: f32 = attn_scores[base_idx];
255
+ for (var t_k: u32 = 1u; t_k < MAX_TOKENS; t_k = t_k + 1u) {
256
+ max_s = max(max_s, attn_scores[base_idx + t_k]);
257
+ }
258
+ var sum_e: f32 = 0.0;
259
+ for (var t_k: u32 = 0u; t_k < MAX_TOKENS; t_k = t_k + 1u) {
260
+ let e = exp(attn_scores[base_idx + t_k] - max_s);
261
+ attn_probs[base_idx + t_k] = e;
262
+ sum_e = sum_e + e;
263
+ }
264
+ for (var t_k: u32 = 0u; t_k < MAX_TOKENS; t_k = t_k + 1u) {
265
+ attn_probs[base_idx + t_k] = attn_probs[base_idx + t_k] / sum_e;
266
+ }
267
+ }
268
+ workgroupBarrier();
269
+
270
+ let head = tid / HEAD_DIM;
271
+ var o_val: f32 = 0.0;
272
+ for (var t_k: u32 = 0u; t_k < MAX_TOKENS; t_k = t_k + 1u) {
273
+ let v_val = workspace[b * WS_STRIDE + WS_QKV_OFF + t_k * 3u * D_MODEL + 2u * D_MODEL + tid];
274
+ o_val = o_val + attn_probs[head * MAX_TOKENS + t_k] * v_val;
275
+ }
276
+ vec_shared[tid] = o_val;
277
+ workgroupBarrier();
278
+
279
+ var proj_val: f32 = weights[params.proj_b + tid];
280
+ let w_row = params.proj_w + tid * D_MODEL;
281
+ for (var k: u32 = 0u; k < D_MODEL; k = k + 1u) {
282
+ proj_val = proj_val + vec_shared[k] * weights[w_row + k];
283
+ }
284
+ let x_idx = b * WS_STRIDE + WS_X_OFF + t_q * D_MODEL + tid;
285
+ workspace[x_idx] = workspace[x_idx] + proj_val;
286
+ }
287
+
288
+ @compute @workgroup_size(128, 1, 1)
289
+ fn kernel_ln2_ff1(
290
+ @builtin(workgroup_id) wg_id: vec3<u32>,
291
+ @builtin(local_invocation_id) local_id: vec3<u32>
292
+ ) {
293
+ let t = wg_id.x;
294
+ let b = wg_id.y;
295
+ let d = local_id.x;
296
+
297
+ let x_val = workspace[b * WS_STRIDE + WS_X_OFF + t * D_MODEL + d];
298
+ vec_shared[d] = x_val;
299
+ workgroupBarrier();
300
+
301
+ if (d == 0u) {
302
+ var s: f32 = 0.0;
303
+ for (var i: u32 = 0u; i < D_MODEL; i = i + 1u) {
304
+ s = s + vec_shared[i];
305
+ }
306
+ let m = s / f32(D_MODEL);
307
+ var v: f32 = 0.0;
308
+ for (var i: u32 = 0u; i < D_MODEL; i = i + 1u) {
309
+ let diff = vec_shared[i] - m;
310
+ v = v + diff * diff;
311
+ }
312
+ ln_stats[0] = m;
313
+ ln_stats[1] = 1.0 / sqrt(v / f32(D_MODEL) + LN_EPS);
314
+ }
315
+ workgroupBarrier();
316
+
317
+ norm_shared[d] = (x_val - ln_stats[0]) * ln_stats[1] * weights[params.norm2_w + d] + weights[params.norm2_b + d];
318
+ workgroupBarrier();
319
+
320
+ let ff1_base = b * WS_STRIDE + WS_FF1_OFF + t * FFN_DIM;
321
+ for (var part: u32 = 0u; part < 2u; part = part + 1u) {
322
+ let f = part * D_MODEL + d;
323
+ var acc: f32 = weights[params.ff1_b + f];
324
+ let w_row = params.ff1_w + f * D_MODEL;
325
+ for (var k: u32 = 0u; k < D_MODEL; k = k + 1u) {
326
+ acc = acc + norm_shared[k] * weights[w_row + k];
327
+ }
328
+ workspace[ff1_base + f] = gelu(acc);
329
+ }
330
+ }
331
+
332
+ var<workgroup> ff1_shared: array<f32, 256>;
333
+
334
+ @compute @workgroup_size(128, 1, 1)
335
+ fn kernel_ff2(
336
+ @builtin(workgroup_id) wg_id: vec3<u32>,
337
+ @builtin(local_invocation_id) local_id: vec3<u32>
338
+ ) {
339
+ let t = wg_id.x;
340
+ let b = wg_id.y;
341
+ let d = local_id.x;
342
+
343
+ let ff1_base = b * WS_STRIDE + WS_FF1_OFF + t * FFN_DIM;
344
+ ff1_shared[d] = workspace[ff1_base + d];
345
+ ff1_shared[d + D_MODEL] = workspace[ff1_base + d + D_MODEL];
346
+ workgroupBarrier();
347
+
348
+ var acc: f32 = weights[params.ff2_b + d];
349
+ let w_row = params.ff2_w + d * FFN_DIM;
350
+ for (var f: u32 = 0u; f < FFN_DIM; f = f + 1u) {
351
+ acc = acc + ff1_shared[f] * weights[w_row + f];
352
+ }
353
+ let x_idx = b * WS_STRIDE + WS_X_OFF + t * D_MODEL + d;
354
+ workspace[x_idx] = workspace[x_idx] + acc;
355
+ }
356
+
357
+ @compute @workgroup_size(128, 1, 1)
358
+ fn kernel_final_norm_pool_score(
359
+ @builtin(workgroup_id) wg_id: vec3<u32>,
360
+ @builtin(local_invocation_id) local_id: vec3<u32>
361
+ ) {
362
+ let t = wg_id.x;
363
+ let b = wg_id.y;
364
+ let d = local_id.x;
365
+
366
+ let x_idx = b * WS_STRIDE + WS_X_OFF + t * D_MODEL + d;
367
+ let x_val = workspace[x_idx];
368
+ vec_shared[d] = x_val;
369
+ workgroupBarrier();
370
+
371
+ if (d == 0u) {
372
+ var s: f32 = 0.0;
373
+ for (var i: u32 = 0u; i < D_MODEL; i = i + 1u) {
374
+ s = s + vec_shared[i];
375
+ }
376
+ let m = s / f32(D_MODEL);
377
+ var v: f32 = 0.0;
378
+ for (var i: u32 = 0u; i < D_MODEL; i = i + 1u) {
379
+ let diff = vec_shared[i] - m;
380
+ v = v + diff * diff;
381
+ }
382
+ ln_stats[0] = m;
383
+ ln_stats[1] = 1.0 / sqrt(v / f32(D_MODEL) + LN_EPS);
384
+ }
385
+ workgroupBarrier();
386
+
387
+ let x_norm = (x_val - ln_stats[0]) * ln_stats[1] * weights[OFF_FINAL_NORM_W + d] + weights[OFF_FINAL_NORM_B + d];
388
+ workspace[x_idx] = x_norm;
389
+ norm_shared[d] = tanh(clamp(x_norm, -15.0, 15.0));
390
+ workgroupBarrier();
391
+
392
+ var proj_d: f32 = weights[OFF_POOL_PROJ_B + d];
393
+ let w_row = OFF_POOL_PROJ_W + d * D_MODEL;
394
+ for (var k: u32 = 0u; k < D_MODEL; k = k + 1u) {
395
+ proj_d = proj_d + norm_shared[k] * weights[w_row + k];
396
+ }
397
+ vec_shared[d] = proj_d * weights[OFF_POOL_Q + d];
398
+ workgroupBarrier();
399
+
400
+ if (d == 0u) {
401
+ let mask = inputs_int[b * IN_INT_STRIDE + MAX_TOKENS + t];
402
+ if (mask == 0u) {
403
+ workspace[b * WS_STRIDE + WS_POOL_SCORE_OFF + t] = -1e9;
404
+ } else {
405
+ var dot_q: f32 = 0.0;
406
+ for (var i: u32 = 0u; i < D_MODEL; i = i + 1u) {
407
+ dot_q = dot_q + vec_shared[i];
408
+ }
409
+ workspace[b * WS_STRIDE + WS_POOL_SCORE_OFF + t] = dot_q * INV_SQRT_D;
410
+ }
411
+ }
412
+ }
413
+
414
+ var<workgroup> pool_probs: array<f32, 16>;
415
+ var<workgroup> z_shared: array<f32, 144>;
416
+
417
+ @compute @workgroup_size(128, 1, 1)
418
+ fn kernel_pool_and_head1(
419
+ @builtin(workgroup_id) wg_id: vec3<u32>,
420
+ @builtin(local_invocation_id) local_id: vec3<u32>
421
+ ) {
422
+ let b = wg_id.x;
423
+ let tid = local_id.x;
424
+
425
+ if (tid == 0u) {
426
+ let score_base = b * WS_STRIDE + WS_POOL_SCORE_OFF;
427
+ var max_s: f32 = workspace[score_base];
428
+ for (var t: u32 = 1u; t < MAX_TOKENS; t = t + 1u) {
429
+ max_s = max(max_s, workspace[score_base + t]);
430
+ }
431
+ var sum_e: f32 = 0.0;
432
+ for (var t: u32 = 0u; t < MAX_TOKENS; t = t + 1u) {
433
+ let e = exp(workspace[score_base + t] - max_s);
434
+ pool_probs[t] = e;
435
+ sum_e = sum_e + e;
436
+ }
437
+ for (var t: u32 = 0u; t < MAX_TOKENS; t = t + 1u) {
438
+ pool_probs[t] = pool_probs[t] / sum_e;
439
+ }
440
+ }
441
+ workgroupBarrier();
442
+
443
+ var pooled_raw: f32 = 0.0;
444
+ let x_base = b * WS_STRIDE + WS_X_OFF;
445
+ for (var t: u32 = 0u; t < MAX_TOKENS; t = t + 1u) {
446
+ pooled_raw = pooled_raw + pool_probs[t] * workspace[x_base + t * D_MODEL + tid];
447
+ }
448
+ vec_shared[tid] = pooled_raw;
449
+ workgroupBarrier();
450
+
451
+ if (tid == 0u) {
452
+ var s: f32 = 0.0;
453
+ for (var i: u32 = 0u; i < D_MODEL; i = i + 1u) {
454
+ s = s + vec_shared[i];
455
+ }
456
+ let m = s / f32(D_MODEL);
457
+ var v: f32 = 0.0;
458
+ for (var i: u32 = 0u; i < D_MODEL; i = i + 1u) {
459
+ let diff = vec_shared[i] - m;
460
+ v = v + diff * diff;
461
+ }
462
+ ln_stats[0] = m;
463
+ ln_stats[1] = 1.0 / sqrt(v / f32(D_MODEL) + LN_EPS);
464
+ }
465
+ workgroupBarrier();
466
+
467
+ if (tid < NG_DIM) {
468
+ z_shared[tid] = workspace[b * WS_STRIDE + WS_NG_OFF + tid];
469
+ }
470
+ z_shared[NG_DIM + tid] = (pooled_raw - ln_stats[0]) * ln_stats[1] * weights[OFF_POOL_NORM_W + tid] + weights[OFF_POOL_NORM_B + tid];
471
+ workgroupBarrier();
472
+
473
+ if (tid < HEAD_HIDDEN) {
474
+ var acc: f32 = weights[OFF_HEAD1_B + tid];
475
+ let w_row = OFF_HEAD1_W + tid * CONCAT_DIM;
476
+ for (var k: u32 = 0u; k < CONCAT_DIM; k = k + 1u) {
477
+ acc = acc + z_shared[k] * weights[w_row + k];
478
+ }
479
+ workspace[b * WS_STRIDE + WS_HEAD1_OFF + tid] = gelu(acc);
480
+ }
481
+ }
482
+
483
+ @compute @workgroup_size(128, 1, 1)
484
+ fn kernel_head2(
485
+ @builtin(workgroup_id) wg_id: vec3<u32>,
486
+ @builtin(local_invocation_id) local_id: vec3<u32>
487
+ ) {
488
+ let wg_x = wg_id.x;
489
+ let b = wg_id.y;
490
+ let tid = local_id.x;
491
+
492
+ if (tid < HEAD_HIDDEN) {
493
+ norm_shared[tid] = workspace[b * WS_STRIDE + WS_HEAD1_OFF + tid];
494
+ }
495
+ workgroupBarrier();
496
+
497
+ let label_idx = wg_x * 128u + tid;
498
+ if (label_idx < N_LABELS) {
499
+ var acc: f32 = weights[OFF_HEAD2_B + label_idx];
500
+ let w_row = OFF_HEAD2_W + label_idx * HEAD_HIDDEN;
501
+ for (var h: u32 = 0u; h < HEAD_HIDDEN; h = h + 1u) {
502
+ acc = acc + norm_shared[h] * weights[w_row + h];
503
+ }
504
+ logits[b * N_LABELS + label_idx] = acc;
505
+ }
506
+ }
507
+ `;
508
+ }
509
+ //# sourceMappingURL=shaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaders.js","sourceRoot":"","sources":["../src/shaders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Compact English-only unigram tokenizer ("ETK2") matching tinyemo/tiny_tokenizer.py.
3
+ *
4
+ * File layout: b"ETK2" | u16 n_pieces | n x ( u8 len | ascii bytes | i8 score*8 )
5
+ * Piece 0 is <unk>.
6
+ */
7
+ export declare class TinyTokenizer {
8
+ readonly pieces: string[];
9
+ readonly scores: Float64Array;
10
+ readonly index: Map<string, number>;
11
+ readonly unkId: number;
12
+ readonly maxLen: number;
13
+ constructor(data: Uint8Array | ArrayBuffer);
14
+ /**
15
+ * Serialize pieces and scores into an ETK2 binary buffer.
16
+ */
17
+ static dump(pieces: readonly string[], scores: readonly number[]): Uint8Array;
18
+ /**
19
+ * Encode already-normalized text using Viterbi dynamic programming.
20
+ */
21
+ encode(normText: string, maxTokens?: number): number[];
22
+ }
23
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAK;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE,UAAU,GAAG,WAAW;IAuC1C;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU;IA0B7E;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;CA+CvD"}