Measure AMD NPU TTS predecoder handoff quality
This commit is contained in:
1 parent
d174d2f47b
commit
b544cc75d3
24 files changed
+593
-11
No files matched your search
@@ -124,12 +124,22 @@ def probe(args: argparse.Namespace) -> None:
|
||||
devices = [device for device in ort.get_ep_devices()
|
||||
if device.ep_name == "vitisai" and str(device.device.type).endswith("NPU")]
|
||||
report["vitisai_npu_device_count"] = len(devices)
|
||||
provider_options: dict[str, str] = {}
|
||||
if args.config_file is not None:
|
||||
if args.expected_config_sha256 is None:
|
||||
raise ValueError("expected config hash is required")
|
||||
config_hash = sha256(args.config_file)
|
||||
if config_hash != args.expected_config_sha256:
|
||||
raise ValueError("VitisAI config hash changed")
|
||||
provider_options["config_file"] = str(args.config_file.resolve(strict=True))
|
||||
report["vitisai_config_sha256"] = config_hash
|
||||
report["vitisai_config_file"] = provider_options["config_file"]
|
||||
report["status"] = "vitisai_session_creation_started"
|
||||
write_report(args.report, report)
|
||||
if not devices:
|
||||
raise RuntimeError("VitisAI EP did not expose an NPU device")
|
||||
options = ort.SessionOptions()
|
||||
options.add_provider_for_devices(devices, {})
|
||||
options.add_provider_for_devices(devices, provider_options)
|
||||
options.enable_profiling = True
|
||||
options.profile_file_prefix = str(args.profile_prefix)
|
||||
started = time.perf_counter()
|
||||
@@ -146,6 +156,13 @@ def probe(args: argparse.Namespace) -> None:
|
||||
report["relative_l2_vs_cpu"] = float(
|
||||
np.linalg.norm((actual - cpu_output).astype(np.float64))
|
||||
/ max(np.linalg.norm(cpu_output.astype(np.float64)), 1e-12))
|
||||
if args.save_output is not None:
|
||||
if args.save_output.suffix.lower() != ".npz":
|
||||
raise ValueError("paired output path must end in .npz")
|
||||
args.save_output.parent.mkdir(parents=True, exist_ok=True)
|
||||
np.savez_compressed(args.save_output, cpu=cpu_output, npu=actual)
|
||||
report["paired_output_file"] = str(args.save_output.resolve())
|
||||
report["paired_output_sha256"] = sha256(args.save_output)
|
||||
profile_path = Path(session.end_profiling())
|
||||
report["profile_file"] = str(profile_path)
|
||||
events = json.loads(profile_path.read_text(encoding="utf-8"))
|
||||
@@ -183,6 +200,9 @@ def main() -> None:
|
||||
execution.add_argument("--ep-dir", type=Path, required=True)
|
||||
execution.add_argument("--report", type=Path, required=True)
|
||||
execution.add_argument("--profile-prefix", type=Path, required=True)
|
||||
execution.add_argument("--config-file", type=Path)
|
||||
execution.add_argument("--expected-config-sha256")
|
||||
execution.add_argument("--save-output", type=Path)
|
||||
execution.add_argument("--cpu-only", action="store_true")
|
||||
args = parser.parse_args()
|
||||
(extract if args.command == "extract" else probe)(args)
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Measure waveform impact of an AMD NPU prefix handed to the original CPU decoder."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import platform
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
|
||||
|
||||
def sha256(path: Path) -> str:
|
||||
digest = hashlib.sha256()
|
||||
with path.open("rb") as source:
|
||||
for block in iter(lambda: source.read(8 << 20), b""):
|
||||
digest.update(block)
|
||||
return digest.hexdigest()
|
||||
|
||||
|
||||
def compare(reference: np.ndarray, actual: np.ndarray) -> dict:
|
||||
if reference.shape != actual.shape:
|
||||
raise ValueError("waveform shape changed")
|
||||
delta = actual.astype(np.float64) - reference.astype(np.float64)
|
||||
relative_l2 = float(np.linalg.norm(delta) / max(
|
||||
np.linalg.norm(reference.astype(np.float64)), 1e-12))
|
||||
return {
|
||||
"finite": bool(np.isfinite(actual).all()),
|
||||
"relative_l2": relative_l2,
|
||||
"snr_db": float(-20 * np.log10(max(relative_l2, 1e-12))),
|
||||
"max_absolute_error": float(np.max(np.abs(delta))),
|
||||
"saturation_fraction": float(np.mean(np.abs(actual) >= 0.999)),
|
||||
}
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
for name in ("decoder", "paired-activations", "reference", "report", "waves"):
|
||||
parser.add_argument(f"--{name}", type=Path, required=True)
|
||||
for name in ("decoder", "paired-activations", "reference"):
|
||||
parser.add_argument(f"--expected-{name}-sha256", required=True)
|
||||
args = parser.parse_args()
|
||||
import onnxruntime as ort
|
||||
|
||||
hashes = {
|
||||
"decoder": sha256(args.decoder),
|
||||
"paired_activations": sha256(args.paired_activations),
|
||||
"reference": sha256(args.reference),
|
||||
}
|
||||
for name, actual in hashes.items():
|
||||
expected = getattr(args, f"expected_{name}_sha256")
|
||||
if actual != expected:
|
||||
raise ValueError(f"{name} hash changed")
|
||||
with np.load(args.paired_activations, allow_pickle=False) as pair:
|
||||
if set(pair.files) != {"cpu", "npu"}:
|
||||
raise ValueError("paired activation schema changed")
|
||||
cpu_activation = np.ascontiguousarray(pair["cpu"])
|
||||
npu_activation = np.ascontiguousarray(pair["npu"])
|
||||
with np.load(args.reference, allow_pickle=False) as source:
|
||||
if source.files != ["wav"]:
|
||||
raise ValueError("reference schema changed")
|
||||
reference = np.asarray(source["wav"])
|
||||
if cpu_activation.shape != (1, 1024, 74) or npu_activation.shape != cpu_activation.shape:
|
||||
raise ValueError("boundary activation shape changed")
|
||||
if cpu_activation.dtype != np.float32 or npu_activation.dtype != np.float32:
|
||||
raise ValueError("boundary activation dtype changed")
|
||||
if reference.shape != (1, 3840) or reference.dtype != np.float32:
|
||||
raise ValueError("reference waveform contract changed")
|
||||
|
||||
started = time.perf_counter()
|
||||
decoder = ort.InferenceSession(str(args.decoder), providers=["CPUExecutionProvider"])
|
||||
load_s = time.perf_counter() - started
|
||||
inputs = decoder.get_inputs()
|
||||
if len(inputs) != 1 or inputs[0].shape != [1, 1024, 74]:
|
||||
raise ValueError("decoder input contract changed")
|
||||
input_name = inputs[0].name
|
||||
started = time.perf_counter()
|
||||
cpu_wave = decoder.run(None, {input_name: cpu_activation})[0]
|
||||
cpu_inference_s = time.perf_counter() - started
|
||||
started = time.perf_counter()
|
||||
hybrid_wave = decoder.run(None, {input_name: npu_activation})[0]
|
||||
hybrid_inference_s = time.perf_counter() - started
|
||||
cpu_vs_reference = compare(reference, cpu_wave)
|
||||
if not cpu_vs_reference["finite"] or cpu_vs_reference["relative_l2"] > 1e-4:
|
||||
raise ValueError("CPU prefix plus decoder fails retained waveform parity")
|
||||
hybrid_vs_cpu = compare(cpu_wave, hybrid_wave)
|
||||
hybrid_vs_reference = compare(reference, hybrid_wave)
|
||||
args.waves.parent.mkdir(parents=True, exist_ok=True)
|
||||
np.savez_compressed(args.waves, cpu=cpu_wave, hybrid=hybrid_wave)
|
||||
report = {
|
||||
"scope": "one fixed two-frame Code2Wav component, NPU prefix to CPU decoder; not full TTS",
|
||||
"host": platform.platform(),
|
||||
"onnxruntime_version": ort.__version__,
|
||||
"artifact_sha256": hashes,
|
||||
"waves_file": str(args.waves.resolve()),
|
||||
"waves_sha256": sha256(args.waves),
|
||||
"decoder_load_s": load_s,
|
||||
"cpu_prefix_cpu_decoder_inference_s": cpu_inference_s,
|
||||
"npu_prefix_cpu_decoder_inference_s": hybrid_inference_s,
|
||||
"cpu_prefix_cpu_decoder_vs_reference": cpu_vs_reference,
|
||||
"npu_prefix_cpu_decoder_vs_cpu": hybrid_vs_cpu,
|
||||
"npu_prefix_cpu_decoder_vs_reference": hybrid_vs_reference,
|
||||
"numeric_disposition": (
|
||||
"single_fixture_waveform_gate_pass"
|
||||
if hybrid_vs_cpu["finite"]
|
||||
and hybrid_vs_cpu["relative_l2"] <= 0.01
|
||||
and hybrid_vs_cpu["saturation_fraction"] < 0.01
|
||||
else "single_fixture_waveform_gate_failed"
|
||||
),
|
||||
}
|
||||
args.report.parent.mkdir(parents=True, exist_ok=True)
|
||||
args.report.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
|
||||
print(json.dumps({"numeric_disposition": report["numeric_disposition"],
|
||||
"relative_l2": hybrid_vs_cpu["relative_l2"]}))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -117,7 +117,7 @@ attributed all 728 rows to NPU, but p50/p95 was **3.662/3.676 s** for
|
||||
0.16 s audio (median component RTF **22.89**). These are component-only
|
||||
results and the short NPU vocoder is too slow for playable streaming.
|
||||
|
||||
A separate [HX370 AMD NPU Code2Wav study](evidence/qwen_tts_amd_npu_vocoder/README.md) tested the real-weight 25-frame and pinned two-frame FP32 ONNX exports on native Windows. Both matched retained ORT CPU waveforms within 1.05e-6 relative L2, but AMD VitisAI EP 1.8.63.0 aborted during full-graph compilation. Isolating the first decoder ConvTranspose1d reproduced the native assertion; equivalent size-one-height ConvTranspose2d compiled and executed on the NPU. Four real-weight prefixes through source node 200 also ran on NPU with 0.391-1.083% one-fixture intermediate differences versus CPU. Rewriting all six upsampling convolutions kept the complete two-frame CPU waveform bitwise identical. The rewritten short graph completed with two VitisAI and 139 CPU node events, but its one-fixture waveform differed 15.696% relative L2 / 16.08 dB SNR from CPU after a 2515 s session build; its single cold inference took 2.205 s for 0.16 s audio. It failed the numerical gate and does not qualify a complete TTS stream. The cell remains NOT E2E.
|
||||
A separate [HX370 AMD NPU Code2Wav study](evidence/qwen_tts_amd_npu_vocoder/README.md) tested the real-weight 25-frame and pinned two-frame FP32 ONNX exports on native Windows. Both matched retained ORT CPU waveforms within 1.05e-6 relative L2, but AMD VitisAI EP 1.8.63.0 aborted during full-graph compilation. Isolating the first decoder ConvTranspose1d reproduced the native assertion; equivalent size-one-height ConvTranspose2d compiled and executed on the NPU. Four real-weight prefixes through source node 200 also ran on NPU with 0.391-1.083% one-fixture intermediate differences versus CPU. Rewriting all six upsampling convolutions kept the complete two-frame CPU waveform bitwise identical. The rewritten short graph completed with two VitisAI and 139 CPU node events, but its one-fixture waveform differed 15.696% relative L2 / 16.08 dB SNR from CPU after a 2515 s session build; its single cold inference took 2.205 s for 0.16 s audio. It failed the numerical gate. A real-weight pre-decoder NPU boundary was 2.265% relative L2 from CPU, and feeding that NPU tensor to the original CPU decoder produced a waveform 9.689% relative L2 from the CPU-boundary control. The prefix already fails the waveform gate. A documented unvectorized VitisAI layout control gave 2.287% boundary and 10.074% downstream waveform relative L2, so it did not repair the route; no complete TTS stream is qualified. The cell remains NOT E2E.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
+35
-7
@@ -101,14 +101,42 @@ VitisAI events) with exact CPU parity; the full graph likewise lists
|
||||
CPU sine nodes. That control identifies a real fallback boundary but
|
||||
does not by itself explain the 15.696% waveform difference.
|
||||
|
||||
A real-weight [cut at source node 486](cut486_probe_paired.json), just
|
||||
before the first decoder transposed convolution, executed one NPU
|
||||
partition and one CPU node. Its `[1,1024,74]` activation differed from
|
||||
CPU by **2.265% relative L2** on the pinned input. Feeding the captured
|
||||
CPU activation into the [original CPU decoder suffix](decoder_suffix_extract.json)
|
||||
reproduced the retained waveform at `1.05e-6` relative L2. Feeding
|
||||
the captured NPU activation through that **same** CPU decoder yielded a
|
||||
[waveform](boundary_handoff_report.json) **9.689% relative L2 /
|
||||
20.27 dB SNR** from the CPU-boundary control. The paired activations
|
||||
and output waveforms are pinned in the audit report. This is one
|
||||
fixed-shape component handoff, without streaming, representative
|
||||
quality or a warm performance profile.
|
||||
|
||||
The rewrite therefore fixes the isolated compiler crash and keeps CPU
|
||||
waveform behavior exact, but this mixed AMD NPU path fails numerical
|
||||
quality and is not a supported TTS stream. Next, identify which NPU
|
||||
partition or handoff causes the waveform difference, improve same-graph
|
||||
numerics without silent precision or model changes, and measure a
|
||||
useful coarse stage against CPU after warmup. Only then connect talker,
|
||||
codec, state, admission, cancellation and complete-stream quality
|
||||
through Omni.
|
||||
waveform behavior exact, but the NPU prefix already misses the waveform
|
||||
gate and the full mixed AMD NPU route differs still more. [AMD's
|
||||
model-support documentation](https://ryzenai.docs.amd.com/projects/WinML/en/latest/model_support.html)
|
||||
states that its VitisAI EP automatically converts float CNN and
|
||||
Transformer models to BF16 during compilation. That makes compiled
|
||||
precision a candidate explanation, **not a diagnosis established by
|
||||
these profiles**. An [unvectorized-layout control](cut486_unvectorized_probe.json)
|
||||
kept the same source graph, input and cut while setting AMD's
|
||||
[documented VitisAI option](https://ryzenai.docs.amd.com/projects/WinML/en/stable/modelrun.html)
|
||||
`preferred_data_storage=unvectorized` with `optimize_level=1`.
|
||||
It still executed one NPU partition and one CPU node, and its
|
||||
pre-decoder difference rose to **2.287%**. The
|
||||
[same CPU decoder handoff](boundary_unvectorized_handoff_report.json)
|
||||
produced a waveform **10.074%** from the CPU-boundary control.
|
||||
This setting did not fix the one-fixture quality failure.
|
||||
|
||||
Next, isolate which NPU prefix operations cause the boundary error,
|
||||
test a numerically justified precision or calibrated QDQ alternative
|
||||
against the same waveform gate, and measure a useful coarse stage
|
||||
against CPU after warmup. Only then connect talker, codec,
|
||||
state, admission, cancellation and complete-stream quality through
|
||||
Omni.
|
||||
The [extraction/probe tool](../../../../experiments/bisect_qwen_tts_vitisai_graph.py)
|
||||
records cut hashes, CPU execution, actual provider events and intermediate
|
||||
numerics. No precision, weights or checkpoint revision changed in the
|
||||
|
||||
+48
@@ -105,5 +105,53 @@
|
||||
"report": "local_sin0_probe.json",
|
||||
"profile": "local_sin0_profile_2026-09-24_19-51-29_472.json",
|
||||
"profile_sha256": "c3fa9cdeafc3b4e035cccd39b999cd63784cfe5644f5a2d311aab79041147cea"
|
||||
},
|
||||
"predecoder_cut486": {
|
||||
"scope": "one pinned two-frame fixture; original source output permute before first ConvTranspose",
|
||||
"extracted_nodes": 486,
|
||||
"source_model_sha256": "2f538d2f6b07fbfaccd98bc0e4976774aa24541fc29d4d7ba1a7231fe26ee2b7",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
1024,
|
||||
74
|
||||
],
|
||||
"vitisai_node_events": 1,
|
||||
"cpu_node_events": 1,
|
||||
"npu_vs_cpu_activation_relative_l2": 0.022648927310346952,
|
||||
"session_create_s": 309.33176179998554,
|
||||
"paired_activations": "cut486_paired_outputs.npz",
|
||||
"paired_activations_sha256": "8d63c79268917643514d45546f0902bd0eb645a90421d0a7f0dadcfadb420bc8",
|
||||
"report": "cut486_probe_paired.json",
|
||||
"profile": "cut486_profile_paired_2026-09-24_20-00-14_728.json",
|
||||
"profile_sha256": "334cf3b95ac80bb98ecf225c8b410bf0f056775297cf2afe2de59bed5ac0f8c4"
|
||||
},
|
||||
"original_cpu_decoder_handoff": {
|
||||
"scope": "same one pinned two-frame fixture; original ONNX decoder suffix run on CPU with CPU and NPU boundary activations",
|
||||
"decoder_sha256": "47197c1c1fdad6c4afc65a4debdbef4727be08dec16bfc7760449a6b7e4ad77d",
|
||||
"cpu_boundary_cpu_decoder_vs_reference_relative_l2": 1.0450898781329582e-06,
|
||||
"npu_boundary_cpu_decoder_vs_cpu_relative_l2": 0.09688616076322398,
|
||||
"npu_boundary_cpu_decoder_snr_db": 20.274765064433943,
|
||||
"numeric_disposition": "single_fixture_waveform_gate_failed",
|
||||
"waves": "boundary_cpu_decoder_waves.npz",
|
||||
"waves_sha256": "81fa2317524f6d31894e36a5d614d9984476fc9ad59b917d5f3b56c76e5bf111",
|
||||
"report": "boundary_handoff_report.json"
|
||||
},
|
||||
"predecoder_unvectorized_control": {
|
||||
"config": "vaiml_unvectorized_config.json",
|
||||
"config_sha256": "c25a757791e14fb4689999adb52c59fb9059c8d746634702d9b15f36a5ff57ef",
|
||||
"scope": "same pinned two-frame fixture and cut486; documented VitisAI preferred_data_storage=unvectorized, optimize_level=1",
|
||||
"npu_vs_cpu_activation_relative_l2": 0.022869136975246635,
|
||||
"npu_boundary_cpu_decoder_vs_cpu_waveform_relative_l2": 0.10074478283629539,
|
||||
"numeric_disposition": "single_fixture_waveform_gate_failed",
|
||||
"session_create_s": 350.0577001000056,
|
||||
"paired_activations": "cut486_unvectorized_paired.npz",
|
||||
"paired_activations_sha256": "dd959e80b929faff3f6c4b78ba3b1ddeb56ef12872f21647abf943e82683ab99",
|
||||
"waves": "boundary_unvectorized_cpu_decoder_waves.npz",
|
||||
"waves_sha256": "c865adca83c6c965ae04f87f582289dcb09eaebf0c4f29141210923812e4df97",
|
||||
"profile": "cut486_unvectorized_profile_2026-09-24_20-09-18_599.json",
|
||||
"profile_sha256": "aa4cd30bc246791d848ef209372520dbfa4505c3453f18fac404957ca4884ebc",
|
||||
"npu_report": "cut486_unvectorized_probe.json",
|
||||
"handoff_report": "boundary_unvectorized_handoff_report.json",
|
||||
"documentation": "https://ryzenai.docs.amd.com/projects/WinML/en/stable/modelrun.html"
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
+37
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"scope": "one fixed two-frame Code2Wav component, NPU prefix to CPU decoder; not full TTS",
|
||||
"host": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"artifact_sha256": {
|
||||
"decoder": "47197c1c1fdad6c4afc65a4debdbef4727be08dec16bfc7760449a6b7e4ad77d",
|
||||
"paired_activations": "8d63c79268917643514d45546f0902bd0eb645a90421d0a7f0dadcfadb420bc8",
|
||||
"reference": "989307db317d77be054f684211ae0c6a2fd24d93bcd74307c597fed430ba2a37"
|
||||
},
|
||||
"waves_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\vllm-omni-edge\\benchmarks\\edge_harness\\results\\e2e_expansion_20260924\\evidence\\qwen_tts_amd_npu_vocoder\\boundary_cpu_decoder_waves.npz",
|
||||
"waves_sha256": "81fa2317524f6d31894e36a5d614d9984476fc9ad59b917d5f3b56c76e5bf111",
|
||||
"decoder_load_s": 1.7740885000675917,
|
||||
"cpu_prefix_cpu_decoder_inference_s": 1.2925538000417873,
|
||||
"npu_prefix_cpu_decoder_inference_s": 1.2676387999672443,
|
||||
"cpu_prefix_cpu_decoder_vs_reference": {
|
||||
"finite": true,
|
||||
"relative_l2": 1.0450898781329582e-06,
|
||||
"snr_db": 119.61692716907409,
|
||||
"max_absolute_error": 3.948807716369629e-07,
|
||||
"saturation_fraction": 0.0
|
||||
},
|
||||
"npu_prefix_cpu_decoder_vs_cpu": {
|
||||
"finite": true,
|
||||
"relative_l2": 0.09688616076322398,
|
||||
"snr_db": 20.274765064433943,
|
||||
"max_absolute_error": 0.03578636050224304,
|
||||
"saturation_fraction": 0.0
|
||||
},
|
||||
"npu_prefix_cpu_decoder_vs_reference": {
|
||||
"finite": true,
|
||||
"relative_l2": 0.09688662758146023,
|
||||
"snr_db": 20.274723214061495,
|
||||
"max_absolute_error": 0.03578639030456543,
|
||||
"saturation_fraction": 0.0
|
||||
},
|
||||
"numeric_disposition": "single_fixture_waveform_gate_failed"
|
||||
}
|
||||
BIN
Binary file not shown.
+37
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"scope": "one fixed two-frame Code2Wav component, NPU prefix to CPU decoder; not full TTS",
|
||||
"host": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"artifact_sha256": {
|
||||
"decoder": "47197c1c1fdad6c4afc65a4debdbef4727be08dec16bfc7760449a6b7e4ad77d",
|
||||
"paired_activations": "dd959e80b929faff3f6c4b78ba3b1ddeb56ef12872f21647abf943e82683ab99",
|
||||
"reference": "989307db317d77be054f684211ae0c6a2fd24d93bcd74307c597fed430ba2a37"
|
||||
},
|
||||
"waves_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\vllm-omni-edge\\benchmarks\\edge_harness\\results\\e2e_expansion_20260924\\evidence\\qwen_tts_amd_npu_vocoder\\boundary_unvectorized_cpu_decoder_waves.npz",
|
||||
"waves_sha256": "c865adca83c6c965ae04f87f582289dcb09eaebf0c4f29141210923812e4df97",
|
||||
"decoder_load_s": 1.843498699949123,
|
||||
"cpu_prefix_cpu_decoder_inference_s": 1.5668787000468,
|
||||
"npu_prefix_cpu_decoder_inference_s": 1.5851562999887392,
|
||||
"cpu_prefix_cpu_decoder_vs_reference": {
|
||||
"finite": true,
|
||||
"relative_l2": 1.0450898781329582e-06,
|
||||
"snr_db": 119.61692716907409,
|
||||
"max_absolute_error": 3.948807716369629e-07,
|
||||
"saturation_fraction": 0.0
|
||||
},
|
||||
"npu_prefix_cpu_decoder_vs_cpu": {
|
||||
"finite": true,
|
||||
"relative_l2": 0.10074478283629539,
|
||||
"snr_db": 19.935548699086937,
|
||||
"max_absolute_error": 0.03414871357381344,
|
||||
"saturation_fraction": 0.0
|
||||
},
|
||||
"npu_prefix_cpu_decoder_vs_reference": {
|
||||
"finite": true,
|
||||
"relative_l2": 0.10074532000977492,
|
||||
"snr_db": 19.93550238584878,
|
||||
"max_absolute_error": 0.0341490525752306,
|
||||
"saturation_fraction": 0.0
|
||||
},
|
||||
"numeric_disposition": "single_fixture_waveform_gate_failed"
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 486,
|
||||
"terminal_node": "node_permute",
|
||||
"terminal_op": "Transpose",
|
||||
"terminal_output": "permute",
|
||||
"boundary_inputs": [
|
||||
"quantized"
|
||||
],
|
||||
"extracted_node_count": 486,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 42,
|
||||
"MatMul": 74,
|
||||
"Add": 59,
|
||||
"Pow": 17,
|
||||
"ReduceMean": 17,
|
||||
"Sqrt": 17,
|
||||
"Reciprocal": 17,
|
||||
"Mul": 114,
|
||||
"Reshape": 48,
|
||||
"Slice": 32,
|
||||
"Neg": 16,
|
||||
"Concat": 16,
|
||||
"Softmax": 8,
|
||||
"Sigmoid": 8
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 1024\n }\n dim {\n dim_value: 74\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut486_20260924.onnx",
|
||||
"candidate_bytes": 129699474,
|
||||
"candidate_sha256": "2f538d2f6b07fbfaccd98bc0e4976774aa24541fc29d4d7ba1a7231fe26ee2b7"
|
||||
}
|
||||
BIN
Binary file not shown.
+56
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 486,
|
||||
"terminal_node": "node_permute",
|
||||
"terminal_op": "Transpose",
|
||||
"terminal_output": "permute",
|
||||
"boundary_inputs": [
|
||||
"quantized"
|
||||
],
|
||||
"extracted_node_count": 486,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 42,
|
||||
"MatMul": 74,
|
||||
"Add": 59,
|
||||
"Pow": 17,
|
||||
"ReduceMean": 17,
|
||||
"Sqrt": 17,
|
||||
"Reciprocal": 17,
|
||||
"Mul": 114,
|
||||
"Reshape": 48,
|
||||
"Slice": 32,
|
||||
"Neg": 16,
|
||||
"Concat": 16,
|
||||
"Softmax": 8,
|
||||
"Sigmoid": 8
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 1024\n }\n dim {\n dim_value: 74\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut486_20260924.onnx",
|
||||
"candidate_bytes": 129699474,
|
||||
"candidate_sha256": "2f538d2f6b07fbfaccd98bc0e4976774aa24541fc29d4d7ba1a7231fe26ee2b7",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"fixture_sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55",
|
||||
"input_provenance": "pinned real-weight vocoder fixture",
|
||||
"status": "component_not_qualified",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
1024,
|
||||
74
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.017427499988116324,
|
||||
"vitisai_npu_device_count": 1,
|
||||
"vitisai_session_create_s": 339.4604613999836,
|
||||
"vitisai_inference_s": 0.02154380001593381,
|
||||
"vitisai_output_finite": true,
|
||||
"relative_l2_vs_cpu": 0.022648927310346952,
|
||||
"profile_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\vllm-omni-edge\\benchmarks\\edge_harness\\results\\e2e_expansion_20260924\\evidence\\qwen_tts_amd_npu_vocoder\\cut486_profile_2026-09-24_19-54-03_356.json",
|
||||
"node_providers": {
|
||||
"vitisai": 1,
|
||||
"CPUExecutionProvider": 1
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
+58
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 486,
|
||||
"terminal_node": "node_permute",
|
||||
"terminal_op": "Transpose",
|
||||
"terminal_output": "permute",
|
||||
"boundary_inputs": [
|
||||
"quantized"
|
||||
],
|
||||
"extracted_node_count": 486,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 42,
|
||||
"MatMul": 74,
|
||||
"Add": 59,
|
||||
"Pow": 17,
|
||||
"ReduceMean": 17,
|
||||
"Sqrt": 17,
|
||||
"Reciprocal": 17,
|
||||
"Mul": 114,
|
||||
"Reshape": 48,
|
||||
"Slice": 32,
|
||||
"Neg": 16,
|
||||
"Concat": 16,
|
||||
"Softmax": 8,
|
||||
"Sigmoid": 8
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 1024\n }\n dim {\n dim_value: 74\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut486_20260924.onnx",
|
||||
"candidate_bytes": 129699474,
|
||||
"candidate_sha256": "2f538d2f6b07fbfaccd98bc0e4976774aa24541fc29d4d7ba1a7231fe26ee2b7",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"fixture_sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55",
|
||||
"input_provenance": "pinned real-weight vocoder fixture",
|
||||
"status": "component_not_qualified",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
1024,
|
||||
74
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.01784169999882579,
|
||||
"vitisai_npu_device_count": 1,
|
||||
"vitisai_session_create_s": 309.33176179998554,
|
||||
"vitisai_inference_s": 0.020101799978874624,
|
||||
"vitisai_output_finite": true,
|
||||
"relative_l2_vs_cpu": 0.022648927310346952,
|
||||
"paired_output_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\vllm-omni-edge\\benchmarks\\edge_harness\\results\\e2e_expansion_20260924\\evidence\\qwen_tts_amd_npu_vocoder\\cut486_paired_outputs.npz",
|
||||
"paired_output_sha256": "8d63c79268917643514d45546f0902bd0eb645a90421d0a7f0dadcfadb420bc8",
|
||||
"profile_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\vllm-omni-edge\\benchmarks\\edge_harness\\results\\e2e_expansion_20260924\\evidence\\qwen_tts_amd_npu_vocoder\\cut486_profile_paired_2026-09-24_20-00-14_728.json",
|
||||
"node_providers": {
|
||||
"vitisai": 1,
|
||||
"CPUExecutionProvider": 1
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
+8
@@ -0,0 +1,8 @@
|
||||
[
|
||||
{"cat" : "Session","pid" :27912,"tid" :35288,"dur" :825421,"ts" :15,"ph" : "X","name" :"model_loading_uri","args" : {}},
|
||||
{"cat" : "Session","pid" :27912,"tid" :35288,"dur" :338630434,"ts" :826767,"ph" : "X","name" :"session_initialization","args" : {}},
|
||||
{"cat" : "Node","pid" :27912,"tid" :35288,"dur" :21065,"ts" :339465554,"ph" : "X","name" :"vitisai_vitisai_3215490424510764005_0_0_kernel_time","args" : {"mem_arena_held_delta" : "1048576","provider" : "vitisai","mem_in_use_delta" : "303104","output_type_shape" : [{"float":[1,74,1024]}],"parameter_size" : "0","mem_in_use_peak" : "303104","op_name" : "vitisai_3215490424510764005_0","output_size" : "303104","thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "35288", "block_size": [], "core": -1, "Distribution": 0, "DistributionEnqueue": 0, "Run": 0, "Wait": 0, "WaitRevoke": 0}, "sub_threads": {"22620": {"num_run": 0, "core": -1},"64428": {"num_run": 0, "core": -1},"33524": {"num_run": 0, "core": -1},"39208": {"num_run": 0, "core": -1},"52860": {"num_run": 0, "core": -1},"48380": {"num_run": 0, "core": -1},"9608": {"num_run": 0, "core": -1},"4192": {"num_run": 0, "core": -1},"57564": {"num_run": 0, "core": -1},"23772": {"num_run": 0, "core": -1},"64908": {"num_run": 0, "core": -1}}},"mem_arena_held" : "1048576","node_index" : "508","mem_requested_in_use_delta" : "303104","mem_bytes_in_use" : "303104","activation_size" : "151552","input_type_shape" : [{"float":[1,512,74]}],"mem_bytes_requested_in_use" : "303104"}},
|
||||
{"cat" : "Node","pid" :27912,"tid" :35288,"dur" :167,"ts" :339486637,"ph" : "X","name" :"node_permute_kernel_time","args" : {"output_type_shape" : [{"float":[1,1024,74]}],"output_size" : "303104","input_type_shape" : [{"float":[1,74,1024]}],"parameter_size" : "0","node_index" : "485","mem_in_use_delta" : "303104","mem_bytes_requested_in_use" : "606208","mem_requested_in_use_delta" : "303104","mem_arena_held" : "1048576","mem_bytes_in_use" : "606208","provider" : "CPUExecutionProvider","mem_arena_held_delta" : "0","thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "35288", "block_size": [1], "core": 19, "Distribution": 13, "DistributionEnqueue": 11, "Run": 86, "Wait": 1, "WaitRevoke": 1}, "sub_threads": {"22620": {"num_run": 1, "core": 18},"64428": {"num_run": 1, "core": 15},"33524": {"num_run": 1, "core": 14},"39208": {"num_run": 1, "core": 11},"52860": {"num_run": 1, "core": 10},"48380": {"num_run": 1, "core": 9},"9608": {"num_run": 1, "core": 8},"4192": {"num_run": 1, "core": 7},"57564": {"num_run": 1, "core": 2},"23772": {"num_run": 1, "core": 3},"64908": {"num_run": 0, "core": -1}}},"op_name" : "Transpose","mem_in_use_peak" : "606208","activation_size" : "303104"}},
|
||||
{"cat" : "Session","pid" :27912,"tid" :35288,"dur" :21279,"ts" :339465543,"ph" : "X","name" :"SequentialExecutor::Execute","args" : {}},
|
||||
{"cat" : "Session","pid" :27912,"tid" :35288,"dur" :21368,"ts" :339465486,"ph" : "X","name" :"model_run","args" : {}}
|
||||
]
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
[
|
||||
{"cat" : "Session","pid" :64472,"tid" :62412,"dur" :829613,"ts" :16,"ph" : "X","name" :"model_loading_uri","args" : {}},
|
||||
{"cat" : "Session","pid" :64472,"tid" :62412,"dur" :308497731,"ts" :830794,"ph" : "X","name" :"session_initialization","args" : {}},
|
||||
{"cat" : "Node","pid" :64472,"tid" :62412,"dur" :19730,"ts" :309336010,"ph" : "X","name" :"vitisai_vitisai_3215490424510764005_0_0_kernel_time","args" : {"mem_arena_held_delta" : "1048576","mem_arena_held" : "1048576","output_type_shape" : [{"float":[1,74,1024]}],"provider" : "vitisai","output_size" : "303104","parameter_size" : "0","mem_requested_in_use_delta" : "303104","mem_in_use_delta" : "303104","node_index" : "508","input_type_shape" : [{"float":[1,512,74]}],"activation_size" : "151552","mem_in_use_peak" : "303104","mem_bytes_requested_in_use" : "303104","op_name" : "vitisai_3215490424510764005_0","mem_bytes_in_use" : "303104","thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "62412", "block_size": [], "core": -1, "Distribution": 0, "DistributionEnqueue": 0, "Run": 0, "Wait": 0, "WaitRevoke": 0}, "sub_threads": {"14940": {"num_run": 0, "core": -1},"24648": {"num_run": 0, "core": -1},"23116": {"num_run": 0, "core": -1},"16044": {"num_run": 0, "core": -1},"28936": {"num_run": 0, "core": -1},"57104": {"num_run": 0, "core": -1},"52520": {"num_run": 0, "core": -1},"51036": {"num_run": 0, "core": -1},"63388": {"num_run": 0, "core": -1},"59356": {"num_run": 0, "core": -1},"33832": {"num_run": 0, "core": -1}}}}},
|
||||
{"cat" : "Node","pid" :64472,"tid" :62412,"dur" :186,"ts" :309355755,"ph" : "X","name" :"node_permute_kernel_time","args" : {"mem_arena_held" : "1048576","input_type_shape" : [{"float":[1,74,1024]}],"output_size" : "303104","mem_in_use_peak" : "606208","activation_size" : "303104","mem_bytes_requested_in_use" : "606208","mem_arena_held_delta" : "0","mem_in_use_delta" : "303104","provider" : "CPUExecutionProvider","output_type_shape" : [{"float":[1,1024,74]}],"parameter_size" : "0","op_name" : "Transpose","thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "62412", "block_size": [1], "core": 1, "Distribution": 11, "DistributionEnqueue": 10, "Run": 61, "Wait": 76, "WaitRevoke": 1}, "sub_threads": {"14940": {"num_run": 1, "core": 2},"24648": {"num_run": 1, "core": 6},"23116": {"num_run": 1, "core": 16},"16044": {"num_run": 1, "core": 18},"28936": {"num_run": 1, "core": 20},"57104": {"num_run": 1, "core": 22},"52520": {"num_run": 1, "core": 9},"51036": {"num_run": 0, "core": -1},"63388": {"num_run": 0, "core": -1},"59356": {"num_run": 0, "core": -1},"33832": {"num_run": 0, "core": -1}}},"mem_requested_in_use_delta" : "303104","node_index" : "485","mem_bytes_in_use" : "606208"}},
|
||||
{"cat" : "Session","pid" :64472,"tid" :62412,"dur" :19949,"ts" :309336002,"ph" : "X","name" :"SequentialExecutor::Execute","args" : {}},
|
||||
{"cat" : "Session","pid" :64472,"tid" :62412,"dur" :20005,"ts" :309335970,"ph" : "X","name" :"model_run","args" : {}}
|
||||
]
|
||||
BIN
Binary file not shown.
+60
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 486,
|
||||
"terminal_node": "node_permute",
|
||||
"terminal_op": "Transpose",
|
||||
"terminal_output": "permute",
|
||||
"boundary_inputs": [
|
||||
"quantized"
|
||||
],
|
||||
"extracted_node_count": 486,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 42,
|
||||
"MatMul": 74,
|
||||
"Add": 59,
|
||||
"Pow": 17,
|
||||
"ReduceMean": 17,
|
||||
"Sqrt": 17,
|
||||
"Reciprocal": 17,
|
||||
"Mul": 114,
|
||||
"Reshape": 48,
|
||||
"Slice": 32,
|
||||
"Neg": 16,
|
||||
"Concat": 16,
|
||||
"Softmax": 8,
|
||||
"Sigmoid": 8
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 1024\n }\n dim {\n dim_value: 74\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut486_20260924.onnx",
|
||||
"candidate_bytes": 129699474,
|
||||
"candidate_sha256": "2f538d2f6b07fbfaccd98bc0e4976774aa24541fc29d4d7ba1a7231fe26ee2b7",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"fixture_sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55",
|
||||
"input_provenance": "pinned real-weight vocoder fixture",
|
||||
"status": "component_not_qualified",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
1024,
|
||||
74
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.05411999998614192,
|
||||
"vitisai_npu_device_count": 1,
|
||||
"vitisai_config_sha256": "c25a757791e14fb4689999adb52c59fb9059c8d746634702d9b15f36a5ff57ef",
|
||||
"vitisai_config_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\vllm-omni-edge\\benchmarks\\edge_harness\\results\\e2e_expansion_20260924\\evidence\\qwen_tts_amd_npu_vocoder\\vaiml_unvectorized_config.json",
|
||||
"vitisai_session_create_s": 350.0577001000056,
|
||||
"vitisai_inference_s": 0.02815200004260987,
|
||||
"vitisai_output_finite": true,
|
||||
"relative_l2_vs_cpu": 0.022869136975246635,
|
||||
"paired_output_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\vllm-omni-edge\\benchmarks\\edge_harness\\results\\e2e_expansion_20260924\\evidence\\qwen_tts_amd_npu_vocoder\\cut486_unvectorized_paired.npz",
|
||||
"paired_output_sha256": "dd959e80b929faff3f6c4b78ba3b1ddeb56ef12872f21647abf943e82683ab99",
|
||||
"profile_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\vllm-omni-edge\\benchmarks\\edge_harness\\results\\e2e_expansion_20260924\\evidence\\qwen_tts_amd_npu_vocoder\\cut486_unvectorized_profile_2026-09-24_20-09-18_599.json",
|
||||
"node_providers": {
|
||||
"vitisai": 1,
|
||||
"CPUExecutionProvider": 1
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
+8
@@ -0,0 +1,8 @@
|
||||
[
|
||||
{"cat" : "Session","pid" :16964,"tid" :40668,"dur" :1053674,"ts" :17,"ph" : "X","name" :"model_loading_uri","args" : {}},
|
||||
{"cat" : "Session","pid" :16964,"tid" :40668,"dur" :348995724,"ts" :1055890,"ph" : "X","name" :"session_initialization","args" : {}},
|
||||
{"cat" : "Node","pid" :16964,"tid" :40668,"dur" :27779,"ts" :350060089,"ph" : "X","name" :"vitisai_vitisai_3215490424510764005_0_0_kernel_time","args" : {"thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "40668", "block_size": [], "core": -1, "Distribution": 0, "DistributionEnqueue": 0, "Run": 0, "Wait": 0, "WaitRevoke": 0}, "sub_threads": {"54032": {"num_run": 0, "core": -1},"52960": {"num_run": 0, "core": -1},"67096": {"num_run": 0, "core": -1},"50108": {"num_run": 0, "core": -1},"13544": {"num_run": 0, "core": -1},"39468": {"num_run": 0, "core": -1},"49056": {"num_run": 0, "core": -1},"15684": {"num_run": 0, "core": -1},"64484": {"num_run": 0, "core": -1},"23596": {"num_run": 0, "core": -1},"16740": {"num_run": 0, "core": -1}}},"mem_requested_in_use_delta" : "303104","node_index" : "508","activation_size" : "151552","mem_in_use_delta" : "303104","mem_arena_held_delta" : "1048576","op_name" : "vitisai_3215490424510764005_0","input_type_shape" : [{"float":[1,512,74]}],"provider" : "vitisai","mem_bytes_in_use" : "303104","output_size" : "303104","mem_in_use_peak" : "303104","parameter_size" : "0","mem_arena_held" : "1048576","mem_bytes_requested_in_use" : "303104","output_type_shape" : [{"float":[1,74,1024]}]}},
|
||||
{"cat" : "Node","pid" :16964,"tid" :40668,"dur" :152,"ts" :350087885,"ph" : "X","name" :"node_permute_kernel_time","args" : {"mem_arena_held" : "1048576","mem_requested_in_use_delta" : "303104","mem_arena_held_delta" : "0","mem_in_use_peak" : "606208","output_type_shape" : [{"float":[1,1024,74]}],"node_index" : "485","parameter_size" : "0","provider" : "CPUExecutionProvider","op_name" : "Transpose","mem_bytes_requested_in_use" : "606208","input_type_shape" : [{"float":[1,74,1024]}],"mem_bytes_in_use" : "606208","mem_in_use_delta" : "303104","activation_size" : "303104","thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "40668", "block_size": [1], "core": 22, "Distribution": 13, "DistributionEnqueue": 12, "Run": 64, "Wait": 18, "WaitRevoke": 1}, "sub_threads": {"54032": {"num_run": 1, "core": 23},"52960": {"num_run": 1, "core": 13},"67096": {"num_run": 1, "core": 12},"50108": {"num_run": 1, "core": 21},"13544": {"num_run": 1, "core": 20},"39468": {"num_run": 1, "core": 4},"49056": {"num_run": 1, "core": 5},"15684": {"num_run": 1, "core": 2},"64484": {"num_run": 1, "core": 3},"23596": {"num_run": 0, "core": -1},"16740": {"num_run": 0, "core": -1}}},"output_size" : "303104"}},
|
||||
{"cat" : "Session","pid" :16964,"tid" :40668,"dur" :27970,"ts" :350060080,"ph" : "X","name" :"SequentialExecutor::Execute","args" : {}},
|
||||
{"cat" : "Session","pid" :16964,"tid" :40668,"dur" :28036,"ts" :350060044,"ph" : "X","name" :"model_run","args" : {}}
|
||||
]
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 712,
|
||||
"terminal_node": "node_slice_43",
|
||||
"terminal_op": "Slice",
|
||||
"terminal_output": "wav",
|
||||
"boundary_inputs": [
|
||||
"permute"
|
||||
],
|
||||
"extracted_node_count": 226,
|
||||
"extracted_ops": {
|
||||
"ConvTranspose": 6,
|
||||
"Conv": 28,
|
||||
"Transpose": 4,
|
||||
"LayerNormalization": 2,
|
||||
"MatMul": 4,
|
||||
"Add": 49,
|
||||
"Div": 2,
|
||||
"Erf": 2,
|
||||
"Mul": 64,
|
||||
"Sin": 29,
|
||||
"Pow": 29,
|
||||
"Slice": 5,
|
||||
"Clip": 1,
|
||||
"Reshape": 1
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 3840\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_code2wav_decoder_suffix_20260924.onnx",
|
||||
"candidate_bytes": 293985582,
|
||||
"candidate_sha256": "47197c1c1fdad6c4afc65a4debdbef4727be08dec16bfc7760449a6b7e4ad77d"
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"passes": [
|
||||
{
|
||||
"name": "init",
|
||||
"plugin": "vaip-pass_init"
|
||||
},
|
||||
{
|
||||
"name": "vaiml_partition",
|
||||
"plugin": "vaip-pass_vaiml_partition",
|
||||
"vaiml_config": {
|
||||
"optimize_level": 1,
|
||||
"preferred_data_storage": "unvectorized"
|
||||
}
|
||||
}
|
||||
],
|
||||
"target": "VAIML",
|
||||
"targets": [
|
||||
{
|
||||
"name": "VAIML",
|
||||
"pass": [
|
||||
"init",
|
||||
"vaiml_partition"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -59,7 +59,7 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i
|
||||
| PC HX370 + RTX 5090 Laptop / WSL | profile completed | profile completed | scoped E2E: text + image | scoped E2E: text/image/audio → speech | synthetic policy pass: admitted Omni CUDA |
|
||||
| PC HX370 + RTX 5090 Laptop / Windows | scoped E2E: Omni Spark 1.7B GGUF text on RTX Vulkan; fresh restart after in-flight cancel (separate 4B BF16 CUDA profile) | scoped E2E: Omni RTX Vulkan talker/codec + CPU predictor complete WAV and restart (separate CUDA stream has playback jitter) | scoped E2E: Omni FP8 Triton text+image on RTX; separate NVFP4 Windows startup failed | scoped E2E: text/image/audio → speech | synthetic policy pass: admitted Omni CUDA |
|
||||
| PC HX370 + Radeon 890M / Windows worker | scoped E2E: Omni Spark text; fresh restart after in-flight cancel | scoped E2E: Omni Radeon talker/codec + CPU predictor; fresh restart after in-flight cancel | scoped E2E: Omni Q4_K_M GGUF Radeon text+image (20 each; slower than CPU here) | scoped E2E: Omni Radeon+CPU image+audio → text+speech (native-storage 20-run profile) | synthetic policy pass: Omni CPU+Radeon Cosmos (WSL/native Windows) |
|
||||
| PC HX370 + AMD NPU / Windows worker | NOT E2E (output-head component passed) | NOT E2E (real Code2Wav prefixes ran on NPU; 2D decoder rewrite enabled mixed NPU/CPU short window, but waveform failed at 15.7% relative L2) | NOT E2E | NOT E2E | NOT E2E |
|
||||
| PC HX370 + AMD NPU / Windows worker | NOT E2E (output-head component passed) | NOT E2E (NPU pre-decoder boundary 2.27% L2, NPU-prefix+CPU-decoder waveform 9.69% L2; full mixed short window 15.7% L2) | 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; two-frame QNN vocoder on NPU, component RTF 22.89) | 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; historical 25-frame TFLite mixed vocoder component RTF 0.420; pinned 25-frame mixed CPU/GPU vocoder profiled at RTF 0.335; generated-code waveform measured; short chunk RTF 3.49) | NOT E2E | NOT E2E (NPU speech head step profiled) | NOT E2E (Cosmos NPU encoder profiled) |
|
||||
@@ -97,7 +97,7 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i
|
||||
| PC HX370 + Radeon 890M / Windows worker | MiniCPM-o 4.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST_HYBRID; NATIVE_STORAGE_PROFILED | The pinned Q4_K_M/F16 GGUF combined synthetic spoken-question+JPEG → text+speech route passed one warmup and 20/20 serial complete requests through a bounded Omni whole-session stage with weights on native NTFS. Nearest-rank wall p50/p95 was **16.35/17.20 s**, range 14.08–17.30 s, excluding 8.75 s startup; all requests returned the red-square sentence and nonzero 2.08–2.88 s 24 kHz speech with terminal audio events. The first WAV exactly matched pinned Whisper tiny.en ASR (WER 0, one-output intelligibility proxy). All 21 successful worker logs identified Radeon 890M Vulkan0 language (37/37 layers) and vision plus CPU Token2Wav, with zero prefetch warnings; sampled RSS peaked at 15.30 GB. The 21 GiB shared-RAM reservation admitted after file-cache reclaim; an initial identical attempt was explicitly refused before model load when available RAM had fallen below reservation. Cancellation left no stale output or reservation. A sequential same-artifact one-request UNC control took 90.63 s versus 16.89 s native and logged two prefetch warnings; the previous UNC 20-request profile remains p50/p95 87.27/91.45 s for that path. Storage is strongly associated with the slowdown, but OS cache/run order are uncontrolled and the separate CPU/Radeon profiles are not a qualified iGPU speedup comparison. This is CPU+iGPU joint execution, not all-Radeon, NPU, general quality, playable streaming or sustained thermal/power qualification. | Validate real multimodal quality, playable streaming, post-cancel restart, concurrency, loading peak and sustained power/thermal behavior; capture matched OS/shared-iGPU memory traces. [Native/UNC raw evidence](../../../e2e_expansion_20260923/evidence/minicpmo_omni_native_weights_io/README.md), [earlier UNC 20-request evidence](../../../e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md). |
|
||||
| PC HX370 + Radeon 890M / Windows worker | InternVLA-A1 | SYNTHETIC_POLICY_PASS_HYBRID_OMNI; NOT_TASK_E2E | The real Place_Markpen checkpoint ran in admitted Omni whole-policy stages on both WSL CPU+Radeon and native Windows CPU+Radeon. In each, the BF16 Qwen3-VL/flow action policy stayed on CPU and a pinned six-frame FP32 Cosmos encoder used Omni's external DirectML worker; the selected Radeon 890M and graph output device were verified, without internal per-op attribution. Each placement returned 20/20 identical finite `[1,50,32]` actions after one warmup. WSL hybrid complete-request p50/p95 was 3.120/3.197 s versus its separate CPU baseline 3.175/3.219 s, with action relative L2 difference 2.305%. Native Windows hybrid was 4.575/4.725 s versus its separate CPU baseline 4.878/4.902 s, with action relative L2 difference 2.4391%. Native hybrid startup was 140.31 s versus CPU 135.60 s. These are separate one-fixture serial runs, not paired speedup or task-quality proof. FP32 encoder is an explicit precision change after DirectML BF16 aborted. Both stages verified hashes, reserved 16 GiB shared host RAM, rejected insufficient demand before launch, emitted terminal actions through public `AsyncOmni.generate`, and released reservations after in-flight cancellation/shutdown. An initial WSL hybrid shutdown quarantined 16 GiB; the lifecycle fix and reruns cleared it. The older direct hybrid zero-input profile is a different experiment. | Validate real observations/reference actions, physical units/order/step time, post-cancel restart, loading peak, concurrency and sustained tail/power before deployment; [WSL Omni evidence](../../../e2e_expansion_20260923/evidence/internvla_omni_policy/README.md), [native Windows Omni evidence](../../../e2e_expansion_20260923/evidence/internvla_omni_windows_hybrid/README.md), [earlier direct component evidence](../../../e2e_expansion_20260923/evidence/internvla_cosmos_radeon890m/README.md). |
|
||||
| PC HX370 + AMD NPU / Windows worker | Spark-X2.5 | COMPONENT_PASS; NOT_E2E_PROFILEABLE | The real 1.7B output head (RMS norm and full 131,072-logit projection) ran through Omni `external.graph.v1` with VitisAI: one fused NPU partition and seven CPU nodes per request. The A16W8 graph matched top-1 on four captured activations (full-logit SNR 55.43–56.81 dB). One warmup plus 20 serial repeated-input component requests gave p50/p95 10.21/12.44 ms, versus 17.97/20.29 ms for the original FP32 output head on the same Omni CPU stage. NPU startup was 18.21 s versus 4.48 s for FP32 CPU, and NPU worker peak RSS was 3.52 GiB versus 2.06 GiB. No full prefill/decode/KV/sampling, real handoff, power, or sustained run was verified. | Measure an actual vLLM-to-output-head handoff and whole-generation cost, state/cancellation, memory admission and quality before considering a split plan; [component evidence](../../../e2e_expansion_20260923/evidence/spark_amd_npu_output_head/README.md). |
|
||||
| PC HX370 + AMD NPU / Windows worker | Qwen3-TTS 0.6B CustomVoice | PREFIX_NPU_COMPONENT_PASS; MIXED_NPU_CPU_WAVEFORM_NUMERIC_FAILED; NOT_E2E_PROFILEABLE | The original real-weight FP32 25-frame and pinned two-frame Code2Wav graphs reproduced retained CPU waveforms, but VitisAI EP 1.8.63.0 crashed during session creation. Four extracted two-frame prefixes (18/50/97/192 nodes) then each executed one actual VitisAI NPU partition, with one-fixture intermediate relative L2 0.958%/1.059%/0.391%/1.083% versus CPU; these are not waveform or task-quality passes. An isolated original 1D decoder ConvTranspose reproduced the native LLVM ArrayRef assertion. Expressing it as an equivalent 2D convolution compiled and ran on one NPU node; its synthetic-input output differed 1.636% from CPU. Rewriting all six decoder upsampling convolutions made the full two-frame CPU waveform bitwise identical to the source. The rewritten short graph then completed with two VitisAI and 139 CPU node events, but the one-fixture waveform missed the 1% gate at 15.696% relative L2 / 16.08 dB SNR. Its 2515 s session build and one cold 2.205 s inference for 0.16 s audio are component observations, not a steady profile. Whole TTS streaming, stage handoff, quality, memory and power remain unverified. The historical export revision is unattested; the two-frame source is pinned to CustomVoice revision 85e237c. | Localize the mixed-route waveform error and meet numerical/listening gates, then warm-profile placement, memory and coarse-stage benefit before running complete Omni TTS with state, cancellation and admission. [Raw AMD NPU bisection and rewrite evidence](../../../e2e_expansion_20260924/evidence/qwen_tts_amd_npu_vocoder/README.md). |
|
||||
| PC HX370 + AMD NPU / Windows worker | Qwen3-TTS 0.6B CustomVoice | PREFIX_NPU_COMPONENT_PASS; MIXED_NPU_CPU_WAVEFORM_NUMERIC_FAILED; NOT_E2E_PROFILEABLE | The original real-weight FP32 25-frame and pinned two-frame Code2Wav graphs reproduced retained CPU waveforms, but VitisAI EP 1.8.63.0 crashed during session creation. Four extracted two-frame prefixes (18/50/97/192 nodes) then each executed one actual VitisAI NPU partition, with one-fixture intermediate relative L2 0.958%/1.059%/0.391%/1.083% versus CPU; these are not waveform or task-quality passes. An isolated original 1D decoder ConvTranspose reproduced the native LLVM ArrayRef assertion. Expressing it as an equivalent 2D convolution compiled and ran on one NPU node; its synthetic-input output differed 1.636% from CPU. Rewriting all six decoder upsampling convolutions made the full two-frame CPU waveform bitwise identical to the source. The rewritten short graph then completed with two VitisAI and 139 CPU node events, but the one-fixture waveform missed the 1% gate at 15.696% relative L2 / 16.08 dB SNR. Its 2515 s session build and one cold 2.205 s inference for 0.16 s audio are component observations, not a steady profile. At the real-weight boundary before the decoder, one NPU partition produced a tensor 2.265% from CPU; routing that NPU tensor through the unchanged CPU decoder yielded a waveform 9.689% from the CPU-boundary control, versus 1.05e-6 for CPU boundary plus CPU decoder. A documented unvectorized-layout control instead gave 2.287% boundary and 10.074% CPU-decoder waveform relative L2, so that setting did not repair the route. The NPU prefix itself fails the waveform gate; complete TTS streaming, representative quality, memory and power remain unverified. The historical export revision is unattested; the two-frame source is pinned to CustomVoice revision 85e237c. | Isolate the NPU prefix precision/operation error using same-fixture waveform gates, then warm-profile a numerically qualified coarse stage and run complete Omni TTS with state, cancellation, admission and listening quality. [Raw AMD NPU bisection and rewrite evidence](../../../e2e_expansion_20260924/evidence/qwen_tts_amd_npu_vocoder/README.md). |
|
||||
| PC HX370 + AMD NPU / Windows worker | Qwen3.8-27B | NOT_E2E_PROFILEABLE | The tested A16W8 whole-vision-tower export failed NPU placement. This conclusion is specific to that export, not all future Qwen/NPU combinations. | Validate a supported export or smaller useful component, including same-checkpoint numerical quality. |
|
||||
| PC HX370 + AMD NPU / Windows worker | MiniCPM-o 4.5 | NOT_E2E_PROFILEABLE | No placement- and quality-verified whole-model graph bundle/stateful adapter for this model on this AMD route. Small backend graphs do not establish model support. | Supply and validate the missing matching artifact/backend, then run the complete specified workload. |
|
||||
| PC HX370 + AMD NPU / Windows worker | InternVLA-A1 | COMPONENT_EXPORT_CPU_PASS; NPU_ARTIFACTS_REJECTED; NOT_E2E_PROFILEABLE | The real Place_Markpen Cosmos CI8x8 encoder exported to fixed FP32 [6,3,256,256] -> [6,16,32,32] ONNX; ORT CPU matched the source on two fixtures with relative L2 8.74e-7/2.29e-6. A16W8 Conv+MatMul QDQ changed encoder output by 11.77%/5.03% on CPU and the VitisAI compiler emitted a missing-scale fatal assertion. MatMul-only A16W8 retained near-source CPU parity, but its original and ORT-preprocessed graphs each hit a native SmallVector compiler assertion. No VitisAI node executed, so this is not NPU component placement or complete InternVLA policy support. Failures are specific to these artifacts and EP 1.8.63.0. | Produce a VitisAI-supported whole-encoder or coarse substage artifact with representative calibration and numerical/policy tolerances; then verify actual NPU nodes, same-device handoff, full-policy behavior and memory/power before changing this disposition. [raw export and failure evidence](../../../e2e_expansion_20260923/evidence/internvla_cosmos_amd_npu/README.md). |
|
||||
|
||||
Reference in new issue
Block a user