From 60d07a8afd4b874d5ed5fa2c25f60c60e5898177 Mon Sep 17 00:00:00 2001 From: tzhouam Date: Thu, 24 Sep 2026 03:18:27 +0800 Subject: [PATCH] Record native Windows MiniCPM-o CPU control and unstable latency --- .../results/e2e_expansion_20260923/README.md | 2 +- .../minicpmo_omni_radeon_profile20/README.md | 3 +- .../cpu_control_current.json | 173 +++++++ .../cpu_control_current.wav | Bin 0 -> 94124 bytes .../cpu_control_current_asr.json | 16 + .../cpu_control_current_asr.log | 23 + .../cpu_control_current_driver.log | 165 ++++++ .../cpu_control_worker.log | 470 ++++++++++++++++++ .../evidence/summary/README.md | 8 +- 9 files changed, 854 insertions(+), 6 deletions(-) create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current.json create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current.wav create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_asr.json create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_asr.log create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_driver.log create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_worker.log diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/README.md b/benchmarks/edge_harness/results/e2e_expansion_20260923/README.md index aae7a0857..75fac14e1 100644 --- a/benchmarks/edge_harness/results/e2e_expansion_20260923/README.md +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/README.md @@ -8,7 +8,7 @@ A further [native Windows CPU Omni policy profile](evidence/internvla_omni_windo The matching [native Windows CPU+Radeon Omni policy profile](evidence/internvla_omni_windows_hybrid/README.md) kept the BF16 action policy on CPU and ran only the pinned FP32 six-frame Cosmos encoder through a native DirectML worker. It returned 20/20 identical finite action chunks after one warmup at nearest-rank complete-request wall p50/p95 4.575/4.725 s, versus the separate native CPU baseline 4.878/4.902 s; startup was 140.31 s versus 135.60 s. Hybrid-vs-CPU action relative L2 difference was 2.4391% without a task tolerance. Native hybrid pre-launch refusal, in-flight abort and public `AsyncOmni.generate` action output passed with a 16 GiB shared-RAM reservation. The output device was verified as Radeon 890M, not every internal graph op. This is a synthetic integration pass, not robot-task E2E or sustained benefit. -A later [native Windows Radeon MiniCPM-o Omni profile](evidence/minicpmo_omni_radeon_profile20/README.md) completed one warmup and 20 serial **combined spoken-question+image → text+speech** requests with the same pinned GGUF set and patched C++ CLI. All 20 answered the red-square question and emitted complete speech; the first measured WAV independently transcribed with WER 0 using pinned Whisper tiny.en. Nearest-rank complete-request wall p50/p95 was **87.27/91.45 s**, much slower than the earlier 18.27 s single cold Omni request. A separate cold rerun after the profile took 88.01 s. All 21 successful new worker logs report Radeon Vulkan0 37/37 language layers, CPU Token2Wav and repeated `PrefetchVirtualMemory` warnings. The 21 GiB shared-RAM budget fit the pre-load available-RAM check and cancellation released it, but no matched CPU control or full memory/power trace identifies the regression's cause. This advances repeated functional evidence while weakening any claim of predictable Radeon performance under current memory conditions. +A later [native Windows Radeon MiniCPM-o Omni profile](evidence/minicpmo_omni_radeon_profile20/README.md) completed one warmup and 20 serial **combined spoken-question+image → text+speech** requests with the same pinned GGUF set and patched C++ CLI. All 20 answered the red-square question and emitted complete speech; the first measured WAV independently transcribed with WER 0 using pinned Whisper tiny.en. Nearest-rank complete-request wall p50/p95 was **87.27/91.45 s**, much slower than the earlier 18.27 s single cold Omni request. A separate cold rerun after the profile took 88.01 s. All 21 successful new worker logs report Radeon Vulkan0 37/37 language layers, CPU Token2Wav and repeated `PrefetchVirtualMemory` warnings. The 21 GiB shared-RAM budget fit the pre-load available-RAM check and cancellation released it. A later one-request CPU-only control with the same fixture took 73.63 s and also logged prefetch warnings despite 32.28 GB OS-available before load. The CPU control was not a matched-condition comparison; no full memory/power trace identifies the regression's cause. This advances repeated functional evidence while weakening any claim of predictable Radeon performance under current memory conditions. | Device / model | Verified depth | Observed output and time | Remaining gate | |---|---|---|---| diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md index b7455fdd2..aa18f1fd8 100644 --- a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md @@ -10,9 +10,10 @@ The fixture is the same 16 kHz spoken question “What color is the square in th |---|---:|---:|---| | One warmup + 20 serial measured requests | Nearest-rank p50/p95 **87.27/91.45 s**; range 69.91–97.90 s | 51.92 s | 21 GiB shared-RAM reservation and capacity; 23.80 GB OS-available before load; max sampled worker RSS 15.30 GB | | Separate cold rerun after profile | One **88.01 s** request | 47.63 s | Same 21 GiB budget; 23.99 GB OS-available before load; sampled worker RSS 15.30 GB ([report](cold_after_profile.json), [log](cold_after_worker_logs/)) | +| CPU-only control, run later | One **73.63 s** request with the same fixture | 51.80 s | Same 21 GiB budget but **32.28 GB** OS-available before load; sampled worker RSS 13.10 GB ([report](cpu_control_current.json), [worker log](cpu_control_worker.log)) | | Earlier cold Omni smoke | One **18.27 s** request | 6.83 s | 24 GiB reservation under a declared 30 GiB ceiling; [earlier record](../minicpmo_omni_cpp/radeon_report.json) | -These are different runs, not a paired speed comparison. The new repeated profile and cold rerun both passed functionally but were roughly five times slower than the older single cold request. Each of the 21 successful new worker logs contains two `PrefetchVirtualMemory failed` warnings, while the earlier single-request log contains none. Representative new language-model load times were about 25–27 s versus 6.07 s in the earlier log; the first measured new request took 89.67 s wall, including speech generation. Those observations are consistent with memory pressure or changed file-cache/paging conditions, **but do not identify a root cause**. Windows free RAM was only about 22.17 GiB at admission for a 21 GiB controller ceiling. Power/thermal state, full OS commit/pagefile time series, shared-iGPU allocation and a matched-condition CPU control were not captured. Do not reuse the older 18.27 s result as expected warmed performance or claim the Radeon path is faster than CPU under this condition. +These are different runs, not a paired speed comparison. The new repeated Radeon profile and cold rerun both passed functionally but were roughly five times slower than the older single cold request. Each of the 21 successful new Radeon worker logs contains two `PrefetchVirtualMemory failed` warnings, while the earlier single-request log contains none. Representative new Radeon language-model load times were about 25–27 s versus 6.07 s in the earlier log. The later CPU-only control used the same model/input hashes and pinned CPU CLI SHA256 `29247187ddf3b13591cd14cc070e5e25c6bb7547296acc5e8a74e2945811d725`. It also reported two prefetch warnings and a 36.03 s model load, versus 13.53 s in its earlier 24.34 s cold Omni smoke. Its complete request took 73.63 s despite more OS-available RAM at admission. The CPU control answered correctly and emitted a [1.96 s WAV](cpu_control_current.wav); pinned Whisper tiny.en transcribed “The square and the image is red.” (WER 0.143 for one output, [ASR report](cpu_control_current_asr.json)). These observations show the slowdown is not unique to Radeon or explained by **pre-load** free RAM alone. Memory pressure, changed UNC file-cache/paging conditions, and power/thermal state remain possible explanations, **not established causes**. Full OS commit/pagefile time series, shared-iGPU allocation and a truly matched-condition CPU/Radeon sequence were not captured. Do not reuse the older 18.27 s result as expected warmed performance or claim the Radeon path is faster than CPU under this condition. The stage verified artifacts and placement, admitted the explicit shared-RAM demand, and the final in-flight abort produced no stale output. Both abort and shutdown left zero reserved/quarantined bytes in the [profile report](profile20.json). The probe now refuses a declared capacity above OS-available RAM before loading. Sampled worker RSS does not establish the weight-loading peak or bound shared GPU allocation. No post-cancel restart, concurrency, real image/audio suite, playable streaming or sustained power/thermal gate was run. diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current.json b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current.json new file mode 100644 index 000000000..37554007a --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current.json @@ -0,0 +1,173 @@ +{ + "scope": "MiniCPM-o GGUF complete audio+image\u2192text+speech through Omni StageRuntime/StagePool", + "placement": "cpu", + "model_revision": "db25077c33951fe163b42986fba0132e279872a2", + "artifact_sha256": { + "MiniCPM-o-4_5-Q4_K_M.gguf": "1237a97ee081b8abebc47aa7dad565701e8f5f904cdc92f6723ac4281bbc0932", + "audio/MiniCPM-o-4_5-audio-F16.gguf": "d5b188ac7feaf98e17175c3f9bd14bf269301bfd187439fdaa3e3a494fc32ef7", + "vision/MiniCPM-o-4_5-vision-F16.gguf": "1453678cc4e4fe18de241952962e234f265cb8dda780773526103ab8ba82f421", + "tts/MiniCPM-o-4_5-tts-F16.gguf": "c7be3748a863dd6966ae7eed42600b7f41ca67affb03729ff245247f0e5ea088", + "tts/MiniCPM-o-4_5-projector-F16.gguf": "4b1b5b377358a5e594a304ff6ea5d52df606a9ba7d886c4299d232f0c67dd1fd", + "token2wav-gguf/encoder.gguf": "7f8d265da594eaf5e1de2db8f5f1867dbcb0bb75ef5878fadf2952347116f4d0", + "token2wav-gguf/flow_matching.gguf": "eda6069f3edeb5dd3a87fbf2aedb2ddd1b46f3273926c4fcf09b24476a39cab8", + "token2wav-gguf/flow_extra.gguf": "c67611aa7d02500fe395a7798bf0bfdfb55c74d37ba93934ca74d82b4e63f78d", + "token2wav-gguf/hifigan2.gguf": "1b8b3bf5d8d3066aeee4324fdcdd41aefce170d0ee907645858de408d82835c2", + "token2wav-gguf/prompt_cache.gguf": "81fe6f541ebe0b67db06a1e395df928da47991dc9637c2cf47d6c59d5b979f2c" + }, + "cli_sha256": "29247187ddf3b13591cd14cc070e5e25c6bb7547296acc5e8a74e2945811d725", + "reference_sha256": "cf4bb5cd9acbfbf67596d4a53310652b61ef4b7ede1d54eb03ef4882ca40223a", + "input_sha256": { + "audio_wav": "14ee147cbf2ce9afd9e32c8c8228d7cfe11985cd7e63456b2ad33871492aefcc", + "image_jpeg": "22c7ccea466a3f551c512045e6316c7597408d4e0a20205502f55784d977aa8d" + }, + "memory_budget": { + "capacities": { + "host_ram": 22548578304 + }, + "demands": { + "host_ram": 22548578304 + } + }, + "profile_count": 1, + "warmup_count": 0, + "host_available_bytes_before": 32275951616, + "startup_s": 51.80249010003172, + "execution_plan_at_start": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "0c6e504609b74d2aaeafef78473eff20", + "model_revision": "db25077c33951fe163b42986fba0132e279872a2", + "artifact_sha256": { + "MiniCPM-o-4_5-Q4_K_M.gguf": "1237a97ee081b8abebc47aa7dad565701e8f5f904cdc92f6723ac4281bbc0932", + "audio/MiniCPM-o-4_5-audio-F16.gguf": "d5b188ac7feaf98e17175c3f9bd14bf269301bfd187439fdaa3e3a494fc32ef7", + "vision/MiniCPM-o-4_5-vision-F16.gguf": "1453678cc4e4fe18de241952962e234f265cb8dda780773526103ab8ba82f421", + "tts/MiniCPM-o-4_5-tts-F16.gguf": "c7be3748a863dd6966ae7eed42600b7f41ca67affb03729ff245247f0e5ea088", + "tts/MiniCPM-o-4_5-projector-F16.gguf": "4b1b5b377358a5e594a304ff6ea5d52df606a9ba7d886c4299d232f0c67dd1fd", + "token2wav-gguf/encoder.gguf": "7f8d265da594eaf5e1de2db8f5f1867dbcb0bb75ef5878fadf2952347116f4d0", + "token2wav-gguf/flow_matching.gguf": "eda6069f3edeb5dd3a87fbf2aedb2ddd1b46f3273926c4fcf09b24476a39cab8", + "token2wav-gguf/flow_extra.gguf": "c67611aa7d02500fe395a7798bf0bfdfb55c74d37ba93934ca74d82b4e63f78d", + "token2wav-gguf/hifigan2.gguf": "1b8b3bf5d8d3066aeee4324fdcdd41aefce170d0ee907645858de408d82835c2", + "token2wav-gguf/prompt_cache.gguf": "81fe6f541ebe0b67db06a1e395df928da47991dc9637c2cf47d6c59d5b979f2c" + }, + "cli_sha256": "29247187ddf3b13591cd14cc070e5e25c6bb7547296acc5e8a74e2945811d725", + "requested_placement": "cpu", + "ggml_vk_visible_devices": null, + "shared_ram_reservation": { + "host_ram": 22548578304 + }, + "weights_bytes": 8872297088, + "memory_overhead_bytes": 12884901888, + "context_tokens": 2048, + "max_new_tokens": 96, + "request_capacity": 1, + "stateful_session": "C++-owned within one request; discarded after completion", + "placement_evidence": "pending first request" + }, + "warmups": [], + "measured": [ + { + "text": "The square in the image is red.", + "wall_s": 73.63217100000475, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 47040, + "duration_s": 1.96, + "pcm_sha256": "f3b9a5511325f873216d17f91164b6bc076786a65f4ebe5baa1e6a22d7374591" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 1, + "seq": 1, + "kind": "audio", + "worker_generation": "0c6e504609b74d2aaeafef78473eff20", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 73.61201989999972, + "peak_sampled_rss_bytes": 13103185920, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_current_cpu_logs\\minicpmo-1-d232d4fad9eb4ef9b2e3b58a1978f8cb.log" + } + } + ], + "complete_request": { + "text": "The square in the image is red.", + "wall_s": 73.63217100000475, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 47040, + "duration_s": 1.96, + "pcm_sha256": "f3b9a5511325f873216d17f91164b6bc076786a65f4ebe5baa1e6a22d7374591" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 1, + "seq": 1, + "kind": "audio", + "worker_generation": "0c6e504609b74d2aaeafef78473eff20", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 73.61201989999972, + "peak_sampled_rss_bytes": 13103185920, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_current_cpu_logs\\minicpmo-1-d232d4fad9eb4ef9b2e3b58a1978f8cb.log" + } + }, + "nearest_rank_p50_wall_s": 73.63217100000475, + "nearest_rank_p95_wall_s": 73.63217100000475, + "output_wav": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\vllm-omni-edge\\benchmarks\\edge_harness\\results\\e2e_expansion_20260923\\evidence\\minicpmo_omni_radeon_profile20\\cpu_control_current.wav", + "execution_plan_after_request": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "0c6e504609b74d2aaeafef78473eff20", + "model_revision": "db25077c33951fe163b42986fba0132e279872a2", + "artifact_sha256": { + "MiniCPM-o-4_5-Q4_K_M.gguf": "1237a97ee081b8abebc47aa7dad565701e8f5f904cdc92f6723ac4281bbc0932", + "audio/MiniCPM-o-4_5-audio-F16.gguf": "d5b188ac7feaf98e17175c3f9bd14bf269301bfd187439fdaa3e3a494fc32ef7", + "vision/MiniCPM-o-4_5-vision-F16.gguf": "1453678cc4e4fe18de241952962e234f265cb8dda780773526103ab8ba82f421", + "tts/MiniCPM-o-4_5-tts-F16.gguf": "c7be3748a863dd6966ae7eed42600b7f41ca67affb03729ff245247f0e5ea088", + "tts/MiniCPM-o-4_5-projector-F16.gguf": "4b1b5b377358a5e594a304ff6ea5d52df606a9ba7d886c4299d232f0c67dd1fd", + "token2wav-gguf/encoder.gguf": "7f8d265da594eaf5e1de2db8f5f1867dbcb0bb75ef5878fadf2952347116f4d0", + "token2wav-gguf/flow_matching.gguf": "eda6069f3edeb5dd3a87fbf2aedb2ddd1b46f3273926c4fcf09b24476a39cab8", + "token2wav-gguf/flow_extra.gguf": "c67611aa7d02500fe395a7798bf0bfdfb55c74d37ba93934ca74d82b4e63f78d", + "token2wav-gguf/hifigan2.gguf": "1b8b3bf5d8d3066aeee4324fdcdd41aefce170d0ee907645858de408d82835c2", + "token2wav-gguf/prompt_cache.gguf": "81fe6f541ebe0b67db06a1e395df928da47991dc9637c2cf47d6c59d5b979f2c" + }, + "cli_sha256": "29247187ddf3b13591cd14cc070e5e25c6bb7547296acc5e8a74e2945811d725", + "requested_placement": "cpu", + "ggml_vk_visible_devices": null, + "shared_ram_reservation": { + "host_ram": 22548578304 + }, + "weights_bytes": 8872297088, + "memory_overhead_bytes": 12884901888, + "context_tokens": 2048, + "max_new_tokens": 96, + "request_capacity": 1, + "stateful_session": "C++-owned within one request; discarded after completion", + "placement_evidence": { + "observed": "cpu", + "worker_pid": 29868, + "peak_sampled_rss_bytes": 13103185920, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_current_cpu_logs\\minicpmo-1-d232d4fad9eb4ef9b2e3b58a1978f8cb.log" + } + }, + "status": "passed", + "ledger_after_shutdown": { + "capacities": { + "host_ram": 22548578304 + }, + "reserved": { + "host_ram": 0 + }, + "owners": [], + "quarantined": [] + } +} diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current.wav b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current.wav new file mode 100644 index 0000000000000000000000000000000000000000..32e47429bfaf641159cea7764a30f43ce3f3a46b GIT binary patch literal 94124 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 z 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 A6aWAK literal 0 HcmV?d00001 diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_asr.json b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_asr.json new file mode 100644 index 000000000..9ac4680aa --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_asr.json @@ -0,0 +1,16 @@ +{ + "scope": "local Whisper tiny.en ASR proxy for generated speech; no perceptual quality claim", + "asr_model": "openai/whisper-tiny.en", + "asr_revision": "87c7102498dcde7456f24cfd30239ca606ed9063", + "asr_weights_sha256": "db59695928ded6043adaef491a53ef4e12da9611184d77c53baa691a60b958ad", + "transformers": "5.14.1", + "torch": "2.13.0+cpu", + "wav_sha256": "f0a45a85e6fe3619b14482619d9430a5184f6530efc55d08ad7c821d7ee54f2e", + "input_sample_rate": 24000, + "input_duration_s": 1.96, + "reference_text": "The square in the image is red.", + "transcript": "The square and the image is red.", + "word_error_rate": 0.14285714285714285, + "asr_load_s": 0.7989629450021312, + "asr_inference_s": 0.2657007460366003 +} diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_asr.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_asr.log new file mode 100644 index 000000000..e3c12993f --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_asr.log @@ -0,0 +1,23 @@ +W0924 03:14:14.503000 32407 torch/utils/_pytree.py:630] is an Enum subclass and is now natively supported by torch.compile as an opaque value type. Calling register_constant() on Enum subclasses is deprecated and will be an error in a future release. +W0924 03:14:14.542000 32407 torch/utils/_pytree.py:630] is an Enum subclass and is now natively supported by torch.compile as an opaque value type. Calling register_constant() on Enum subclasses is deprecated and will be an error in a future release. + Loading weights: 0%| | 0/167 [00:00 has been passed to `.generate()`, but it was also created in `.generate()`, given its parameterization. The custom will take precedence. Please check the docstring of to see related `.generate()` flags. +[transformers] A custom logits processor of type has been passed to `.generate()`, but it was also created in `.generate()`, given its parameterization. The custom will take precedence. Please check the docstring of to see related `.generate()` flags. +[transformers] Ignoring clean_up_tokenization_spaces=True for BPE tokenizer WhisperTokenizer. The clean_up_tokenization post-processing step is designed for WordPiece tokenizers and is destructive for BPE (it strips spaces before punctuation). Set clean_up_tokenization_spaces=False to suppress this warning, or set clean_up_tokenization_spaces_for_bpe_even_though_it_will_corrupt_output=True to force cleanup anyway. +{ + "scope": "local Whisper tiny.en ASR proxy for generated speech; no perceptual quality claim", + "asr_model": "openai/whisper-tiny.en", + "asr_revision": "87c7102498dcde7456f24cfd30239ca606ed9063", + "asr_weights_sha256": "db59695928ded6043adaef491a53ef4e12da9611184d77c53baa691a60b958ad", + "transformers": "5.14.1", + "torch": "2.13.0+cpu", + "wav_sha256": "f0a45a85e6fe3619b14482619d9430a5184f6530efc55d08ad7c821d7ee54f2e", + "input_sample_rate": 24000, + "input_duration_s": 1.96, + "reference_text": "The square in the image is red.", + "transcript": "The square and the image is red.", + "word_error_rate": 0.14285714285714285, + "asr_load_s": 0.7989629450021312, + "asr_inference_s": 0.2657007460366003 +} diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_driver.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_driver.log new file mode 100644 index 000000000..0922a7b21 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_current_driver.log @@ -0,0 +1,165 @@ +INFO 09-24 03:10:48 [patch.py:259] NVFP4 W4A4 weight_scale NaN-clamp: installed. +INFO 09-24 03:10:49 [patch.py:510] inductor factorable-divisibility patch: installed. +INFO 09-24 03:10:52 [stage_init_utils.py:768] [stage_init] Set VLLM_WORKER_MULTIPROC_METHOD=spawn +WARNING 09-24 03:10:52 [stage_init_utils.py:1887] [stage_init] Failed to load transfer config: [Errno 13] Permission denied: 'C:\\Users\\zhout' +{ + "scope": "MiniCPM-o GGUF complete audio+image\u2192text+speech through Omni StageRuntime/StagePool", + "placement": "cpu", + "model_revision": "db25077c33951fe163b42986fba0132e279872a2", + "cli_sha256": "29247187ddf3b13591cd14cc070e5e25c6bb7547296acc5e8a74e2945811d725", + "reference_sha256": "cf4bb5cd9acbfbf67596d4a53310652b61ef4b7ede1d54eb03ef4882ca40223a", + "input_sha256": { + "audio_wav": "14ee147cbf2ce9afd9e32c8c8228d7cfe11985cd7e63456b2ad33871492aefcc", + "image_jpeg": "22c7ccea466a3f551c512045e6316c7597408d4e0a20205502f55784d977aa8d" + }, + "memory_budget": { + "capacities": { + "host_ram": 22548578304 + }, + "demands": { + "host_ram": 22548578304 + } + }, + "profile_count": 1, + "warmup_count": 0, + "host_available_bytes_before": 32275951616, + "startup_s": 51.80249010003172, + "execution_plan_at_start": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "0c6e504609b74d2aaeafef78473eff20", + "model_revision": "db25077c33951fe163b42986fba0132e279872a2", + "artifact_sha256": { + "MiniCPM-o-4_5-Q4_K_M.gguf": "1237a97ee081b8abebc47aa7dad565701e8f5f904cdc92f6723ac4281bbc0932", + "audio/MiniCPM-o-4_5-audio-F16.gguf": "d5b188ac7feaf98e17175c3f9bd14bf269301bfd187439fdaa3e3a494fc32ef7", + "vision/MiniCPM-o-4_5-vision-F16.gguf": "1453678cc4e4fe18de241952962e234f265cb8dda780773526103ab8ba82f421", + "tts/MiniCPM-o-4_5-tts-F16.gguf": "c7be3748a863dd6966ae7eed42600b7f41ca67affb03729ff245247f0e5ea088", + "tts/MiniCPM-o-4_5-projector-F16.gguf": "4b1b5b377358a5e594a304ff6ea5d52df606a9ba7d886c4299d232f0c67dd1fd", + "token2wav-gguf/encoder.gguf": "7f8d265da594eaf5e1de2db8f5f1867dbcb0bb75ef5878fadf2952347116f4d0", + "token2wav-gguf/flow_matching.gguf": "eda6069f3edeb5dd3a87fbf2aedb2ddd1b46f3273926c4fcf09b24476a39cab8", + "token2wav-gguf/flow_extra.gguf": "c67611aa7d02500fe395a7798bf0bfdfb55c74d37ba93934ca74d82b4e63f78d", + "token2wav-gguf/hifigan2.gguf": "1b8b3bf5d8d3066aeee4324fdcdd41aefce170d0ee907645858de408d82835c2", + "token2wav-gguf/prompt_cache.gguf": "81fe6f541ebe0b67db06a1e395df928da47991dc9637c2cf47d6c59d5b979f2c" + }, + "cli_sha256": "29247187ddf3b13591cd14cc070e5e25c6bb7547296acc5e8a74e2945811d725", + "requested_placement": "cpu", + "ggml_vk_visible_devices": null, + "shared_ram_reservation": { + "host_ram": 22548578304 + }, + "weights_bytes": 8872297088, + "memory_overhead_bytes": 12884901888, + "context_tokens": 2048, + "max_new_tokens": 96, + "request_capacity": 1, + "stateful_session": "C++-owned within one request; discarded after completion", + "placement_evidence": "pending first request" + }, + "warmups": [], + "measured": [ + { + "text": "The square in the image is red.", + "wall_s": 73.63217100000475, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 47040, + "duration_s": 1.96, + "pcm_sha256": "f3b9a5511325f873216d17f91164b6bc076786a65f4ebe5baa1e6a22d7374591" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 1, + "seq": 1, + "kind": "audio", + "worker_generation": "0c6e504609b74d2aaeafef78473eff20", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 73.61201989999972, + "peak_sampled_rss_bytes": 13103185920, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_current_cpu_logs\\minicpmo-1-d232d4fad9eb4ef9b2e3b58a1978f8cb.log" + } + } + ], + "complete_request": { + "text": "The square in the image is red.", + "wall_s": 73.63217100000475, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 47040, + "duration_s": 1.96, + "pcm_sha256": "f3b9a5511325f873216d17f91164b6bc076786a65f4ebe5baa1e6a22d7374591" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 1, + "seq": 1, + "kind": "audio", + "worker_generation": "0c6e504609b74d2aaeafef78473eff20", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 73.61201989999972, + "peak_sampled_rss_bytes": 13103185920, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_current_cpu_logs\\minicpmo-1-d232d4fad9eb4ef9b2e3b58a1978f8cb.log" + } + }, + "nearest_rank_p50_wall_s": 73.63217100000475, + "nearest_rank_p95_wall_s": 73.63217100000475, + "output_wav": "\\\\wsl.localhost\\Ubuntu\\home\\zhout\\project\\edge_infer\\vllm-omni-edge\\benchmarks\\edge_harness\\results\\e2e_expansion_20260923\\evidence\\minicpmo_omni_radeon_profile20\\cpu_control_current.wav", + "execution_plan_after_request": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "0c6e504609b74d2aaeafef78473eff20", + "model_revision": "db25077c33951fe163b42986fba0132e279872a2", + "artifact_sha256": { + "MiniCPM-o-4_5-Q4_K_M.gguf": "1237a97ee081b8abebc47aa7dad565701e8f5f904cdc92f6723ac4281bbc0932", + "audio/MiniCPM-o-4_5-audio-F16.gguf": "d5b188ac7feaf98e17175c3f9bd14bf269301bfd187439fdaa3e3a494fc32ef7", + "vision/MiniCPM-o-4_5-vision-F16.gguf": "1453678cc4e4fe18de241952962e234f265cb8dda780773526103ab8ba82f421", + "tts/MiniCPM-o-4_5-tts-F16.gguf": "c7be3748a863dd6966ae7eed42600b7f41ca67affb03729ff245247f0e5ea088", + "tts/MiniCPM-o-4_5-projector-F16.gguf": "4b1b5b377358a5e594a304ff6ea5d52df606a9ba7d886c4299d232f0c67dd1fd", + "token2wav-gguf/encoder.gguf": "7f8d265da594eaf5e1de2db8f5f1867dbcb0bb75ef5878fadf2952347116f4d0", + "token2wav-gguf/flow_matching.gguf": "eda6069f3edeb5dd3a87fbf2aedb2ddd1b46f3273926c4fcf09b24476a39cab8", + "token2wav-gguf/flow_extra.gguf": "c67611aa7d02500fe395a7798bf0bfdfb55c74d37ba93934ca74d82b4e63f78d", + "token2wav-gguf/hifigan2.gguf": "1b8b3bf5d8d3066aeee4324fdcdd41aefce170d0ee907645858de408d82835c2", + "token2wav-gguf/prompt_cache.gguf": "81fe6f541ebe0b67db06a1e395df928da47991dc9637c2cf47d6c59d5b979f2c" + }, + "cli_sha256": "29247187ddf3b13591cd14cc070e5e25c6bb7547296acc5e8a74e2945811d725", + "requested_placement": "cpu", + "ggml_vk_visible_devices": null, + "shared_ram_reservation": { + "host_ram": 22548578304 + }, + "weights_bytes": 8872297088, + "memory_overhead_bytes": 12884901888, + "context_tokens": 2048, + "max_new_tokens": 96, + "request_capacity": 1, + "stateful_session": "C++-owned within one request; discarded after completion", + "placement_evidence": { + "observed": "cpu", + "worker_pid": 29868, + "peak_sampled_rss_bytes": 13103185920, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_current_cpu_logs\\minicpmo-1-d232d4fad9eb4ef9b2e3b58a1978f8cb.log" + } + }, + "status": "passed", + "ledger_after_shutdown": { + "capacities": { + "host_ram": 22548578304 + }, + "reserved": { + "host_ram": 0 + }, + "owners": [], + "quarantined": [] + } +} diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_worker.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_worker.log new file mode 100644 index 000000000..a603f6f86 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cpu_control_worker.log @@ -0,0 +1,470 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_loader: loaded meta data with 27 key-value pairs and 399 tensors from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf\MiniCPM-o-4_5-Q4_K_M.gguf (version GGUF V3 (latest)) +llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output. +llama_model_loader: - kv 0: general.architecture str = qwen3 +llama_model_loader: - kv 1: general.type str = model +llama_model_loader: - kv 2: general.name str = Llm +llama_model_loader: - kv 3: general.size_label str = 8.2B +llama_model_loader: - kv 4: qwen3.block_count u32 = 36 +llama_model_loader: - kv 5: qwen3.context_length u32 = 40960 +llama_model_loader: - kv 6: qwen3.embedding_length u32 = 4096 +llama_model_loader: - kv 7: qwen3.feed_forward_length u32 = 12288 +llama_model_loader: - kv 8: qwen3.attention.head_count u32 = 32 +llama_model_loader: - kv 9: qwen3.attention.head_count_kv u32 = 8 +llama_model_loader: - kv 10: qwen3.rope.freq_base f32 = 1000000.000000 +llama_model_loader: - kv 11: qwen3.attention.layer_norm_rms_epsilon f32 = 0.000001 +llama_model_loader: - kv 12: qwen3.attention.key_length u32 = 128 +llama_model_loader: - kv 13: qwen3.attention.value_length u32 = 128 +llama_model_loader: - kv 14: tokenizer.ggml.model str = gpt2 +llama_model_loader: - kv 15: tokenizer.ggml.pre str = qwen2 +llama_model_loader: - kv 16: tokenizer.ggml.tokens arr[str,151748] = ["!", "\"", "#", "$", "%", "&", "'", ... +llama_model_loader: - kv 17: tokenizer.ggml.token_type arr[i32,151748] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ... +llama_model_loader: - kv 18: tokenizer.ggml.merges arr[str,151387] = ["Ġ Ġ", "ĠĠ ĠĠ", "i n", "Ġ t",... +llama_model_loader: - kv 19: tokenizer.ggml.bos_token_id u32 = 151644 +llama_model_loader: - kv 20: tokenizer.ggml.eos_token_id u32 = 151645 +llama_model_loader: - kv 21: tokenizer.ggml.unknown_token_id u32 = 128244 +llama_model_loader: - kv 22: tokenizer.ggml.padding_token_id u32 = 151643 +llama_model_loader: - kv 23: tokenizer.ggml.add_bos_token bool = false +llama_model_loader: - kv 24: tokenizer.chat_template str = {%- if tools %}\n {{- '<|im_start|>... +llama_model_loader: - kv 25: general.quantization_version u32 = 2 +llama_model_loader: - kv 26: general.file_type u32 = 15 +llama_model_loader: - type f32: 145 tensors +llama_model_loader: - type q4_K: 217 tensors +llama_model_loader: - type q6_K: 37 tensors +print_info: file format = GGUF V3 (latest) +print_info: file type = Q4_K - Medium +print_info: file size = 4.68 GiB (4.90 BPW) +load: printing all EOG tokens: +load: - 151643 ('<|endoftext|>') +load: - 151645 ('<|im_end|>') +load: - 151662 ('<|fim_pad|>') +load: - 151663 ('<|repo_name|>') +load: - 151664 ('<|file_sep|>') +load: special tokens cache size = 106 +load: token to piece cache size = 0.9319 MB +print_info: arch = qwen3 +print_info: vocab_only = 0 +print_info: n_ctx_train = 40960 +print_info: n_embd = 4096 +print_info: n_layer = 36 +print_info: n_head = 32 +print_info: n_head_kv = 8 +print_info: n_rot = 128 +print_info: n_swa = 0 +print_info: is_swa_any = 0 +print_info: n_embd_head_k = 128 +print_info: n_embd_head_v = 128 +print_info: n_gqa = 4 +print_info: n_embd_k_gqa = 1024 +print_info: n_embd_v_gqa = 1024 +print_info: f_norm_eps = 0.0e+00 +print_info: f_norm_rms_eps = 1.0e-06 +print_info: f_clamp_kqv = 0.0e+00 +print_info: f_max_alibi_bias = 0.0e+00 +print_info: f_logit_scale = 0.0e+00 +print_info: f_attn_scale = 0.0e+00 +print_info: n_ff = 12288 +print_info: n_expert = 0 +print_info: n_expert_used = 0 +print_info: causal attn = 1 +print_info: pooling type = -1 +print_info: rope type = 2 +print_info: rope scaling = linear +print_info: freq_base_train = 1000000.0 +print_info: freq_scale_train = 1 +print_info: n_ctx_orig_yarn = 40960 +print_info: rope_finetuned = unknown +print_info: model type = 8B +print_info: model params = 8.19 B +print_info: general.name = Llm +print_info: vocab type = BPE +print_info: n_vocab = 151748 +print_info: n_merges = 151387 +print_info: BOS token = 151644 '<|im_start|>' +print_info: EOS token = 151645 '<|im_end|>' +print_info: EOT token = 151645 '<|im_end|>' +print_info: UNK token = 128244 '' +print_info: PAD token = 151643 '<|endoftext|>' +print_info: LF token = 198 'Ċ' +print_info: FIM PRE token = 151659 '<|fim_prefix|>' +print_info: FIM SUF token = 151661 '<|fim_suffix|>' +print_info: FIM MID token = 151660 '<|fim_middle|>' +print_info: FIM PAD token = 151662 '<|fim_pad|>' +print_info: FIM REP token = 151663 '<|repo_name|>' +print_info: FIM SEP token = 151664 '<|file_sep|>' +print_info: EOG token = 151643 '<|endoftext|>' +print_info: EOG token = 151645 '<|im_end|>' +print_info: EOG token = 151662 '<|fim_pad|>' +print_info: EOG token = 151663 '<|repo_name|>' +print_info: EOG token = 151664 '<|file_sep|>' +print_info: max token length = 256 +load_tensors: loading model tensors, this can take a while... (mmap = true) +warning: PrefetchVirtualMemory failed: Äڴæ×ÊԴ²»×㣬Î޷¨´¦Àí´ËÃüÁ + +load_tensors: CPU_REPACK model buffer size = 3199.50 MiB +load_tensors: CPU_Mapped model buffer size = 4761.17 MiB +..................................................................................... +llama_context: constructing llama_context +llama_context: n_seq_max = 1 +llama_context: n_ctx = 2048 +llama_context: n_ctx_per_seq = 2048 +llama_context: n_batch = 2048 +llama_context: n_ubatch = 512 +llama_context: causal_attn = 1 +llama_context: flash_attn = auto +llama_context: kv_unified = false +llama_context: freq_base = 1000000.0 +llama_context: freq_scale = 1 +llama_context: n_ctx_per_seq (2048) < n_ctx_train (40960) -- the full capacity of the model will not be utilized +llama_context: CPU output buffer size = 0.58 MiB +llama_kv_cache: CPU KV buffer size = 288.00 MiB +llama_kv_cache: size = 288.00 MiB ( 2048 cells, 36 layers, 1/1 seqs), K (f16): 144.00 MiB, V (f16): 144.00 MiB +llama_context: Flash Attention was auto, set to enabled +llama_context: CPU compute buffer size = 304.38 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 1 +llama_model_loader: loaded meta data with 30 key-value pairs and 193 tensors from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-tts-F16.gguf (version GGUF V3 (latest)) +llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output. +llama_model_loader: - kv 0: general.architecture str = llama +llama_model_loader: - kv 1: general.type str = model +llama_model_loader: - kv 2: general.name str = Tts +llama_model_loader: - kv 3: general.size_label str = 445M +llama_model_loader: - kv 4: llama.block_count u32 = 20 +llama_model_loader: - kv 5: llama.context_length u32 = 4096 +llama_model_loader: - kv 6: llama.embedding_length u32 = 768 +llama_model_loader: - kv 7: llama.feed_forward_length u32 = 3072 +llama_model_loader: - kv 8: llama.attention.head_count u32 = 12 +llama_model_loader: - kv 9: llama.attention.head_count_kv u32 = 12 +llama_model_loader: - kv 10: llama.rope.freq_base f32 = 10000.000000 +llama_model_loader: - kv 11: llama.attention.layer_norm_rms_epsilon f32 = 0.000001 +llama_model_loader: - kv 12: llama.attention.key_length u32 = 64 +llama_model_loader: - kv 13: llama.attention.value_length u32 = 64 +llama_model_loader: - kv 14: general.file_type u32 = 1 +llama_model_loader: - kv 15: llama.vocab_size u32 = 158626 +llama_model_loader: - kv 16: llama.rope.dimension_count u32 = 64 +llama_model_loader: - kv 17: general.quantization_version u32 = 2 +llama_model_loader: - kv 18: tokenizer.ggml.model str = gpt2 +llama_model_loader: - kv 19: tokenizer.ggml.pre str = qwen2 +llama_model_loader: - kv 20: tokenizer.ggml.tokens arr[str,158626] = ["!", "\"", "#", "$", "%", "&", "'", ... +llama_model_loader: - kv 21: tokenizer.ggml.token_type arr[i32,158626] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ... +llama_model_loader: - kv 22: tokenizer.ggml.merges arr[str,151387] = ["Ġ Ġ", "ĠĠ ĠĠ", "i n", "Ġ t",... +llama_model_loader: - kv 23: tokenizer.ggml.bos_token_id u32 = 151644 +llama_model_loader: - kv 24: tokenizer.ggml.eos_token_id u32 = 151645 +llama_model_loader: - kv 25: tokenizer.ggml.unknown_token_id u32 = 128244 +llama_model_loader: - kv 26: tokenizer.ggml.padding_token_id u32 = 151643 +llama_model_loader: - kv 27: tokenizer.ggml.add_bos_token bool = false +llama_model_loader: - kv 28: tokenizer.chat_template str = {%- if tools %}\n {{- '<|im_start|>... +llama_model_loader: - kv 29: tokenizer.ggml.add_space_prefix bool = false +llama_model_loader: - type f32: 50 tensors +llama_model_loader: - type f16: 143 tensors +print_info: file format = GGUF V3 (latest) +print_info: file type = F16 +print_info: file size = 1.07 GiB (20.70 BPW) +load: printing all EOG tokens: +load: - 151643 ('<|endoftext|>') +load: - 151645 ('<|im_end|>') +load: - 151662 ('<|fim_pad|>') +load: - 151663 ('<|repo_name|>') +load: - 151664 ('<|file_sep|>') +load: special tokens cache size = 106 +load: token to piece cache size = 0.9319 MB +print_info: arch = llama +print_info: vocab_only = 0 +print_info: n_ctx_train = 4096 +print_info: n_embd = 768 +print_info: n_layer = 20 +print_info: n_head = 12 +print_info: n_head_kv = 12 +print_info: n_rot = 64 +print_info: n_swa = 0 +print_info: is_swa_any = 0 +print_info: n_embd_head_k = 64 +print_info: n_embd_head_v = 64 +print_info: n_gqa = 1 +print_info: n_embd_k_gqa = 768 +print_info: n_embd_v_gqa = 768 +print_info: f_norm_eps = 0.0e+00 +print_info: f_norm_rms_eps = 1.0e-06 +print_info: f_clamp_kqv = 0.0e+00 +print_info: f_max_alibi_bias = 0.0e+00 +print_info: f_logit_scale = 0.0e+00 +print_info: f_attn_scale = 0.0e+00 +print_info: n_ff = 3072 +print_info: n_expert = 0 +print_info: n_expert_used = 0 +print_info: causal attn = 1 +print_info: pooling type = 0 +print_info: rope type = 0 +print_info: rope scaling = linear +print_info: freq_base_train = 10000.0 +print_info: freq_scale_train = 1 +print_info: n_ctx_orig_yarn = 4096 +print_info: rope_finetuned = unknown +print_info: model type = ?B +print_info: model params = 444.94 M +print_info: general.name = Tts +print_info: vocab type = BPE +print_info: n_vocab = 158626 +print_info: n_merges = 151387 +print_info: BOS token = 151644 '<|im_start|>' +print_info: EOS token = 151645 '<|im_end|>' +print_info: EOT token = 151645 '<|im_end|>' +print_info: UNK token = 128244 '' +print_info: PAD token = 151643 '<|endoftext|>' +print_info: LF token = 198 'Ċ' +print_info: FIM PRE token = 151659 '<|fim_prefix|>' +print_info: FIM SUF token = 151661 '<|fim_suffix|>' +print_info: FIM MID token = 151660 '<|fim_middle|>' +print_info: FIM PAD token = 151662 '<|fim_pad|>' +print_info: FIM REP token = 151663 '<|repo_name|>' +print_info: FIM SEP token = 151664 '<|file_sep|>' +print_info: EOG token = 151643 '<|endoftext|>' +print_info: EOG token = 151645 '<|im_end|>' +print_info: EOG token = 151662 '<|fim_pad|>' +print_info: EOG token = 151663 '<|repo_name|>' +print_info: EOG token = 151664 '<|file_sep|>' +print_info: max token length = 256 +load_tensors: loading model tensors, this can take a while... (mmap = true) +load_tensors: skipping TTS tensor emb_code.0.weight (size = 20158464 bytes) -- will be loaded separately +load_tensors: skipping TTS tensor emb_text.weight (size = 467140608 bytes) -- will be loaded separately +load_tensors: skipping TTS tensor projector_semantic.linear1.weight (size = 12582912 bytes) -- will be loaded separately +load_tensors: skipping TTS tensor projector_semantic.linear1.bias (size = 3072 bytes) -- will be loaded separately +load_tensors: skipping TTS tensor projector_semantic.linear2.weight (size = 2359296 bytes) -- will be loaded separately +load_tensors: skipping TTS tensor projector_semantic.linear2.bias (size = 3072 bytes) -- will be loaded separately +load_tensors: skipping TTS tensor projector_spk.linear1.weight (size = 6291456 bytes) -- will be loaded separately +load_tensors: skipping TTS tensor projector_spk.linear1.bias (size = 3072 bytes) -- will be loaded separately +load_tensors: skipping TTS tensor projector_spk.linear2.weight (size = 1179648 bytes) -- will be loaded separately +load_tensors: skipping TTS tensor projector_spk.linear2.bias (size = 3072 bytes) -- will be loaded separately +load_tensors: skipping TTS tensor head_code.0.weight (size = 20158464 bytes) -- will be loaded separately +warning: PrefetchVirtualMemory failed: Äڴæ×ÊԴ²»×㣬Î޷¨´¦Àí´ËÃüÁ + +load_tensors: CPU_Mapped model buffer size = 592.48 MiB +.............................................................. +llama_init_from_model: model default pooling_type is [0], but [-1] was specified +llama_context: constructing llama_context +llama_context: n_seq_max = 1 +llama_context: n_ctx = 2048 +llama_context: n_ctx_per_seq = 2048 +llama_context: n_batch = 2048 +llama_context: n_ubatch = 512 +llama_context: causal_attn = 1 +llama_context: flash_attn = auto +llama_context: kv_unified = false +llama_context: freq_base = 10000.0 +llama_context: freq_scale = 1 +llama_context: n_ctx_per_seq (2048) < n_ctx_train (4096) -- the full capacity of the model will not be utilized +llama_context: CPU output buffer size = 0.61 MiB +llama_kv_cache: CPU KV buffer size = 120.00 MiB +llama_kv_cache: size = 120.00 MiB ( 2048 cells, 20 layers, 1/1 seqs), K (f16): 60.00 MiB, V (f16): 60.00 MiB +llama_context: Flash Attention was auto, set to enabled +llama_context: CPU compute buffer size = 25.51 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 1 +vision_model_loader: model name: +vision_model_loader: description: image encoder for MiniCPM-V +vision_model_loader: GGUF version: 3 +vision_model_loader: alignment: 32 +vision_model_loader: n_tensors: 455 +vision_model_loader: n_kv: 20 + +vision_ctx: vision using CPU backend +load_hparams: model_type: 0 +load_hparams: n_embd: 1152 +load_hparams: n_head: 16 +load_hparams: n_ff: 4304 +load_hparams: n_layer: 27 +load_hparams: ffn_op: gelu +load_hparams: projection_dim: 0 + +--- vision hparams --- +load_hparams: image_size: 448 +load_hparams: patch_size: 14 +load_hparams: minicpmv_version: 100045 +load_hparams: proj_scale_factor: 0 +load_hparams: n_wa_pattern: 0 + +load_hparams: model size: 1044.36 MiB +load_hparams: metadata size: 0.16 MiB +load_tensors: ffn up/down are swapped +alloc_compute_meta: CPU compute buffer size = 100.30 MiB +init tts....init t2w....voc_hg2_model: CPU backend using 8 threads +audition_audio_preprocess: Decoded audio - sample_rate=16000, n_samples=32000 +audition_get_mel_filters: Retrieved mel filters from model: 80 mel bins x 201 fft bins +audition_audio_preprocess: Using mel filters - n_mel=80, n_fft=201 +audition_audio_preprocess: Generated 1 mel spectrogram chunk(s) +audition_audio_preprocess: Mel spectrogram ready - n_len=200, n_mel=80, total_size=16000 +build_whisper: Whisper encoder graph built (projector output, pre-pooling) +audition_audio_batch_encode: Audio input data - n_step=200, n_mel=80, total_elements=16000 +audition_audio_batch_encode: Before incrementing iter: input_frames=200, n_tokens=100, current_iter=0, current_total=0, new_total=100, max_tokens=1500 +audition_audio_batch_encode: KV cache iter incremented to 1 (total_tokens=100, max_tokens=1500) +audition_audio_batch_encode: Final output shape: [4096, 20] +audition_audio_batch_encode: Final output: 20 tokens x 4096 dims +=== Model Paths === + Base dir: \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf + LLM: \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf\MiniCPM-o-4_5-Q4_K_M.gguf [OK] + Vision: \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/vision/MiniCPM-o-4_5-vision-F16.gguf [OK] + Audio: \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/audio/MiniCPM-o-4_5-audio-F16.gguf [OK] + TTS: \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-tts-F16.gguf [OK] + Projector: \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-projector-F16.gguf [OK] +=================== +=== Initializing Omni Context === + Media type: 2 (omni: audio+vision) + TTS enabled: yes + Context size: 2048 + GPU layers: 0 + Token2Wav device: cpu + Vision backend: metal + TTS bin dir: \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/tts + Ref audio: \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\vllm-omni-edge\benchmarks\edge_harness\results\e2e_expansion_20260923\evidence\minicpmo_cpp_radeon890m_prompted\fixture_0000.wav +03:11:44.461 === omni_init start +03:11:44.462 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +03:11:44.462 === omni_init: loading new LLM model +03:12:14.668 === omni_init: loading TTS model +03:12:14.668 TTS model: loading with n_gpu_layers=0 +03:12:18.151 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +03:12:18.151 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +03:12:23.703 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +03:12:23.709 TTS: head_code loaded, verifying first few values: +03:12:23.709 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +03:12:23.709 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +03:12:23.709 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +03:12:23.762 TTS: weights loaded successfully +03:12:23.762 Projector: loading from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-projector-F16.gguf +03:12:23.868 Projector: loaded successfully +03:12:23.868 === omni_init: loading APM model +03:12:26.939 APM: init from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/audio/MiniCPM-o-4_5-audio-F16.gguf +03:12:31.896 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +03:12:31.950 Token2Wav: all model files found, initializing session... +03:12:31.950 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +03:12:31.950 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +03:12:36.461 Token2Wav: initialized successfully +03:12:36.461 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +03:12:36.461 Token2Wav: 使用 C++ 实现 +03:12:36.461 === omni_init success: ctx_llama = 00000196917e6700 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_current_cpu_work\omni-minicpmo-1-x38wkip1\fixture_ + Count: 2 +03:12:36.461 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +03:12:36.461 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_current_cpu_work\omni-minicpmo-1-x38wkip1\fixture_0000.wav +03:12:40.425 system prompt ref_audio embedding: n_pos=20 +03:12:42.645 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +03:12:42.645 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +03:12:42.645 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +03:12:42.645 n_past = 72 +03:12:42.645 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 6.1837 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 2927.74 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 2945.85 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 2945.86 ms by vision ( 2945.86 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_current_cpu_work\omni-minicpmo-1-x38wkip1\fixture_0001.jpg +stream_prefill: prefilled 1 vision chunks (64 tokens each) +audition_audio_preprocess: Decoded audio - sample_rate=16000, n_samples=49339 +audition_audio_preprocess: Audio not aligned to 100ms (49339 samples = 3083.7ms), padded with silence to 49600 samples (3100ms) +audition_get_mel_filters: Retrieved mel filters from model: 80 mel bins x 201 fft bins +audition_audio_preprocess: Using mel filters - n_mel=80, n_fft=201 +audition_audio_preprocess: Generated 1 mel spectrogram chunk(s) +audition_audio_preprocess: Mel spectrogram ready - n_len=310, n_mel=80, total_size=24800 +build_whisper: Whisper encoder graph built (projector output, pre-pooling) +audition_audio_batch_encode: Audio input data - n_step=310, n_mel=80, total_elements=24800 +audition_audio_batch_encode: Before incrementing iter: input_frames=310, n_tokens=155, current_iter=1, current_total=155, new_total=310, max_tokens=1500 +audition_audio_batch_encode: KV cache iter incremented to 2 (total_tokens=310, max_tokens=1500) +audition_audio_batch_encode: Final output shape: [4096, 31] +audition_audio_batch_encode: Final output: 31 tokens x 4096 dims +03:12:48.423 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_current_cpu_work\omni-minicpmo-1-x38wkip1\fixture_0001.wav +03:12:48.712 stream_prefill(index=1): user audio embedding: n_pos=31 +03:12:50.226 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 7.57891 s +03:12:50.226 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +03:12:50.226 stream_decode: create tts thread (simplex mode) +03:12:50.226 stream_decode: create t2w thread +03:12:50.226 wait prefill done +03:12:50.226 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +03:12:50.226 T2W thread (C++) started + +03:12:50.229 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +03:12:50.230 TTS thread started +03:12:50.694 📍 [单工TTS] assistant prompt 完成, n_past=182 +03:12:50.694 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +03:12:51.498 LLM: detected end token, set llm_generation_done=true +03:12:51.498 LLM->TTS: text='The square in the image is red.', n_tokens=8, hidden_size=32768, n_embd=4096, token_ids=[785 9334 304 279 2168 374 2518 13] +03:12:51.498 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +03:12:51.498 📍 轮次 1 结束,记录边界于 n_past=191 +03:12:51.498 TTS<-LLM: chunk_idx=0, text='The square in the image is red.', n_tokens=8, hidden_size=32768, token_ids=[785 9334 304 279 2168 374 2518 13] +03:12:51.498 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +03:12:51.498 TTS: before empty check - response.empty=0, response='The square in the image is red.', llm_finish=1 +Waiting for audio generation to complete... +TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_0.wav does not exist or is empty +TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_1.wav does not exist or is empty +TTS: no valid WAV files to merge +03:12:51.498 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +03:12:51.498 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +03:12:51.499 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +03:12:51.540 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +03:12:51.540 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +03:12:51.540 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +03:12:51.540 TTS Simplex: first chunk - cleared KV cache +03:12:51.540 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +03:12:51.797 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +03:12:51.895 TTS Simplex: prefill completed, n_past_tts=9 +03:12:51.895 TTS Simplex: sampler created +03:12:51.895 TTS simplex: is_audio_bos=true (first audio token) +03:12:51.920 TTS Simplex Phase1: token 1/500: rel_id=758 +03:12:51.931 TTS Simplex Phase1: token 2/500: rel_id=1950 +03:12:51.941 TTS Simplex Phase1: token 3/500: rel_id=4137 +03:12:51.952 TTS Simplex Phase1: token 4/500: rel_id=4218 +03:12:51.962 TTS Simplex Phase1: token 5/500: rel_id=4218 +03:12:52.175 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +03:12:52.175 TTS Simplex Phase1: token 25/500: rel_id=4913 +03:12:52.175 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +03:12:52.175 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +03:12:52.307 TTS Simplex Phase1: EOS token at step 38 +03:12:52.307 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +03:12:52.307 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=46 +03:12:52.314 TTS Simplex Phase2: text_eos_embed injected, n_past=47 +03:12:52.321 TTS Simplex Phase2: audio_bos injected, n_past=48, starting final generation +03:12:52.427 TTS Simplex Phase2: EOS at step 10 (final end) +03:12:52.427 TTS Simplex: chunk 结束,tts_token_buffer 剩余 21 tokens (保留等下一个 chunk) +03:12:52.427 TTS Simplex: is_final_text_chunk=true, flush 剩余 21 tokens 从 tts_token_buffer +03:12:52.427 TTS Simplex: generated 46 audio tokens for chunk 0 +03:12:52.427 TTS Simplex: chunk 0 first tokens: [758 1950 4137 4218 4218 ], last tokens: [139 57 878 729 1944 ] +03:12:52.427 TTS Simplex: updated tts_n_past_accumulated=58, total_generated_tokens=46 +03:12:52.437 TTS: finished processing all chunks +03:12:52.437 TTS: 单工模式轮次结束,下一轮 round_idx=1 +03:12:52.437 TTS: sent is_final=true to T2W queue (turn end) +03:12:54.480 🎉 首响时间 (First Audio Response): 4253ms +03:12:54.480 T2W线程: wav_0.wav | 0.84s audio | 2304.0ms inference | RTF=2.74 | t=4253ms +03:12:56.692 T2W线程: wav_1.wav | 1.12s audio | 2211.3ms inference | RTF=1.97 | t=6465ms +03:12:56.692 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=1) +03:12:56.692 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +03:12:56.741 omni_stop_threads: stop signals sent +03:12:56.741 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=1966.463ms vocoder=337.463ms total=2303.954ms audio=20160 +[timing] call=1 tokens=24 final=1 token2mel=1839.495ms vocoder=371.756ms total=2211.262ms audio=26880 +Audio generation completed. +llama_perf_context_print: load time = 36025.14 ms +llama_perf_context_print: prompt eval time = 14231.79 ms / 182 tokens ( 78.20 ms per token, 12.79 tokens per second) +llama_perf_context_print: eval time = 801.78 ms / 9 runs ( 89.09 ms per token, 11.23 tokens per second) +llama_perf_context_print: total time = 42072.15 ms / 191 tokens +llama_perf_context_print: graphs reused = 10 +Token2Wav (C++): session released +tts thread end +t2w thread end diff --git a/benchmarks/edge_harness/results/e2e_profiling_20260922/evidence/summary/README.md b/benchmarks/edge_harness/results/e2e_profiling_20260922/evidence/summary/README.md index 270c91442..2346bd0da 100644 --- a/benchmarks/edge_harness/results/e2e_profiling_20260922/evidence/summary/README.md +++ b/benchmarks/edge_harness/results/e2e_profiling_20260922/evidence/summary/README.md @@ -17,10 +17,10 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i | Device | Spark-X2.5 | Qwen3-TTS 0.6B CustomVoice | Qwen3.8-27B | MiniCPM-o 4.5 | InternVLA-A1 | |---|---|---|---|---|---| | PC HX370: CPU / WSL | profile completed | scoped E2E: Omni CPU text → complete WAV | NOT E2E | scoped E2E: Omni GGUF combined image+audio → text+speech | synthetic policy pass: Omni CPU | -| PC HX370: CPU / native Windows | scoped E2E: Omni Spark text | scoped E2E: Omni CPU text → complete WAV | NOT E2E | scoped E2E: Omni GGUF image+audio → text+speech | synthetic policy pass: Omni CPU | +| PC HX370: CPU / native Windows | scoped E2E: Omni Spark text | scoped E2E: Omni CPU text → complete WAV | NOT E2E | scoped E2E: Omni GGUF image+audio → text+speech (unstable latency) | synthetic policy pass: Omni CPU | | PC HX370 + RTX 5090 Laptop / WSL | profile completed | profile completed | scoped E2E: text + image | scoped E2E: text/image/audio → speech | synthetic policy pass | | PC HX370 + RTX 5090 Laptop / Windows | profile completed | profile completed | NOT E2E | scoped E2E: text/image/audio → speech | synthetic policy pass | -| PC HX370 + Radeon 890M / Windows worker | scoped E2E: Omni Spark text | scoped E2E: Omni Radeon talker/codec + CPU predictor | NOT E2E | scoped E2E: Omni Radeon+CPU image+audio → text+speech | synthetic policy pass: Omni CPU+Radeon Cosmos (WSL/native Windows) | +| PC HX370 + Radeon 890M / Windows worker | scoped E2E: Omni Spark text | scoped E2E: Omni Radeon talker/codec + CPU predictor | NOT E2E | scoped E2E: Omni Radeon+CPU image+audio → text+speech (unstable latency) | synthetic policy pass: Omni CPU+Radeon Cosmos (WSL/native Windows) | | PC HX370 + AMD NPU / Windows worker | NOT E2E (output-head component passed) | NOT E2E | NOT E2E | NOT E2E | NOT E2E | | PC CPU+iGPU+NPU +/- discrete GPU, joint model execution | NOT E2E | NOT E2E | NOT E2E | NOT E2E | NOT E2E | | PC Snapdragon X Elite CRD / AI Hub | NOT E2E | NOT E2E | NOT E2E | NOT E2E | NOT E2E | @@ -41,7 +41,7 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i | PC HX370: CPU / native Windows | Spark-X2.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST | The pinned Spark-X2.5-1.7B Q4_K_M GGUF ran in native Windows llama.cpp CPU (`-dev none -ngl 0`) as a whole-session Omni StageRuntime/StagePool backend. `Paris` and the correct `1511` inventory answer passed; one warmup plus 20 serial complete requests were 20/20 correct, nearest-rank wall p50/p95 6.93/7.05 s. The public AsyncOmni short request passed. The stage verifies artifact hashes and CPU placement (0/29 layers offloaded), reserves 4 GiB host RAM, emits a terminal text event and releases reservation after in-flight cancellation. The separate prior standalone profile was 6.65/6.86 s. No vLLM CPU attention repair, incremental stream, restart-after-cancel, loading peak or sustained power/thermal gate is claimed. | Validate broader text/token quality, streaming and cancellation recovery, memory peak and sustained load; [Omni raw evidence](../../../e2e_expansion_20260923/evidence/spark_omni_llamacpp/README.md), [standalone evidence](../../../e2e_expansion_20260923/evidence/spark_radeon890m_llamacpp/README.md). | | PC HX370: CPU / native Windows | Qwen3-TTS 0.6B CustomVoice | SCOPED_E2E_OMNI_COMPLETE_REQUEST | The pinned 0.6B CustomVoice BF16/SDPA checkpoint ran wholly on CPU through an isolated Qwen wrapper worker owned by one bounded Omni StageRuntime stage. Two named 24 kHz WAVs matched the earlier standalone PCM SHA256 values exactly. One warmup + 20 serial complete Omni requests for 4.56 s of audio had 20/20 identical PCM and nearest-rank wall p50/p95 15.32/15.60 s (RTF 3.36/3.42); independent Whisper tiny.en ASR gave WER 0.20 on the first Omni WAV, an intelligibility proxy only. A public AsyncOmni audio request passed. The stage verified pinned weights/interpreter and CPU placement, reserved 10 GiB host RAM, rejected an insufficient 4 GiB demand before worker launch, and after in-flight cancellation emitted no stale output and returned the ledger to zero. Sampled process-tree private memory peaked at 5.39 GB, not a loading peak. Native vLLM CPU attention operators remain absent; playable streaming, post-cancel restart, broader speech quality, loading peak and sustained power/thermal behavior remain unverified. | Validate playable streaming and restart/recovery, broader voice quality, peak memory, concurrency and sustained behavior; [Omni raw evidence](../../../e2e_expansion_20260923/evidence/qwen_tts_omni_cpu/README.md), [standalone baseline](../../../e2e_expansion_20260923/evidence/qwen_tts_native_cpu/README.md). | | PC HX370: CPU / native Windows | Qwen3.8-27B | NOT_E2E_PROFILEABLE | The installed native Windows vLLM extension lacks cpu_attn_reshape_and_cache and cpu_attn_get_scheduler_metadata. The separate ORT CPU graph worker is not a whole-model text/TTS adapter; a qualified CPU build/binding is missing. | Supply and validate the missing matching artifact/backend, then run the complete specified workload. | -| PC HX370: CPU / native Windows | MiniCPM-o 4.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST | The pinned Q4_K_M/F16 GGUF set ran one combined synthetic JPEG+spoken-question → text+speech request through a bounded Omni whole-session graph stage on native Windows CPU. It answered “The square in the image is red.” and produced 2.24 s of 24 kHz speech in 24.34 s complete-request wall time (one cold sample, zero warmups); sampled worker RSS peaked at 13.11 GB. The stage verified ten weight hashes and the CLI hash, observed CPU placement, reserved 24 GiB shared RAM, and emitted a terminal audio event. An 8 GiB reservation was refused before worker launch; in-flight cancellation left no stale output and released the ledger. The prior standalone prompted run took 24.66 s and independently transcribed output with WER 0. This is a whole-request C++ worker under Omni control, not native vLLM execution or playable streaming; one synthetic quality case is not general qualification. | Validate real image/audio suites, playable streaming, post-cancel restart, loading peak, repeated latency and sustained thermal behavior. [Omni raw evidence](../../../e2e_expansion_20260923/evidence/minicpmo_omni_cpp/README.md), [standalone prompted evidence](../../../e2e_expansion_20260923/evidence/minicpmo_cpp_windows_cpu_prompted/README.md), [failed first run](../../../e2e_expansion_20260923/evidence/minicpmo_cpp_windows_cpu_attempt1/README.md). | +| PC HX370: CPU / native Windows | MiniCPM-o 4.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST; PERFORMANCE_UNSTABLE | The pinned Q4_K_M/F16 GGUF set ran combined synthetic JPEG+spoken-question → text+speech requests through a bounded Omni whole-session graph stage on native Windows CPU. The earlier cold request answered “The square in the image is red.” and produced 2.24 s of 24 kHz speech in 24.34 s; the later one-request control with the same fixture and a 21 GiB budget also answered correctly but took 73.63 s and produced 1.96 s of speech. Its pinned Whisper tiny.en transcript had WER 0.143 (one-output intelligibility proxy). OS-available RAM before the later load was 32.28 GB, sampled worker RSS peaked at 13.10 GB, and the worker logged two `PrefetchVirtualMemory failed` warnings. The stage verified hashes and CPU placement, rejected insufficient RAM before launch, emitted a terminal audio event, and released the ledger after in-flight cancellation. These separate one-request runs do not form a latency distribution or establish the slowdown's cause. This is a whole-request C++ worker under Omni control, not native vLLM execution or playable streaming; one synthetic quality case is not general qualification. | Measure repeated CPU latency and OS memory/power with matched Radeon conditions; validate real image/audio suites, playable streaming, post-cancel restart, loading peak and sustained thermal behavior. [Later CPU control](../../../e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md), [earlier Omni raw evidence](../../../e2e_expansion_20260923/evidence/minicpmo_omni_cpp/README.md), [standalone prompted evidence](../../../e2e_expansion_20260923/evidence/minicpmo_cpp_windows_cpu_prompted/README.md), [failed first run](../../../e2e_expansion_20260923/evidence/minicpmo_cpp_windows_cpu_attempt1/README.md). | | PC HX370: CPU / native Windows | InternVLA-A1 | SYNTHETIC_POLICY_PASS_OMNI; NOT_TASK_E2E | The real Place_Markpen checkpoint now runs through an admitted native Windows Omni StageRuntime whole-policy stage with the policy and output on CPU. One warmup plus 20 serial patterned synthetic camera/state/noise requests returned identical finite `[1,50,32]` action chunks; nearest-rank complete-request wall p50/p95 was 4.878/4.902 s, excluding 135.60 s startup. A separate public `AsyncOmni.generate` request returned a terminal action event with the same hash. The stage verified checkpoint/interpreter hashes, used a 16 GiB host-RAM capacity and demand within observed Windows availability, refused 8 GiB before worker launch, and after in-flight abort emitted no stale output and released the ledger. Compared with the WSL CPU Omni output for this fixture, action relative L2 difference was 2.1795% and cosine 0.999764, without a task tolerance. The earlier one-forward zero-input policy result is a different fixture. | Validate real observations/reference actions, physical units/order/step time and deadlines, loading peak, post-cancel restart, concurrency and sustained power/thermal behavior; [native Omni evidence](../../../e2e_expansion_20260923/evidence/internvla_omni_windows_cpu/README.md), [earlier direct policy evidence](../../../e2e_expansion_20260923/README.md). | | PC HX370 + RTX 5090 Laptop / WSL | Spark-X2.5 | PROFILE_COMPLETED | not fully qualified: reference-quality and remaining reliability/performance gates must be reviewed | Broaden only with a named workload/device/precision qualification. | | PC HX370 + RTX 5090 Laptop / WSL | Qwen3-TTS 0.6B CustomVoice | PROFILE_COMPLETED | not fully qualified: reference-quality and remaining reliability/performance gates must be reviewed | Resolve and measure playback stalls; run quality, interruption and thermal tests. | @@ -56,7 +56,7 @@ NOT E2E means no complete device/model workload was verified. “Scoped E2E” i | PC HX370 + Radeon 890M / Windows worker | Spark-X2.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST | The same pinned Spark-X2.5-1.7B Q4_K_M GGUF completed text prefill/decode through a bounded Omni whole-session stage with llama.cpp Vulkan1. The log identifies Radeon 890M and 29/29 layers offloaded there, rather than RTX 5090; an intentionally wrong device name was refused. `Paris` and `1511` passed; one warmup plus 20 serial complete requests were 20/20 correct, nearest-rank wall p50/p95 2.10/2.14 s. A public AsyncOmni request passed; an oversized context was rejected with a later correct request; in-flight cancellation produced no stale output and released the ledger. The prior standalone run was 2.18/2.20 s. No streaming, restart-after-cancel, GPU-memory peak or sustained power/thermal check is claimed. | Qualify public configuration, broader text/token quality, streaming and cancellation recovery, shared-RAM/GPU peak and sustained use; [Omni raw evidence](../../../e2e_expansion_20260923/evidence/spark_omni_llamacpp/README.md), [standalone evidence](../../../e2e_expansion_20260923/evidence/spark_radeon890m_llamacpp/README.md). | | PC HX370 + Radeon 890M / Windows worker | Qwen3-TTS 0.6B CustomVoice | SCOPED_E2E_OMNI_COMPLETE_REQUEST_HYBRID | The pinned Q8_0 CustomVoice talker, F16 codec and punctuation GGUFs completed two named text-to-WAV requests through an Omni whole-session CrispASR stage on native Windows. The runtime log identifies Radeon 890M Vulkan0 for talker/codec and the 432 MB code predictor pinned to CPU FP32; this is not all-Radeon or NPU execution. Both PCM hashes exactly match the earlier standalone outputs. Whisper tiny.en transcribed the first Omni WAV and both standalone WAVs exactly (WER 0 as an intelligibility proxy). One warmup plus 20 serial complete Omni requests for 2.56 s of audio had identical PCM and nearest-rank wall p50/p95 3.298/3.336 s (RTF 1.29/1.30). A public AsyncOmni audio request passed; cancellation drained the worker without stale output or remaining reservation. The earlier standalone profile was 3.310/3.345 s. The default Vulkan configuration previously fell back to CPU, all-Vulkan ran away to a 360-frame cap, and DirectML failed waveform quality. No playable stream, post-cancel restart, loading peak, broad speech quality or sustained power/thermal run is claimed. | Validate playable streaming, restart/recovery, broader voice quality, shared-RAM/GPU peak, concurrency and sustained real-time behavior before wider qualification; [Omni raw evidence](../../../e2e_expansion_20260923/evidence/qwen_tts_omni_hybrid/README.md), [standalone evidence](../../../e2e_expansion_20260923/evidence/qwen_tts_radeon890m_joint/README.md), [failed DirectML route](../../../e2e_expansion_20260923/evidence/qwen_tts_radeon890m_directml/README.md). | | PC HX370 + Radeon 890M / Windows worker | Qwen3.8-27B | NOT_E2E_PROFILEABLE | FP32 448x448 vision tower: DirectML 85/113 nodes; normalized max error 9.095e-06 versus torch CPU. Historical component path, not full 27B or current graph-stage image-to-text integration. | Recover the hashed tower bundle and qualify its current Omni graph handoff with the language stage. | -| PC HX370 + Radeon 890M / Windows worker | MiniCPM-o 4.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST_HYBRID; PERFORMANCE_UNSTABLE | The pinned GGUF set ran a combined synthetic spoken-question+JPEG → text+speech workload through a bounded Omni whole-session graph stage. All 21 successful worker logs in a new serial profile verified Radeon 890M Vulkan0 language (37/37 layers) and vision, with CPU TTS/Token2Wav/vocoder; each request launched a fresh C++ model session. After one warmup, 20/20 requests answered “The square in the image is red.” and produced nonzero 2.08–3.00 s 24 kHz speech with terminal audio events. Nearest-rank complete-request wall p50/p95 was **87.27/91.45 s**, range 69.91–97.90 s, excluding 51.92 s controller startup. A separate cold rerun was 88.01 s. The first measured WAV transcribed exactly with pinned Whisper tiny.en (WER 0, one-output intelligibility proxy). A 21 GiB shared-RAM demand/capacity fit the 23.80 GB OS-available pre-load sample; maximum sampled worker RSS was 15.30 GB. Every successful new worker logged `PrefetchVirtualMemory failed` twice. The older one-cold-request Omni result was 18.27 s under a 24 GiB reservation/30 GiB declared ceiling and had no prefetch warning. The cause of the roughly fivefold regression is unqualified; no matched CPU control, OS memory/power time series or shared-iGPU allocation trace exists. In-flight cancellation left no stale output or reservation. This is CPU+iGPU joint execution, not all-Radeon, NPU, general quality or sustained performance qualification. | Measure Windows available/commit/pagefile and GPU shared-memory over matched CPU/Radeon runs; isolate UNC weight I/O, then validate real multimodal quality, playable streaming, post-cancel restart, loading peak, concurrency and sustained thermal behavior. [20-request Omni evidence](../../../e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md), [earlier single-request Omni evidence](../../../e2e_expansion_20260923/evidence/minicpmo_omni_cpp/README.md). | +| PC HX370 + Radeon 890M / Windows worker | MiniCPM-o 4.5 | SCOPED_E2E_OMNI_COMPLETE_REQUEST_HYBRID; PERFORMANCE_UNSTABLE | The pinned GGUF set ran a combined synthetic spoken-question+JPEG → text+speech workload through a bounded Omni whole-session graph stage. All 21 successful worker logs in a new serial profile verified Radeon 890M Vulkan0 language (37/37 layers) and vision, with CPU TTS/Token2Wav/vocoder; each request launched a fresh C++ model session. After one warmup, 20/20 requests answered “The square in the image is red.” and produced nonzero 2.08–3.00 s 24 kHz speech with terminal audio events. Nearest-rank complete-request wall p50/p95 was **87.27/91.45 s**, range 69.91–97.90 s, excluding 51.92 s controller startup. A separate cold rerun was 88.01 s. The first measured WAV transcribed exactly with pinned Whisper tiny.en (WER 0, one-output intelligibility proxy). A 21 GiB shared-RAM demand/capacity fit the 23.80 GB OS-available pre-load sample; maximum sampled worker RSS was 15.30 GB. Every successful new worker logged `PrefetchVirtualMemory failed` twice. The older one-cold-request Omni result was 18.27 s under a 24 GiB reservation/30 GiB declared ceiling and had no prefetch warning. The cause of the roughly fivefold regression is unqualified. A later CPU-only control with the same fixture also slowed to 73.63 s and logged prefetch warnings despite 32.28 GB OS-available before load; it was not a matched-condition comparison. OS memory/power time series and shared-iGPU allocation traces are still missing. In-flight cancellation left no stale output or reservation. This is CPU+iGPU joint execution, not all-Radeon, NPU, general quality or sustained performance qualification. | Measure Windows available/commit/pagefile and GPU shared-memory over matched CPU/Radeon runs; isolate UNC weight I/O, then validate real multimodal quality, playable streaming, post-cancel restart, loading peak, concurrency and sustained thermal behavior. [20-request Omni evidence](../../../e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md), [earlier single-request Omni evidence](../../../e2e_expansion_20260923/evidence/minicpmo_omni_cpp/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 | 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. |