Files
vllm-omni/docs/edge/environment.md
T
tzhouamandClaude Opus 5 9264ff81ab Include the baselines, comparisons and study documents, not just the fork
The packaging commit shipped the code and a summary of the numbers. It left out
everything the numbers are measured *against*, which is most of what makes them
checkable.

Added:

  baselines/                 llama.cpp runs (thread sweeps, NUMA sweeps, the
                             interleaved A/B passes behind the headline decode
                             figure) and the quality references: each build
                             against its own bf16 over 12 greedy prompts.
  benchmarks/.../results/    102 artifacts backing the published figures, each
                             with a provenance block naming the model,
                             quantization, thread set and build SHAs.
  docs/engines/              the engine analyses -- llama.cpp, ExecuTorch, MNN,
                             ncnn, vLLM, vLLM-Omni -- and the cross-engine and
                             device-simulation comparisons.
  docs/analysis/             the full study documents the summaries distil.
  docs/edge/comparisons.md   where this fork sits against llama.cpp and why:
                             decode is llama.cpp's, prefill is ours by ~2x, and
                             since neither engine exceeds 39% of the measured
                             222 GB/s ceiling the decode gap is the execution
                             model rather than the kernels.
  docs/edge/environment.md   pins and machine, and the correction below.

On "the modified vllm": there isn't one, and the doc says so plainly because it
is the obvious assumption. The vLLM checkout is clean upstream (0 commits
ahead, 0 uncommitted) and the installed wheel is stock 0.28.0+cpu. This fork
changes vLLM's CPU *behaviour* through vLLM's own extension points at import
time -- three CPU patches in vllm_omni/patch.py, the quantization-config
registry, the IR op registry, platform hooks -- specifically so the changes
survive a wheel upgrade rather than being lost on it. One of those patches is
why "KV sizing is not a memory lever" looked true for months: CpuPlatform
overwrote kv_cache_memory_bytes unconditionally, so the setting had no effect.
There is no patch series to apply; pin the version and let patch.py do the rest.

.gitignore gains explicit exceptions: upstream's blanket `*.json` and `results/`
rules were silently eating the measurement artifacts, which in this fork are the
substance rather than build output. Binary captures stay ignored.

No vLLM or llama.cpp source is redistributed -- only output produced with them.
NOTICE records both.

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

3.6 KiB

Environment, pins and reproducing a number

Every figure in this repository was produced with the versions below. A result whose environment was not recorded cannot be retracted later, only doubted, so the harness stamps these into each artifact automatically — see the provenance block in any file under benchmarks/edge_harness/results/.

vLLM is not modified

Worth stating plainly, because it is the obvious assumption and it is wrong.

This fork changes vLLM's behaviour on CPU, but the vLLM tree and the installed wheel are stock. The changes are runtime patches applied at import through vLLM's own extension points, so they survive a wheel upgrade instead of being lost on it:

patch (vllm_omni/patch.py) what it changes
_patch_cpu_aot_compile_cache_load vLLM's CPU path fails to load its own AOT artifact (finalize_loading missing on a plain function), treats it as a miss, and recompiles on every start
_patch_cpu_explicit_kv_cache_memory CpuPlatform.check_and_update_config overwrites kv_cache_memory_bytes from VLLM_CPU_KVCACHE_SPACE unconditionally, so a per-stage budget had no effect at all — this is what made "KV sizing is not a memory lever" look true
_patch_cpu_release_memory_after_load returns freed allocator arenas to the OS after weight load

Other extension points used, rather than edits: the quantization-config registry (register_quantization_config for cpu_int4), the IR op registry, platform hooks, and worker method wrapping.

So there is no vLLM patch series to apply. Pin the version and let patch.py do the rest.

Pins

component pin
vLLM (installed) 0.28.0+cpu wheel
vLLM (source read for this work) 51da0ca66c8065619c79e35dff97aa99aeaf5644 (v0.28.1rc0)
llama.cpp (baseline) e71b80510c848c00175924ecf3c40333ccae8eb5 (2026-09-07)
Python 3.12
torch CPU build, as pulled by the vLLM CPU wheel
pip install --torch-backend cpu \
  https://github.com/vllm-project/vllm/releases/download/v0.28.0/vllm-0.28.0+cpu-cp38-abi3-manylinux_2_34_x86_64.whl
VLLM_TARGET_DEVICE=cpu pip install -e .          # this fork

Machine

Dual-socket Xeon Platinum 8480C (Sapphire Rapids, 56 cores/socket, AMX-BF16 and AMX-INT8), 2 TB RAM, NUMA nodes 0 = CPUs 0-55/112-167 and 1 = 56-111/168-223.

It is shared, which shapes everything: end-to-end throughput swings ~30% run to run, per-op self time reproduces to ~5%, RssAnon to 0.2%. Runs are pinned with numactl --physcpubind=<24 cores> --membind=<node> and the harness refuses to start when those cores are already busy.

Reproducing a published number

# memory: any of the four levers, as its own A/B
python benchmarks/edge_harness/bench_harness.py --spec <arms>.json \
    --passes 3 --metric rss_anon_tree_mb --cores 56-79 --out summary.json

# where each number came from
python -c "import json,sys; print(json.load(open(sys.argv[1]))['provenance'])" \
    benchmarks/edge_harness/results/<file>.json

Two settings change what a memory or profile number means, and both have produced a wrong published conclusion by being left at their default: --context-len (without it the KV cache is allocated and never touched) and --prompt-len (the default of 1 profiles an empty attention cache).

Retracted artifacts

Files under benchmarks/edge_harness/results/ carrying "retracted": true are kept deliberately rather than deleted, with the reason and the superseding file named. profile_w4a8_g128_p{1,2}.json are the clearest case: both show _C::onednn_mm at ~2.97 ms/step, the signature of a checkpoint whose output head was left in bf16, and every W4A8 number derived from them is void.