@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.
- package/README.md +44 -2
- package/dist/compression.d.ts +31 -0
- package/dist/compression.d.ts.map +1 -0
- package/dist/compression.js +78 -0
- package/dist/compression.js.map +1 -0
- package/dist/engine.d.ts +95 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +537 -0
- package/dist/engine.js.map +1 -0
- package/dist/features.d.ts +39 -0
- package/dist/features.d.ts.map +1 -0
- package/dist/features.js +89 -0
- package/dist/features.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/normalize.d.ts +19 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +41 -0
- package/dist/normalize.js.map +1 -0
- package/dist/packed-assets.d.ts +18 -0
- package/dist/packed-assets.d.ts.map +1 -0
- package/dist/packed-assets.js +30 -0
- package/dist/packed-assets.js.map +1 -0
- package/dist/shaders.d.ts +16 -0
- package/dist/shaders.d.ts.map +1 -0
- package/dist/shaders.js +509 -0
- package/dist/shaders.js.map +1 -0
- package/dist/tokenizer.d.ts +23 -0
- package/dist/tokenizer.d.ts.map +1 -0
- package/dist/tokenizer.js +123 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +114 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/weights.d.ts +70 -0
- package/dist/weights.d.ts.map +1 -0
- package/dist/weights.js +320 -0
- package/dist/weights.js.map +1 -0
- package/package.json +39 -4
|
@@ -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"}
|
package/dist/shaders.js
ADDED
|
@@ -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"}
|