Audit S24 vocoder routes and Spark restart; prepare pinned S25 export

This commit is contained in:
tzhouam committed 2026-09-24 14:27:11 +08:00
1 parent 68e0fd7cad
commit 203039e054
59 files changed
+18865 -30

No files matched your search

@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Audit a two-frame Code2Wav S25 candidate against its local CPU export."""
"""Audit a fixed-window Code2Wav candidate against its local CPU export."""
from __future__ import annotations
@@ -18,13 +18,13 @@ def sha256(path: Path) -> str:
return hashlib.file_digest(stream, "sha256").hexdigest()
def waveform(path: Path, name: str) -> np.ndarray:
def waveform(path: Path, name: str, expected_shape: tuple[int, int]) -> np.ndarray:
with np.load(path, allow_pickle=False) as data:
if data.files != [name]:
raise ValueError(f"{path}: expected one output named {name}")
value = np.asarray(data[name])
if value.shape != (1, 3840) or value.dtype != np.float32 or not np.isfinite(value).all():
raise ValueError(f"{path}: expected finite float32[1,3840], got {value.shape}/{value.dtype}")
if value.shape != expected_shape or value.dtype != np.float32 or not np.isfinite(value).all():
raise ValueError(f"{path}: expected finite float32{expected_shape}, got {value.shape}/{value.dtype}")
return value
@@ -50,6 +50,7 @@ def main() -> None:
"device-output", "output-report"):
parser.add_argument(f"--{name}", type=Path, required=True)
parser.add_argument("--profile-report", type=Path)
parser.add_argument("--expected-device", default="Samsung Galaxy S25")
parser.add_argument("--expected-compile-options", default="--target_runtime qnn_dlc --qnn_options default_graph_htp_precision=FLOAT16")
parser.add_argument("--expected-run-options", default="--compute_unit npu")
args = parser.parse_args()
@@ -59,15 +60,17 @@ def main() -> None:
compile_job = json.loads(args.compile_report.read_text())
inference = json.loads(args.inference_report.read_text())
profile = json.loads(args.profile_report.read_text()) if args.profile_report else None
if export["context_frames"] != 72 or export["chunk_frames"] != 2:
raise ValueError("export differs from the tested two-frame window")
if (export["context_frames"] != 72 or not 1 <= export["chunk_frames"] <= 25
or export["input_shape"] != [1, 512, 72 + export["chunk_frames"]]
or export["output_shape"] != [1, 1920 * export["chunk_frames"]]):
raise ValueError("export differs from the tested fixed-window contract")
if (upload["source_sha256"] != export["onnx_sha256"]
or compile_job["source_model_id"] != upload["source_model_id"]
or compile_job["status"] != "SUCCESS"
or compile_job["options"] != args.expected_compile_options):
raise ValueError("compile does not use the verified short-window artifact")
if (dataset["fixture_sha256"] != export["short_fixture_sha256"]
or dataset["input_shape"] != [1, 512, 74]
or dataset["input_shape"] != export["input_shape"]
or dataset["sample_count"] != 1
or sha256(args.fixture) != dataset["fixture_sha256"]):
raise ValueError("hosted input is not the retained short-window fixture")
@@ -76,17 +79,21 @@ def main() -> None:
or inference["input_dataset_id"] != dataset["dataset_id"]
or inference["options"] != args.expected_run_options
or inference["device"] != compile_job["device"]
or inference["device"]["name"] != "Samsung Galaxy S25"):
raise ValueError("inference differs from the exact S25 target/fixture/route")
or inference["device"]["name"] != args.expected_device):
raise ValueError("inference differs from the exact target/fixture/route")
if (sha256(args.cpu_output) != export["ort_output_sha256"]
or sha256(args.eager_output) != export["eager_output_sha256"]):
raise ValueError("local CPU outputs differ from export parity evidence")
cpu = waveform(args.cpu_output, "wav")
eager = waveform(args.eager_output, "wav")
hosted = waveform(args.device_output, "output_0__0")
expected_shape = tuple(export["output_shape"])
cpu = waveform(args.cpu_output, "wav", expected_shape)
eager = waveform(args.eager_output, "wav", expected_shape)
hosted = waveform(args.device_output, "output_0__0", expected_shape)
cpu_comparison = compare(cpu, hosted)
gross_numeric_failure = (cpu_comparison["relative_l2"] >= 1.0
or cpu_comparison["output_saturated_fraction_abs_ge_0_999"] >= 0.1)
report = {
"scope": "one two-frame Qwen3-TTS vocoder component on hosted S25; no complete stream",
"status": "component_inference_numeric_measured",
"scope": f"one {export['chunk_frames']}-frame Qwen3-TTS vocoder component on hosted {args.expected_device}; no complete stream",
"status": "component_gross_numeric_failure" if gross_numeric_failure else "component_inference_numeric_measured",
"device": inference["device"],
"source_model_id": compile_job["source_model_id"],
"target_model_id": compile_job["target_model_id"],
@@ -97,10 +104,14 @@ def main() -> None:
for name, path in {"fixture": args.fixture, "ort_cpu": args.cpu_output,
"eager_cpu": args.eager_output,
"device_output": args.device_output}.items()},
"ort_cpu_vs_device": compare(cpu, hosted),
"ort_cpu_vs_device": cpu_comparison,
"eager_cpu_vs_device": compare(eager, hosted),
"gross_numeric_failure_screen": {
"failed": gross_numeric_failure,
"criteria": "relative L2 >= 1.0 or fraction |sample| >= 0.999 at least 0.1; this is not a speech-quality acceptance threshold",
},
"limits": [
"One fixed two-frame waveform has no listening-quality tolerance.",
"One fixed-window waveform has no listening-quality tolerance.",
"The 72-frame input history, talker, predictor and stage handoff did not run on the device.",
"No persistent state, admission, cancellation or complete TTS stream was tested.",
],
@@ -110,7 +121,7 @@ def main() -> None:
or profile["model_id"] != inference["model_id"]
or profile["device"] != inference["device"]
or profile["options"] != inference["options"]
or profile["shapes"] != {"quantized": [[1, 512, 74], "float32"]}):
or profile["shapes"] != {"quantized": [export["input_shape"], "float32"]}):
raise ValueError("placement profile did not use the audited device/artifact")
execution = profile["profile"]
samples = execution["execution_summary"]["all_inference_times"]
@@ -130,7 +141,8 @@ def main() -> None:
"compute_unit_row_counts": dict(units),
"profile_input": "Workbench generated input with audited tensor shape; the waveform inference used the retained fixture",
}
report["status"] = "component_inference_numeric_and_placement_measured"
report["status"] = ("component_gross_numeric_failure_with_placement_profile"
if gross_numeric_failure else "component_inference_numeric_and_placement_measured")
else:
report["limits"].append("Requested accelerator execution is not verified node placement without a profile.")
args.output_report.write_text(json.dumps(report, indent=2) + "\n")
@@ -93,6 +93,8 @@ def main() -> None:
raise RuntimeError("job did not use the exact requested device")
if inference.get("options") != args.run_options or (profile is not None and profile.get("options") != args.run_options):
raise RuntimeError("inference/profile requested different compute options")
if profile is not None and profile.get("shapes") != {"quantized": [[1, 512, 97], "float32"]}:
raise RuntimeError("profile did not use the pinned 97-frame input contract")
files = {
name: {"bytes": path.stat().st_size, "sha256": sha256(path)}
for name, path in {
@@ -116,6 +118,7 @@ def main() -> None:
cpu = read_output(args.cpu_output, "wav")
s25 = read_output(args.s25_output, "output_0__0")
output = read_output(args.device_output, "output_0__0")
same_s25_output = args.s25_output.resolve() == args.device_output.resolve()
report = {
"scope": "one Qwen3-TTS code2wav 48,000-sample component on one retained fixture; no complete TTS stream",
"status": "component_executed_quality_unqualified" if profile is not None else "component_inference_numeric_measured",
@@ -128,7 +131,9 @@ def main() -> None:
"requested_run_options": args.run_options,
"files": files,
"cpu_source_vs_device": compare(cpu, output),
"s25_gpu_vs_device": compare(s25, output),
"s25_gpu_vs_device": None if same_s25_output else compare(s25, output),
"s25_comparison_note": ("same retained S25 output; no independent device comparison"
if same_s25_output else "independent hosted output comparison"),
"limits": [
"Historical source export does not attest its exact checkpoint revision.",
"This fixed component waveform has no listening or task-quality tolerance.",
@@ -152,6 +157,7 @@ def main() -> None:
"reported_estimated_inference_time_us": execution["execution_summary"]["estimated_inference_time"],
"reported_peak_memory_bytes": execution["execution_summary"]["estimated_inference_peak_memory"],
"compute_unit_row_counts": dict(units),
"profile_input": "Workbench generated input with pinned tensor shape; waveform inference used the retained fixture",
}
else:
report["limits"].append("Requested compute unit is not verified node placement without a device profile.")
@@ -1,9 +1,9 @@
#!/usr/bin/env python3
"""Export and numerically gate a shorter Qwen3-TTS Code2Wav window.
"""Export and numerically gate a fixed Qwen3-TTS Code2Wav window.
The retained 25-frame graph takes 72 context frames plus 25 new frames. This
experiment keeps the same decoder and 72-frame history while reducing the new
chunk to two frames, before any device compilation or performance claim.
The retained reference graph takes 72 context frames plus 25 new frames.
This experiment keeps the same decoder and 72-frame history while selecting
1-25 new frames, before any device compilation or performance claim.
"""
from __future__ import annotations
@@ -0,0 +1,71 @@
#!/usr/bin/env python3
"""Compare a pinned eager 25-frame Code2Wav decoder with retained ONNX CPU."""
from __future__ import annotations
import argparse
import hashlib
import json
from pathlib import Path
import numpy as np
import torch
from benchmarks.edge_harness.experiments.export_qwen_tts_vocoder_short_chunk import (
QuantizedWindowDecoder,
compare,
sha256,
)
from vllm_omni.edge.decoder_export import load_code2wav_decoder
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
for name in ("checkpoint", "source-onnx", "fixture", "ort-output", "manifest", "report"):
parser.add_argument(f"--{name}", type=Path, required=True)
args = parser.parse_args()
manifest = json.loads(args.manifest.read_text())
for key, path in (("vocoder_source_onnx", args.source_onnx),
("vocoder_fixture", args.fixture),
("vocoder_ort_cpu_output", args.ort_output)):
if sha256(path) != manifest["files"][key]["sha256"]:
raise ValueError(f"{key} differs from the retained historical artifact")
with np.load(args.fixture, allow_pickle=False) as data:
if data.files != ["quantized"]:
raise ValueError("unexpected fixture schema")
quantized = np.asarray(data["quantized"])
with np.load(args.ort_output, allow_pickle=False) as data:
if data.files != ["wav"]:
raise ValueError("unexpected output schema")
reference = np.asarray(data["wav"])
if (quantized.shape != (1, 512, 97) or quantized.dtype != np.float32
or reference.shape != (1, 48000) or reference.dtype != np.float32):
raise ValueError("historical tensor contract changed")
torch.set_num_threads(4)
decoder = QuantizedWindowDecoder(load_code2wav_decoder(str(args.checkpoint)), 25).eval()
with torch.inference_mode():
eager = decoder(torch.from_numpy(quantized)).detach().numpy()
if eager.shape != reference.shape or not np.isfinite(eager).all():
raise ValueError("eager output violates finite 48,000-sample contract")
report = {
"scope": "one synthetic 25-frame Code2Wav waveform parity check; no device stream",
"pinned_checkpoint_revision": args.checkpoint.resolve().name,
"pinned_decoder_weight_sha256": sha256(args.checkpoint / "speech_tokenizer" / "model.safetensors"),
"source_onnx_sha256": sha256(args.source_onnx),
"fixture_sha256": sha256(args.fixture),
"ort_output_sha256": sha256(args.ort_output),
"eager_output_bytes_sha256": hashlib.sha256(eager.tobytes()).hexdigest(),
"torch_version": torch.__version__,
"eager_vs_historical_onnx_cpu": compare(reference, eager),
"limits": [
"Numerical agreement on one fixture cannot prove the historical ONNX export's exact checkpoint revision.",
"One synthetic latent window cannot establish listening quality or multi-chunk history.",
],
}
args.report.parent.mkdir(parents=True, exist_ok=True)
args.report.write_text(json.dumps(report, indent=2) + "\n")
print(json.dumps(report["eager_vs_historical_onnx_cpu"], indent=2))
if __name__ == "__main__":
main()
@@ -0,0 +1,92 @@
#!/usr/bin/env python3
"""Check whether shorter Code2Wav history preserves a pinned two-frame output.
This is a one-fixture numerical screen for smaller target graphs, not an audio
quality or device-performance result.
"""
from __future__ import annotations
import argparse
import json
from pathlib import Path
import numpy as np
import torch
from benchmarks.edge_harness.experiments.export_qwen_tts_vocoder_short_chunk import (
QuantizedWindowDecoder,
compare,
sha256,
)
from vllm_omni.edge.decoder_export import load_code2wav_decoder
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--model", type=Path, required=True)
parser.add_argument("--source-fixture", type=Path, required=True)
parser.add_argument("--long-reference", type=Path, required=True)
parser.add_argument("--export-report", type=Path, required=True)
parser.add_argument("--report", type=Path, required=True)
args = parser.parse_args()
export = json.loads(args.export_report.read_text())
if (sha256(args.source_fixture) != export["source_fixture_sha256"]
or sha256(args.long_reference) != export["long_cpu_reference_sha256"]
or sha256(args.model / "speech_tokenizer" / "model.safetensors")
!= export["model_weight_sha256"]):
raise ValueError("fixture, reference or checkpoint differs from the export")
with np.load(args.source_fixture, allow_pickle=False) as data:
if data.files != ["quantized"]:
raise ValueError("unexpected fixture schema")
full_input = np.asarray(data["quantized"])
with np.load(args.long_reference, allow_pickle=False) as data:
if data.files != ["wav"]:
raise ValueError("unexpected reference schema")
long_output = np.asarray(data["wav"])
if (full_input.shape != (1, 512, 97) or full_input.dtype != np.float32
or long_output.shape != (1, 48000)):
raise ValueError("reference tensor shape changed")
torch.set_num_threads(4)
model = QuantizedWindowDecoder(load_code2wav_decoder(str(args.model)), 2).eval()
reference = long_output[:, :3840]
rows = []
baseline = None
for history in (72, 64, 48, 32, 24, 16, 8):
window = np.ascontiguousarray(full_input[:, :, 72 - history:74])
with torch.inference_mode():
output = model(torch.from_numpy(window)).detach().numpy()
if output.shape != (1, 3840) or not np.isfinite(output).all():
raise ValueError(f"{history}-frame history violated waveform contract")
if baseline is None:
baseline = output
rows.append({
"history_frames": history,
"input_shape": list(window.shape),
"vs_72_history": compare(baseline, output),
"vs_25_frame_reference_prefix": compare(reference, output),
})
report = {
"scope": "one synthetic two-frame Code2Wav window; local CPU numerical screen only",
"checkpoint_revision": export["model_snapshot_revision"],
"checkpoint_weight_sha256": export["model_weight_sha256"],
"source_fixture_sha256": export["source_fixture_sha256"],
"long_reference_sha256": export["long_cpu_reference_sha256"],
"torch_version": torch.__version__,
"rows": rows,
"limits": [
"One synthetic first window cannot establish multi-chunk history or speech quality.",
"No smaller-history graph was exported, compiled or executed on a device.",
"CPU forward timing was not measured as a performance profile.",
],
}
args.report.parent.mkdir(parents=True, exist_ok=True)
args.report.write_text(json.dumps(report, indent=2) + "\n")
print(json.dumps([{"history_frames": x["history_frames"],
"relative_l2": x["vs_72_history"]["relative_l2"]}
for x in rows], indent=2))
if __name__ == "__main__":
main()
@@ -0,0 +1,137 @@
#!/usr/bin/env python3
"""Verify Spark BF16 can generate again after an in-flight Omni cancellation."""
from __future__ import annotations
import argparse
import asyncio
import hashlib
import json
from pathlib import Path
from vllm_omni.edge.local.engine import LocalTextEngine
from vllm_omni.edge.local.manifest import runtime_versions
from vllm_omni.edge.local.plan import plan_text_session
from vllm_omni.edge.local.prompts import acceptance_prompts
def token_digest(ids: list[int]) -> str:
return hashlib.sha256(json.dumps(ids).encode()).hexdigest()
async def run(model: Path) -> dict:
plan = plan_text_session(
str(model), max_model_len=4096, max_num_seqs=1,
max_num_batched_tokens=2048, enforce_eager=True,
)
if not plan.admitted or plan.selected is None or plan.selected.device_id != "cpu":
raise RuntimeError("pinned BF16 CPU plan was not admitted")
name, prompt = acceptance_prompts()[0]
requests = []
async with LocalTextEngine(plan) as engine:
session = engine.open_session()
async def generate(label: str, active_session: object) -> list[int]:
rid, stream = await engine.submit(
active_session, prompt, max_tokens=128, temperature=0.0, ignore_eos=True,
)
async for _ in stream:
pass
record = engine.records[rid]
if record.error or record.cancelled or not record.finished or record.output_tokens != 128:
raise RuntimeError(f"{label} did not finish the specified text workload")
ids = list(record.output_token_ids)
requests.append({"label": label, "request_id": rid,
"session_id": active_session.session_id,
"epoch": record.epoch, "output_tokens": len(ids),
"token_ids_sha256": token_digest(ids),
"ttft_s": record.ttft_s,
"stream": stream.stats()})
return ids
baseline = await generate("before_cancel", session)
rid, stream = await engine.submit(
session, prompt, max_tokens=4096, temperature=0.0, ignore_eos=True,
)
token_events = 0
async for event in stream:
if event.kind == "token":
token_events += 1
if token_events >= 8:
break
cancel = await engine.cancel(rid)
late_events = []
while True:
try:
event = await asyncio.wait_for(stream.get(), timeout=1.0)
except asyncio.TimeoutError:
break
if event is None:
break
late_events.append(event.to_dict())
cancel["token_events_before_cancel"] = token_events
cancel["late_events"] = late_events
try:
stale_rid, _ = await engine.submit(
session, prompt, max_tokens=128, temperature=0.0, ignore_eos=True,
)
except RuntimeError as exc:
stale_error = str(exc)
stale_rejected = "stale" in stale_error and "open a new session" in stale_error
else:
await engine.cancel(stale_rid)
stale_error = "old session was unexpectedly accepted"
stale_rejected = False
engine.close_session(session.session_id)
fresh_session = engine.open_session()
new_session = await generate("new_session_after_cancel", fresh_session)
engine.close_session(fresh_session.session_id)
placement = engine.report_placement()
usage = engine.report_usage()
load_s = engine.load_seconds
passed = (bool(cancel.get("aborted_in_backend"))
and cancel.get("inflight_after") == 0
and not late_events
and stale_rejected
and baseline == new_session)
return {
"scope": "Spark 1.7B BF16 128-token WSL CPU text restart after cancellation",
"status": "restart_after_cancel_pass" if passed else "restart_after_cancel_fail",
"prompt_name": name,
"runtime": runtime_versions().to_dict(),
"plan": plan.to_dict(),
"placement": placement,
"usage": usage,
"load_s_not_request_timing": load_s,
"requests": requests,
"cancel": cancel,
"stale_handle_rejected": stale_rejected,
"stale_handle_error": stale_error,
"exact_token_sequence_agreement": baseline == new_session,
"limits": [
"One prompt, 128 output tokens, one engine instance and one cancellation depth.",
"The retired session is rejected by design; restart uses a fresh session handle.",
"No concurrent traffic or sustained power/thermal behavior was tested.",
],
}
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--model", type=Path, required=True)
parser.add_argument("--report", type=Path, required=True)
args = parser.parse_args()
report = asyncio.run(run(args.model))
args.report.parent.mkdir(parents=True, exist_ok=True)
args.report.write_text(json.dumps(report, indent=2) + "\n")
print(json.dumps({"status": report["status"],
"cancel_before": report["cancel"]["token_events_before_cancel"],
"late_events": len(report["cancel"]["late_events"]),
"stale_handle_rejected": report["stale_handle_rejected"],
"exact": report["exact_token_sequence_agreement"]}, indent=2))
if report["status"] != "restart_after_cancel_pass":
raise SystemExit(1)
if __name__ == "__main__":
main()
@@ -18,6 +18,32 @@ was **0.559/1.052 s** for 0.16 s audio, with 403 CPU and 335 GPU placement
rows and a median component RTF of 3.49. Listening quality and playable
complete-stream behavior remain open.
An additional [Spark BF16 restart probe](evidence/spark_bf16_wsl_cpu/restart_branch_report.json)
cancelled after eight token events, rejected the retired session handle and
verified that a fresh session produced the same 128 greedy token IDs with no
late events. For S25, the historical [25-frame TFLite GPU-requested vocoder](evidence/qwen_tts_vocoder_qualcomm/s25/full_tflite_gpu_profile/README.md)
has a newly measured 100-sample p50/p95 **0.839/1.157 s** for 2 s of audio,
with mixed CPU/GPU placement and component median RTF **0.420**. Its 4.24%
same-fixture waveform relative L2, unknown exact checkpoint revision and
missing full-stream gates prevent a mobile TTS support claim.
The pinned CustomVoice eager 25-frame decoder now matches the historical
ONNX CPU waveform at 1.89e-6 relative L2 on that fixture, without proving
the source export's revision.
A [fresh 25-frame export](evidence/qwen_tts_vocoder_qualcomm/s25/full_pinned_tflite/README.md)
from that pinned snapshot matches local eager CPU at 1.99e-6 relative L2 and
has compiled to S25 TFLite. Its GPU-requested inference and placement
profile are pending, separate from the historical target's measurements.
The same pinned [two-frame graph on Galaxy S24](evidence/qwen_tts_vocoder_qualcomm/s24/tflite_short_chunk/README.md)
matched local ONNX CPU at 5.75e-6 relative L2 when requested on CPU, while
its GPU-requested waveform was fully saturated at 24.218 relative L2. The
100-sample CPU component p50/p95 was 3.433/3.873 s for 0.16 s audio (RTF
21.46); the numerically failed mixed CPU/GPU route measured 0.601/0.895 s.
A FP32-preserving GPU control returned the same saturated waveform bitwise.
A
[Snapdragon X Elite FP16 QNN short graph](evidence/qwen_tts_vocoder_qualcomm/xelite/qnn_short_chunk/README.md)
compiled, with NPU inference still pending. These are component-only results.
The [Qwen3-TTS vocoder study](evidence/qwen_tts_vocoder_qualcomm/README.md) reuses a retained fixed-shape Code2Wav export and historical Workbench input to test numerical behavior on SA8775P and other Qualcomm settings. The fresh SA8775P GPU-requested inference produces a saturated waveform, while the same binary's CPU-requested output on the exact SA device matches ONNX CPU within 4.13e-6 relative L2. Its 100-sample CPU-requested component profile had p50/p95 5.384/5.534 s with all 738 execution-detail rows on CPU. A FP32-preserving GPU-option control still saturated 84.89% of samples, so that option did not repair the tested path. RB3 GPU-requested execution produces an unsaturated but 15.73%-divergent waveform; its fresh 100-sample mixed CPU/GPU component p50/p95 was 3.099/3.133 s, not a usable TTS timing claim. On the exact RB3 device, the same binary requested on CPU matched original ONNX CPU within 4.13e-6 relative L2 on the retained fixture; its 47-sample component profile measured p50/p95 12.727/13.424 s with all 738 execution-detail rows on CPU. This is a major streaming-latency blocker. A single-fixture-calibrated RB3 INT8 QNN vocoder returned a finite but 66.93%-relative-L2 divergent waveform (3.49 dB SNR) versus ONNX CPU; its 100-sample component profile was p50/p95 1.971/1.992 s with all 728 execution-detail rows on NPU; these timings describe numerically unqualified audio. X Elite ONNX CPU output matches the local ONNX Runtime reference on the retained fixture; its 94-sample component p50/p95 was 6.384/6.644 s with all execution-detail rows on CPU. Corrected X Elite DirectML inference and profile both failed during provider initialization; separate FP16 QNN DLC inference returned an unsaturated waveform at 1.138% relative L2 / 38.88 dB SNR against original ONNX CPU; its placement profile timed out during QNN graph preparation without samples. A separate SA8775P FP16 QNN vocoder compile passed, but same-fixture NPU-requested inference failed after compilation without a waveform or placement samples. Fresh S24 and S25 CPU-requested TFLite vocoder inferences matched ONNX CPU within 4.04e-6 relative L2 on the retained fixture. S25 measured 100 component samples at p50/p95 4.418/4.641 s with all 738 execution-detail rows on CPU; S24 measured 100 at 4.826/4.958 s with all 738 rows on CPU. Separate explicit INT8 and W8A16 QDQ ONNX exports checked on local ORT CPU failed the same-fixture numerical gate at 246.97% and 331.83% waveform relative L2, respectively. S25 CPU talker inference preserved token 80 and its 100-sample component profile measured p50/p95 30.161/31.301 ms with all 1,800 rows on CPU. No complete on-device TTS stream or model-quality qualification is claimed.
A local HX370 x86-64 LiteRT CPU control of the identical SA/RB3 TFLite binary matched the original ONNX CPU waveform within 3.45e-6 relative L2. The SA saturation is therefore not universal to the converted artifact; the exact SA CPU control passed numerical and placement checks, while the faulty GPU delegate operation remains unidentified.
@@ -4,6 +4,14 @@
A new [two-frame S25 export](s25/qnn_short_chunk/README.md) preserves 72 history frames and locally matches the eager decoder at 2.96e-6 relative L2 on one fixture. Its FP16 QNN DLC failed NPU-requested inference at Workbench's reported memory limit. A [TFLite GPU-requested version](s25/tflite_short_chunk/README.md) returned a finite waveform at 2.325% relative L2 versus local ONNX CPU; 100 component samples measured p50/p95 0.559/1.052 s for 0.16 s of audio, with 403 CPU and 335 GPU placement rows. This mixed route has median component RTF 3.49 and no listening-quality pass or complete stream.
The same historical 25-frame S25 TFLite target now has a [GPU-requested placement profile](s25/full_tflite_gpu_profile/README.md): 100 samples p50/p95 **0.839/1.157 s** for 2 s audio, with 403 CPU and 335 GPU rows and reported 374,591,488-byte peak. Its component median RTF **0.420** is below one, unlike the two-frame candidate. The retained waveform still differs from ONNX CPU by **4.24% relative L2** on one synthetic fixture, and the historical export has no exact checkpoint revision or listening-quality gate. This is a candidate for complete-stream evaluation, not supported mobile TTS.
The current pinned CustomVoice snapshot's eager 25-frame decoder separately
matched that historical ONNX CPU waveform at **1.89e-6 relative L2** on the
same fixture, strengthening numerical continuity without proving the
historical export revision.
On [Galaxy S24](s24/tflite_short_chunk/README.md), the same pinned two-frame TFLite source matched local ONNX CPU at 5.75e-6 relative L2 when requested on CPU, but its GPU-requested output saturated every sample and differed by 24.218 relative L2. The 100-sample CPU component p50/p95 was 3.433/3.873 s for only 0.16 s audio (median RTF 21.46), with all 738 rows on CPU. The mixed CPU/GPU component measured 0.601/0.895 s with 403 CPU and 335 GPU rows, but that timing describes numerically failed audio. A FP32-preserving delegate control remains pending; neither route is a complete S24 TTS stream.
The historical Workbench source model `mqyer339n` is a 423,655,047-byte ONNX graph with one FP32 input `[1,512,97]` and one 48,000-sample output. The [manifest](artifact_manifest.json) pins its SHA256, the retained Workbench fixture dataset `d7m80jl32`, a local ONNX Runtime 1.29 CPU output, compiled target downloads, and the prior [S25 GPU output](s25_reference_output.npz). The source export script identifies the Qwen3-TTS 0.6B CustomVoice model family, but did not attest the exact checkpoint revision; these results must not be promoted to a revision-qualified release claim. Large source/target artifacts and the fixture remain outside Git under `/home/zhout/project/edge_infer/models/`.
The [S25 historical inference](s25_reference_inference.json) on the same fixture differed from local FP32 ONNX CPU by **4.24% relative L2 / 27.46 dB SNR** ([comparison](s25_cpu_comparison.json)); that waveform has no listening-quality tolerance. A fresh [SA8775P inference](sa8775p/inference_report.json) used historical compiled TFLite model `mnze95don` and requested GPU. Its [output](sa8775p/device_output.npz) had **96.63%** of samples at absolute amplitude at least 0.999, RMS **0.989** versus CPU **0.0837**, relative L2 **11.832**, and SNR **−21.46 dB**. The fresh [profile](sa8775p/profile_report.json) attributed 403 execution-detail rows to CPU and 335 to GPU; 100 component samples had nearest-rank p50/p95 **1.776/1.880 s** (minimum 1.675 s). The [audit](sa8775p/audit_report.json) pins all output hashes, waveform differences and placement. This is measured execution of a **numerically failed** output, not a usable TTS performance result. The [SA8775P compile record](sa8775p/compile_report.json) pins the artifact and source IDs.
@@ -0,0 +1,37 @@
# Two-frame Code2Wav on hosted Galaxy S24
The pinned [two-frame source and fixture](../../s25/qnn_short_chunk/README.md)
retain 72 history frames and two new frames from Qwen3-TTS 0.6B CustomVoice.
The source [compiled to S24 TFLite](compile_report.json). Both routes below
use that exact compiled target and fixture, with explicit compute-unit requests.
The [CPU-requested inference](../tflite_short_chunk_cpu/inference_report.json)
returned finite unsaturated 3,840-sample audio. Its [audit](../tflite_short_chunk_cpu/audit_report.json)
measured **5.75e-6 relative L2** / **104.81 dB SNR** versus local ONNX
Runtime CPU on the same input. The [GPU-requested inference](inference_report.json)
returned a **fully saturated waveform**: all samples had absolute amplitude
at least 0.999, with relative L2 **24.218** / SNR **−27.68 dB** versus local
ONNX CPU ([audit](audit_report.json)). The tested S24 GPU delegate route
fails the numerical gate; requesting GPU alone does not establish its actual
node placement.
The [CPU placement profile](../tflite_short_chunk_cpu/profile_report.json)
returned **100** component samples at nearest-rank p50/p95
**3.433/3.873 s**, with all **738 execution-detail rows on CPU** and
reported 770,936,832-byte inference peak. This is **0.16 s audio** per call:
median component RTF **21.46**, far from playable streaming. The
[GPU-requested placement profile](profile_report.json) returned **100** samples
at p50/p95 **0.601/0.895 s**, with **403 CPU and 335 GPU** rows and reported
608,776,192-byte peak. Those timings describe a **grossly failed waveform**,
not usable audio. Workbench generated both profile inputs with the pinned
shape; the numerical inferences used the retained fixture.
CPU numerical parity on one synthetic window is component evidence only.
Neither route verifies a talker/predictor, resident history, stage handoff,
complete stream, listening quality or thermal behavior.
A separate [GPU FP32-preserving control](../tflite_short_chunk_gpu_fp32/inference_report.json)
requested `allow_fp32_as_fp16=false` against the same target and fixture.
It returned a waveform **bitwise identical** to the fully saturated default
GPU output ([audit](../tflite_short_chunk_gpu_fp32/audit_report.json)). This
option did not repair the tested S24 delegate route; it does not identify the
specific failing operator or rule out other artifacts/runtimes.
@@ -0,0 +1,90 @@
{
"scope": "one two-frame Qwen3-TTS vocoder component on hosted Samsung Galaxy S24; no complete stream",
"status": "component_gross_numeric_failure_with_placement_profile",
"device": {
"name": "Samsung Galaxy S24",
"os": "14",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8gen3",
"chipset:sm8650",
"hexagon:v75",
"soc-model:57",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"source_model_id": "mng2vv4em",
"target_model_id": "mn1l6jxzq",
"input_dataset_id": "d7ovqp0w2",
"jobs": {
"compile": "jgolr0d4g",
"inference": "jp0mjqweg",
"profile": "jpxl4j21p"
},
"route": {
"compile_options": "--target_runtime tflite",
"run_options": "--compute_unit gpu"
},
"files": {
"fixture": {
"bytes": 129614,
"sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55"
},
"ort_cpu": {
"bytes": 14813,
"sha256": "989307db317d77be054f684211ae0c6a2fd24d93bcd74307c597fed430ba2a37"
},
"eager_cpu": {
"bytes": 14818,
"sha256": "542113d24feeb4ff58b895ce7d96fc7aa5240b046a3a0d1d3922c7ab23ea0a7c"
},
"device_output": {
"bytes": 271,
"sha256": "31351e406fc85422c884bf20d6bab9042dc3b53a63f8ff129e3d9b69e307fa47"
}
},
"ort_cpu_vs_device": {
"relative_l2": 24.21776698878969,
"snr_db": -27.682681926301676,
"max_abs": 1.253519594669342,
"reference_rms": 0.04131374650145444,
"output_rms": 1.0,
"output_saturated_fraction_abs_ge_0_999": 1.0
},
"eager_cpu_vs_device": {
"relative_l2": 24.217753780026253,
"snr_db": -27.68267718887511,
"max_abs": 1.2535196542739868,
"reference_rms": 0.04131376905845152,
"output_rms": 1.0,
"output_saturated_fraction_abs_ge_0_999": 1.0
},
"gross_numeric_failure_screen": {
"failed": true,
"criteria": "relative L2 >= 1.0 or fraction |sample| >= 0.999 at least 0.1; this is not a speech-quality acceptance threshold"
},
"limits": [
"One fixed two-frame waveform has no listening-quality tolerance.",
"The 72-frame input history, talker, predictor and stage handoff did not run on the device.",
"No persistent state, admission, cancellation or complete TTS stream was tested."
],
"profile": {
"sample_count": 100,
"min_us": 551032,
"nearest_rank_p50_us": 600587,
"nearest_rank_p95_us": 895429,
"reported_peak_memory_bytes": 608776192,
"compute_unit_row_counts": {
"CPU": 403,
"GPU": 335
},
"profile_input": "Workbench generated input with audited tensor shape; the waveform inference used the retained fixture"
}
}
@@ -0,0 +1,32 @@
{
"timestamp_utc": "2026-09-24T05:42:48.154755+00:00",
"qai_hub_version": "0.55.0",
"facility": "Qualcomm AI Hub Workbench",
"job_id": "jgolr0d4g",
"url": "https://workbench.aihub.qualcomm.com/jobs/jgolr0d4g/",
"status": "SUCCESS",
"status_message": "",
"options": "--target_runtime tflite",
"hub_version": "aihub-2026.09.11.0",
"device": {
"name": "Samsung Galaxy S24",
"os": "14",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8gen3",
"chipset:sm8650",
"hexagon:v75",
"soc-model:57",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"source_model_id": "mng2vv4em",
"target_model_id": "mn1l6jxzq"
}
@@ -0,0 +1,12 @@
{
"timestamp_utc": "2026-09-24T05:40:00.137498+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"source_model_id": "mng2vv4em",
"device": "Samsung Galaxy S24",
"options": "--target_runtime tflite",
"kind": "compile",
"status": "SUBMITTED",
"job_id": "jgolr0d4g",
"url": "https://workbench.aihub.qualcomm.com/jobs/jgolr0d4g/"
}
@@ -0,0 +1,33 @@
{
"timestamp_utc": "2026-09-24T05:49:42.074226+00:00",
"qai_hub_version": "0.55.0",
"facility": "Qualcomm AI Hub Workbench",
"job_id": "jp0mjqweg",
"url": "https://workbench.aihub.qualcomm.com/jobs/jp0mjqweg/",
"status": "SUCCESS",
"status_message": "",
"options": "--compute_unit gpu",
"hub_version": "aihub-2026.09.11.0",
"device": {
"name": "Samsung Galaxy S24",
"os": "14",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8gen3",
"chipset:sm8650",
"hexagon:v75",
"soc-model:57",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"model_id": "mn1l6jxzq",
"input_dataset_id": "d7ovqp0w2",
"outputs": "device_output.npz"
}
@@ -0,0 +1,13 @@
{
"timestamp_utc": "2026-09-24T05:43:17.676190+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"target_model_id": "mn1l6jxzq",
"input_dataset_id": "d7ovqp0w2",
"device": "Samsung Galaxy S24",
"options": "--compute_unit gpu",
"kind": "inference",
"status": "SUBMITTED",
"job_id": "jp0mjqweg",
"url": "https://workbench.aihub.qualcomm.com/jobs/jp0mjqweg/"
}
@@ -0,0 +1,12 @@
{
"timestamp_utc": "2026-09-24T05:48:19.985733+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"target_model_id": "mn1l6jxzq",
"device": "Samsung Galaxy S24",
"options": "--compute_unit gpu",
"kind": "profile",
"status": "SUBMITTED",
"job_id": "jpxl4j21p",
"url": "https://workbench.aihub.qualcomm.com/jobs/jpxl4j21p/"
}
@@ -0,0 +1,89 @@
{
"scope": "one two-frame Qwen3-TTS vocoder component on hosted Samsung Galaxy S24; no complete stream",
"status": "component_inference_numeric_and_placement_measured",
"device": {
"name": "Samsung Galaxy S24",
"os": "14",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8gen3",
"chipset:sm8650",
"hexagon:v75",
"soc-model:57",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"source_model_id": "mng2vv4em",
"target_model_id": "mn1l6jxzq",
"input_dataset_id": "d7ovqp0w2",
"jobs": {
"compile": "jgolr0d4g",
"inference": "j5qlyknmp",
"profile": "jp4y1o0vp"
},
"route": {
"compile_options": "--target_runtime tflite",
"run_options": "--compute_unit cpu"
},
"files": {
"fixture": {
"bytes": 129614,
"sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55"
},
"ort_cpu": {
"bytes": 14813,
"sha256": "989307db317d77be054f684211ae0c6a2fd24d93bcd74307c597fed430ba2a37"
},
"eager_cpu": {
"bytes": 14818,
"sha256": "542113d24feeb4ff58b895ce7d96fc7aa5240b046a3a0d1d3922c7ab23ea0a7c"
},
"device_output": {
"bytes": 14716,
"sha256": "d86b4a1d1af2ed7221826dfeaec8110fefbac24c2c305103d0e6fed5d3b8e4b8"
}
},
"ort_cpu_vs_device": {
"relative_l2": 5.748310303094062e-06,
"snr_db": 104.8091959197192,
"max_abs": 2.0265579223632812e-06,
"reference_rms": 0.04131374650145444,
"output_rms": 0.04131375514624109,
"output_saturated_fraction_abs_ge_0_999": 0.0
},
"eager_cpu_vs_device": {
"relative_l2": 5.4850678777245194e-06,
"snr_db": 105.21635987322094,
"max_abs": 2.078711986541748e-06,
"reference_rms": 0.04131376905845152,
"output_rms": 0.04131375514624109,
"output_saturated_fraction_abs_ge_0_999": 0.0
},
"gross_numeric_failure_screen": {
"failed": false,
"criteria": "relative L2 >= 1.0 or fraction |sample| >= 0.999 at least 0.1; this is not a speech-quality acceptance threshold"
},
"limits": [
"One fixed two-frame waveform has no listening-quality tolerance.",
"The 72-frame input history, talker, predictor and stage handoff did not run on the device.",
"No persistent state, admission, cancellation or complete TTS stream was tested."
],
"profile": {
"sample_count": 100,
"min_us": 2660002,
"nearest_rank_p50_us": 3433049,
"nearest_rank_p95_us": 3872544,
"reported_peak_memory_bytes": 770936832,
"compute_unit_row_counts": {
"CPU": 738
},
"profile_input": "Workbench generated input with audited tensor shape; the waveform inference used the retained fixture"
}
}
@@ -0,0 +1,32 @@
{
"timestamp_utc": "2026-09-24T05:42:48.154755+00:00",
"qai_hub_version": "0.55.0",
"facility": "Qualcomm AI Hub Workbench",
"job_id": "jgolr0d4g",
"url": "https://workbench.aihub.qualcomm.com/jobs/jgolr0d4g/",
"status": "SUCCESS",
"status_message": "",
"options": "--target_runtime tflite",
"hub_version": "aihub-2026.09.11.0",
"device": {
"name": "Samsung Galaxy S24",
"os": "14",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8gen3",
"chipset:sm8650",
"hexagon:v75",
"soc-model:57",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"source_model_id": "mng2vv4em",
"target_model_id": "mn1l6jxzq"
}
@@ -0,0 +1,12 @@
{
"timestamp_utc": "2026-09-24T05:40:00.137498+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"source_model_id": "mng2vv4em",
"device": "Samsung Galaxy S24",
"options": "--target_runtime tflite",
"kind": "compile",
"status": "SUBMITTED",
"job_id": "jgolr0d4g",
"url": "https://workbench.aihub.qualcomm.com/jobs/jgolr0d4g/"
}
@@ -0,0 +1,33 @@
{
"timestamp_utc": "2026-09-24T05:47:34.665976+00:00",
"qai_hub_version": "0.55.0",
"facility": "Qualcomm AI Hub Workbench",
"job_id": "j5qlyknmp",
"url": "https://workbench.aihub.qualcomm.com/jobs/j5qlyknmp/",
"status": "SUCCESS",
"status_message": "",
"options": "--compute_unit cpu",
"hub_version": "aihub-2026.09.11.0",
"device": {
"name": "Samsung Galaxy S24",
"os": "14",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8gen3",
"chipset:sm8650",
"hexagon:v75",
"soc-model:57",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"model_id": "mn1l6jxzq",
"input_dataset_id": "d7ovqp0w2",
"outputs": "device_output.npz"
}
@@ -0,0 +1,13 @@
{
"timestamp_utc": "2026-09-24T05:43:21.059740+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"target_model_id": "mn1l6jxzq",
"input_dataset_id": "d7ovqp0w2",
"device": "Samsung Galaxy S24",
"options": "--compute_unit cpu",
"kind": "inference",
"status": "SUBMITTED",
"job_id": "j5qlyknmp",
"url": "https://workbench.aihub.qualcomm.com/jobs/j5qlyknmp/"
}
@@ -0,0 +1,12 @@
{
"timestamp_utc": "2026-09-24T05:48:17.772085+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"target_model_id": "mn1l6jxzq",
"device": "Samsung Galaxy S24",
"options": "--compute_unit cpu",
"kind": "profile",
"status": "SUBMITTED",
"job_id": "jp4y1o0vp",
"url": "https://workbench.aihub.qualcomm.com/jobs/jp4y1o0vp/"
}
@@ -0,0 +1,78 @@
{
"scope": "one two-frame Qwen3-TTS vocoder component on hosted Samsung Galaxy S24; no complete stream",
"status": "component_gross_numeric_failure",
"device": {
"name": "Samsung Galaxy S24",
"os": "14",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8gen3",
"chipset:sm8650",
"hexagon:v75",
"soc-model:57",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"source_model_id": "mng2vv4em",
"target_model_id": "mn1l6jxzq",
"input_dataset_id": "d7ovqp0w2",
"jobs": {
"compile": "jgolr0d4g",
"inference": "j5m0myqdg"
},
"route": {
"compile_options": "--target_runtime tflite",
"run_options": "--compute_unit gpu --tflite_options allow_fp32_as_fp16=false"
},
"files": {
"fixture": {
"bytes": 129614,
"sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55"
},
"ort_cpu": {
"bytes": 14813,
"sha256": "989307db317d77be054f684211ae0c6a2fd24d93bcd74307c597fed430ba2a37"
},
"eager_cpu": {
"bytes": 14818,
"sha256": "542113d24feeb4ff58b895ce7d96fc7aa5240b046a3a0d1d3922c7ab23ea0a7c"
},
"device_output": {
"bytes": 271,
"sha256": "31351e406fc85422c884bf20d6bab9042dc3b53a63f8ff129e3d9b69e307fa47"
}
},
"ort_cpu_vs_device": {
"relative_l2": 24.21776698878969,
"snr_db": -27.682681926301676,
"max_abs": 1.253519594669342,
"reference_rms": 0.04131374650145444,
"output_rms": 1.0,
"output_saturated_fraction_abs_ge_0_999": 1.0
},
"eager_cpu_vs_device": {
"relative_l2": 24.217753780026253,
"snr_db": -27.68267718887511,
"max_abs": 1.2535196542739868,
"reference_rms": 0.04131376905845152,
"output_rms": 1.0,
"output_saturated_fraction_abs_ge_0_999": 1.0
},
"gross_numeric_failure_screen": {
"failed": true,
"criteria": "relative L2 >= 1.0 or fraction |sample| >= 0.999 at least 0.1; this is not a speech-quality acceptance threshold"
},
"limits": [
"One fixed two-frame waveform has no listening-quality tolerance.",
"The 72-frame input history, talker, predictor and stage handoff did not run on the device.",
"No persistent state, admission, cancellation or complete TTS stream was tested.",
"Requested accelerator execution is not verified node placement without a profile."
]
}
@@ -0,0 +1,32 @@
{
"timestamp_utc": "2026-09-24T05:42:48.154755+00:00",
"qai_hub_version": "0.55.0",
"facility": "Qualcomm AI Hub Workbench",
"job_id": "jgolr0d4g",
"url": "https://workbench.aihub.qualcomm.com/jobs/jgolr0d4g/",
"status": "SUCCESS",
"status_message": "",
"options": "--target_runtime tflite",
"hub_version": "aihub-2026.09.11.0",
"device": {
"name": "Samsung Galaxy S24",
"os": "14",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8gen3",
"chipset:sm8650",
"hexagon:v75",
"soc-model:57",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"source_model_id": "mng2vv4em",
"target_model_id": "mn1l6jxzq"
}
@@ -0,0 +1,12 @@
{
"timestamp_utc": "2026-09-24T05:40:00.137498+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"source_model_id": "mng2vv4em",
"device": "Samsung Galaxy S24",
"options": "--target_runtime tflite",
"kind": "compile",
"status": "SUBMITTED",
"job_id": "jgolr0d4g",
"url": "https://workbench.aihub.qualcomm.com/jobs/jgolr0d4g/"
}
@@ -0,0 +1,33 @@
{
"timestamp_utc": "2026-09-24T06:15:22.373922+00:00",
"qai_hub_version": "0.55.0",
"facility": "Qualcomm AI Hub Workbench",
"job_id": "j5m0myqdg",
"url": "https://workbench.aihub.qualcomm.com/jobs/j5m0myqdg/",
"status": "SUCCESS",
"status_message": "",
"options": "--compute_unit gpu --tflite_options allow_fp32_as_fp16=false",
"hub_version": "aihub-2026.09.11.0",
"device": {
"name": "Samsung Galaxy S24",
"os": "14",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8gen3",
"chipset:sm8650",
"hexagon:v75",
"soc-model:57",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"model_id": "mn1l6jxzq",
"input_dataset_id": "d7ovqp0w2",
"outputs": "device_output.npz"
}
@@ -0,0 +1,13 @@
{
"timestamp_utc": "2026-09-24T05:51:56.300917+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"target_model_id": "mn1l6jxzq",
"input_dataset_id": "d7ovqp0w2",
"device": "Samsung Galaxy S24",
"options": "--compute_unit gpu --tflite_options allow_fp32_as_fp16=false",
"kind": "inference",
"status": "SUBMITTED",
"job_id": "j5m0myqdg",
"url": "https://workbench.aihub.qualcomm.com/jobs/j5m0myqdg/"
}
@@ -0,0 +1,21 @@
# Revision-pinned 25-frame S25 vocoder candidate
The complete Qwen3-TTS 0.6B CustomVoice snapshot at revision
`85e237c12c027371202489a0ec509ded67b5e4b5` was exported to a fixed
72-history-plus-25-new-frame Code2Wav ONNX graph. The graph weighs roughly
400 MB and stays outside Git. The [export report](export_report.json) pins
its SHA256, decoder weight, full 97-frame fixture and 48,000-sample output.
Local ONNX Runtime CPU matched the eager decoder at **1.99e-6 relative L2**;
the pinned eager output matched the historical 25-frame ONNX CPU waveform at
**1.97e-6 relative L2** on that same synthetic fixture. Neither comparison
is a listening-quality test. The [exporter](../../../../../../experiments/export_qwen_tts_vocoder_short_chunk.py)
reproduces this graph with `--chunk-frames 25`.
The [source upload](upload_submission.json) and [one-sample input dataset](dataset_submission.json)
were submitted to Qualcomm AI Hub Workbench. The [S25 TFLite compile](compile_report.json)
succeeded; [GPU-requested inference](inference_submission.json) and a separate
[placement profile](profile_submission.json) are pending on that target.
Device numerical waveform quality, node placement,
complete-stream handoff and sustained behavior remain unverified for this
revision-pinned artifact. The [historical 25-frame target](../full_tflite_gpu_profile/README.md)
is separate despite the local same-fixture numerical continuity.
@@ -0,0 +1,32 @@
{
"timestamp_utc": "2026-09-24T06:24:51.803435+00:00",
"qai_hub_version": "0.55.0",
"facility": "Qualcomm AI Hub Workbench",
"job_id": "jgddd1zzg",
"url": "https://workbench.aihub.qualcomm.com/jobs/jgddd1zzg/",
"status": "SUCCESS",
"status_message": "",
"options": "--target_runtime tflite",
"hub_version": "aihub-2026.09.11.0",
"device": {
"name": "Samsung Galaxy S25",
"os": "15",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8-elite-for-galaxy",
"chipset:sm8750-ac",
"hexagon:v79",
"soc-model:69",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"source_model_id": "mng2vkdrm",
"target_model_id": "mn4o5j17q"
}
@@ -0,0 +1,12 @@
{
"timestamp_utc": "2026-09-24T06:21:50.273397+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"source_model_id": "mng2vkdrm",
"device": "Samsung Galaxy S25",
"options": "--target_runtime tflite",
"kind": "compile",
"status": "SUBMITTED",
"job_id": "jgddd1zzg",
"url": "https://workbench.aihub.qualcomm.com/jobs/jgddd1zzg/"
}
@@ -0,0 +1,14 @@
{
"timestamp_utc": "2026-09-24T06:22:19.467537+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"fixture_sha256": "dfca9e8d2a724a568a31b6cd18ff6a52fdc205fd34e13cbf1cd75f0f7937e82d",
"dataset_id": "d2nmpxd57",
"input_shape": [
1,
512,
97
],
"sample_count": 1,
"status": "UPLOADED"
}
@@ -0,0 +1,49 @@
{
"scope": "one synthetic first short vocoder window; no device execution or complete TTS stream",
"model_snapshot": "/home/zhout/.cache/huggingface/hub/models--Qwen--Qwen3-TTS-12Hz-0.6B-CustomVoice/snapshots/85e237c12c027371202489a0ec509ded67b5e4b5",
"model_snapshot_revision": "85e237c12c027371202489a0ec509ded67b5e4b5",
"model_weight_sha256": "836b7b357f5ea43e889936a3709af68dfe3751881acefe4ecf0dbd30ba571258",
"torch_version": "2.13.0+cpu",
"onnx_version": "1.22.0",
"onnxruntime_version": "1.29.0",
"actual_opsets": {
"ai.onnx": 18
},
"source_fixture_sha256": "dfca9e8d2a724a568a31b6cd18ff6a52fdc205fd34e13cbf1cd75f0f7937e82d",
"long_cpu_reference_sha256": "8de78b94b59f01e49852f7706adbd2508a9976b8e2705cfd3b94d07bb3606cb1",
"context_frames": 72,
"chunk_frames": 25,
"input_shape": [
1,
512,
97
],
"output_shape": [
1,
48000
],
"export_s_not_inference": 7.794216125039384,
"onnx_sha256": "01ee1cd02e5cd264200e5c50767a1805a6180378b051ff9b7ec0d8b6c75d7989",
"short_fixture_sha256": "dfca9e8d2a724a568a31b6cd18ff6a52fdc205fd34e13cbf1cd75f0f7937e82d",
"eager_output_sha256": "0b4ddaf66d1cb737a2a101db1c1e7fa5871e4a73164a607afe029197a854058c",
"ort_output_sha256": "e6c1f321ed752e6c2dec3586e7e80cdf43f18487c25a74acc7eddfd61f4f9f98",
"ort_vs_eager": {
"relative_l2": 1.9864268690782795e-06,
"snr_db": 114.03854838000912,
"max_abs": 3.473949618637562e-06,
"reference_rms": 0.083734386044337,
"output_rms": 0.0837343916262634
},
"short_eager_vs_25_frame_prefix": {
"relative_l2": 1.9738840224118284e-06,
"snr_db": 114.09356736672443,
"max_abs": 3.4702243283391e-06,
"reference_rms": 0.08373439205485074,
"output_rms": 0.083734386044337
},
"limits": [
"The short-window graph still requires its prior 72 quantized frames from a model adapter.",
"Prefix agreement is tested on one retained synthetic fixture, not a speech-quality set.",
"CPU export parity does not establish target compilation, placement or memory admission."
]
}
@@ -0,0 +1,13 @@
{
"timestamp_utc": "2026-09-24T06:25:07.605053+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"target_model_id": "mn4o5j17q",
"device": "Samsung Galaxy S25",
"options": "--compute_unit gpu",
"kind": "inference",
"status": "SUBMITTED",
"job_id": "jglyymx25",
"url": "https://workbench.aihub.qualcomm.com/jobs/jglyymx25/",
"input_dataset_id": "d2nmpxd57"
}
@@ -0,0 +1,12 @@
{
"timestamp_utc": "2026-09-24T06:25:08.953667+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"target_model_id": "mn4o5j17q",
"device": "Samsung Galaxy S25",
"options": "--compute_unit gpu",
"kind": "profile",
"status": "SUBMITTED",
"job_id": "j568847ng",
"url": "https://workbench.aihub.qualcomm.com/jobs/j568847ng/"
}
@@ -0,0 +1,18 @@
{
"timestamp_utc": "2026-09-24T06:16:12.386056+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"source_path_outside_git": "/home/zhout/project/edge_infer/models/qwen3tts_code2wav_c25_pinned_20260924.onnx",
"source_sha256": "01ee1cd02e5cd264200e5c50767a1805a6180378b051ff9b7ec0d8b6c75d7989",
"source_model_id": "mng2vkdrm",
"input_shape": [
1,
512,
97
],
"output_shape": [
1,
48000
],
"status": "UPLOADED"
}
@@ -0,0 +1,36 @@
# S25 25-frame TFLite GPU-requested vocoder profile
The earlier [S25 GPU inference](../../s25_reference_inference.json) used the
retained 97-frame input (72 history + 25 new frames) and produced a 48,000-sample,
2-second waveform on the exact TFLite target `mng7kwxon`. Its
[waveform comparison](../../s25_cpu_comparison.json) to local ONNX Runtime CPU
was **4.2385% relative L2 / 27.46 dB SNR** on one synthetic fixture; there
is no listening-quality tolerance. The historical source export did not
attest an exact checkpoint revision.
A new [pinned eager-decoder comparison](pinned_eager_parity_report.json) used
the locally complete CustomVoice snapshot at revision
`85e237c12c027371202489a0ec509ded67b5e4b5` on the same 97-frame input.
Its full 48,000-sample waveform matched the historical ONNX Runtime CPU
output at **1.89e-6 relative L2 / 114.47 dB SNR**. This supports numerical
continuity on that fixture; it does not prove the historical ONNX export's
checkpoint revision. The [reproduction script](../../../../../../experiments/probe_qwen_tts_full_vocoder_parity.py)
pins artifact hashes and decoder weights.
A new [placement profile](profile_report.json) of that exact S25 target and
97-frame tensor shape returned **100** component samples: nearest-rank p50/p95
was **0.839/1.157 s** for 2 seconds of audio, with **403 CPU and 335 GPU**
execution-detail rows. Reported inference peak memory was **374,591,488
bytes**. The component-only p50/p95 real-time factors were **0.420/0.579**.
Workbench generated the profile input with the same shape; the historical
waveform inference used the retained fixture. The [audit](audit_report.json)
binds target, device, fixture, numerical output and profile. Its reported
estimated-time field is the **0.561 s sample minimum**, not the median.
This is a promising throughput candidate for a 25-frame vocoder stage, not a
complete or quality-qualified Qwen3-TTS stream. The talker, code predictor,
resident history, handoff, first-audio latency, cancellation, speech quality
and sustained co-resident memory/thermal behavior remain unverified. The
separate pinned [two-frame candidate](../tflite_short_chunk/README.md)
has a higher component median RTF and cannot be treated as the same artifact
or checkpoint revision.
@@ -0,0 +1,81 @@
{
"scope": "one Qwen3-TTS code2wav 48,000-sample component on one retained fixture; no complete TTS stream",
"status": "component_executed_quality_unqualified",
"device": {
"name": "Samsung Galaxy S25",
"os": "15",
"attributes": [
"os:android",
"framework:tflite",
"framework:onnx",
"abi:aarch64-android",
"vendor:samsung",
"format:phone",
"chipset:qualcomm-snapdragon-8-elite-for-galaxy",
"chipset:sm8750-ac",
"hexagon:v79",
"soc-model:69",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"compile_job_id": "j574383q5",
"inference_job_id": "jpx428ojg",
"target_model_id": "mng7kwxon",
"input_dataset_id": "d7m80jl32",
"s25_prior_inference_job_id": "jpx428ojg",
"requested_run_options": "--compute_unit gpu",
"files": {
"source_onnx": {
"bytes": 423655047,
"sha256": "7c07666229c6d404894132e22f784525e3212a49efad55ddd532eda5286c2b2b"
},
"fixture": {
"bytes": 129721,
"sha256": "dfca9e8d2a724a568a31b6cd18ff6a52fdc205fd34e13cbf1cd75f0f7937e82d"
},
"cpu_output": {
"bytes": 179942,
"sha256": "8de78b94b59f01e49852f7706adbd2508a9976b8e2705cfd3b94d07bb3606cb1"
},
"s25_output": {
"bytes": 115235,
"sha256": "4a26486d5e84a6e22d16f9b26f995b8fe645c29bbd70b103615ec35a0fcb10a0"
},
"device_output": {
"bytes": 115235,
"sha256": "4a26486d5e84a6e22d16f9b26f995b8fe645c29bbd70b103615ec35a0fcb10a0"
}
},
"cpu_source_vs_device": {
"relative_l2": 0.04238531411741596,
"snr_db": 27.455691878796923,
"max_abs": 0.10591871291399002,
"cosine": 0.9991021814913129,
"reference_rms": 0.08373439205485074,
"output_rms": 0.08376787228276501,
"output_saturated_fraction_abs_ge_0_999": 0.0
},
"s25_gpu_vs_device": null,
"s25_comparison_note": "same retained S25 output; no independent device comparison",
"limits": [
"Historical source export does not attest its exact checkpoint revision.",
"This fixed component waveform has no listening or task-quality tolerance.",
"Hosted component jobs exclude talker, predictor, stage handoff, streaming, admission and sustained power/thermal behavior."
],
"profile_job_id": "jprl0qzep",
"profile": {
"sample_count": 100,
"sample_min_us": 561442,
"nearest_rank_p50_us": 839287,
"nearest_rank_p95_us": 1157249,
"reported_estimated_inference_time_us": 561442,
"reported_peak_memory_bytes": 374591488,
"compute_unit_row_counts": {
"CPU": 403,
"GPU": 335
},
"profile_input": "Workbench generated input with pinned tensor shape; waveform inference used the retained fixture"
}
}
@@ -0,0 +1,21 @@
{
"scope": "one synthetic 25-frame Code2Wav waveform parity check; no device stream",
"pinned_checkpoint_revision": "85e237c12c027371202489a0ec509ded67b5e4b5",
"pinned_decoder_weight_sha256": "836b7b357f5ea43e889936a3709af68dfe3751881acefe4ecf0dbd30ba571258",
"source_onnx_sha256": "7c07666229c6d404894132e22f784525e3212a49efad55ddd532eda5286c2b2b",
"fixture_sha256": "dfca9e8d2a724a568a31b6cd18ff6a52fdc205fd34e13cbf1cd75f0f7937e82d",
"ort_output_sha256": "8de78b94b59f01e49852f7706adbd2508a9976b8e2705cfd3b94d07bb3606cb1",
"eager_output_bytes_sha256": "e9ba192799da2927ca69499566284d516b3e0609589cf1721f3a3e4b00788bd9",
"torch_version": "2.13.0+cpu",
"eager_vs_historical_onnx_cpu": {
"relative_l2": 1.890093262834244e-06,
"snr_db": 114.47033531828137,
"max_abs": 2.9355287551879883e-06,
"reference_rms": 0.08373439205485074,
"output_rms": 0.08373438508072073
},
"limits": [
"Numerical agreement on one fixture cannot prove the historical ONNX export's exact checkpoint revision.",
"One synthetic latent window cannot establish listening quality or multi-chunk history."
]
}
@@ -0,0 +1,13 @@
{
"timestamp_utc": "2026-09-24T05:44:37.116877+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"target_model_id": "mng7kwxon",
"historical_inference_job_id": "jpx428ojg",
"device": "Samsung Galaxy S25",
"options": "--compute_unit gpu",
"kind": "profile",
"status": "SUBMITTED",
"job_id": "jprl0qzep",
"url": "https://workbench.aihub.qualcomm.com/jobs/jprl0qzep/"
}
@@ -26,6 +26,16 @@ records the raw samples. A hosted S25 artifact must independently pass
numerical, node-placement, memory and complete-stream gates before it can be
called supported.
A local [history-length numerical screen](history_sweep_report.json) on the
same checkpoint and synthetic first window tested 72, 64, 48, 32, 24, 16 and
8 prior frames while keeping two new frames. Reducing history to 64 frames
already changed the 3,840-sample waveform by **7.31% relative L2** versus
the 72-frame baseline; 32 frames changed it by **39.56%**. This one-window
result does not establish a quality threshold, but it rules out treating a
simple history cut as numerically equivalent. The
[probe](../../../../../../experiments/probe_qwen_tts_vocoder_history.py)
records the pinned inputs and every comparison.
The source [upload](upload_submission.json) and [one-sample dataset](dataset_submission.json)
were compiled to an [S25 FP16 QNN DLC](compile_report.json). Its
[NPU-requested same-fixture inference](inference_report.json) **failed** with
@@ -0,0 +1,169 @@
{
"scope": "one synthetic two-frame Code2Wav window; local CPU numerical screen only",
"checkpoint_revision": "85e237c12c027371202489a0ec509ded67b5e4b5",
"checkpoint_weight_sha256": "836b7b357f5ea43e889936a3709af68dfe3751881acefe4ecf0dbd30ba571258",
"source_fixture_sha256": "dfca9e8d2a724a568a31b6cd18ff6a52fdc205fd34e13cbf1cd75f0f7937e82d",
"long_reference_sha256": "8de78b94b59f01e49852f7706adbd2508a9976b8e2705cfd3b94d07bb3606cb1",
"torch_version": "2.13.0+cpu",
"rows": [
{
"history_frames": 72,
"input_shape": [
1,
512,
74
],
"vs_72_history": {
"relative_l2": 0.0,
"snr_db": null,
"max_abs": 0.0,
"reference_rms": 0.04131376992063296,
"output_rms": 0.04131376992063296
},
"vs_25_frame_reference_prefix": {
"relative_l2": 2.3953175306044127e-06,
"snr_db": 112.41273814061603,
"max_abs": 8.544884622097015e-07,
"reference_rms": 0.04131374658894702,
"output_rms": 0.04131376992063296
}
},
{
"history_frames": 64,
"input_shape": [
1,
512,
66
],
"vs_72_history": {
"relative_l2": 0.07314781220082396,
"snr_db": 22.715973175686237,
"max_abs": 0.029364341869950294,
"reference_rms": 0.04131376992063296,
"output_rms": 0.04137138712579574
},
"vs_25_frame_reference_prefix": {
"relative_l2": 0.07314669728852428,
"snr_db": 22.71610556623493,
"max_abs": 0.029363619163632393,
"reference_rms": 0.04131374658894702,
"output_rms": 0.04137138712579574
}
},
{
"history_frames": 48,
"input_shape": [
1,
512,
50
],
"vs_72_history": {
"relative_l2": 0.15985885548973935,
"snr_db": 15.925266013769726,
"max_abs": 0.06841851770877838,
"reference_rms": 0.04131376992063296,
"output_rms": 0.04178483839881755
},
"vs_25_frame_reference_prefix": {
"relative_l2": 0.15985809288172675,
"snr_db": 15.925307449978025,
"max_abs": 0.06841817498207092,
"reference_rms": 0.04131374658894702,
"output_rms": 0.04178483839881755
}
},
{
"history_frames": 32,
"input_shape": [
1,
512,
34
],
"vs_72_history": {
"relative_l2": 0.3955958405987473,
"snr_db": 8.054965666800932,
"max_abs": 0.16915886104106903,
"reference_rms": 0.04131376992063296,
"output_rms": 0.04334846939066081
},
"vs_25_frame_reference_prefix": {
"relative_l2": 0.3955953168940037,
"snr_db": 8.054977165517931,
"max_abs": 0.1691584438085556,
"reference_rms": 0.04131374658894702,
"output_rms": 0.04334846939066081
}
},
{
"history_frames": 24,
"input_shape": [
1,
512,
26
],
"vs_72_history": {
"relative_l2": 0.39665520929029785,
"snr_db": 8.031736754636619,
"max_abs": 0.16314568370580673,
"reference_rms": 0.04131376992063296,
"output_rms": 0.04308058984078091
},
"vs_25_frame_reference_prefix": {
"relative_l2": 0.39665474559562586,
"snr_db": 8.03174690855117,
"max_abs": 0.16314562410116196,
"reference_rms": 0.04131374658894702,
"output_rms": 0.04308058984078091
}
},
{
"history_frames": 16,
"input_shape": [
1,
512,
18
],
"vs_72_history": {
"relative_l2": 0.690332954037814,
"snr_db": 3.2188278888852677,
"max_abs": 0.28049134463071823,
"reference_rms": 0.04131376992063296,
"output_rms": 0.044361933300582454
},
"vs_25_frame_reference_prefix": {
"relative_l2": 0.6903328674490854,
"snr_db": 3.2188289783598227,
"max_abs": 0.28049128502607346,
"reference_rms": 0.04131374658894702,
"output_rms": 0.044361933300582454
}
},
{
"history_frames": 8,
"input_shape": [
1,
512,
10
],
"vs_72_history": {
"relative_l2": 1.2951780385046339,
"snr_db": -2.2465894351485622,
"max_abs": 0.49505019187927246,
"reference_rms": 0.04131376992063296,
"output_rms": 0.04548139356756025
},
"vs_25_frame_reference_prefix": {
"relative_l2": 1.2951785701778178,
"snr_db": -2.2465930007229558,
"max_abs": 0.4950501322746277,
"reference_rms": 0.04131374658894702,
"output_rms": 0.04548139356756025
}
}
],
"limits": [
"One synthetic first window cannot establish multi-chunk history or speech quality.",
"No smaller-history graph was exported, compiled or executed on a device.",
"CPU forward timing was not measured as a performance profile."
]
}
@@ -1,5 +1,5 @@
{
"scope": "one two-frame Qwen3-TTS vocoder component on hosted S25; no complete stream",
"scope": "one two-frame Qwen3-TTS vocoder component on hosted Samsung Galaxy S25; no complete stream",
"status": "component_inference_numeric_and_placement_measured",
"device": {
"name": "Samsung Galaxy S25",
@@ -66,6 +66,10 @@
"output_rms": 0.041393810541143945,
"output_saturated_fraction_abs_ge_0_999": 0.0
},
"gross_numeric_failure_screen": {
"failed": false,
"criteria": "relative L2 >= 1.0 or fraction |sample| >= 0.999 at least 0.1; this is not a speech-quality acceptance threshold"
},
"limits": [
"One fixed two-frame waveform has no listening-quality tolerance.",
"The 72-frame input history, talker, predictor and stage handoff did not run on the device.",
@@ -0,0 +1,12 @@
# Two-frame X Elite QNN vocoder candidate
The same pinned [Qwen3-TTS two-frame source and fixture](../../s25/qnn_short_chunk/README.md)
compiled to [FP16 QNN DLC](compile_report.json) for Snapdragon X Elite CRD.
An [NPU-requested inference job](inference_submission.json) is pending on
the retained fixture. A separate [placement profile](profile_submission.json)
is also pending for the same target and tensor shape. Compilation alone does
not establish numerical output, NPU placement, timing, or complete TTS
support. The earlier
[25-frame X Elite NPU attempt](../qnn_npu/inference_report.json) returned a
waveform but its placement profile timed out during graph preparation; this
shorter artifact tests a separate memory/graph-preparation boundary.
@@ -0,0 +1,31 @@
{
"timestamp_utc": "2026-09-24T05:49:41.971559+00:00",
"qai_hub_version": "0.55.0",
"facility": "Qualcomm AI Hub Workbench",
"job_id": "j5m0m22qg",
"url": "https://workbench.aihub.qualcomm.com/jobs/j5m0m22qg/",
"status": "SUCCESS",
"status_message": "",
"options": "--target_runtime qnn_dlc --qnn_options default_graph_htp_precision=FLOAT16",
"hub_version": "aihub-2026.09.11.0",
"device": {
"name": "Snapdragon X Elite CRD",
"os": "11",
"attributes": [
"os:windows",
"format:compute",
"framework:onnx",
"vendor:qualcomm",
"abi:aarch64-windows",
"chipset:qualcomm-snapdragon-x-elite",
"chipset:sc8380xp",
"hexagon:v73",
"soc-model:60",
"htp-supports-fp16:true",
"htp-supports-weight-sharing:true",
"framework:qnn"
]
},
"source_model_id": "mng2vv4em",
"target_model_id": "mqeyv2w7m"
}
@@ -0,0 +1,12 @@
{
"timestamp_utc": "2026-09-24T05:47:10.611599+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"source_model_id": "mng2vv4em",
"device": "Snapdragon X Elite CRD",
"options": "--target_runtime qnn_dlc --qnn_options default_graph_htp_precision=FLOAT16",
"kind": "compile",
"status": "SUBMITTED",
"job_id": "j5m0m22qg",
"url": "https://workbench.aihub.qualcomm.com/jobs/j5m0m22qg/"
}
@@ -0,0 +1,13 @@
{
"timestamp_utc": "2026-09-24T05:50:13.358335+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"target_model_id": "mqeyv2w7m",
"input_dataset_id": "d7ovqp0w2",
"device": "Snapdragon X Elite CRD",
"options": "--compute_unit npu",
"kind": "inference",
"status": "SUBMITTED",
"job_id": "jgdd3lxeg",
"url": "https://workbench.aihub.qualcomm.com/jobs/jgdd3lxeg/"
}
@@ -0,0 +1,12 @@
{
"timestamp_utc": "2026-09-24T06:08:12.774185+00:00",
"facility": "Qualcomm AI Hub Workbench",
"qai_hub_version": "0.55.0",
"target_model_id": "mqeyv2w7m",
"device": "Snapdragon X Elite CRD",
"options": "--compute_unit npu",
"kind": "profile",
"status": "SUBMITTED",
"job_id": "jp4yyrrvp",
"url": "https://workbench.aihub.qualcomm.com/jobs/jp4yyrrvp/"
}
@@ -37,6 +37,15 @@ checkout (`3834de310`, package `0.28.1.dev154`) with the same vLLM 0.28.0
and checkpoint. Its 4.808/5.089 s wall p50/p95 and 19.88 s acceptance load
are distinct run observations, not the fork-branch timing.
A separate [fork-branch restart probe](restart_branch_report.json) verified
the state lifecycle after cancelling generation at eight token events. The
backend reported zero in-flight requests and delivered no retired-epoch
events. Reusing the old session handle was explicitly refused as stale; a
fresh session then produced the **exact same 128 greedy token IDs** as the
pre-cancel request. The [probe script](../../../../experiments/verify_spark_bf16_restart.py)
records the two token-sequence hashes, state refusal and runtime provenance.
This covers one prompt and one cancellation depth, not concurrent recovery.
Reproduce from the repository root with the installed CPU environment, after
downloading the pinned checkpoint into the path below:
@@ -52,6 +61,10 @@ export PYTHONPATH=/home/zhout/project/edge_infer/vllm-omni-edge
benchmarks/edge_harness/experiments/profile_spark_bf16_omni_cpu.py \
--model /home/zhout/project/edge_infer/models/Spark-X2.5-1.7B-BF16 \
--report /tmp/spark_bf16_profile_repeat.json
/home/zhout/project/edge_infer/.venvs/omni-cpu/bin/python \
benchmarks/edge_harness/experiments/verify_spark_bf16_restart.py \
--model /home/zhout/project/edge_infer/models/Spark-X2.5-1.7B-BF16 \
--report /tmp/spark_bf16_restart_repeat.json
```
This validates one complete text path and cancellation on WSL CPU. It does
@@ -8,7 +8,7 @@ A [follow-up MiniCPM-o storage experiment](../../../e2e_expansion_20260923/evide
The [WSL CPU Spark GGUF Omni profile](../../../e2e_expansion_20260923/evidence/spark_omni_wsl_cpu/README.md) adds a separate current-Omni complete-request path to the earlier vLLM INT8 CPU result. It passed two named prompts, 20/20 serial measured inventory requests at p50/p95 7.82/7.97 s, a public text request, context refusal and cancellation cleanup. The CPU-only llama.cpp build required explicit CPU-buffer placement evidence because it omits the Windows offload-count log line. This does not establish token streaming or broad quality.
A complete pinned [Spark 1.7B BF16 WSL CPU checkpoint and acceptance run](../../../e2e_expansion_20260924/evidence/spark_bf16_wsl_cpu/README.md) adds a second current-Omni text artifact to the GGUF route. Twelve prompts produced 128 tokens each with clean cancellation; all 12 token-ID sequences exactly matched standalone vLLM on the same checkpoint. One warmup plus 20 serial 28-prompt-token/64-output-token requests measured p50/p95 complete-request wall time 5.411/5.751 s and TTFT 0.129/0.146 s on the fork branch. This is WSL CPU full-text scope, not mobile generation or broad quality qualification.
A complete pinned [Spark 1.7B BF16 WSL CPU checkpoint and acceptance run](../../../e2e_expansion_20260924/evidence/spark_bf16_wsl_cpu/README.md) adds a second current-Omni text artifact to the GGUF route. Twelve prompts produced 128 tokens each with clean cancellation; all 12 token-ID sequences exactly matched standalone vLLM on the same checkpoint. One warmup plus 20 serial 28-prompt-token/64-output-token requests measured p50/p95 complete-request wall time 5.411/5.751 s and TTFT 0.129/0.146 s on the fork branch. A fresh-session restart after an eight-token cancellation reproduced the same 128 greedy token IDs, while the retired handle was explicitly rejected. This is WSL CPU full-text scope, not mobile generation or broad quality qualification.
On a hosted [Galaxy S24 Spark attention-layer experiment](../../../e2e_expansion_20260923/evidence/spark_s24_full_attention/README.md), a real one-layer W8A16 QDQ artifact executed on NPU and matched prior S25 component outputs exactly on one dataset. The 100-sample layer p50/p95 was 1.109/1.205 ms; the service's 1.098 ms estimated-time field was the sample minimum. FP32-source versus S24 output hidden-state relative L2 was 1.351% without a downstream token-quality gate. This adds component C evidence only; device-local generation remains absent.
@@ -50,8 +50,8 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i
| PC HX370 + AMD NPU / Windows worker | NOT E2E (output-head component passed) | NOT E2E | NOT E2E | NOT E2E | NOT E2E |
| PC CPU+iGPU+NPU +/- discrete GPU, joint model execution | NOT E2E | NOT E2E | NOT E2E | NOT E2E | NOT E2E |
| PC Snapdragon X Elite CRD / AI Hub | NOT E2E (one Spark attention layer on NPU) | NOT E2E (CPU talker/vocoder steps; QNN vocoder numeric) | NOT E2E | NOT E2E (NPU speech-head step profiled) | NOT E2E (Cosmos NPU encoder profiled) |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | NOT E2E (one Spark attention layer on NPU) | NOT E2E (FP16 talker token mismatch; CPU talker + vocoder profiled; 25-frame and two-frame QNN vocoder memory failures; short TFLite CPU/GPU component p50 0.559 s for 0.16 s audio) | NOT E2E | NOT E2E (NPU speech head step profiled) | NOT E2E (Cosmos NPU encoder profiled) |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | NOT E2E (one Spark attention layer on NPU) | NOT E2E (FP16 talker token mismatch; CPU talker + vocoder profiled) | NOT E2E | NOT E2E (NPU speech head step profiled) | NOT E2E (Cosmos encoder numeric and NPU profiled) |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | NOT E2E (one Spark attention layer on NPU) | NOT E2E (FP16 talker token mismatch; CPU talker + vocoder profiled; 25-frame and two-frame QNN vocoder memory failures; 25-frame TFLite CPU/GPU vocoder component RTF 0.420; short chunk RTF 3.49) | NOT E2E | NOT E2E (NPU speech head step profiled) | NOT E2E (Cosmos NPU encoder profiled) |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | NOT E2E (one Spark attention layer on NPU) | NOT E2E (FP16 talker mismatch; short CPU vocoder RTF 21.46; mixed CPU/GPU waveform saturated) | NOT E2E | NOT E2E (NPU speech head step profiled) | NOT E2E (Cosmos encoder numeric and NPU profiled) |
| Embedded SA8775P ADP / AI Hub | NOT E2E (one Spark attention layer on NPU) | NOT E2E (CPU talker/vocoder steps; NPU vocoder failed) | NOT E2E | NOT E2E (NPU speech-head step profiled) | NOT E2E (Cosmos NPU encoder profiled) |
| Embedded RB3 Gen 2 / QCS6490 / AI Hub | NOT E2E (Spark CPU layer passed; W8A8 NPU quality open) | NOT E2E (CPU talker + vocoder profiled; INT8 NPU vocoder fails numeric gate) | NOT E2E | NOT E2E (CPU speech-head step profiled) | NOT E2E (Cosmos CPU numeric and profiled) |
@@ -59,7 +59,7 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i
| Device | Model | Current profiling disposition | Reason / remaining work | Next step |
|---|---|---|---|---|
| PC HX370: CPU / WSL | Spark-X2.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST; BF16_CPU_ACCEPTANCE_PARITY_AND_PROFILE_PASS | The pinned Spark-X2.5-1.7B Q4_K_M GGUF ran on a CPU-only Linux llama.cpp server through the current Omni 0.29 `StageRuntime`/`StagePool` whole-session backend. Both named prompts passed (`Paris`, `1511`); one warmup plus 20/20 serial inventory requests had nearest-rank complete-request wall p50/p95 7.82/7.97 s, excluding 1.61 s startup. The stage verified model/server hashes, explicit CPU-only tensor buffers (`CPU_Mapped`, `CPU_REPACK`) and no usable GPU, reserved 4 GiB host RAM, refused an over-context request without truncation, and after in-flight cancellation returned no stale output or reservation. A separate public `AsyncOmni.generate` text request passed. The Linux CPU-only build omits the Windows 0/29 offload line; the verifier was extended to require positive CPU buffer evidence rather than inferring CPU from an absent GPU count. A separate pinned 1.7B BF16 checkpoint was completed and verified against the upstream index. The current Omni vLLM CPU text path then passed 12/12 named prompts at 128 generated tokens, cancellation cleanup and exact 12/12 greedy token-ID parity against standalone vLLM on the same BF16 checkpoint. The fork-branch acceptance load was 30.36 s with approximately 6.45 GiB process-tree RSS load delta; the plan reserved 7.64 GiB. One warmup plus 20 serial BF16 complete requests (28 prompt tokens, 64 output tokens) measured nearest-rank wall p50/p95 5.411/5.751 s and TTFT 0.129/0.146 s on HX370 WSL CPU. Separate neighboring-checkout evidence retained a 19.88 s acceptance load and 4.808/5.089 s profile; it is not the fork-branch timing. The installed vLLM was 0.28.0 with 0.29.0rc2 Omni source, so that version pairing is the tested boundary. The GGUF result and historical INT8 result remain distinct artifacts. None establishes broad text quality, incremental GGUF token streaming, restart-after-cancel, loading peak or sustained performance. | Broaden text quality and context, qualify a matching Omni/vLLM version pair, then test streaming, restart and sustained load; [GGUF evidence](../../../e2e_expansion_20260923/evidence/spark_omni_wsl_cpu/README.md) and [BF16 evidence](../../../e2e_expansion_20260924/evidence/spark_bf16_wsl_cpu/README.md). |
| PC HX370: CPU / WSL | Spark-X2.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST; BF16_CPU_ACCEPTANCE_PARITY_PROFILE_AND_RESTART_PASS | The pinned Spark-X2.5-1.7B Q4_K_M GGUF ran on a CPU-only Linux llama.cpp server through the current Omni 0.29 `StageRuntime`/`StagePool` whole-session backend. Both named prompts passed (`Paris`, `1511`); one warmup plus 20/20 serial inventory requests had nearest-rank complete-request wall p50/p95 7.82/7.97 s, excluding 1.61 s startup. The stage verified model/server hashes, explicit CPU-only tensor buffers (`CPU_Mapped`, `CPU_REPACK`) and no usable GPU, reserved 4 GiB host RAM, refused an over-context request without truncation, and after in-flight cancellation returned no stale output or reservation. A separate public `AsyncOmni.generate` text request passed. The Linux CPU-only build omits the Windows 0/29 offload line; the verifier was extended to require positive CPU buffer evidence rather than inferring CPU from an absent GPU count. A separate pinned 1.7B BF16 checkpoint was completed and verified against the upstream index. The current Omni vLLM CPU text path then passed 12/12 named prompts at 128 generated tokens, cancellation cleanup and exact 12/12 greedy token-ID parity against standalone vLLM on the same BF16 checkpoint. The fork-branch acceptance load was 30.36 s with approximately 6.45 GiB process-tree RSS load delta; the plan reserved 7.64 GiB. One warmup plus 20 serial BF16 complete requests (28 prompt tokens, 64 output tokens) measured nearest-rank wall p50/p95 5.411/5.751 s and TTFT 0.129/0.146 s on HX370 WSL CPU. Separate neighboring-checkout evidence retained a 19.88 s acceptance load and 4.808/5.089 s profile; it is not the fork-branch timing. The installed vLLM was 0.28.0 with 0.29.0rc2 Omni source, so that version pairing is the tested boundary. The GGUF result and historical INT8 result remain distinct artifacts. A [BF16 restart probe](../../../e2e_expansion_20260924/evidence/spark_bf16_wsl_cpu/restart_branch_report.json) cancelled after eight token events, observed no late output, rejected the retired session handle and reproduced the exact 128-token sequence in a fresh session. None establishes broad text quality, incremental GGUF token streaming, concurrent recovery, loading peak or sustained performance. | Broaden text quality and context, qualify a matching Omni/vLLM version pair, then test incremental streaming, concurrent recovery and sustained load; [GGUF evidence](../../../e2e_expansion_20260923/evidence/spark_omni_wsl_cpu/README.md) and [BF16 evidence](../../../e2e_expansion_20260924/evidence/spark_bf16_wsl_cpu/README.md). |
| PC HX370: CPU / WSL | Qwen3-TTS 0.6B CustomVoice | SCOPED_E2E_OMNI_COMPLETE_REQUEST | The earlier vLLM 0.28 CPU path passed four short streams but had four simulated playback underruns in one measured request; its wheel remains mismatched with Omni 0.29. Separately, the pinned BF16 0.6B CustomVoice checkpoint ran two named text-to-complete-WAV requests through an Omni 0.29 whole-session stage with an isolated CPU worker on WSL. One warmup plus 20 serial measured requests returned identical 3.44 s audio; nearest-rank complete-request wall p50/p95 was 8.27/8.47 s (RTF 2.40/2.46), excluding 19.82 s startup. Pinned Whisper tiny.en transcribed the first measured WAV exactly (WER 0, one-output intelligibility proxy). Public `AsyncOmni` audio output passed; the stage verified weights, interpreter and CPU placement, reserved 10 GiB host RAM, refused 4 GiB before launch, and drained in-flight cancellation with zero remaining reservation. WSL PCM differs from the same-checkpoint native Windows outputs despite the declared settings; its cause is unqualified. Sampled process-tree RSS reached 3.39 GB, not a loading peak. This worker delivers only a complete WAV, not a playable stream. | Qualify cross-OS numerical/quality difference, playable streaming without underruns, post-cancel restart, loading peak, concurrency and sustained power/thermal behavior; [WSL Omni raw evidence](../../../e2e_expansion_20260923/evidence/qwen_tts_omni_wsl_cpu/README.md), [earlier stream evidence](../../../e2e_recovery_20260923/README.md). |
| PC HX370: CPU / WSL | Qwen3.8-27B | NOT_E2E_PROFILEABLE | No compatible CPU artifact/deployment for this model was found in the checked model roots. Available Qwen 27B FP8/NVFP4 CUDA artifacts do not establish a CPU route. | Supply and validate the missing matching artifact/backend, then run the complete specified workload. |
| PC HX370: CPU / WSL | MiniCPM-o 4.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST | The BF16/vLLM 0.28 three-stage path previously passed separate text, synthetic red-square image and synthetic 440 Hz audio inputs to text+speech; its 20-request serial **text-only** profile was p50/p95 21.86/22.97 s with swap and shutdown warnings. A separate pinned Q4_K_M/F16 GGUF worker now runs a **combined spoken question+image → text+speech** request through a bounded Omni StageRuntime/StagePool graph stage on WSL CPU, with installed vLLM 0.29 for the controller and CPU-only C++ model execution. All 20 measured requests after one warmup answered “The square in the image is red.”, emitted complete nonzero speech and a terminal audio event; nearest-rank complete-request wall p50/p95 was 22.67/24.83 s, speech duration 1.60–2.92 s, and maximum sampled worker RSS 13.70 GB. The first measured WAV independently transcribed exactly with pinned Whisper tiny.en (WER 0, one-output intelligibility proxy). Ten weight hashes and CPU placement were verified; 24 GiB shared RAM was reserved, 8 GiB was refused before launch, and in-flight cancellation left no stale output or reservation. Host RAM/swap samples covered only part of the profile. One synthetic fixture and variable speech PCM do not establish general quality, playable streaming, loading peak or sustained performance. | Validate real image/audio suites, speech alignment and quality, video input, concurrent admission, post-cancel restart, loading peak and sustained thermal behavior; [GGUF Omni raw evidence](../../../e2e_expansion_20260923/evidence/minicpmo_omni_wsl_cpu/README.md), [BF16/vLLM CPU evidence](../../../e2e_expansion_20260923/README.md), [earlier standalone GGUF run](../../../e2e_expansion_20260923/evidence/minicpmo_cpp_cpu/README.md). |
@@ -100,12 +100,12 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i
| PC Snapdragon X Elite CRD / AI Hub | MiniCPM-o 4.5 | COMPONENT_SPEECH_HEAD_NPU_NUMERIC_PROFILED; NOT_E2E_PROFILEABLE | The real 20-layer MiniCPM-o speech-head FP16 QNN DLC ran on the exact X Elite CRD. Same-fixture inference returned 41 finite tensors, preserved ONNX CPU top-1 speech token 1867, and had 0.3170% logits relative L2 and 1.221% maximum K/V relative L2. Its 100-sample component profile had nearest-rank p50/p95 9.905/11.037 ms, with all 944 execution-detail rows on NPU. Reported inference peak memory was 79,208,448 bytes and first-load peak 1,081,573,376 bytes. Thinker/encoders/vocoder and a device-local stateful Omni backend remain unqualified. | Validate the complete multimodal pipeline, state, quality, co-resident memory and sustained behavior; [X Elite raw evidence](../../../e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md). |
| PC Snapdragon X Elite CRD / AI Hub | InternVLA-A1 | COMPONENT_COSMOS_NPU_NUMERIC_PROFILED; NOT_E2E_PROFILEABLE | The real Place_Markpen Cosmos FP16 QNN image encoder returned a finite FP32 latent for the six-frame synthetic pattern on exact X Elite CRD. Against the pinned source, relative L2 was 0.0608%, SNR 64.32 dB and cosine 0.999999815. The 100-sample six-frame encoder profile had p50/p95 82.939/83.837 ms, with all 121 execution-detail rows on NPU. Reported component inference peak memory was 24,059,904 bytes and first-load peak 692,891,648 bytes. No real-observation action tolerance, complete policy or local stateful Omni backend exists. | Validate real observations, action units/timing, state, admission, cancellation and sustained behavior; [X Elite Cosmos raw evidence](../../../e2e_expansion_20260924/evidence/internvla_cosmos_qualcomm/README.md). |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | Spark-X2.5 | COMPONENT_NPU_INFERENCE_PROFILED; NOT_E2E_PROFILEABLE | The real 1.7B checkpoint one-layer W8A16 full-attention decoder artifact executed for a fixed 1,024-token cache bucket. Same-fixture outputs matched S24; the hosted S25 profile had 100 component samples at nearest-rank p50/p95 0.957/1.028 ms with all 73 execution-detail rows on NPU. FP32-source hidden-state relative L2 was 1.351% without a downstream token-quality gate. No full 28-layer prefill/decode, KV/ring, sampling or resident controller ran on S25. | Implement and validate local 128-token generation, 512/1024 transitions, cancellation, resident memory and sustained power; [S25/S24 component evidence](../../../e2e_expansion_20260923/evidence/spark_s24_full_attention/README.md). |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | Qwen3-TTS 0.6B CustomVoice | TALKER_FP16_NUMERIC_FAIL; CPU_TALKER_AND_VOCODER_NUMERIC_PROFILED; QNN_VOCODER_MEMORY_FAIL; SHORT_TFLITE_MIXED_COMPONENT_PROFILED; NOT_E2E_PROFILEABLE | Fresh FP16 predictor inference passed; its one output exactly matches the same compiled artifact/dataset reference. The same historical S25 TFLite vocoder target requested on CPU returned a finite unsaturated waveform at 4.04e-6 relative L2 / 107.86 dB SNR versus original ONNX CPU on the retained fixture. Its 100-sample component profile measured nearest-rank p50/p95 4.418/4.641 s, with all 738 execution-detail rows on CPU and reported inference peak memory 867,893,248 bytes. A separate 28-layer TFLite CPU-requested talker step returned 57 finite outputs, preserved ONNX CPU top-1 speech token 80, and had logits relative L2 3.33e-5 and maximum new-cache relative L2 3.41e-5. Its 100-sample component profile measured p50/p95 30.161/31.301 ms, with all 1,800 execution-detail rows on CPU and reported inference peak memory 1,929,318,400 bytes. The FP16 QNN talker step executed on the synthetic cache fixture but changed CPU top-1 speech token 80 to 412 with 8.99% logits relative L2 and maximum new-K/V relative L2 11.71%. A separately compiled FP16 QNN DLC talker also changed top-1 to 1720 with 8.77% logits relative L2 and 11.27% maximum new-cache relative L2. Both tested NPU talker artifacts are numerically unqualified. A fresh 25-frame FP16 QNN DLC vocoder compiled for S25, but its NPU-requested inference failed when Workbench reported device memory limits; it returned no waveform or profile samples. A [two-frame short-window export](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s25/qnn_short_chunk/README.md) matched local ONNX CPU at 2.96e-6 relative L2, then its separately compiled S25 FP16 QNN DLC also failed NPU-requested inference with the same reported device-memory limit. Its local HX370 WSL CPU component p50/p95 was 1.365/1.453 s to produce 0.16 s audio, not an S25 estimate. A separate [two-frame TFLite GPU-requested inference](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s25/tflite_short_chunk/README.md) returned finite unsaturated audio at 2.325% relative L2 / 32.67 dB SNR versus local ONNX CPU on one fixture; its 100-sample placement profile measured p50/p95 0.559/1.052 s for 0.16 s audio, with 403 CPU and 335 GPU execution-detail rows and 379,121,664 bytes reported peak. The mixed CPU/GPU component median RTF is 3.49; listening quality and playable streaming remain open. No complete co-resident NPU/GPU stream exists. | Improve and revalidate the [talker artifact](../../../e2e_expansion_20260924/evidence/qwen_tts_talker_qualcomm/README.md), then qualify the [device-local predictor/vocoder pipeline](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/README.md), output quality, recovery and 30-minute thermal behavior. |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | Qwen3-TTS 0.6B CustomVoice | TALKER_FP16_NUMERIC_FAIL; CPU_TALKER_AND_VOCODER_NUMERIC_PROFILED; QNN_VOCODER_MEMORY_FAIL; FULL_TFLITE_MIXED_COMPONENT_PROFILED; SHORT_TFLITE_MIXED_COMPONENT_PROFILED; NOT_E2E_PROFILEABLE | Fresh FP16 predictor inference passed; its one output exactly matches the same compiled artifact/dataset reference. The same historical S25 TFLite vocoder target requested on CPU returned a finite unsaturated waveform at 4.04e-6 relative L2 / 107.86 dB SNR versus original ONNX CPU on the retained fixture. Its 100-sample component profile measured nearest-rank p50/p95 4.418/4.641 s, with all 738 execution-detail rows on CPU and reported inference peak memory 867,893,248 bytes. A separate 28-layer TFLite CPU-requested talker step returned 57 finite outputs, preserved ONNX CPU top-1 speech token 80, and had logits relative L2 3.33e-5 and maximum new-cache relative L2 3.41e-5. Its 100-sample component profile measured p50/p95 30.161/31.301 ms, with all 1,800 execution-detail rows on CPU and reported inference peak memory 1,929,318,400 bytes. The FP16 QNN talker step executed on the synthetic cache fixture but changed CPU top-1 speech token 80 to 412 with 8.99% logits relative L2 and maximum new-K/V relative L2 11.71%. A separately compiled FP16 QNN DLC talker also changed top-1 to 1720 with 8.77% logits relative L2 and 11.27% maximum new-cache relative L2. Both tested NPU talker artifacts are numerically unqualified. A fresh 25-frame FP16 QNN DLC vocoder compiled for S25, but its NPU-requested inference failed when Workbench reported device memory limits; it returned no waveform or profile samples. A [two-frame short-window export](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s25/qnn_short_chunk/README.md) matched local ONNX CPU at 2.96e-6 relative L2, then its separately compiled S25 FP16 QNN DLC also failed NPU-requested inference with the same reported device-memory limit. Its local HX370 WSL CPU component p50/p95 was 1.365/1.453 s to produce 0.16 s audio, not an S25 estimate. A separate [two-frame TFLite GPU-requested inference](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s25/tflite_short_chunk/README.md) returned finite unsaturated audio at 2.325% relative L2 / 32.67 dB SNR versus local ONNX CPU on one fixture; its 100-sample placement profile measured p50/p95 0.559/1.052 s for 0.16 s audio, with 403 CPU and 335 GPU execution-detail rows and 379,121,664 bytes reported peak. The mixed CPU/GPU short component median RTF is 3.49. A separate [25-frame TFLite GPU-requested profile](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s25/full_tflite_gpu_profile/README.md) of the historical target measured 100 component samples at p50/p95 0.839/1.157 s for 2 s audio, with 403 CPU and 335 GPU rows, reported 374,591,488-byte peak and median component RTF 0.420. Its retained GPU waveform differed from ONNX CPU by 4.24% relative L2 on one fixture. A pinned CustomVoice eager 25-frame decoder matched the historical ONNX CPU waveform at 1.89e-6 relative L2 on that fixture, but the historical export revision and listening quality remain unverified. A fresh [revision-pinned 25-frame TFLite export](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s25/full_pinned_tflite/README.md) matched local eager CPU at 1.99e-6 relative L2 and compiled for S25; its GPU inference and placement profile are pending. No complete co-resident NPU/GPU stream exists. | Improve and revalidate the [talker artifact](../../../e2e_expansion_20260924/evidence/qwen_tts_talker_qualcomm/README.md), then qualify the [device-local predictor/vocoder pipeline](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/README.md), output quality, recovery and 30-minute thermal behavior. |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | Qwen3.8-27B | NOT_E2E_PROFILEABLE | No complete qualified target artifact and device-local stateful Omni backend. Hub jobs provide component execution, not an on-device generation/streaming controller; ADB has no attached device. | Supply and validate the missing matching artifact/backend, then run the complete specified workload. |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | MiniCPM-o 4.5 | COMPONENT_FP16_SPEECH_HEAD_NPU_NUMERIC_PROFILED; NOT_E2E_PROFILEABLE | Fresh FP16 speech-head inference passed; all 41 outputs exactly matched the same artifact/dataset reference. Against the recovered original ONNX CPU source on the same fixture, logits relative L2 was 0.3605%, maximum new-K/V relative L2 1.311%, and top-1 speech token 1867 matched. Historical FP16 parity passed; tested W8A16 top-1 parity failed. The 100-sample component profile had p50/p95 7.197/7.615 ms, with all 1,029 execution-detail rows on NPU and reported inference peak memory 185,991,168 bytes. Generated-audio quality and qualified thinker/encoders/vocoder remain unverified. | Qualify a complete mobile checkpoint/export and the full multimodal/stateful pipeline; [speech-head evidence](../../../e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md). |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | InternVLA-A1 | COMPONENT_COSMOS_NPU_NUMERIC_PROFILED; SYNTHETIC_ACTION_SENSITIVITY_MEASURED; NOT_E2E_PROFILEABLE | The real Place_Markpen Cosmos image encoder FP32 ONNX export matched its source on two six-frame fixtures. Galaxy S25 FP16 QNN DLC inference returned a finite latent within 0.0524% relative L2 / 65.61 dB SNR of the pinned pattern source. Injecting this device latent into the same real policy on local CPU changed synthetic `[1,50,32]` actions by 0.742% relative L2; the CPU source repeated bitwise identically. The 100-sample six-frame encoder profile had nearest-rank p50/p95 49.665/51.382 ms, all 121 execution-detail rows on NPU, and a reported inference peak of 158,232,576 bytes. No real-observation task tolerance exists, and the action policy was not resident on S25. ADB has no attached device. | Extend the [S25 encoder component](../../../e2e_expansion_20260924/evidence/internvla_cosmos_qualcomm/README.md), then validate real action quality, device-local state, admission, cancellation and sustained behavior. |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | Spark-X2.5 | COMPONENT_NPU_INFERENCE_PROFILED; NOT_E2E_PROFILEABLE | The real 1.7B checkpoint's fixed-shape full-attention decoder **one-layer** W8A16 QDQ artifact compiled as QNN DLC and ran on an exact hosted Galaxy S24 (Android 14). A same-dataset inference returned finite hidden/new-K/new-V outputs identical to the prior S25 NPU outputs; the profile attributed all 73 execution-detail rows to NPU. Across 100 component samples, nearest-rank p50/p95 was 1.109/1.205 ms; the 1.098 ms `estimated_inference_time` field is the minimum, not a median. Relative L2 versus original FP32 ONNX CPU was 1.351%/0.377%/0.650% for hidden/K/V; no token-quality tolerance is known. This is one cache bucket, not 28-layer prefill/decode, KV-ring, sampling, a resident local controller or complete-request timing. ADB has no attached device. | Qualify a complete device-resident artifact/controller with state and token-quality gates, 128-token generation across 512/1024 context transitions, admission/cancel and sustained memory/power; [S24 NPU raw evidence](../../../e2e_expansion_20260923/evidence/spark_s24_full_attention/README.md). |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | Qwen3-TTS 0.6B CustomVoice | TALKER_FP16_NUMERIC_FAIL; CPU_TALKER_AND_VOCODER_NUMERIC_PROFILED; NOT_E2E_PROFILEABLE | A TFLite vocoder target compiled for exact S24 returned a finite, unsaturated CPU-requested waveform matching original ONNX CPU within 4.04e-6 relative L2 / 107.86 dB SNR on the retained fixture. Its 100-sample component profile measured p50/p95 4.826/4.958 s, all 738 execution-detail rows on CPU, and reported inference peak memory 851,140,608 bytes. A separate TFLite CPU-requested 28-layer talker step returned 57 finite outputs, preserved ONNX CPU top-1 speech token 80, and had logits relative L2 3.33e-5 and maximum new-cache relative L2 3.41e-5. Its 100-sample component profile measured p50/p95 36.976/43.264 ms with all 1,800 execution-detail rows on CPU and reported inference peak memory 1,922,400,256 bytes. The FP16 QNN talker step executed on the same synthetic cache fixture, but changed CPU top-1 speech token 80 to 1720 with 9.33% logits relative L2 and maximum new-K/V relative L2 11.23%. This differs from an earlier FP16 decoder parity test (39.13 dB SNR) on a different component/fixture; the tested INT8 decoder parity failed with negative SNR. No full local TTS stream exists. | Investigate the [FP16 NPU talker numerical difference](../../../e2e_expansion_20260924/evidence/qwen_tts_talker_qualcomm/README.md), then validate the [complete local pipeline](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/README.md) and a quality-passing artifact set. |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | Qwen3-TTS 0.6B CustomVoice | TALKER_FP16_NUMERIC_FAIL; SHORT_GPU_VOCODER_NUMERIC_FAIL_PROFILED; CPU_TALKER_AND_VOCODER_NUMERIC_PROFILED; NOT_E2E_PROFILEABLE | A TFLite vocoder target compiled for exact S24 returned a finite, unsaturated CPU-requested waveform matching original ONNX CPU within 4.04e-6 relative L2 / 107.86 dB SNR on the retained fixture. Its 100-sample component profile measured p50/p95 4.826/4.958 s, all 738 execution-detail rows on CPU, and reported inference peak memory 851,140,608 bytes. A separate TFLite CPU-requested 28-layer talker step returned 57 finite outputs, preserved ONNX CPU top-1 speech token 80, and had logits relative L2 3.33e-5 and maximum new-cache relative L2 3.41e-5. Its 100-sample component profile measured p50/p95 36.976/43.264 ms with all 1,800 execution-detail rows on CPU and reported inference peak memory 1,922,400,256 bytes. The FP16 QNN talker step executed on the same synthetic cache fixture, but changed CPU top-1 speech token 80 to 1720 with 9.33% logits relative L2 and maximum new-K/V relative L2 11.23%. This differs from an earlier FP16 decoder parity test (39.13 dB SNR) on a different component/fixture; the tested INT8 decoder parity failed with negative SNR. A [pinned two-frame S24 TFLite attempt](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s24/tflite_short_chunk/README.md) preserved the waveform on a CPU-requested route at 5.75e-6 relative L2, but its GPU-requested output was fully saturated at 24.218 relative L2 / −27.68 dB SNR versus local ONNX CPU. The short CPU route measured 100 component samples at p50/p95 3.433/3.873 s for 0.16 s audio, with all 738 node rows on CPU and median component RTF 21.46. The GPU-requested route measured 100 samples at 0.601/0.895 s with 403 CPU and 335 GPU rows, but its waveform failed the gross numerical gate and the timing is not usable TTS performance. A FP32-preserving GPU control () returned a waveform bitwise identical to the fully saturated default GPU output, so that option did not repair this artifact. No full local TTS stream exists. | Investigate the [FP16 NPU talker numerical difference](../../../e2e_expansion_20260924/evidence/qwen_tts_talker_qualcomm/README.md), then validate the [complete local pipeline](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/README.md) and a quality-passing artifact set. |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | Qwen3.8-27B | NOT_E2E_PROFILEABLE | No complete qualified target artifact and device-local stateful Omni backend. Hub jobs provide component execution, not an on-device generation/streaming controller; ADB has no attached device. | Supply and validate the missing matching artifact/backend, then run the complete specified workload. |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | MiniCPM-o 4.5 | COMPONENT_FP16_SPEECH_HEAD_NPU_NUMERIC_PROFILED; NOT_E2E_PROFILEABLE | The retained FP16 speech-head job used a dataset with identical tensors to the recovered S25 fixture. Against original ONNX CPU, logits relative L2 was 0.3459%, maximum new-K/V relative L2 1.235%, and top-1 speech token 1867 matched. Earlier parity reported 49.22 dB SNR/top-1 match; tested W8A16 top-1 failed. The 100-sample component profile had p50/p95 8.537/9.006 ms, with all 1,029 execution-detail rows on NPU and reported inference peak memory 165,433,344 bytes. Generated-audio quality and the rest of the model remain unqualified. | Qualify thinker/encoders/vocoder and stateful local integration; [speech-head evidence](../../../e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md). |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | InternVLA-A1 | COMPONENT_COSMOS_NPU_NUMERIC_PROFILED; NOT_E2E_PROFILEABLE | The real Place_Markpen Cosmos FP16 QNN image encoder returned a finite six-frame synthetic-pattern latent on exact hosted S24 at 0.0613% relative L2 / 64.25 dB SNR versus pinned FP32 source. Its 100-sample six-frame component profile had nearest-rank p50/p95 64.314/67.472 ms, all 121 execution-detail rows on NPU, reported inference peak memory 309,661,696 bytes and first-load peak 712,884,224 bytes. Injecting its latent into the real policy on local CPU changed synthetic actions by 0.631% relative L2, without a task tolerance. No real-observation action tolerance, complete local policy or stateful controller exists. ADB has no attached device. | Validate real observations, action units/timing, state, admission and cancellation on-device; [S24 Cosmos raw evidence](../../../e2e_expansion_20260924/evidence/internvla_cosmos_qualcomm/README.md). |
+28
View File
@@ -19,6 +19,10 @@ adds a complete pinned dense checkpoint to the fork-branch M0 text route. Twelve
one warmup plus 20 serial 64-token requests measured complete-request
p50/p95 **5.411/5.751 s** and TTFT **0.129/0.146 s** on HX370 WSL CPU.
This closes only the stated BF16 text workload, not M1 mobile generation.
An [M0 restart probe](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/spark_bf16_wsl_cpu/restart_branch_report.json)
then verified explicit stale-handle rejection after cancellation and exact
128-token greedy output in a fresh session, with no late event. Concurrent
recovery and sustained behavior remain open.
For M2, a [two-frame S25 vocoder export](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s25/qnn_short_chunk/README.md)
matched local eager/ONNX CPU on one fixed window, but its FP16 QNN DLC failed
NPU-requested inference at the hosted device-memory limit. The earlier
@@ -30,6 +34,30 @@ fixture. Its 100-sample component profile measured p50/p95 0.559/1.052 s
for 0.16 s audio, with 403 CPU and 335 GPU node rows and median component
RTF 3.49. It still needs listening quality and playable complete streaming
before M2 can advance.
The historical [25-frame S25 TFLite target](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s25/full_tflite_gpu_profile/README.md)
has a new mixed CPU/GPU component p50/p95 of 0.839/1.157 s for 2 s audio,
median RTF 0.420. This is the stronger throughput candidate, but its retained
waveform differs from ONNX CPU by 4.24% relative L2 on one synthetic fixture,
its source revision is not attested, and no co-resident talker/predictor stream
or listening-quality gate passed.
The pinned current CustomVoice eager decoder matched that 25-frame ONNX CPU
waveform at 1.89e-6 relative L2 on the same fixture, narrowing the model
continuity question without proving the historical export revision.
A [fresh revision-pinned 25-frame export](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s25/full_pinned_tflite/README.md)
now matches local eager CPU at 1.99e-6 relative L2 and has compiled for S25
TFLite. Its GPU-requested numerical inference and node-placement profile are
pending. This avoids promoting the historical artifact's timing to a
revision-qualified deployment claim.
On [Galaxy S24](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/s24/tflite_short_chunk/README.md),
the same pinned two-frame TFLite source passed CPU-requested waveform parity
at 5.75e-6 relative L2, but the GPU-requested waveform saturated completely
at 24.218 relative L2. The 100-sample short CPU component p50/p95 was
3.433/3.873 s for 0.16 s audio (median RTF 21.46); the mixed CPU/GPU route
measured 0.601/0.895 s but failed the waveform gate. A FP32-preserving GPU
option returned the same saturated waveform bitwise, so it did not repair
the tested delegate artifact. A [Snapdragon X Elite short QNN graph](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/xelite/qnn_short_chunk/README.md)
compiled, with NPU-requested inference pending. Neither changes M2 support
depth before full stream and quality gates.
The [Spark hosted Qualcomm component expansion](../../benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/spark_s24_full_attention/README.md) advances M1 only to one real fixed-shape decoder attention layer. The same W8A16 QNN DLC ran on S24, Snapdragon X Elite CRD and SA8775P ADP NPUs with identical outputs on one pinned fixture; S25 had prior separate component evidence. On [RB3 Gen 2](../../benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/spark_rb3_full_attention/README.md), the tested W8A16 graph failed QNN loading even after an exact-device compile. FP32 ONNX ran on CPU with near-source parity, while calibrated W8A8 ran on NPU but had 20.9% hidden-state relative L2 and remains numerically unqualified. These are component C results, not full M1: device-local 28-layer prefill/continuous decode, KV/ring, sampling, token quality, admission/cancellation, complete-request timing and sustained power/thermal gates remain open. AI Hub is the test facility, not a deployment dependency.