Isolate AMD NPU vocoder compiler crash and validate 2D rewrite
This commit is contained in:
1 parent
df8f02376d
commit
a1866083a0
38 files changed
+1203
-4
No files matched your search
@@ -0,0 +1,192 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Extract a pinned Code2Wav ONNX prefix and probe AMD VitisAI compilation."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import platform
|
||||
import time
|
||||
from collections import Counter
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
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 write_report(path: Path, report: dict) -> None:
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
path.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
|
||||
|
||||
|
||||
def extract(args: argparse.Namespace) -> None:
|
||||
import onnx
|
||||
|
||||
source_hash = sha256(args.source)
|
||||
if source_hash != args.expected_source_sha256:
|
||||
raise ValueError("source ONNX hash changed")
|
||||
source = onnx.load(args.source)
|
||||
if not 1 <= args.cut <= len(source.graph.node):
|
||||
raise ValueError("cut must be a one-based node ordinal")
|
||||
terminal = source.graph.node[args.cut - 1]
|
||||
output_name = terminal.output[0]
|
||||
if not output_name:
|
||||
raise ValueError("selected node has an empty first output")
|
||||
inputs = args.input_tensor or [item.name for item in source.graph.input]
|
||||
candidate = onnx.utils.Extractor(source).extract_model(inputs, [output_name])
|
||||
onnx.checker.check_model(candidate)
|
||||
args.output.parent.mkdir(parents=True, exist_ok=True)
|
||||
onnx.save(candidate, args.output)
|
||||
report = {
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": source_hash,
|
||||
"source_node_count": len(source.graph.node),
|
||||
"cut_one_based": args.cut,
|
||||
"terminal_node": terminal.name,
|
||||
"terminal_op": terminal.op_type,
|
||||
"terminal_output": output_name,
|
||||
"boundary_inputs": inputs,
|
||||
"extracted_node_count": len(candidate.graph.node),
|
||||
"extracted_ops": dict(Counter(node.op_type for node in candidate.graph.node)),
|
||||
"output_type": str(candidate.graph.output[0].type),
|
||||
"candidate_file": str(args.output.resolve()),
|
||||
"candidate_bytes": args.output.stat().st_size,
|
||||
"candidate_sha256": sha256(args.output),
|
||||
}
|
||||
write_report(args.report, report)
|
||||
print(json.dumps({key: report[key] for key in
|
||||
("cut_one_based", "extracted_node_count", "candidate_sha256")}))
|
||||
|
||||
|
||||
def probe(args: argparse.Namespace) -> None:
|
||||
import numpy as np
|
||||
import onnxruntime as ort
|
||||
|
||||
report = json.loads(args.extraction_report.read_text(encoding="utf-8"))
|
||||
expected_model_hash = report.get("candidate_sha256", report.get("rewritten_sha256"))
|
||||
if sha256(args.model) != expected_model_hash:
|
||||
raise ValueError("candidate ONNX hash changed")
|
||||
if args.synthetic_input:
|
||||
fixture_hash = None
|
||||
quantized = None
|
||||
else:
|
||||
if args.fixture is None or args.expected_fixture_sha256 is None:
|
||||
raise ValueError("fixture and expected hash are required for real input")
|
||||
if sha256(args.fixture) != args.expected_fixture_sha256:
|
||||
raise ValueError("fixture hash changed")
|
||||
with np.load(args.fixture, allow_pickle=False) as source:
|
||||
quantized = np.ascontiguousarray(source["quantized"])
|
||||
if quantized.shape != (1, 512, 74) or quantized.dtype != np.float32:
|
||||
raise ValueError("fixture shape/dtype changed")
|
||||
fixture_hash = args.expected_fixture_sha256
|
||||
report.update({
|
||||
"os": platform.platform(),
|
||||
"onnxruntime_version": ort.__version__,
|
||||
"fixture_sha256": fixture_hash,
|
||||
"input_provenance": "synthetic fixed-seed normal" if args.synthetic_input else "pinned real-weight vocoder fixture",
|
||||
"status": "started",
|
||||
})
|
||||
write_report(args.report, report)
|
||||
cpu = ort.InferenceSession(str(args.model), providers=["CPUExecutionProvider"])
|
||||
cpu_input = cpu.get_inputs()[0]
|
||||
if args.synthetic_input:
|
||||
shape = cpu_input.shape
|
||||
if any(not isinstance(size, int) or size <= 0 for size in shape):
|
||||
raise ValueError("synthetic input requires a fully static tensor shape")
|
||||
quantized = np.random.default_rng(42).standard_normal(shape).astype(np.float32)
|
||||
started = time.perf_counter()
|
||||
cpu_output = cpu.run(None, {cpu_input.name: quantized})[0]
|
||||
report.update({
|
||||
"cpu_output_shape": list(cpu_output.shape),
|
||||
"cpu_output_finite": bool(np.isfinite(cpu_output).all()),
|
||||
"cpu_inference_s": time.perf_counter() - started,
|
||||
"status": "cpu_component_pass",
|
||||
})
|
||||
write_report(args.report, report)
|
||||
if not report["cpu_output_finite"]:
|
||||
raise ValueError("CPU prefix output is nonfinite")
|
||||
if args.cpu_only:
|
||||
return
|
||||
|
||||
ep_dir = args.ep_dir.resolve(strict=True)
|
||||
os.environ["PATH"] = str(ep_dir) + os.pathsep + os.environ.get("PATH", "")
|
||||
if hasattr(os, "add_dll_directory"):
|
||||
os.add_dll_directory(str(ep_dir))
|
||||
ort.register_execution_provider_library(
|
||||
"vitisai", str(ep_dir / "onnxruntime_vitisai_ep.dll"))
|
||||
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)
|
||||
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.enable_profiling = True
|
||||
options.profile_file_prefix = str(args.profile_prefix)
|
||||
started = time.perf_counter()
|
||||
session = ort.InferenceSession(str(args.model), sess_options=options)
|
||||
report["vitisai_session_create_s"] = time.perf_counter() - started
|
||||
report["status"] = "vitisai_session_created"
|
||||
write_report(args.report, report)
|
||||
started = time.perf_counter()
|
||||
actual = session.run(None, {cpu_input.name: quantized})[0]
|
||||
report["vitisai_inference_s"] = time.perf_counter() - started
|
||||
if actual.shape != cpu_output.shape:
|
||||
raise ValueError("VitisAI prefix output shape changed")
|
||||
report["vitisai_output_finite"] = bool(np.isfinite(actual).all())
|
||||
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))
|
||||
profile_path = Path(session.end_profiling())
|
||||
report["profile_file"] = str(profile_path)
|
||||
events = json.loads(profile_path.read_text(encoding="utf-8"))
|
||||
providers = [(event.get("args") or {}).get("provider") for event in events
|
||||
if event.get("cat") == "Node"]
|
||||
report["node_providers"] = dict(Counter(providers))
|
||||
report["status"] = (
|
||||
"npu_component_numeric_pass"
|
||||
if providers.count("vitisai") > 0
|
||||
and report["vitisai_output_finite"]
|
||||
and report["relative_l2_vs_cpu"] <= 0.01
|
||||
else "component_not_qualified"
|
||||
)
|
||||
write_report(args.report, report)
|
||||
print(json.dumps({"status": report["status"],
|
||||
"relative_l2_vs_cpu": report["relative_l2_vs_cpu"]}))
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
subparsers = parser.add_subparsers(dest="command", required=True)
|
||||
extraction = subparsers.add_parser("extract")
|
||||
extraction.add_argument("--source", type=Path, required=True)
|
||||
extraction.add_argument("--expected-source-sha256", required=True)
|
||||
extraction.add_argument("--cut", type=int, required=True)
|
||||
extraction.add_argument("--input-tensor", action="append")
|
||||
extraction.add_argument("--output", type=Path, required=True)
|
||||
extraction.add_argument("--report", type=Path, required=True)
|
||||
execution = subparsers.add_parser("probe")
|
||||
execution.add_argument("--model", type=Path, required=True)
|
||||
execution.add_argument("--extraction-report", type=Path, required=True)
|
||||
execution.add_argument("--fixture", type=Path)
|
||||
execution.add_argument("--expected-fixture-sha256")
|
||||
execution.add_argument("--synthetic-input", action="store_true")
|
||||
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("--cpu-only", action="store_true")
|
||||
args = parser.parse_args()
|
||||
(extract if args.command == "extract" else probe)(args)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -105,9 +105,10 @@ def main() -> None:
|
||||
if (not report["cpu_vs_retained_reference"]["finite"]
|
||||
or report["cpu_vs_retained_reference"]["relative_l2"] > 1e-4):
|
||||
raise ValueError("current ONNX CPU output differs from the retained reference")
|
||||
report["status"] = "cpu_reference_pass"
|
||||
args.report.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
|
||||
del cpu
|
||||
if args.cpu_only:
|
||||
report["status"] = "cpu_reference_pass"
|
||||
return
|
||||
|
||||
ep_dir = args.ep_dir.resolve(strict=True)
|
||||
@@ -124,6 +125,8 @@ def main() -> None:
|
||||
options.add_provider_for_devices(devices, {})
|
||||
options.enable_profiling = True
|
||||
options.profile_file_prefix = str(args.profile_prefix)
|
||||
report["status"] = "vitisai_session_creation_started"
|
||||
args.report.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
|
||||
npu_started = time.perf_counter()
|
||||
npu = ort.InferenceSession(str(args.model), sess_options=options)
|
||||
report["npu_load_s"] = time.perf_counter() - npu_started
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Rewrite ONNX ConvTranspose1d as equivalent size-one-height ConvTranspose2d."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
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 main() -> None:
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--source", type=Path, required=True)
|
||||
parser.add_argument("--expected-source-sha256", required=True)
|
||||
parser.add_argument("--output", type=Path, required=True)
|
||||
parser.add_argument("--report", type=Path, required=True)
|
||||
parser.add_argument("--fixture", type=Path)
|
||||
parser.add_argument("--expected-fixture-sha256")
|
||||
args = parser.parse_args()
|
||||
|
||||
import numpy as np
|
||||
import onnx
|
||||
import onnxruntime as ort
|
||||
|
||||
source_hash = sha256(args.source)
|
||||
if source_hash != args.expected_source_sha256:
|
||||
raise ValueError("source ONNX hash changed")
|
||||
model = onnx.load(args.source)
|
||||
weights = {initializer.name: initializer for initializer in model.graph.initializer}
|
||||
existing_names = {
|
||||
name
|
||||
for node in model.graph.node
|
||||
for name in (*node.input, *node.output)
|
||||
if name
|
||||
} | set(weights)
|
||||
axes_name = "__edge_convtranspose2d_axis2"
|
||||
if axes_name in existing_names:
|
||||
raise ValueError("rewrite tensor name collision")
|
||||
axes = onnx.helper.make_tensor(axes_name, onnx.TensorProto.INT64, [1], [2])
|
||||
model.graph.initializer.append(axes)
|
||||
|
||||
rewritten = []
|
||||
replacements = []
|
||||
for node in model.graph.node:
|
||||
if node.op_type != "ConvTranspose":
|
||||
replacements.append(node)
|
||||
continue
|
||||
attributes = {
|
||||
attr.name: onnx.helper.get_attribute_value(attr)
|
||||
for attr in node.attribute
|
||||
}
|
||||
kernel_shape = list(attributes.get("kernel_shape", []))
|
||||
if len(kernel_shape) != 1:
|
||||
replacements.append(node)
|
||||
continue
|
||||
if len(node.input) < 2 or len(node.output) != 1:
|
||||
raise ValueError("unexpected ConvTranspose input/output contract")
|
||||
weight = weights.get(node.input[1])
|
||||
if weight is None or len(weight.dims) != 3:
|
||||
raise ValueError("ConvTranspose1d weight is not an embedded rank-three initializer")
|
||||
original_dims = list(weight.dims)
|
||||
if original_dims[2] != kernel_shape[0]:
|
||||
raise ValueError("weight kernel shape changed")
|
||||
input_2d = node.input[0] + "__edge_2d"
|
||||
output_2d = node.output[0] + "__edge_2d"
|
||||
if input_2d in existing_names or output_2d in existing_names:
|
||||
raise ValueError("rewrite tensor name collision")
|
||||
existing_names.update((input_2d, output_2d))
|
||||
attributes["kernel_shape"] = [1, kernel_shape[0]]
|
||||
for name in ("strides", "dilations", "output_padding"):
|
||||
if name in attributes:
|
||||
attributes[name] = [1 if name != "output_padding" else 0, *attributes[name]]
|
||||
if "pads" in attributes:
|
||||
before, after = attributes["pads"]
|
||||
attributes["pads"] = [0, before, 0, after]
|
||||
del weight.dims[:]
|
||||
weight.dims.extend([original_dims[0], original_dims[1], 1, original_dims[2]])
|
||||
replacements.extend([
|
||||
onnx.helper.make_node(
|
||||
"Unsqueeze", [node.input[0], axes_name], [input_2d],
|
||||
name=node.name + "__edge_unsqueeze"),
|
||||
onnx.helper.make_node(
|
||||
"ConvTranspose", [input_2d, *node.input[1:]], [output_2d],
|
||||
name=node.name + "__edge_2d", **attributes),
|
||||
onnx.helper.make_node(
|
||||
"Squeeze", [output_2d, axes_name], list(node.output),
|
||||
name=node.name + "__edge_squeeze"),
|
||||
])
|
||||
rewritten.append({
|
||||
"node_name": node.name,
|
||||
"weight_name": node.input[1],
|
||||
"original_weight_dims": original_dims,
|
||||
"new_weight_dims": list(weight.dims),
|
||||
})
|
||||
if not rewritten:
|
||||
raise ValueError("source has no rank-one ConvTranspose to rewrite")
|
||||
del model.graph.node[:]
|
||||
model.graph.node.extend(replacements)
|
||||
onnx.checker.check_model(model)
|
||||
args.output.parent.mkdir(parents=True, exist_ok=True)
|
||||
onnx.save(model, args.output)
|
||||
|
||||
source_session = ort.InferenceSession(str(args.source), providers=["CPUExecutionProvider"])
|
||||
rewritten_session = ort.InferenceSession(str(args.output), providers=["CPUExecutionProvider"])
|
||||
source_input = source_session.get_inputs()[0]
|
||||
rewritten_input = rewritten_session.get_inputs()[0]
|
||||
if source_input.shape != rewritten_input.shape:
|
||||
raise ValueError("rewritten graph changed input shape")
|
||||
if args.fixture is None:
|
||||
shape = source_input.shape
|
||||
if any(not isinstance(size, int) or size <= 0 for size in shape):
|
||||
raise ValueError("synthetic control requires static input shape")
|
||||
data = np.random.default_rng(42).standard_normal(shape).astype(np.float32)
|
||||
input_provenance = "synthetic fixed-seed normal"
|
||||
fixture_hash = None
|
||||
else:
|
||||
if args.expected_fixture_sha256 is None:
|
||||
raise ValueError("fixture hash required")
|
||||
fixture_hash = sha256(args.fixture)
|
||||
if fixture_hash != args.expected_fixture_sha256:
|
||||
raise ValueError("fixture hash changed")
|
||||
with np.load(args.fixture, allow_pickle=False) as fixture:
|
||||
if fixture.files != ["quantized"]:
|
||||
raise ValueError("fixture schema changed")
|
||||
data = np.ascontiguousarray(fixture["quantized"])
|
||||
input_provenance = "pinned real-weight vocoder fixture"
|
||||
expected = source_session.run(None, {source_input.name: data})[0]
|
||||
actual = rewritten_session.run(None, {rewritten_input.name: data})[0]
|
||||
if expected.shape != actual.shape:
|
||||
raise ValueError("rewritten graph changed output shape")
|
||||
error = actual.astype(np.float64) - expected.astype(np.float64)
|
||||
relative_l2 = float(
|
||||
np.linalg.norm(error) /
|
||||
max(np.linalg.norm(expected.astype(np.float64)), 1e-12))
|
||||
report = {
|
||||
"source_sha256": source_hash,
|
||||
"source_file": str(args.source.resolve()),
|
||||
"rewritten_sha256": sha256(args.output),
|
||||
"rewritten_file": str(args.output.resolve()),
|
||||
"fixture_sha256": fixture_hash,
|
||||
"input_provenance": input_provenance,
|
||||
"rewritten_nodes": rewritten,
|
||||
"input_shape": list(data.shape),
|
||||
"output_shape": list(actual.shape),
|
||||
"cpu_finite": bool(np.isfinite(actual).all()),
|
||||
"cpu_relative_l2_vs_source": relative_l2,
|
||||
"cpu_maximum_absolute_error": float(np.max(np.abs(error))),
|
||||
"status": "cpu_rewrite_parity_pass" if relative_l2 <= 1e-5 else "cpu_rewrite_parity_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({"status": report["status"], "rewritten_nodes": len(rewritten),
|
||||
"cpu_relative_l2_vs_source": relative_l2}))
|
||||
if report["status"] != "cpu_rewrite_parity_pass":
|
||||
raise ValueError("rewritten graph changed CPU output")
|
||||
|
||||
|
||||
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 attempt](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 graph compilation with an LLVM ArrayRef assertion before any NPU node or waveform ran. The cell remains NOT E2E; this failure is specific to the tested graphs and provider build.
|
||||
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; no full NPU waveform or TTS stream is yet 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.
|
||||
|
||||
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
*profile*.json binary -eol
|
||||
*.log binary -eol
|
||||
+42
@@ -52,3 +52,45 @@ waveform quality, verify nonzero NPU node placement and measured coarse
|
||||
stage benefit, then connect talker, codec, state, admission, cancellation,
|
||||
and complete-stream quality gates through Omni. This compiler failure
|
||||
constrains these graphs and EP version only.
|
||||
|
||||
## Compiler bisection and equivalent decoder rewrite
|
||||
|
||||
A follow-up [bisection audit](bisection_report.json) extracted reachable
|
||||
prefixes from the pinned two-frame graph. All used its one fixed real-weight
|
||||
fixture on the same HX370 Windows/VitisAI stack. Each row is **one component
|
||||
inference**, with no warmup, repeated timing, waveform, or full-stream claim:
|
||||
|
||||
| Source cut / extracted nodes | VitisAI node events | Session creation | Intermediate relative L2 versus CPU |
|
||||
|---|---:|---:|---:|
|
||||
| 25 / 18 | 1 | 164.08 s | 0.958% |
|
||||
| 50 / 50 | 1 | 301.30 s | 1.059% |
|
||||
| 100 / 97 | 1 | 330.92 s | 0.391% |
|
||||
| 200 / 192 | 1 | 395.85 s | 1.083% |
|
||||
|
||||
The first 100-node attempt was manually stopped after about five minutes
|
||||
of active compilation; its longer retry passed. The 1% intermediate gate
|
||||
used by the probe marks cuts 50 and 200 numerically unqualified. It is a
|
||||
screening gate, not a validated waveform or listening tolerance. The
|
||||
successful cuts show that the model prefix can run on this NPU; they do
|
||||
not justify splitting a production vocoder at those boundaries.
|
||||
|
||||
The first decoder `ConvTranspose1d` isolated with its original weights
|
||||
reproduced the exact `vaiml.dll` / LLVM `ArrayRef` assertion in
|
||||
[its raw log](local_convtranspose0_probe.log). A
|
||||
[shape-preserving rewrite](../../../../experiments/rewrite_qwen_tts_convtranspose1d.py)
|
||||
expresses that operation as `Unsqueeze → ConvTranspose2d` with a
|
||||
size-one height axis and `Squeeze`. The rewritten isolated operator was
|
||||
bitwise identical on ORT CPU and [executed as one VitisAI NPU node](local_convtranspose0_2d_probe.json)
|
||||
on a labeled synthetic activation; its NPU output differed by 1.636%
|
||||
relative L2 from CPU. That value is not a task-quality pass.
|
||||
|
||||
Applying the same transformation to all six upsampling convolutions
|
||||
produced a [full two-frame graph](full_short_2d_rewrite.json) whose
|
||||
`[1,3840]` CPU waveform was bitwise identical to the original graph on
|
||||
the pinned fixture. The ~424 MB rewritten artifact remains outside Git;
|
||||
its SHA-256 is pinned in the report. A full-graph NPU waveform, placement
|
||||
profile and complete TTS stream are still unqualified in this evidence.
|
||||
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
|
||||
rewrite.
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"date": "2026-09-24",
|
||||
"host": "HX370 native Windows 11 build 26200; AMD integrated NPU",
|
||||
"backend": "ONNX Runtime 1.30.0; AMD VitisAI EP 1.8.63.0",
|
||||
"input": "pinned CustomVoice two-frame Code2Wav revision 85e237c12c027371202489a0ec509ded67b5e4b5; one fixture; batch 1; no concurrency",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"power_condition": "uncontrolled, unmeasured",
|
||||
"prefix_results": [
|
||||
{
|
||||
"cut": 25,
|
||||
"nodes": 18,
|
||||
"model_sha256": "bf759b46fe2f0fd42fd77a1ee286bb6f5ae9c3fb5f4125be353d51e2727a31cd",
|
||||
"npu_node_events": 1,
|
||||
"compile_s": 164.08298429998104,
|
||||
"inference_s": 0.011038600001484156,
|
||||
"relative_l2_vs_cpu": 0.009578107362639126,
|
||||
"report": "cut25_probe.json",
|
||||
"profile": "cut25_profile_2026-09-24_18-38-11_408.json",
|
||||
"profile_sha256": "dbdcd4eddcc3076972b4bdbf36d1a2384e76906d45fa78af097e96765df8769f"
|
||||
},
|
||||
{
|
||||
"cut": 50,
|
||||
"nodes": 50,
|
||||
"model_sha256": "767e5c2f057137b9a2f409dee382196321621d1b4993affe3aff40906cfcd126",
|
||||
"npu_node_events": 1,
|
||||
"compile_s": 301.3029315000167,
|
||||
"inference_s": 0.005353299900889397,
|
||||
"relative_l2_vs_cpu": 0.010590704757452671,
|
||||
"report": "cut50_probe.json",
|
||||
"profile": "cut50_profile_2026-09-24_18-41-52_208.json",
|
||||
"profile_sha256": "b27571537aae0ec7862ef1af0ee9e7ff89fd71b8aea6bf87f8a056532d99c82d"
|
||||
},
|
||||
{
|
||||
"cut": 100,
|
||||
"nodes": 97,
|
||||
"model_sha256": "38ebbbce1c6551a766fa151ef3ff2bca3153a355fc1b2023d18c3e8d9fc0ba90",
|
||||
"npu_node_events": 1,
|
||||
"compile_s": 330.92104069993366,
|
||||
"inference_s": 0.008062600041739643,
|
||||
"relative_l2_vs_cpu": 0.0039061906281823333,
|
||||
"report": "cut100_probe_retry.json",
|
||||
"profile": "cut100_profile_retry_2026-09-24_18-47-20_111.json",
|
||||
"profile_sha256": "4bd2ed2521260bfacfcd6ae38102708c6561d8d7a7ed518a49352f36a609c007"
|
||||
},
|
||||
{
|
||||
"cut": 200,
|
||||
"nodes": 192,
|
||||
"model_sha256": "ac4689420f1e4d350d0eb62536a6642be58519063f453d8ddd067ab861acbda0",
|
||||
"npu_node_events": 1,
|
||||
"compile_s": 395.8548383000307,
|
||||
"inference_s": 0.010179699980653822,
|
||||
"relative_l2_vs_cpu": 0.010834368355383315,
|
||||
"report": "cut200_probe.json",
|
||||
"profile": "cut200_profile_2026-09-24_18-53-37_291.json",
|
||||
"profile_sha256": "41fd99dd80d5f2e822e046ad6974d138b355dc56c08d9f6a9e30754e0d56732c"
|
||||
}
|
||||
],
|
||||
"cut100_initial_attempt": "manually stopped after about five minutes of active compiler time; same candidate passed on longer retry",
|
||||
"isolated_original_1d": {
|
||||
"status": "native_compiler_assertion",
|
||||
"exit_code_hex": "0xC000001D",
|
||||
"log": "local_convtranspose0_probe.log",
|
||||
"log_sha256": "cb21787e73993f46657e6627f08cb74ff32514e635b908ca9928860ce57cf733"
|
||||
},
|
||||
"isolated_rewritten_2d": {
|
||||
"status": "one_vitisai_node_executed",
|
||||
"model_sha256": "c03bca763d6f19d3cadcbaf7d451dc4597623fa8d2da711cdabd30bfffbb3c97",
|
||||
"cpu_vs_original_l2": 0,
|
||||
"synthetic_input": true,
|
||||
"compile_s": 111.91233259998262,
|
||||
"npu_vs_cpu_l2": 0.01635672268431982,
|
||||
"profile": "local_convtranspose0_2d_profile_2026-09-24_19-02-21_591.json"
|
||||
},
|
||||
"full_short_2d_rewrite": {
|
||||
"status": "cpu_parity_pass_full_npu_unqualified",
|
||||
"model_sha256": "3f041942800dc22b4e0ee88cebb606d8117ff9d77f1d35e216fe185d4ad0cb90",
|
||||
"rewritten_nodes": 6,
|
||||
"cpu_vs_original_waveform_l2": 0,
|
||||
"report": "full_short_2d_rewrite.json"
|
||||
}
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 100,
|
||||
"terminal_node": "node_Add_340",
|
||||
"terminal_op": "Add",
|
||||
"terminal_output": "val_340",
|
||||
"extracted_node_count": 97,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 9,
|
||||
"MatMul": 13,
|
||||
"Add": 12,
|
||||
"Pow": 3,
|
||||
"ReduceMean": 3,
|
||||
"Sqrt": 3,
|
||||
"Reciprocal": 3,
|
||||
"Mul": 22,
|
||||
"Reshape": 10,
|
||||
"Slice": 8,
|
||||
"Neg": 4,
|
||||
"Concat": 4,
|
||||
"Softmax": 1,
|
||||
"Sigmoid": 1
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 16\n }\n dim {\n dim_value: 74\n }\n dim {\n dim_value: 74\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut100_20260924.onnx",
|
||||
"candidate_bytes": 27641808,
|
||||
"candidate_sha256": "38ebbbce1c6551a766fa151ef3ff2bca3153a355fc1b2023d18c3e8d9fc0ba90"
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 100,
|
||||
"terminal_node": "node_Add_340",
|
||||
"terminal_op": "Add",
|
||||
"terminal_output": "val_340",
|
||||
"extracted_node_count": 97,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 9,
|
||||
"MatMul": 13,
|
||||
"Add": 12,
|
||||
"Pow": 3,
|
||||
"ReduceMean": 3,
|
||||
"Sqrt": 3,
|
||||
"Reciprocal": 3,
|
||||
"Mul": 22,
|
||||
"Reshape": 10,
|
||||
"Slice": 8,
|
||||
"Neg": 4,
|
||||
"Concat": 4,
|
||||
"Softmax": 1,
|
||||
"Sigmoid": 1
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 16\n }\n dim {\n dim_value: 74\n }\n dim {\n dim_value: 74\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut100_20260924.onnx",
|
||||
"candidate_bytes": 27641808,
|
||||
"candidate_sha256": "38ebbbce1c6551a766fa151ef3ff2bca3153a355fc1b2023d18c3e8d9fc0ba90",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"fixture_sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55",
|
||||
"status": "vitisai_session_creation_started",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
16,
|
||||
74,
|
||||
74
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.03417220001574606,
|
||||
"vitisai_npu_device_count": 1
|
||||
}
|
||||
BIN
Binary file not shown.
+52
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 100,
|
||||
"terminal_node": "node_Add_340",
|
||||
"terminal_op": "Add",
|
||||
"terminal_output": "val_340",
|
||||
"extracted_node_count": 97,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 9,
|
||||
"MatMul": 13,
|
||||
"Add": 12,
|
||||
"Pow": 3,
|
||||
"ReduceMean": 3,
|
||||
"Sqrt": 3,
|
||||
"Reciprocal": 3,
|
||||
"Mul": 22,
|
||||
"Reshape": 10,
|
||||
"Slice": 8,
|
||||
"Neg": 4,
|
||||
"Concat": 4,
|
||||
"Softmax": 1,
|
||||
"Sigmoid": 1
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 16\n }\n dim {\n dim_value: 74\n }\n dim {\n dim_value: 74\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut100_20260924.onnx",
|
||||
"candidate_bytes": 27641808,
|
||||
"candidate_sha256": "38ebbbce1c6551a766fa151ef3ff2bca3153a355fc1b2023d18c3e8d9fc0ba90",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"fixture_sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55",
|
||||
"status": "npu_component_numeric_pass",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
16,
|
||||
74,
|
||||
74
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.006840299931354821,
|
||||
"vitisai_npu_device_count": 1,
|
||||
"vitisai_session_create_s": 330.92104069993366,
|
||||
"vitisai_inference_s": 0.008062600041739643,
|
||||
"vitisai_output_finite": true,
|
||||
"relative_l2_vs_cpu": 0.0039061906281823333,
|
||||
"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\\cut100_profile_retry_2026-09-24_18-47-20_111.json",
|
||||
"node_providers": {
|
||||
"vitisai": 1
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
Whitespace-only changes.
+7
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{"cat" : "Session","pid" :32928,"tid" :12772,"dur" :247852,"ts" :22,"ph" : "X","name" :"model_loading_uri","args" : {}},
|
||||
{"cat" : "Session","pid" :32928,"tid" :12772,"dur" :330668534,"ts" :248836,"ph" : "X","name" :"session_initialization","args" : {}},
|
||||
{"cat" : "Node","pid" :32928,"tid" :12772,"dur" :7021,"ts" :330928280,"ph" : "X","name" :"vitisai_vitisai_18316941832507373078_0_0_kernel_time","args" : {"mem_bytes_requested_in_use" : "350464","mem_in_use_peak" : "350464","node_index" : "104","parameter_size" : "0","output_size" : "350464","input_type_shape" : [{"float":[1,512,74]}],"thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "12772", "block_size": [], "core": -1, "Distribution": 0, "DistributionEnqueue": 0, "Run": 0, "Wait": 0, "WaitRevoke": 0}, "sub_threads": {"60412": {"num_run": 0, "core": -1},"65788": {"num_run": 0, "core": -1},"25932": {"num_run": 0, "core": -1},"24464": {"num_run": 0, "core": -1},"31092": {"num_run": 0, "core": -1},"57180": {"num_run": 0, "core": -1},"40752": {"num_run": 0, "core": -1},"45992": {"num_run": 0, "core": -1},"45708": {"num_run": 0, "core": -1},"58504": {"num_run": 0, "core": -1},"39660": {"num_run": 0, "core": -1}}},"mem_arena_held" : "1048576","mem_arena_held_delta" : "1048576","mem_bytes_in_use" : "350464","op_name" : "vitisai_18316941832507373078_0","activation_size" : "151552","mem_requested_in_use_delta" : "350464","output_type_shape" : [{"float":[1,16,74,74]}],"provider" : "vitisai","mem_in_use_delta" : "350464"}},
|
||||
{"cat" : "Session","pid" :32928,"tid" :12772,"dur" :7060,"ts" :330928268,"ph" : "X","name" :"SequentialExecutor::Execute","args" : {}},
|
||||
{"cat" : "Session","pid" :32928,"tid" :12772,"dur" :7160,"ts" :330928208,"ph" : "X","name" :"model_run","args" : {}}
|
||||
]
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 1,
|
||||
"terminal_node": "node_conv1d",
|
||||
"terminal_op": "Conv",
|
||||
"terminal_output": "conv1d",
|
||||
"extracted_node_count": 1,
|
||||
"extracted_ops": {
|
||||
"Conv": 1
|
||||
},
|
||||
"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_cut1_20260924.onnx",
|
||||
"candidate_bytes": 6298387,
|
||||
"candidate_sha256": "2a11d7d43f534d0515e34249c0ae1dc140121c1e6533684bfc33ef6fee563ddc",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"fixture_sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55",
|
||||
"status": "cpu_component_pass",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
1024,
|
||||
74
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.01773009996395558
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 1,
|
||||
"terminal_node": "node_conv1d",
|
||||
"terminal_op": "Conv",
|
||||
"terminal_output": "conv1d",
|
||||
"extracted_node_count": 1,
|
||||
"extracted_ops": {
|
||||
"Conv": 1
|
||||
},
|
||||
"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_cut1_20260924.onnx",
|
||||
"candidate_bytes": 6298387,
|
||||
"candidate_sha256": "2a11d7d43f534d0515e34249c0ae1dc140121c1e6533684bfc33ef6fee563ddc"
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 200,
|
||||
"terminal_node": "node_slice_20",
|
||||
"terminal_op": "Slice",
|
||||
"terminal_output": "slice_20",
|
||||
"extracted_node_count": 192,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 17,
|
||||
"MatMul": 29,
|
||||
"Add": 23,
|
||||
"Pow": 7,
|
||||
"ReduceMean": 7,
|
||||
"Sqrt": 7,
|
||||
"Reciprocal": 7,
|
||||
"Mul": 44,
|
||||
"Reshape": 19,
|
||||
"Slice": 13,
|
||||
"Neg": 6,
|
||||
"Concat": 6,
|
||||
"Softmax": 3,
|
||||
"Sigmoid": 3
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 16\n }\n dim {\n dim_value: 74\n }\n dim {\n dim_value: 32\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut200_20260924.onnx",
|
||||
"candidate_bytes": 55220296,
|
||||
"candidate_sha256": "ac4689420f1e4d350d0eb62536a6642be58519063f453d8ddd067ab861acbda0"
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 200,
|
||||
"terminal_node": "node_slice_20",
|
||||
"terminal_op": "Slice",
|
||||
"terminal_output": "slice_20",
|
||||
"extracted_node_count": 192,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 17,
|
||||
"MatMul": 29,
|
||||
"Add": 23,
|
||||
"Pow": 7,
|
||||
"ReduceMean": 7,
|
||||
"Sqrt": 7,
|
||||
"Reciprocal": 7,
|
||||
"Mul": 44,
|
||||
"Reshape": 19,
|
||||
"Slice": 13,
|
||||
"Neg": 6,
|
||||
"Concat": 6,
|
||||
"Softmax": 3,
|
||||
"Sigmoid": 3
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 16\n }\n dim {\n dim_value: 74\n }\n dim {\n dim_value: 32\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut200_20260924.onnx",
|
||||
"candidate_bytes": 55220296,
|
||||
"candidate_sha256": "ac4689420f1e4d350d0eb62536a6642be58519063f453d8ddd067ab861acbda0",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"fixture_sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55",
|
||||
"status": "component_not_qualified",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
16,
|
||||
74,
|
||||
32
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.019132299930788577,
|
||||
"vitisai_npu_device_count": 1,
|
||||
"vitisai_session_create_s": 395.8548383000307,
|
||||
"vitisai_inference_s": 0.010179699980653822,
|
||||
"vitisai_output_finite": true,
|
||||
"relative_l2_vs_cpu": 0.010834368355383315,
|
||||
"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\\cut200_profile_2026-09-24_18-53-37_291.json",
|
||||
"node_providers": {
|
||||
"vitisai": 1
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
+7
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{"cat" : "Session","pid" :61028,"tid" :34648,"dur" :492866,"ts" :15,"ph" : "X","name" :"model_loading_uri","args" : {}},
|
||||
{"cat" : "Session","pid" :61028,"tid" :34648,"dur" :395354504,"ts" :494639,"ph" : "X","name" :"session_initialization","args" : {}},
|
||||
{"cat" : "Node","pid" :61028,"tid" :34648,"dur" :9912,"ts" :395860042,"ph" : "X","name" :"vitisai_vitisai_13464227476512547982_0_0_kernel_time","args" : {"output_size" : "151552","mem_bytes_requested_in_use" : "151552","mem_requested_in_use_delta" : "151552","activation_size" : "151552","output_type_shape" : [{"float":[1,16,74,32]}],"mem_in_use_peak" : "151552","input_type_shape" : [{"float":[1,512,74]}],"thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "34648", "block_size": [], "core": -1, "Distribution": 0, "DistributionEnqueue": 0, "Run": 0, "Wait": 0, "WaitRevoke": 0}, "sub_threads": {"792": {"num_run": 0, "core": -1},"26448": {"num_run": 0, "core": -1},"36044": {"num_run": 0, "core": -1},"41248": {"num_run": 0, "core": -1},"57084": {"num_run": 0, "core": -1},"49964": {"num_run": 0, "core": -1},"51640": {"num_run": 0, "core": -1},"44408": {"num_run": 0, "core": -1},"13724": {"num_run": 0, "core": -1},"25108": {"num_run": 0, "core": -1},"45228": {"num_run": 0, "core": -1}}},"parameter_size" : "0","op_name" : "vitisai_13464227476512547982_0","provider" : "vitisai","mem_bytes_in_use" : "151552","node_index" : "201","mem_arena_held_delta" : "1048576","mem_arena_held" : "1048576","mem_in_use_delta" : "151552"}},
|
||||
{"cat" : "Session","pid" :61028,"tid" :34648,"dur" :9946,"ts" :395860031,"ph" : "X","name" :"SequentialExecutor::Execute","args" : {}},
|
||||
{"cat" : "Session","pid" :61028,"tid" :34648,"dur" :10027,"ts" :395859983,"ph" : "X","name" :"model_run","args" : {}}
|
||||
]
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 25,
|
||||
"terminal_node": "node_cat_3",
|
||||
"terminal_op": "Concat",
|
||||
"terminal_output": "cat_3",
|
||||
"extracted_node_count": 18,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 2,
|
||||
"MatMul": 2,
|
||||
"Add": 2,
|
||||
"Pow": 1,
|
||||
"ReduceMean": 1,
|
||||
"Sqrt": 1,
|
||||
"Reciprocal": 1,
|
||||
"Mul": 2,
|
||||
"Reshape": 1,
|
||||
"Slice": 2,
|
||||
"Neg": 1,
|
||||
"Concat": 1
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 16\n }\n dim {\n dim_value: 74\n }\n dim {\n dim_value: 64\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut25_20260924.onnx",
|
||||
"candidate_bytes": 10536396,
|
||||
"candidate_sha256": "bf759b46fe2f0fd42fd77a1ee286bb6f5ae9c3fb5f4125be353d51e2727a31cd"
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 25,
|
||||
"terminal_node": "node_cat_3",
|
||||
"terminal_op": "Concat",
|
||||
"terminal_output": "cat_3",
|
||||
"extracted_node_count": 18,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 2,
|
||||
"MatMul": 2,
|
||||
"Add": 2,
|
||||
"Pow": 1,
|
||||
"ReduceMean": 1,
|
||||
"Sqrt": 1,
|
||||
"Reciprocal": 1,
|
||||
"Mul": 2,
|
||||
"Reshape": 1,
|
||||
"Slice": 2,
|
||||
"Neg": 1,
|
||||
"Concat": 1
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 16\n }\n dim {\n dim_value: 74\n }\n dim {\n dim_value: 64\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut25_20260924.onnx",
|
||||
"candidate_bytes": 10536396,
|
||||
"candidate_sha256": "bf759b46fe2f0fd42fd77a1ee286bb6f5ae9c3fb5f4125be353d51e2727a31cd",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"fixture_sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55",
|
||||
"status": "npu_component_pass",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
16,
|
||||
74,
|
||||
64
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.004494599997997284,
|
||||
"vitisai_npu_device_count": 1,
|
||||
"vitisai_session_create_s": 164.08298429998104,
|
||||
"vitisai_inference_s": 0.011038600001484156,
|
||||
"vitisai_output_finite": true,
|
||||
"relative_l2_vs_cpu": 0.009578107362639126,
|
||||
"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\\cut25_profile_2026-09-24_18-38-11_408.json",
|
||||
"node_providers": {
|
||||
"vitisai": 1
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
+7
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{"cat" : "Session","pid" :57124,"tid" :43264,"dur" :135205,"ts" :24,"ph" : "X","name" :"model_loading_uri","args" : {}},
|
||||
{"cat" : "Session","pid" :57124,"tid" :43264,"dur" :163936671,"ts" :136195,"ph" : "X","name" :"session_initialization","args" : {}},
|
||||
{"cat" : "Node","pid" :57124,"tid" :43264,"dur" :10803,"ts" :164086924,"ph" : "X","name" :"vitisai_vitisai_16687684645906813047_0_0_kernel_time","args" : {"output_size" : "303104","mem_in_use_peak" : "303104","provider" : "vitisai","op_name" : "vitisai_16687684645906813047_0","parameter_size" : "0","node_index" : "21","mem_bytes_in_use" : "303104","mem_arena_held_delta" : "1048576","output_type_shape" : [{"float":[1,16,74,64]}],"activation_size" : "151552","mem_arena_held" : "1048576","mem_bytes_requested_in_use" : "303104","mem_in_use_delta" : "303104","mem_requested_in_use_delta" : "303104","input_type_shape" : [{"float":[1,512,74]}],"thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "43264", "block_size": [], "core": -1, "Distribution": 0, "DistributionEnqueue": 0, "Run": 0, "Wait": 0, "WaitRevoke": 0}, "sub_threads": {"4840": {"num_run": 0, "core": -1},"46252": {"num_run": 0, "core": -1},"49236": {"num_run": 0, "core": -1},"62456": {"num_run": 0, "core": -1},"41832": {"num_run": 0, "core": -1},"39600": {"num_run": 0, "core": -1},"65848": {"num_run": 0, "core": -1},"37408": {"num_run": 0, "core": -1},"58888": {"num_run": 0, "core": -1},"24656": {"num_run": 0, "core": -1},"60552": {"num_run": 0, "core": -1}}}}},
|
||||
{"cat" : "Session","pid" :57124,"tid" :43264,"dur" :10830,"ts" :164086915,"ph" : "X","name" :"SequentialExecutor::Execute","args" : {}},
|
||||
{"cat" : "Session","pid" :57124,"tid" :43264,"dur" :10907,"ts" :164086872,"ph" : "X","name" :"model_run","args" : {}}
|
||||
]
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 50,
|
||||
"terminal_node": "node_mean_1",
|
||||
"terminal_op": "ReduceMean",
|
||||
"terminal_output": "mean_1",
|
||||
"extracted_node_count": 50,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 6,
|
||||
"MatMul": 7,
|
||||
"Add": 6,
|
||||
"Pow": 2,
|
||||
"ReduceMean": 2,
|
||||
"Sqrt": 1,
|
||||
"Reciprocal": 1,
|
||||
"Mul": 9,
|
||||
"Reshape": 6,
|
||||
"Slice": 4,
|
||||
"Neg": 2,
|
||||
"Concat": 2,
|
||||
"Softmax": 1
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 74\n }\n dim {\n dim_value: 1\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut50_20260924.onnx",
|
||||
"candidate_bytes": 16971304,
|
||||
"candidate_sha256": "767e5c2f057137b9a2f409dee382196321621d1b4993affe3aff40906cfcd126"
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 50,
|
||||
"terminal_node": "node_mean_1",
|
||||
"terminal_op": "ReduceMean",
|
||||
"terminal_output": "mean_1",
|
||||
"extracted_node_count": 50,
|
||||
"extracted_ops": {
|
||||
"Conv": 1,
|
||||
"Transpose": 6,
|
||||
"MatMul": 7,
|
||||
"Add": 6,
|
||||
"Pow": 2,
|
||||
"ReduceMean": 2,
|
||||
"Sqrt": 1,
|
||||
"Reciprocal": 1,
|
||||
"Mul": 9,
|
||||
"Reshape": 6,
|
||||
"Slice": 4,
|
||||
"Neg": 2,
|
||||
"Concat": 2,
|
||||
"Softmax": 1
|
||||
},
|
||||
"output_type": "tensor_type {\n elem_type: 1\n shape {\n dim {\n dim_value: 1\n }\n dim {\n dim_value: 74\n }\n dim {\n dim_value: 1\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_cut50_20260924.onnx",
|
||||
"candidate_bytes": 16971304,
|
||||
"candidate_sha256": "767e5c2f057137b9a2f409dee382196321621d1b4993affe3aff40906cfcd126",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"fixture_sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55",
|
||||
"status": "component_not_qualified",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
74,
|
||||
1
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.005740500055253506,
|
||||
"vitisai_npu_device_count": 1,
|
||||
"vitisai_session_create_s": 301.3029315000167,
|
||||
"vitisai_inference_s": 0.005353299900889397,
|
||||
"vitisai_output_finite": true,
|
||||
"relative_l2_vs_cpu": 0.010590704757452671,
|
||||
"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\\cut50_profile_2026-09-24_18-41-52_208.json",
|
||||
"node_providers": {
|
||||
"vitisai": 1
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
+7
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{"cat" : "Session","pid" :61624,"tid" :39380,"dur" :187166,"ts" :26,"ph" : "X","name" :"model_loading_uri","args" : {}},
|
||||
{"cat" : "Session","pid" :61624,"tid" :39380,"dur" :301108436,"ts" :188260,"ph" : "X","name" :"session_initialization","args" : {}},
|
||||
{"cat" : "Node","pid" :61624,"tid" :39380,"dur" :5112,"ts" :301306688,"ph" : "X","name" :"vitisai_vitisai_14461510722584816882_0_0_kernel_time","args" : {"provider" : "vitisai","parameter_size" : "0","output_type_shape" : [{"float":[1,74,1]}],"mem_bytes_requested_in_use" : "296","output_size" : "296","mem_in_use_delta" : "512","mem_bytes_in_use" : "512","mem_arena_held" : "1048576","thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "39380", "block_size": [], "core": -1, "Distribution": 0, "DistributionEnqueue": 0, "Run": 0, "Wait": 0, "WaitRevoke": 0}, "sub_threads": {"11236": {"num_run": 0, "core": -1},"8668": {"num_run": 0, "core": -1},"4196": {"num_run": 0, "core": -1},"60620": {"num_run": 0, "core": -1},"20928": {"num_run": 0, "core": -1},"4128": {"num_run": 0, "core": -1},"48612": {"num_run": 0, "core": -1},"62700": {"num_run": 0, "core": -1},"50288": {"num_run": 0, "core": -1},"66448": {"num_run": 0, "core": -1},"18584": {"num_run": 0, "core": -1}}},"mem_arena_held_delta" : "1048576","node_index" : "55","op_name" : "vitisai_14461510722584816882_0","mem_in_use_peak" : "512","activation_size" : "151552","mem_requested_in_use_delta" : "296","input_type_shape" : [{"float":[1,512,74]}]}},
|
||||
{"cat" : "Session","pid" :61624,"tid" :39380,"dur" :5144,"ts" :301306678,"ph" : "X","name" :"SequentialExecutor::Execute","args" : {}},
|
||||
{"cat" : "Session","pid" :61624,"tid" :39380,"dur" :5222,"ts" :301306633,"ph" : "X","name" :"model_run","args" : {}}
|
||||
]
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
{
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_code2wav_c2_ctx72_20260924.onnx",
|
||||
"rewritten_sha256": "3f041942800dc22b4e0ee88cebb606d8117ff9d77f1d35e216fe185d4ad0cb90",
|
||||
"rewritten_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_code2wav_c2_ctx72_convtranspose2d_20260924.onnx",
|
||||
"fixture_sha256": "77aea3554c51b9daf808748257ebfc5e0496172c4d34c8267288be984d8a0f55",
|
||||
"input_provenance": "pinned real-weight vocoder fixture",
|
||||
"rewritten_nodes": [
|
||||
{
|
||||
"node_name": "node_convolution",
|
||||
"weight_name": "decoder.upsample.0.0.conv.weight",
|
||||
"original_weight_dims": [
|
||||
1024,
|
||||
1024,
|
||||
2
|
||||
],
|
||||
"new_weight_dims": [
|
||||
1024,
|
||||
1024,
|
||||
1,
|
||||
2
|
||||
]
|
||||
},
|
||||
{
|
||||
"node_name": "node_convolution_1",
|
||||
"weight_name": "decoder.upsample.1.0.conv.weight",
|
||||
"original_weight_dims": [
|
||||
1024,
|
||||
1024,
|
||||
2
|
||||
],
|
||||
"new_weight_dims": [
|
||||
1024,
|
||||
1024,
|
||||
1,
|
||||
2
|
||||
]
|
||||
},
|
||||
{
|
||||
"node_name": "node_convolution_2",
|
||||
"weight_name": "decoder.decoder.1.block.1.conv.weight",
|
||||
"original_weight_dims": [
|
||||
1536,
|
||||
768,
|
||||
16
|
||||
],
|
||||
"new_weight_dims": [
|
||||
1536,
|
||||
768,
|
||||
1,
|
||||
16
|
||||
]
|
||||
},
|
||||
{
|
||||
"node_name": "node_convolution_3",
|
||||
"weight_name": "decoder.decoder.2.block.1.conv.weight",
|
||||
"original_weight_dims": [
|
||||
768,
|
||||
384,
|
||||
10
|
||||
],
|
||||
"new_weight_dims": [
|
||||
768,
|
||||
384,
|
||||
1,
|
||||
10
|
||||
]
|
||||
},
|
||||
{
|
||||
"node_name": "node_convolution_4",
|
||||
"weight_name": "decoder.decoder.3.block.1.conv.weight",
|
||||
"original_weight_dims": [
|
||||
384,
|
||||
192,
|
||||
8
|
||||
],
|
||||
"new_weight_dims": [
|
||||
384,
|
||||
192,
|
||||
1,
|
||||
8
|
||||
]
|
||||
},
|
||||
{
|
||||
"node_name": "node_convolution_5",
|
||||
"weight_name": "decoder.decoder.4.block.1.conv.weight",
|
||||
"original_weight_dims": [
|
||||
192,
|
||||
96,
|
||||
6
|
||||
],
|
||||
"new_weight_dims": [
|
||||
192,
|
||||
96,
|
||||
1,
|
||||
6
|
||||
]
|
||||
}
|
||||
],
|
||||
"input_shape": [
|
||||
1,
|
||||
512,
|
||||
74
|
||||
],
|
||||
"output_shape": [
|
||||
1,
|
||||
3840
|
||||
],
|
||||
"cpu_finite": true,
|
||||
"cpu_relative_l2_vs_source": 0.0,
|
||||
"cpu_maximum_absolute_error": 0.0,
|
||||
"status": "cpu_rewrite_parity_pass"
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"source_sha256": "26dbbb23180ef66b4e4a3b9a7f796c8527e005b35932b8ead2572f5e1b1d4574",
|
||||
"source_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_local_convtranspose0_20260924.onnx",
|
||||
"rewritten_sha256": "c03bca763d6f19d3cadcbaf7d451dc4597623fa8d2da711cdabd30bfffbb3c97",
|
||||
"rewritten_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_local_convtranspose0_2d_20260924.onnx",
|
||||
"fixture_sha256": null,
|
||||
"input_provenance": "synthetic fixed-seed normal",
|
||||
"rewritten_nodes": [
|
||||
{
|
||||
"node_name": "node_convolution",
|
||||
"weight_name": "decoder.upsample.0.0.conv.weight",
|
||||
"original_weight_dims": [
|
||||
1024,
|
||||
1024,
|
||||
2
|
||||
],
|
||||
"new_weight_dims": [
|
||||
1024,
|
||||
1024,
|
||||
1,
|
||||
2
|
||||
]
|
||||
}
|
||||
],
|
||||
"input_shape": [
|
||||
1,
|
||||
1024,
|
||||
74
|
||||
],
|
||||
"output_shape": [
|
||||
1,
|
||||
1024,
|
||||
148
|
||||
],
|
||||
"cpu_finite": true,
|
||||
"cpu_relative_l2_vs_source": 0.0,
|
||||
"cpu_maximum_absolute_error": 0.0,
|
||||
"status": "component_not_qualified",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
1024,
|
||||
148
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.0028513999423012137,
|
||||
"vitisai_npu_device_count": 1,
|
||||
"vitisai_session_create_s": 111.91233259998262,
|
||||
"vitisai_inference_s": 0.006501700030639768,
|
||||
"vitisai_output_finite": true,
|
||||
"relative_l2_vs_cpu": 0.01635672268431982,
|
||||
"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\\local_convtranspose0_2d_profile_2026-09-24_19-02-21_591.json",
|
||||
"node_providers": {
|
||||
"vitisai": 1
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
+7
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{"cat" : "Session","pid" :40252,"tid" :41228,"dur" :105918,"ts" :16,"ph" : "X","name" :"model_loading_uri","args" : {}},
|
||||
{"cat" : "Session","pid" :40252,"tid" :41228,"dur" :111799462,"ts" :107111,"ph" : "X","name" :"session_initialization","args" : {}},
|
||||
{"cat" : "Node","pid" :40252,"tid" :41228,"dur" :6188,"ts" :111918533,"ph" : "X","name" :"vitisai_vitisai_13870022489430544753_0_0_kernel_time","args" : {"provider" : "vitisai","mem_bytes_in_use" : "1048576","output_size" : "606208","mem_bytes_requested_in_use" : "606208","mem_in_use_peak" : "1048576","mem_requested_in_use_delta" : "606208","thread_scheduling_stats" : {"main_thread": {"thread_pool_name": "session-2-intra-op", "thread_id": "41228", "block_size": [], "core": -1, "Distribution": 0, "DistributionEnqueue": 0, "Run": 0, "Wait": 0, "WaitRevoke": 0}, "sub_threads": {"60252": {"num_run": 0, "core": -1},"11412": {"num_run": 0, "core": -1},"64896": {"num_run": 0, "core": -1},"33584": {"num_run": 0, "core": -1},"452": {"num_run": 0, "core": -1},"54188": {"num_run": 0, "core": -1},"42092": {"num_run": 0, "core": -1},"58068": {"num_run": 0, "core": -1},"36752": {"num_run": 0, "core": -1},"25172": {"num_run": 0, "core": -1},"59496": {"num_run": 0, "core": -1}}},"node_index" : "3","parameter_size" : "0","op_name" : "vitisai_13870022489430544753_0","output_type_shape" : [{"float":[1,1024,148]}],"input_type_shape" : [{"float":[1,1024,74]}],"mem_arena_held_delta" : "1048576","mem_arena_held" : "1048576","activation_size" : "303104","mem_in_use_delta" : "1048576"}},
|
||||
{"cat" : "Session","pid" :40252,"tid" :41228,"dur" :6216,"ts" :111918524,"ph" : "X","name" :"SequentialExecutor::Execute","args" : {}},
|
||||
{"cat" : "Session","pid" :40252,"tid" :41228,"dur" :6362,"ts" :111918486,"ph" : "X","name" :"model_run","args" : {}}
|
||||
]
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"source_sha256": "26dbbb23180ef66b4e4a3b9a7f796c8527e005b35932b8ead2572f5e1b1d4574",
|
||||
"source_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_local_convtranspose0_20260924.onnx",
|
||||
"rewritten_sha256": "c03bca763d6f19d3cadcbaf7d451dc4597623fa8d2da711cdabd30bfffbb3c97",
|
||||
"rewritten_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_local_convtranspose0_2d_20260924.onnx",
|
||||
"fixture_sha256": null,
|
||||
"input_provenance": "synthetic fixed-seed normal",
|
||||
"rewritten_nodes": [
|
||||
{
|
||||
"node_name": "node_convolution",
|
||||
"weight_name": "decoder.upsample.0.0.conv.weight",
|
||||
"original_weight_dims": [
|
||||
1024,
|
||||
1024,
|
||||
2
|
||||
],
|
||||
"new_weight_dims": [
|
||||
1024,
|
||||
1024,
|
||||
1,
|
||||
2
|
||||
]
|
||||
}
|
||||
],
|
||||
"input_shape": [
|
||||
1,
|
||||
1024,
|
||||
74
|
||||
],
|
||||
"output_shape": [
|
||||
1,
|
||||
1024,
|
||||
148
|
||||
],
|
||||
"cpu_finite": true,
|
||||
"cpu_relative_l2_vs_source": 0.0,
|
||||
"cpu_maximum_absolute_error": 0.0,
|
||||
"status": "cpu_rewrite_parity_pass"
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"scope": "compiler bisection component, not a vocoder waveform or TTS stream",
|
||||
"source_sha256": "e563541bf77200ac4c4ca9d6e01cd7e25c09f9274233a8d82eeccc57580830d2",
|
||||
"source_node_count": 712,
|
||||
"cut_one_based": 487,
|
||||
"terminal_node": "node_convolution",
|
||||
"terminal_op": "ConvTranspose",
|
||||
"terminal_output": "convolution",
|
||||
"boundary_inputs": [
|
||||
"permute"
|
||||
],
|
||||
"extracted_node_count": 1,
|
||||
"extracted_ops": {
|
||||
"ConvTranspose": 1
|
||||
},
|
||||
"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: 148\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_local_convtranspose0_20260924.onnx",
|
||||
"candidate_bytes": 8395270,
|
||||
"candidate_sha256": "26dbbb23180ef66b4e4a3b9a7f796c8527e005b35932b8ead2572f5e1b1d4574"
|
||||
}
|
||||
+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": 487,
|
||||
"terminal_node": "node_convolution",
|
||||
"terminal_op": "ConvTranspose",
|
||||
"terminal_output": "convolution",
|
||||
"boundary_inputs": [
|
||||
"permute"
|
||||
],
|
||||
"extracted_node_count": 1,
|
||||
"extracted_ops": {
|
||||
"ConvTranspose": 1
|
||||
},
|
||||
"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: 148\n }\n }\n}\n",
|
||||
"candidate_file": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\models\\qwen3tts_vitisai_local_convtranspose0_20260924.onnx",
|
||||
"candidate_bytes": 8395270,
|
||||
"candidate_sha256": "26dbbb23180ef66b4e4a3b9a7f796c8527e005b35932b8ead2572f5e1b1d4574",
|
||||
"os": "Windows-11-10.0.26200-SP0",
|
||||
"onnxruntime_version": "1.30.0",
|
||||
"fixture_sha256": null,
|
||||
"input_provenance": "synthetic fixed-seed normal",
|
||||
"status": "vitisai_session_creation_started",
|
||||
"cpu_output_shape": [
|
||||
1,
|
||||
1024,
|
||||
148
|
||||
],
|
||||
"cpu_output_finite": true,
|
||||
"cpu_inference_s": 0.035261099925264716,
|
||||
"vitisai_npu_device_count": 1
|
||||
}
|
||||
BIN
Binary file not shown.
Whitespace-only changes.
@@ -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 (two real vocoder graphs passed CPU parity; VitisAI compiler crashed before NPU placement) | NOT E2E | NOT E2E | NOT E2E |
|
||||
| PC HX370 + AMD NPU / Windows worker | NOT E2E (output-head component passed) | NOT E2E (real Code2Wav prefixes to 200 nodes executed on NPU; 1D decoder compiler crash isolated; 2D rewrite exact on CPU, full NPU waveform unqualified) | 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 | CPU_COMPONENT_PARITY_PASS; VITISAI_COMPILER_CRASH; NOT_E2E_PROFILEABLE | Real-weight FP32 Code2Wav 25-frame and pinned two-frame ONNX exports reproduced their retained CPU waveforms at 6.46e-7 and 1.05e-6 relative L2 on the HX370 native Windows worker. With AMD VitisAI EP 1.8.63.0, both session creations aborted in vaiml.dll (LLVM ArrayRef assertion, exit 0xC000001D); both profiles are empty. No NPU node, waveform, latency, stage handoff or full TTS stream was verified. The historical export revision is unattested; the two-frame export is pinned to CustomVoice revision 85e237c. | Bisect the graph/compiler incompatibility, re-export a same-checkpoint numerically valid coarse vocoder stage, then verify actual NPU placement and whole-stream Omni handoff, state, memory, quality and latency; [raw AMD NPU 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; DECODER_2D_REWRITE_CPU_PARITY_PASS; 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. Full rewritten NPU waveform, stage handoff, whole TTS stream, latency and power remain unverified. The historical export revision is unattested; the two-frame source is pinned to CustomVoice revision 85e237c. | Complete full-graph NPU compilation and waveform/numeric/listening gates; profile actual placement, memory and coarse-stage benefit, then run the complete Omni TTS workload 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.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