@tryhamster/gerbil 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/{architectures-Ol7yUmKf.mjs → architectures-CpmH4Gha.mjs} +86 -82
  2. package/dist/architectures-CpmH4Gha.mjs.map +1 -0
  3. package/dist/browser/index.js.map +1 -1
  4. package/dist/cli.mjs +8 -8
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/frameworks/express.mjs +1 -1
  7. package/dist/frameworks/fastify.mjs +1 -1
  8. package/dist/frameworks/hono.mjs +1 -1
  9. package/dist/frameworks/next.d.mts +2 -2
  10. package/dist/frameworks/next.mjs +1 -1
  11. package/dist/frameworks/trpc.mjs +1 -1
  12. package/dist/{gerbil-_68_JSGV.d.mts → gerbil--YDNklsY.d.mts} +2 -2
  13. package/dist/{gerbil-_68_JSGV.d.mts.map → gerbil--YDNklsY.d.mts.map} +1 -1
  14. package/dist/{gerbil-DsgYlkgf.mjs → gerbil-BcBaLPai.mjs} +2 -2
  15. package/dist/{gerbil-DsgYlkgf.mjs.map → gerbil-BcBaLPai.mjs.map} +1 -1
  16. package/dist/gerbil-CTkp26G3.mjs +4 -0
  17. package/dist/gpu/hooks.d.mts +1 -1
  18. package/dist/gpu/index.d.mts +1 -1
  19. package/dist/gpu/index.mjs +3 -3
  20. package/dist/{gpu-DfUBMUGe.mjs → gpu-BZVtzX9N.mjs} +54 -9
  21. package/dist/gpu-BZVtzX9N.mjs.map +1 -0
  22. package/dist/{index-BdbeBDTz.d.mts → index-CZVIHkaH.d.mts} +23 -2
  23. package/dist/index-CZVIHkaH.d.mts.map +1 -0
  24. package/dist/index.d.mts +2 -2
  25. package/dist/index.mjs +5 -5
  26. package/dist/integrations/ai-sdk.mjs +1 -1
  27. package/dist/integrations/langchain.mjs +1 -1
  28. package/dist/integrations/llamaindex.mjs +1 -1
  29. package/dist/integrations/mcp.d.mts +2 -2
  30. package/dist/integrations/mcp.mjs +4 -4
  31. package/dist/{mcp-D3XRaVAc.mjs → mcp-LmQ6uqnx.mjs} +3 -3
  32. package/dist/{mcp-D3XRaVAc.mjs.map → mcp-LmQ6uqnx.mjs.map} +1 -1
  33. package/dist/{moonshine-stt-bExSnd2o.mjs → moonshine-stt-BFIm_Xxk.mjs} +891 -33
  34. package/dist/moonshine-stt-BFIm_Xxk.mjs.map +1 -0
  35. package/dist/moonshine-stt-D7BqG2pU.mjs +4 -0
  36. package/dist/{one-liner-UvMt5g0G.mjs → one-liner-BYVB7jU5.mjs} +2 -2
  37. package/dist/{one-liner-UvMt5g0G.mjs.map → one-liner-BYVB7jU5.mjs.map} +1 -1
  38. package/dist/repl-CYlW8byH.mjs +9 -0
  39. package/dist/skills/index.d.mts +4 -4
  40. package/dist/skills/index.mjs +3 -3
  41. package/dist/{skills-BJUofoaY.mjs → skills-DWMVEKKj.mjs} +2 -2
  42. package/dist/{skills-BJUofoaY.mjs.map → skills-DWMVEKKj.mjs.map} +1 -1
  43. package/package.json +1 -1
  44. package/dist/architectures-Ol7yUmKf.mjs.map +0 -1
  45. package/dist/gerbil-CNyb67ca.mjs +0 -4
  46. package/dist/gpu-DfUBMUGe.mjs.map +0 -1
  47. package/dist/index-BdbeBDTz.d.mts.map +0 -1
  48. package/dist/moonshine-stt-B0dwDCgT.mjs +0 -4
  49. package/dist/moonshine-stt-bExSnd2o.mjs.map +0 -1
  50. package/dist/repl-B5xHAr9n.mjs +0 -9
@@ -1,6 +1,6 @@
1
1
  import { i as resolveDefaultRepo, n as OUTETTS_ASSETS, r as OUTETTS_PRESET_VOICES, t as DEFAULT_MODELS } from "./defaults-KnrRSIeJ.mjs";
2
- import { E as GEMMA4_VIS_KEYS, S as DEFAULT_GROUP_SIZE, T as DTYPE_BYTES, _ as kaniCosTensor, c as KANI_END_OF_HUMAN, d as buildKaniLayerCosSin, f as computeKaniPositions, g as kaniAttentionLayerIndices, h as generateNanoCodecDecoderGraph, l as KANI_START_OF_HUMAN, m as generateKaniTtsGraph, u as audioTokensToCodes, v as kaniLayerAlpha, w as CANONICAL_KEYS, x as parseKaniConfig, y as kaniSinTensor } from "./architectures-Ol7yUmKf.mjs";
3
- import { S as verifyGPU, _ as createStorageBuffer, b as getOrCreatePipeline, c as quantizeBackboneInt4, f as Executor, g as createBindGroup, h as clearPipelineCache, i as loadModel, l as quantizeKaniBackbone, m as MATMUL_BIAS_F16C_SPEC, o as loadOuteTTS, p as KERNEL_REGISTRY, r as loadKaniTTS, s as loadParlerTTS, u as remapPrunedToken, v as createUniformBuffer, x as initGPU, y as destroyBuffers } from "./moonshine-stt-bExSnd2o.mjs";
2
+ import { E as GEMMA4_VIS_KEYS, S as DEFAULT_GROUP_SIZE, T as DTYPE_BYTES, _ as kaniCosTensor, c as KANI_END_OF_HUMAN, d as buildKaniLayerCosSin, f as computeKaniPositions, g as kaniAttentionLayerIndices, h as generateNanoCodecDecoderGraph, l as KANI_START_OF_HUMAN, m as generateKaniTtsGraph, u as audioTokensToCodes, v as kaniLayerAlpha, w as CANONICAL_KEYS, x as parseKaniConfig, y as kaniSinTensor } from "./architectures-CpmH4Gha.mjs";
3
+ import { S as verifyGPU, _ as createStorageBuffer, b as getOrCreatePipeline, c as quantizeBackboneInt4, f as Executor, g as createBindGroup, h as clearPipelineCache, i as loadModel, l as quantizeKaniBackbone, m as MATMUL_BIAS_F16C_SPEC, o as loadOuteTTS, p as KERNEL_REGISTRY, r as loadKaniTTS, s as loadParlerTTS, u as remapPrunedToken, v as createUniformBuffer, x as initGPU, y as destroyBuffers } from "./moonshine-stt-BFIm_Xxk.mjs";
4
4
 
5
5
  //#region src/gpu/architectures/gemma4_vision.ts
6
6
  /**
@@ -4424,11 +4424,24 @@ var VisionExecutor = class {
4424
4424
  q.writeBuffer(d.uniformBuffer, 0, params);
4425
4425
  sizes.push(d.spec.getDispatchSize(d.node, resolvedShapes, ctxRt));
4426
4426
  }
4427
- if (this.ctx.isWebKitWebGPU) {
4427
+ const multiEncoder = this.ctx.isWebKitWebGPU;
4428
+ const batchVit = globalThis.GERBIL_VIT_BATCH != null;
4429
+ let batchEnc = null;
4430
+ let batchPass = null;
4431
+ const flushBatch = async () => {
4432
+ if (!batchEnc || !batchPass) return;
4433
+ batchPass.end();
4434
+ q.submit([batchEnc.finish()]);
4435
+ await q.onSubmittedWorkDone();
4436
+ batchEnc = null;
4437
+ batchPass = null;
4438
+ };
4439
+ if (multiEncoder) {
4428
4440
  onStage?.("vit-encode-start", { total: this.dispatches.length });
4429
4441
  for (let i = 0; i < this.dispatches.length; i++) {
4430
4442
  const d = this.dispatches[i];
4431
4443
  if (d.node.opType === "Attention") {
4444
+ await flushBatch();
4432
4445
  const [gridX, gridY, gridZ] = sizes[i];
4433
4446
  const layer = Number.parseInt(d.node.id.replace(/\D+/g, ""), 10);
4434
4447
  if (!Number.isNaN(layer)) onStage?.("vit-attn", { layer });
@@ -4450,6 +4463,16 @@ var VisionExecutor = class {
4450
4463
  }
4451
4464
  continue;
4452
4465
  }
4466
+ if (batchVit) {
4467
+ if (!batchEnc) {
4468
+ batchEnc = this.ctx.device.createCommandEncoder();
4469
+ batchPass = batchEnc.beginComputePass();
4470
+ }
4471
+ batchPass.setPipeline(d.pipeline);
4472
+ batchPass.setBindGroup(0, d.bindGroup);
4473
+ batchPass.dispatchWorkgroups(...sizes[i]);
4474
+ continue;
4475
+ }
4453
4476
  const enc$1 = this.ctx.device.createCommandEncoder();
4454
4477
  const p = enc$1.beginComputePass();
4455
4478
  p.setPipeline(d.pipeline);
@@ -4459,6 +4482,7 @@ var VisionExecutor = class {
4459
4482
  q.submit([enc$1.finish()]);
4460
4483
  await q.onSubmittedWorkDone();
4461
4484
  }
4485
+ await flushBatch();
4462
4486
  onStage?.("vit-encode-done");
4463
4487
  } else {
4464
4488
  const enc$1 = this.ctx.device.createCommandEncoder({ label: "vision_encode" });
@@ -4634,8 +4658,24 @@ var VisionExecutor = class {
4634
4658
  return resolved;
4635
4659
  }
4636
4660
  allocateActivationBuffers() {
4661
+ const referenced = /* @__PURE__ */ new Set();
4662
+ for (const node of this.graph.nodes) {
4663
+ for (const t of node.inputs) referenced.add(t);
4664
+ for (const t of node.outputs) referenced.add(t);
4665
+ }
4666
+ let skippedBytes = 0;
4637
4667
  for (const [name, desc] of Object.entries(this.graph.tensors)) {
4638
4668
  if (desc.storage !== "activation") continue;
4669
+ if (!referenced.has(name)) {
4670
+ const shape = desc.shape.map((d) => {
4671
+ if (d === "N") return this.maxPatches;
4672
+ if (d === "Nm") return this.maxPatches / this.mergeUnit;
4673
+ if (d === "Np") return this.maxPooled();
4674
+ return d;
4675
+ });
4676
+ skippedBytes += shape.reduce((a, b) => a * b, 1) * DTYPE_BYTES[desc.dtype];
4677
+ continue;
4678
+ }
4639
4679
  const bytes = desc.shape.map((d) => {
4640
4680
  if (d === "N") return this.maxPatches;
4641
4681
  if (d === "Nm") return this.maxPatches / this.mergeUnit;
@@ -4644,6 +4684,7 @@ var VisionExecutor = class {
4644
4684
  }).reduce((a, b) => a * b, 1) * DTYPE_BYTES[desc.dtype];
4645
4685
  this.activationBuffers.set(name, createStorageBuffer(this.ctx, `vact_${name}`, bytes));
4646
4686
  }
4687
+ if (skippedBytes > 0) console.log(`[vision] skipped ${(skippedBytes / 1e6).toFixed(0)} MB of unreferenced activation tensors`);
4647
4688
  }
4648
4689
  gatherBuffers(spec, node, uniformBuffer) {
4649
4690
  const entries = [];
@@ -5324,12 +5365,16 @@ function writeGroupProbe(rec) {
5324
5365
  } catch {}
5325
5366
  }
5326
5367
  /**
5327
- * The validated non-phone sweet spot. iPad swept 1→7.9, 8→19, 32→24.8, 64→26.6,
5328
- * 128→26.9 (peak), 256→26.2 tok/s a plateau from ~64 up, so 128 is the best
5329
- * stable target (more batching just costs memory). Non-phone WebKit jumps here
5330
- * directly; the crash breadcrumb caps it down if a device can't sustain it.
5368
+ * The validated batching target. Originally 128 from an iPad sweep on a much
5369
+ * slower engine build (peak 26.9 tok/s at 128, 256 within 2.6%); the 2026-07
5370
+ * kernel campaign made per-dispatch GPU time far smaller, which moves the
5371
+ * amortization optimum UP. An on-device iPhone sweep (bench harness, engine
5372
+ * 1.6.1) measured Qwen3.5-0.8B sampled decode: g32=19, g128≈33, g256=43,
5373
+ * g1024=45, g4096=44 — a +36% win at 1024 vs the old 128 target — while
5374
+ * LFM2.5 is flat from g32 upward (no cost). The crash breadcrumb still caps
5375
+ * any device that can't sustain it.
5331
5376
  */
5332
- const NONPHONE_TARGET_GROUP = 128;
5377
+ const NONPHONE_TARGET_GROUP = 1024;
5333
5378
  /**
5334
5379
  * Resolve the WebKit group size to use this session, recording `trying` as a
5335
5380
  * side effect so a crash this load is detectable on the next load.
@@ -7031,4 +7076,4 @@ var WebGPUEngine = class WebGPUEngine {
7031
7076
 
7032
7077
  //#endregion
7033
7078
  export { dequantizeGemma4VisionProjection as A, audioTokensToDacCodes as C, parseOuteTtsConfig as D, generateOuteTtsBackboneGraph as E, generateGemma4VisionGraph as M, patchGemma4VisionClips as N, KaniTTS as O, resolveGemma4VisionInfo as P, loadOuteSpeaker as S, generateDacSpeechDecoderGraph as T, smartResize as _, buildGemma4PosEmbeds as a, OuteTTS as b, buildMRoPECosSin as c, buildPositionIds as d, buildRotaryCosSin as f, preprocessImageGemma4 as g, preprocessImage as h, buildGemma4PoolMatrix as i, dequantizeMLXProjection as j, generateQwen3_5VisionGraph as k, buildMRoPEPositionIds as l, mropeFreqDims as m, GEMMA4_IMAGE_PROCESSOR as n, buildGemma4RotaryCosSin as o, buildVisionPositionTensors as p, QWEN3_5_IMAGE_PROCESSOR as r, buildGemma4VisionPositionTensors as s, WebGPUEngine as t, buildPosEmbeds as u, VisionExecutor as v, dacOutputLength as w, buildOutePromptString as x, ParlerTTS as y };
7034
- //# sourceMappingURL=gpu-DfUBMUGe.mjs.map
7079
+ //# sourceMappingURL=gpu-BZVtzX9N.mjs.map