Profile mobile MiniCPM and InternVLA NPU components

This commit is contained in:
tzhouam committed 2026-09-24 08:32:04 +08:00
1 parent 3b4469a136
commit 11c1a56467
13 files changed
+16760 -26

No files matched your search

@@ -7,6 +7,7 @@ import argparse
import hashlib
import json
import math
from collections import Counter
from pathlib import Path
import numpy as np
@@ -30,6 +31,8 @@ def main() -> None:
"inference-report", "device-output", "output-report",
):
parser.add_argument(f"--{name}", type=Path, required=True)
parser.add_argument("--device-name", default="Samsung Galaxy S25")
parser.add_argument("--profile-report", type=Path)
args = parser.parse_args()
compiled = json.loads(args.compile_report.read_text(encoding="utf-8"))
@@ -43,14 +46,16 @@ def main() -> None:
raise ValueError("inference used a different target model")
if inferred.get("device") != compiled.get("device"):
raise ValueError("compile/inference device metadata differs")
if inferred.get("device", {}).get("name") != "Samsung Galaxy S25":
raise ValueError("inference did not use the exact Galaxy S25")
if inferred.get("device", {}).get("name") != args.device_name:
raise ValueError("inference did not use the requested exact device")
if inferred.get("options") != "--compute_unit npu":
raise ValueError("inference did not request NPU")
if (inferred.get("job_id") != submitted.get("job_id")
or inferred.get("input_dataset_id") != submitted.get("input_dataset_id")):
raise ValueError("inference used a different job or input dataset")
if submitted.get("fixture_key") != "pattern_pixels":
if inferred.get("input_dataset_id") != "d26qo8p57":
raise ValueError("inference did not use the pinned pattern dataset")
if submitted.get("fixture_key", "pattern_pixels") != "pattern_pixels":
raise ValueError("submission did not use the pattern fixture")
files = {
@@ -108,10 +113,44 @@ def main() -> None:
},
"limits": [
"The fixture is synthetic; no real-observation or action-quality tolerance is established.",
"Requested NPU is not actual per-node placement without a device profile.",
"The action policy, state lifecycle, admission and complete request were not run on this device.",
],
}
if args.profile_report is not None:
profiled = json.loads(args.profile_report.read_text(encoding="utf-8"))
if (profiled.get("status") != "SUCCESS"
or profiled.get("model_id") != compiled["target_model_id"]
or profiled.get("device") != inferred["device"]
or profiled.get("options") != "--compute_unit npu"):
raise ValueError("profile did not execute the same target on the exact device")
profile = profiled["profile"]
summary = profile["execution_summary"]
samples = summary["all_inference_times"]
if not samples or any(not isinstance(value, int) or value <= 0 for value in samples):
raise ValueError("profile has no valid inference samples")
units = Counter(row.get("compute_unit") for row in profile["execution_detail"])
if not units:
raise ValueError("profile has no compute-unit detail")
ordered = sorted(samples)
report["profile"] = {
"job_id": profiled["job_id"],
"sample_count": len(samples),
"sample_min_us": ordered[0],
"nearest_rank_p50_us": ordered[math.ceil(0.50 * len(samples)) - 1],
"nearest_rank_p95_us": ordered[math.ceil(0.95 * len(samples)) - 1],
"reported_estimated_inference_time_us": summary["estimated_inference_time"],
"reported_peak_memory_bytes": summary["estimated_inference_peak_memory"],
"reported_first_load_time_us": summary["first_load_time"],
"reported_warm_load_time_us": summary["warm_load_time"],
"reported_first_load_peak_memory_bytes": summary["first_load_peak_memory"],
"reported_warm_load_peak_memory_bytes": summary["warm_load_peak_memory"],
"compute_unit_row_counts": dict(units),
}
report["status"] = "component_inference_numeric_and_placement_measured"
else:
report["limits"].append(
"Requested NPU is not actual per-node placement without a device profile."
)
args.output_report.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
print(json.dumps({"status": report["status"], "difference": report["source_vs_device"]}, indent=2))
@@ -6,6 +6,8 @@ from __future__ import annotations
import argparse
import hashlib
import json
import math
from collections import Counter
from pathlib import Path
import numpy as np
@@ -64,6 +66,7 @@ def main() -> None:
parser.add_argument("--inference-report", type=Path, required=True)
parser.add_argument("--device-output", type=Path, required=True)
parser.add_argument("--output-report", type=Path, required=True)
parser.add_argument("--profile-report", type=Path)
args = parser.parse_args()
compiled = json.loads(args.compile_report.read_text(encoding="utf-8"))
@@ -153,10 +156,45 @@ def main() -> None:
"limits": [
"The historical ONNX export does not attest the exact source checkpoint revision.",
"One retained decode fixture cannot establish speech-token or generated-audio quality.",
"Actual CPU/NPU placement requires a device profile; a request or compiled artifact alone is insufficient.",
"Thinker, audio/vision encoders, vocoder, state loop and complete Omni request were not tested.",
],
}
if args.profile_report is not None:
profiled = json.loads(args.profile_report.read_text(encoding="utf-8"))
expected_profile_options = (
"--compute_unit cpu" if compiled["options"] == "--target_runtime tflite"
else "--compute_unit npu"
)
if (profiled.get("status") != "SUCCESS"
or profiled.get("model_id") != compiled["target_model_id"]
or profiled.get("device") != inferred["device"]
or profiled.get("options") != expected_profile_options):
raise ValueError("profile did not execute the same target, device and route")
summary = profiled["profile"]["execution_summary"]
samples = summary["all_inference_times"]
if not samples or any(not isinstance(value, int) or value <= 0 for value in samples):
raise ValueError("profile has no valid inference samples")
units = Counter(row.get("compute_unit") for row in profiled["profile"]["execution_detail"])
if not units:
raise ValueError("profile has no compute-unit detail")
ordered = sorted(samples)
report["profile"] = {
"job_id": profiled["job_id"],
"sample_count": len(samples),
"sample_min_us": ordered[0],
"nearest_rank_p50_us": ordered[math.ceil(0.50 * len(samples)) - 1],
"nearest_rank_p95_us": ordered[math.ceil(0.95 * len(samples)) - 1],
"reported_estimated_inference_time_us": summary["estimated_inference_time"],
"reported_peak_memory_bytes": summary["estimated_inference_peak_memory"],
"reported_first_load_time_us": summary["first_load_time"],
"reported_first_load_peak_memory_bytes": summary["first_load_peak_memory"],
"compute_unit_row_counts": dict(units),
}
report["status"] = "component_inference_numeric_and_placement_measured"
else:
report["limits"].append(
"Actual CPU/NPU placement requires a device profile; a request or compiled artifact alone is insufficient."
)
args.output_report.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
print(json.dumps({
"status": report["status"],
@@ -6,6 +6,6 @@ A local HX370 x86-64 LiteRT CPU control of the identical SA/RB3 TFLite binary ma
The [talker decode-step attempt](evidence/qwen_tts_talker_qualcomm/README.md) pins a separate 28-layer source and synthetic cache fixture. Historical FP16 QNN context-binary inference executed on S24, S25, SA8775P and X Elite, but all four changed the CPU top-1 speech token with 8.57–9.43% logits relative L2. These artifacts are numerically unqualified on the fixture. RB3 rejected the floating-point-input artifact. Explicit X Elite ONNX CPU and SA8775P TFLite CPU fallback compiles passed. X Elite CPU-requested inference preserved CPU top-1 token 80 with logits relative L2 2.07e-5; its placement profile and SA inference remain pending. No complete talker loop or TTS stream passed.
The [MiniCPM-o speech-head study](evidence/minicpmo_tts_qualcomm/README.md) recovered the real 20-layer ONNX source and a matching retained fixture. S24 and S25 FP16 context-binary outputs preserved the ONNX CPU top-1 speech token with 0.346%/0.360% logits relative L2 on one step. FP16 QNN DLC compiles passed for SA8775P, X Elite and RB3. SA8775P NPU-requested inference preserved CPU top-1 token 1867 with 0.3568% logits relative L2; X Elite same-fixture inference also preserved token 1867 with 0.3170% logits relative L2. SA and X Elite placement profiles remain pending. RB3 FP16 QNN inference failed at graph load despite compile success; an explicit TFLite CPU fallback compile passed with same-fixture CPU-requested inference pending. The complete multimodal model remains unqualified on those devices.
The [MiniCPM-o speech-head study](evidence/minicpmo_tts_qualcomm/README.md) recovered the real 20-layer ONNX source and a matching retained fixture. S24 and S25 FP16 context-binary outputs preserved the ONNX CPU top-1 speech token with 0.346%/0.360% logits relative L2 on one step. Their 100-sample component profiles had p50/p95 8.537/9.006 ms and 7.197/7.615 ms, with all 1,029 execution-detail rows on NPU for each. FP16 QNN DLC compiles passed for SA8775P, X Elite and RB3. SA8775P NPU-requested inference preserved CPU top-1 token 1867 with 0.3568% logits relative L2; X Elite same-fixture inference also preserved token 1867 with 0.3170% logits relative L2. SA and X Elite placement profiles remain pending. RB3 FP16 QNN inference failed at graph load despite compile success; an explicit TFLite CPU fallback compile passed with same-fixture CPU-requested inference pending. The complete multimodal model remains unqualified on those devices.
The [InternVLA Cosmos S25 attempt](evidence/internvla_cosmos_qualcomm/README.md) repackages the real policy's image encoder from its parity-tested ONNX export. FLOAT16 QNN DLC inference returned a latent within 0.0524% relative L2 of the source on one pattern. Injecting it into the real policy on local CPU changed synthetic actions by 0.742% relative L2, without a task tolerance. S25 NPU placement profiling was pending. The same encoder compiled to FP16 QNN DLC for X Elite CRD, with same-fixture NPU-requested inference pending. Device-local action-policy support remains unqualified.
The [InternVLA Cosmos S25 attempt](evidence/internvla_cosmos_qualcomm/README.md) repackages the real policy's image encoder from its parity-tested ONNX export. FLOAT16 QNN DLC inference returned a latent within 0.0524% relative L2 of the source on one pattern. Injecting it into the real policy on local CPU changed synthetic actions by 0.742% relative L2, without a task tolerance. S25 six-frame component placement profile returned 100 samples at p50/p95 49.665/51.382 ms, with all 121 execution-detail rows on NPU. The same encoder compiled to FP16 QNN DLC for X Elite CRD, with same-fixture NPU-requested inference pending. Device-local action-policy support remains unqualified.
@@ -2,10 +2,10 @@
This tests the **real Place_Markpen Cosmos CI8x8 image encoder component**, not the action policy or complete InternVLA. The [source export](../../../e2e_expansion_20260923/evidence/internvla_cosmos_amd_npu/README.md) pins the checkpoint, FP32 `[6,3,256,256]` input, `[6,16,32,32]` output, two CPU parity fixtures and the original external-data ONNX files. The external data were embedded into one 125,112,088-byte ONNX file outside Git at `/home/zhout/project/edge_infer/models/InternVLA-cosmos-onnx/cosmos_encoder_embedded.onnx` (SHA256 `656a5263f584851a1457ef6dcf60b995f7c67b056b3c90a4f33c814f7caf9ec9`). The embedded form retained reference-relative ONNX CPU L2 errors of `8.74e-7` and `2.29e-6` on ramp and pattern fixtures.
Workbench source model `mn4okj3rq` was [submitted for Galaxy S25 QNN DLC compilation](s25/compile_submission.json) as job `jpxl4d1jp`, with `default_graph_htp_precision=FLOAT16`. The [compile](s25/compile_report.json) succeeded and produced target model `mqkp12rxm`. [Same-fixture pattern inference](s25/inference_report.json) requesting NPU also succeeded. The [audit](s25/audit_report.json) found **0.0524% relative L2 / 65.61 dB SNR** versus the pinned source latent, with finite FP32 `[6,16,32,32]` output. This establishes numerical behavior on one synthetic encoder fixture; requested NPU still needs the [placement profile](s25/profile_submission.json), which was pending at this snapshot.
Workbench source model `mn4okj3rq` was [submitted for Galaxy S25 QNN DLC compilation](s25/compile_submission.json) as job `jpxl4d1jp`, with `default_graph_htp_precision=FLOAT16`. The [compile](s25/compile_report.json) succeeded and produced target model `mqkp12rxm`. [Same-fixture pattern inference](s25/inference_report.json) requesting NPU also succeeded. The [audit](s25/audit_report.json) found **0.0524% relative L2 / 65.61 dB SNR** versus the pinned source latent, with finite FP32 `[6,16,32,32]` output. This establishes numerical behavior on one synthetic encoder fixture; the [placement profile](s25/profile_report.json) attributed all 121 execution-detail rows to NPU. Its 100 six-frame component samples had nearest-rank p50/p95 49.665/51.382 ms (minimum 47.438 ms); reported inference peak memory was 158,232,576 bytes. The service reported first/warm load times of 20.996/0.178 s and corresponding peak memories of 679,317,504/279,449,600 bytes for this component job. The combined audit binds placement, numerical output and exact target/device. These exclude the action policy, data handoff, cold-load cost and sustained operation.
The same source model also [compiled to FP16 QNN DLC on Snapdragon X Elite CRD](xelite/compile_report.json), producing target `mmxj0w8kq` for Windows ARM. A [same-fixture NPU-requested inference](xelite/inference_submission.json) was submitted using dataset `d26qo8p57` and remained pending. Compilation alone does not establish numerical fidelity or actual NPU placement on X Elite.
The [generic collector](../../../../experiments/collect_aihub_component.py) preserves terminal jobs, and the [Cosmos auditor](../../../../experiments/audit_internvla_cosmos_qualcomm.py) checks source/fixture hashes, target/device/dataset identity, latent shape and finite numerical difference against the pinned source reference. A separate [synthetic action sensitivity check](s25/action_sensitivity.json) injected either the pinned source or S25 latent into the same real Place_Markpen policy on **local CPU**, with zero state/noise. The [reproducer](../../../../experiments/probe_internvla_hosted_latent_actions.py) returned finite `[1,50,32]` actions; hosted-vs-source action relative L2 was **0.742%**, maximum absolute difference **0.0115**, cosine **0.999973**. Repeating the source policy gave bitwise identical actions. This is a cross-device numerical handoff experiment, not a device-local policy or robot-task pass; no real-observation action tolerance is known.
Next: inspect S25 NPU placement and X Elite same-fixture output, test representative real observations and action tolerances, then build and validate a device-local stateful policy. Full multimodal observation processing, admission, cancellation and sustained profiling remain open.
Next: inspect X Elite same-fixture output, test representative real observations and action tolerances, then build and validate a device-local stateful policy. Full multimodal observation processing, admission, cancellation and sustained profiling remain open.
@@ -1,6 +1,6 @@
{
"scope": "one six-frame Cosmos image encoder on synthetic pattern; no complete InternVLA policy",
"status": "component_inference_numeric_measured",
"status": "component_inference_numeric_and_placement_measured",
"device": {
"name": "Samsung Galaxy S25",
"os": "15",
@@ -49,7 +49,22 @@
},
"limits": [
"The fixture is synthetic; no real-observation or action-quality tolerance is established.",
"Requested NPU is not actual per-node placement without a device profile.",
"The action policy, state lifecycle, admission and complete request were not run on this device."
]
],
"profile": {
"job_id": "jp1njvm8g",
"sample_count": 100,
"sample_min_us": 47438,
"nearest_rank_p50_us": 49665,
"nearest_rank_p95_us": 51382,
"reported_estimated_inference_time_us": 47438,
"reported_peak_memory_bytes": 158232576,
"reported_first_load_time_us": 20996104,
"reported_warm_load_time_us": 177829,
"reported_first_load_peak_memory_bytes": 679317504,
"reported_warm_load_peak_memory_bytes": 279449600,
"compute_unit_row_counts": {
"NPU": 121
}
}
}
@@ -4,7 +4,7 @@ This is a **single fixed-cache 20-layer speech-head step**, not the complete thi
The [S25 historical inference](s25/inference_report.json) used dataset `d7gwxe3y2`; the [S24 historical inference](s24/inference_report.json) used `d7zn8rk57`. Downloaded inputs from both dataset IDs produced the same 44-array `.npz` SHA256 `65919ea1f351feec33c1415a3e3db76d60bc9c2beb3d49a72af75dcb418e83b4`. The retained fixture is outside Git under `/home/zhout/project/edge_infer/models/minicpmo45_tts_step_fixture_s25_20260924.npz`. ONNX Runtime 1.29 CPU produced a 41-output reference (SHA256 `902adcceadbe761d938ef2ade51cf953c8917ea1abfaee33a10c84e300c1bd96`), also outside Git.
The historical [S24](s24/compile_report.json) and [S25](s25/compile_report.json) FP16 QNN context-binary compiles and inference jobs succeeded. Against the **same original ONNX CPU fixture**, [S24](s24/audit_report.json) logits relative L2 was **0.3459%** and max K/V relative L2 **1.235%**; [S25](s25/audit_report.json) logits relative L2 was **0.3605%** and max K/V relative L2 **1.311%**. Both preserved the CPU top-1 speech token **1867** on this one synthetic step. The raw [S24](s24/device_output.npz) and [S25](s25/device_output.npz) arrays are retained. [S24](s24/profile_submission.json) and [S25](s25/profile_submission.json) placement profiles were submitted and pending. These values remain numerical component evidence, without a generated-audio quality threshold or actual NPU placement proof.
The historical [S24](s24/compile_report.json) and [S25](s25/compile_report.json) FP16 QNN context-binary compiles and inference jobs succeeded. Against the **same original ONNX CPU fixture**, [S24](s24/audit_report.json) logits relative L2 was **0.3459%** and max K/V relative L2 **1.235%**; [S25](s25/audit_report.json) logits relative L2 was **0.3605%** and max K/V relative L2 **1.311%**. Both preserved the CPU top-1 speech token **1867** on this one synthetic step. The raw [S24](s24/device_output.npz) and [S25](s25/device_output.npz) arrays are retained. The [S24](s24/profile_report.json) and [S25](s25/profile_report.json) profiles each returned 100 fixed-cache 20-layer component samples, with nearest-rank p50/p95 **8.537/9.006 ms** and **7.197/7.615 ms**, respectively. All **1,029 execution-detail rows** in each profile were attributed to NPU. The service estimated-time fields were the sample minima (8.211/7.125 ms), not medians. Reported inference peak memory was 165,433,344/185,991,168 bytes. The [S24](s24/audit_report.json) and [S25](s25/audit_report.json) audits now bind numerical outputs and placement to the exact target/device; generated-audio quality and complete model state remain unverified.
New FP16 QNN DLC [SA8775P](sa8775p/compile_report.json), [Snapdragon X Elite](xelite/compile_report.json) and [RB3 Gen 2](rb3/compile_report.json) compiles passed from the same source. The SA8775P [NPU-requested inference](sa8775p/inference_report.json) returned all 41 finite tensors on the retained fixture. Its [audit](sa8775p/audit_report.json) found **0.3568% logits relative L2** versus ONNX CPU, preserved CPU top-1 speech token **1867**, and measured maximum K/V relative L2 **1.225%**. The [placement profile](sa8775p/profile_submission.json) was submitted and remains pending; the inference request alone does not prove actual NPU node assignment. The X Elite [NPU-requested inference](xelite/inference_report.json) also returned all 41 finite tensors: its [audit](xelite/audit_report.json) found **0.3170% logits relative L2**, preserved CPU top-1 token **1867**, and measured maximum K/V relative L2 **1.221%**. Its [placement profile](xelite/profile_submission.json) was submitted and remains pending. The exact RB3 [FP16 QNN DLC inference](rb3/inference_report.json) **failed** while loading the graph with QnnModel_composeGraphsFromDlc: MODEL_GRAPH_ERROR, despite a successful compile. RB3 does not advertise FP16 HTP support in the device attributes; this failure constrains the tested artifact, not every RB3 path. An explicit [TFLite CPU fallback compile](rb3/cpu_fallback/compile_report.json) succeeded, producing target mnwv5d7wq; [same-fixture CPU-requested inference](rb3/cpu_fallback/inference_submission.json) is pending. The [collector](../../../../experiments/collect_aihub_component.py) retrieves terminal jobs, and the [auditor](../../../../experiments/audit_minicpmo_tts_qualcomm.py) pins hashes and checks all 41 output tensors.
@@ -1,6 +1,6 @@
{
"scope": "one fixed-cache 20-layer MiniCPM-o speech-head decode step; no complete multimodal stream",
"status": "component_inference_numeric_measured",
"status": "component_inference_numeric_and_placement_measured",
"device": {
"name": "Samsung Galaxy S24",
"os": "14",
@@ -299,7 +299,20 @@
"limits": [
"The historical ONNX export does not attest the exact source checkpoint revision.",
"One retained decode fixture cannot establish speech-token or generated-audio quality.",
"Actual NPU placement requires a device profile; a request or QNN artifact alone is insufficient.",
"Thinker, audio/vision encoders, vocoder, state loop and complete Omni request were not tested."
]
],
"profile": {
"job_id": "jglyx1qj5",
"sample_count": 100,
"sample_min_us": 8211,
"nearest_rank_p50_us": 8537,
"nearest_rank_p95_us": 9006,
"reported_estimated_inference_time_us": 8211,
"reported_peak_memory_bytes": 165433344,
"reported_first_load_time_us": 265005,
"reported_first_load_peak_memory_bytes": 97341440,
"compute_unit_row_counts": {
"NPU": 1029
}
}
}
@@ -1,6 +1,6 @@
{
"scope": "one fixed-cache 20-layer MiniCPM-o speech-head decode step; no complete multimodal stream",
"status": "component_inference_numeric_measured",
"status": "component_inference_numeric_and_placement_measured",
"device": {
"name": "Samsung Galaxy S25",
"os": "15",
@@ -299,7 +299,20 @@
"limits": [
"The historical ONNX export does not attest the exact source checkpoint revision.",
"One retained decode fixture cannot establish speech-token or generated-audio quality.",
"Actual NPU placement requires a device profile; a request or QNN artifact alone is insufficient.",
"Thinker, audio/vision encoders, vocoder, state loop and complete Omni request were not tested."
]
],
"profile": {
"job_id": "j5687d06g",
"sample_count": 100,
"sample_min_us": 7125,
"nearest_rank_p50_us": 7197,
"nearest_rank_p95_us": 7615,
"reported_estimated_inference_time_us": 7125,
"reported_peak_memory_bytes": 185991168,
"reported_first_load_time_us": 165452,
"reported_first_load_peak_memory_bytes": 114044928,
"compute_unit_row_counts": {
"NPU": 1029
}
}
}
@@ -18,9 +18,9 @@ The identical SA/RB3 TFLite binary matched original ONNX CPU within 3.45e-6 rela
A separate [Qwen3-TTS talker decode-step attempt](../../../e2e_expansion_20260924/evidence/qwen_tts_talker_qualcomm/README.md) recovered a 28-layer ONNX export and synthetic fixed-cache fixture. Historical FP16 QNN context-binary inference executed on S24, S25, SA8775P and X Elite, but all four changed the CPU reference top-1 speech token with 8.57–9.43% logits relative L2; they are numerically unqualified on this fixture. An RB3 compile rejected floating-point input. A separate X Elite ONNX CPU-requested talker step preserved CPU token 80 with logits relative L2 2.07e-5; placement profiling is pending. No complete talker loop or TTS stream follows.
A [Galaxy S25 InternVLA Cosmos attempt](../../../e2e_expansion_20260924/evidence/internvla_cosmos_qualcomm/README.md) packaged the real Place_Markpen image encoder into one ONNX file after two CPU parity fixtures. FLOAT16 QNN DLC inference returned a latent within 0.0524% relative L2 of the source on one pattern; device placement profile was pending. Injecting that latent into the real policy on local CPU changed synthetic actions by 0.742% relative L2, without a task tolerance. The same encoder compiled to FP16 QNN DLC for X Elite CRD, with same-fixture NPU-requested inference pending. This advances component and action-sensitivity evidence, not device-local full-policy qualification.
A [Galaxy S25 InternVLA Cosmos attempt](../../../e2e_expansion_20260924/evidence/internvla_cosmos_qualcomm/README.md) packaged the real Place_Markpen image encoder into one ONNX file after two CPU parity fixtures. FLOAT16 QNN DLC inference returned a latent within 0.0524% relative L2 of the source on one pattern; its 100-sample six-frame component profile had p50/p95 49.665/51.382 ms and all 121 execution-detail rows on NPU. Injecting that latent into the real policy on local CPU changed synthetic actions by 0.742% relative L2, without a task tolerance. The same encoder compiled to FP16 QNN DLC for X Elite CRD, with same-fixture NPU-requested inference pending. This advances component and action-sensitivity evidence, not device-local full-policy qualification.
A [MiniCPM-o speech-head study](../../../e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md) recovered the historical 20-layer source and matching S24/S25 fixtures. Both FP16 context-binary outputs preserved the ONNX CPU top-1 speech token on this one decode step with logits relative L2 of 0.346%/0.360%. New FP16 QNN DLC compiles passed for SA8775P, X Elite and RB3. SA8775P same-fixture NPU-requested inference returned finite outputs, preserved CPU top-1 token 1867 and had 0.3568% logits relative L2; actual NPU placement profiling is pending. X Elite same-fixture inference also preserved token 1867 with 0.3170% logits relative L2; its placement profile remains pending; RB3 FP16 QNN inference failed at graph load, and an explicit TFLite CPU fallback compile passed with same-fixture inference pending. These are speech-head component results, not multimodal MiniCPM-o requests.
A [MiniCPM-o speech-head study](../../../e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md) recovered the historical 20-layer source and matching S24/S25 fixtures. Both FP16 context-binary outputs preserved the ONNX CPU top-1 speech token on this one decode step with logits relative L2 of 0.346%/0.360%. S24/S25 100-sample component profiles attributed all 1,029 execution-detail rows to NPU, with p50/p95 8.537/9.006 ms and 7.197/7.615 ms. New FP16 QNN DLC compiles passed for SA8775P, X Elite and RB3. SA8775P same-fixture NPU-requested inference returned finite outputs, preserved CPU top-1 token 1867 and had 0.3568% logits relative L2; actual NPU placement profiling is pending. X Elite same-fixture inference also preserved token 1867 with 0.3170% logits relative L2; its placement profile remains pending; RB3 FP16 QNN inference failed at graph load, and an explicit TFLite CPU fallback compile passed with same-fixture inference pending. These are speech-head component results, not multimodal MiniCPM-o requests.
## Configuration × model
@@ -94,12 +94,12 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | Spark-X2.5 | NOT_E2E_PROFILEABLE | Fresh 2026-09-22 W8A16 full-attention component inference/profile passed; full1024 denotes one cache bucket. No full prefill/decode/KV/ring/sampling loop. | Implement and validate local 128-token generation, 512/1024 transitions, cancellation and resident memory. |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | Qwen3-TTS 0.6B CustomVoice | TALKER_FP16_NUMERIC_FAIL; NOT_E2E_PROFILEABLE | Fresh FP16 predictor inference passed; its one output exactly matches the same compiled artifact/dataset reference. The real 28-layer FP16 QNN talker step executed on the synthetic cache fixture, but changed CPU top-1 speech token 80 to 412 with 8.99% logits relative L2 and maximum new-K/V relative L2 11.71%. This tested talker artifact is numerically unqualified; no complete co-resident NPU/GPU stream exists. | Improve and revalidate the [talker artifact](../../../e2e_expansion_20260924/evidence/qwen_tts_talker_qualcomm/README.md), then qualify the device-local predictor/vocoder pipeline, output quality, recovery and 30-minute thermal behavior. |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | Qwen3.8-27B | NOT_E2E_PROFILEABLE | No complete qualified target artifact and device-local stateful Omni backend. Hub jobs provide component execution, not an on-device generation/streaming controller; ADB has no attached device. | Supply and validate the missing matching artifact/backend, then run the complete specified workload. |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | MiniCPM-o 4.5 | COMPONENT_FP16_SPEECH_HEAD_NUMERIC_MEASURED; NOT_E2E_PROFILEABLE | Fresh FP16 speech-head inference passed; all 41 outputs exactly matched the same artifact/dataset reference. Against the recovered original ONNX CPU source on the same fixture, logits relative L2 was 0.3605%, maximum new-K/V relative L2 1.311%, and top-1 speech token 1867 matched. Historical FP16 parity passed; tested W8A16 top-1 parity failed. No actual NPU placement profile, generated-audio quality gate, or qualified thinker/encoders/vocoder bundle exists. | Qualify device placement, a complete mobile checkpoint/export and the full multimodal/stateful pipeline; [speech-head evidence](../../../e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md). |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | InternVLA-A1 | COMPONENT_COSMOS_NUMERIC_MEASURED; SYNTHETIC_ACTION_SENSITIVITY_MEASURED; NOT_E2E_PROFILEABLE | The real Place_Markpen Cosmos image encoder FP32 ONNX export matched its source on two six-frame fixtures. Galaxy S25 FP16 QNN DLC inference returned a finite latent within 0.0524% relative L2 / 65.61 dB SNR of the pinned pattern source. Injecting this device latent into the same real policy on local CPU changed synthetic `[1,50,32]` actions by 0.742% relative L2; the CPU source repeated bitwise identically. No real-observation task tolerance or measured NPU placement exists (profile pending), and the policy was not resident on S25. ADB has no attached device. | Audit the [S25 encoder profile](../../../e2e_expansion_20260924/evidence/internvla_cosmos_qualcomm/README.md), then validate real action quality, device-local state, admission, cancellation and sustained behavior. |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | MiniCPM-o 4.5 | COMPONENT_FP16_SPEECH_HEAD_NPU_NUMERIC_PROFILED; NOT_E2E_PROFILEABLE | Fresh FP16 speech-head inference passed; all 41 outputs exactly matched the same artifact/dataset reference. Against the recovered original ONNX CPU source on the same fixture, logits relative L2 was 0.3605%, maximum new-K/V relative L2 1.311%, and top-1 speech token 1867 matched. Historical FP16 parity passed; tested W8A16 top-1 parity failed. The 100-sample component profile had p50/p95 7.197/7.615 ms, with all 1,029 execution-detail rows on NPU and reported inference peak memory 185,991,168 bytes. Generated-audio quality and qualified thinker/encoders/vocoder remain unverified. | Qualify a complete mobile checkpoint/export and the full multimodal/stateful pipeline; [speech-head evidence](../../../e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md). |
| Mobile Galaxy S25 / Snapdragon 8 Elite for Galaxy | InternVLA-A1 | COMPONENT_COSMOS_NPU_NUMERIC_PROFILED; SYNTHETIC_ACTION_SENSITIVITY_MEASURED; NOT_E2E_PROFILEABLE | The real Place_Markpen Cosmos image encoder FP32 ONNX export matched its source on two six-frame fixtures. Galaxy S25 FP16 QNN DLC inference returned a finite latent within 0.0524% relative L2 / 65.61 dB SNR of the pinned pattern source. Injecting this device latent into the same real policy on local CPU changed synthetic `[1,50,32]` actions by 0.742% relative L2; the CPU source repeated bitwise identically. The 100-sample six-frame encoder profile had nearest-rank p50/p95 49.665/51.382 ms, all 121 execution-detail rows on NPU, and a reported inference peak of 158,232,576 bytes. No real-observation task tolerance exists, and the action policy was not resident on S25. ADB has no attached device. | Extend the [S25 encoder component](../../../e2e_expansion_20260924/evidence/internvla_cosmos_qualcomm/README.md), then validate real action quality, device-local state, admission, cancellation and sustained behavior. |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | Spark-X2.5 | COMPONENT_NPU_INFERENCE_PROFILED; NOT_E2E_PROFILEABLE | The real 1.7B checkpoint's fixed-shape full-attention decoder **one-layer** W8A16 QDQ artifact compiled as QNN DLC and ran on an exact hosted Galaxy S24 (Android 14). A same-dataset inference returned finite hidden/new-K/new-V outputs identical to the prior S25 NPU outputs; the profile attributed all 73 execution-detail rows to NPU. Across 100 component samples, nearest-rank p50/p95 was 1.109/1.205 ms; the 1.098 ms `estimated_inference_time` field is the minimum, not a median. Relative L2 versus original FP32 ONNX CPU was 1.351%/0.377%/0.650% for hidden/K/V; no token-quality tolerance is known. This is one cache bucket, not 28-layer prefill/decode, KV-ring, sampling, a resident local controller or complete-request timing. ADB has no attached device. | Qualify a complete device-resident artifact/controller with state and token-quality gates, 128-token generation across 512/1024 context transitions, admission/cancel and sustained memory/power; [S24 NPU raw evidence](../../../e2e_expansion_20260923/evidence/spark_s24_full_attention/README.md). |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | Qwen3-TTS 0.6B CustomVoice | TALKER_FP16_NUMERIC_FAIL; NOT_E2E_PROFILEABLE | The real 28-layer FP16 QNN talker step executed on the synthetic cache fixture, but changed CPU top-1 speech token 80 to 1720 with 9.33% logits relative L2 and maximum new-K/V relative L2 11.23%. This differs from an earlier FP16 decoder parity test (39.13 dB SNR) on a different component/fixture; the tested INT8 decoder parity failed with negative SNR. No full local TTS stream exists. | Resolve the [talker numerical difference](../../../e2e_expansion_20260924/evidence/qwen_tts_talker_qualcomm/README.md), then validate the complete local pipeline and a quality-passing artifact set. |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | Qwen3.8-27B | NOT_E2E_PROFILEABLE | No complete qualified target artifact and device-local stateful Omni backend. Hub jobs provide component execution, not an on-device generation/streaming controller; ADB has no attached device. | Supply and validate the missing matching artifact/backend, then run the complete specified workload. |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | MiniCPM-o 4.5 | COMPONENT_FP16_SPEECH_HEAD_NUMERIC_MEASURED; NOT_E2E_PROFILEABLE | The retained FP16 speech-head job used a dataset with identical tensors to the recovered S25 fixture. Against original ONNX CPU, logits relative L2 was 0.3459%, maximum new-K/V relative L2 1.235%, and top-1 speech token 1867 matched. Earlier parity reported 49.22 dB SNR/top-1 match; tested W8A16 top-1 failed. Actual NPU placement, generated-audio quality and the rest of the model remain unqualified. | Qualify placement, thinker/encoders/vocoder and stateful local integration; [speech-head evidence](../../../e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md). |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | MiniCPM-o 4.5 | COMPONENT_FP16_SPEECH_HEAD_NPU_NUMERIC_PROFILED; NOT_E2E_PROFILEABLE | The retained FP16 speech-head job used a dataset with identical tensors to the recovered S25 fixture. Against original ONNX CPU, logits relative L2 was 0.3459%, maximum new-K/V relative L2 1.235%, and top-1 speech token 1867 matched. Earlier parity reported 49.22 dB SNR/top-1 match; tested W8A16 top-1 failed. The 100-sample component profile had p50/p95 8.537/9.006 ms, with all 1,029 execution-detail rows on NPU and reported inference peak memory 165,433,344 bytes. Generated-audio quality and the rest of the model remain unqualified. | Qualify thinker/encoders/vocoder and stateful local integration; [speech-head evidence](../../../e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md). |
| Mobile Galaxy S24 / Snapdragon 8 Gen 3 | InternVLA-A1 | NOT_E2E_PROFILEABLE | No complete qualified target artifact and device-local stateful Omni backend. Hub jobs provide component execution, not an on-device generation/streaming controller; ADB has no attached device. | Supply and validate the missing matching artifact/backend, then run the complete specified workload. |
| Embedded SA8775P ADP / AI Hub | Spark-X2.5 | COMPONENT_NPU_INFERENCE_PROFILED; NOT_E2E_PROFILEABLE | A real Spark-X2.5-1.7B one-layer W8A16 QDQ attention artifact, compiled as QNN DLC, ran on the exact hosted SA8775P ADP (Android 14). Inference returned finite hidden/new-K/new-V tensors bitwise identical to the prior S24/S25 NPU outputs on the same fixture; the profile attributed all 73 execution-detail rows to NPU. Across 100 component samples, nearest-rank p50/p95 was 1.837/2.079 ms; the 1.749 ms estimated-time field is the minimum. Hidden/K/V relative L2 versus original FP32 ONNX CPU was 1.351%/0.377%/0.650%, without a next-token quality tolerance. There is no complete 28-layer prefill/decode/KV-ring/sampling loop, resident Omni controller or complete-request timing. | Qualify a complete embedded resident artifact/controller with state, token quality, memory admission/cancel and sustained power; [SA8775P NPU raw evidence](../../../e2e_expansion_20260923/evidence/spark_sa8775_full_attention/README.md). |
| Embedded SA8775P ADP / AI Hub | Qwen3-TTS 0.6B CustomVoice | COMPONENT_CPU_VOCODER_PARITY_AND_PLACEMENT_PASS; QNN_NPU_VOCODER_COMPILE_PASS_INFERENCE_PENDING; COMPONENT_GPU_NUMERIC_FAIL; TALKER_FP16_NUMERIC_FAIL; NOT_E2E_PROFILEABLE | On the exact SA8775P, the same TFLite binary's CPU-requested Code2Wav inference matched original ONNX CPU within 4.13e-6 relative L2 / 107.67 dB SNR, without saturation; Its 100-sample CPU-requested component profile had p50/p95 5.384/5.534 s with all 738 execution-detail rows on CPU; the service estimated-time field 5.250 s is the sample minimum. The GPU-requested output saturated 96.63% of samples with 11.832 relative L2; its fresh 100-sample mixed CPU/GPU profile p50/p95 was 1.776/1.880 s, timing failed audio. Even with FP32-preserving GPU options, 84.89% of samples saturated with 11.389 relative L2. The 28-layer FP16 QNN talker step executed but changed CPU top-1 token 80 to 1720 with 9.43% logits relative L2. A TFLite CPU talker compile passed with same-fixture inference pending. A separate FP16 QNN DLC vocoder compile passed for SA8775P, with same-fixture NPU-requested inference pending. No complete pipeline exists. | Audit the pending SA FP16 QNN vocoder inference and talker CPU control, isolate GPU delegate and talker numerical failures, then establish listening quality, co-resident streaming, memory and sustained behavior; [vocoder](../../../e2e_expansion_20260924/evidence/qwen_tts_vocoder_qualcomm/README.md) and [talker](../../../e2e_expansion_20260924/evidence/qwen_tts_talker_qualcomm/README.md) evidence. |
+2 -2
View File
@@ -21,9 +21,9 @@ The identical SA/RB3 TFLite vocoder binary also matched original ONNX CPU within
A separate [28-layer talker decode-step attempt](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/qwen_tts_talker_qualcomm/README.md) retains a synthetic fixed-cache fixture and CPU reference. Historical FP16 QNN context-binary inference executed on S24, S25, SA8775P and X Elite, but all four changed the CPU top-1 speech token with 8.57–9.43% logits relative L2. RB3 rejected that floating-point-input artifact. Explicit X Elite ONNX CPU and SA8775P TFLite CPU fallback compiles passed. X Elite CPU-requested inference preserved CPU top-1 token 80 with logits relative L2 2.07e-5; its placement profile and SA inference remain pending. None advances M2 to numerical talker or full-stream qualification yet.
For M4, a [MiniCPM-o 4.5 speech-head study](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md) recovered the historical 20-layer ONNX source and matching S24/S25 fixtures. Both FP16 context-binary outputs preserved the ONNX CPU top-1 speech token on one decode step, with logits relative L2 0.346%/0.360%. New FP16 QNN DLC compiles passed for SA8775P, X Elite and RB3. SA8775P same-fixture NPU-requested inference preserved CPU top-1 speech token 1867 with 0.3568% logits relative L2 and 1.225% maximum K/V relative L2; placement profiling is pending. X Elite same-fixture inference also preserved token 1867 with 0.3170% logits relative L2; both placement profiles remain pending. RB3 FP16 QNN inference failed at graph load despite compile success; a TFLite CPU fallback compile passed with same-fixture CPU-requested inference pending. This is component C numerical evidence only, not thinker/encoder/vocoder or complete multimodal support.
For M4, a [MiniCPM-o 4.5 speech-head study](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/minicpmo_tts_qualcomm/README.md) recovered the historical 20-layer ONNX source and matching S24/S25 fixtures. Both FP16 context-binary outputs preserved the ONNX CPU top-1 speech token on one decode step, with logits relative L2 0.346%/0.360%. Their 100-sample component profiles had p50/p95 8.537/9.006 ms and 7.197/7.615 ms, with all 1,029 execution-detail rows on NPU for each. New FP16 QNN DLC compiles passed for SA8775P, X Elite and RB3. SA8775P same-fixture NPU-requested inference preserved CPU top-1 speech token 1867 with 0.3568% logits relative L2 and 1.225% maximum K/V relative L2; placement profiling is pending. X Elite same-fixture inference also preserved token 1867 with 0.3170% logits relative L2; both placement profiles remain pending. RB3 FP16 QNN inference failed at graph load despite compile success; a TFLite CPU fallback compile passed with same-fixture CPU-requested inference pending. This is component C numerical evidence only, not thinker/encoder/vocoder or complete multimodal support.
For M4, a [Galaxy S25 Cosmos encoder attempt](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/internvla_cosmos_qualcomm/README.md) repackages the real Place_Markpen FP32 ONNX export after retaining two CPU parity fixtures. FLOAT16 QNN DLC inference returned a latent within 0.0524% relative L2 of the source on one synthetic pattern. Injecting that output into the real policy on local CPU changed synthetic actions by 0.742% relative L2, without a task tolerance. S25 NPU placement profile was pending, and the policy did not run on S25. The same encoder compiled to FP16 QNN DLC for X Elite CRD, with same-fixture NPU-requested inference pending. This is component/action-sensitivity evidence, not device-local M4 qualification.
For M4, a [Galaxy S25 Cosmos encoder attempt](../../benchmarks/edge_harness/results/e2e_expansion_20260924/evidence/internvla_cosmos_qualcomm/README.md) repackages the real Place_Markpen FP32 ONNX export after retaining two CPU parity fixtures. FLOAT16 QNN DLC inference returned a latent within 0.0524% relative L2 of the source on one synthetic pattern. Injecting that output into the real policy on local CPU changed synthetic actions by 0.742% relative L2, without a task tolerance. S25 six-frame component profile returned 100 samples at p50/p95 49.665/51.382 ms, with all 121 execution-detail rows on NPU; the action policy did not run on S25. The same encoder compiled to FP16 QNN DLC for X Elite CRD, with same-fixture NPU-requested inference pending. This is component/action-sensitivity evidence, not device-local M4 qualification.
The [WSL CPU expansion](../../benchmarks/edge_harness/results/e2e_expansion_20260923/README.md)
adds constrained three-stage MiniCPM-o text-to-speech requests and a CPU-only