Commit Graph
3073 Commits
Author SHA1 Message Date
tzhouam 36ef53d9b1 Profile MiniCPM-o native storage and probe InternVLA AMD NPU 2026-09-24 04:51:30 +08:00
tzhouam e5c4449a8f Add admitted InternVLA CUDA policy on WSL and native Windows 2026-09-24 03:55:29 +08:00
tzhouam 60d07a8afd Record native Windows MiniCPM-o CPU control and unstable latency 2026-09-24 03:18:27 +08:00
tzhouam ddb8635cfe Store MiniCPM worker evidence as non-executable logs 2026-09-24 03:09:53 +08:00
tzhouam c5f47b22fd Profile repeated Radeon MiniCPM-o requests and record memory regression 2026-09-24 03:09:21 +08:00
tzhouam 5dd5d70671 Profile native Windows Radeon InternVLA policy stage 2026-09-24 02:24:16 +08:00
tzhouam 752357d318 Profile native Windows CPU InternVLA through Omni 2026-09-24 02:05:26 +08:00
tzhouam 48646da78e Add admitted InternVLA policy stages and update device matrix 2026-09-24 01:42:41 +08:00
tzhouam 9df5ac8836 Run InternVLA synthetic policy with Radeon Cosmos handoff 2026-09-24 01:12:27 +08:00
tzhouam b796c787ec Profile InternVLA Cosmos encoder on Radeon 890M and update matrix 2026-09-24 00:51:17 +08:00
tzhouam e6ea35ca12 Qualify scoped WSL CPU Qwen3-TTS Omni complete requests 2026-09-24 00:41:14 +08:00
tzhouam 10ae2818c7 Profile MiniCPM-o GGUF Omni complete path on WSL CPU 2026-09-24 00:21:11 +08:00
tzhouam fa5aadca6f Record MiniCPM-o GGUF Omni desktop qualification depth 2026-09-23 23:02:10 +08:00
tzhouam 0a41206e1f Add Omni MiniCPM-o GGUF whole-session CPU and Radeon paths 2026-09-23 23:01:22 +08:00
tzhouam 13cc723c71 Qualify scoped MiniCPM-o Radeon hybrid path 2026-09-23 22:43:20 +08:00
tzhouam 445ca92ef1 Record MiniCPM-o CPU GGUF complete-path evidence 2026-09-23 22:22:54 +08:00
tzhouam bb8735effc Add native Windows CPU Qwen TTS Omni stage and profile evidence 2026-09-23 21:18:21 +08:00
tzhouam 8569995591 Add bounded Omni Qwen3-TTS CPU Radeon whole-session stage 2026-09-23 20:52:43 +08:00
tzhouam 34beb7f01e Add bounded Omni llama.cpp Spark text stage for Windows CPU and Radeon 2026-09-23 20:30:28 +08:00
tzhouam 4fee1dbe39 Profile Qwen3-TTS hybrid Radeon and CPU route 2026-09-23 19:59:04 +08:00
tzhouam 54c086acae Record native Windows CPU Qwen3-TTS scoped E2E evidence 2026-09-23 19:19:13 +08:00
tzhouam 03d6cb9a93 Qualify standalone Spark text on Windows CPU and Radeon 890M 2026-09-23 18:57:41 +08:00
tzhouam 34295f3eb3 Qualify Spark output-head component on AMD NPU and update E2E matrix 2026-09-23 18:32:13 +08:00
tzhouam 10221f0665 Qualify scoped MiniCPM-o image and audio paths on WSL CPU 2026-09-23 17:44:02 +08:00
tzhouam b29a6ca99f Document Windows MiniCPM-o image and audio end-to-end runs 2026-09-23 17:29:13 +08:00
tzhouam a8fdb1babf Validate MiniCPM-o audio input to speech on WSL GPU 2026-09-23 17:09:37 +08:00
tzhouam 0d00ba4701 Validate MiniCPM-o image to speech on WSL GPU 2026-09-23 17:03:31 +08:00
tzhouam 8a4559c46c Validate MiniCPM-o speech pipeline on native Windows GPU 2026-09-23 16:54:17 +08:00
tzhouam 2f5d0edcf7 Qualify scoped MiniCPM-o CPU speech and Windows InternVLA policy paths 2026-09-23 16:21:28 +08:00
tzhouam 3f2cd52939 Update E2E matrix with scoped recovery evidence 2026-09-23 15:24:43 +08:00
tzhouam c0deaa76ba Repair MiniCPM-o and InternVLA scoped E2E paths 2026-09-23 15:15:07 +08:00
tzhouam 2d8b1d4583 Resume and hash-verify pending E2E checkpoints 2026-09-23 10:34:41 +08:00
tzhouam e0142926b6 Document MiniCPM-o checkpoint preflight and current deploy layout 2026-09-23 10:19:10 +08:00
tzhouam b039b6a5bd Enable scoped Qwen3.8 Omni inference and CPU TTS compatibility 2026-09-23 10:01:21 +08:00
tzhouam 75b65f859b Add local E2E profiling evidence and support roadmap 2026-09-22 19:25:02 +08:00
tzhouam ab2f2a3d65 Audit all mobile and PC model pairings with archived evidence 2026-09-22 13:54:34 +08:00
tzhouam 1887d8294b Present support as mobile and PC by model matrix 2026-09-22 13:31:08 +08:00
tzhouam 5c75d5bb0a Document support as model and PC configuration pairings 2026-09-22 13:20:50 +08:00
tzhouam 723c550209 Integrate portable edge graph backends with Omni runtime
Extract versioned stage contracts, model shared CPU/iGPU/NPU memory constraints, and add explicit graph routes, reservations, output acknowledgements, and worker retirement. Fix native Windows shared-buffer lifetime and host paths. Document qualified hardware paths and remaining rollout gates.
2026-09-22 13:12:33 +08:00
tzhouamandClaude Fable 5.1 00510ce38b [edge-infer] vllm_omni.windows: host-OS compatibility plugin for native Windows
One package that makes the POSIX assumptions measured in W0-W8 hold in
every process vLLM / vLLM-Omni starts, and reports what it did:
- provides fcntl (flock/lockf on msvcrt.locking; LOCK_SH served as
  exclusive) and uvloop (asyncio.run on a selector loop) when absent;
- installs WindowsSelectorEventLoopPolicy and a signal.signal fallback
  for loop.add_signal_handler on the Windows loop classes;
- replaces whole vLLM's get_open_zmq_ipc_path / find_loaded_library when
  the wheel lacks the branch patch and the upstream body hash is known;
- verifies the wheel-only sites (sentinel poll, int64 seed) and reports
  wheel_required at the exact site instead of failing downstream;
- shm_dir() replaces the /dev/shm literals; os.geteuid provided.
Activated from vllm_omni/patch.py and as vllm.general_plugins /
vllm_omni.general_plugins entry points (idempotent; no-op off Windows).
 prints the audit; the M0 placement
report embeds it. 16 Linux tests through injected primitives.
Design: analysis/design_windows_compat_plugin_20260921.md

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 14:02:01 +08:00
tzhouamandClaude Fable 5.1 97d97b6503 [edge-infer W8] Omni serve CLI: uvloop optional, selector-loop asyncio.run on Windows
uvloop ships no Windows wheels, so 'import uvloop' at module scope in
entrypoints/cli/serve.py killed vllm-omni serve on Windows at import
(measured in the serving e2e after the fcntl fix). _run_forever() uses
uvloop where present and asyncio.run on WindowsSelectorEventLoopPolicy
otherwise, which zmq.asyncio needs. The remaining serve-import blocker
on the Windows venv was a missing dependency, torchaudio (vLLM's own
requirement), installed into the venvs rather than patched.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 19:09:22 +08:00
tzhouamandClaude Fable 5.1 502dd7bed0 [edge-infer W8] Serving e2e launches the server itself; no module-level fcntl on the serve import path
test_e2e_serve_text.py no longer imports tests.helpers.runtime (it pulls
the media/diffusion test helpers and therefore diffusers, absent from the
Windows venv); a small Popen launcher with a psutil process-tree kill
replaces OmniServer for this one test.

vllm-omni serve died at import on Windows: entrypoints/cli imports
benchmarks.patch -> benchmarks/omniinteract.py, which did 'import fcntl'
at module scope. Its output lock is rebuilt on the fork's
_filelock_compat primitive (fcntl on POSIX, msvcrt on Windows).
engine/stage_phase_lock.py (parallel_stage_init's SH/EX device locks)
gets the same treatment: fcntl optional, modes spelled locally, and on
Windows both modes map to the exclusive byte lock -- more serialising,
never less safe. Measured: the serving e2e's server exited with
ModuleNotFoundError: No module named 'fcntl' on both Windows venvs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 19:05:55 +08:00
tzhouamandClaude Fable 5.1 d4c097531d [edge-infer W8] tests/edge/local: selector event loop on Windows for the async e2e tests
pytest-asyncio builds its loops from the current policy; on win32 that is
the Proactor loop, which zmq.asyncio cannot use, so the engine/serving e2e
hung at the first async socket (30 min, no output, GPU idle) while the
accept CLI -- which installs WindowsSelectorEventLoopPolicy itself --
passed on the same venv. The conftest now installs the same policy and
provides it as pytest-asyncio's event_loop_policy fixture.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 18:49:01 +08:00
tzhouamandClaude Fable 5.1 1baabdc78b [edge-infer] M0 serving end-to-end test: the OpenAI server on the local text plan
Drives `vllm-omni serve <model> --omni` as a subprocess through the
online-serving launcher and checks /health, /v1/models, non-streaming
and streaming chat completions, and that a client disconnect mid-stream
leaves the server answering. Sets VLLM_USE_FLASHINFER_SAMPLER=0 like
LocalTextEngine does: the flashinfer sampler JITs with nvcc at runtime,
which a venv without a CUDA toolkit does not have (measured: the WSL
reference venv died in profile_run with 'Could not find nvcc').

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 18:17:16 +08:00
tzhouamandClaude Fable 5.1 54a6787bde [edge-infer] Spark2_5: AutoWeightsLoader lost skip_prefixes in vLLM 0.29.0
The 0.29.0 loader de-duplicates tied parameters itself, so the explicit
lm_head. skip for tie_word_embeddings is no longer needed (and its keyword
no longer exists: engine init failed with TypeError on the first 0.29.0
parity run).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 10:05:57 +08:00
tzhouamandClaude Fable 5.1 8dfc8156bc [edge-infer] Track the M0 acceptance prompt set that edge.local accept loads
vllm_omni/edge/local/acceptance_chat_prompts.json was invisible to the WIP
snapshot because .gitignore ignores *.json; without it the acceptance CLI
and the parity runner cannot start on a fresh export.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 10:03:24 +08:00
tzhouamandClaude Fable 5.1 33de5d8629 Merge vLLM-Omni v0.29.0rc1 into edge-infer/omni-0.29.0
The pair for vLLM v0.29.0: rc1's docs pin vllm==0.29.0 and a static scan of
rc1's vllm.* imports against the v0.29.0 tree finds nothing missing, while
our 0.28-based tree needs seven modules v0.29.0 no longer has
(vllm.inputs.preprocess, entrypoints.launcher, openai.cli_args,
openai.engine.protocol, serve.utils.server_utils, layers.batch_invariant,
models.hunyuan_v1).

Ten files conflicted. Upstream's structure is the base everywhere; the
fork's features are re-attached to it:
- deploy_profile / apply_deploy_profile run before rc1's resolve_omni_config
  pops deploy_config (async_omni_engine, cli/serve); the deploy-profile
  selector and the resolve_model_config_path chain it needs stay in
  entrypoints/utils.py; stage_overrides takes rc1's dict type.
- config_factory keeps the lazy diffusion output-type import; the diffusion
  registry import in rc1's new config/resolver.py is made lazy for the same
  WP6 reason (TTS path must not load diffusion).
- requirements: our core/media split kept; rc1's transformers>=5.13 floor
  and kernels==0.16.1 applied in core.txt / media.txt.
- TTS: rc1's split_granularity and bounded seed plus our output_mode=
  codec_tokens, _SessionInbox cancel handling and codec DELTA accumulation;
  our private _conditioning_cache_salt is superseded by rc1's public
  tts_adapters/base.py::conditioning_cache_salt.
- stage_runtime: rc1's single ExitStack G2 path (lock released before READY)
  replaces our two-path block, with the four worker_phase names the init
  profiler consumes still emitted; _cpu_placed / host admission kept.

Not yet run against vLLM 0.29.0: the tests listed in the W6 record.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 09:57:20 +08:00
tzhouamandClaude Fable 5.1 4e3e8a1ebc [edge-infer] WIP snapshot: uncommitted M0/W1/W4/W5 edge work as of 2026-09-18
Verbatim copy of the edge/omni-edge working tree (tracked diffs + untracked
edge/local, tests/edge/local, docs/edge, pipeline files). Taken so that
vLLM-Omni v0.29.0rc1 can be merged on a branch without touching the
user's working tree. logs_edge/ and benchmark .npy outputs excluded.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 09:47:29 +08:00
tzhouamandClaude Opus 5 3834de3105 Rename the project to edge-infer, and complete the packaging audit
Renamed from vllm-embedding: nothing here is about embeddings, and the name had
come from the parent working directory. edge-infer says what it does. The
GitHub repository is renamed to match; nothing had been pushed yet.

The audit found the packaging was incomplete in two ways.

Scripts: 56 of them produced results that are published in this repo but were
not included, so the numbers could be read and not checked. Added under
benchmarks/edge_harness/experiments/ (one-off drivers: the AI Hub on-device
runs, the 4-bit GEMM microbenchmark, fidelity and parity checks, checkpoint
build and round-trip, activation capture, and the load generator used to prove
the contention guard actually refuses) and benchmarks/edge_harness/runs/ (the
24 shell drivers behind published grids). Both directories carry a README
saying plainly that they are a record of what was run rather than a supported
interface -- most hardcode absolute paths from the machine they ran on. The
supported entry points remain the tools one level up.

One broken relative link fixed (comparison.md is under docs/engines/, not
docs/analysis/). All other links and every script reference in the docs now
resolve inside the repo.

Secret scan: the token in ~/.qai_hub/client.ini is absent from the worktree and
from all 61 commits. Worth noting that an earlier version of my own check
reported a false positive, because `grep -rl ... | head` takes its exit status
from head, which always succeeds -- the same class of mistake as the measurement
errors this project keeps recording. The AI Hub scripts authenticate by reading
that file at runtime and contain no credential.

README reframed for the new name and the wider scope: the repository is the
engine changes, the harness, the raw results, the baselines and the analyses,
not just a patch set.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1ax5wYLA6XbqEL1i8L9gZ
2026-09-14 14:21:07 +08:00
tzhouamandClaude Opus 5 99ebfbbd04 docs: we do patch vLLM, at runtime -- correct two overstatements
The previous commit said "vLLM itself is not modified" and described the
changes as going "through vLLM's own extension points". Challenged on it, and
the challenge was right: those are two different claims and only one of them
holds as written.

What is true: no file in the vLLM tree or in site-packages/vllm is edited, the
checkout is clean upstream and the wheel is stock 0.28.0+cpu, so there is no
patch series to apply and no vLLM fork to maintain.

What was wrong:

1. vllm_omni/patch.py does nine _patch_* functions performing ten direct
   attribute replacements -- CpuPlatform.check_and_update_config,
   CPUWorker.load_model, torch.compiler.load_compiled_function. That is
   monkey-patching, not an extension point, and calling it one made the
   arrangement sound more robust than it is. Only the registries are genuine
   hooks: register_quantization_config, ir.ops.*.register_impl, platform
   plugins, direct_register_custom_op.

2. "The changes survive a wheel upgrade rather than being lost on it" is true of
   the registrations and overstated for the patches. Each patch is keyed to a
   specific method on a specific vLLM class; an upstream rename or behaviour
   change can break it or silently turn it into a no-op wrapper. The failure
   mode is a missing optimisation, not a crash, which is worse -- so the doc now
   says to re-run the harness after upgrading.

The section is rewritten to separate the two mechanisms, list what each patch
works around, and note that two of the three exist for upstream bugs and should
disappear when those are fixed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1ax5wYLA6XbqEL1i8L9gZ
2026-09-14 14:07:31 +08:00