From c5f47b22fda5bc3f11a4f236fb9af1daea2c29e0 Mon Sep 17 00:00:00 2001 From: tzhouam Date: Thu, 24 Sep 2026 03:09:21 +0800 Subject: [PATCH] Profile repeated Radeon MiniCPM-o requests and record memory regression --- .../experiments/probe_omni_minicpmo_cpp.py | 11 +- .../results/e2e_expansion_20260923/README.md | 2 + .../minicpmo_omni_radeon_profile20/README.md | 46 ++ .../cold_after_profile.json | 173 +++++ .../cold_after_profile.wav | Bin 0 -> 142124 bytes .../cold_after_profile_driver.log | 165 ++++ ...pmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.log | 484 ++++++++++++ .../profile20.json | 727 ++++++++++++++++++ .../profile20.wav | Bin 0 -> 119084 bytes .../profile20_driver.log | 719 +++++++++++++++++ .../profile20_first_asr.json | 16 + .../profile20_first_asr.log | 23 + ...pmo-1-27686b55445e443f955c0a221e4e72ed.log | 483 ++++++++++++ ...mo-10-45806b84a1394f5f8fc45d8638ef6504.log | 483 ++++++++++++ ...mo-11-5bf017cff9ff4d59b3f59c2fc3bf2266.log | 483 ++++++++++++ ...mo-12-61bda20e0fa141738dde2bd58c1311e3.log | 483 ++++++++++++ ...mo-13-b9ce8af2384f4702bc457ff245859deb.log | 483 ++++++++++++ ...mo-14-6a2560adbf8c404ba4ecb9b5bafe0f33.log | 483 ++++++++++++ ...mo-15-84c5ffad02684029bafbca2aba2106af.log | 484 ++++++++++++ ...mo-16-f66088565b534d1ab2749109959f8d63.log | 483 ++++++++++++ ...mo-17-1dbbf8d44c554b0ab0e9d63d3d3c6cfb.log | 483 ++++++++++++ ...mo-18-0d33268ae2ec4cca9d14bbaa000aed11.log | 483 ++++++++++++ ...mo-19-a1fe46c104ba46409bbcd1553640fab1.log | 483 ++++++++++++ ...pmo-2-765d0081ff11481199ba99c70808d3f7.log | 483 ++++++++++++ ...mo-20-60049a03aa98440796d4f3d095fab1da.log | 483 ++++++++++++ ...mo-21-5a4d63dd3dcb4f3c92057150efda2aa9.log | 483 ++++++++++++ ...mo-22-1c388ac477f54151ab41e9d2e3442d38.log | 0 ...pmo-3-5a5e09d95930426493ceb0d3c5d0f667.log | 484 ++++++++++++ ...pmo-4-9ea9b162dbbc4e99b2764d814900c4f5.log | 479 ++++++++++++ ...pmo-5-3f3a853496f84850a3b8d3e59ee80328.log | 483 ++++++++++++ ...pmo-6-765c426a238146cca67a2cf5a31dcec6.log | 483 ++++++++++++ ...pmo-7-509ef5e86bce44f3962216500758e762.log | 484 ++++++++++++ ...pmo-8-7919065c767c42ddb58856319722e6d0.log | 480 ++++++++++++ ...pmo-9-b84f40b2f7e54848ad7d8137a4b602c9.log | 484 ++++++++++++ .../evidence/summary/README.md | 4 +- docs/design/omni_edge_e2e_roadmap.md | 11 + 36 files changed, 12518 insertions(+), 3 deletions(-) create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_profile.json create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_profile.wav create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_profile_driver.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_worker_logs/minicpmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.log create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20.json create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20.wav create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_driver.log create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_first_asr.json create mode 100644 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_first_asr.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-1-27686b55445e443f955c0a221e4e72ed.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-10-45806b84a1394f5f8fc45d8638ef6504.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-11-5bf017cff9ff4d59b3f59c2fc3bf2266.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-12-61bda20e0fa141738dde2bd58c1311e3.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-13-b9ce8af2384f4702bc457ff245859deb.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-14-6a2560adbf8c404ba4ecb9b5bafe0f33.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-15-84c5ffad02684029bafbca2aba2106af.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-16-f66088565b534d1ab2749109959f8d63.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-17-1dbbf8d44c554b0ab0e9d63d3d3c6cfb.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-18-0d33268ae2ec4cca9d14bbaa000aed11.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-19-a1fe46c104ba46409bbcd1553640fab1.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-2-765d0081ff11481199ba99c70808d3f7.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-20-60049a03aa98440796d4f3d095fab1da.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-21-5a4d63dd3dcb4f3c92057150efda2aa9.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-22-1c388ac477f54151ab41e9d2e3442d38.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-3-5a5e09d95930426493ceb0d3c5d0f667.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-4-9ea9b162dbbc4e99b2764d814900c4f5.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-5-3f3a853496f84850a3b8d3e59ee80328.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-6-765c426a238146cca67a2cf5a31dcec6.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-7-509ef5e86bce44f3962216500758e762.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-8-7919065c767c42ddb58856319722e6d0.log create mode 100755 benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-9-b84f40b2f7e54848ad7d8137a4b602c9.log diff --git a/benchmarks/edge_harness/experiments/probe_omni_minicpmo_cpp.py b/benchmarks/edge_harness/experiments/probe_omni_minicpmo_cpp.py index 988b072bc..5531fbe5b 100644 --- a/benchmarks/edge_harness/experiments/probe_omni_minicpmo_cpp.py +++ b/benchmarks/edge_harness/experiments/probe_omni_minicpmo_cpp.py @@ -34,6 +34,14 @@ async def main() -> None: args = parser.parse_args() if args.warmups < 0 or args.repeats < 1: parser.error("warmups must be nonnegative and repeats must be positive") + if args.reserve_gib < 1 or args.capacity_gib < args.reserve_gib: + parser.error("invalid explicit host-RAM budget") + + import psutil + + host_available_bytes = psutil.virtual_memory().available + if args.capacity_gib << 30 > host_available_bytes: + raise RuntimeError("declared host-RAM capacity exceeds OS available RAM before load") from vllm_omni.config.stage_config import DeployConfig, StageDeployConfig, merge_pipeline_deploy from vllm_omni.engine.stage_runtime import StageRuntime @@ -76,7 +84,8 @@ async def main() -> None: "cli_sha256": args.cli_sha256, "reference_sha256": reference_hash, "input_sha256": {key: hashlib.sha256(value).hexdigest() for key, value in inputs.items()}, "memory_budget": budget, "profile_count": args.repeats, - "warmup_count": args.warmups} + "warmup_count": args.warmups, + "host_available_bytes_before": host_available_bytes} try: started = time.perf_counter() if args.expect_admission_refusal: diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/README.md b/benchmarks/edge_harness/results/e2e_expansion_20260923/README.md index 7828127bb..aae7a0857 100644 --- a/benchmarks/edge_harness/results/e2e_expansion_20260923/README.md +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/README.md @@ -8,6 +8,8 @@ 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. + | Device / model | Verified depth | Observed output and time | Remaining gate | |---|---|---|---| | Native Windows HX370 Radeon 890M / InternVLA-A1 Cosmos CI8x8 encoder | Component C; unchanged Omni encoder source in separate DirectML/PyTorch 2.4 environment, not an Omni full-policy stage | One warmup + 20 serial patterned 256×256 image encodes, including upload/readback: Radeon p50/p95 26.56/27.49 ms versus CPU 156.49/158.71 ms; relative L2 error 4.73e-07. Encoder weights and output device checked. | Complete policy/action and real-observation parity; policy/controller runtime compatibility, bounded handoff, shared-RAM admission and end-to-end benefit. [Raw evidence](evidence/internvla_cosmos_radeon890m/README.md). | 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 new file mode 100644 index 000000000..b7455fdd2 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md @@ -0,0 +1,46 @@ +# Native Windows Radeon MiniCPM-o: repeated Omni complete requests + +**Twenty scoped audio+image → text+speech requests passed; performance regressed under this memory condition.** The same pinned MiniCPM-o 4.5 GGUF bundle and bounded `llama-omni-cli.exe` from the [earlier one-request Omni pass](../minicpmo_omni_cpp/README.md) ran through `StageRuntime`/`StagePool` on the HX370 laptop, native Windows 11 build 26200 with Radeon 890M driver 32.0.22018.6001, Python 3.12.10, installed vLLM 0.29 and this Omni checkout. Every request launches a fresh C++ model session; the timings include its weight load, combined input processing, text generation, Token2Wav, and complete 24 kHz WAV assembly. They are not resident-model inference latency or playable streaming. + +The exact model revision `db25077c33951fe163b42986fba0132e279872a2`, ten GGUF artifact hashes, patched CLI SHA256 `66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523`, input hashes and 2,048-token/96-output-token bounds are in [profile20.json](profile20.json). The requested placement was `radeon-hybrid`: `GGML_VK_VISIBLE_DEVICES=1` selected `AMD Radeon(TM) 890M Graphics` Vulkan0 for language and vision, with CPU TTS/Token2Wav/vocoder. All **21 successful** worker logs (one warmup and 20 measured) identify the Radeon adapter, 37/37 language layers offloaded, and CPU Token2Wav. The [full logs](worker_logs/) are preserved with line endings and trailing whitespace normalized for text review; the original Windows files remain under the paths recorded in the JSON report. The 22nd log is the deliberately aborted request. This is CPU+iGPU joint execution, not NPU or all-GPU execution. + +The fixture is the same 16 kHz spoken question “What color is the square in the image?” plus a 448×448 synthetic red-square JPEG used by the earlier run. After one excluded warmup, all 20 measured requests answered “The square in the image is red.” and emitted a finite, nonzero complete WAV with a terminal audio event. Speech duration ranged **2.08–3.00 s** and the 20 PCM hashes differed; this is expected nondeterminism, not text-answer disagreement. The [first measured WAV](profile20.wav) transcribed exactly as “The square in the image is red.” with pinned local Whisper tiny.en revision `87c7102498dcde7456f24cfd30239ca606ed9063`, WER 0 for **one output only** ([ASR report](profile20_first_asr.json)). This is an intelligibility proxy, not broad speech or image-grounding quality. + +| Condition | Complete-request wall | Startup outside requests | Memory evidence | +|---|---:|---:|---| +| 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/)) | +| 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. + +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. + +Reproduce from the repository root in PowerShell with the pinned local artifacts: + +```powershell +$root = '\\wsl.localhost\Ubuntu\home\zhout\project\edge_infer' +$repo = Join-Path $root 'vllm-omni-edge' +$fixture = Join-Path $repo 'benchmarks\edge_harness\results\e2e_expansion_20260923\evidence\minicpmo_cpp_radeon890m_prompted' +$evidence = Join-Path $repo 'benchmarks\edge_harness\results\e2e_expansion_20260923\evidence\minicpmo_omni_radeon_profile20' +$py = 'C:\Users\zhout\w2\omni029venv\Scripts\python.exe' +$env:PYTHONUTF8 = '1' +$env:PYTHONPATH = $repo +$env:VLLM_ENABLE_V1_MULTIPROCESSING = '0' +& $py (Join-Path $repo 'benchmarks\edge_harness\experiments\probe_omni_minicpmo_cpp.py') ` + --model-dir (Join-Path $root 'models\MiniCPM-o-4_5-gguf') ` + --cli-bin 'C:\Users\zhout\w2\minicpmo_omni_bin_radeon\llama-omni-cli.exe' ` + --cli-sha256 '66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523' ` + --reference-wav (Join-Path $fixture 'fixture_0000.wav') ` + --audio-wav (Join-Path $fixture 'fixture_0001.wav') ` + --image-jpeg (Join-Path $fixture 'fixture_0001.jpg') ` + --artifact-report (Join-Path $fixture 'full_report.json') ` + --work-root 'C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon' ` + --log-root 'C:\Users\zhout\w2\minicpmo_omni_profile20_logs_radeon' ` + --placement radeon-hybrid --reserve-gib 21 --capacity-gib 21 ` + --warmups 1 --repeats 20 --abort-check ` + --output-report (Join-Path $evidence 'profile20.json') ` + --output-wav (Join-Path $evidence 'profile20.wav') +``` + +Next experiment: capture Windows available/commit/pagefile and GPU shared-memory time series across a matched CPU/Radeon pair, then isolate UNC weight I/O from model execution. Keep the full input/output quality and task checks separate from performance diagnosis. diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_profile.json b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_profile.json new file mode 100644 index 000000000..8ab9caff7 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_profile.json @@ -0,0 +1,173 @@ +{ + "scope": "MiniCPM-o GGUF complete audio+image\u2192text+speech through Omni StageRuntime/StagePool", + "placement": "radeon-hybrid", + "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": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "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": 23985426432, + "startup_s": 47.634812799980864, + "execution_plan_at_start": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "21544f963e164e55872e99c89e92e955", + "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": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "requested_placement": "radeon-hybrid", + "ggml_vk_visible_devices": "1", + "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": 88.00621939997654, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 71040, + "duration_s": 2.96, + "pcm_sha256": "ec297eabb746949c9a3e86683feea75a2226c2dda207d89e04dbb5281dda71a2" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 1, + "seq": 1, + "kind": "audio", + "worker_generation": "21544f963e164e55872e99c89e92e955", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.98023680003826, + "peak_sampled_rss_bytes": 15296360448, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_cold_after_logs_radeon\\minicpmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.log" + } + } + ], + "complete_request": { + "text": "The square in the image is red.", + "wall_s": 88.00621939997654, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 71040, + "duration_s": 2.96, + "pcm_sha256": "ec297eabb746949c9a3e86683feea75a2226c2dda207d89e04dbb5281dda71a2" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 1, + "seq": 1, + "kind": "audio", + "worker_generation": "21544f963e164e55872e99c89e92e955", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.98023680003826, + "peak_sampled_rss_bytes": 15296360448, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_cold_after_logs_radeon\\minicpmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.log" + } + }, + "nearest_rank_p50_wall_s": 88.00621939997654, + "nearest_rank_p95_wall_s": 88.00621939997654, + "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\\cold_after_profile.wav", + "execution_plan_after_request": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "21544f963e164e55872e99c89e92e955", + "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": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "requested_placement": "radeon-hybrid", + "ggml_vk_visible_devices": "1", + "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": "radeon-hybrid", + "worker_pid": 38976, + "peak_sampled_rss_bytes": 15296360448, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_cold_after_logs_radeon\\minicpmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.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/cold_after_profile.wav b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_profile.wav new file mode 100644 index 0000000000000000000000000000000000000000..d964ae158059fd9418a5810ec67daf6933dd71bf GIT binary patch literal 142124 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
d;4t)qe5abU=1C4;^189%7Qinmu z$S3Z&^OqidJg<=b%ev5y&|l~Y8WhiG@Ei=i%4a0-lt^C>w4{9Q1Md%f1@K46C!6vN zpA72ac@AL0CnRxz?+H(409AUBkVbv@4(wLY2KGNZCAM!vKIMYXNBUfFh7N|`NS;v} z8WSEUcqpJ5q`yl(O|*NEo-28UkxBmuuHn_fh~Pbee@1$Qq%X+!t(`K(ELsZbv+aJKz27@zd) zz_$krRC;GXSsaoM(qo7D09B+92Q!0fK*Cu
  • )kJ$v9;9Fl*re&FGe2VlsjMVMz< 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

    ;a)vTd%$a2-WzBofZ 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 lQulZH-|EUV|8NAJ8R-n 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 E0d&2|FaQ7m literal 0 HcmV?d00001 diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_profile_driver.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_profile_driver.log new file mode 100644 index 000000000..820cd8b3f --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_profile_driver.log @@ -0,0 +1,165 @@ +INFO 09-24 03:01:03 [patch.py:259] NVFP4 W4A4 weight_scale NaN-clamp: installed. +INFO 09-24 03:01:03 [patch.py:510] inductor factorable-divisibility patch: installed. +INFO 09-24 03:01:07 [stage_init_utils.py:768] [stage_init] Set VLLM_WORKER_MULTIPROC_METHOD=spawn +WARNING 09-24 03:01:07 [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": "radeon-hybrid", + "model_revision": "db25077c33951fe163b42986fba0132e279872a2", + "cli_sha256": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "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": 23985426432, + "startup_s": 47.634812799980864, + "execution_plan_at_start": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "21544f963e164e55872e99c89e92e955", + "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": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "requested_placement": "radeon-hybrid", + "ggml_vk_visible_devices": "1", + "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": 88.00621939997654, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 71040, + "duration_s": 2.96, + "pcm_sha256": "ec297eabb746949c9a3e86683feea75a2226c2dda207d89e04dbb5281dda71a2" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 1, + "seq": 1, + "kind": "audio", + "worker_generation": "21544f963e164e55872e99c89e92e955", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.98023680003826, + "peak_sampled_rss_bytes": 15296360448, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_cold_after_logs_radeon\\minicpmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.log" + } + } + ], + "complete_request": { + "text": "The square in the image is red.", + "wall_s": 88.00621939997654, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 71040, + "duration_s": 2.96, + "pcm_sha256": "ec297eabb746949c9a3e86683feea75a2226c2dda207d89e04dbb5281dda71a2" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 1, + "seq": 1, + "kind": "audio", + "worker_generation": "21544f963e164e55872e99c89e92e955", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.98023680003826, + "peak_sampled_rss_bytes": 15296360448, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_cold_after_logs_radeon\\minicpmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.log" + } + }, + "nearest_rank_p50_wall_s": 88.00621939997654, + "nearest_rank_p95_wall_s": 88.00621939997654, + "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\\cold_after_profile.wav", + "execution_plan_after_request": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "21544f963e164e55872e99c89e92e955", + "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": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "requested_placement": "radeon-hybrid", + "ggml_vk_visible_devices": "1", + "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": "radeon-hybrid", + "worker_pid": 38976, + "peak_sampled_rss_bytes": 15296360448, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_cold_after_logs_radeon\\minicpmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.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/cold_after_worker_logs/minicpmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_worker_logs/minicpmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.log new file mode 100755 index 000000000..2d6199545 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/cold_after_worker_logs/minicpmo-1-1e3b8d41a49e4144aec4b3c3f346ec1c.log @@ -0,0 +1,484 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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:01:55.319 === omni_init start +03:01:55.319 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +03:01:55.319 === omni_init: loading new LLM model +03:02:48.504 === omni_init: loading TTS model +03:02:48.504 TTS model: loading with n_gpu_layers=0 +03:02:52.165 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +03:02:52.165 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +03:02:57.684 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +03:02:57.691 TTS: head_code loaded, verifying first few values: +03:02:57.691 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +03:02:57.691 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +03:02:57.691 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +03:02:57.744 TTS: weights loaded successfully +03:02:57.744 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:02:57.839 Projector: loaded successfully +03:02:57.839 === omni_init: loading APM model +03:03:00.873 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:03:06.156 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +03:03:06.210 Token2Wav: all model files found, initializing session... +03:03:06.210 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +03:03:06.210 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:03:10.653 Token2Wav: initialized successfully +03:03:10.653 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +03:03:10.653 Token2Wav: 使用 C++ 实现 +03:03:10.653 === omni_init success: ctx_llama = 0000024c7a50f830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_cold_after_work_radeon\omni-minicpmo-1-kx55ncuz\fixture_ + Count: 2 +03:03:10.654 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +03:03:10.654 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_cold_after_work_radeon\omni-minicpmo-1-kx55ncuz\fixture_0000.wav +03:03:11.016 system prompt ref_audio embedding: n_pos=20 +03:03:11.515 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +03:03:11.515 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +03:03:11.515 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +03:03:11.515 n_past = 72 +03:03:11.515 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 0.86122 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 630.40 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 648.45 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 648.45 ms by vision ( 648.45 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_cold_after_work_radeon\omni-minicpmo-1-kx55ncuz\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:03:12.695 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_cold_after_work_radeon\omni-minicpmo-1-kx55ncuz\fixture_0001.wav +03:03:12.974 stream_prefill(index=1): user audio embedding: n_pos=31 +03:03:13.285 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.7681 s +03:03:13.285 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +03:03:13.285 stream_decode: create tts thread (simplex mode) +03:03:13.285 stream_decode: create t2w thread +03:03:13.285 wait prefill done +03:03:13.285 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +03:03:13.286 T2W thread (C++) started + +03:03:13.289 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +03:03:13.290 TTS thread started +03:03:13.449 📍 [单工TTS] assistant prompt 完成, n_past=182 +03:03:13.450 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +03:03:13.970 LLM: detected end token, set llm_generation_done=true +03:03:13.970 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:03:13.970 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +03:03:13.970 📍 轮次 1 结束,记录边界于 n_past=191 +03:03:13.970 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:03:13.971 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +03:03:13.971 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:03:13.971 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +03:03:13.971 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +03:03:13.972 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +03:03:14.001 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +03:03:14.001 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +03:03:14.001 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +03:03:14.001 TTS Simplex: first chunk - cleared KV cache +03:03:14.001 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +03:03:14.064 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +03:03:14.264 TTS Simplex: prefill completed, n_past_tts=9 +03:03:14.264 TTS Simplex: sampler created +03:03:14.264 TTS simplex: is_audio_bos=true (first audio token) +03:03:14.289 TTS Simplex Phase1: token 1/500: rel_id=1490 +03:03:14.300 TTS Simplex Phase1: token 2/500: rel_id=4218 +03:03:14.312 TTS Simplex Phase1: token 3/500: rel_id=4299 +03:03:14.322 TTS Simplex Phase1: token 4/500: rel_id=6486 +03:03:14.333 TTS Simplex Phase1: token 5/500: rel_id=4299 +03:03:14.550 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +03:03:14.550 TTS Simplex Phase1: token 25/500: rel_id=1509 +03:03:14.550 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +03:03:14.550 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +03:03:14.815 TTS Simplex Phase1: EOS token at step 50 +03:03:14.815 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +03:03:14.815 TTS Simplex Phase1: token 50/500: rel_id=6561 +03:03:14.815 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=58 +03:03:14.824 TTS Simplex Phase2: text_eos_embed injected, n_past=59 +03:03:14.831 TTS Simplex Phase2: audio_bos injected, n_past=60, starting final generation +03:03:14.842 TTS Simplex Phase2: yield 25 tokens 到 T2W +03:03:15.081 TTS Simplex Phase2: EOS at step 23 (final end) +03:03:15.081 TTS Simplex: chunk 结束,tts_token_buffer 剩余 21 tokens (保留等下一个 chunk) +03:03:15.081 TTS Simplex: is_final_text_chunk=true, flush 剩余 21 tokens 从 tts_token_buffer +03:03:15.081 TTS Simplex: generated 71 audio tokens for chunk 0 +03:03:15.081 TTS Simplex: chunk 0 first tokens: [1490 4218 4299 6486 4299 ], last tokens: [6486 6486 4299 4299 6162 ] +03:03:15.081 TTS Simplex: updated tts_n_past_accumulated=83, total_generated_tokens=71 +03:03:15.090 TTS: finished processing all chunks +03:03:15.090 TTS: 单工模式轮次结束,下一轮 round_idx=1 +03:03:15.090 TTS: sent is_final=true to T2W queue (turn end) +03:03:16.936 🎉 首响时间 (First Audio Response): 3650ms +03:03:16.936 T2W线程: wav_0.wav | 0.84s audio | 2384.9ms inference | RTF=2.84 | t=3650ms +03:03:19.173 T2W线程: wav_1.wav | 1.00s audio | 2236.5ms inference | RTF=2.24 | t=5887ms +03:03:21.410 T2W线程: wav_2.wav | 1.12s audio | 2236.3ms inference | RTF=2.00 | t=8124ms +03:03:21.410 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +03:03:21.410 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +03:03:03:21.472 03:omni_stop_threads: stop signals sent +21.472 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2051.438ms vocoder=333.439ms total=2384.898ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1855.506ms vocoder=380.973ms total=2236.497ms audio=24000 +[timing] call=2 tokens=24 final=1 token2mel=1865.654ms vocoder=370.579ms total=2236.243ms audio=26880 +Audio generation completed. +llama_perf_context_print: load time = 24790.65 ms +llama_perf_context_print: prompt eval time = 2795.33 ms / 182 tokens ( 15.36 ms per token, 65.11 tokens per second) +llama_perf_context_print: eval time = 518.11 ms / 9 runs ( 57.57 ms per token, 17.37 tokens per second) +llama_perf_context_print: total time = 32812.85 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20.json b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20.json new file mode 100644 index 000000000..5542c2cc5 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20.json @@ -0,0 +1,727 @@ +{ + "scope": "MiniCPM-o GGUF complete audio+image\u2192text+speech through Omni StageRuntime/StagePool", + "placement": "radeon-hybrid", + "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": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "reference_sha256": "cf4bb5cd9acbfbf67596d4a53310652b61ef4b7ede1d54eb03ef4882ca40223a", + "input_sha256": { + "audio_wav": "14ee147cbf2ce9afd9e32c8c8228d7cfe11985cd7e63456b2ad33871492aefcc", + "image_jpeg": "22c7ccea466a3f551c512045e6316c7597408d4e0a20205502f55784d977aa8d" + }, + "memory_budget": { + "capacities": { + "host_ram": 22548578304 + }, + "demands": { + "host_ram": 22548578304 + } + }, + "profile_count": 20, + "warmup_count": 1, + "host_available_bytes_before": 23804850176, + "startup_s": 51.91764660004992, + "execution_plan_at_start": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "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": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "requested_placement": "radeon-hybrid", + "ggml_vk_visible_devices": "1", + "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": [ + { + "text": "The square in the image is red.", + "wall_s": 88.43239450000692, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 56640, + "duration_s": 2.36, + "pcm_sha256": "ceabf4ec4fd61ebac2b4e316c06fbf961aafa371a278ae21a76e6b5b2042b5a3" + }, + "stage_event": { + "request_id": "minicpmo-warmup-0", + "stage_id": 0, + "epoch": 1, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 88.40392130007967, + "peak_sampled_rss_bytes": 13763682304, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-1-27686b55445e443f955c0a221e4e72ed.log" + } + } + ], + "measured": [ + { + "text": "The square in the image is red.", + "wall_s": 89.67069400008768, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 59520, + "duration_s": 2.48, + "pcm_sha256": "28d1c312e3da6e034d1063ccc4f3c927308f42d6c02de197e620afabcc4a53a3" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 2, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 89.66583519999404, + "peak_sampled_rss_bytes": 15297159168, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-2-765d0081ff11481199ba99c70808d3f7.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 89.2410724000074, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 66240, + "duration_s": 2.76, + "pcm_sha256": "b3a801e56e5c280aec423c5f29abb96a9096d917f9d457021861dfc2dab2091a" + }, + "stage_event": { + "request_id": "minicpmo-measured-1", + "stage_id": 0, + "epoch": 3, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 89.22992990002967, + "peak_sampled_rss_bytes": 15297896448, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-3-5a5e09d95930426493ceb0d3c5d0f667.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 84.44369159999769, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 49920, + "duration_s": 2.08, + "pcm_sha256": "1b17ec4945b7db9d69084f545bea331d217c104d380030c4d7dd588195c033e2" + }, + "stage_event": { + "request_id": "minicpmo-measured-2", + "stage_id": 0, + "epoch": 4, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 84.43399200006388, + "peak_sampled_rss_bytes": 15301582848, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-4-9ea9b162dbbc4e99b2764d814900c4f5.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 91.44574589992408, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 59520, + "duration_s": 2.48, + "pcm_sha256": "c153a4ee757314dbfa93692807d760737b0a8fdf75bce4dfe1400d090723bced" + }, + "stage_event": { + "request_id": "minicpmo-measured-3", + "stage_id": 0, + "epoch": 5, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 91.43500569998287, + "peak_sampled_rss_bytes": 15296962560, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-5-3f3a853496f84850a3b8d3e59ee80328.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 97.89790800004266, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 67200, + "duration_s": 2.8, + "pcm_sha256": "e606c42e79f1682ebb38ffd5999be2d9d71136ed3bbbb206b54b13959b626b49" + }, + "stage_event": { + "request_id": "minicpmo-measured-4", + "stage_id": 0, + "epoch": 6, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 97.88728310004808, + "peak_sampled_rss_bytes": 15296348160, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-6-765c426a238146cca67a2cf5a31dcec6.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 86.5171454999363, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 57600, + "duration_s": 2.4, + "pcm_sha256": "aa40a934ebe0fa335e64a17760cdb69db78f020237999ad3aa2a8e57738ef8b7" + }, + "stage_event": { + "request_id": "minicpmo-measured-5", + "stage_id": 0, + "epoch": 7, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 86.50678499997593, + "peak_sampled_rss_bytes": 15297114112, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-7-509ef5e86bce44f3962216500758e762.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 87.32478409993928, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 49920, + "duration_s": 2.08, + "pcm_sha256": "4275292fc770992bcddfcc773e5ada7ffc14f959900adae01c48d8368add53ab" + }, + "stage_event": { + "request_id": "minicpmo-measured-6", + "stage_id": 0, + "epoch": 8, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.31482480000705, + "peak_sampled_rss_bytes": 15300722688, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-8-7919065c767c42ddb58856319722e6d0.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 69.91491160006262, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 72000, + "duration_s": 3.0, + "pcm_sha256": "f9a88dc9cc294ac2ded1d81e076ef571045af818ba540554ff9ba422df22943e" + }, + "stage_event": { + "request_id": "minicpmo-measured-7", + "stage_id": 0, + "epoch": 9, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 69.90729420003481, + "peak_sampled_rss_bytes": 15296557056, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-9-b84f40b2f7e54848ad7d8137a4b602c9.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 87.5758816000307, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 61440, + "duration_s": 2.56, + "pcm_sha256": "527ce564235f3781e74a41710c0e5a4fae27989d19ff233ee64efad5d533e9b1" + }, + "stage_event": { + "request_id": "minicpmo-measured-8", + "stage_id": 0, + "epoch": 10, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.56872690003365, + "peak_sampled_rss_bytes": 15296552960, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-10-45806b84a1394f5f8fc45d8638ef6504.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 87.2738595000701, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 57600, + "duration_s": 2.4, + "pcm_sha256": "a1110fdc2f1945112bccf1566f51bdb65a2ddc36e772584f747a3b8be95b2b7e" + }, + "stage_event": { + "request_id": "minicpmo-measured-9", + "stage_id": 0, + "epoch": 11, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.26336149999406, + "peak_sampled_rss_bytes": 15296577536, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-11-5bf017cff9ff4d59b3f59c2fc3bf2266.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 80.4882060000673, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 64320, + "duration_s": 2.68, + "pcm_sha256": "0d070361d5a2d08a0d5234144f9e69256e169ead3a543b4671ee9753a34e244a" + }, + "stage_event": { + "request_id": "minicpmo-measured-10", + "stage_id": 0, + "epoch": 12, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 80.47764310007915, + "peak_sampled_rss_bytes": 15296012288, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-12-61bda20e0fa141738dde2bd58c1311e3.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 85.45749559998512, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 59520, + "duration_s": 2.48, + "pcm_sha256": "1ff503a03b0411eb781e9425edaf256b303ca129abef1d6714cad9fc57589954" + }, + "stage_event": { + "request_id": "minicpmo-measured-11", + "stage_id": 0, + "epoch": 13, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 85.44423809996806, + "peak_sampled_rss_bytes": 15295561728, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-13-b9ce8af2384f4702bc457ff245859deb.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 89.06362529995386, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 55680, + "duration_s": 2.32, + "pcm_sha256": "75f1825c97b1229a787277a1695eaa7749bed87fb459394ff259261052320179" + }, + "stage_event": { + "request_id": "minicpmo-measured-12", + "stage_id": 0, + "epoch": 14, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 89.05177350004669, + "peak_sampled_rss_bytes": 15295856640, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-14-6a2560adbf8c404ba4ecb9b5bafe0f33.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 86.04584340006113, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 61440, + "duration_s": 2.56, + "pcm_sha256": "e20ed2cc01012a362be35a1cae41d4fd41eed2f268ea9be12d6990dcec780502" + }, + "stage_event": { + "request_id": "minicpmo-measured-13", + "stage_id": 0, + "epoch": 15, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 86.03722810000181, + "peak_sampled_rss_bytes": 15295610880, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-15-84c5ffad02684029bafbca2aba2106af.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 86.03778659994714, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 61440, + "duration_s": 2.56, + "pcm_sha256": "c8b5d1af4328d0ee202d592b4c8b48603f7f5505fffba8d8e513407d866ec90a" + }, + "stage_event": { + "request_id": "minicpmo-measured-14", + "stage_id": 0, + "epoch": 16, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 86.03154140000697, + "peak_sampled_rss_bytes": 15296053248, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-16-f66088565b534d1ab2749109959f8d63.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 89.40287510002963, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 53760, + "duration_s": 2.24, + "pcm_sha256": "053e3a14170269a10218e678ade4223e28b2653a28ea75c15621c02d03a3b041" + }, + "stage_event": { + "request_id": "minicpmo-measured-15", + "stage_id": 0, + "epoch": 17, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 89.39397819992155, + "peak_sampled_rss_bytes": 15296118784, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-17-1dbbf8d44c554b0ab0e9d63d3d3c6cfb.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 87.37631849991158, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 60480, + "duration_s": 2.52, + "pcm_sha256": "7b14deb1f5215fc003ec006cf68623644862aa33457d2ad3dcb8663b05472f12" + }, + "stage_event": { + "request_id": "minicpmo-measured-16", + "stage_id": 0, + "epoch": 18, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.36507729999721, + "peak_sampled_rss_bytes": 15296081920, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-18-0d33268ae2ec4cca9d14bbaa000aed11.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 84.44159840000793, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 57600, + "duration_s": 2.4, + "pcm_sha256": "bd002f117e6873122151b2c4dc8267f5c2de2e98a464c890a076f11c27dcf972" + }, + "stage_event": { + "request_id": "minicpmo-measured-17", + "stage_id": 0, + "epoch": 19, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 84.43294430000242, + "peak_sampled_rss_bytes": 15296143360, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-19-a1fe46c104ba46409bbcd1553640fab1.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 86.14088329998776, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 51840, + "duration_s": 2.16, + "pcm_sha256": "7c1a2617b1b315a67bd35854acaed5e1f0fad877858682f2f257e8c7bb8b9cfd" + }, + "stage_event": { + "request_id": "minicpmo-measured-18", + "stage_id": 0, + "epoch": 20, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 86.13427959999535, + "peak_sampled_rss_bytes": 15296356352, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-20-60049a03aa98440796d4f3d095fab1da.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 90.84336910001002, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 65280, + "duration_s": 2.72, + "pcm_sha256": "05552b37ab9df6d0e6c15fa854219b9d3bf53f7cc90fa62e1f66af145f4f3fa3" + }, + "stage_event": { + "request_id": "minicpmo-measured-19", + "stage_id": 0, + "epoch": 21, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 90.83368909999263, + "peak_sampled_rss_bytes": 15295959040, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-21-5a4d63dd3dcb4f3c92057150efda2aa9.log" + } + } + ], + "complete_request": { + "text": "The square in the image is red.", + "wall_s": 89.67069400008768, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 59520, + "duration_s": 2.48, + "pcm_sha256": "28d1c312e3da6e034d1063ccc4f3c927308f42d6c02de197e620afabcc4a53a3" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 2, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 89.66583519999404, + "peak_sampled_rss_bytes": 15297159168, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-2-765d0081ff11481199ba99c70808d3f7.log" + } + }, + "nearest_rank_p50_wall_s": 87.2738595000701, + "nearest_rank_p95_wall_s": 91.44574589992408, + "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\\profile20.wav", + "execution_plan_after_request": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "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": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "requested_placement": "radeon-hybrid", + "ggml_vk_visible_devices": "1", + "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": "radeon-hybrid", + "worker_pid": 63224, + "peak_sampled_rss_bytes": 15295959040, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-21-5a4d63dd3dcb4f3c92057150efda2aa9.log" + } + }, + "abort_check": { + "stale_output": false, + "ledger": { + "capacities": { + "host_ram": 22548578304 + }, + "reserved": { + "host_ram": 0 + }, + "owners": [], + "quarantined": [] + } + }, + "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/profile20.wav b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20.wav new file mode 100644 index 0000000000000000000000000000000000000000..e7d4f9d2b66080e91c6bd47e493ce133e84763d7 GIT binary patch literal 119084 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

    (Q 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 _jyoqZ-<(SU082<<2(ZjdfFwvej%q;UHGo`+{O9 zV<|yc59yEhqz^GhnTk&-MLEWd{c5BmVL75zpEN7>VT!c^v2Mb%ZDKY;nJwlPq*hv* zs7r`73651k@q8*^Aq>Qi@kd!N){WT~W6vq&w=vrg)+DB<{1m%S#QKo1F_G_(!-zQ$ z`H-;&!d?)os~qbF=b|Jwlb1)D0yaOaVP@Vr-p|`$7{T#)u!m%?Ue8Vj8j5M-Itc0#j_AN&0`}vZ4q8 literal 0 HcmV?d00001 diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_driver.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_driver.log new file mode 100644 index 000000000..df695adf0 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_driver.log @@ -0,0 +1,719 @@ +INFO 09-24 02:27:30 [patch.py:259] NVFP4 W4A4 weight_scale NaN-clamp: installed. +INFO 09-24 02:27:30 [patch.py:510] inductor factorable-divisibility patch: installed. +INFO 09-24 02:27:33 [stage_init_utils.py:768] [stage_init] Set VLLM_WORKER_MULTIPROC_METHOD=spawn +WARNING 09-24 02:27:33 [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": "radeon-hybrid", + "model_revision": "db25077c33951fe163b42986fba0132e279872a2", + "cli_sha256": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "reference_sha256": "cf4bb5cd9acbfbf67596d4a53310652b61ef4b7ede1d54eb03ef4882ca40223a", + "input_sha256": { + "audio_wav": "14ee147cbf2ce9afd9e32c8c8228d7cfe11985cd7e63456b2ad33871492aefcc", + "image_jpeg": "22c7ccea466a3f551c512045e6316c7597408d4e0a20205502f55784d977aa8d" + }, + "memory_budget": { + "capacities": { + "host_ram": 22548578304 + }, + "demands": { + "host_ram": 22548578304 + } + }, + "profile_count": 20, + "warmup_count": 1, + "host_available_bytes_before": 23804850176, + "startup_s": 51.91764660004992, + "execution_plan_at_start": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "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": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "requested_placement": "radeon-hybrid", + "ggml_vk_visible_devices": "1", + "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": [ + { + "text": "The square in the image is red.", + "wall_s": 88.43239450000692, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 56640, + "duration_s": 2.36, + "pcm_sha256": "ceabf4ec4fd61ebac2b4e316c06fbf961aafa371a278ae21a76e6b5b2042b5a3" + }, + "stage_event": { + "request_id": "minicpmo-warmup-0", + "stage_id": 0, + "epoch": 1, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 88.40392130007967, + "peak_sampled_rss_bytes": 13763682304, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-1-27686b55445e443f955c0a221e4e72ed.log" + } + } + ], + "measured": [ + { + "text": "The square in the image is red.", + "wall_s": 89.67069400008768, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 59520, + "duration_s": 2.48, + "pcm_sha256": "28d1c312e3da6e034d1063ccc4f3c927308f42d6c02de197e620afabcc4a53a3" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 2, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 89.66583519999404, + "peak_sampled_rss_bytes": 15297159168, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-2-765d0081ff11481199ba99c70808d3f7.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 89.2410724000074, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 66240, + "duration_s": 2.76, + "pcm_sha256": "b3a801e56e5c280aec423c5f29abb96a9096d917f9d457021861dfc2dab2091a" + }, + "stage_event": { + "request_id": "minicpmo-measured-1", + "stage_id": 0, + "epoch": 3, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 89.22992990002967, + "peak_sampled_rss_bytes": 15297896448, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-3-5a5e09d95930426493ceb0d3c5d0f667.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 84.44369159999769, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 49920, + "duration_s": 2.08, + "pcm_sha256": "1b17ec4945b7db9d69084f545bea331d217c104d380030c4d7dd588195c033e2" + }, + "stage_event": { + "request_id": "minicpmo-measured-2", + "stage_id": 0, + "epoch": 4, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 84.43399200006388, + "peak_sampled_rss_bytes": 15301582848, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-4-9ea9b162dbbc4e99b2764d814900c4f5.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 91.44574589992408, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 59520, + "duration_s": 2.48, + "pcm_sha256": "c153a4ee757314dbfa93692807d760737b0a8fdf75bce4dfe1400d090723bced" + }, + "stage_event": { + "request_id": "minicpmo-measured-3", + "stage_id": 0, + "epoch": 5, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 91.43500569998287, + "peak_sampled_rss_bytes": 15296962560, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-5-3f3a853496f84850a3b8d3e59ee80328.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 97.89790800004266, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 67200, + "duration_s": 2.8, + "pcm_sha256": "e606c42e79f1682ebb38ffd5999be2d9d71136ed3bbbb206b54b13959b626b49" + }, + "stage_event": { + "request_id": "minicpmo-measured-4", + "stage_id": 0, + "epoch": 6, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 97.88728310004808, + "peak_sampled_rss_bytes": 15296348160, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-6-765c426a238146cca67a2cf5a31dcec6.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 86.5171454999363, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 57600, + "duration_s": 2.4, + "pcm_sha256": "aa40a934ebe0fa335e64a17760cdb69db78f020237999ad3aa2a8e57738ef8b7" + }, + "stage_event": { + "request_id": "minicpmo-measured-5", + "stage_id": 0, + "epoch": 7, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 86.50678499997593, + "peak_sampled_rss_bytes": 15297114112, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-7-509ef5e86bce44f3962216500758e762.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 87.32478409993928, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 49920, + "duration_s": 2.08, + "pcm_sha256": "4275292fc770992bcddfcc773e5ada7ffc14f959900adae01c48d8368add53ab" + }, + "stage_event": { + "request_id": "minicpmo-measured-6", + "stage_id": 0, + "epoch": 8, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.31482480000705, + "peak_sampled_rss_bytes": 15300722688, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-8-7919065c767c42ddb58856319722e6d0.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 69.91491160006262, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 72000, + "duration_s": 3.0, + "pcm_sha256": "f9a88dc9cc294ac2ded1d81e076ef571045af818ba540554ff9ba422df22943e" + }, + "stage_event": { + "request_id": "minicpmo-measured-7", + "stage_id": 0, + "epoch": 9, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 69.90729420003481, + "peak_sampled_rss_bytes": 15296557056, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-9-b84f40b2f7e54848ad7d8137a4b602c9.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 87.5758816000307, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 61440, + "duration_s": 2.56, + "pcm_sha256": "527ce564235f3781e74a41710c0e5a4fae27989d19ff233ee64efad5d533e9b1" + }, + "stage_event": { + "request_id": "minicpmo-measured-8", + "stage_id": 0, + "epoch": 10, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.56872690003365, + "peak_sampled_rss_bytes": 15296552960, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-10-45806b84a1394f5f8fc45d8638ef6504.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 87.2738595000701, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 57600, + "duration_s": 2.4, + "pcm_sha256": "a1110fdc2f1945112bccf1566f51bdb65a2ddc36e772584f747a3b8be95b2b7e" + }, + "stage_event": { + "request_id": "minicpmo-measured-9", + "stage_id": 0, + "epoch": 11, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.26336149999406, + "peak_sampled_rss_bytes": 15296577536, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-11-5bf017cff9ff4d59b3f59c2fc3bf2266.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 80.4882060000673, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 64320, + "duration_s": 2.68, + "pcm_sha256": "0d070361d5a2d08a0d5234144f9e69256e169ead3a543b4671ee9753a34e244a" + }, + "stage_event": { + "request_id": "minicpmo-measured-10", + "stage_id": 0, + "epoch": 12, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 80.47764310007915, + "peak_sampled_rss_bytes": 15296012288, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-12-61bda20e0fa141738dde2bd58c1311e3.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 85.45749559998512, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 59520, + "duration_s": 2.48, + "pcm_sha256": "1ff503a03b0411eb781e9425edaf256b303ca129abef1d6714cad9fc57589954" + }, + "stage_event": { + "request_id": "minicpmo-measured-11", + "stage_id": 0, + "epoch": 13, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 85.44423809996806, + "peak_sampled_rss_bytes": 15295561728, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-13-b9ce8af2384f4702bc457ff245859deb.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 89.06362529995386, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 55680, + "duration_s": 2.32, + "pcm_sha256": "75f1825c97b1229a787277a1695eaa7749bed87fb459394ff259261052320179" + }, + "stage_event": { + "request_id": "minicpmo-measured-12", + "stage_id": 0, + "epoch": 14, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 89.05177350004669, + "peak_sampled_rss_bytes": 15295856640, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-14-6a2560adbf8c404ba4ecb9b5bafe0f33.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 86.04584340006113, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 61440, + "duration_s": 2.56, + "pcm_sha256": "e20ed2cc01012a362be35a1cae41d4fd41eed2f268ea9be12d6990dcec780502" + }, + "stage_event": { + "request_id": "minicpmo-measured-13", + "stage_id": 0, + "epoch": 15, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 86.03722810000181, + "peak_sampled_rss_bytes": 15295610880, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-15-84c5ffad02684029bafbca2aba2106af.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 86.03778659994714, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 61440, + "duration_s": 2.56, + "pcm_sha256": "c8b5d1af4328d0ee202d592b4c8b48603f7f5505fffba8d8e513407d866ec90a" + }, + "stage_event": { + "request_id": "minicpmo-measured-14", + "stage_id": 0, + "epoch": 16, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 86.03154140000697, + "peak_sampled_rss_bytes": 15296053248, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-16-f66088565b534d1ab2749109959f8d63.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 89.40287510002963, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 53760, + "duration_s": 2.24, + "pcm_sha256": "053e3a14170269a10218e678ade4223e28b2653a28ea75c15621c02d03a3b041" + }, + "stage_event": { + "request_id": "minicpmo-measured-15", + "stage_id": 0, + "epoch": 17, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 89.39397819992155, + "peak_sampled_rss_bytes": 15296118784, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-17-1dbbf8d44c554b0ab0e9d63d3d3c6cfb.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 87.37631849991158, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 60480, + "duration_s": 2.52, + "pcm_sha256": "7b14deb1f5215fc003ec006cf68623644862aa33457d2ad3dcb8663b05472f12" + }, + "stage_event": { + "request_id": "minicpmo-measured-16", + "stage_id": 0, + "epoch": 18, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 87.36507729999721, + "peak_sampled_rss_bytes": 15296081920, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-18-0d33268ae2ec4cca9d14bbaa000aed11.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 84.44159840000793, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 57600, + "duration_s": 2.4, + "pcm_sha256": "bd002f117e6873122151b2c4dc8267f5c2de2e98a464c890a076f11c27dcf972" + }, + "stage_event": { + "request_id": "minicpmo-measured-17", + "stage_id": 0, + "epoch": 19, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 84.43294430000242, + "peak_sampled_rss_bytes": 15296143360, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-19-a1fe46c104ba46409bbcd1553640fab1.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 86.14088329998776, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 51840, + "duration_s": 2.16, + "pcm_sha256": "7c1a2617b1b315a67bd35854acaed5e1f0fad877858682f2f257e8c7bb8b9cfd" + }, + "stage_event": { + "request_id": "minicpmo-measured-18", + "stage_id": 0, + "epoch": 20, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 86.13427959999535, + "peak_sampled_rss_bytes": 15296356352, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-20-60049a03aa98440796d4f3d095fab1da.log" + } + }, + { + "text": "The square in the image is red.", + "wall_s": 90.84336910001002, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 65280, + "duration_s": 2.72, + "pcm_sha256": "05552b37ab9df6d0e6c15fa854219b9d3bf53f7cc90fa62e1f66af145f4f3fa3" + }, + "stage_event": { + "request_id": "minicpmo-measured-19", + "stage_id": 0, + "epoch": 21, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 90.83368909999263, + "peak_sampled_rss_bytes": 15295959040, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-21-5a4d63dd3dcb4f3c92057150efda2aa9.log" + } + } + ], + "complete_request": { + "text": "The square in the image is red.", + "wall_s": 89.67069400008768, + "audio_metadata": { + "sample_rate_hz": 24000, + "channels": 1, + "pcm_frames": 59520, + "duration_s": 2.48, + "pcm_sha256": "28d1c312e3da6e034d1063ccc4f3c927308f42d6c02de197e620afabcc4a53a3" + }, + "stage_event": { + "request_id": "minicpmo-measured-0", + "stage_id": 0, + "epoch": 2, + "seq": 1, + "kind": "audio", + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "buffers": [], + "terminal": true, + "error": null + }, + "metrics": { + "minicpmo_whole_request_wall_s": 89.66583519999404, + "peak_sampled_rss_bytes": 15297159168, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-2-765d0081ff11481199ba99c70808d3f7.log" + } + }, + "nearest_rank_p50_wall_s": 87.2738595000701, + "nearest_rank_p95_wall_s": 91.44574589992408, + "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\\profile20.wav", + "execution_plan_after_request": { + "backend": "external.minicpmo.gguf.v1", + "stage_id": 0, + "worker_generation": "1cf3768b5a0d4d09bfa21d21fc93c56d", + "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": "66a512386aafeb708f49a7394a9054d94ec777c362395c8917a3d198aef1b523", + "requested_placement": "radeon-hybrid", + "ggml_vk_visible_devices": "1", + "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": "radeon-hybrid", + "worker_pid": 63224, + "peak_sampled_rss_bytes": 15295959040, + "worker_log": "C:\\Users\\zhout\\w2\\minicpmo_omni_profile20_logs_radeon\\minicpmo-21-5a4d63dd3dcb4f3c92057150efda2aa9.log" + } + }, + "abort_check": { + "stale_output": false, + "ledger": { + "capacities": { + "host_ram": 22548578304 + }, + "reserved": { + "host_ram": 0 + }, + "owners": [], + "quarantined": [] + } + }, + "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/profile20_first_asr.json b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_first_asr.json new file mode 100644 index 000000000..23f3a53d1 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_first_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": "cf43ae8608fdd01d11b05705b245bd2ec1e94e3381ae26ac6d2d24a18db452c5", + "input_sample_rate": 24000, + "input_duration_s": 2.48, + "reference_text": "The square in the image is red.", + "transcript": "The square in the image is red.", + "word_error_rate": 0.0, + "asr_load_s": 0.8116924740024842, + "asr_inference_s": 0.27089974202681333 +} diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_first_asr.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_first_asr.log new file mode 100644 index 000000000..593892f3e --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/profile20_first_asr.log @@ -0,0 +1,23 @@ +W0924 03:04:06.174000 3870014 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:04:06.213000 3870014 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": "cf43ae8608fdd01d11b05705b245bd2ec1e94e3381ae26ac6d2d24a18db452c5", + "input_sample_rate": 24000, + "input_duration_s": 2.48, + "reference_text": "The square in the image is red.", + "transcript": "The square in the image is red.", + "word_error_rate": 0.0, + "asr_load_s": 0.8116924740024842, + "asr_inference_s": 0.27089974202681333 +} diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-1-27686b55445e443f955c0a221e4e72ed.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-1-27686b55445e443f955c0a221e4e72ed.log new file mode 100755 index 000000000..72b880c15 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-1-27686b55445e443f955c0a221e4e72ed.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:28:25.627 === omni_init start +02:28:25.627 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:28:25.627 === omni_init: loading new LLM model +02:29:14.654 === omni_init: loading TTS model +02:29:14.654 TTS model: loading with n_gpu_layers=0 +02:29:17.447 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:29:17.447 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:29:23.362 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:29:23.369 TTS: head_code loaded, verifying first few values: +02:29:23.369 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:29:23.369 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:29:23.369 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:29:23.483 TTS: weights loaded successfully +02:29:23.483 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 +02:29:23.589 Projector: loaded successfully +02:29:23.589 === omni_init: loading APM model +02:29:26.709 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 +02:29:33.167 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:29:33.219 Token2Wav: all model files found, initializing session... +02:29:33.220 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:29:33.220 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:29:38.104 Token2Wav: initialized successfully +02:29:38.104 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:29:38.104 Token2Wav: 使用 C++ 实现 +02:29:38.104 === omni_init success: ctx_llama = 000001ea2e4ffe80 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-1-_ykdyex8\fixture_ + Count: 2 +02:29:38.104 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:29:38.104 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-1-_ykdyex8\fixture_0000.wav +02:29:38.528 system prompt ref_audio embedding: n_pos=20 +02:29:39.123 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:29:39.124 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:29:39.124 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:29:39.124 n_past = 72 +02:29:39.124 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.01983 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 1113.66 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 1131.64 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 1131.65 ms by vision ( 1131.65 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-1-_ykdyex8\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 +02:29:40.833 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-1-_ykdyex8\fixture_0001.wav +02:29:41.139 stream_prefill(index=1): user audio embedding: n_pos=31 +02:29:41.501 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 2.37453 s +02:29:41.502 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:29:41.502 stream_decode: create tts thread (simplex mode) +02:29:41.502 stream_decode: create t2w thread +02:29:41.502 wait prefill done +02:29:41.502 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:29:41.502 T2W thread (C++) started + +02:29:41.507 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:29:41.508 TTS thread started +02:29:41.692 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:29:41.692 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:29:42.216 LLM: detected end token, set llm_generation_done=true +02:29:42.216 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] +02:29:42.216 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:29:42.216 📍 轮次 1 结束,记录边界于 n_past=191 +02:29:42.216 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] +02:29:42.216 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:29:42.216 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 +02:29:42.216 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:29:42.216 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:29:42.217 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:29:42.246 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:29:42.246 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:29:42.246 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:29:42.246 TTS Simplex: first chunk - cleared KV cache +02:29:42.246 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:29:42.310 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:29:44.498 TTS Simplex: prefill completed, n_past_tts=9 +02:29:44.498 TTS Simplex: sampler created +02:29:44.498 TTS simplex: is_audio_bos=true (first audio token) +02:29:44.526 TTS Simplex Phase1: token 1/500: rel_id=1496 +02:29:44.537 TTS Simplex Phase1: token 2/500: rel_id=4137 +02:29:44.548 TTS Simplex Phase1: token 3/500: rel_id=4218 +02:29:44.560 TTS Simplex Phase1: token 4/500: rel_id=4218 +02:29:44.570 TTS Simplex Phase1: token 5/500: rel_id=4137 +02:29:44.790 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:29:44.790 TTS Simplex Phase1: token 25/500: rel_id=1034 +02:29:44.790 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:29:44.790 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:29:44.882 TTS Simplex Phase1: EOS token at step 34 +02:29:44.882 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:29:44.882 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=42 +02:29:44.889 TTS Simplex Phase2: text_eos_embed injected, n_past=43 +02:29:44.897 TTS Simplex Phase2: audio_bos injected, n_past=44, starting final generation +02:29:45.083 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:29:45.159 TTS Simplex Phase2: EOS at step 24 (final end) +02:29:45.159 TTS Simplex: chunk 结束,tts_token_buffer 剩余 6 tokens (保留等下一个 chunk) +02:29:45.159 TTS Simplex: is_final_text_chunk=true, flush 剩余 6 tokens 从 tts_token_buffer +02:29:45.159 TTS Simplex: generated 56 audio tokens for chunk 0 +02:29:45.159 TTS Simplex: chunk 0 first tokens: [1496 4137 4218 4218 4137 ], last tokens: [1461 1458 4218 4218 6324 ] +02:29:45.159 TTS Simplex: updated tts_n_past_accumulated=68, total_generated_tokens=56 +02:29:45.160 TTS: finished processing all chunks +02:29:45.160 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:29:45.161 TTS: sent is_final=true to T2W queue (turn end) +02:29:47.234 🎉 首响时间 (First Audio Response): 5732ms +02:29:47.234 T2W线程: wav_0.wav | 0.84s audio | 2442.8ms inference | RTF=2.91 | t=5732ms +02:29:49.517 T2W线程: wav_1.wav | 1.00s audio | 2272.1ms inference | RTF=2.27 | t=8015ms +02:29:51.617 T2W线程: wav_2.wav | 0.52s audio | 2099.8ms inference | RTF=4.04 | t=10115ms +02:29:51.626 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:29:51.626 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:29:02:29:51.700 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2105.818ms vocoder=336.718ms total=2442.556ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1889.656ms vocoder=382.374ms total=2272.042ms audio=24000 +[timing] call=2 tokens=9 final=1 token2mel=1911.280ms vocoder=188.460ms total=2099.750ms audio=12480 +Audio generation completed. +llama_perf_context_print: load time = 26762.24 ms +llama_perf_context_print: prompt eval time = 3579.99 ms / 182 tokens ( 19.67 ms per token, 50.84 tokens per second) +llama_perf_context_print: eval time = 520.73 ms / 9 runs ( 57.86 ms per token, 17.28 tokens per second) +llama_perf_context_print: total time = 36769.94 ms / 191 tokens +llama_perf_context_print: graphs reused = 10 +Token2Wav (C++): session released +51.700 omni_stop_threads: stop signals sent +tts thread end +t2w thread end diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-10-45806b84a1394f5f8fc45d8638ef6504.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-10-45806b84a1394f5f8fc45d8638ef6504.log new file mode 100755 index 000000000..72d038645 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-10-45806b84a1394f5f8fc45d8638ef6504.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:41:30.515 === omni_init start +02:41:30.515 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:41:30.515 === omni_init: loading new LLM model +02:42:23.148 === omni_init: loading TTS model +02:42:23.148 TTS model: loading with n_gpu_layers=0 +02:42:26.809 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:42:26.809 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:42:32.344 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:42:32.349 TTS: head_code loaded, verifying first few values: +02:42:32.349 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:42:32.350 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:42:32.350 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:42:32.398 TTS: weights loaded successfully +02:42:32.398 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 +02:42:32.499 Projector: loaded successfully +02:42:32.499 === omni_init: loading APM model +02:42:35.557 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 +02:42:40.839 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:42:40.892 Token2Wav: all model files found, initializing session... +02:42:40.892 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:42:40.892 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:42:45.418 Token2Wav: initialized successfully +02:42:45.418 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:42:45.418 Token2Wav: 使用 C++ 实现 +02:42:45.418 === omni_init success: ctx_llama = 000002216638f830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-10-u5i2eod1\fixture_ + Count: 2 +02:42:45.419 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:42:45.419 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-10-u5i2eod1\fixture_0000.wav +02:42:46.038 system prompt ref_audio embedding: n_pos=20 +02:42:46.539 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:42:46.539 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:42:46.539 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:42:46.539 n_past = 72 +02:42:46.539 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.12075 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 612.65 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 630.46 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 630.46 ms by vision ( 630.46 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-10-u5i2eod1\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 +02:42:47.697 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-10-u5i2eod1\fixture_0001.wav +02:42:48.036 stream_prefill(index=1): user audio embedding: n_pos=31 +02:42:48.357 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.81548 s +02:42:48.357 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:42:48.357 stream_decode: create tts thread (simplex mode) +02:42:48.357 stream_decode: create t2w thread +02:42:48.357 wait prefill done +02:42:48.357 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:42:48.358 T2W thread (C++) started + +02:42:48.362 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:42:48.362 TTS thread started +02:42:48.522 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:42:48.522 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:42:49.065 LLM: detected end token, set llm_generation_done=true +02:42:49.065 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] +02:42:49.065 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:42:49.065 📍 轮次 1 结束,记录边界于 n_past=191 +02:42:49.065 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] +02:42:49.065 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:42:49.065 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 +02:42:49.065 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:42:49.065 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:42:49.066 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:42:49.097 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:42:49.097 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:42:49.097 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:42:49.097 TTS Simplex: first chunk - cleared KV cache +02:42:49.097 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:42:49.160 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:42:49.379 TTS Simplex: prefill completed, n_past_tts=9 +02:42:49.379 TTS Simplex: sampler created +02:42:49.379 TTS simplex: is_audio_bos=true (first audio token) +02:42:49.405 TTS Simplex Phase1: token 1/500: rel_id=770 +02:42:49.416 TTS Simplex Phase1: token 2/500: rel_id=4137 +02:42:49.428 TTS Simplex Phase1: token 3/500: rel_id=4137 +02:42:49.439 TTS Simplex Phase1: token 4/500: rel_id=4137 +02:42:49.450 TTS Simplex Phase1: token 5/500: rel_id=4137 +02:02:42:42:49.4900.670 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +670 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:42:49.670 TTS Simplex Phase1: token 25/500: rel_id=1480 +02:42:49.670 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:42:49.927 TTS Simplex Phase1: EOS token at step 49 +02:42:49.927 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:42:49.927 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=57 +02:42:49.935 TTS Simplex Phase2: text_eos_embed injected, n_past=58 +02:42:49.943 TTS Simplex Phase2: audio_bos injected, n_past=59, starting final generation +02:42:49.964 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:42:50.097 TTS Simplex Phase2: EOS at step 14 (final end) +02:42:50.097 TTS Simplex: chunk 结束,tts_token_buffer 剩余 11 tokens (保留等下一个 chunk) +02:42:50.097 TTS Simplex: is_final_text_chunk=true, flush 剩余 11 tokens 从 tts_token_buffer +02:42:50.097 TTS Simplex: generated 61 audio tokens for chunk 0 +02:42:50.097 TTS Simplex: chunk 0 first tokens: [770 4137 4137 4137 4137 ], last tokens: [2919 1461 4137 4218 4137 ] +02:42:50.097 TTS Simplex: updated tts_n_past_accumulated=73, total_generated_tokens=61 +02:42:50.098 TTS: finished processing all chunks +02:42:50.099 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:42:50.099 TTS: sent is_final=true to T2W queue (turn end) +02:42:51.993 🎉 首响时间 (First Audio Response): 3636ms +02:42:51.994 T2W线程: wav_0.wav | 0.84s audio | 2322.6ms inference | RTF=2.76 | t=3636ms +02:42:54.226 T2W线程: wav_1.wav | 1.00s audio | 2231.5ms inference | RTF=2.23 | t=5868ms +02:42:56.338 T2W线程: wav_2.wav | 0.72s audio | 2111.7ms inference | RTF=2.93 | t=7981ms +02:42:56.338 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:42:56.338 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:42:56.420 omni_stop_threads: stop signals sent +02:42:56.420 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=1994.472ms vocoder=328.065ms total=2322.552ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1848.511ms vocoder=382.957ms total=2231.481ms audio=24000 +[timing] call=2 tokens=14 final=1 token2mel=1863.372ms vocoder=248.320ms total=2111.702ms audio=17280 +Audio generation completed. +llama_perf_context_print: load time = 25247.74 ms +llama_perf_context_print: prompt eval time = 3102.69 ms / 182 tokens ( 17.05 ms per token, 58.66 tokens per second) +llama_perf_context_print: eval time = 539.95 ms / 9 runs ( 59.99 ms per token, 16.67 tokens per second) +llama_perf_context_print: total time = 33145.17 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-11-5bf017cff9ff4d59b3f59c2fc3bf2266.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-11-5bf017cff9ff4d59b3f59c2fc3bf2266.log new file mode 100755 index 000000000..44aa32d7b --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-11-5bf017cff9ff4d59b3f59c2fc3bf2266.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:42:58.124 === omni_init start +02:42:58.125 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:42:58.125 === omni_init: loading new LLM model +02:43:50.206 === omni_init: loading TTS model +02:43:50.206 TTS model: loading with n_gpu_layers=0 +02:43:53.869 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:43:53.869 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:43:59.383 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:43:59.389 TTS: head_code loaded, verifying first few values: +02:43:59.389 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:43:59.389 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:43:59.389 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:43:59.436 TTS: weights loaded successfully +02:43:59.436 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 +02:43:59.538 Projector: loaded successfully +02:43:59.538 === omni_init: loading APM model +02:44:02.572 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 +02:44:08.113 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:44:08.176 Token2Wav: all model files found, initializing session... +02:44:08.176 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:44:08.176 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:44:12.764 Token2Wav: initialized successfully +02:44:12.764 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:44:12.764 Token2Wav: 使用 C++ 实现 +02:44:12.764 === omni_init success: ctx_llama = 000002757e4cf830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-11-ea3tyiaz\fixture_ + Count: 2 +02:44:12.764 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:44:12.764 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-11-ea3tyiaz\fixture_0000.wav +02:44:13.341 system prompt ref_audio embedding: n_pos=20 +02:44:13.846 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:44:13.846 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:44:13.846 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:44:13.846 n_past = 72 +02:44:13.846 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.08176 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 634.25 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 652.30 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 652.31 ms by vision ( 652.31 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-11-ea3tyiaz\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 +02:44:15.023 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-11-ea3tyiaz\fixture_0001.wav +02:44:15.322 stream_prefill(index=1): user audio embedding: n_pos=31 +02:44:15.635 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.78776 s +02:44:15.635 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:44:15.635 stream_decode: create tts thread (simplex mode) +02:44:15.635 stream_decode: create t2w thread +02:44:15.635 wait prefill done +02:44:15.635 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:44:15.636 T2W thread (C++) started + +02:44:15.639 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:44:15.639 TTS thread started +02:44:15.798 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:44:15.798 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:44:16.326 LLM: detected end token, set llm_generation_done=true +02:44:16.327 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] +02:44:16.327 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:44:16.327 📍 轮次 1 结束,记录边界于 n_past=191 +02:44:16.327 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] +02:44:16.327 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:44:16.327 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 +02:44:16.327 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:44:16.327 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:44:16.328 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:44:16.360 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:44:16.360 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:44:16.360 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:44:16.360 TTS Simplex: first chunk - cleared KV cache +02:44:16.360 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:44:16.422 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:44:16.635 TTS Simplex: prefill completed, n_past_tts=9 +02:44:16.635 TTS Simplex: sampler created +02:44:16.635 TTS simplex: is_audio_bos=true (first audio token) +02:44:16.662 TTS Simplex Phase1: token 1/500: rel_id=767 +02:44:16.673 TTS Simplex Phase1: token 2/500: rel_id=1704 +02:44:16.684 TTS Simplex Phase1: token 3/500: rel_id=3648 +02:44:16.695 TTS Simplex Phase1: token 4/500: rel_id=3645 +02:44:16.706 TTS Simplex Phase1: token 5/500: rel_id=2031 +02:44:16.925 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:44:16.925 TTS Simplex Phase1: token 25/500: rel_id=5934 +02:44:16.925 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:44:16.925 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:44:17.087 TTS Simplex Phase1: EOS token at step 40 +02:44:17.087 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:44:17.087 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=48 +02:44:17.095 TTS Simplex Phase2: text_eos_embed injected, n_past=49 +02:44:17.103 TTS Simplex Phase2: audio_bos injected, n_past=50, starting final generation +02:44:17.223 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:44:17.311 TTS Simplex Phase2: EOS at step 19 (final end) +02:44:17.311 TTS Simplex: chunk 结束,tts_token_buffer 剩余 7 tokens (保留等下一个 chunk) +02:44:17.311 TTS Simplex: is_final_text_chunk=true, flush 剩余 7 tokens 从 tts_token_buffer +02:44:17.311 TTS Simplex: generated 57 audio tokens for chunk 0 +02:44:17.311 TTS Simplex: chunk 0 first tokens: [767 1704 3648 3645 2031 ], last tokens: [735 4218 4137 4218 6081 ] +02:44:17.311 TTS Simplex: updated tts_n_past_accumulated=69, total_generated_tokens=57 +02:44:17.312 TTS: finished processing all chunks +02:44:17.312 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:44:17.312 TTS: sent is_final=true to T2W queue (turn end) +02:44:19.261 🎉 首响时间 (First Audio Response): 3625ms +02:44:19.261 T2W线程: wav_0.wav | 0.84s audio | 2334.4ms inference | RTF=2.78 | t=3625ms +02:44:21.496 T2W线程: wav_1.wav | 1.00s audio | 2235.1ms inference | RTF=2.24 | t=5861ms +02:44:23.555 T2W线程: wav_2.wav | 0.56s audio | 2057.6ms inference | RTF=3.67 | t=7919ms +02:44:23.565 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:44:23.565 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:44:23.60602 :T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2002.770ms vocoder=331.609ms total=2334.394ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1854.383ms vocoder=380.674ms total=2235.069ms audio=24000 +[timing] call=2 tokens=10 final=1 token2mel=1860.585ms vocoder=196.983ms total=2057.579ms audio=13440 +Audio generation completed. +llama_perf_context_print: load time = 25463.47 ms +llama_perf_context_print: prompt eval time = 3032.64 ms / 182 tokens ( 16.66 ms per token, 60.01 tokens per second) +llama_perf_context_print: eval time = 526.40 ms / 9 runs ( 58.49 ms per token, 17.10 tokens per second) +llama_perf_context_print: total time = 33271.53 ms / 191 tokens +llama_perf_context_print: graphs reused = 10 +Token2Wav (C++): session released +44:23.606 omni_stop_threads: stop signals sent +tts thread end +t2w thread end diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-12-61bda20e0fa141738dde2bd58c1311e3.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-12-61bda20e0fa141738dde2bd58c1311e3.log new file mode 100755 index 000000000..49acd7f62 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-12-61bda20e0fa141738dde2bd58c1311e3.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:44:25.400 === omni_init start +02:44:25.400 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:44:25.400 === omni_init: loading new LLM model +02:45:10.901 === omni_init: loading TTS model +02:45:10.901 TTS model: loading with n_gpu_layers=0 +02:45:14.552 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:45:14.552 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:45:20.095 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:45:20.101 TTS: head_code loaded, verifying first few values: +02:45:20.101 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:45:20.101 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:45:20.101 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:45:20.149 TTS: weights loaded successfully +02:45:20.149 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 +02:45:20.253 Projector: loaded successfully +02:45:20.253 === omni_init: loading APM model +02:45:23.311 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 +02:45:28.667 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:45:28.722 Token2Wav: all model files found, initializing session... +02:45:28.722 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:45:28.722 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:45:33.241 Token2Wav: initialized successfully +02:45:33.241 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:45:33.241 Token2Wav: 使用 C++ 实现 +02:45:33.241 === omni_init success: ctx_llama = 000002ae2acef830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-12-xr5v5uhs\fixture_ + Count: 2 +02:45:33.241 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:45:33.241 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-12-xr5v5uhs\fixture_0000.wav +02:45:33.883 system prompt ref_audio embedding: n_pos=20 +02:45:34.380 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:45:34.380 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:45:34.380 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:45:34.380 n_past = 72 +02:45:34.380 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.13862 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 621.77 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 639.77 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 639.77 ms by vision ( 639.77 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-12-xr5v5uhs\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 +02:45:35.534 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-12-xr5v5uhs\fixture_0001.wav +02:45:35.835 stream_prefill(index=1): user audio embedding: n_pos=31 +02:45:36.147 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.76615 s +02:45:36.147 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:45:36.148 stream_decode: create tts thread (simplex mode) +02:45:36.148 stream_decode: create t2w thread +02:45:36.148 wait prefill done +02:45:36.148 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:45:36.148 T2W thread (C++) started + +02:45:36.151 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:45:36.151 TTS thread started +02:45:36.310 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:45:36.313 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:45:36.830 LLM: detected end token, set llm_generation_done=true +02:45:36.831 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] +02:45:36.831 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:45:36.831 📍 轮次 1 结束,记录边界于 n_past=191 +02:45:36.831 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] +02:45:36.831 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:45:36.831 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 +02:45:36.831 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:45:36.831 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:45:36.832 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:45:36.869 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:45:36.869 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:45:36.869 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:45:36.869 TTS Simplex: first chunk - cleared KV cache +02:45:36.869 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:45:36.922 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:45:37.143 TTS Simplex: prefill completed, n_past_tts=9 +02:45:37.143 TTS Simplex: sampler created +02:45:37.143 TTS simplex: is_audio_bos=true (first audio token) +02:45:37.169 TTS Simplex Phase1: token 1/500: rel_id=1472 +02:45:37.180 TTS Simplex Phase1: token 2/500: rel_id=6486 +02:45:37.191 TTS Simplex Phase1: token 3/500: rel_id=6486 +02:45:37.202 TTS Simplex Phase1: token 4/500: rel_id=6486 +02:45:37.213 TTS Simplex Phase1: token 5/500: rel_id=4299 +02:45:37.434 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:45:37.434 TTS Simplex Phase1: token 25/500: rel_id=1806 +02:45:37.434 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:45:37.434 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:45:37.658 TTS Simplex Phase1: EOS token at step 46 +02:45:37.658 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:45:37.658 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=54 +02:45:37.666 TTS Simplex Phase2: text_eos_embed injected, n_past=55 +02:45:37.674 TTS Simplex Phase2: audio_bos injected, n_past=56, starting final generation +02:45:37.733 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:45:37.898 TTS Simplex Phase2: EOS at step 20 (final end) +02:45:37.898 TTS Simplex: chunk 结束,tts_token_buffer 剩余 14 tokens (保留等下一个 chunk) +02:45:37.898 TTS Simplex: is_final_text_chunk=true, flush 剩余 14 tokens 从 tts_token_buffer +02:45:37.898 TTS Simplex: generated 64 audio tokens for chunk 0 +02:45:37.898 TTS Simplex: chunk 0 first tokens: [1472 6486 6486 6486 4299 ], last tokens: [4299 6486 6486 4299 4299 ] +02:45:37.898 TTS Simplex: updated tts_n_past_accumulated=76, total_generated_tokens=64 +02:45:37.908 TTS: finished processing all chunks +02:45:37.908 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:45:37.908 TTS: sent is_final=true to T2W queue (turn end) +02:45:39.767 🎉 首响时间 (First Audio Response): 3619ms +02:45:39.767 T2W线程: wav_0.wav | 0.84s audio | 2331.8ms inference | RTF=2.78 | t=3619ms +02:45:42.000 T2W线程: wav_1.wav | 1.00s audio | 2232.1ms inference | RTF=2.23 | t=5852ms +02:45:44.157 T2W线程: wav_2.wav | 0.84s audio | 2156.4ms inference | RTF=2.57 | t=8009ms +02:45:44.157 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:45:44.157 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:45:02:44.198 45:omni_stop_threads: stop signals sent +44.198 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2004.545ms vocoder=327.177ms total=2331.737ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1850.819ms vocoder=381.245ms total=2232.086ms audio=24000 +[timing] call=2 tokens=17 final=1 token2mel=1871.335ms vocoder=285.029ms total=2156.374ms audio=20160 +Audio generation completed. +llama_perf_context_print: load time = 25053.93 ms +llama_perf_context_print: prompt eval time = 3071.36 ms / 182 tokens ( 16.88 ms per token, 59.26 tokens per second) +llama_perf_context_print: eval time = 514.66 ms / 9 runs ( 57.18 ms per token, 17.49 tokens per second) +llama_perf_context_print: total time = 32938.18 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-13-b9ce8af2384f4702bc457ff245859deb.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-13-b9ce8af2384f4702bc457ff245859deb.log new file mode 100755 index 000000000..0749cf50a --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-13-b9ce8af2384f4702bc457ff245859deb.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:45:45.895 === omni_init start +02:45:45.896 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:45:45.896 === omni_init: loading new LLM model +02:46:36.401 === omni_init: loading TTS model +02:46:36.401 TTS model: loading with n_gpu_layers=0 +02:46:40.071 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:46:40.071 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:46:45.542 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:46:45.548 TTS: head_code loaded, verifying first few values: +02:46:45.548 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:46:45.548 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:46:45.548 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:46:45.598 TTS: weights loaded successfully +02:46:45.598 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 +02:46:45.702 Projector: loaded successfully +02:46:45.703 === omni_init: loading APM model +02:46:48.730 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 +02:46:54.119 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:46:54.176 Token2Wav: all model files found, initializing session... +02:46:54.176 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:46:54.176 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:46:58.656 Token2Wav: initialized successfully +02:46:58.656 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:46:58.656 Token2Wav: 使用 C++ 实现 +02:46:58.656 === omni_init success: ctx_llama = 0000018922e4f830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-13-sdf8l572\fixture_ + Count: 2 +02:46:58.657 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:46:58.657 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-13-sdf8l572\fixture_0000.wav +02:46:59.314 system prompt ref_audio embedding: n_pos=20 +02:46:59.815 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:46:59.815 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:46:59.815 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:46:59.815 n_past = 72 +02:46:59.815 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.15864 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 621.38 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 640.12 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 640.12 ms by vision ( 640.12 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-13-sdf8l572\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 +02:47:00.973 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-13-sdf8l572\fixture_0001.wav +02:47:01.249 stream_prefill(index=1): user audio embedding: n_pos=31 +02:47:01.561 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.74432 s +02:47:01.561 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:47:01.561 stream_decode: create tts thread (simplex mode) +02:47:01.561 stream_decode: create t2w thread +02:47:01.561 wait prefill done +02:47:01.561 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:47:01.562 T2W thread (C++) started + +02:47:01.565 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:47:01.566 TTS thread started +02:47:01.723 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:47:01.724 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:47:02.244 LLM: detected end token, set llm_generation_done=true +02:47:02.244 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] +02:47:02.244 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:47:02.244 📍 轮次 1 结束,记录边界于 n_past=191 +02:47:02.244 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] +02:47:02.244 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:47:02.244 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 +02:47:02.244 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:47:02.244 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:47:02.245 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:47:02.275 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:47:02.275 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:47:02.276 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:47:02.276 TTS Simplex: first chunk - cleared KV cache +02:47:02.276 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:47:02.336 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:47:02.534 TTS Simplex: prefill completed, n_past_tts=9 +02:47:02.534 TTS Simplex: sampler created +02:47:02.534 TTS simplex: is_audio_bos=true (first audio token) +02:47:02.559 TTS Simplex Phase1: token 1/500: rel_id=1496 +02:47:02.570 TTS Simplex Phase1: token 2/500: rel_id=4218 +02:47:02.580 TTS Simplex Phase1: token 3/500: rel_id=4218 +02:47:02.591 TTS Simplex Phase1: token 4/500: rel_id=4137 +02:47:02.602 TTS Simplex Phase1: token 5/500: rel_id=4137 +02:47:02.817 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:47:02.817 TTS Simplex Phase1: token 25/500: rel_id=1749 +02:47:02.817 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:47:02.817 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:47:02.963 TTS Simplex Phase1: EOS token at step 39 +02:47:02.963 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:47:02.963 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=47 +02:47:02.972 TTS Simplex Phase2: text_eos_embed injected, n_past=48 +02:47:02.980 TTS Simplex Phase2: audio_bos injected, n_past=49, starting final generation +02:47:03.112 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:47:03.224 TTS Simplex Phase2: EOS at step 22 (final end) +02:47:03.224 TTS Simplex: chunk 结束,tts_token_buffer 剩余 9 tokens (保留等下一个 chunk) +02:47:03.224 TTS Simplex: is_final_text_chunk=true, flush 剩余 9 tokens 从 tts_token_buffer +02:47:03.224 TTS Simplex: generated 59 audio tokens for chunk 0 +02:47:03.224 TTS Simplex: chunk 0 first tokens: [1496 4218 4218 4137 4137 ], last tokens: [1489 4137 4218 4218 4137 ] +02:47:03.224 TTS Simplex: updated tts_n_past_accumulated=71, total_generated_tokens=59 +02:47:03.235 TTS: finished processing all chunks +02:47:03.235 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:47:03.235 TTS: sent is_final=true to T2W queue (turn end) +02:47:05.148 🎉 首响时间 (First Audio Response): 3586ms +02:47:05.148 T2W线程: wav_0.wav | 0.84s audio | 2329.7ms inference | RTF=2.77 | t=3586ms +02:47:07.395 T2W线程: wav_1.wav | 1.00s audio | 2246.6ms inference | RTF=2.25 | t=5834ms +02:47:09.504 T2W线程: wav_2.wav | 0.64s audio | 2108.0ms inference | RTF=3.29 | t=7942ms +02:47:09.504 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:47:09.504 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:47:09.606 omni_stop_threads: stop signals sent +02:47:09.606 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2000.289ms vocoder=329.330ms total=2329.634ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1874.519ms vocoder=372.070ms total=2246.599ms audio=24000 +[timing] call=2 tokens=12 final=1 token2mel=1887.511ms vocoder=220.482ms total=2108.008ms audio=15360 +Audio generation completed. +llama_perf_context_print: load time = 25194.31 ms +llama_perf_context_print: prompt eval time = 3065.64 ms / 182 tokens ( 16.84 ms per token, 59.37 tokens per second) +llama_perf_context_print: eval time = 517.68 ms / 9 runs ( 57.52 ms per token, 17.39 tokens per second) +llama_perf_context_print: total time = 33077.12 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-14-6a2560adbf8c404ba4ecb9b5bafe0f33.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-14-6a2560adbf8c404ba4ecb9b5bafe0f33.log new file mode 100755 index 000000000..46f52e1f0 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-14-6a2560adbf8c404ba4ecb9b5bafe0f33.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:47:11.339 === omni_init start +02:47:11.340 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:47:11.340 === omni_init: loading new LLM model +02:48:05.289 === omni_init: loading TTS model +02:48:05.289 TTS model: loading with n_gpu_layers=0 +02:48:09.023 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:48:09.023 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:48:14.521 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:48:14.527 TTS: head_code loaded, verifying first few values: +02:48:14.527 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:48:14.527 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:48:14.527 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:48:14.576 TTS: weights loaded successfully +02:48:14.577 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 +02:48:14.675 Projector: loaded successfully +02:48:14.675 === omni_init: loading APM model +02:48:17.727 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 +02:48:23.029 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:48:23.085 Token2Wav: all model files found, initializing session... +02:48:23.085 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:48:23.086 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:48:27.666 Token2Wav: initialized successfully +02:48:27.666 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:48:27.666 Token2Wav: 使用 C++ 实现 +02:48:27.666 === omni_init success: ctx_llama = 00000177e494f830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-14-vongzq47\fixture_ + Count: 2 +02:48:27.666 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:48:27.666 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-14-vongzq47\fixture_0000.wav +02:48:28.231 system prompt ref_audio embedding: n_pos=20 +02:48:28.732 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:48:28.732 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:48:28.732 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:48:28.732 n_past = 72 +02:48:28.732 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.0657 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 616.77 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 635.26 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 635.27 ms by vision ( 635.27 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-14-vongzq47\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 +02:48:29.892 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-14-vongzq47\fixture_0001.wav +02:48:30.173 stream_prefill(index=1): user audio embedding: n_pos=31 +02:48:30.485 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.75167 s +02:48:30.485 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:48:30.486 stream_decode: create tts thread (simplex mode) +02:48:30.486 stream_decode: create t2w thread +02:48:30.486 wait prefill done +02:48:30.486 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:48:30.486 T2W thread (C++) started + +02:48:30.489 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:48:30.490 TTS thread started +02:48:30.652 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:48:30.652 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:48:31.174 LLM: detected end token, set llm_generation_done=true +02:48:31.174 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] +02:48:31.174 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:48:31.174 📍 轮次 1 结束,记录边界于 n_past=191 +02:48:31.174 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] +02:48:31.174 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:48:31.174 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 +02:48:31.174 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:48:31.174 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:48:31.174 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:48:31.214 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:48:31.214 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:48:31.214 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:48:31.214 TTS Simplex: first chunk - cleared KV cache +02:48:31.214 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:48:31.266 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:48:31.476 TTS Simplex: prefill completed, n_past_tts=9 +02:48:31.476 TTS Simplex: sampler created +02:48:31.476 TTS simplex: is_audio_bos=true (first audio token) +02:48:31.501 TTS Simplex Phase1: token 1/500: rel_id=1487 +02:48:31.512 TTS Simplex Phase1: token 2/500: rel_id=4218 +02:48:31.523 TTS Simplex Phase1: token 3/500: rel_id=4299 +02:48:31.533 TTS Simplex Phase1: token 4/500: rel_id=4218 +02:48:31.544 TTS Simplex Phase1: token 5/500: rel_id=4218 +02:48:31.760 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:48:31.760 TTS Simplex Phase1: token 25/500: rel_id=1295 +02:48:31.760 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:48:31.760 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:48:31.873 TTS Simplex Phase1: EOS token at step 36 +02:48:31.873 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:48:31.873 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=44 +02:48:31.881 TTS Simplex Phase2: text_eos_embed injected, n_past=45 +02:48:31.889 TTS Simplex Phase2: audio_bos injected, n_past=46, starting final generation +02:48:32.052 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:48:32.120 TTS Simplex Phase2: EOS at step 21 (final end) +02:48:32.120 TTS Simplex: chunk 结束,tts_token_buffer 剩余 5 tokens (保留等下一个 chunk) +02:48:32.120 TTS Simplex: is_final_text_chunk=true, flush 剩余 5 tokens 从 tts_token_buffer +02:48:32.120 TTS Simplex: generated 55 audio tokens for chunk 0 +02:48:32.120 TTS Simplex: chunk 0 first tokens: [1487 4218 4299 4218 4218 ], last tokens: [1275 759 4299 4299 6082 ] +02:48:32.120 TTS Simplex: updated tts_n_past_accumulated=67, total_generated_tokens=55 +02:48:32.121 TTS: finished processing all chunks +02:48:32.121 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:48:32.121 TTS: sent is_final=true to T2W queue (turn end) +02:48:34.112 🎉 首响时间 (First Audio Response): 3626ms +02:48:34.112 T2W线程: wav_0.wav | 0.84s audio | 2350.4ms inference | RTF=2.80 | t=3626ms +02:48:36.363 T2W线程: wav_1.wav | 1.00s audio | 2250.6ms inference | RTF=2.25 | t=5878ms +02:48:38.406 T2W线程: wav_2.wav | 0.48s audio | 2042.0ms inference | RTF=4.25 | t=7920ms +02:48:38.407 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:48:38.407 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:48:38.413 omni_stop_threads: stop signals sent +02:48:38.413 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2014.984ms vocoder=335.371ms total=2350.370ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1862.150ms vocoder=388.435ms total=2250.596ms audio=24000 +[timing] call=2 tokens=8 final=1 token2mel=1865.175ms vocoder=176.826ms total=2042.011ms audio=11520 +Audio generation completed. +llama_perf_context_print: load time = 25236.50 ms +llama_perf_context_print: prompt eval time = 2984.20 ms / 182 tokens ( 16.40 ms per token, 60.99 tokens per second) +llama_perf_context_print: eval time = 519.49 ms / 9 runs ( 57.72 ms per token, 17.32 tokens per second) +llama_perf_context_print: total time = 32997.92 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-15-84c5ffad02684029bafbca2aba2106af.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-15-84c5ffad02684029bafbca2aba2106af.log new file mode 100755 index 000000000..fc5e357f7 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-15-84c5ffad02684029bafbca2aba2106af.log @@ -0,0 +1,484 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:48:40.543 === omni_init start +02:48:40.543 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:48:40.543 === omni_init: loading new LLM model +02:49:31.091 === omni_init: loading TTS model +02:49:31.091 TTS model: loading with n_gpu_layers=0 +02:49:34.886 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:49:34.886 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:49:40.489 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:49:40.495 TTS: head_code loaded, verifying first few values: +02:49:40.495 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:49:40.495 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:49:40.495 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:49:40.545 TTS: weights loaded successfully +02:49:40.545 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 +02:49:40.648 Projector: loaded successfully +02:49:40.648 === omni_init: loading APM model +02:49:43.804 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 +02:49:49.272 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:49:49.324 Token2Wav: all model files found, initializing session... +02:49:49.324 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:49:49.324 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:49:53.903 Token2Wav: initialized successfully +02:49:53.903 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:49:53.903 Token2Wav: 使用 C++ 实现 +02:49:53.903 === omni_init success: ctx_llama = 000001aafd49f830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-15-og1p931n\fixture_ + Count: 2 +02:49:53.903 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:49:53.903 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-15-og1p931n\fixture_0000.wav +02:49:54.490 system prompt ref_audio embedding: n_pos=20 +02:49:54.988 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:49:54.988 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:49:54.988 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:49:54.988 n_past = 72 +02:49:54.988 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.0853 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 630.00 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 648.42 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 648.42 ms by vision ( 648.42 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-15-og1p931n\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 +02:49:56.158 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-15-og1p931n\fixture_0001.wav +02:49:56.458 stream_prefill(index=1): user audio embedding: n_pos=31 +02:49:56.771 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.78043 s +02:49:56.771 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:49:56.771 stream_decode: create tts thread (simplex mode) +02:49:56.771 stream_decode: create t2w thread +02:49:56.771 wait prefill done +02:49:56.771 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:49:56.771 T2W thread (C++) started + +02:49:56.775 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:49:56.776 TTS thread started +02:49:56.932 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:49:56.932 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:49:57.449 LLM: detected end token, set llm_generation_done=true +02:49:57.449 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] +02:49:57.449 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:49:57.449 📍 轮次 1 结束,记录边界于 n_past=191 +02:49:57.449 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] +02:49:57.449 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:49:57.449 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 +02:49:57.449 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:49:57.449 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:49:57.450 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:49:57.488 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:49:57.488 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:49:57.488 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:49:57.488 TTS Simplex: first chunk - cleared KV cache +02:49:57.488 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:49:57.541 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:49:57.744 TTS Simplex: prefill completed, n_past_tts=9 +02:49:57.744 TTS Simplex: sampler created +02:49:57.744 TTS simplex: is_audio_bos=true (first audio token) +02:49:57.769 TTS Simplex Phase1: token 1/500: rel_id=1460 +02:49:57.779 TTS Simplex Phase1: token 2/500: rel_id=4218 +02:49:57.790 TTS Simplex Phase1: token 3/500: rel_id=4218 +02:49:57.801 TTS Simplex Phase1: token 4/500: rel_id=4218 +02:49:57.811 TTS Simplex Phase1: token 5/500: rel_id=4218 +02:49:58.033 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:49:58.033 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:49:58.033 TTS Simplex Phase1: token 25/500: rel_id=3906 +02:49:58.033 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:49:58.306 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 50, buffer=25) +02:49:58.306 TTS Simplex Phase1: token 50/500: rel_id=6026 +02:49:58.432 TTS Simplex Phase1: EOS token at step 62 +02:49:58.432 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:49:58.432 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=70 +02:49:58.439 TTS Simplex Phase2: text_eos_embed injected, n_past=71 +02:49:58.447 TTS Simplex Phase2: audio_bos injected, n_past=72, starting final generation +02:49:58.457 TTS Simplex Phase2: EOS at step 1 (final end) +02:49:58.458 TTS Simplex: chunk 结束,tts_token_buffer 剩余 11 tokens (保留等下一个 chunk) +02:49:58.458 TTS Simplex: is_final_text_chunk=true, flush 剩余 11 tokens 从 tts_token_buffer +02:49:58.458 TTS Simplex: generated 61 audio tokens for chunk 0 +02:49:58.458 TTS Simplex: chunk 0 first tokens: [1460 4218 4218 4218 4218 ], last tokens: [733 1461 4218 4218 6082 ] +02:49:58.458 TTS Simplex: updated tts_n_past_accumulated=73, total_generated_tokens=61 +02:49:58.468 TTS: finished processing all chunks +02:49:58.468 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:49:58.468 TTS: sent is_final=true to T2W queue (turn end) +02:50:00.359 🎉 首响时间 (First Audio Response): 3587ms +02:50:00.359 T2W线程: wav_0.wav | 0.84s audio | 2324.6ms inference | RTF=2.77 | t=3587ms +02:50:02.581 T2W线程: wav_1.wav | 1.00s audio | 2221.6ms inference | RTF=2.22 | t=5810ms +02:50:04.677 T2W线程: wav_2.wav | 0.72s audio | 2095.5ms inference | RTF=2.91 | t=7906ms +02:50:04.678 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:50:04.678 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:50:04.732 omni_stop_threads: stop signals sent +02:50:04.732 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=1988.256ms vocoder=336.333ms total=2324.610ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1841.697ms vocoder=379.857ms total=2221.565ms audio=24000 +[timing] call=2 tokens=14 final=1 token2mel=1856.846ms vocoder=238.637ms total=2095.494ms audio=17280 +Audio generation completed. +llama_perf_context_print: load time = 25720.03 ms +llama_perf_context_print: prompt eval time = 3028.03 ms / 182 tokens ( 16.64 ms per token, 60.11 tokens per second) +llama_perf_context_print: eval time = 513.77 ms / 9 runs ( 57.09 ms per token, 17.52 tokens per second) +llama_perf_context_print: total time = 33519.64 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-16-f66088565b534d1ab2749109959f8d63.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-16-f66088565b534d1ab2749109959f8d63.log new file mode 100755 index 000000000..583d656bd --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-16-f66088565b534d1ab2749109959f8d63.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:50:06.426 === omni_init start +02:50:06.427 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:50:06.427 === omni_init: loading new LLM model +02:50:56.728 === omni_init: loading TTS model +02:50:56.728 TTS model: loading with n_gpu_layers=0 +02:51:00.596 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:51:00.596 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:51:06.215 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:51:06.221 TTS: head_code loaded, verifying first few values: +02:51:06.221 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:51:06.221 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:51:06.221 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:51:06.272 TTS: weights loaded successfully +02:51:06.272 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 +02:51:06.375 Projector: loaded successfully +02:51:06.376 === omni_init: loading APM model +02:51:09.496 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 +02:51:15.048 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:51:15.099 Token2Wav: all model files found, initializing session... +02:51:15.100 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:51:15.100 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:51:19.818 Token2Wav: initialized successfully +02:51:19.818 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:51:19.818 Token2Wav: 使用 C++ 实现 +02:51:19.818 === omni_init success: ctx_llama = 000001b324f7f830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-16-686sircx\fixture_ + Count: 2 +02:51:19.819 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:51:19.819 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-16-686sircx\fixture_0000.wav +02:51:20.306 system prompt ref_audio embedding: n_pos=20 +02:51:20.798 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:51:20.798 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:51:20.798 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:51:20.798 n_past = 72 +02:51:20.798 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 0.979654 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 621.35 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 639.49 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 639.49 ms by vision ( 639.49 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-16-686sircx\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 +02:51:21.957 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-16-686sircx\fixture_0001.wav +02:51:22.256 stream_prefill(index=1): user audio embedding: n_pos=31 +02:51:22.567 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.76747 s +02:51:22.567 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:51:22.567 stream_decode: create tts thread (simplex mode) +02:51:22.567 stream_decode: create t2w thread +02:51:22.567 wait prefill done +02:51:22.567 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:51:22.568 T2W thread (C++) started + +02:51:22.573 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:51:22.574 TTS thread started +02:51:22.732 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:51:22.732 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:51:23.255 LLM: detected end token, set llm_generation_done=true +02:51:23.255 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] +02:51:23.255 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:51:23.255 📍 轮次 1 结束,记录边界于 n_past=191 +02:51:23.255 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] +02:51:23.255 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:51:23.256 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 +02:51:23.256 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:51:23.256 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:51:23.256 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:51:23.296 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:51:23.296 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:51:23.296 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:51:23.296 TTS Simplex: first chunk - cleared KV cache +02:51:23.296 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:51:23.349 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:51:23.572 TTS Simplex: prefill completed, n_past_tts=9 +02:51:23.572 TTS Simplex: sampler created +02:51:23.572 TTS simplex: is_audio_bos=true (first audio token) +02:51:23.598 TTS Simplex Phase1: token 1/500: rel_id=761 +02:51:23.608 TTS Simplex Phase1: token 2/500: rel_id=4137 +02:51:23.620 TTS Simplex Phase1: token 3/500: rel_id=4218 +02:51:23.630 TTS Simplex Phase1: token 4/500: rel_id=4218 +02:51:23.641 TTS Simplex Phase1: token 5/500: rel_id=4218 +02:51:23.856 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:51:23.856 TTS Simplex Phase1: token 25/500: rel_id=1978 +02:51:23.856 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:51:23.856 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:51:24.047 TTS Simplex Phase1: EOS token at step 43 +02:51:24.047 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:51:24.047 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=51 +02:51:24.055 TTS Simplex Phase2: text_eos_embed injected, n_past=52 +02:51:24.063 TTS Simplex Phase2: audio_bos injected, n_past=53, starting final generation +02:51:24.147 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:51:24.279 TTS Simplex Phase2: EOS at step 20 (final end) +02:51:24.279 TTS Simplex: chunk 结束,tts_token_buffer 剩余 11 tokens (保留等下一个 chunk) +02:51:24.279 TTS Simplex: is_final_text_chunk=true, flush 剩余 11 tokens 从 tts_token_buffer +02:51:24.279 TTS Simplex: generated 61 audio tokens for chunk 0 +02:51:24.279 TTS Simplex: chunk 0 first tokens: [761 4137 4218 4218 4218 ], last tokens: [739 1701 4218 4218 6082 ] +02:51:24.279 TTS Simplex: updated tts_n_past_accumulated=73, total_generated_tokens=61 +02:51:24.280 TTS: finished processing all chunks +02:51:24.280 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:51:24.280 TTS: sent is_final=true to T2W queue (turn end) +02:51:26.234 🎉 首响时间 (First Audio Response): 3666ms +02:51:26.234 T2W线程: wav_0.wav | 0.84s audio | 2377.2ms inference | RTF=2.83 | t=3666ms +02:51:28.463 T2W线程: wav_1.wav | 1.00s audio | 2227.8ms inference | RTF=2.23 | t=5895ms +02:51:30.595 T2W线程: wav_2.wav | 0.72s audio | 2131.8ms inference | RTF=2.96 | t=8027ms +02:51:30.596 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:51:30.596 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:02:51:51:30.3000.638 638 omni_stop_threads: stop signals sent +T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2044.605ms vocoder=332.557ms total=2377.176ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1844.917ms vocoder=382.804ms total=2227.738ms audio=24000 +[timing] call=2 tokens=14 final=1 token2mel=1881.609ms vocoder=250.147ms total=2131.771ms audio=17280 +Audio generation completed. +llama_perf_context_print: load time = 25880.97 ms +llama_perf_context_print: prompt eval time = 2912.20 ms / 182 tokens ( 16.00 ms per token, 62.50 tokens per second) +llama_perf_context_print: eval time = 521.12 ms / 9 runs ( 57.90 ms per token, 17.27 tokens per second) +llama_perf_context_print: total time = 33786.71 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-17-1dbbf8d44c554b0ab0e9d63d3d3c6cfb.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-17-1dbbf8d44c554b0ab0e9d63d3d3c6cfb.log new file mode 100755 index 000000000..0002ecbec --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-17-1dbbf8d44c554b0ab0e9d63d3d3c6cfb.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:51:32.459 === omni_init start +02:51:32.460 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:51:32.460 === omni_init: loading new LLM model +02:52:26.995 === omni_init: loading TTS model +02:52:26.995 TTS model: loading with n_gpu_layers=0 +02:52:30.548 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:52:30.548 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:52:36.028 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:52:36.034 TTS: head_code loaded, verifying first few values: +02:52:36.034 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:52:36.034 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:52:36.034 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:52:36.085 TTS: weights loaded successfully +02:52:36.085 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 +02:52:36.185 Projector: loaded successfully +02:52:36.186 === omni_init: loading APM model +02:52:39.215 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 +02:52:44.651 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:52:44.709 Token2Wav: all model files found, initializing session... +02:52:44.709 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:52:44.709 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:52:49.253 Token2Wav: initialized successfully +02:52:49.253 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:52:49.253 Token2Wav: 使用 C++ 实现 +02:52:49.253 === omni_init success: ctx_llama = 000001b52f2bf830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-17-82_a8k_s\fixture_ + Count: 2 +02:52:49.253 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:52:49.253 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-17-82_a8k_s\fixture_0000.wav +02:52:49.996 system prompt ref_audio embedding: n_pos=20 +02:52:50.495 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:52:50.495 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:52:50.495 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:52:50.495 n_past = 72 +02:52:50.495 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.24154 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 621.15 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 640.51 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 640.51 ms by vision ( 640.51 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-17-82_a8k_s\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 +02:52:51.652 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-17-82_a8k_s\fixture_0001.wav +02:52:51.952 stream_prefill(index=1): user audio embedding: n_pos=31 +02:52:52.264 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.76643 s +02:52:52.264 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:52:52.264 stream_decode: create tts thread (simplex mode) +02:52:52.264 stream_decode: create t2w thread +02:52:52.264 wait prefill done +02:52:52.264 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:52:52.264 T2W thread (C++) started + +02:52:52.268 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:52:52.268 TTS thread started +02:52:52.425 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:52:52.425 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:52:52.943 LLM: detected end token, set llm_generation_done=true +02:52:52.943 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] +02:52:52.943 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:52:52.943 📍 轮次 1 结束,记录边界于 n_past=191 +02:52:52.943 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] +02:52:52.943 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:52:52.943 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 +02:52:52.943 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:52:52.943 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:52:52.944 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:52:52.985 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:52:52.985 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:52:52.985 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:52:52.985 TTS Simplex: first chunk - cleared KV cache +02:52:52.985 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:52:53.039 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:52:53.243 TTS Simplex: prefill completed, n_past_tts=9 +02:52:53.243 TTS Simplex: sampler created +02:52:53.243 TTS simplex: is_audio_bos=true (first audio token) +02:52:53.268 TTS Simplex Phase1: token 1/500: rel_id=770 +02:52:53.280 TTS Simplex Phase1: token 2/500: rel_id=1950 +02:52:53.290 TTS Simplex Phase1: token 3/500: rel_id=4137 +02:52:53.301 TTS Simplex Phase1: token 4/500: rel_id=4137 +02:52:53.312 TTS Simplex Phase1: token 5/500: rel_id=4218 +02:52:53.537 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:52:53.537 TTS Simplex Phase1: token 25/500: rel_id=29 +02:52:53.537 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:52:53.537 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:52:53.689 TTS Simplex Phase1: EOS token at step 39 +02:52:53.689 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:52:53.689 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=47 +02:52:53.697 TTS Simplex Phase2: text_eos_embed injected, n_past=48 +02:52:53.705 TTS Simplex Phase2: audio_bos injected, n_past=49, starting final generation +02:52:53.845 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:52:53.890 TTS Simplex Phase2: EOS at step 16 (final end) +02:52:53.890 TTS Simplex: chunk 结束,tts_token_buffer 剩余 3 tokens (保留等下一个 chunk) +02:52:53.890 TTS Simplex: is_final_text_chunk=true, flush 剩余 3 tokens 从 tts_token_buffer +02:52:53.890 TTS Simplex: generated 53 audio tokens for chunk 0 +02:52:53.890 TTS Simplex: chunk 0 first tokens: [770 1950 4137 4137 4218 ], last tokens: [37 729 1950 4218 4137 ] +02:52:53.890 TTS Simplex: updated tts_n_past_accumulated=65, total_generated_tokens=53 +02:52:53.891 TTS: finished processing all chunks +02:52:53.891 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:52:53.891 TTS: sent is_final=true to T2W queue (turn end) +02:52:55.874 🎉 首响时间 (First Audio Response): 3610ms +02:52:55.874 T2W线程: wav_0.wav | 0.84s audio | 2336.5ms inference | RTF=2.78 | t=3610ms +02:52:58.123 T2W线程: wav_1.wav | 1.00s audio | 2247.7ms inference | RTF=2.25 | t=5859ms +02:53:00.120 T2W线程: wav_2.wav | 0.40s audio | 1996.7ms inference | RTF=4.99 | t=7856ms +02:53:00.121 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:53:00.121 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:53:00.195 omni_stop_threads: stop signals sent +02:53:00.195 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=1991.471ms vocoder=344.950ms total=2336.435ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1857.109ms vocoder=390.564ms total=2247.683ms audio=24000 +[timing] call=2 tokens=6 final=1 token2mel=1851.183ms vocoder=145.531ms total=1996.723ms audio=9600 +Audio generation completed. +llama_perf_context_print: load time = 25018.23 ms +llama_perf_context_print: prompt eval time = 3170.99 ms / 182 tokens ( 17.42 ms per token, 57.40 tokens per second) +llama_perf_context_print: eval time = 514.99 ms / 9 runs ( 57.22 ms per token, 17.48 tokens per second) +llama_perf_context_print: total time = 32788.54 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-18-0d33268ae2ec4cca9d14bbaa000aed11.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-18-0d33268ae2ec4cca9d14bbaa000aed11.log new file mode 100755 index 000000000..cf054f082 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-18-0d33268ae2ec4cca9d14bbaa000aed11.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:53:01.871 === omni_init start +02:53:01.872 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:53:01.872 === omni_init: loading new LLM model +02:53:53.980 === omni_init: loading TTS model +02:53:53.980 TTS model: loading with n_gpu_layers=0 +02:53:57.461 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:53:57.461 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:54:03.004 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:54:03.009 TTS: head_code loaded, verifying first few values: +02:54:03.009 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:54:03.009 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:54:03.009 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:54:03.058 TTS: weights loaded successfully +02:54:03.058 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 +02:54:03.160 Projector: loaded successfully +02:54:03.160 === omni_init: loading APM model +02:54:06.243 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 +02:54:11.812 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:54:11.867 Token2Wav: all model files found, initializing session... +02:54:11.867 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:54:11.867 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:54:16.373 Token2Wav: initialized successfully +02:54:16.373 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:54:16.373 Token2Wav: 使用 C++ 实现 +02:54:16.373 === omni_init success: ctx_llama = 0000026a277efb00 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-18-j6a2dg5o\fixture_ + Count: 2 +02:54:16.374 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:54:16.374 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-18-j6a2dg5o\fixture_0000.wav +02:54:17.036 system prompt ref_audio embedding: n_pos=20 +02:54:17.543 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:54:17.543 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:54:17.543 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:54:17.543 n_past = 72 +02:54:17.543 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.16958 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 623.64 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 641.11 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 641.11 ms by vision ( 641.11 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-18-j6a2dg5o\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 +02:54:18.715 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-18-j6a2dg5o\fixture_0001.wav +02:54:19.005 stream_prefill(index=1): user audio embedding: n_pos=31 +02:54:19.324 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.77855 s +02:54:19.324 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:54:19.324 stream_decode: create tts thread (simplex mode) +02:54:19.324 stream_decode: create t2w thread +02:54:19.324 wait prefill done +02:54:19.324 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:54:19.325 T2W thread (C++) started + +02:54:19.327 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:54:19.328 TTS thread started +02:54:19.487 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:54:19.487 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:54:20.034 LLM: detected end token, set llm_generation_done=true +02:54:20.034 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] +02:54:20.034 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:54:20.034 📍 轮次 1 结束,记录边界于 n_past=191 +02:54:20.034 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] +02:54:20.034 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:54:20.034 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 +02:54:20.034 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:54:20.034 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:54:20.035 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:54:20.068 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:54:20.068 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:54:20.068 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:54:20.068 TTS Simplex: first chunk - cleared KV cache +02:54:20.068 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:54:20.129 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:54:20.328 TTS Simplex: prefill completed, n_past_tts=9 +02:54:20.328 TTS Simplex: sampler created +02:54:20.328 TTS simplex: is_audio_bos=true (first audio token) +02:54:20.353 TTS Simplex Phase1: token 1/500: rel_id=770 +02:54:20.364 TTS Simplex Phase1: token 2/500: rel_id=4218 +02:54:20.374 TTS Simplex Phase1: token 3/500: rel_id=4218 +02:54:20.386 TTS Simplex Phase1: token 4/500: rel_id=4218 +02:54:20.396 TTS Simplex Phase1: token 5/500: rel_id=4137 +02:54:20.615 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:54:20.615 TTS Simplex Phase1: token 25/500: rel_id=829 +02:54:20.615 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:54:20.615 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:54:20.793 TTS Simplex Phase1: EOS token at step 42 +02:54:20.793 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:54:20.793 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=50 +02:54:20.800 TTS Simplex Phase2: text_eos_embed injected, n_past=51 +02:54:20.808 TTS Simplex Phase2: audio_bos injected, n_past=52, starting final generation +02:54:20.904 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:54:21.026 TTS Simplex Phase2: EOS at step 20 (final end) +02:54:21.026 TTS Simplex: chunk 结束,tts_token_buffer 剩余 10 tokens (保留等下一个 chunk) +02:54:21.026 TTS Simplex: is_final_text_chunk=true, flush 剩余 10 tokens 从 tts_token_buffer +02:54:21.026 TTS Simplex: generated 60 audio tokens for chunk 0 +02:54:21.026 TTS Simplex: chunk 0 first tokens: [770 4218 4218 4218 4137 ], last tokens: [7 735 4218 4218 1950 ] +02:54:21.026 TTS Simplex: updated tts_n_past_accumulated=72, total_generated_tokens=60 +02:54:21.027 TTS: finished processing all chunks +02:54:21.027 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:54:21.027 TTS: sent is_final=true to T2W queue (turn end) +02:54:22.940 🎉 首响时间 (First Audio Response): 3616ms +02:54:22.940 T2W线程: wav_0.wav | 0.84s audio | 2323.9ms inference | RTF=2.77 | t=3616ms +02:54:25.157 T2W线程: wav_1.wav | 1.00s audio | 2215.5ms inference | RTF=2.22 | t=5832ms +02:54:27.277 T2W线程: wav_2.wav | 0.68s audio | 2119.9ms inference | RTF=3.12 | t=7953ms +02:54:27.278 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:54:27.278 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:54:02:27.306 omni_stop_threads: stop signals sent +54:27.306 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=1993.339ms vocoder=330.501ms total=2323.855ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1838.655ms vocoder=376.862ms total=2215.528ms audio=24000 +[timing] call=2 tokens=13 final=1 token2mel=1867.828ms vocoder=252.075ms total=2119.913ms audio=16320 +Audio generation completed. +llama_perf_context_print: load time = 25382.23 ms +llama_perf_context_print: prompt eval time = 3112.86 ms / 182 tokens ( 17.10 ms per token, 58.47 tokens per second) +llama_perf_context_print: eval time = 543.75 ms / 9 runs ( 60.42 ms per token, 16.55 tokens per second) +llama_perf_context_print: total time = 33201.14 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-19-a1fe46c104ba46409bbcd1553640fab1.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-19-a1fe46c104ba46409bbcd1553640fab1.log new file mode 100755 index 000000000..3a0679e7a --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-19-a1fe46c104ba46409bbcd1553640fab1.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:54:29.284 === omni_init start +02:54:29.285 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:54:29.285 === omni_init: loading new LLM model +02:55:18.598 === omni_init: loading TTS model +02:55:18.598 TTS model: loading with n_gpu_layers=0 +02:55:22.298 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:55:22.298 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:55:27.768 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:55:27.772 TTS: head_code loaded, verifying first few values: +02:55:27.772 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:55:27.772 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:55:27.772 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:55:27.822 TTS: weights loaded successfully +02:55:27.822 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 +02:55:27.922 Projector: loaded successfully +02:55:27.922 === omni_init: loading APM model +02:55:30.974 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 +02:55:36.460 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:55:36.511 Token2Wav: all model files found, initializing session... +02:55:36.511 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:55:36.511 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:55:41.024 Token2Wav: initialized successfully +02:55:41.024 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:55:41.024 Token2Wav: 使用 C++ 实现 +02:55:41.024 === omni_init success: ctx_llama = 0000020a8eedf830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-19-8_qhill3\fixture_ + Count: 2 +02:55:41.025 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:55:41.025 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-19-8_qhill3\fixture_0000.wav +02:55:41.692 system prompt ref_audio embedding: n_pos=20 +02:55:42.194 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:55:42.194 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:55:42.194 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:55:42.194 n_past = 72 +02:55:42.194 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.16932 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 617.48 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 635.95 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 635.96 ms by vision ( 635.96 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-19-8_qhill3\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 +02:55:43.363 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-19-8_qhill3\fixture_0001.wav +02:55:43.665 stream_prefill(index=1): user audio embedding: n_pos=31 +02:55:43.978 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.78203 s +02:55:43.978 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:55:43.978 stream_decode: create tts thread (simplex mode) +02:55:43.978 stream_decode: create t2w thread +02:55:43.978 wait prefill done +02:55:43.978 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:55:43.978 T2W thread (C++) started + +02:55:43.982 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:55:43.983 TTS thread started +02:55:44.144 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:55:44.144 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:55:44.664 LLM: detected end token, set llm_generation_done=true +02:55:44.664 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] +02:55:44.664 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:55:44.664 📍 轮次 1 结束,记录边界于 n_past=191 +02:55:44.665 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] +02:55:44.665 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:55:44.665 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 +02:55:44.665 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:55:44.665 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:55:44.666 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:55:44.695 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:55:44.695 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:55:44.695 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:55:44.695 TTS Simplex: first chunk - cleared KV cache +02:55:44.695 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:55:44.758 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:55:44.969 TTS Simplex: prefill completed, n_past_tts=9 +02:55:44.969 TTS Simplex: sampler created +02:55:44.969 TTS simplex: is_audio_bos=true (first audio token) +02:55:44.995 TTS Simplex Phase1: token 1/500: rel_id=1487 +02:55:45.005 TTS Simplex Phase1: token 2/500: rel_id=4218 +02:55:45.016 TTS Simplex Phase1: token 3/500: rel_id=4218 +02:55:45.027 TTS Simplex Phase1: token 4/500: rel_id=4218 +02:55:45.038 TTS Simplex Phase1: token 5/500: rel_id=4137 +02:55:45.256 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:55:45.256 TTS Simplex Phase1: token 25/500: rel_id=2573 +02:55:45.256 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:55:45.256 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:55:45.260 TTS Simplex Phase1: EOS token at step 26 +02:55:45.260 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:55:45.260 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=34 +02:55:45.267 TTS Simplex Phase2: text_eos_embed injected, n_past=35 +02:55:45.274 TTS Simplex Phase2: audio_bos injected, n_past=36, starting final generation +02:55:45.554 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:55:45.642 TTS Simplex Phase2: EOS at step 33 (final end) +02:55:45.642 TTS Simplex: chunk 结束,tts_token_buffer 剩余 7 tokens (保留等下一个 chunk) +02:55:45.642 TTS Simplex: is_final_text_chunk=true, flush 剩余 7 tokens 从 tts_token_buffer +02:55:45.642 TTS Simplex: generated 57 audio tokens for chunk 0 +02:55:45.642 TTS Simplex: chunk 0 first tokens: [1487 4218 4218 4218 4137 ], last tokens: [4218 4218 4137 4137 4137 ] +02:55:45.642 TTS Simplex: updated tts_n_past_accumulated=69, total_generated_tokens=57 +02:55:45.643 TTS: finished processing all chunks +02:55:45.644 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:55:45.644 TTS: sent is_final=true to T2W queue (turn end) +02:55:47.594 🎉 首响时间 (First Audio Response): 3615ms +02:55:47.594 T2W线程: wav_0.wav | 0.84s audio | 2336.4ms inference | RTF=2.78 | t=3615ms +02:55:49.836 T2W线程: wav_1.wav | 1.00s audio | 2240.9ms inference | RTF=2.24 | t=5857ms +02:55:51.925 T2W线程: wav_2.wav | 0.56s audio | 2088.6ms inference | RTF=3.73 | t=7946ms +02:55:51.925 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:55:51.925 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:55:02:55:51.956 omni_stop_threads: stop signals sent +51.956 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2003.987ms vocoder=332.337ms total=2336.342ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1853.127ms vocoder=387.740ms total=2240.893ms audio=24000 +[timing] call=2 tokens=10 final=1 token2mel=1881.986ms vocoder=206.545ms total=2088.541ms audio=13440 +Audio generation completed. +llama_perf_context_print: load time = 25425.01 ms +llama_perf_context_print: prompt eval time = 3118.14 ms / 182 tokens ( 17.13 ms per token, 58.37 tokens per second) +llama_perf_context_print: eval time = 517.87 ms / 9 runs ( 57.54 ms per token, 17.38 tokens per second) +llama_perf_context_print: total time = 33237.41 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-2-765d0081ff11481199ba99c70808d3f7.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-2-765d0081ff11481199ba99c70808d3f7.log new file mode 100755 index 000000000..9795748d3 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-2-765d0081ff11481199ba99c70808d3f7.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:29:54.085 === omni_init start +02:29:54.085 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:29:54.085 === omni_init: loading new LLM model +02:30:44.245 === omni_init: loading TTS model +02:30:44.245 TTS model: loading with n_gpu_layers=0 +02:30:48.135 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:30:48.135 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:30:53.859 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:30:53.875 TTS: head_code loaded, verifying first few values: +02:30:53.875 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:30:53.875 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:30:53.875 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:30:53.940 TTS: weights loaded successfully +02:30:53.940 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 +02:30:54.047 Projector: loaded successfully +02:30:54.048 === omni_init: loading APM model +02:30:57.144 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 +02:31:03.140 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:31:03.192 Token2Wav: all model files found, initializing session... +02:31:03.193 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:31:03.193 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:31:07.919 Token2Wav: initialized successfully +02:31:07.919 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:31:07.919 Token2Wav: 使用 C++ 实现 +02:31:07.919 === omni_init success: ctx_llama = 0000011f354cfe80 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-2-4ont3qb6\fixture_ + Count: 2 +02:31:07.920 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:31:07.920 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-2-4ont3qb6\fixture_0000.wav +02:31:08.533 system prompt ref_audio embedding: n_pos=20 +02:31:09.097 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:31:09.097 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:31:09.097 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:31:09.097 n_past = 72 +02:31:09.097 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.17765 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 1005.59 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 1023.42 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 1023.42 ms by vision ( 1023.42 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-2-4ont3qb6\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 +02:31:10.698 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-2-4ont3qb6\fixture_0001.wav +02:31:11.008 stream_prefill(index=1): user audio embedding: n_pos=31 +02:31:11.371 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 2.27174 s +02:31:11.372 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:31:11.372 stream_decode: create tts thread (simplex mode) +02:31:11.372 stream_decode: create t2w thread +02:31:11.372 wait prefill done +02:31:11.372 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:31:11.372 T2W thread (C++) started + +02:31:11.378 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:31:11.379 TTS thread started +02:31:11.558 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:31:11.558 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:31:12.115 LLM: detected end token, set llm_generation_done=true +02:31:12.115 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] +02:31:12.115 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:31:12.115 📍 轮次 1 结束,记录边界于 n_past=191 +02:31:12.115 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] +02:31:12.115 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:31:12.115 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 +02:31:12.115 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:31:12.115 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:31:12.116 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:31:12.150 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:31:12.150 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:31:12.150 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:31:12.150 TTS Simplex: first chunk - cleared KV cache +02:31:12.150 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:31:12.211 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:31:13.607 TTS Simplex: prefill completed, n_past_tts=9 +02:31:13.608 TTS Simplex: sampler created +02:31:13.608 TTS simplex: is_audio_bos=true (first audio token) +02:31:13.633 TTS Simplex Phase1: token 1/500: rel_id=767 +02:31:13.645 TTS Simplex Phase1: token 2/500: rel_id=4218 +02:31:13.655 TTS Simplex Phase1: token 3/500: rel_id=4218 +02:31:13.666 TTS Simplex Phase1: token 4/500: rel_id=4137 +02:31:13.677 TTS Simplex Phase1: token 5/500: rel_id=4137 +02:31:13.895 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:31:13.895 TTS Simplex Phase1: token 25/500: rel_id=1685 +02:31:13.895 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:31:13.895 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:31:14.080 TTS Simplex Phase1: EOS token at step 42 +02:31:14.080 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:31:14.080 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=50 +02:31:14.087 TTS Simplex Phase2: text_eos_embed injected, n_past=51 +02:31:14.095 TTS Simplex Phase2: audio_bos injected, n_past=52, starting final generation +02:31:14.195 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:31:14.305 TTS Simplex Phase2: EOS at step 19 (final end) +02:31:14.305 TTS Simplex: chunk 结束,tts_token_buffer 剩余 9 tokens (保留等下一个 chunk) +02:31:14.305 TTS Simplex: is_final_text_chunk=true, flush 剩余 9 tokens 从 tts_token_buffer +02:31:14.305 TTS Simplex: generated 59 audio tokens for chunk 0 +02:31:14.305 TTS Simplex: chunk 0 first tokens: [767 4218 4218 4137 4137 ], last tokens: [4218 4137 4218 4218 3895 ] +02:31:14.305 TTS Simplex: updated tts_n_past_accumulated=71, total_generated_tokens=59 +02:31:14.306 TTS: finished processing all chunks +02:31:14.306 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:31:14.306 TTS: sent is_final=true to T2W queue (turn end) +02:31:16.353 🎉 首响时间 (First Audio Response): 4981ms +02:31:16.353 T2W线程: wav_0.wav | 0.84s audio | 2456.4ms inference | RTF=2.92 | t=4981ms +02:31:18.619 T2W线程: wav_1.wav | 1.00s audio | 2265.9ms inference | RTF=2.27 | t=7247ms +02:31:20.748 T2W线程: wav_2.wav | 0.64s audio | 2128.3ms inference | RTF=3.33 | t=9376ms +02:31:20.758 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:31:20.758 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:31:20.843 omni_stop_threads: stop signals sent +02:31:20.843 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2118.668ms vocoder=336.795ms total=2455.957ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1881.062ms vocoder=384.835ms total=2265.911ms audio=24000 +[timing] call=2 tokens=12 final=1 token2mel=1905.958ms vocoder=222.337ms total=2128.329ms audio=15360 +Audio generation completed. +llama_perf_context_print: load time = 27180.52 ms +llama_perf_context_print: prompt eval time = 3635.76 ms / 182 tokens ( 19.98 ms per token, 50.06 tokens per second) +llama_perf_context_print: eval time = 553.65 ms / 9 runs ( 61.52 ms per token, 16.26 tokens per second) +llama_perf_context_print: total time = 36465.48 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-20-60049a03aa98440796d4f3d095fab1da.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-20-60049a03aa98440796d4f3d095fab1da.log new file mode 100755 index 000000000..315bf5292 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-20-60049a03aa98440796d4f3d095fab1da.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:55:53.695 === omni_init start +02:55:53.695 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:55:53.695 === omni_init: loading new LLM model +02:56:44.599 === omni_init: loading TTS model +02:56:44.599 TTS model: loading with n_gpu_layers=0 +02:56:48.272 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:56:48.272 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:56:53.782 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:56:53.787 TTS: head_code loaded, verifying first few values: +02:56:53.787 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:56:53.787 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:56:53.787 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:56:53.836 TTS: weights loaded successfully +02:56:53.836 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 +02:56:53.938 Projector: loaded successfully +02:56:53.939 === omni_init: loading APM model +02:56:56.997 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 +02:57:02.691 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:57:02.745 Token2Wav: all model files found, initializing session... +02:57:02.745 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:57:02.745 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:57:07.258 Token2Wav: initialized successfully +02:57:07.258 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:57:07.258 Token2Wav: 使用 C++ 实现 +02:57:07.258 === omni_init success: ctx_llama = 000002181303f830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-20-zns5l6d7\fixture_ + Count: 2 +02:57:07.258 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:57:07.258 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-20-zns5l6d7\fixture_0000.wav +02:57:07.899 system prompt ref_audio embedding: n_pos=20 +02:57:08.408 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:57:08.408 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:57:08.408 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:57:08.408 n_past = 72 +02:57:08.408 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.14979 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 649.98 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 670.06 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 670.07 ms by vision ( 670.07 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-20-zns5l6d7\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 +02:57:09.600 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-20-zns5l6d7\fixture_0001.wav +02:57:09.906 stream_prefill(index=1): user audio embedding: n_pos=31 +02:57:10.221 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.81084 s +02:57:10.221 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:57:10.221 stream_decode: create tts thread (simplex mode) +02:57:10.221 stream_decode: create t2w thread +02:57:10.221 wait prefill done +02:57:10.221 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:57:10.222 T2W thread (C++) started + +02:57:10.226 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:57:10.227 TTS thread started +02:57:10.383 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:57:10.383 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:57:10.902 LLM: detected end token, set llm_generation_done=true +02:57:10.902 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] +02:57:10.902 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:57:10.902 📍 轮次 1 结束,记录边界于 n_past=191 +02:57:10.902 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] +02:57:10.902 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:57:10.902 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 +02:57:10.902 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:57:10.902 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:57:10.903 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:57:10.945 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:57:10.946 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:57:10.946 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:57:10.946 TTS Simplex: first chunk - cleared KV cache +02:57:10.946 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:57:10.994 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:57:11.220 TTS Simplex: prefill completed, n_past_tts=9 +02:57:11.220 TTS Simplex: sampler created +02:57:11.220 TTS simplex: is_audio_bos=true (first audio token) +02:57:11.247 TTS Simplex Phase1: token 1/500: rel_id=770 +02:57:11.258 TTS Simplex Phase1: token 2/500: rel_id=4137 +02:57:11.268 TTS Simplex Phase1: token 3/500: rel_id=4218 +02:57:11.279 TTS Simplex Phase1: token 4/500: rel_id=4218 +02:57:11.290 TTS Simplex Phase1: token 5/500: rel_id=1479 +02:57:11.513 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:57:11.513 TTS Simplex Phase1: token 25/500: rel_id=638 +02:57:11.513 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:57:11.513 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:57:11.592 TTS Simplex Phase1: EOS token at step 33 +02:57:11.592 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:57:11.592 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=41 +02:57:11.600 TTS Simplex Phase2: text_eos_embed injected, n_past=42 +02:57:11.609 TTS Simplex Phase2: audio_bos injected, n_past=43, starting final generation +02:57:11.808 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:57:11.830 TTS Simplex Phase2: EOS at step 20 (final end) +02:57:11.830 TTS Simplex: chunk 结束,tts_token_buffer 剩余 1 tokens (保留等下一个 chunk) +02:57:11.830 TTS Simplex: is_final_text_chunk=true, flush 剩余 1 tokens 从 tts_token_buffer +02:57:11.830 TTS Simplex: generated 51 audio tokens for chunk 0 +02:57:11.830 TTS Simplex: chunk 0 first tokens: [770 4137 4218 4218 1479 ], last tokens: [1536 40 736 4218 4137 ] +02:57:11.830 TTS Simplex: updated tts_n_past_accumulated=63, total_generated_tokens=51 +02:57:11.840 TTS: finished processing all chunks +02:57:11.841 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:57:11.841 TTS: sent is_final=true to T2W queue (turn end) +02:57:13.843 🎉 首响时间 (First Audio Response): 3621ms +02:57:13.843 T2W线程: wav_0.wav | 0.84s audio | 2328.7ms inference | RTF=2.77 | t=3621ms +02:57:16.094 T2W线程: wav_1.wav | 1.00s audio | 2250.2ms inference | RTF=2.25 | t=5872ms +02:57:18.093 T2W线程: wav_2.wav | 0.32s audio | 1998.2ms inference | RTF=6.24 | t=7871ms +02:57:18.093 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:57:18.093 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:02:57:57:18.153 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2000.972ms vocoder=327.689ms total=2328.679ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1858.415ms vocoder=391.779ms total=2250.218ms audio=24000 +[timing] call=2 tokens=4 final=1 token2mel=1864.264ms vocoder=133.880ms total=1998.153ms audio=7680 +Audio generation completed. +llama_perf_context_print: load time = 25393.23 ms +llama_perf_context_print: prompt eval time = 3124.73 ms / 182 tokens ( 17.17 ms per token, 58.24 tokens per second) +llama_perf_context_print: eval time = 515.78 ms / 9 runs ( 57.31 ms per token, 17.45 tokens per second) +llama_perf_context_print: total time = 33162.38 ms / 191 tokens +llama_perf_context_print: graphs reused = 10 +Token2Wav (C++): session released +18.153 omni_stop_threads: stop signals sent +tts thread end +t2w thread end diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-21-5a4d63dd3dcb4f3c92057150efda2aa9.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-21-5a4d63dd3dcb4f3c92057150efda2aa9.log new file mode 100755 index 000000000..a2ac565d4 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-21-5a4d63dd3dcb4f3c92057150efda2aa9.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:57:19.826 === omni_init start +02:57:19.826 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:57:19.826 === omni_init: loading new LLM model +02:58:15.498 === omni_init: loading TTS model +02:58:15.498 TTS model: loading with n_gpu_layers=0 +02:58:19.149 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:58:19.149 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:58:24.603 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:58:24.610 TTS: head_code loaded, verifying first few values: +02:58:24.610 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:58:24.610 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:58:24.610 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:58:24.662 TTS: weights loaded successfully +02:58:24.662 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 +02:58:24.764 Projector: loaded successfully +02:58:24.765 === omni_init: loading APM model +02:58:27.797 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 +02:58:33.423 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:58:33.481 Token2Wav: all model files found, initializing session... +02:58:33.481 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:58:33.481 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:58:38.019 Token2Wav: initialized successfully +02:58:38.019 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:58:38.019 Token2Wav: 使用 C++ 实现 +02:58:38.020 === omni_init success: ctx_llama = 00000176fcc9f830 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-21-2jf0zhae\fixture_ + Count: 2 +02:58:38.020 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:58:38.020 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-21-2jf0zhae\fixture_0000.wav +02:58:38.674 system prompt ref_audio embedding: n_pos=20 +02:58:39.166 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:58:39.166 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:58:39.166 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:58:39.166 n_past = 72 +02:58:39.166 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.14662 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 624.48 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 642.83 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 642.84 ms by vision ( 642.84 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-21-2jf0zhae\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 +02:58:40.324 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-21-2jf0zhae\fixture_0001.wav +02:58:40.642 stream_prefill(index=1): user audio embedding: n_pos=31 +02:58:40.952 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.78447 s +02:58:40.952 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:58:40.952 stream_decode: create tts thread (simplex mode) +02:58:40.952 stream_decode: create t2w thread +02:58:40.952 wait prefill done +02:58:40.952 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:58:40.953 T2W thread (C++) started + +02:58:40.956 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:58:40.957 TTS thread started +02:58:41.114 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:58:41.114 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:58:41.628 LLM: detected end token, set llm_generation_done=true +02:58:41.628 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] +02:58:41.628 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:58:41.628 📍 轮次 1 结束,记录边界于 n_past=191 +02:58:41.628 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] +02:58:41.628 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:58:41.628 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 +02:58:41.628 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:58:41.628 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:58:41.629 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:58:41.659 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:58:41.659 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:58:41.659 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:58:41.659 TTS Simplex: first chunk - cleared KV cache +02:58:41.659 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:58:41.721 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:58:41.930 TTS Simplex: prefill completed, n_past_tts=9 +02:58:41.930 TTS Simplex: sampler created +02:58:41.930 TTS simplex: is_audio_bos=true (first audio token) +02:58:41.955 TTS Simplex Phase1: token 1/500: rel_id=1487 +02:58:41.966 TTS Simplex Phase1: token 2/500: rel_id=1959 +02:58:41.978 TTS Simplex Phase1: token 3/500: rel_id=4137 +02:58:41.989 TTS Simplex Phase1: token 4/500: rel_id=4218 +02:58:42.000 TTS Simplex Phase1: token 5/500: rel_id=4137 +02:58:42.216 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:58:42.216 TTS Simplex Phase1: token 25/500: rel_id=2501 +02:58:42.216 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:58:42.216 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:58:42.429 TTS Simplex Phase1: EOS token at step 45 +02:58:42.429 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:58:42.429 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=53 +02:58:42.436 TTS Simplex Phase2: text_eos_embed injected, n_past=54 +02:58:42.444 TTS Simplex Phase2: audio_bos injected, n_past=55, starting final generation +02:58:42.510 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:58:42.685 TTS Simplex Phase2: EOS at step 22 (final end) +02:58:42.685 TTS Simplex: chunk 结束,tts_token_buffer 剩余 15 tokens (保留等下一个 chunk) +02:58:42.685 TTS Simplex: is_final_text_chunk=true, flush 剩余 15 tokens 从 tts_token_buffer +02:58:42.685 TTS Simplex: generated 65 audio tokens for chunk 0 +02:58:42.685 TTS Simplex: chunk 0 first tokens: [1487 1959 4137 4218 4137 ], last tokens: [1488 4218 4218 4218 4137 ] +02:58:42.685 TTS Simplex: updated tts_n_past_accumulated=77, total_generated_tokens=65 +02:58:42.696 TTS: finished processing all chunks +02:58:42.696 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:58:42.696 TTS: sent is_final=true to T2W queue (turn end) +02:58:44.569 🎉 首响时间 (First Audio Response): 3616ms +02:58:44.569 T2W线程: wav_0.wav | 0.84s audio | 2351.6ms inference | RTF=2.80 | t=3616ms +02:58:46.811 T2W线程: wav_1.wav | 1.00s audio | 2241.3ms inference | RTF=2.24 | t=5858ms +02:58:48.986 T2W线程: wav_2.wav | 0.88s audio | 2174.1ms inference | RTF=2.47 | t=8033ms +02:58:48.986 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:58:48.986 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:58:48.997 omni_stop_threads: stop signals sent +02:58:48.997 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2019.335ms vocoder=332.188ms total=2351.536ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1858.889ms vocoder=382.342ms total=2241.243ms audio=24000 +[timing] call=2 tokens=18 final=1 token2mel=1877.159ms vocoder=296.909ms total=2174.077ms audio=21120 +Audio generation completed. +llama_perf_context_print: load time = 25483.27 ms +llama_perf_context_print: prompt eval time = 3093.56 ms / 182 tokens ( 17.00 ms per token, 58.83 tokens per second) +llama_perf_context_print: eval time = 511.53 ms / 9 runs ( 56.84 ms per token, 17.59 tokens per second) +llama_perf_context_print: total time = 33365.85 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-22-1c388ac477f54151ab41e9d2e3442d38.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-22-1c388ac477f54151ab41e9d2e3442d38.log new file mode 100755 index 000000000..e69de29bb diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-3-5a5e09d95930426493ceb0d3c5d0f667.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-3-5a5e09d95930426493ceb0d3c5d0f667.log new file mode 100755 index 000000000..cd707ac1f --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-3-5a5e09d95930426493ceb0d3c5d0f667.log @@ -0,0 +1,484 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:31:23.750 === omni_init start +02:31:23.750 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:31:23.750 === omni_init: loading new LLM model +02:32:15.536 === omni_init: loading TTS model +02:32:15.536 TTS model: loading with n_gpu_layers=0 +02:32:19.053 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:32:19.053 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:32:24.501 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:32:24.507 TTS: head_code loaded, verifying first few values: +02:32:24.507 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:32:24.507 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:32:24.507 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:32:24.555 TTS: weights loaded successfully +02:32:24.555 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 +02:32:24.663 Projector: loaded successfully +02:32:24.663 === omni_init: loading APM model +02:32:27.730 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 +02:32:33.482 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:32:33.545 Token2Wav: all model files found, initializing session... +02:32:33.545 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:32:33.545 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:32:38.397 Token2Wav: initialized successfully +02:32:38.397 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:32:38.397 Token2Wav: 使用 C++ 实现 +02:32:38.397 === omni_init success: ctx_llama = 00000203d98cfe80 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-3-tuhz94cx\fixture_ + Count: 2 +02:32:38.397 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:32:38.397 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-3-tuhz94cx\fixture_0000.wav +02:32:38.798 system prompt ref_audio embedding: n_pos=20 +02:32:39.357 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:32:39.357 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:32:39.357 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:32:39.357 n_past = 72 +02:32:39.357 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 0.960375 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 863.16 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 880.76 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 880.77 ms by vision ( 880.77 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-3-tuhz94cx\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 +02:32:40.792 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-3-tuhz94cx\fixture_0001.wav +02:32:41.104 stream_prefill(index=1): user audio embedding: n_pos=31 +02:32:41.441 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 2.08277 s +02:32:41.452 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:32:41.452 stream_decode: create tts thread (simplex mode) +02:32:41.452 stream_decode: create t2w thread +02:32:41.452 wait prefill done +02:32:41.452 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:32:41.452 T2W thread (C++) started + +02:32:41.455 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:32:41.455 TTS thread started +02:32:41.632 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:32:41.632 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:32:42.156 LLM: detected end token, set llm_generation_done=true +02:32:42.157 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] +02:32:42.157 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:32:42.157 📍 轮次 1 结束,记录边界于 n_past=191 +02:32:42.157 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] +02:32:42.157 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:32:42.157 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 +02:32:42.157 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:32:42.157 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:32:42.158 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:32:42.191 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:32:42.191 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:32:42.191 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:32:42.191 TTS Simplex: first chunk - cleared KV cache +02:32:42.191 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:32:42.250 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:32:42.486 TTS Simplex: prefill completed, n_past_tts=9 +02:32:42.486 TTS Simplex: sampler created +02:32:42.486 TTS simplex: is_audio_bos=true (first audio token) +02:32:42.511 TTS Simplex Phase1: token 1/500: rel_id=2963 +02:32:42.523 TTS Simplex Phase1: token 2/500: rel_id=4218 +02:32:42.535 TTS Simplex Phase1: token 3/500: rel_id=4137 +02:32:42.546 TTS Simplex Phase1: token 4/500: rel_id=4137 +02:32:42.556 TTS Simplex Phase1: token 5/500: rel_id=4137 +02:32:42.779 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:32:42.779 TTS Simplex Phase1: token 25/500: rel_id=6302 +02:32:42.779 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:32:42.779 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:32:43.049 TTS Simplex Phase1: EOS token at step 50 +02:32:43.049 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:32:43.049 TTS Simplex Phase1: token 50/500: rel_id=6561 +02:32:43.049 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=58 +02:32:43.057 TTS Simplex Phase2: text_eos_embed injected, n_past=59 +02:32:43.065 TTS Simplex Phase2: audio_bos injected, n_past=60, starting final generation +02:32:43.076 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:32:43.264 TTS Simplex Phase2: EOS at step 18 (final end) +02:32:43.264 TTS Simplex: chunk 结束,tts_token_buffer 剩余 16 tokens (保留等下一个 chunk) +02:32:43.264 TTS Simplex: is_final_text_chunk=true, flush 剩余 16 tokens 从 tts_token_buffer +02:32:43.264 TTS Simplex: generated 66 audio tokens for chunk 0 +02:32:43.264 TTS Simplex: chunk 0 first tokens: [2963 4218 4137 4137 4137 ], last tokens: [36 1486 1707 4218 4137 ] +02:32:43.264 TTS Simplex: updated tts_n_past_accumulated=78, total_generated_tokens=66 +02:32:43.266 TTS: finished processing all chunks +02:32:43.266 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:32:43.266 TTS: sent is_final=true to T2W queue (turn end) +02:32:45.205 🎉 首响时间 (First Audio Response): 3752ms +02:32:45.205 T2W线程: wav_0.wav | 0.84s audio | 2424.0ms inference | RTF=2.89 | t=3752ms +02:32:47.486 T2W线程: wav_1.wav | 1.00s audio | 2280.5ms inference | RTF=2.28 | t=6034ms +02:32:49.700 T2W线程: wav_2.wav | 0.92s audio | 2213.2ms inference | RTF=2.41 | t=8247ms +02:32:49.700 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:32:49.700 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:32:02:49.32:738 omni_stop_threads: stop signals sent +49.738 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2080.289ms vocoder=342.817ms total=2423.505ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1882.980ms vocoder=397.498ms total=2280.489ms audio=24000 +[timing] call=2 tokens=19 final=1 token2mel=1904.339ms vocoder=308.800ms total=2213.151ms audio=22080 +Audio generation completed. +llama_perf_context_print: load time = 25709.10 ms +llama_perf_context_print: prompt eval time = 3233.37 ms / 182 tokens ( 17.77 ms per token, 56.29 tokens per second) +llama_perf_context_print: eval time = 520.35 ms / 9 runs ( 57.82 ms per token, 17.30 tokens per second) +llama_perf_context_print: total time = 33814.38 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-4-9ea9b162dbbc4e99b2764d814900c4f5.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-4-9ea9b162dbbc4e99b2764d814900c4f5.log new file mode 100755 index 000000000..1f73db5fd --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-4-9ea9b162dbbc4e99b2764d814900c4f5.log @@ -0,0 +1,479 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:32:53.004 === omni_init start +02:32:53.004 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:32:53.004 === omni_init: loading new LLM model +02:33:42.567 === omni_init: loading TTS model +02:33:42.567 TTS model: loading with n_gpu_layers=0 +02:33:45.341 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:33:45.341 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:33:50.973 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:33:50.979 TTS: head_code loaded, verifying first few values: +02:33:50.979 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:33:50.979 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:33:50.979 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:33:51.034 TTS: weights loaded successfully +02:33:51.034 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 +02:33:51.146 Projector: loaded successfully +02:33:51.147 === omni_init: loading APM model +02:33:54.119 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 +02:33:59.353 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:33:59.403 Token2Wav: all model files found, initializing session... +02:33:59.403 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:33:59.403 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:34:03.892 Token2Wav: initialized successfully +02:34:03.892 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:34:03.892 Token2Wav: 使用 C++ 实现 +02:34:03.892 === omni_init success: ctx_llama = 0000018ebc7dfe80 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-4-_xol6uv7\fixture_ + Count: 2 +02:34:03.892 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:34:03.892 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-4-_xol6uv7\fixture_0000.wav +02:34:04.574 system prompt ref_audio embedding: n_pos=20 +02:34:05.084 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:34:05.084 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:34:05.084 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:34:05.084 n_past = 72 +02:34:05.084 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.19259 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 566.22 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 583.82 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 583.83 ms by vision ( 583.83 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-4-_xol6uv7\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 +02:34:06.196 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-4-_xol6uv7\fixture_0001.wav +02:34:06.507 stream_prefill(index=1): user audio embedding: n_pos=31 +02:34:06.821 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.73603 s +02:34:06.821 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:34:06.821 stream_decode: create tts thread (simplex mode) +02:34:06.821 stream_decode: create t2w thread +02:34:06.821 wait prefill done +02:34:06.821 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:34:06.822 T2W thread (C++) started + +02:34:06.826 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:34:06.826 TTS thread started +02:34:06.986 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:34:06.986 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:34:07.524 LLM: detected end token, set llm_generation_done=true +02:34:07.524 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] +02:34:07.524 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:34:07.524 📍 轮次 1 结束,记录边界于 n_past=191 +02:34:07.524 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] +02:34:07.524 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:34:07.524 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 +02:34:07.524 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:34:07.524 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:34:07.525 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:34:07.555 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:34:07.555 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:34:07.555 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:34:07.555 TTS Simplex: first chunk - cleared KV cache +02:34:07.555 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:34:07.617 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:34:09.819 TTS Simplex: prefill completed, n_past_tts=9 +02:34:09.819 TTS Simplex: sampler created +02:34:09.819 TTS simplex: is_audio_bos=true (first audio token) +02:34:09.846 TTS Simplex Phase1: token 1/500: rel_id=3674 +02:34:09.857 TTS Simplex Phase1: token 2/500: rel_id=2031 +02:34:09.868 TTS Simplex Phase1: token 3/500: rel_id=1950 +02:34:09.879 TTS Simplex Phase1: token 4/500: rel_id=3891 +02:34:09.890 TTS Simplex Phase1: token 5/500: rel_id=1704 +02:34:10.091 TTS Simplex Phase1: EOS token at step 24 +02:34:10.091 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:34:10.091 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=32 +02:34:10.099 TTS Simplex Phase2: text_eos_embed injected, n_past=33 +02:34:10.107 TTS Simplex Phase2: audio_bos injected, n_past=34, starting final generation +02:34:10.130 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:34:10.130 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:34:10.130 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:34:10.407 TTS Simplex Phase2: EOS at step 27 (final end) +02:34:10.407 TTS Simplex: chunk 结束,tts_token_buffer 剩余 24 tokens (保留等下一个 chunk) +02:34:10.407 TTS Simplex: is_final_text_chunk=true, flush 剩余 24 tokens 从 tts_token_buffer +02:34:10.407 TTS Simplex: generated 49 audio tokens for chunk 0 +02:34:10.407 TTS Simplex: chunk 0 first tokens: [3674 2031 1950 3891 1704 ], last tokens: [66 1464 4218 4218 4137 ] +02:34:10.407 TTS Simplex: updated tts_n_past_accumulated=61, total_generated_tokens=49 +02:34:10.408 TTS: finished processing all chunks +02:34:10.409 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:34:10.409 TTS: sent is_final=true to T2W queue (turn end) +02:34:12.541 🎉 首响时间 (First Audio Response): 5719ms +02:34:12.541 T2W线程: wav_0.wav | 0.84s audio | 2410.3ms inference | RTF=2.87 | t=5719ms +02:34:14.862 T2W线程: wav_1.wav | 1.24s audio | 2320.2ms inference | RTF=1.87 | t=8040ms +02:34:14.862 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=1) +02:34:14.862 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:34:14.912 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2069.921ms vocoder=340.286ms total=2410.226ms audio=20160 +[timing] call=1 tokens=27 final=1 token2mel=1902.984ms vocoder=417.183ms total=2320.190ms audio=29760 +Audio generation completed. +llama_perf_context_print: load time = 24042.82 ms +llama_perf_context_print: prompt eval time = 3093.20 ms / 182 tokens ( 17.00 ms per token, 58.84 tokens per second) +llama_perf_context_print: eval time = 535.27 ms / 9 runs ( 59.47 ms per token, 16.81 tokens per second) +llama_perf_context_print: total time = 31968.52 ms / 191 tokens +llama_perf_context_print: graphs reused = 10 +Token2Wav (C++): session released +02:34:14.912 omni_stop_threads: stop signals sent +tts thread end +t2w thread end diff --git a/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-5-3f3a853496f84850a3b8d3e59ee80328.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-5-3f3a853496f84850a3b8d3e59ee80328.log new file mode 100755 index 000000000..88e17b3f8 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-5-3f3a853496f84850a3b8d3e59ee80328.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:34:17.437 === omni_init start +02:34:17.437 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:34:17.437 === omni_init: loading new LLM model +02:35:11.530 === omni_init: loading TTS model +02:35:11.530 TTS model: loading with n_gpu_layers=0 +02:35:14.637 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:35:14.637 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:35:20.270 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:35:20.276 TTS: head_code loaded, verifying first few values: +02:35:20.276 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:35:20.276 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:35:20.276 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:35:20.325 TTS: weights loaded successfully +02:35:20.325 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 +02:35:20.424 Projector: loaded successfully +02:35:20.425 === omni_init: loading APM model +02:35:23.456 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 +02:35:28.810 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:35:28.861 Token2Wav: all model files found, initializing session... +02:35:28.861 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:35:28.861 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:35:33.372 Token2Wav: initialized successfully +02:35:33.372 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:35:33.372 Token2Wav: 使用 C++ 实现 +02:35:33.372 === omni_init success: ctx_llama = 000002753e28fe80 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-5-5nm6m829\fixture_ + Count: 2 +02:35:33.372 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:35:33.372 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-5-5nm6m829\fixture_0000.wav +02:35:34.093 system prompt ref_audio embedding: n_pos=20 +02:35:34.580 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:35:34.580 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:35:34.581 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:35:34.581 n_past = 72 +02:35:34.581 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.20814 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 571.64 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 589.86 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 589.86 ms by vision ( 589.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_profile20_work_radeon\omni-minicpmo-5-5nm6m829\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 +02:35:35.686 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-5-5nm6m829\fixture_0001.wav +02:35:35.969 stream_prefill(index=1): user audio embedding: n_pos=31 +02:35:36.277 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.69494 s +02:35:36.277 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:35:36.277 stream_decode: create tts thread (simplex mode) +02:35:36.277 stream_decode: create t2w thread +02:35:36.277 wait prefill done +02:35:36.277 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:35:36.278 T2W thread (C++) started + +02:35:36.281 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:35:36.281 TTS thread started +02:35:36.437 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:35:36.437 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:35:36.954 LLM: detected end token, set llm_generation_done=true +02:35:36.955 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] +02:35:36.955 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:35:36.955 📍 轮次 1 结束,记录边界于 n_past=191 +02:35:36.955 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] +02:35:36.955 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:35:36.955 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 +02:35:36.955 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:35:36.955 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:35:36.956 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:35:36.996 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:35:36.996 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:35:36.996 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:35:36.996 TTS Simplex: first chunk - cleared KV cache +02:35:36.996 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:35:37.051 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:35:38.873 TTS Simplex: prefill completed, n_past_tts=9 +02:35:38.873 TTS Simplex: sampler created +02:35:38.873 TTS simplex: is_audio_bos=true (first audio token) +02:35:38.900 TTS Simplex Phase1: token 1/500: rel_id=740 +02:35:38.911 TTS Simplex Phase1: token 2/500: rel_id=4137 +02:35:38.922 TTS Simplex Phase1: token 3/500: rel_id=4218 +02:35:38.934 TTS Simplex Phase1: token 4/500: rel_id=4137 +02:35:38.944 TTS Simplex Phase1: token 5/500: rel_id=1950 +02:35:39.163 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:35:39.163 TTS Simplex Phase1: token 25/500: rel_id=4519 +02:35:39.163 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:35:39.163 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:35:39.355 TTS Simplex Phase1: EOS token at step 43 +02:35:39.355 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:35:39.355 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=51 +02:35:39.363 TTS Simplex Phase2: text_eos_embed injected, n_past=52 +02:35:39.370 TTS Simplex Phase2: audio_bos injected, n_past=53, starting final generation +02:35:39.458 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:35:39.568 TTS Simplex Phase2: EOS at step 18 (final end) +02:35:39.568 TTS Simplex: chunk 结束,tts_token_buffer 剩余 9 tokens (保留等下一个 chunk) +02:35:39.568 TTS Simplex: is_final_text_chunk=true, flush 剩余 9 tokens 从 tts_token_buffer +02:35:39.568 TTS Simplex: generated 59 audio tokens for chunk 0 +02:35:39.568 TTS Simplex: chunk 0 first tokens: [740 4137 4218 4137 1950 ], last tokens: [2919 1461 4218 4218 3894 ] +02:35:39.568 TTS Simplex: updated tts_n_past_accumulated=71, total_generated_tokens=59 +02:35:39.569 TTS: finished processing all chunks +02:35:39.569 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:35:39.569 TTS: sent is_final=true to T2W queue (turn end) +02:35:41.543 🎉 首响时间 (First Audio Response): 5266ms +02:35:41.543 T2W线程: wav_0.wav | 0.84s audio | 2378.7ms inference | RTF=2.83 | t=5266ms +02:35:43.790 T2W线程: wav_1.wav | 1.00s audio | 2245.6ms inference | RTF=2.25 | t=7512ms +02:35:45.902 T2W线程: wav_2.wav | 0.64s audio | 2111.8ms inference | RTF=3.30 | t=9624ms +02:35:45.902 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:35:45.902 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:35:45.903 omni_stop_threads: stop signals sent +02:35:45.903 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2039.361ms vocoder=339.277ms total=2378.651ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1864.287ms vocoder=381.301ms total=2245.599ms audio=24000 +[timing] call=2 tokens=12 final=1 token2mel=1886.133ms vocoder=225.612ms total=2111.757ms audio=15360 +Audio generation completed. +llama_perf_context_print: load time = 24779.65 ms +llama_perf_context_print: prompt eval time = 3063.44 ms / 182 tokens ( 16.83 ms per token, 59.41 tokens per second) +llama_perf_context_print: eval time = 515.09 ms / 9 runs ( 57.23 ms per token, 17.47 tokens per second) +llama_perf_context_print: total time = 34245.34 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-6-765c426a238146cca67a2cf5a31dcec6.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-6-765c426a238146cca67a2cf5a31dcec6.log new file mode 100755 index 000000000..7e22056b1 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-6-765c426a238146cca67a2cf5a31dcec6.log @@ -0,0 +1,483 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:35:48.961 === omni_init start +02:35:48.962 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:35:48.962 === omni_init: loading new LLM model +02:36:48.879 === omni_init: loading TTS model +02:36:48.879 TTS model: loading with n_gpu_layers=0 +02:36:52.539 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:36:52.539 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:36:58.443 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:36:58.448 TTS: head_code loaded, verifying first few values: +02:36:58.448 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:36:58.448 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:36:58.448 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:36:58.494 TTS: weights loaded successfully +02:36:58.494 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 +02:36:58.606 Projector: loaded successfully +02:36:58.606 === omni_init: loading APM model +02:37:02.258 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 +02:37:08.457 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:37:08.511 Token2Wav: all model files found, initializing session... +02:37:08.511 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:37:08.511 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:37:13.567 Token2Wav: initialized successfully +02:37:13.567 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:37:13.567 Token2Wav: 使用 C++ 实现 +02:37:13.567 === omni_init success: ctx_llama = 0000024aa791fe80 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-6-97uvprio\fixture_ + Count: 2 +02:37:13.567 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:37:13.567 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-6-97uvprio\fixture_0000.wav +02:37:14.378 system prompt ref_audio embedding: n_pos=20 +02:37:14.918 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:37:14.918 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:37:14.918 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:37:14.918 n_past = 72 +02:37:14.918 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.35118 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 584.36 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 602.34 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 602.34 ms by vision ( 602.34 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-6-97uvprio\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 +02:37:16.065 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-6-97uvprio\fixture_0001.wav +02:37:16.362 stream_prefill(index=1): user audio embedding: n_pos=31 +02:37:16.688 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.76831 s +02:37:16.688 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:37:16.688 stream_decode: create tts thread (simplex mode) +02:37:16.688 stream_decode: create t2w thread +02:37:16.688 wait prefill done +02:37:16.688 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:37:16.689 T2W thread (C++) started + +02:37:16.692 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:37:16.693 TTS thread started +02:37:16.868 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:37:16.868 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:37:17.385 LLM: detected end token, set llm_generation_done=true +02:37:17.385 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] +02:37:17.385 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:37:17.385 📍 轮次 1 结束,记录边界于 n_past=191 +02:37:17.385 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] +02:37:17.385 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:37:17.385 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 +02:37:17.385 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:37:17.385 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:37:17.386 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:37:17.415 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:37:17.415 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:37:17.415 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:37:17.415 TTS Simplex: first chunk - cleared KV cache +02:37:17.415 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:37:17.478 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:37:17.699 TTS Simplex: prefill completed, n_past_tts=9 +02:37:17.699 TTS Simplex: sampler created +02:37:17.699 TTS simplex: is_audio_bos=true (first audio token) +02:37:17.726 TTS Simplex Phase1: token 1/500: rel_id=1487 +02:37:17.737 TTS Simplex Phase1: token 2/500: rel_id=4137 +02:37:17.747 TTS Simplex Phase1: token 3/500: rel_id=6405 +02:37:17.758 TTS Simplex Phase1: token 4/500: rel_id=4218 +02:37:17.769 TTS Simplex Phase1: token 5/500: rel_id=4218 +02:37:17.989 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:37:17.989 TTS Simplex Phase1: token 25/500: rel_id=5853 +02:37:17.989 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:37:17.989 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:37:18.201 TTS Simplex Phase1: EOS token at step 45 +02:37:18.201 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:37:18.201 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=53 +02:37:18.209 TTS Simplex Phase2: text_eos_embed injected, n_past=54 +02:37:18.217 TTS Simplex Phase2: audio_bos injected, n_past=55, starting final generation +02:37:18.281 TTS Simplex Phase2: yield 25 tokens 到 T2W +02:37:18.476 TTS Simplex Phase2: EOS at step 24 (final end) +02:37:18.476 TTS Simplex: chunk 结束,tts_token_buffer 剩余 17 tokens (保留等下一个 chunk) +02:37:18.476 TTS Simplex: is_final_text_chunk=true, flush 剩余 17 tokens 从 tts_token_buffer +02:37:18.476 TTS Simplex: generated 67 audio tokens for chunk 0 +02:37:18.476 TTS Simplex: chunk 0 first tokens: [1487 4137 6405 4218 4218 ], last tokens: [4218 4218 6405 2031 6088 ] +02:37:18.476 TTS Simplex: updated tts_n_past_accumulated=79, total_generated_tokens=67 +02:37:18.477 TTS: finished processing all chunks +02:37:18.477 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:37:18.477 TTS: sent is_final=true to T2W queue (turn end) +02:37:20.345 🎉 首响时间 (First Audio Response): 3657ms +02:37:20.345 T2W线程: wav_0.wav | 0.84s audio | 2355.0ms inference | RTF=2.80 | t=3657ms +02:37:22.572 T2W线程: wav_1.wav | 1.00s audio | 2226.3ms inference | RTF=2.23 | t=5884ms +02:37:24.760 T2W线程: wav_2.wav | 0.96s audio | 2187.1ms inference | RTF=2.28 | t=8071ms +02:37:24.761 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:37:24.761 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:37:02:24.800 omni_stop_threads: stop signals sent +37:24.800 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2022.706ms vocoder=332.287ms total=2355.008ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1848.701ms vocoder=377.532ms total=2226.244ms audio=24000 +[timing] call=2 tokens=20 final=1 token2mel=1873.463ms vocoder=313.589ms total=2187.061ms audio=23040 +Audio generation completed. +llama_perf_context_print: load time = 27691.90 ms +llama_perf_context_print: prompt eval time = 3299.37 ms / 182 tokens ( 18.13 ms per token, 55.16 tokens per second) +llama_perf_context_print: eval time = 514.87 ms / 9 runs ( 57.21 ms per token, 17.48 tokens per second) +llama_perf_context_print: total time = 35624.36 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-7-509ef5e86bce44f3962216500758e762.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-7-509ef5e86bce44f3962216500758e762.log new file mode 100755 index 000000000..f9b1cef14 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-7-509ef5e86bce44f3962216500758e762.log @@ -0,0 +1,484 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:37:26.764 === omni_init start +02:37:26.764 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:37:26.764 === omni_init: loading new LLM model +02:38:17.790 === omni_init: loading TTS model +02:38:17.790 TTS model: loading with n_gpu_layers=0 +02:38:21.557 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:38:21.557 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:38:27.138 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:38:27.143 TTS: head_code loaded, verifying first few values: +02:38:27.143 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:38:27.143 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:38:27.143 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:38:27.188 TTS: weights loaded successfully +02:38:27.188 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 +02:38:27.290 Projector: loaded successfully +02:38:27.290 === omni_init: loading APM model +02:38:30.411 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 +02:38:36.023 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:38:36.075 Token2Wav: all model files found, initializing session... +02:38:36.075 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:38:36.075 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:38:40.781 Token2Wav: initialized successfully +02:38:40.781 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:38:40.781 Token2Wav: 使用 C++ 实现 +02:38:40.781 === omni_init success: ctx_llama = 0000016f6c97fe80 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-7-ynrdupcw\fixture_ + Count: 2 +02:38:40.781 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:38:40.782 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-7-ynrdupcw\fixture_0000.wav +02:38:41.285 system prompt ref_audio embedding: n_pos=20 +02:38:41.787 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:38:41.787 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:38:41.787 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:38:41.787 n_past = 72 +02:38:41.787 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.00564 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 631.04 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 649.10 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 649.10 ms by vision ( 649.10 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-7-ynrdupcw\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 +02:38:42.956 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-7-ynrdupcw\fixture_0001.wav +02:38:43.237 stream_prefill(index=1): user audio embedding: n_pos=31 +02:38:43.550 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.76079 s +02:38:43.550 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:38:43.550 stream_decode: create tts thread (simplex mode) +02:38:43.550 stream_decode: create t2w thread +02:38:43.550 wait prefill done +02:38:43.550 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:38:43.551 T2W thread (C++) started + +02:38:43.554 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:38:43.555 TTS thread started +02:38:43.711 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:38:43.711 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:38:44.229 LLM: detected end token, set llm_generation_done=true +02:38:44.229 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] +02:38:44.229 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:38:44.229 📍 轮次 1 结束,记录边界于 n_past=191 +02:38:44.229 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] +02:38:44.229 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:38:44.229 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 +02:38:44.229 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:38:44.229 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:38:44.230 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:38:44.262 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:38:44.262 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:38:44.262 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:38:44.262 TTS Simplex: first chunk - cleared KV cache +02:38:44.262 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:38:44.322 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:38:44.531 TTS Simplex: prefill completed, n_past_tts=9 +02:38:44.531 TTS Simplex: sampler created +02:38:44.531 TTS simplex: is_audio_bos=true (first audio token) +02:38:44.557 TTS Simplex Phase1: token 1/500: rel_id=1487 +02:38:44.568 TTS Simplex Phase1: token 2/500: rel_id=4137 +02:38:44.579 TTS Simplex Phase1: token 3/500: rel_id=4218 +02:38:44.590 TTS Simplex Phase1: token 4/500: rel_id=4218 +02:38:44.601 TTS Simplex Phase1: token 5/500: rel_id=4218 +02:38:44.820 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:38:44.820 TTS Simplex Phase1: token 25/500: rel_id=4913 +02:38:44.820 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:38:44.820 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:38:45.093 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 50, buffer=25) +02:38:45.093 TTS Simplex Phase1: token 50/500: rel_id=300 +02:38:45.153 TTS Simplex Phase1: EOS token at step 56 +02:38:45.153 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:38:45.153 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=64 +02:38:45.161 TTS Simplex Phase2: text_eos_embed injected, n_past=65 +02:38:45.169 TTS Simplex Phase2: audio_bos injected, n_past=66, starting final generation +02:38:45.201 TTS Simplex Phase2: EOS at step 3 (final end) +02:38:45.201 TTS Simplex: chunk 结束,tts_token_buffer 剩余 7 tokens (保留等下一个 chunk) +02:38:45.201 TTS Simplex: is_final_text_chunk=true, flush 剩余 7 tokens 从 tts_token_buffer +02:38:45.201 TTS Simplex: generated 57 audio tokens for chunk 0 +02:38:45.201 TTS Simplex: chunk 0 first tokens: [1487 4137 4218 4218 4218 ], last tokens: [2031 4218 4137 1959 1959 ] +02:38:45.201 TTS Simplex: updated tts_n_past_accumulated=69, total_generated_tokens=57 +02:38:45.212 TTS: finished processing all chunks +02:38:45.212 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:38:45.212 TTS: sent is_final=true to T2W queue (turn end) +02:38:47.162 🎉 首响时间 (First Audio Response): 3612ms +02:38:47.162 T2W线程: wav_0.wav | 0.84s audio | 2340.5ms inference | RTF=2.79 | t=3612ms +02:38:49.398 T2W线程: wav_1.wav | 1.00s audio | 2235.3ms inference | RTF=2.24 | t=5848ms +02:38:51.488 T2W线程: wav_2.wav | 0.56s audio | 2089.2ms inference | RTF=3.73 | t=7937ms +02:38:51.488 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:38:51.488 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:38:51.574 omni_stop_threads: stop signals sent +02:38:51.574 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2014.146ms vocoder=326.350ms total=2340.510ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1847.373ms vocoder=387.862ms total=2235.245ms audio=24000 +[timing] call=2 tokens=10 final=1 token2mel=1888.264ms vocoder=200.886ms total=2089.160ms audio=13440 +Audio generation completed. +llama_perf_context_print: load time = 25776.92 ms +llama_perf_context_print: prompt eval time = 2928.68 ms / 182 tokens ( 16.09 ms per token, 62.14 tokens per second) +llama_perf_context_print: eval time = 515.44 ms / 9 runs ( 57.27 ms per token, 17.46 tokens per second) +llama_perf_context_print: total time = 33639.40 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-8-7919065c767c42ddb58856319722e6d0.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-8-7919065c767c42ddb58856319722e6d0.log new file mode 100755 index 000000000..88fe90c98 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-8-7919065c767c42ddb58856319722e6d0.log @@ -0,0 +1,480 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:38:53.490 === omni_init start +02:38:53.490 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:38:53.490 === omni_init: loading new LLM model +02:39:47.565 === omni_init: loading TTS model +02:39:47.565 TTS model: loading with n_gpu_layers=0 +02:39:51.249 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:39:51.249 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:39:56.717 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:39:56.722 TTS: head_code loaded, verifying first few values: +02:39:56.722 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:39:56.722 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:39:56.722 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:39:56.767 TTS: weights loaded successfully +02:39:56.767 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 +02:39:56.868 Projector: loaded successfully +02:39:56.869 === omni_init: loading APM model +02:39:59.931 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 +02:40:05.413 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:40:05.467 Token2Wav: all model files found, initializing session... +02:40:05.467 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:40:05.467 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:40:10.039 Token2Wav: initialized successfully +02:40:10.039 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:40:10.040 Token2Wav: 使用 C++ 实现 +02:40:10.040 === omni_init success: ctx_llama = 000001509bdefe80 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-8-08wp6hsv\fixture_ + Count: 2 +02:40:10.040 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:40:10.040 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-8-08wp6hsv\fixture_0000.wav +02:40:10.659 system prompt ref_audio embedding: n_pos=20 +02:40:11.156 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:40:11.156 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:40:11.156 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:40:11.156 n_past = 72 +02:40:11.156 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.11626 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 632.38 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 650.82 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 650.83 ms by vision ( 650.83 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-8-08wp6hsv\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 +02:40:12.322 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-8-08wp6hsv\fixture_0001.wav +02:40:12.601 stream_prefill(index=1): user audio embedding: n_pos=31 +02:40:12.914 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.75555 s +02:40:12.914 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:40:12.914 stream_decode: create tts thread (simplex mode) +02:40:12.914 stream_decode: create t2w thread +02:40:12.914 wait prefill done +02:40:12.914 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:40:12.914 T2W thread (C++) started + +02:40:12.917 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:40:12.918 TTS thread started +02:40:13.075 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:40:13.075 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:40:13.595 LLM: detected end token, set llm_generation_done=true +02:40:13.595 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] +02:40:13.595 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:40:13.595 📍 轮次 1 结束,记录边界于 n_past=191 +02:40:13.595 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] +02:40:13.595 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:40:13.596 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 +02:40:13.596 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:40:13.596 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:40:13.596 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:40:13.637 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:40:13.637 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:40:13.637 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:40:13.637 TTS Simplex: first chunk - cleared KV cache +02:40:13.637 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:40:13.687 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:40:13.904 TTS Simplex: prefill completed, n_past_tts=9 +02:40:13.904 TTS Simplex: sampler created +02:40:13.904 TTS simplex: is_audio_bos=true (first audio token) +02:40:13.932 TTS Simplex Phase1: token 1/500: rel_id=1978 +02:40:13.943 TTS Simplex Phase1: token 2/500: rel_id=3459 +02:40:13.954 TTS Simplex Phase1: token 3/500: rel_id=155 +02:40:13.966 TTS Simplex Phase1: token 4/500: rel_id=2990 +02:40:13.977 TTS Simplex Phase1: token 5/500: rel_id=4995 +02:40:14.200 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:40:14.200 TTS Simplex Phase1: token 25/500: rel_id=6501 +02:40:14.200 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:40:14.200 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:40:14.301 TTS Simplex Phase1: EOS token at step 35 +02:40:14.301 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:40:14.301 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=43 +02:40:14.309 TTS Simplex Phase2: text_eos_embed injected, n_past=44 +02:40:14.317 TTS Simplex Phase2: audio_bos injected, n_past=45, starting final generation +02:40:14.492 TTS Simplex Phase2: EOS at step 16 (final end) +02:40:14.492 TTS Simplex: chunk 结束,tts_token_buffer 剩余 24 tokens (保留等下一个 chunk) +02:40:14.492 TTS Simplex: is_final_text_chunk=true, flush 剩余 24 tokens 从 tts_token_buffer +02:40:14.492 TTS Simplex: generated 49 audio tokens for chunk 0 +02:40:14.492 TTS Simplex: chunk 0 first tokens: [1978 3459 155 2990 4995 ], last tokens: [4543 35 71 876 1038 ] +02:40:14.492 TTS Simplex: updated tts_n_past_accumulated=61, total_generated_tokens=49 +02:40:14.503 TTS: finished processing all chunks +02:40:14.503 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:40:14.503 TTS: sent is_final=true to T2W queue (turn end) +02:40:16.519 🎉 首响时间 (First Audio Response): 3605ms +02:40:16.519 T2W线程: wav_0.wav | 0.84s audio | 2317.4ms inference | RTF=2.76 | t=3605ms +02:40:18.803 T2W线程: wav_1.wav | 1.24s audio | 2283.2ms inference | RTF=1.84 | t=5889ms +02:40:18.803 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=1) +02:40:18.803 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:40:18.884 omni_stop_threads: stop signals sent +02:40:18.885 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=1988.870ms vocoder=328.484ms total=2317.370ms audio=20160 +[timing] call=1 tokens=27 final=1 token2mel=1875.420ms vocoder=407.799ms total=2283.231ms audio=29760 +Audio generation completed. +llama_perf_context_print: load time = 25375.98 ms +llama_perf_context_print: prompt eval time = 3034.76 ms / 182 tokens ( 16.67 ms per token, 59.97 tokens per second) +llama_perf_context_print: eval time = 517.07 ms / 9 runs ( 57.45 ms per token, 17.41 tokens per second) +llama_perf_context_print: total time = 31184.80 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_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-9-b84f40b2f7e54848ad7d8137a4b602c9.log b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-9-b84f40b2f7e54848ad7d8137a4b602c9.log new file mode 100755 index 000000000..92a95a247 --- /dev/null +++ b/benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/worker_logs/minicpmo-9-b84f40b2f7e54848ad7d8137a4b602c9.log @@ -0,0 +1,484 @@ +build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 30720 MiB free +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: offloading 36 repeating layers to GPU +load_tensors: offloading output layer to GPU +load_tensors: offloaded 37/37 layers to GPU +load_tensors: Vulkan0 model buffer size = 4454.74 MiB +load_tensors: CPU_Mapped model buffer size = 333.43 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: Vulkan_Host output buffer size = 0.58 MiB +llama_kv_cache: Vulkan0 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: Vulkan0 compute buffer size = 304.38 MiB +llama_context: Vulkan_Host compute buffer size = 12.01 MiB +llama_context: graph nodes = 1267 +llama_context: graph splits = 2 +llama_model_load_from_file_impl: using device Vulkan0 (AMD Radeon(TM) 890M Graphics) (unknown id) - 25673 MiB free +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: offloading 0 repeating layers to GPU +load_tensors: offloaded 0/21 layers to GPU +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: Vulkan0 compute buffer size = 30.75 MiB +llama_context: Vulkan_Host compute buffer size = 7.01 MiB +llama_context: graph nodes = 613 +llama_context: graph splits = 216 (with bs=512), 1 (with bs=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 Vulkan0 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: Vulkan0 compute buffer size = 100.30 MiB +alloc_compute_meta: CPU compute buffer size = 18.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: 99 + 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 +02:40:20.639 === omni_init start +02:40:20.639 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output +02:40:20.639 === omni_init: loading new LLM model +02:40:54.698 === omni_init: loading TTS model +02:40:54.698 TTS model: loading with n_gpu_layers=0 +02:40:58.354 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05 +02:40:58.354 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)... +02:41:03.897 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768] +02:41:03.901 TTS: head_code loaded, verifying first few values: +02:41:03.901 head_code_weight[0] = 0.01361084 (expect ~0.01385498) +02:41:03.901 head_code_weight[1] = -0.01660156 (expect ~-0.01647949) +02:41:03.901 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391) +02:41:03.944 TTS: weights loaded successfully +02:41:03.945 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 +02:41:04.044 Projector: loaded successfully +02:41:04.045 === omni_init: loading APM model +02:41:07.144 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 +02:41:12.666 Token2Wav: found models in \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf +02:41:12.725 Token2Wav: all model files found, initializing session... +02:41:12.725 Token2Wav: non-CUDA backend, vocoder using CPU for better performance +02:41:12.725 Token2Wav: using prompt_cache from \\wsl.localhost\Ubuntu\home\zhout\project\edge_infer\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf +02:41:17.249 Token2Wav: initialized successfully +02:41:17.249 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav +02:41:17.249 Token2Wav: 使用 C++ 实现 +02:41:17.249 === omni_init success: ctx_llama = 000001bb47d9fe80 +=== Running test case === + Audio prefix: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-9-7tnit0uk\fixture_ + Count: 2 +02:41:17.249 stream_prefill: n_past = 0 + voice_clone_prompt = <|im_start|>system +模仿音频样本的音色并生成新的内容。 +<|audio_start|> + assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|> +<|im_start|>user + +02:41:17.249 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-9-7tnit0uk\fixture_0000.wav +02:41:18.010 system prompt ref_audio embedding: n_pos=20 +02:41:18.505 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除 +02:41:18.505 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill +02:41:18.505 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding) +02:41:18.505 n_past = 72 +02:41:18.505 + +c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048 + +prefill 0 (audio) : 1.256 s +encode_image_with_vision_chunks: step 1 of 1 encoded in 611.38 ms +encode_image_with_vision_chunks: all 1 chunks encoded in 629.92 ms (grid: 1x1) + +encode_image_with_vision_chunks: image encoded in 629.92 ms by vision ( 629.92 ms per chunk, 64 total tokens) +omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-9-7tnit0uk\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 +02:41:19.644 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_omni_profile20_work_radeon\omni-minicpmo-9-7tnit0uk\fixture_0001.wav +02:41:19.942 stream_prefill(index=1): user audio embedding: n_pos=31 +02:41:20.256 + +c++ finish stream_prefill(index=1). n_past=172, n_keep=72, n_ctx=2048 + +prefill 1 (audio+vision) : 1.74985 s +02:41:20.256 📍 stream_decode 开始: n_past=172, n_keep=72, n_ctx=2048, duplex_mode=0 +02:41:20.257 stream_decode: create tts thread (simplex mode) +02:41:20.257 stream_decode: create t2w thread +02:41:20.257 wait prefill done +02:41:20.257 📍 [单工TTS] 添加 assistant prompt: "<|im_end|> +<|im_start|>assistant + + + + +<|tts_bos|>", n_past=172 +02:41:20.257 T2W thread (C++) started + +02:41:20.261 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000 +02:41:20.262 TTS thread started +02:41:20.416 📍 [单工TTS] assistant prompt 完成, n_past=182 +02:41:20.416 LLM decode: max_tgt_len = 96, n_predict = 96, n_ctx = 2048 +02:41:20.935 LLM: detected end token, set llm_generation_done=true +02:41:20.935 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] +02:41:20.935 📍 Decode 结束: n_past=191, 剩余空间=1857, 无需滑窗 +02:41:20.935 📍 轮次 1 结束,记录边界于 n_past=191 +02:41:20.935 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] +02:41:20.935 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=8 +02:41:20.935 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 +02:41:20.935 TTS: DEBUG before has_llm_data - token_ids.size=8, hidden_states.size=32768, n_embd=4096 +02:41:20.935 TTS: has_llm_data=1, token_ids=8, hidden_states=32768, n_embd=4096, llm_finish=1 +02:41:20.936 TTS: n_tokens_orig=8, n_tokens_filtered=8 (filtered 0 special tokens) +02:41:20.969 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt +02:41:20.969 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=8, tts_n_embd=768) +02:41:20.969 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=9) +02:41:20.969 TTS Simplex: first chunk - cleared KV cache +02:41:20.969 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer +02:41:21.029 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=196 +02:41:21.239 TTS Simplex: prefill completed, n_past_tts=9 +02:41:21.239 TTS Simplex: sampler created +02:41:21.239 TTS simplex: is_audio_bos=true (first audio token) +02:41:21.264 TTS Simplex Phase1: token 1/500: rel_id=1604 +02:41:21.275 TTS Simplex Phase1: token 2/500: rel_id=4218 +02:41:21.286 TTS Simplex Phase1: token 3/500: rel_id=6405 +02:41:21.296 TTS Simplex Phase1: token 4/500: rel_id=6405 +02:41:21.307 TTS Simplex Phase1: token 5/500: rel_id=4218 +02:41:21.525 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25) +02:41:21.525 TTS Simplex Phase1: token 25/500: rel_id=1950 +02:41:21.525 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录 +02:41:21.525 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav +02:41:21.801 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 50, buffer=25) +02:41:21.801 TTS Simplex Phase1: token 50/500: rel_id=2993 +02:41:21.813 TTS Simplex Phase1: EOS token at step 52 +02:41:21.814 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed +02:41:21.814 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=60 +02:41:21.821 TTS Simplex Phase2: text_eos_embed injected, n_past=61 +02:41:21.828 TTS Simplex Phase2: audio_bos injected, n_past=62, starting final generation +02:41:22.071 TTS Simplex Phase2: EOS at step 22 (final end) +02:41:22.071 TTS Simplex: chunk 结束,tts_token_buffer 剩余 22 tokens (保留等下一个 chunk) +02:41:22.071 TTS Simplex: is_final_text_chunk=true, flush 剩余 22 tokens 从 tts_token_buffer +02:41:22.071 TTS Simplex: generated 72 audio tokens for chunk 0 +02:41:22.071 TTS Simplex: chunk 0 first tokens: [1604 4218 6405 6405 4218 ], last tokens: [2109 4299 4218 4218 3894 ] +02:41:22.071 TTS Simplex: updated tts_n_past_accumulated=84, total_generated_tokens=72 +02:41:22.081 TTS: finished processing all chunks +02:41:22.081 TTS: 单工模式轮次结束,下一轮 round_idx=1 +02:41:22.081 TTS: sent is_final=true to T2W queue (turn end) +02:41:23.885 🎉 首响时间 (First Audio Response): 3629ms +02:41:23.885 T2W线程: wav_0.wav | 0.84s audio | 2358.9ms inference | RTF=2.81 | t=3629ms +02:41:26.120 T2W线程: wav_1.wav | 1.00s audio | 2234.0ms inference | RTF=2.23 | t=5863ms +02:41:28.369 T2W线程: wav_2.wav | 1.16s audio | 2247.7ms inference | RTF=1.94 | t=8112ms +02:41:28.369 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=2) +02:41:28.369 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav +02:41:28.395 omni_stop_threads: stop signals sent +02:41:28.395 T2W(C++) 线程: 停止 +[timing] call=0 tokens=28 final=0 token2mel=2030.517ms vocoder=328.321ms total=2358.857ms audio=20160 +[timing] call=1 tokens=28 final=0 token2mel=1853.947ms vocoder=380.063ms total=2234.021ms audio=24000 +[timing] call=2 tokens=25 final=1 token2mel=1868.863ms vocoder=378.787ms total=2247.660ms audio=27840 +Audio generation completed. +llama_perf_context_print: load time = 25571.93 ms +llama_perf_context_print: prompt eval time = 3166.14 ms / 182 tokens ( 17.40 ms per token, 57.48 tokens per second) +llama_perf_context_print: eval time = 516.26 ms / 9 runs ( 57.36 ms per token, 17.43 tokens per second) +llama_perf_context_print: total time = 33550.58 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 b7e3f77f0..270c91442 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 @@ -2,7 +2,7 @@ All 60 pairings have a disposition. The timing tables below remain the 2026-09-22 measurements. The configuration matrix and affected per-cell reasons incorporate the [2026-09-23 scoped recovery runs](../../../e2e_recovery_20260923/README.md) and [WSL CPU/native Windows expansion](../../../e2e_expansion_20260923/README.md). The expansion adds separate 20-request serial MiniCPM-o text-to-speech profiles on WSL CPU and native Windows GPU, a Spark output-head component profile on the HX370 AMD NPU, complete Spark text-request profiles through standalone llama.cpp and a bounded Omni whole-session stage on native Windows CPU and Radeon 890M, native Windows CPU Qwen3-TTS text-to-WAV profiles through both standalone PyTorch and a bounded Omni whole-session stage, and a hybrid CPU+Radeon 890M Qwen3-TTS profile likewise repeated through a bounded Omni whole-session stage. A pinned GGUF MiniCPM-o route adds combined image+audio to text+speech runs on WSL CPU, native Windows CPU and native Windows Radeon 890M+CPU. All three now pass a bounded complete request through an Omni graph stage; the WSL CPU path additionally passed one warmup plus 20 serial measured requests. These are scoped synthetic cases, not full release qualification. -The WSL CPU and CPU+Radeon InternVLA cells also have [bounded Omni complete-policy profiles](../../../e2e_expansion_20260923/evidence/internvla_omni_policy/README.md): one warmup and 20 serial patterned synthetic requests per placement, plus admission refusal, cancellation and a public hybrid `AsyncOmni.generate` request. Separate native Windows [CPU](../../../e2e_expansion_20260923/evidence/internvla_omni_windows_cpu/README.md) and [CPU+Radeon](../../../e2e_expansion_20260923/evidence/internvla_omni_windows_hybrid/README.md) Omni profiles add 20 serial patterned requests per placement, refusal, cancellation and public action requests. These advance only the synthetic action-policy path. Real observations/reference actions, physical action units/order/step time, task quality, loading peak and sustained power/thermal behavior remain unverified. The earlier [Cosmos component and direct hybrid results](../../../e2e_expansion_20260923/evidence/internvla_cosmos_radeon890m/README.md) remain separate experiments. +The WSL CPU and CPU+Radeon InternVLA cells also have [bounded Omni complete-policy profiles](../../../e2e_expansion_20260923/evidence/internvla_omni_policy/README.md): one warmup and 20 serial patterned synthetic requests per placement, plus admission refusal, cancellation and a public hybrid `AsyncOmni.generate` request. Separate native Windows [CPU](../../../e2e_expansion_20260923/evidence/internvla_omni_windows_cpu/README.md) and [CPU+Radeon](../../../e2e_expansion_20260923/evidence/internvla_omni_windows_hybrid/README.md) Omni profiles add 20 serial patterned requests per placement, refusal, cancellation and public action requests. These advance only the synthetic action-policy path. Real observations/reference actions, physical action units/order/step time, task quality, loading peak and sustained power/thermal behavior remain unverified. The earlier [Cosmos component and direct hybrid results](../../../e2e_expansion_20260923/evidence/internvla_cosmos_radeon890m/README.md) remain separate experiments. A new [20-request native Radeon MiniCPM-o profile](../../../e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md) passed the scoped combined input/output path but exposed a large memory-sensitive latency regression versus its earlier one-request smoke; its row below supersedes the smoke for repeated-request timing. ## Configuration × model @@ -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 | The same pinned GGUF set ran one combined synthetic spoken-question+JPEG → text+speech request through a bounded Omni whole-session graph stage. Logs verify `GGML_VK_VISIBLE_DEVICES=1`, Radeon 890M Vulkan0 language (37/37 layers) and vision, with CPU TTS/Token2Wav/vocoder. It answered “The square in the image is red.” and produced 2.60 s of 24 kHz speech in 18.27 s complete-request wall time (one cold sample, zero warmups); sampled worker RSS peaked at 15.57 GB. The stage verified artifact and binary hashes, reserved 24 GiB shared RAM, emitted a terminal audio event, and in-flight cancellation left no stale output or reservation. The prior standalone prompted run took 18.63 s and its output transcribed with WER 0. This is CPU+iGPU joint execution, not all-Radeon or NPU execution; neither run qualifies general quality or sustained performance. | Validate real multimodal quality, playable streaming, post-cancel restart, loading peak, repeated/concurrent 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_radeon890m_prompted/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; 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 | 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. | diff --git a/docs/design/omni_edge_e2e_roadmap.md b/docs/design/omni_edge_e2e_roadmap.md index 488cb0628..4ec255e51 100644 --- a/docs/design/omni_edge_e2e_roadmap.md +++ b/docs/design/omni_edge_e2e_roadmap.md @@ -76,6 +76,17 @@ Radeon 890M, but per-operator placement was not measured. Action relative L2 difference was 2.4391% without a task tolerance; the hybrid startup was 4.72 s longer. Real task quality and sustained benefit remain open. +The [native Windows Radeon MiniCPM-o repeated profile](../../benchmarks/edge_harness/results/e2e_expansion_20260923/evidence/minicpmo_omni_radeon_profile20/README.md) +passed 20 serial combined synthetic audio+image to text+speech requests after +one warmup, but complete-request p50/p95 was 87.27/91.45 s and a separate +cold rerun was 88.01 s. The earlier single cold Omni request was 18.27 s; +all 21 successful new worker logs show Windows prefetch-memory warnings and +roughly 25–27 s model loads rather than 6.07 s. The placement remains scoped +functionally, while repeated latency and its cause remain unqualified. The +next M4a performance experiment must capture matched CPU/Radeon host-memory, +pagefile, shared-GPU-memory, file-I/O and power traces, not infer a speedup +from the earlier single sample. + The WSL RTX MiniCPM-o image-to-text+speech path now passes for one 448×448 synthetic red-square image under an explicit 0.61 thinker GPU budget. The previous 0.58 budget failed the 2,048-token KV admission gate; the successful