Fix output text not working.
This commit is contained in:
@@ -325,3 +325,34 @@ on both engines. Three independent causes, all length-dependent:
|
|||||||
**Revisit:** when Transformers.js changes the seek-loop condition (currently
|
**Revisit:** when Transformers.js changes the seek-loop condition (currently
|
||||||
`return_timestamps && !max_new_tokens`, `src/models/whisper/modeling_whisper.js`),
|
`return_timestamps && !max_new_tokens`, `src/models/whisper/modeling_whisper.js`),
|
||||||
retest whether the explicit `max_new_tokens` is still needed.
|
retest whether the explicit `max_new_tokens` is still needed.
|
||||||
|
|
||||||
|
## D-022 — Medium models never default to fp16 in the browser
|
||||||
|
**Status:** Accepted (2026-07-15)
|
||||||
|
Reported symptom: transcribing `en_aiproblem` in-browser with Whisper Medium
|
||||||
|
printed just "the". The medium catalog entries defaulted to fp16 on WebNN
|
||||||
|
(whole model) and WebGPU (encoder) — and D-017's "auto" order now tries WebNN
|
||||||
|
first, so browsers exposing `navigator.ml` silently moved medium onto fp16.
|
||||||
|
Two problems with those fp16 conversions
|
||||||
|
(`onnx-community/whisper-medium(.en_timestamped|-ONNX)`):
|
||||||
|
1. The fp16 ONNX files crash onnxruntime's graph optimizer at session
|
||||||
|
creation (`SimplifiedLayerNormFusion` fails on their
|
||||||
|
`InsertedPrecisionFreeCast_*` nodes) — reproduced on both onnxruntime-node
|
||||||
|
and onnxruntime-web 1.26.0-dev (wasm EP). EPs whose optimizer pipeline
|
||||||
|
skips that fusion can load the model and hit problem 2 instead.
|
||||||
|
2. Whisper medium/large encoder activations are the classic fp16 overflow
|
||||||
|
case — degenerate output with no error raised.
|
||||||
|
Meanwhile q4 medium was verified correct end-to-end on the real browser
|
||||||
|
runtime (onnxruntime-web wasm EP driven under Bun via the
|
||||||
|
`Symbol.for("onnxruntime")` override, `graphOptimizationLevel: "basic"` as in
|
||||||
|
D-014, `max_new_tokens: 440` as in D-021; both the `.en` and multilingual
|
||||||
|
conversions, auto language detect included). **Fix:** medium's `webgpu` and
|
||||||
|
`webnn` defaults are q4 (`ACCEL_Q4` in `src/lib/models.ts`). A backend that
|
||||||
|
cannot execute q4 (`MatMulNBits`) throws at pipeline creation and falls down
|
||||||
|
the D-017 device chain — strictly better than silently emitting garbage.
|
||||||
|
**Scope:** medium only — that's where load-failure evidence exists.
|
||||||
|
tiny/base/small keep fp16 on WebNN and small keeps fp16+q4 on WebGPU;
|
||||||
|
large-v3-turbo keeps fp16+q4 on WebGPU (the widely-used Transformers.js demo
|
||||||
|
configuration). If a one-word/garbage transcript ever shows up on those, suspect
|
||||||
|
their fp16 encoders and extend this decision.
|
||||||
|
**Revisit:** if the onnx-community medium conversions are re-exported with
|
||||||
|
working fp16 files, or once WebNN/WebGPU runs can be exercised in CI.
|
||||||
|
|||||||
+19
-2
@@ -128,6 +128,23 @@ const WEBNN_FP16: DtypeDefault = {
|
|||||||
note: "fp16 is commonly used with WebNN.",
|
note: "fp16 is commonly used with WebNN.",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The medium fp16 conversions are unusable (D-022, verified 2026-07-15): the
|
||||||
|
* ONNX files crash onnxruntime's graph optimizer (SimplifiedLayerNormFusion
|
||||||
|
* chokes on their InsertedPrecisionFreeCast nodes — reproduced on both
|
||||||
|
* ort-node and ort-web 1.26.0-dev), and Whisper medium/large encoder
|
||||||
|
* activations are the classic fp16 overflow case besides. In the browser the
|
||||||
|
* symptom was a degenerate one-word transcript with no error. q4 is verified
|
||||||
|
* correct for medium on the WASM runtime; a backend that cannot run it
|
||||||
|
* throws at session creation and falls down the D-017 device chain instead
|
||||||
|
* of silently producing garbage.
|
||||||
|
*/
|
||||||
|
const ACCEL_Q4: DtypeDefault = {
|
||||||
|
dtype: "q4",
|
||||||
|
verified: false,
|
||||||
|
note: "q4: the medium fp16 conversions fail to load / overflow (D-022).",
|
||||||
|
};
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// The catalog (D-006: curated, not exhaustive)
|
// The catalog (D-006: curated, not exhaustive)
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -203,7 +220,7 @@ export const MODELS: readonly WhisperModel[] = [
|
|||||||
multilingual: false,
|
multilingual: false,
|
||||||
encoderParamsM: 306,
|
encoderParamsM: 306,
|
||||||
decoderParamsM: 463,
|
decoderParamsM: 463,
|
||||||
defaults: { wasm: WASM_Q4, webgpu: WEBGPU_FP16_Q4, webnn: WEBNN_FP16 },
|
defaults: { wasm: WASM_Q4, webgpu: ACCEL_Q4, webnn: ACCEL_Q4 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "onnx-community/whisper-medium-ONNX",
|
id: "onnx-community/whisper-medium-ONNX",
|
||||||
@@ -212,7 +229,7 @@ export const MODELS: readonly WhisperModel[] = [
|
|||||||
multilingual: true,
|
multilingual: true,
|
||||||
encoderParamsM: 306,
|
encoderParamsM: 306,
|
||||||
decoderParamsM: 463,
|
decoderParamsM: 463,
|
||||||
defaults: { wasm: WASM_Q4, webgpu: WEBGPU_FP16_Q4, webnn: WEBNN_FP16 },
|
defaults: { wasm: WASM_Q4, webgpu: ACCEL_Q4, webnn: ACCEL_Q4 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "onnx-community/whisper-large-v3-turbo",
|
id: "onnx-community/whisper-large-v3-turbo",
|
||||||
|
|||||||
@@ -107,6 +107,17 @@ describe("resolveDefaultDtype", () => {
|
|||||||
).toEqual({ encoder_model: "fp16", decoder_model_merged: "q4" });
|
).toEqual({ encoder_model: "fp16", decoder_model_merged: "q4" });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("medium never defaults to fp16 on any backend (D-022: broken conversions)", () => {
|
||||||
|
for (const id of [
|
||||||
|
"onnx-community/whisper-medium.en_timestamped",
|
||||||
|
"onnx-community/whisper-medium-ONNX",
|
||||||
|
]) {
|
||||||
|
for (const device of ["wasm", "webgpu", "webnn"] as const) {
|
||||||
|
expect(resolveDefaultDtype(id, device)).toBe("q4");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
test("unknown model ids fall back to q8", () => {
|
test("unknown model ids fall back to q8", () => {
|
||||||
expect(resolveDefaultDtype("someone/some-model", "wasm")).toBe("q8");
|
expect(resolveDefaultDtype("someone/some-model", "wasm")).toBe("q8");
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user