From 2b5d889ba8e3adb18cff52913e5209b66e7877cb Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 21 Oct 2026 14:07:10 -0700 Subject: [PATCH 01/85] gate: regenerate console/ledger-rules.json on sync; sync when the merged tree's copy is stale #181 changed an H34-family row and merged as a ledger-only PR, which the gate lets through without a CI re-run, so console/ledger-rules.json drifted and main's console_test went red (fixed in #187). The gate now reads the tree main + head would merge to (git merge-tree) and, when its ledger-rules.json is not what its EXPERIMENTS.md generates, syncs before merging; every sync regenerates the file and commits it. The release path (hack/release_cas.sh) already regenerates it for packages. tests/gate_merge_test.sh: a stale merged tree syncs before the merge; a current one merges without a sync. --- hack/gate_merge.sh | 56 +++++++++++++++++++++++++++++++++------- tests/gate_merge_test.sh | 27 +++++++++++++++++++ 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/hack/gate_merge.sh b/hack/gate_merge.sh index cd766b2f..0b4b08ef 100755 --- a/hack/gate_merge.sh +++ b/hack/gate_merge.sh @@ -11,6 +11,11 @@ # CANCELLED, TIMED_OUT, STARTUP_FAILURE, ACTION_REQUIRED, STALE) or a failed # workflow run exits 1. # +# Derived file: console/ledger-rules.json is EXPERIMENTS.md's rule rows as packages +# ship them. A ledger-only PR (or base) merges without a CI re-run, so the gate +# itself checks the merged tree: when the file there is not what EXPERIMENTS.md +# generates, it syncs, and every sync regenerates the file and commits it. +# # Moved base: if main is no longer an ancestor of the head, and both main # (since the merge base) and the PR change files other than EXPERIMENTS.md and # docs/provenance.md, the gate syncs the branch so CI re-runs on the merged @@ -44,15 +49,24 @@ sync() { git fetch -q origin git worktree remove --force "$W" 2>/dev/null; git worktree add -q -B "gm/$pr" "$W" "origin/$br" || return 1 ( cd "$W" || exit 1 - git merge -q --no-edit origin/main >/dev/null 2>&1 && exit 0 - for f in $(git diff --name-only --diff-filter=U); do - case $f in - EXPERIMENTS.md|docs/provenance.md) python3 "${KB}" "$f" >/dev/null && git add "$f";; - tests/bench_test.sh) python3 "${KB}" "$f" >/dev/null && bash -n "$f" && git add "$f" || { echo "bench_test resolve failed"; git merge --abort; exit 1; };; - *) echo "MANUAL conflict $f"; git merge --abort; exit 1;; esac - done - bash tests/claims_check.sh >/dev/null 2>&1 || { echo "claims_check failed after merge"; exit 1; } - git commit -q --no-edit ) || return 1 + if ! git merge -q --no-edit origin/main >/dev/null 2>&1; then + for f in $(git diff --name-only --diff-filter=U); do + case $f in + EXPERIMENTS.md|docs/provenance.md) python3 "${KB}" "$f" >/dev/null && git add "$f";; + tests/bench_test.sh) python3 "${KB}" "$f" >/dev/null && bash -n "$f" && git add "$f" || { echo "bench_test resolve failed"; git merge --abort; exit 1; };; + *) echo "MANUAL conflict $f"; git merge --abort; exit 1;; esac + done + bash tests/claims_check.sh >/dev/null 2>&1 || { echo "claims_check failed after merge"; exit 1; } + git commit -q --no-edit + fi + if [ -f console/model_opt.py ] && [ -f console/ledger-rules.json ]; then + python3 console/model_opt.py ledger-rules --ledger EXPERIMENTS.md --out console/ledger-rules.json \ + || { echo "ledger-rules regeneration failed"; exit 1; } + if ! git diff --quiet -- console/ledger-rules.json; then + git add console/ledger-rules.json + git commit -q -m "console/ledger-rules.json: regenerate from EXPERIMENTS.md" + fi + fi ) || return 1 git -C "$W" push -q origin "HEAD:refs/heads/$br" && echo "synced $br" } # One snapshot: " ", latest run per check. @@ -82,6 +96,26 @@ base_ok() { local mb; mb=$(git merge-base origin/main "$1") || return 1 ! { code "$mb" origin/main && code "$mb" "$1"; } } +# rules_stale SHA: the tree main + SHA would merge to carries a console/ledger-rules.json +# that EXPERIMENTS.md there does not generate (read with that tree's own model_opt.py). +# Unknown (a conflict, no such files) is not stale: a conflict syncs anyway. +rules_stale() { + local tree d rc=1 + tree=$(git merge-tree --write-tree origin/main "$1" 2>/dev/null | head -1) + [ -n "$tree" ] || return 1 + d=$(mktemp -d) + if git show "$tree:console/model_opt.py" > "$d/model_opt.py" 2>/dev/null \ + && git show "$tree:console/convert-pins.json" > "$d/convert-pins.json" 2>/dev/null \ + && git show "$tree:console/ledger-rules.json" > "$d/have.json" 2>/dev/null \ + && git show "$tree:EXPERIMENTS.md" > "$d/EXPERIMENTS.md" 2>/dev/null \ + && [ -s "$d/model_opt.py" ] && [ -s "$d/have.json" ] \ + && python3 "$d/model_opt.py" ledger-rules --ledger "$d/EXPERIMENTS.md" --out "$d/want.json" >/dev/null 2>&1 \ + && ! cmp -s "$d/have.json" "$d/want.json"; then + rc=0 + fi + rm -rf "$d" + return "$rc" +} [ "$(gh pr view "$pr" --json isDraft -q .isDraft)" = true ] && gh pr ready "$pr" >/dev/null merged() { [ "$(gh pr view "$pr" --json state -q .state)" = MERGED ]; } for round in 1 2 3 4 5; do @@ -107,6 +141,10 @@ for round in 1 2 3 4 5; do echo "PR$pr round $round: main moved under code since $sha was tested: sync to re-run CI" sync || exit 1; sleep 60; break fi + if rules_stale "$sha"; then + echo "PR$pr round $round: console/ledger-rules.json would not match EXPERIMENTS.md after the merge: sync regenerates it" + sync || exit 1; sleep 60; break + fi why=$(gh pr merge "$pr" --squash --match-head-commit "$sha" --subject "$subj" --body "$body" 2>&1 >/dev/null) merged && { git push -q origin --delete "$br" 2>/dev/null; echo "PR$pr MERGED at $sha"; exit 0; } now=$(gh pr view "$pr" --json headRefOid -q .headRefOid 2>/dev/null) diff --git a/tests/gate_merge_test.sh b/tests/gate_merge_test.sh index 1d6d772e..020ffb16 100755 --- a/tests/gate_merge_test.sh +++ b/tests/gate_merge_test.sh @@ -78,6 +78,8 @@ case "$*" in *"diff --name-only mb000 origin/main"*) cat "$FIX/base_files"; exit 0;; *"diff --name-only mb000 "*) cat "$FIX/pr_files"; exit 0;; *"worktree add"*) for a; do last=$a; done; prev=; for a; do [ "$a" = "$last" ] && break; prev=$a; done; mkdir -p "$prev";; + *"merge-tree --write-tree"*) [ -f "$FIX/tree" ] && pop tree; exit 0;; + "show "*:*) p=${2#*:}; [ -f "$FIX/show/$p" ] || exit 128; cat "$FIX/show/$p"; exit 0;; *"rev-parse --show-toplevel"*) echo "$FIX";; esac exit 0 @@ -245,5 +247,30 @@ echo EXPERIMENTS.md > "$FIX/pr_files"; run_gate if [ "$RC" -eq 0 ] && [ "$(merges)" -eq 1 ] && [ "$(syncs)" -eq 0 ]; then ok "base_moved_pr_ledger: merged, no sync" else fail "base_moved_pr_ledger: rc=$RC merges=$(merges) syncs=$(syncs)"; fi +# 17. the merged tree would carry a console/ledger-rules.json its EXPERIMENTS.md does +# not generate (a ledger row changed, the file did not): sync before merging. +# The stub tree is stale once, then the synced head is current. +fixture rules_stale_sync "[$SUCCESS]" "$CI_OK" abc123 +mkdir -p "$FIX/show/console" +cp "$ROOT/console/model_opt.py" "$ROOT/console/convert-pins.json" "$FIX/show/console/" +printf '## Hypotheses\n\n| H34 | on the i9-13900T | p | m | SUPPORTED |\n' > "$FIX/show/EXPERIMENTS.md" +echo '{"schema": "k3d-gpu.ledger-rules/v1", "rows": []}' > "$FIX/show/console/ledger-rules.json" +printf 't1\n\n' > "$FIX/tree"; run_gate +first_merge=$(grep -n '^gh pr merge 1 ' "$FIX/trace" | head -1 | cut -d: -f1) +first_sync=$(grep -n 'worktree add' "$FIX/trace" | head -1 | cut -d: -f1) +if [ "$RC" -eq 0 ] && [ "$(merges)" -eq 1 ] && [ -n "$first_sync" ] && [ "$first_sync" -lt "${first_merge:-0}" ] \ + && grep -q 'ledger-rules.json would not match' <<<"$OUT"; then + ok "rules_stale_sync: synced (regenerating ledger-rules.json) before the merge" +else fail "rules_stale_sync: rc=$RC merges=$(merges) sync_line=${first_sync:-none} merge_line=${first_merge:-none} out=$(tr '\n' ';' <<<"$OUT")"; fi +# 17b. the merged tree's file matches: no sync. +fixture rules_current "[$SUCCESS]" "$CI_OK" abc123 +mkdir -p "$FIX/show/console" +cp "$ROOT/console/model_opt.py" "$ROOT/console/convert-pins.json" "$FIX/show/console/" +printf '## Hypotheses\n\n| H34 | on the i9-13900T | p | m | SUPPORTED |\n' > "$FIX/show/EXPERIMENTS.md" +python3 "$ROOT/console/model_opt.py" ledger-rules --ledger "$FIX/show/EXPERIMENTS.md" --out "$FIX/show/console/ledger-rules.json" +echo t1 > "$FIX/tree"; run_gate +if [ "$RC" -eq 0 ] && [ "$(merges)" -eq 1 ] && [ "$(syncs)" -eq 0 ]; then ok "rules_current: merged, no sync" +else fail "rules_current: rc=$RC merges=$(merges) syncs=$(syncs)"; fi + echo "${PASS} passed, ${FAILS} failed" [ "${FAILS}" -eq 0 ] From 01bbcdbfad620963e20094d197e1fc857fd24b1a Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Tue, 20 Oct 2026 15:48:19 -0700 Subject: [PATCH 02/85] bench(H7x): H7 harness to its pre-registered protocol (WIP) --- bench/apb/h7x.sh | 169 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 bench/apb/h7x.sh diff --git a/bench/apb/h7x.sh b/bench/apb/h7x.sh new file mode 100644 index 00000000..e3f8c945 --- /dev/null +++ b/bench/apb/h7x.sh @@ -0,0 +1,169 @@ +#!/usr/bin/env bash +# h7x.sh: EXPERIMENTS.md H7x, H7 (OVMS vs EAT's vLLM CPU engine at matched 16-bit weights) +# run to its pre-registered protocol on a second host: H2's workloads and energy method, +# blocks A B B A A B B A A B (A = OVMS, B = vLLM with EAT's chart defaults), then one block C +# (B with --enforce-eager dropped). One server runs at a time. Per block, after 1 decode and +# 1 prefill warm-up (excluded): bench/energy.sh over a 20 s model-loaded idle, then over each +# workload through bench/llm_load.py: decode 5 x (default ~30-token prompt, 256 out), +# prefill 5 x (unique ~1936-token prompt, 16 out), conc4 8 x 128 out at 4 in flight; all +# greedy, ignore_eos, unique prompts. bench/apb/h7x.py scores the run. +# +# Environment: +# APB_MODELS dir with Qwen3-4B-fp16-ov and Qwen3-4B (hf download --local-dir) (required) +# APB_EAT_CHART EAT checkout's core/helm-charts/vllm at 0d3438d (required) +# APB_OUT run directory parent (default ./apb-runs) +# H7X_CPUS CPUs each engine is sized to (default 16, H7's P-core balloon) +# H7X_NODE_CPUS cpuset for the node container after `up` (default none) +# H7X_ORDER block order (default "A B B A A B B A A B C") +# K3D_GPU_CLUSTER cluster name (default apb-h7x); K3D_GPU_* pass through to `up` +set -uo pipefail + +HERE=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +REPO=$(cd "${HERE}/../.." && pwd) +K=${REPO}/scripts/k3d-gpu +LOAD=${REPO}/bench/llm_load.py +ENERGY=${REPO}/bench/energy.sh +CPUS=${H7X_CPUS:-16} +NODE_CPUS=${H7X_NODE_CPUS:-} +ORDER=${H7X_ORDER:-"A B B A A B B A A B C"} +export K3D_GPU_CLUSTER=${K3D_GPU_CLUSTER:-apb-h7x} +if [ "${H7X_PRINT_CONFIG:-0}" = 1 ]; then echo "cluster=${K3D_GPU_CLUSTER} cpus=${CPUS} node_cpus=${NODE_CPUS} order=${ORDER}"; exit 0; fi +M=${APB_MODELS:?set APB_MODELS to the dir of local model copies} +CHART=${APB_EAT_CHART:?set APB_EAT_CHART to EAT core/helm-charts/vllm} +OUT=${APB_OUT:-${PWD}/apb-runs}/h7x-$(date +%Y%m%d-%H%M%S) +mkdir -p "${OUT}" +export KUBECONFIG=${OUT}/kubeconfig +t0=$(date +%s) +stamp() { echo "== $1 $(date -u +%FT%TZ) (+$(( $(date +%s) - t0 ))s)"; } +PF= +cleanup() { [ -n "${PF}" ] && kill "${PF}" 2>/dev/null; stamp cleanup; k3d cluster delete "${K3D_GPU_CLUSTER}" >/dev/null 2>&1; stamp deleted; } +trap cleanup EXIT +trap 'exit 143' TERM INT HUP +nodes() { docker ps --filter "label=k3d.cluster=${K3D_GPU_CLUSTER}" --filter "label=k3d.role=server" --format '{{.Names}}'; } +stage() { # stage + local n + for n in $(nodes); do + docker exec "${n}" mkdir -p "/var/apb-models/$2" + docker cp "${M}/$1/." "${n}:/var/apb-models/$2/" + docker exec "${n}" rm -rf "/var/apb-models/$2/.cache" + docker exec "${n}" chown -R 5000:5000 /var/apb-models + docker exec "${n}" chmod -R a+rX /var/apb-models + done +} + +stamp render +# H7's OVMS arm has no draft (it predates the CPU Fast Draft default of #116). +K3D_GPU_AGENT_DEVICE=CPU K3D_GPU_AGENT_MODEL=OpenVINO/Qwen3-4B-fp16-ov K3D_GPU_AGENT_CPUS=${CPUS} K3D_GPU_AGENT_DRAFT=off \ + "${K}" agent manifest > "${OUT}/agent.yaml" 2> "${OUT}/agent.err" || { cat "${OUT}/agent.err"; exit 1; } +python3 "${HERE}/stage.py" ovms "${OUT}/agent.yaml" "${OUT}/ovms.yaml" +python3 "${HERE}/stage.py" values "${CHART}/xeon-values.yaml" "${REPO}/integrations/eat/vllm-values.yaml" 6 "${OUT}/values.yaml" +helm template vllm-qwen-3-4b-cpu "${CHART}" --values "${OUT}/values.yaml" --set LLM_MODEL_ID=Qwen/Qwen3-4B --set cpu="${CPUS}" \ + --set global.monitoring=false --set svcmonitor.enabled=false --set ingress.enabled=false --set route.enabled=false > "${OUT}/eat.yaml" +python3 "${HERE}/stage.py" vllm "${OUT}/eat.yaml" "${OUT}/vllm.yaml" Qwen3-4B 32768 +# C: the same Deployment and Service, renamed, with --enforce-eager removed (the only change). +python3 - "${OUT}/vllm.yaml" "${OUT}/vllm-c.yaml" <<'EOF' +import sys, yaml +docs = [d for d in yaml.safe_load_all(open(sys.argv[1])) if d] +n = 0 +for d in docs: + d["metadata"]["name"] = d["metadata"]["name"].replace("vllm-qwen-3-4b-cpu", "vllm-c") + if d.get("kind") == "Deployment": + for c in d["spec"]["template"]["spec"]["containers"]: + for key in ("args", "command"): + if c.get(key) and "--enforce-eager" in c[key]: + c[key] = [a for a in c[key] if a != "--enforce-eager"]; n += 1 + # C's own selector label, so the two Deployments never share pods. + d["spec"]["selector"].setdefault("matchLabels", {})["h7x-arm"] = "c" + d["spec"]["template"]["metadata"].setdefault("labels", {})["h7x-arm"] = "c" + elif d.get("kind") == "Service": + d["spec"].setdefault("selector", {})["h7x-arm"] = "c" +assert n == 1, f"--enforce-eager found {n} times" +yaml.safe_dump_all(docs, open(sys.argv[2], "w"), sort_keys=False) +EOF +[ -s "${OUT}/vllm-c.yaml" ] || { echo "C manifest not rendered"; exit 1; } +diff <(grep -c -- --enforce-eager "${OUT}/vllm.yaml") <(echo 1) >/dev/null || { echo "B has no --enforce-eager"; exit 1; } +if [ "${H7X_RENDER_ONLY:-0}" = 1 ]; then trap - EXIT; ls "${OUT}"; exit 0; fi +stamp up +K3D_GPU_NODE_LABELS=ei-infra-eligible=true,ei-inference-eligible=true timeout 300 "${K}" up > "${OUT}/up.log" 2>&1 \ + || { echo "up failed"; tail -20 "${OUT}/up.log"; exit 1; } +if [ -n "${NODE_CPUS}" ]; then + for n in $(nodes); do docker update --cpuset-cpus "${NODE_CPUS}" "${n}" >/dev/null || { echo "node cpuset not applied"; exit 1; }; done + echo "node cpuset ${NODE_CPUS}" | tee "${OUT}/node-cpus.txt" +fi +stamp stage +stage Qwen3-4B-fp16-ov OpenVINO/Qwen3-4B-fp16-ov +stage Qwen3-4B Qwen3-4B +kubectl apply -f "${OUT}/ovms.yaml" -f "${OUT}/vllm.yaml" >/dev/null +kubectl -n default scale deploy/vllm-qwen-3-4b-cpu --replicas=0 >/dev/null +kubectl -n k3d-gpu-agent scale deploy/ovms --replicas=0 >/dev/null +c_ok=1 +kubectl apply -f "${OUT}/vllm-c.yaml" >/dev/null 2>"${OUT}/vllm-c.err" || { c_ok=0; cat "${OUT}/vllm-c.err"; } +kubectl -n default scale deploy/vllm-c --replicas=0 >/dev/null 2>&1 + +SENT="The harbour master logged each ship that entered the bay, noting its flag, its cargo, the depth of water under its keel and the hour the pilot boarded. " +PREFILL=$(python3 -c 'import sys; print(sys.argv[1] * 56)' "${SENT}") +cur= +down_all() { + kubectl -n default scale deploy/vllm-qwen-3-4b-cpu --replicas=0 >/dev/null 2>&1 + kubectl -n default scale deploy/vllm-c --replicas=0 >/dev/null 2>&1 + kubectl -n k3d-gpu-agent scale deploy/ovms --replicas=0 >/dev/null 2>&1 + kubectl -n default wait --for=delete pod -l app.kubernetes.io/name=vllm --timeout=180s >/dev/null 2>&1 + kubectl -n k3d-gpu-agent wait --for=delete pod -l app=ovms --timeout=180s >/dev/null 2>&1 +} +up_engine() { # up_engine A|B|C: every other server scaled to 0 first, so only one runs + [ "${cur}" = "$1" ] && return 0 + [ -n "${PF}" ] && { kill "${PF}" 2>/dev/null; PF=; } + down_all + case $1 in + A) kubectl -n k3d-gpu-agent scale deploy/ovms --replicas=1 >/dev/null + kubectl -n k3d-gpu-agent rollout status deploy/ovms --timeout=900s >/dev/null || return 1 + kubectl -n k3d-gpu-agent port-forward svc/ovms 18000:8000 >/dev/null 2>&1 & + PF=$! BASE=http://127.0.0.1:18000/v3 MODEL=Qwen3-4B-fp16-ov NS=k3d-gpu-agent ;; + B|C) d=vllm-qwen-3-4b-cpu; s=vllm-qwen-3-4b-cpu-service + [ "$1" = C ] && { d=vllm-c; s=vllm-c-service; } + kubectl -n default scale "deploy/${d}" --replicas=1 >/dev/null + kubectl -n default rollout status "deploy/${d}" --timeout=900s >/dev/null || return 1 + kubectl -n default port-forward "svc/${s}" 18001:80 >/dev/null 2>&1 & + PF=$! BASE=http://127.0.0.1:18001/v1 MODEL=Qwen/Qwen3-4B NS=default ;; + esac + sleep 3 + cur=$1 + local n pid + n=$(nodes | head -1) + # shellcheck disable=SC2016 # runs in the node's shell + pid=$(docker exec "${n}" sh -c 'for p in /proc/[0-9]*; do c=$(tr "\0" " " < $p/cmdline 2>/dev/null); case $c in *ovms*--rest_port*|*vllm*--port*) echo ${p#/proc/}; break;; esac; done') + [ -n "${pid}" ] && echo "$1 $(docker exec "${n}" grep Cpus_allowed_list "/proc/${pid}/status")" >> "${OUT}/cpus.txt" + kubectl -n "${NS}" get pods -o jsonpath='{range .items[*]}{.spec.containers[0].image}{" "}{.status.containerStatuses[0].imageID}{" "}{.spec.containers[0].args}{"\n"}{end}' >> "${OUT}/image.txt" +} +load() { # load llm_load args... + local b=$1 e=$2 w=$3; shift 3 + "${ENERGY}" --json "${OUT}/b${b}-${e}-${w}-energy.json" -- \ + python3 "${LOAD}" --base-url "${BASE}" --model "${MODEL}" --temperature 0 --ignore-eos --unique-prompts \ + --warmup 0 --label "h7x-${e}-b${b}-${w}" --out "${OUT}/b${b}-${e}-${w}.json" "$@" >/dev/null 2>>"${OUT}/energy.log" +} +i=0 +for e in ${ORDER}; do + i=$((i + 1)) + if [ "${e}" = C ] && [ "${c_ok}" = 0 ]; then echo "block ${i} C not run: manifest refused" | tee -a "${OUT}/notes.txt"; continue; fi + stamp "block ${i} engine ${e} start" + if ! up_engine "${e}"; then + echo "block ${i} engine ${e} did not come up" | tee -a "${OUT}/notes.txt" + kubectl -n "${NS:-default}" get pods -o wide >> "${OUT}/notes.txt" 2>&1 + [ "${e}" = C ] && continue + exit 2 + fi + stamp "block ${i} engine ${e} ready" + python3 "${LOAD}" --base-url "${BASE}" --model "${MODEL}" --temperature 0 --max-tokens 256 --ignore-eos --unique-prompts \ + --requests 1 --warmup 0 --label warm >/dev/null 2>&1 + python3 "${LOAD}" --base-url "${BASE}" --model "${MODEL}" --temperature 0 --prompt "${PREFILL}" --max-tokens 16 --ignore-eos \ + --unique-prompts --requests 1 --warmup 0 --label warm >/dev/null 2>&1 + "${ENERGY}" --json "${OUT}/b${i}-${e}-idle-energy.json" -- sleep 20 2>>"${OUT}/energy.log" + load "${i}" "${e}" decode --max-tokens 256 --requests 5 --concurrency 1 + load "${i}" "${e}" prefill --prompt "${PREFILL}" --max-tokens 16 --requests 5 --concurrency 1 + load "${i}" "${e}" conc4 --max-tokens 128 --requests 8 --concurrency 4 + stamp "block ${i} engine ${e} done" +done +git -C "${REPO}" rev-parse HEAD > "${OUT}/commit.txt" +docker inspect --format '{{.Config.Image}} {{.Image}}' "$(nodes | head -1)" > "${OUT}/node-image.txt" +python3 "${HERE}/h7x.py" "${OUT}" | tee "${OUT}/verdict.json" +stamp finished From 9cc4533369f8f728beaf06d515a97f5a827e676c Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Tue, 20 Oct 2026 15:50:49 -0700 Subject: [PATCH 03/85] ledger(H7x): pre-register H7 to its full protocol on the Xeon 6741P; h7x.sh, h7x.py --- EXPERIMENTS.md | 71 ++++++++++++++++++++++ bench/apb/h7x.py | 108 +++++++++++++++++++++++++++++++++ bench/apb/h7x.sh | 10 +-- bench/apb/test_h7x.py | 78 ++++++++++++++++++++++++ docs/intel/technical-report.md | 2 +- tests/bench_test.sh | 5 ++ 6 files changed, 269 insertions(+), 5 deletions(-) create mode 100755 bench/apb/h7x.py mode change 100644 => 100755 bench/apb/h7x.sh create mode 100644 bench/apb/test_h7x.py diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index f983bb1e..7eff4427 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -94,6 +94,7 @@ setup too weak to decide). Only `SUPPORTED` backs a claim. | H34x | H34's hypothesis on the Xeon 6741P: same-engine CPU Fast Draft (OVMS 2026.4.1, `OpenVINO/Qwen3-0.6B-int4-ov` draft on the CPU) beats the `OpenVINO/Qwen3-4B-int4-ov` target alone on single-stream decode, under matched background load. A replication: the original models are kept. | Written 2026-10-20, before any H34x measurement. At `typical`: median paired B/A decode tok/s 1.40 (1.15-1.70) and median paired B/A package J/token 0.75 (0.60-0.95); SUPPORTED by H34's rule (tok/s >= 1.20 with its CI above 1.0, J/token <= 0.85 with its CI below 1.0) at 0.6, REFUTED 0.25 (the draft's share of a faster target step grows), INCONCLUSIVE 0.15. | H34's `bench/hetero-spec/h34.sh` and `h34.py`, n = 12 pairs A B / B A, 5 s load window per request, unchanged except as listed in the cross-host pre-registration: cluster `k3dgpu-x-h34`, `K3D_GPU_VENDORS=none`, node container on CPUs 0-23,48-71, crescent amendment C1, `typical` only. Run 2026-10-20 ([H34x run](#h34x-run-xeon-6741p-2026-10-20)): load MATCHED, 12/12 pairs; B/A decode tok/s 0.758 (CI 0.688-0.809) and package J/token 1.241 (CI 1.168-1.347), B slower and costlier in 12/12 pairs (A 37.2, B 28.0 tok/s): the draft slows decode on this Xeon. | REFUTED | | H25x | H25's hypothesis (T part) on the Xeon 6741P: agents that send a byte-identical system prompt and tools to one OVMS CPU server reuse one prefix KV, so an added agent's first chunk arrives at least 4x sooner with the shipping prefix caching on than with `--enable_prefix_caching=false`. A replication: the original model and prefix shape are kept. | Written 2026-10-20, before any H25x measurement. Added-agent median TTFT OFF 1.2 s (0.5-2.5), ON 0.15 s (0.06-0.4), ratio 8x (4.5-14), the ratio's 95% CI lower bound >= 4x; c/OFF >= 0.8. SUPPORTED 0.75; the risk is fixed per-request overhead, which a 5-10x faster prefill leaves as a larger share of the ON time. M (memory per agent) not measured, as in H25 run 4. | H25's `bench/shared-prefix/run.sh` and `probe.py score` (A3 first-chunk TTFT, A4 amendment-27 load rule), ON OFF interleaved 3+3 rounds, unchanged except as listed in the cross-host pre-registration: cluster `k3dgpu-x-h25`, `K3D_GPU_VENDORS=none`, node container on CPUs 0-23,48-71 (`NODE_CPUS`), crescent amendment C1, `typical` only. Run 2026-10-21 ([H25x run](#h25x-run-xeon-6741p-2026-10-21)): load MATCHED (amendment 27), no round void; added agent's first chunk 0.245 s ON vs 1.724 s OFF (7.05x, CI 6.94-7.13, n = 15 per arm), c/OFF 0.99, every round pair >= 4x: T SUPPORTED; M not measured (A3). | SUPPORTED | | H28x | H28's hypothesis on the Xeon 6741P: N = 8 agent pods that mmap one 1 GiB model through an image volume share one page-cache copy and become ready in at most half the time of pods that copy it into an emptyDir. A replication (H28 has no model; the 1 GiB blob is kept). | Written 2026-10-20, before any H28x measurement. Memory parts hold (0.95): T PSS <= 160 MiB per pod, model page cache about 1.0x size (T) vs about 9x (C). Time part uncertain: the copy runs at memory speed on this host, so the fixed pod-start cost is a larger share of both arms; T/C round-median ready 0.55 (0.35-0.8). SUPPORTED 0.35, REFUTED (time part) 0.5, other rows 0.15. | H28's `bench/zero-copy-models/probe.sh` (A1, A2), arms C T T C C T plus the unscored warm-up, unchanged except as listed in the cross-host pre-registration: cluster `k3dgpu-x-h28`, crescent amendment C1 passed to the plain `k3d cluster create`, `typical` only, scored by `bench/zero-copy-models/score.py` (H28's table, committed with this pre-registration). | PENDING | +| H7x | H7's hypothesis on the Xeon 6741P, run to H7's full protocol: OVMS's decode lead over EAT's vLLM CPU engine comes from weight precision, not from the engine. One checkpoint (`Qwen/Qwen3-4B` @ `1cfa9a72`), OVMS 2026.4.1 on its 16-bit IR (`OpenVINO/Qwen3-4B-fp16-ov` @ `00298f1c`) and vLLM CPU v0.24.0 in bf16 with EAT's chart defaults decode within 15% of each other, and land within 15% in effective weight bandwidth. A replication: H7's models and versions are kept. | Written 2026-10-20, before any H7x measurement. On AMX both engines compute in bf16 and batch-1 decode reads the same 8.0 GB per token, so the engine gap shrinks: R = OVMS/vLLM decode 1.10 (0.85-1.40); SUPPORTED 0.45, REFUTED 0.30, INCONCLUSIVE 0.25. Reported, not scored: prefill TTFT on ~1936 tokens vLLM/OVMS 1.5 (0.7-4; the i9 gap of 4.3x was outside H7's prediction), C/B decode (`--enforce-eager` dropped) 1.0-1.3, decode incremental J/token per arm. | `bench/apb/h7x.sh` (H7's `h7.sh` extended to the pre-registered protocol: H2's workloads and energy method, blocks A B B A A B B A A B, then one C block with `--enforce-eager` dropped), scored by `bench/apb/h7x.py`; decision rule, host changes and hold in [H7x pre-registration](#h7x-pre-registration-h7-to-its-full-protocol-on-the-xeon-6741p-2026-10-20). | PENDING | | H55 | On the i9-13900T, an SLO gate on the E-core neighbour's `cpu.max`, set from the P-core inference server's own median TTFT, keeps CPU-served prefill within +10% of quiet while the neighbour keeps more throughput than H5's frequency-cap frontier (CMIN: +23.3% at 72.4% neighbour loss) and than the best static quota at the same penalty. | Written 2026-10-20, before any H55 measurement; control rule revised the same day, still before any measurement (see the section). Pre-registered prior, not a result: N0 about +40% (H5 replicate), K50 +20 to +30% at about 50% loss, K25 +8 to +15% at about 75% loss. A_slo climbs only while the penalty at its level is at most +5%, so it is expected to stay at the 25-37.5% levels, close to K25: +8 to +15% at 70-78% loss, failing (b) or (c). Expected verdict REFUTED: package power is the coupling, duty-cycling the neighbour is less power-efficient per op than H5's frequency cap, and a closed-loop c = 1 prefill load leaves no idle gap to admit it into. If H55 holds, A_slo settles at 50% or above at +10% or less. | H5 amendment A1's host-level harness (OVMS 2026.4.1, `OpenVINO/Qwen3-4B-int4-ov`, `bench/prefill-guard/prompt.txt` with a unique tag per request, CPUs 0-14; `stress-ng --cpu 15 --cpu-method matrixprod` on CPUs 17-31; tool proxy on CPU 16), with a 900 s closed-loop prefill window per run (16 tokens, concurrency 1). Arms Q, N0 (`cpu.max max`), K50 (`750000 100000`), K25 (`375000 100000`) and A_slo (`bench/admission/ctl.py` steps 25-100% of 15 CPUs on windows of 20 requests: down if the window median > 1.10 x the round's quiet reference, the median of 20 pre-roll requests; up if it is at most 1.05 x that), 5x5 Latin square, one round per lock hold. Supported only if A_slo's median penalty is at most +10%, its neighbour loss is below 72.4%, and no static arm reaches +10% at a loss no higher than A_slo's plus the neighbour's own N0 run-to-run spread; inconclusive gates and the hold cap in [H55 pre-registration](#h55-pre-registration-slo-gated-admission-of-an-e-core-neighbour-2026-10-20). Not run. A SUPPORTED H55 does not ship a controller by itself: kubelet owns the sandbox pod's `cpu.max` (`limits cpu "1"`). | PENDING | | H56 | Two measurement holds in disjoint cpuset slices of the Xeon 6741P do not perturb each other: an A1 B24 agent block in slice 0 (CPUs 0-23,48-71) behaves equivalently, in per-attempt time, within-budget success and tasks completed, alone and with a concurrent identical A1 hold in slice 1 (CPUs 24-47,72-95), without an all-core clock drop on slice 0 and with the package below its power limit. It decides whether crescent may run two A1-or-lighter holds at once ([adoption rule](#h56-pre-registration-parallel-slice-holds-on-crescent-2026-10-20)); it is not a k3d-gpu product claim. | Written 2026-10-20, before any run; predictions unchanged by the 2026-10-21 revision, priors updated to its narrower bands. Geometric-mean W/A time ratio 1.04 (0.99-1.09); paired success W - A -0.01 (-0.06 to +0.04); completion W/A 0.97 (0.90-1.00); own-slice MHz W/A 0.97; W package 0.75 PL1 (0.55-0.95), A package 0.5 PL1; time pairs 80 (50-96). Batch-1 int4 decode is DRAM-bound, and the sibling's decode and its stream load share DRAM, L3 and package power. Verdict priors: SUPPORTED 0.30, INCONCLUSIVE 0.45, REFUTED 0.25. | Stage 0 first, read-only: `bench/eatflow/crescent/lockwait.py` over both campaigns' `campaign.log`; if lock wait our slots could remove is under 0.10 of hold time, stage 1 is not run and the row stays PENDING (`h56.sh` refuses through `h56.py gate`). [Amendment S0](#h56-pre-registration-parallel-slice-holds-on-crescent-2026-10-20) (2026-10-21, before any stage-1 hold, stage-0 reading disclosed): the share is pooled lock wait over hold time across every campaign log on crescent, nothing netted out; bar 0.10 unchanged. Then one W wiring smoke, which must show slice-0 setup <= 900 s and >= 3 tasks in 120 s. Stage 1: `bench/eatflow/crescent/h56.sh N` for N = 1..8, order A W W A A W W A, one condition-hold per exclusive campaign lock (slot locks first). A: slice 0 alone, slice 1 idle. W: the sibling in slice 1 first (cap 3000 s, budget 1800 s), slice 0 from the sibling's run budget on (cap 2400 s, budget 720 s, the same as A). Hold pairs (1,2) (4,3) (5,6) (8,7), tasks by id; 90% two-stage bootstrap CIs (hold pairs, then tasks; 10,000, seed 56; TOST at alpha 0.05). SUPPORTED: all 8 positions filled, time CI inside [1/1.05, 1.05], success CI inside [-1/24, +1/24], completion W/A >= 1/1.05, >= 60 time pairs, own-slice MHz W/A >= 0.95, W package < 0.95 PL1 and PL1 read. REFUTED: the time CI wholly outside its band, the success CI wholly outside its band, or the completion CI wholly below 1/1.05. Otherwise INCONCLUSIVE. VOID holds are replaced, at most 2. `bench/eatflow/crescent/h56.py score`. | PENDING | @@ -1656,6 +1657,76 @@ no APB (bracket from 0). A3 passed one step, at 1 agent (82 requests, p95 1.47 s >= 1. A 3 min budget is too short for this tool, which defaults to 15 min, so these brackets say nothing about the graded result. +### H7x pre-registration: H7 to its full protocol on the Xeon 6741P (2026-10-20) + +Written 2026-10-20T23:10Z, before any H7x measurement (a render-only check of the manifests +ran on the host; no server was started). H7 keeps its INCONCLUSIVE verdict on the i9-13900T. + +**Why.** H7's i9 run was short of its own pre-registration (3 and 2 blocks instead of 5 ABBA +rounds, no `--enforce-eager`-dropped arm, no energy) and its decode gap (15.6% of vLLM's rate, +13.5% of OVMS's) straddled the line. This row runs the whole protocol, on the CPU EAT's vLLM +path is written for (Xeon with AMX), and fixes in advance how the 15% line is read. + +**Arms** (H7's): A = OVMS 2026.4.1 (`openvino/model_server@sha256:a928903f...76fc58`), +`agent manifest` CPU, `OpenVINO/Qwen3-4B-fp16-ov` @ `00298f1c`, no draft +(`K3D_GPU_AGENT_DRAFT=off`; H7 predates the CPU Fast Draft default); B = vLLM CPU v0.24.0 +(`vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f860...981a1`) with EAT's chart at `0d3438d` +(`xeon-values.yaml` + `integrations/eat/vllm-values.yaml`, KV 6 GiB, `--max-model-len 32768`), +`Qwen/Qwen3-4B` @ `1cfa9a72` in bf16; C = B with `--enforce-eager` removed and nothing else +changed (its own Deployment and Service, selector label `h7x-arm: c`). The int4 second arm runs +only if vLLM v0.24.0 CPU is first shown to load an int4 build of the same checkpoint (H7); it is +not run. + +**Protocol** (H7: "H2 workloads and energy method, arms interleaved ABBA, 5 rounds"). +Blocks A B B A A B B A A B (H2's order, 5 blocks per arm), then one C block. One server runs at +a time; consecutive blocks of one engine keep the server up, as `h7.sh` does. Per block: 1 decode +and 1 prefill warm-up (excluded), `bench/energy.sh` over a 20 s model-loaded idle, then +`bench/energy.sh` around each workload through `bench/llm_load.py` (temperature 0, `ignore_eos`, +unique prompts, streamed): decode 5 x (default ~30-token prompt, 256 out, c=1); prefill +5 x (unique ~1936-token prompt, 16 out, c=1); conc4 8 x 128 out at 4 in flight. Energy: +RAPL `intel-rapl:0` package through `sudo`, incremental J = E - idle W x t (H2). + +**Decision rule** (fixed now; H7 left the reading of "within 15%" open). R = median A decode +tok/s / median B decode tok/s over every request of the valid blocks; gap(x) = max(x, 1/x) - 1. +Block pairs in run order (the k-th A block with the k-th B block; 5 pairs), r_k = ratio of +their block medians. R_bw = R x (A weight bytes / B weight bytes) = R x 0.99999. +- SUPPORTED: gap(R) < 0.15, gap(R_bw) < 0.15 and gap(r_k) < 0.15 for all 5 pairs. +- REFUTED: gap(R) >= 0.15 and all 5 r_k on the same side of 1 as R with gap(r_k) >= 0.15 + (either engine faster by 15% or more, consistently). +- INCONCLUSIVE: anything else, or >= 2 void blocks in A or B (a block is void when its decode + phase has fewer than 5 ok requests or a request stops short of 256 tokens). +- Reported, never gating: C/B decode, prefill TTFT and conc4 per arm, decode incremental + J/token per arm. `bench/apb/h7x.py` applies this mechanically (unit tests in + `bench/apb/test_h7x.py`). + +**Host changes** (as the cross-host rows, X1-X5 of the +[cross-host pre-registration](#cross-host-pre-registration-h25x-h27x-h28x-h34x-on-the-xeon-6741p-2026-10-20)): +`bench/xhost/hold.sh` on the shared lock; node container pinned to CPUs 0-23,48-71 and both +engines sized to those 48 CPUs (`H7X_CPUS=48`; H7 gave each engine the whole 16-CPU P-core +balloon); `K3D_GPU_VENDORS=none`; crescent C1 kubelet thresholds; node image +`cryptoandcoffee/k3d-gpu:0.1.61`; models downloaded on the host at the pinned commits +(`bench/xhost/fetch_models.py`). No background load, as H7 (it predates the matched-load +design); the host's own serving stack is the background, recorded by `serving.py` and the +hold's pre/post snapshots. + +**Hold.** One hold, cap 4200 s (11 blocks; a vLLM cold start is the slow step). If the cap ends +the run before all 10 A/B blocks, the blocks that ran are scored by the same rule, and fewer than +4 valid blocks in A or B reads INCONCLUSIVE. + +**Reproduce.** + +```bash +X=~/k3dgpu-xhost +C1="--kubelet-arg=eviction-hard=memory.available<100Mi,nodefs.available<1%,imagefs.available<1%,nodefs.inodesFree<1%" +$X/hfvenv/bin/python bench/xhost/fetch_models.py $X/models \ + OpenVINO/Qwen3-4B-fp16-ov@00298f1c614ffdc000814d8cbe1b7613aa73cdca Qwen/Qwen3-4B@1cfa9a7208912126459214e8b04321603b3df60c +git -C $X/eat-src checkout 0d3438d # https://github.com/intel/enterprise-agent-toolkit +bench/xhost/hold.sh H7x 4200 env K3D_GPU_IMAGE=cryptoandcoffee/k3d-gpu:0.1.61 K3D_GPU_VENDORS=none \ + K3D_GPU_K3S_ARGS="$C1" K3D_GPU_CLUSTER=k3dgpu-x-h7 H7X_CPUS=48 H7X_NODE_CPUS=0-23,48-71 \ + APB_MODELS=$X/models APB_EAT_CHART=$X/eat-src/core/helm-charts/vllm APB_OUT=$X/runs/H7x \ + bench/apb/h7x.sh +``` + ### Cross-host pre-registration: H25x, H27x, H28x, H34x on the Xeon 6741P (2026-10-20) Written 2026-10-20T22:20Z, before any H25x, H27x, H28x or H34x measurement. Nothing here is a diff --git a/bench/apb/h7x.py b/bench/apb/h7x.py new file mode 100755 index 00000000..9e70788a --- /dev/null +++ b/bench/apb/h7x.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +"""h7x.py RUN_DIR: score an H7x run (EXPERIMENTS.md H7x) from bench/apb/h7x.sh's records. + +Reads b--{decode,prefill,conc4}.json (bench/llm_load.py) and the matching +b---energy.json and b--idle-energy.json (bench/energy.sh). E is A (OVMS fp16), +B (vLLM CPU bf16, EAT chart defaults) or C (B without --enforce-eager). + +A block is void when its decode phase has fewer than 5 ok requests or any request stopped +short of 256 output tokens. With >= 2 void blocks, or fewer than 4 valid blocks (a hold cut +short by its cap), in arm A or B the run is INCONCLUSIVE. + +Decision (pre-registered in H7x): R = median A decode tok/s / median B decode tok/s over every +request of the valid blocks; gap(x) = max(x, 1/x) - 1. Blocks pair in run order: the k-th A +block with the k-th B block (ABBAABBAAB gives 5 pairs), r_k = ratio of their block medians. + SUPPORTED gap(R) < 0.15, gap(R_bw) < 0.15 and gap(r_k) < 0.15 for every pair + REFUTED gap(R) >= 0.15 and every r_k on R's side of 1 with gap(r_k) >= 0.15 + INCONCLUSIVE otherwise +R_bw (effective weight bandwidth, weight bytes x decode tok/s) uses the bytes passed in. +Reported, never gating: C/B decode, prefill TTFT and conc4 per arm, and the H2 energy method +(idle W from the 20 s model-loaded idle; incremental J = E - idle W x t) per token. +Stdlib only. +""" +import glob +import json +import os +import re +import statistics as st +import sys + +A_BYTES, B_BYTES = 8_044_936_594, 8_044_982_000 # H7's weights: fp16 IR .bin, bf16 safetensors + + +def gap(x): + return max(x, 1 / x) - 1 + + +def load(path): + try: + return json.load(open(path)) + except (OSError, ValueError): + return None + + +def blocks(run): + out = [] + for p in glob.glob(os.path.join(run, "b*-*-decode.json")): + m = re.match(r"b(\d+)-([ABC])-decode\.json$", os.path.basename(p)) + if not m: + continue + i, e = int(m.group(1)), m.group(2) + rec = {"block": i, "engine": e} + for w in ("decode", "prefill", "conc4"): + d = load(os.path.join(run, f"b{i}-{e}-{w}.json")) + ph = d["phases"][0] if d and d.get("phases") else None + rec[w] = ph + rec[w + "_energy"] = load(os.path.join(run, f"b{i}-{e}-{w}-energy.json")) + rec["idle"] = load(os.path.join(run, f"b{i}-{e}-idle-energy.json")) + dec = [s for s in (rec["decode"] or {}).get("samples", []) if s.get("ok")] + rec["decode_tps"] = [s["decode_tokens_per_s"] for s in dec if s.get("decode_tokens_per_s")] + rec["void"] = len(dec) < 5 or any(s.get("output_tokens") != 256 for s in dec) + out.append(rec) + return sorted(out, key=lambda r: r["block"]) + + +def incremental_j_per_token(rec, w): + e, idle, ph = rec.get(w + "_energy"), rec.get("idle"), rec.get(w) + if not (e and idle and ph and ph.get("output_tokens_total") and idle.get("seconds")): + return None + p_idle = idle["joules"] / idle["seconds"] + return (e["joules"] - p_idle * e["seconds"]) / ph["output_tokens_total"] + + +def score(recs): + arms = {e: [r for r in recs if r["engine"] == e and not r["void"]] for e in "ABC"} + void = {e: sum(1 for r in recs if r["engine"] == e and r["void"]) for e in "ABC"} + res = {"blocks": [{k: r[k] for k in ("block", "engine", "void", "decode_tps")} for r in recs], "void": void} + if void["A"] >= 2 or void["B"] >= 2 or len(arms["A"]) < 4 or len(arms["B"]) < 4: + return dict(res, verdict="INCONCLUSIVE", why=">= 2 void blocks, or < 4 valid blocks, in A or B") + med = {e: st.median(t for r in arms[e] for t in r["decode_tps"]) for e in "ABC" if arms[e]} + R = med["A"] / med["B"] + R_bw = (A_BYTES * med["A"]) / (B_BYTES * med["B"]) + pairs = [st.median(a["decode_tps"]) / st.median(b["decode_tps"]) for a, b in zip(arms["A"], arms["B"])] + side = all((r > 1) == (R > 1) for r in pairs) + if gap(R) < 0.15 and gap(R_bw) < 0.15 and all(gap(r) < 0.15 for r in pairs): + v = "SUPPORTED" + elif gap(R) >= 0.15 and side and all(gap(r) >= 0.15 for r in pairs): + v = "REFUTED" + else: + v = "INCONCLUSIVE" + + def reported(e): + rs = arms.get(e) or [] + ttft = [s["ttft_s"] for r in rs for s in (r["prefill"] or {}).get("samples", []) if s.get("ok") and s.get("ttft_s")] + c4 = [r["conc4"]["aggregate_tokens_per_s"] for r in rs if r["conc4"] and r["conc4"].get("aggregate_tokens_per_s")] + jt = [x for x in (incremental_j_per_token(r, "decode") for r in rs) if x is not None] + return {"decode_tps_median": med.get(e), "prefill_ttft_median_s": st.median(ttft) if ttft else None, + "conc4_tps_median": st.median(c4) if c4 else None, + "decode_incremental_j_per_token_median": st.median(jt) if jt else None, "blocks": len(rs)} + + return dict(res, verdict=v, R=round(R, 4), gap=round(gap(R), 4), R_bandwidth=round(R_bw, 4), + pair_ratios=[round(r, 4) for r in pairs], + C_over_B=round(med["C"] / med["B"], 4) if "C" in med else None, + arms={e: reported(e) for e in "ABC"}) + + +if __name__ == "__main__": + json.dump(score(blocks(sys.argv[1])), sys.stdout, indent=1) + print() diff --git a/bench/apb/h7x.sh b/bench/apb/h7x.sh old mode 100644 new mode 100755 index e3f8c945..7a6d2cff --- a/bench/apb/h7x.sh +++ b/bench/apb/h7x.sh @@ -9,7 +9,7 @@ # greedy, ignore_eos, unique prompts. bench/apb/h7x.py scores the run. # # Environment: -# APB_MODELS dir with Qwen3-4B-fp16-ov and Qwen3-4B (hf download --local-dir) (required) +# APB_MODELS dir with OpenVINO/Qwen3-4B-fp16-ov and Qwen/Qwen3-4B (bench/xhost/fetch_models.py) (required) # APB_EAT_CHART EAT checkout's core/helm-charts/vllm at 0d3438d (required) # APB_OUT run directory parent (default ./apb-runs) # H7X_CPUS CPUs each engine is sized to (default 16, H7's P-core balloon) @@ -91,8 +91,8 @@ if [ -n "${NODE_CPUS}" ]; then echo "node cpuset ${NODE_CPUS}" | tee "${OUT}/node-cpus.txt" fi stamp stage -stage Qwen3-4B-fp16-ov OpenVINO/Qwen3-4B-fp16-ov -stage Qwen3-4B Qwen3-4B +stage OpenVINO/Qwen3-4B-fp16-ov OpenVINO/Qwen3-4B-fp16-ov +stage Qwen/Qwen3-4B Qwen3-4B kubectl apply -f "${OUT}/ovms.yaml" -f "${OUT}/vllm.yaml" >/dev/null kubectl -n default scale deploy/vllm-qwen-3-4b-cpu --replicas=0 >/dev/null kubectl -n k3d-gpu-agent scale deploy/ovms --replicas=0 >/dev/null @@ -153,6 +153,8 @@ for e in ${ORDER}; do exit 2 fi stamp "block ${i} engine ${e} ready" + # H7X_SMOKE=1: bring each engine up once and send no request (setup check, never scored). + [ "${H7X_SMOKE:-0}" = 1 ] && continue python3 "${LOAD}" --base-url "${BASE}" --model "${MODEL}" --temperature 0 --max-tokens 256 --ignore-eos --unique-prompts \ --requests 1 --warmup 0 --label warm >/dev/null 2>&1 python3 "${LOAD}" --base-url "${BASE}" --model "${MODEL}" --temperature 0 --prompt "${PREFILL}" --max-tokens 16 --ignore-eos \ @@ -165,5 +167,5 @@ for e in ${ORDER}; do done git -C "${REPO}" rev-parse HEAD > "${OUT}/commit.txt" docker inspect --format '{{.Config.Image}} {{.Image}}' "$(nodes | head -1)" > "${OUT}/node-image.txt" -python3 "${HERE}/h7x.py" "${OUT}" | tee "${OUT}/verdict.json" +[ "${H7X_SMOKE:-0}" = 1 ] || python3 "${HERE}/h7x.py" "${OUT}" | tee "${OUT}/verdict.json" stamp finished diff --git a/bench/apb/test_h7x.py b/bench/apb/test_h7x.py new file mode 100644 index 00000000..1b1cac8c --- /dev/null +++ b/bench/apb/test_h7x.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""Unit tests for bench/apb/h7x.py (the H7x decision rule). Stdlib only.""" +import json +import os +import sys +import tempfile +import unittest + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +import h7x # noqa: E402 + +ORDER = "A B B A A B B A A B C".split() + + +def write_run(d, tps, tokens=256, n=5, skip=()): + """tps: {engine: tok/s or [per-block tok/s in run order]}""" + seen = {} + for i, e in enumerate(ORDER, start=1): + if i in skip: + continue + k = seen.get(e, 0) + seen[e] = k + 1 + v = tps[e][k] if isinstance(tps[e], list) else tps[e] + dec = {"phases": [{"samples": [{"ok": True, "output_tokens": tokens, "decode_tokens_per_s": v + j * 0.01} + for j in range(n)], "output_tokens_total": tokens * n}]} + pre = {"phases": [{"samples": [{"ok": True, "ttft_s": 2.0}] * 5}]} + c4 = {"phases": [{"samples": [], "aggregate_tokens_per_s": 3 * v}]} + for w, obj in (("decode", dec), ("prefill", pre), ("conc4", c4)): + json.dump(obj, open(os.path.join(d, f"b{i}-{e}-{w}.json"), "w")) + json.dump({"joules": 2000.0, "seconds": 20.0}, open(os.path.join(d, f"b{i}-{e}-idle-energy.json"), "w")) + json.dump({"joules": 9000.0, "seconds": 60.0}, open(os.path.join(d, f"b{i}-{e}-decode-energy.json"), "w")) + + +def run(tps, **kw): + with tempfile.TemporaryDirectory() as d: + write_run(d, tps, **kw) + return h7x.score(h7x.blocks(d)) + + +class Rule(unittest.TestCase): + def test_within_15_percent_is_supported(self): + v = run({"A": 20.0, "B": 18.5, "C": 19.0}) + self.assertEqual(v["verdict"], "SUPPORTED") + self.assertEqual(len(v["pair_ratios"]), 5) + self.assertAlmostEqual(v["C_over_B"], 19.0 / 18.5, places=2) + + def test_consistent_gap_is_refuted(self): + self.assertEqual(run({"A": 20.0, "B": 16.0, "C": 16.0})["verdict"], "REFUTED") + + def test_vllm_faster_is_refuted_too(self): + self.assertEqual(run({"A": 14.0, "B": 18.0, "C": 18.0})["verdict"], "REFUTED") + + def test_h7_like_straddle_is_inconclusive(self): + # pooled gap above 15% but one block pair below it, as in the i9 run + v = run({"A": [20.0, 20.0, 20.0, 20.0, 18.0], "B": 17.0, "C": 17.0}) + self.assertEqual(v["verdict"], "INCONCLUSIVE") + + def test_short_outputs_void_blocks(self): + v = run({"A": 20.0, "B": 18.5, "C": 18.5}, tokens=200) + self.assertEqual(v["verdict"], "INCONCLUSIVE") + self.assertEqual(v["void"]["A"], 5) + + def test_missing_c_block_is_reported_none(self): + v = run({"A": 20.0, "B": 18.5, "C": 18.5}, skip=(11,)) + self.assertEqual((v["verdict"], v["C_over_B"]), ("SUPPORTED", None)) + + def test_cap_cut_run_with_three_a_blocks_is_inconclusive(self): + v = run({"A": 20.0, "B": 18.5, "C": 18.5}, skip=(8, 9, 10, 11)) + self.assertEqual(v["verdict"], "INCONCLUSIVE") + + def test_incremental_energy_per_token(self): + v = run({"A": 20.0, "B": 18.5, "C": 18.5}) + # (9000 J - 100 W x 60 s) / 1280 tokens + self.assertAlmostEqual(v["arms"]["A"]["decode_incremental_j_per_token_median"], 3000 / 1280) + + +if __name__ == "__main__": + unittest.main() diff --git a/docs/intel/technical-report.md b/docs/intel/technical-report.md index 7492fe9a..0a45990d 100644 --- a/docs/intel/technical-report.md +++ b/docs/intel/technical-report.md @@ -11,7 +11,7 @@ This report covers what was measured, and how. Every result but H52, H25x, H27x, - Seventeen hypotheses are SUPPORTED. Sixteen are scoped to that host; H25x is H25 replicated on the Xeon 6741P. H57dm (the Gemma 4 QAT MTP drafter speeds llama.cpp decode on the P-cores) is the newest. - Fourteen are REFUTED. Six of them changed shipped defaults. - 23 are INCONCLUSIVE, mostly because the shared host throttles or its load was unmatched. H54a and H54d (Gemma 4 26B-A4B QAT on the Xeon 6741P) are INCONCLUSIVE because EAT's stock vLLM CPU arm stalled in both of H54a's holds, so no arm could be scored against it. H57da (k3d-gpu's OVMS pick vs llama.cpp for Gemma 4 QAT on the i9-13900T) did not resolve: the strictly pinned llama.cpp arms tracked host load; H57db did not run (memory). -- 20 are PENDING: the Xeon 6741P rows H50, H50o, H51, H52b, H53, H54q, H54b, H54c and the zero-touch thesis row H58, the cross-host replication H28x, H55 (SLO-gated admission of an E-core neighbour on the i9-13900T), H56 (two holds at once in cpuset slices of the Xeon 6741P), and the second client host's (wildct, i7-13700) rows H52w, H18w, H25w, H28w, H34w, H57wa, H57wm and H57wb, pre-registered and not yet run. H52, the first row run on that host (a Xeon 6741P with four Arc Pro B70s), is REFUTED. H27x, H27 re-run on the Xeon (AMX), is REFUTED as on the i9. H34x, H34 re-run there, is REFUTED: the CPU Fast Draft that sped up the i9 slowed decode on the Xeon. +- 21 are PENDING: the Xeon 6741P rows H50, H50o, H51, H52b, H53, H54q, H54b, H54c and the zero-touch thesis row H58, the cross-host replications H7x and H28x, H55 (SLO-gated admission of an E-core neighbour on the i9-13900T), H56 (two holds at once in cpuset slices of the Xeon 6741P), and the second client host's (wildct, i7-13700) rows H52w, H18w, H25w, H28w, H34w, H57wa, H57wm and H57wb, pre-registered and not yet run. H52, the first row run on that host (a Xeon 6741P with four Arc Pro B70s), is REFUTED. H27x, H27 re-run on the Xeon (AMX), is REFUTED as on the i9. H34x, H34 re-run there, is REFUTED: the CPU Fast Draft that sped up the i9 slowed decode on the Xeon. - Every other Intel family is detected and configured in fixture tests only. None has a measurement. No world-first, superlative or priority claim is made; [docs/provenance.md](../provenance.md) supports none. diff --git a/tests/bench_test.sh b/tests/bench_test.sh index c9e1c61d..d1d3138e 100755 --- a/tests/bench_test.sh +++ b/tests/bench_test.sh @@ -252,6 +252,11 @@ check "bench: joule-pack (H21) unit tests" \ env PYTHONDONTWRITEBYTECODE=1 python3 "${ROOT}/bench/joule-pack/test_joulepack.py" check "shared-prefix (H25): prompt generator and scorer" \ env PYTHONDONTWRITEBYTECODE=1 python3 "${ROOT}/bench/shared-prefix/test_probe.py" +check "apb (H7x): h7x.py applies the H7x decision rule" \ + env PYTHONDONTWRITEBYTECODE=1 python3 "${ROOT}/bench/apb/test_h7x.py" +check "apb (H7x): h7x.sh parses" bash -n "${ROOT}/bench/apb/h7x.sh" +check "apb (H7x): h7x.sh defaults are H7's (16 CPUs, ABBAABBAAB then C, no node cpuset)" \ + sh -c 'test "$(env -u K3D_GPU_CLUSTER H7X_PRINT_CONFIG=1 bash "$1")" = "cluster=apb-h7x cpus=16 node_cpus= order=A B B A A B B A A B C"' _ "${ROOT}/bench/apb/h7x.sh" check "shared-prefix (H25): run.sh parses" bash -n "${ROOT}/bench/shared-prefix/run.sh" check "shared-prefix (H25): run.sh pins no node cpuset by default" \ sh -c 'test "$(env -u CLUSTER -u NODE_CPUS SHARED_PREFIX_PRINT_CONFIG=1 bash "$1")" = "cluster=k3dgpu-i-shared-prefix node_cpus="' _ "${ROOT}/bench/shared-prefix/run.sh" From d51a51aa7ce787fe0af0f85235f2239d6be96a37 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Tue, 20 Oct 2026 16:14:58 -0700 Subject: [PATCH 04/85] bench(H7x): diagnostics on an engine that does not come up; H7X_READY_S --- bench/apb/h7x.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/bench/apb/h7x.sh b/bench/apb/h7x.sh index 7a6d2cff..b141f8be 100755 --- a/bench/apb/h7x.sh +++ b/bench/apb/h7x.sh @@ -26,6 +26,7 @@ ENERGY=${REPO}/bench/energy.sh CPUS=${H7X_CPUS:-16} NODE_CPUS=${H7X_NODE_CPUS:-} ORDER=${H7X_ORDER:-"A B B A A B B A A B C"} +READY_S=${H7X_READY_S:-900} # per engine start (the first vLLM start pulls its image) export K3D_GPU_CLUSTER=${K3D_GPU_CLUSTER:-apb-h7x} if [ "${H7X_PRINT_CONFIG:-0}" = 1 ]; then echo "cluster=${K3D_GPU_CLUSTER} cpus=${CPUS} node_cpus=${NODE_CPUS} order=${ORDER}"; exit 0; fi M=${APB_MODELS:?set APB_MODELS to the dir of local model copies} @@ -116,13 +117,13 @@ up_engine() { # up_engine A|B|C: every other server scaled to 0 first, so only down_all case $1 in A) kubectl -n k3d-gpu-agent scale deploy/ovms --replicas=1 >/dev/null - kubectl -n k3d-gpu-agent rollout status deploy/ovms --timeout=900s >/dev/null || return 1 + kubectl -n k3d-gpu-agent rollout status deploy/ovms --timeout="${READY_S}s" >/dev/null || return 1 kubectl -n k3d-gpu-agent port-forward svc/ovms 18000:8000 >/dev/null 2>&1 & PF=$! BASE=http://127.0.0.1:18000/v3 MODEL=Qwen3-4B-fp16-ov NS=k3d-gpu-agent ;; B|C) d=vllm-qwen-3-4b-cpu; s=vllm-qwen-3-4b-cpu-service [ "$1" = C ] && { d=vllm-c; s=vllm-c-service; } kubectl -n default scale "deploy/${d}" --replicas=1 >/dev/null - kubectl -n default rollout status "deploy/${d}" --timeout=900s >/dev/null || return 1 + kubectl -n default rollout status "deploy/${d}" --timeout="${READY_S}s" >/dev/null || return 1 kubectl -n default port-forward "svc/${s}" 18001:80 >/dev/null 2>&1 & PF=$! BASE=http://127.0.0.1:18001/v1 MODEL=Qwen/Qwen3-4B NS=default ;; esac @@ -148,7 +149,11 @@ for e in ${ORDER}; do stamp "block ${i} engine ${e} start" if ! up_engine "${e}"; then echo "block ${i} engine ${e} did not come up" | tee -a "${OUT}/notes.txt" - kubectl -n "${NS:-default}" get pods -o wide >> "${OUT}/notes.txt" 2>&1 + { kubectl get pods -A -o wide; kubectl describe pods -n default; kubectl describe pods -n k3d-gpu-agent + for p in $(kubectl get pods -n default -o name; kubectl get pods -n k3d-gpu-agent -o name); do + echo "--- logs ${p}"; kubectl logs -n default "${p}" --all-containers --tail=60 2>/dev/null \ + || kubectl logs -n k3d-gpu-agent "${p}" --all-containers --tail=60; done + } >> "${OUT}/notes.txt" 2>&1 [ "${e}" = C ] && continue exit 2 fi From 8c767373e10e9bd20ff6b5805bded456852457e1 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Tue, 20 Oct 2026 17:08:57 -0700 Subject: [PATCH 05/85] ledger(H7x): 16 CPUs as H7 (vLLM OOM at 48 under EAT's 16 GiB limit), smoke findings, plugin correction --- EXPERIMENTS.md | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index 7eff4427..4eebf289 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -1659,8 +1659,9 @@ say nothing about the graded result. ### H7x pre-registration: H7 to its full protocol on the Xeon 6741P (2026-10-20) -Written 2026-10-20T23:10Z, before any H7x measurement (a render-only check of the manifests -ran on the host; no server was started). H7 keeps its INCONCLUSIVE verdict on the i9-13900T. +Written 2026-10-20T23:10Z, revised 2026-10-21T00:20Z after two setup smokes, before any H7x +measurement (the smokes started the engines and sent no request; see below). H7 keeps its +INCONCLUSIVE verdict on the i9-13900T. **Why.** H7's i9 run was short of its own pre-registration (3 and 2 blocks instead of 5 ABBA rounds, no `--enforce-eager`-dropped arm, no energy) and its decode gap (15.6% of vLLM's rate, @@ -1701,14 +1702,28 @@ their block medians. R_bw = R x (A weight bytes / B weight bytes) = R x 0.99999. **Host changes** (as the cross-host rows, X1-X5 of the [cross-host pre-registration](#cross-host-pre-registration-h25x-h27x-h28x-h34x-on-the-xeon-6741p-2026-10-20)): -`bench/xhost/hold.sh` on the shared lock; node container pinned to CPUs 0-23,48-71 and both -engines sized to those 48 CPUs (`H7X_CPUS=48`; H7 gave each engine the whole 16-CPU P-core -balloon); `K3D_GPU_VENDORS=none`; crescent C1 kubelet thresholds; node image +`bench/xhost/hold.sh` on the shared lock; node container pinned to CPUs 0-7,48-55 (8 cores +with their SMT siblings) and both engines sized to those 16 CPUs (`H7X_CPUS=16`), which is H7's +sizing: there each engine got the whole 16-CPU P-core balloon (8 P-cores with SMT). An earlier +draft of this row sized both engines to 48 CPUs; setup smoke 2 showed vLLM OOMKilled 9 times at +EAT's 16 GiB memory limit with 48 threads (below), so the row keeps H7's 16 CPUs instead of +changing the chart's limit. `K3D_GPU_VENDORS=none`; crescent C1 kubelet thresholds; node image `cryptoandcoffee/k3d-gpu:0.1.61`; models downloaded on the host at the pinned commits (`bench/xhost/fetch_models.py`). No background load, as H7 (it predates the matched-load design); the host's own serving stack is the background, recorded by `serving.py` and the hold's pre/post snapshots. +**Setup smokes (`H7X_SMOKE=1`: engines brought up, no request; not scored).** Smoke 1 +(22:57-23:14Z, order A B C, 48 CPUs): A (OVMS) ready in 31 s with `Cpus_allowed_list` 0-23,48-71; +B not Ready in 900 s. Smoke 2 (23:36-00:07Z, order B C, `H7X_READY_S=1800`, 48 CPUs, failure +diagnostics added to `h7x.sh`): B `OOMKilled` (exit 137) 9 times at its 16 GiB limit. Both +smokes also showed the node image's baked `intel-gpu-plugin` DaemonSet running with +`K3D_GPU_VENDORS=none` (the node container is privileged, so NFD's PCI labels gate it in); no +pod requested a GPU, so no arm used one. This corrects X3 of the cross-host pre-registration, +which said no GPU plugin is deployed. A third smoke at 16 CPUs runs before this row is merged and +is reported in its run section. `H7X_READY_S=1800` is used for the run, because the first vLLM +start in a fresh cluster pulls its 7.4 GB image. + **Hold.** One hold, cap 4200 s (11 blocks; a vLLM cold start is the slow step). If the cap ends the run before all 10 A/B blocks, the blocks that ran are scored by the same rule, and fewer than 4 valid blocks in A or B reads INCONCLUSIVE. @@ -1722,7 +1737,7 @@ $X/hfvenv/bin/python bench/xhost/fetch_models.py $X/models \ OpenVINO/Qwen3-4B-fp16-ov@00298f1c614ffdc000814d8cbe1b7613aa73cdca Qwen/Qwen3-4B@1cfa9a7208912126459214e8b04321603b3df60c git -C $X/eat-src checkout 0d3438d # https://github.com/intel/enterprise-agent-toolkit bench/xhost/hold.sh H7x 4200 env K3D_GPU_IMAGE=cryptoandcoffee/k3d-gpu:0.1.61 K3D_GPU_VENDORS=none \ - K3D_GPU_K3S_ARGS="$C1" K3D_GPU_CLUSTER=k3dgpu-x-h7 H7X_CPUS=48 H7X_NODE_CPUS=0-23,48-71 \ + K3D_GPU_K3S_ARGS="$C1" K3D_GPU_CLUSTER=k3dgpu-x-h7 H7X_CPUS=16 H7X_NODE_CPUS=0-7,48-55 H7X_READY_S=1800 \ APB_MODELS=$X/models APB_EAT_CHART=$X/eat-src/core/helm-charts/vllm APB_OUT=$X/runs/H7x \ bench/apb/h7x.sh ``` From 6e8be1be1b30383ac5935e6d6123b169717d044d Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Tue, 20 Oct 2026 20:09:19 -0700 Subject: [PATCH 06/85] ledger(H7x): B memory 32Gi (OOM at 16Gi at 16 and 48 CPUs), smoke 3, plugin note --- EXPERIMENTS.md | 27 ++++++++++++++++----------- bench/apb/h7x.sh | 6 ++++-- tests/bench_test.sh | 2 +- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index 4eebf289..1280ec43 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -1659,7 +1659,7 @@ say nothing about the graded result. ### H7x pre-registration: H7 to its full protocol on the Xeon 6741P (2026-10-20) -Written 2026-10-20T23:10Z, revised 2026-10-21T00:20Z after two setup smokes, before any H7x +Written 2026-10-20T23:10Z, revised 2026-10-21T01:30Z after three setup smokes, before any H7x measurement (the smokes started the engines and sent no request; see below). H7 keeps its INCONCLUSIVE verdict on the i9-13900T. @@ -1705,9 +1705,12 @@ their block medians. R_bw = R x (A weight bytes / B weight bytes) = R x 0.99999. `bench/xhost/hold.sh` on the shared lock; node container pinned to CPUs 0-7,48-55 (8 cores with their SMT siblings) and both engines sized to those 16 CPUs (`H7X_CPUS=16`), which is H7's sizing: there each engine got the whole 16-CPU P-core balloon (8 P-cores with SMT). An earlier -draft of this row sized both engines to 48 CPUs; setup smoke 2 showed vLLM OOMKilled 9 times at -EAT's 16 GiB memory limit with 48 threads (below), so the row keeps H7's 16 CPUs instead of -changing the chart's limit. `K3D_GPU_VENDORS=none`; crescent C1 kubelet thresholds; node image +draft of this row sized both engines to 48 CPUs. B's memory limit is raised from the 16Gi of +`integrations/eat/vllm-values.yaml` (k3d-gpu's overlay, sized on the i9) to 32Gi +(`H7X_VLLM_MEM=32Gi`), for B and C alike: on this host vLLM was OOMKilled at 16Gi right after +it allocated its 6 GiB KV cache, at 48 and at 16 CPUs (smokes 2 and 3, below). The limit is a +cgroup cap; it changes no engine setting (KV stays 6 GiB, `VLLM_CPU_SGL_KERNEL` 1 as EAT ships). +The OOM's cause is not established (an AMX-path weight repack is one candidate). `K3D_GPU_VENDORS=none`; crescent C1 kubelet thresholds; node image `cryptoandcoffee/k3d-gpu:0.1.61`; models downloaded on the host at the pinned commits (`bench/xhost/fetch_models.py`). No background load, as H7 (it predates the matched-load design); the host's own serving stack is the background, recorded by `serving.py` and the @@ -1716,12 +1719,14 @@ hold's pre/post snapshots. **Setup smokes (`H7X_SMOKE=1`: engines brought up, no request; not scored).** Smoke 1 (22:57-23:14Z, order A B C, 48 CPUs): A (OVMS) ready in 31 s with `Cpus_allowed_list` 0-23,48-71; B not Ready in 900 s. Smoke 2 (23:36-00:07Z, order B C, `H7X_READY_S=1800`, 48 CPUs, failure -diagnostics added to `h7x.sh`): B `OOMKilled` (exit 137) 9 times at its 16 GiB limit. Both -smokes also showed the node image's baked `intel-gpu-plugin` DaemonSet running with -`K3D_GPU_VENDORS=none` (the node container is privileged, so NFD's PCI labels gate it in); no -pod requested a GPU, so no arm used one. This corrects X3 of the cross-host pre-registration, -which said no GPU plugin is deployed. A third smoke at 16 CPUs runs before this row is merged and -is reported in its run section. `H7X_READY_S=1800` is used for the run, because the first vLLM +diagnostics added to `h7x.sh`): B `OOMKilled` (exit 137) 9 times at its 16 GiB limit. Smoke 3 +(2026-10-21 00:25-00:57Z, order A B C, 16 CPUs on 0-7,48-55): A ready in 28 s on 0-7,48-55; B +OOMKilled again at 16 GiB (vLLM bound 8 OpenMP threads to cores 48-55), last log line the KV +allocation ("6.0/16.0 GiB for KV cache"). All three smokes also showed the node image's baked +`intel-gpu-plugin` DaemonSet running despite `K3D_GPU_VENDORS=none` (a launcher bug, fixed +separately); no pod requested a GPU, so no arm used one. This corrects X3 of the cross-host +pre-registration, which said no GPU plugin is deployed. A fourth smoke with `H7X_VLLM_MEM=32Gi` +runs before this row is merged and is reported in its run section. `H7X_READY_S=1800` is used for the run, because the first vLLM start in a fresh cluster pulls its 7.4 GB image. **Hold.** One hold, cap 4200 s (11 blocks; a vLLM cold start is the slow step). If the cap ends @@ -1737,7 +1742,7 @@ $X/hfvenv/bin/python bench/xhost/fetch_models.py $X/models \ OpenVINO/Qwen3-4B-fp16-ov@00298f1c614ffdc000814d8cbe1b7613aa73cdca Qwen/Qwen3-4B@1cfa9a7208912126459214e8b04321603b3df60c git -C $X/eat-src checkout 0d3438d # https://github.com/intel/enterprise-agent-toolkit bench/xhost/hold.sh H7x 4200 env K3D_GPU_IMAGE=cryptoandcoffee/k3d-gpu:0.1.61 K3D_GPU_VENDORS=none \ - K3D_GPU_K3S_ARGS="$C1" K3D_GPU_CLUSTER=k3dgpu-x-h7 H7X_CPUS=16 H7X_NODE_CPUS=0-7,48-55 H7X_READY_S=1800 \ + K3D_GPU_K3S_ARGS="$C1" K3D_GPU_CLUSTER=k3dgpu-x-h7 H7X_CPUS=16 H7X_NODE_CPUS=0-7,48-55 H7X_READY_S=1800 H7X_VLLM_MEM=32Gi \ APB_MODELS=$X/models APB_EAT_CHART=$X/eat-src/core/helm-charts/vllm APB_OUT=$X/runs/H7x \ bench/apb/h7x.sh ``` diff --git a/bench/apb/h7x.sh b/bench/apb/h7x.sh index b141f8be..56ed285d 100755 --- a/bench/apb/h7x.sh +++ b/bench/apb/h7x.sh @@ -15,6 +15,7 @@ # H7X_CPUS CPUs each engine is sized to (default 16, H7's P-core balloon) # H7X_NODE_CPUS cpuset for the node container after `up` (default none) # H7X_ORDER block order (default "A B B A A B B A A B C") +# H7X_VLLM_MEM memory limit for B and C (default: the overlay's 16Gi) # K3D_GPU_CLUSTER cluster name (default apb-h7x); K3D_GPU_* pass through to `up` set -uo pipefail @@ -27,8 +28,9 @@ CPUS=${H7X_CPUS:-16} NODE_CPUS=${H7X_NODE_CPUS:-} ORDER=${H7X_ORDER:-"A B B A A B B A A B C"} READY_S=${H7X_READY_S:-900} # per engine start (the first vLLM start pulls its image) +VLLM_MEM=${H7X_VLLM_MEM:-} # B/C memory limit; empty keeps integrations/eat/vllm-values.yaml (16Gi) export K3D_GPU_CLUSTER=${K3D_GPU_CLUSTER:-apb-h7x} -if [ "${H7X_PRINT_CONFIG:-0}" = 1 ]; then echo "cluster=${K3D_GPU_CLUSTER} cpus=${CPUS} node_cpus=${NODE_CPUS} order=${ORDER}"; exit 0; fi +if [ "${H7X_PRINT_CONFIG:-0}" = 1 ]; then echo "cluster=${K3D_GPU_CLUSTER} cpus=${CPUS} node_cpus=${NODE_CPUS} order=${ORDER} vllm_mem=${VLLM_MEM}"; exit 0; fi M=${APB_MODELS:?set APB_MODELS to the dir of local model copies} CHART=${APB_EAT_CHART:?set APB_EAT_CHART to EAT core/helm-charts/vllm} OUT=${APB_OUT:-${PWD}/apb-runs}/h7x-$(date +%Y%m%d-%H%M%S) @@ -58,7 +60,7 @@ K3D_GPU_AGENT_DEVICE=CPU K3D_GPU_AGENT_MODEL=OpenVINO/Qwen3-4B-fp16-ov K3D_GPU_A "${K}" agent manifest > "${OUT}/agent.yaml" 2> "${OUT}/agent.err" || { cat "${OUT}/agent.err"; exit 1; } python3 "${HERE}/stage.py" ovms "${OUT}/agent.yaml" "${OUT}/ovms.yaml" python3 "${HERE}/stage.py" values "${CHART}/xeon-values.yaml" "${REPO}/integrations/eat/vllm-values.yaml" 6 "${OUT}/values.yaml" -helm template vllm-qwen-3-4b-cpu "${CHART}" --values "${OUT}/values.yaml" --set LLM_MODEL_ID=Qwen/Qwen3-4B --set cpu="${CPUS}" \ +helm template vllm-qwen-3-4b-cpu "${CHART}" --values "${OUT}/values.yaml" --set LLM_MODEL_ID=Qwen/Qwen3-4B --set cpu="${CPUS}" ${VLLM_MEM:+--set memory="${VLLM_MEM}"} \ --set global.monitoring=false --set svcmonitor.enabled=false --set ingress.enabled=false --set route.enabled=false > "${OUT}/eat.yaml" python3 "${HERE}/stage.py" vllm "${OUT}/eat.yaml" "${OUT}/vllm.yaml" Qwen3-4B 32768 # C: the same Deployment and Service, renamed, with --enforce-eager removed (the only change). diff --git a/tests/bench_test.sh b/tests/bench_test.sh index d1d3138e..9786de55 100755 --- a/tests/bench_test.sh +++ b/tests/bench_test.sh @@ -256,7 +256,7 @@ check "apb (H7x): h7x.py applies the H7x decision rule" \ env PYTHONDONTWRITEBYTECODE=1 python3 "${ROOT}/bench/apb/test_h7x.py" check "apb (H7x): h7x.sh parses" bash -n "${ROOT}/bench/apb/h7x.sh" check "apb (H7x): h7x.sh defaults are H7's (16 CPUs, ABBAABBAAB then C, no node cpuset)" \ - sh -c 'test "$(env -u K3D_GPU_CLUSTER H7X_PRINT_CONFIG=1 bash "$1")" = "cluster=apb-h7x cpus=16 node_cpus= order=A B B A A B B A A B C"' _ "${ROOT}/bench/apb/h7x.sh" + sh -c 'test "$(env -u K3D_GPU_CLUSTER H7X_PRINT_CONFIG=1 bash "$1")" = "cluster=apb-h7x cpus=16 node_cpus= order=A B B A A B B A A B C vllm_mem="' _ "${ROOT}/bench/apb/h7x.sh" check "shared-prefix (H25): run.sh parses" bash -n "${ROOT}/bench/shared-prefix/run.sh" check "shared-prefix (H25): run.sh pins no node cpuset by default" \ sh -c 'test "$(env -u CLUSTER -u NODE_CPUS SHARED_PREFIX_PRINT_CONFIG=1 bash "$1")" = "cluster=k3dgpu-i-shared-prefix node_cpus="' _ "${ROOT}/bench/shared-prefix/run.sh" From 60c34a0ea12bafb301412267721f6e93959b0079 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Tue, 20 Oct 2026 20:47:44 -0700 Subject: [PATCH 07/85] ledger(H7x): smoke 4; C gets a writable VLLM_CACHE_ROOT; keep the failed container's log --- EXPERIMENTS.md | 16 +++++++++++----- bench/apb/h7x.sh | 9 +++++++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index 1280ec43..61712c1b 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -1659,7 +1659,7 @@ say nothing about the graded result. ### H7x pre-registration: H7 to its full protocol on the Xeon 6741P (2026-10-20) -Written 2026-10-20T23:10Z, revised 2026-10-21T01:30Z after three setup smokes, before any H7x +Written 2026-10-20T23:10Z, revised 2026-10-21T04:00Z after four setup smokes, before any H7x measurement (the smokes started the engines and sent no request; see below). H7 keeps its INCONCLUSIVE verdict on the i9-13900T. @@ -1673,8 +1673,8 @@ path is written for (Xeon with AMX), and fixes in advance how the 15% line is re (`K3D_GPU_AGENT_DRAFT=off`; H7 predates the CPU Fast Draft default); B = vLLM CPU v0.24.0 (`vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f860...981a1`) with EAT's chart at `0d3438d` (`xeon-values.yaml` + `integrations/eat/vllm-values.yaml`, KV 6 GiB, `--max-model-len 32768`), -`Qwen/Qwen3-4B` @ `1cfa9a72` in bf16; C = B with `--enforce-eager` removed and nothing else -changed (its own Deployment and Service, selector label `h7x-arm: c`). The int4 second arm runs +`Qwen/Qwen3-4B` @ `1cfa9a72` in bf16; C = B with `--enforce-eager` removed (and a writable +`VLLM_CACHE_ROOT`, see the smokes) and nothing else changed (its own Deployment and Service, selector label `h7x-arm: c`). The int4 second arm runs only if vLLM v0.24.0 CPU is first shown to load an int4 build of the same checkpoint (H7); it is not run. @@ -1725,8 +1725,14 @@ OOMKilled again at 16 GiB (vLLM bound 8 OpenMP threads to cores 48-55), last log allocation ("6.0/16.0 GiB for KV cache"). All three smokes also showed the node image's baked `intel-gpu-plugin` DaemonSet running despite `K3D_GPU_VENDORS=none` (a launcher bug, fixed separately); no pod requested a GPU, so no arm used one. This corrects X3 of the cross-host -pre-registration, which said no GPU plugin is deployed. A fourth smoke with `H7X_VLLM_MEM=32Gi` -runs before this row is merged and is reported in its run section. `H7X_READY_S=1800` is used for the run, because the first vLLM +pre-registration, which said no GPU plugin is deployed. Smoke 4 (2026-10-21 03:14-03:47Z, order +B C, 16 CPUs, `H7X_VLLM_MEM=32Gi`): B Ready in 112 s on 0-7,48-55; C restarted 9 times (exit 1) +and was not Ready in 1800 s. The likely cause, not confirmed (the failed container's log was not +kept): with compilation on, vLLM writes its compile cache under `$HOME/.cache/vllm`, which is on +the chart's read-only root for its non-root user. C therefore also gets +`VLLM_CACHE_ROOT=/root/.cache/vllm`, the chart's own writable cache volume, its one change besides +dropping `--enforce-eager`; `h7x.sh` now keeps the failed container's log. If C still does not +come up, the run continues without it and C/B is reported as not measured. `H7X_READY_S=1800` is used for the run, because the first vLLM start in a fresh cluster pulls its 7.4 GB image. **Hold.** One hold, cap 4200 s (11 blocks; a vLLM cold start is the slow step). If the cap ends diff --git a/bench/apb/h7x.sh b/bench/apb/h7x.sh index 56ed285d..1eb08009 100755 --- a/bench/apb/h7x.sh +++ b/bench/apb/h7x.sh @@ -75,6 +75,10 @@ for d in docs: for key in ("args", "command"): if c.get(key) and "--enforce-eager" in c[key]: c[key] = [a for a in c[key] if a != "--enforce-eager"]; n += 1 + # With compilation on, vLLM writes its compile cache under VLLM_CACHE_ROOT, by default + # $HOME/.cache/vllm, on the chart's read-only root; point it at the chart's own + # writable /root/.cache/vllm volume. + c.setdefault("env", []).append({"name": "VLLM_CACHE_ROOT", "value": "/root/.cache/vllm"}) # C's own selector label, so the two Deployments never share pods. d["spec"]["selector"].setdefault("matchLabels", {})["h7x-arm"] = "c" d["spec"]["template"]["metadata"].setdefault("labels", {})["h7x-arm"] = "c" @@ -153,8 +157,9 @@ for e in ${ORDER}; do echo "block ${i} engine ${e} did not come up" | tee -a "${OUT}/notes.txt" { kubectl get pods -A -o wide; kubectl describe pods -n default; kubectl describe pods -n k3d-gpu-agent for p in $(kubectl get pods -n default -o name; kubectl get pods -n k3d-gpu-agent -o name); do - echo "--- logs ${p}"; kubectl logs -n default "${p}" --all-containers --tail=60 2>/dev/null \ - || kubectl logs -n k3d-gpu-agent "${p}" --all-containers --tail=60; done + for prev in --previous ""; do + echo "--- logs ${p} ${prev}"; kubectl logs -n default "${p}" --all-containers --tail=80 ${prev} 2>/dev/null \ + || kubectl logs -n k3d-gpu-agent "${p}" --all-containers --tail=80 ${prev}; done; done } >> "${OUT}/notes.txt" 2>&1 [ "${e}" = C ] && continue exit 2 From 03c226772d9d5b09f547cb6d1c3249ff381408c4 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Tue, 20 Oct 2026 20:58:33 -0700 Subject: [PATCH 08/85] bench(H7x): H7X_VLLM_MEM=fit sizes the vLLM limit from k3d-gpu fit (6 GiB KV kept) --- bench/apb/h7x.sh | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/bench/apb/h7x.sh b/bench/apb/h7x.sh index 1eb08009..76ca4603 100755 --- a/bench/apb/h7x.sh +++ b/bench/apb/h7x.sh @@ -15,7 +15,8 @@ # H7X_CPUS CPUs each engine is sized to (default 16, H7's P-core balloon) # H7X_NODE_CPUS cpuset for the node container after `up` (default none) # H7X_ORDER block order (default "A B B A A B B A A B C") -# H7X_VLLM_MEM memory limit for B and C (default: the overlay's 16Gi) +# H7X_VLLM_MEM memory limit for B and C (default: the overlay's 16Gi; `fit`: k3d-gpu fit's +# weights + runtime for this checkpoint, plus the row's 6 GiB KV, x 1.1, rounded up) # K3D_GPU_CLUSTER cluster name (default apb-h7x); K3D_GPU_* pass through to `up` set -uo pipefail @@ -28,7 +29,7 @@ CPUS=${H7X_CPUS:-16} NODE_CPUS=${H7X_NODE_CPUS:-} ORDER=${H7X_ORDER:-"A B B A A B B A A B C"} READY_S=${H7X_READY_S:-900} # per engine start (the first vLLM start pulls its image) -VLLM_MEM=${H7X_VLLM_MEM:-} # B/C memory limit; empty keeps integrations/eat/vllm-values.yaml (16Gi) +VLLM_MEM=${H7X_VLLM_MEM:-} # B/C memory limit: empty keeps integrations/eat/vllm-values.yaml (16Gi); fit = from `k3d-gpu fit` export K3D_GPU_CLUSTER=${K3D_GPU_CLUSTER:-apb-h7x} if [ "${H7X_PRINT_CONFIG:-0}" = 1 ]; then echo "cluster=${K3D_GPU_CLUSTER} cpus=${CPUS} node_cpus=${NODE_CPUS} order=${ORDER} vllm_mem=${VLLM_MEM}"; exit 0; fi M=${APB_MODELS:?set APB_MODELS to the dir of local model copies} @@ -59,6 +60,18 @@ stamp render K3D_GPU_AGENT_DEVICE=CPU K3D_GPU_AGENT_MODEL=OpenVINO/Qwen3-4B-fp16-ov K3D_GPU_AGENT_CPUS=${CPUS} K3D_GPU_AGENT_DRAFT=off \ "${K}" agent manifest > "${OUT}/agent.yaml" 2> "${OUT}/agent.err" || { cat "${OUT}/agent.err"; exit 1; } python3 "${HERE}/stage.py" ovms "${OUT}/agent.yaml" "${OUT}/ovms.yaml" +if [ "${VLLM_MEM}" = fit ]; then + # The fit sizes KV to the host; the row keeps H7's 6 GiB, so the limit is the fit's host bytes + # without its KV, plus 6 GiB, times the fit's 1.1 slack. + "${K}" fit --model Qwen/Qwen3-4B --revision 1cfa9a7208912126459214e8b04321603b3df60c --engine vllm \ + --device cpu --ctx 32768 --json > "${OUT}/fit.json" || { echo "k3d-gpu fit failed"; exit 1; } + VLLM_MEM=$(python3 -c 'import json, math, sys +d = json.load(open(sys.argv[1])) +assert d["fits"] and d["placement"] == "cpu", d["summary"] +print("%dGi" % math.ceil((d["host_bytes"] - d["kv_bytes"] + 6 * 2**30) * 1.1 / 2**30))' "${OUT}/fit.json") \ + || { echo "fit.json unusable"; exit 1; } + echo "vLLM memory limit ${VLLM_MEM} from k3d-gpu fit" | tee "${OUT}/vllm-mem.txt" +fi python3 "${HERE}/stage.py" values "${CHART}/xeon-values.yaml" "${REPO}/integrations/eat/vllm-values.yaml" 6 "${OUT}/values.yaml" helm template vllm-qwen-3-4b-cpu "${CHART}" --values "${OUT}/values.yaml" --set LLM_MODEL_ID=Qwen/Qwen3-4B --set cpu="${CPUS}" ${VLLM_MEM:+--set memory="${VLLM_MEM}"} \ --set global.monitoring=false --set svcmonitor.enabled=false --set ingress.enabled=false --set route.enabled=false > "${OUT}/eat.yaml" From 7cf5c22f6c1d1fab88dc43a24fdb981e123d61f3 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Tue, 20 Oct 2026 20:59:05 -0700 Subject: [PATCH 09/85] ledger(H7x): vLLM limit from k3d-gpu fit (22Gi here); 16Gi overlay finding; VLLM_CACHE_ROOT checked against v0.24.0 --- EXPERIMENTS.md | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index 61712c1b..a8291797 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -1705,12 +1705,17 @@ their block medians. R_bw = R x (A weight bytes / B weight bytes) = R x 0.99999. `bench/xhost/hold.sh` on the shared lock; node container pinned to CPUs 0-7,48-55 (8 cores with their SMT siblings) and both engines sized to those 16 CPUs (`H7X_CPUS=16`), which is H7's sizing: there each engine got the whole 16-CPU P-core balloon (8 P-cores with SMT). An earlier -draft of this row sized both engines to 48 CPUs. B's memory limit is raised from the 16Gi of -`integrations/eat/vllm-values.yaml` (k3d-gpu's overlay, sized on the i9) to 32Gi -(`H7X_VLLM_MEM=32Gi`), for B and C alike: on this host vLLM was OOMKilled at 16Gi right after -it allocated its 6 GiB KV cache, at 48 and at 16 CPUs (smokes 2 and 3, below). The limit is a -cgroup cap; it changes no engine setting (KV stays 6 GiB, `VLLM_CPU_SGL_KERNEL` 1 as EAT ships). -The OOM's cause is not established (an AMX-path weight repack is one candidate). `K3D_GPU_VENDORS=none`; crescent C1 kubelet thresholds; node image +draft of this row sized both engines to 48 CPUs. B's memory limit is not the 16Gi of +`integrations/eat/vllm-values.yaml` (k3d-gpu's overlay, sized on the i9) but comes from +`k3d-gpu fit` (#174; `H7X_VLLM_MEM=fit`): the fit's weights (7.5 GiB) and runtime (6.0 GiB) for +this checkpoint on vLLM CPU, plus the row's 6 GiB KV, times the fit's 1.1 slack, rounded up: +22Gi on this host (`fit.json` and `vllm-mem.txt` are kept in the run directory). B and C get the +same limit. On this host vLLM was OOMKilled at 16Gi right after it allocated its 6 GiB KV cache, +at 48 and at 16 CPUs (smokes 2 and 3, below), and came up at 32Gi (smoke 4); the fit's sum (19.5 +GiB before slack) also says 16Gi is short. That is a finding for the overlay and for EAT's chart +default, recorded here and not fixed in this row. The limit is a cgroup cap; it changes no engine +setting (KV stays 6 GiB, `VLLM_CPU_SGL_KERNEL` 1 as EAT ships). Why the same 16Gi sufficed on the +i9 is not established. `K3D_GPU_VENDORS=none`; crescent C1 kubelet thresholds; node image `cryptoandcoffee/k3d-gpu:0.1.61`; models downloaded on the host at the pinned commits (`bench/xhost/fetch_models.py`). No background load, as H7 (it predates the matched-load design); the host's own serving stack is the background, recorded by `serving.py` and the @@ -1731,8 +1736,11 @@ and was not Ready in 1800 s. The likely cause, not confirmed (the failed contain kept): with compilation on, vLLM writes its compile cache under `$HOME/.cache/vllm`, which is on the chart's read-only root for its non-root user. C therefore also gets `VLLM_CACHE_ROOT=/root/.cache/vllm`, the chart's own writable cache volume, its one change besides -dropping `--enforce-eager`; `h7x.sh` now keeps the failed container's log. If C still does not -come up, the run continues without it and C/B is reported as not measured. `H7X_READY_S=1800` is used for the run, because the first vLLM +dropping `--enforce-eager` (in vLLM v0.24.0 `VLLM_CACHE_ROOT` defaults to +`$XDG_CACHE_HOME` or `~/.cache`, plus `/vllm` (`vllm/envs.py`), and the compile cache is +`VLLM_CACHE_ROOT/torch_compile_cache` (`vllm/compilation/backends.py`)); `h7x.sh` now keeps the failed container's log. If C still does not +come up, the run continues without it and C/B is reported as not measured. A fifth smoke (B and C at the fit's limit) runs before this row is merged and is +reported in its run section. `H7X_READY_S=1800` is used for the run, because the first vLLM start in a fresh cluster pulls its 7.4 GB image. **Hold.** One hold, cap 4200 s (11 blocks; a vLLM cold start is the slow step). If the cap ends @@ -1748,7 +1756,7 @@ $X/hfvenv/bin/python bench/xhost/fetch_models.py $X/models \ OpenVINO/Qwen3-4B-fp16-ov@00298f1c614ffdc000814d8cbe1b7613aa73cdca Qwen/Qwen3-4B@1cfa9a7208912126459214e8b04321603b3df60c git -C $X/eat-src checkout 0d3438d # https://github.com/intel/enterprise-agent-toolkit bench/xhost/hold.sh H7x 4200 env K3D_GPU_IMAGE=cryptoandcoffee/k3d-gpu:0.1.61 K3D_GPU_VENDORS=none \ - K3D_GPU_K3S_ARGS="$C1" K3D_GPU_CLUSTER=k3dgpu-x-h7 H7X_CPUS=16 H7X_NODE_CPUS=0-7,48-55 H7X_READY_S=1800 H7X_VLLM_MEM=32Gi \ + K3D_GPU_K3S_ARGS="$C1" K3D_GPU_CLUSTER=k3dgpu-x-h7 H7X_CPUS=16 H7X_NODE_CPUS=0-7,48-55 H7X_READY_S=1800 H7X_VLLM_MEM=fit \ APB_MODELS=$X/models APB_EAT_CHART=$X/eat-src/core/helm-charts/vllm APB_OUT=$X/runs/H7x \ bench/apb/h7x.sh ``` From 61db32a212f1f4682ea22effd0c935a262f6ad8c Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Tue, 20 Oct 2026 21:42:51 -0700 Subject: [PATCH 10/85] ledger(H7x): smoke 5 (B up at the fit's 22Gi; C cache root not writable), VLLM_CACHE_ROOT=/tmp/vllm --- EXPERIMENTS.md | 10 +++++++--- bench/apb/h7x.sh | 8 +++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index a8291797..c27c8481 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -1735,11 +1735,15 @@ B C, 16 CPUs, `H7X_VLLM_MEM=32Gi`): B Ready in 112 s on 0-7,48-55; C restarted 9 and was not Ready in 1800 s. The likely cause, not confirmed (the failed container's log was not kept): with compilation on, vLLM writes its compile cache under `$HOME/.cache/vllm`, which is on the chart's read-only root for its non-root user. C therefore also gets -`VLLM_CACHE_ROOT=/root/.cache/vllm`, the chart's own writable cache volume, its one change besides -dropping `--enforce-eager` (in vLLM v0.24.0 `VLLM_CACHE_ROOT` defaults to +`VLLM_CACHE_ROOT=/tmp/vllm`, in the chart's writable `/tmp` emptyDir (where the chart already puts +the inductor and triton caches), its one change besides dropping `--enforce-eager` (in vLLM v0.24.0 `VLLM_CACHE_ROOT` defaults to `$XDG_CACHE_HOME` or `~/.cache`, plus `/vllm` (`vllm/envs.py`), and the compile cache is `VLLM_CACHE_ROOT/torch_compile_cache` (`vllm/compilation/backends.py`)); `h7x.sh` now keeps the failed container's log. If C still does not -come up, the run continues without it and C/B is reported as not measured. A fifth smoke (B and C at the fit's limit) runs before this row is merged and is +come up, the run continues without it and C/B is reported as not measured. Smoke 5 (2026-10-21 +04:12-04:47Z, order B C, 16 CPUs, the fit's 22Gi): B Ready in 141 s; C with +`VLLM_CACHE_ROOT=/root/.cache/vllm` (the chart's cache volume) failed on +`PermissionError: [Errno 13] Permission denied: '/root/.cache'` (read with `--previous`), so the +cache root moved to `/tmp/vllm`. A sixth smoke (C only) runs before this row is merged and is reported in its run section. `H7X_READY_S=1800` is used for the run, because the first vLLM start in a fresh cluster pulls its 7.4 GB image. diff --git a/bench/apb/h7x.sh b/bench/apb/h7x.sh index 76ca4603..cb438691 100755 --- a/bench/apb/h7x.sh +++ b/bench/apb/h7x.sh @@ -89,9 +89,11 @@ for d in docs: if c.get(key) and "--enforce-eager" in c[key]: c[key] = [a for a in c[key] if a != "--enforce-eager"]; n += 1 # With compilation on, vLLM writes its compile cache under VLLM_CACHE_ROOT, by default - # $HOME/.cache/vllm, on the chart's read-only root; point it at the chart's own - # writable /root/.cache/vllm volume. - c.setdefault("env", []).append({"name": "VLLM_CACHE_ROOT", "value": "/root/.cache/vllm"}) + # $HOME/.cache/vllm, on the chart's read-only root. The chart's /root/.cache/vllm + # volume is not reachable for its non-root user (/root/.cache: permission denied, smoke + # 5), so point it into the chart's writable /tmp emptyDir, where the chart already + # puts the torch inductor and triton caches. + c.setdefault("env", []).append({"name": "VLLM_CACHE_ROOT", "value": "/tmp/vllm"}) # C's own selector label, so the two Deployments never share pods. d["spec"]["selector"].setdefault("matchLabels", {})["h7x-arm"] = "c" d["spec"]["template"]["metadata"].setdefault("labels", {})["h7x-arm"] = "c" From 7b8142eedcff7364fb0411c57bce5c9d11502a61 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Tue, 20 Oct 2026 23:08:44 -0700 Subject: [PATCH 11/85] H7x: setup smoke records 1-5 --- .../smoke1/h7x-20261020-225730/agent.err | 1 + .../smoke1/h7x-20261020-225730/agent.yaml | 104 +++++ .../smoke1/h7x-20261020-225730/cpus.txt | 1 + .../smoke1/h7x-20261020-225730/eat.yaml | 253 ++++++++++ .../smoke1/h7x-20261020-225730/image.txt | 1 + .../smoke1/h7x-20261020-225730/node-cpus.txt | 1 + .../smoke1/h7x-20261020-225730/notes.txt | 2 + .../smoke1/h7x-20261020-225730/ovms.yaml | 89 ++++ .../smoke1/h7x-20261020-225730/values.yaml | 437 ++++++++++++++++++ .../smoke1/h7x-20261020-225730/vllm-c.err | 0 .../smoke1/h7x-20261020-225730/vllm-c.yaml | 175 +++++++ .../smoke1/h7x-20261020-225730/vllm.yaml | 173 +++++++ .../2026-10-21/H7x-smokes/smoke1/post.txt | 16 + .../2026-10-21/H7x-smokes/smoke1/pre.txt | 16 + .../results/2026-10-21/H7x-smokes/smoke1/rc | 1 + .../H7x-smokes/smoke1/serving.jsonl | 99 ++++ .../2026-10-21/H7x-smokes/smoke1/wait_s | 1 + .../smoke2/h7x-20261020-233558/agent.err | 1 + .../smoke2/h7x-20261020-233558/agent.yaml | 104 +++++ .../smoke2/h7x-20261020-233558/eat.yaml | 253 ++++++++++ .../smoke2/h7x-20261020-233558/node-cpus.txt | 1 + .../smoke2/h7x-20261020-233558/notes.txt | 190 ++++++++ .../smoke2/h7x-20261020-233558/ovms.yaml | 89 ++++ .../smoke2/h7x-20261020-233558/values.yaml | 437 ++++++++++++++++++ .../smoke2/h7x-20261020-233558/vllm-c.err | 0 .../smoke2/h7x-20261020-233558/vllm-c.yaml | 175 +++++++ .../smoke2/h7x-20261020-233558/vllm.yaml | 173 +++++++ .../2026-10-21/H7x-smokes/smoke2/post.txt | 16 + .../2026-10-21/H7x-smokes/smoke2/pre.txt | 16 + .../results/2026-10-21/H7x-smokes/smoke2/rc | 1 + .../H7x-smokes/smoke2/serving.jsonl | 186 ++++++++ .../2026-10-21/H7x-smokes/smoke2/wait_s | 1 + .../smoke3/h7x-20261021-002504/agent.err | 1 + .../smoke3/h7x-20261021-002504/agent.yaml | 104 +++++ .../smoke3/h7x-20261021-002504/cpus.txt | 1 + .../smoke3/h7x-20261021-002504/eat.yaml | 253 ++++++++++ .../smoke3/h7x-20261021-002504/image.txt | 1 + .../smoke3/h7x-20261021-002504/node-cpus.txt | 1 + .../smoke3/h7x-20261021-002504/notes.txt | 193 ++++++++ .../smoke3/h7x-20261021-002504/ovms.yaml | 89 ++++ .../smoke3/h7x-20261021-002504/values.yaml | 437 ++++++++++++++++++ .../smoke3/h7x-20261021-002504/vllm-c.err | 0 .../smoke3/h7x-20261021-002504/vllm-c.yaml | 175 +++++++ .../smoke3/h7x-20261021-002504/vllm.yaml | 173 +++++++ .../2026-10-21/H7x-smokes/smoke3/post.txt | 16 + .../2026-10-21/H7x-smokes/smoke3/pre.txt | 16 + .../results/2026-10-21/H7x-smokes/smoke3/rc | 1 + .../H7x-smokes/smoke3/serving.jsonl | 191 ++++++++ .../2026-10-21/H7x-smokes/smoke3/wait_s | 1 + .../smoke4/h7x-20261021-031357/agent.err | 1 + .../smoke4/h7x-20261021-031357/agent.yaml | 104 +++++ .../smoke4/h7x-20261021-031357/commit.txt | 1 + .../smoke4/h7x-20261021-031357/cpus.txt | 1 + .../smoke4/h7x-20261021-031357/eat.yaml | 253 ++++++++++ .../smoke4/h7x-20261021-031357/image.txt | 1 + .../smoke4/h7x-20261021-031357/node-cpus.txt | 1 + .../smoke4/h7x-20261021-031357/node-image.txt | 1 + .../smoke4/h7x-20261021-031357/notes.txt | 185 ++++++++ .../smoke4/h7x-20261021-031357/ovms.yaml | 89 ++++ .../smoke4/h7x-20261021-031357/values.yaml | 437 ++++++++++++++++++ .../smoke4/h7x-20261021-031357/vllm-c.err | 0 .../smoke4/h7x-20261021-031357/vllm-c.yaml | 175 +++++++ .../smoke4/h7x-20261021-031357/vllm.yaml | 173 +++++++ .../2026-10-21/H7x-smokes/smoke4/post.txt | 16 + .../2026-10-21/H7x-smokes/smoke4/pre.txt | 16 + .../results/2026-10-21/H7x-smokes/smoke4/rc | 1 + .../H7x-smokes/smoke4/serving.jsonl | 196 ++++++++ .../2026-10-21/H7x-smokes/smoke4/wait_s | 1 + .../smoke5/h7x-20261021-041226/agent.err | 2 + .../smoke5/h7x-20261021-041226/agent.yaml | 109 +++++ .../smoke5/h7x-20261021-041226/commit.txt | 1 + .../smoke5/h7x-20261021-041226/cpus.txt | 1 + .../smoke5/h7x-20261021-041226/eat.yaml | 253 ++++++++++ .../smoke5/h7x-20261021-041226/fit.json | 132 ++++++ .../smoke5/h7x-20261021-041226/image.txt | 1 + .../smoke5/h7x-20261021-041226/node-cpus.txt | 1 + .../smoke5/h7x-20261021-041226/node-image.txt | 1 + .../smoke5/h7x-20261021-041226/notes.txt | 263 +++++++++++ .../smoke5/h7x-20261021-041226/ovms.yaml | 94 ++++ .../smoke5/h7x-20261021-041226/values.yaml | 437 ++++++++++++++++++ .../smoke5/h7x-20261021-041226/vllm-c.err | 0 .../smoke5/h7x-20261021-041226/vllm-c.yaml | 178 +++++++ .../smoke5/h7x-20261021-041226/vllm-mem.txt | 1 + .../smoke5/h7x-20261021-041226/vllm.yaml | 173 +++++++ .../2026-10-21/H7x-smokes/smoke5/post.txt | 16 + .../2026-10-21/H7x-smokes/smoke5/pre.txt | 16 + .../results/2026-10-21/H7x-smokes/smoke5/rc | 1 + .../H7x-smokes/smoke5/serving.jsonl | 200 ++++++++ .../2026-10-21/H7x-smokes/smoke5/wait_s | 1 + 89 files changed, 8199 insertions(+) create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/agent.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/agent.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/eat.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/image.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/node-cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/notes.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/ovms.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/values.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm-c.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm-c.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/post.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/pre.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/rc create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/serving.jsonl create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke1/wait_s create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/agent.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/agent.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/eat.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/node-cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/notes.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/ovms.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/values.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm-c.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm-c.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/post.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/pre.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/rc create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/serving.jsonl create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke2/wait_s create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/agent.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/agent.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/eat.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/image.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/node-cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/notes.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/ovms.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/values.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/vllm-c.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/vllm-c.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/vllm.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/post.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/pre.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/rc create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/serving.jsonl create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke3/wait_s create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/agent.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/agent.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/commit.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/eat.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/image.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/node-cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/node-image.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/notes.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/ovms.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/values.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm-c.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm-c.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/post.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/pre.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/rc create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/serving.jsonl create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke4/wait_s create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/agent.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/agent.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/commit.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/eat.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/fit.json create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/image.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/node-cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/node-image.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/notes.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/ovms.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/values.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-c.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-c.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-mem.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/post.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/pre.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/rc create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/serving.jsonl create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke5/wait_s diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/agent.err b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/agent.err new file mode 100644 index 00000000..a5632022 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/agent.err @@ -0,0 +1 @@ +==> agent: OpenVINO/Qwen3-4B-fp16-ov as 'Qwen3-4B-fp16-ov' on CPU, 48 CPU(s) diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/agent.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/agent.yaml new file mode 100644 index 00000000..fb6896df --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/agent.yaml @@ -0,0 +1,104 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +# Models and the compiled-model cache live here, so restarts never re-download. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ovms-models + namespace: k3d-gpu-agent +spec: + accessModes: [ReadWriteOnce] + resources: + requests: + storage: 20Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + # --pull downloads the model once and writes its graph.pbtxt (device, + # parsers). On later starts the files are already there and only the + # graph is rewritten, so a device change takes effect with no download. + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + # No liveness probe: compiling a model for a GPU takes minutes. + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: "48" + memory: 6Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + persistentVolumeClaim: + claimName: ovms-models +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/cpus.txt new file mode 100644 index 00000000..09de8fda --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/cpus.txt @@ -0,0 +1 @@ +A Cpus_allowed_list: 0-23,48-71 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/eat.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/eat.yaml new file mode 100644 index 00000000..0c5bb018 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/eat.yaml @@ -0,0 +1,253 @@ +--- +# Source: vllm/templates/secret.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: Secret +metadata: + name: vllm-qwen-3-4b-cpu-secret + labels: + app: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +type: Opaque +data: +--- +# Source: vllm/templates/configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +data: + http_proxy: "" + https_proxy: "" + no_proxy: "" + TORCHINDUCTOR_CACHE_DIR: "/tmp" + NUMBA_CACHE_DIR: "/tmp" + HF_HOME: "/data" + OUTLINES_CACHE_DIR: "/tmp/.cache/outlines" + VLLM_NO_USAGE_STATS: "1" + DO_NOT_TRACK: "1" + HF_HUB_DISABLE_XET: "1" + TORCH_INDUCTOR_CACHE_DIR: "/tmp/torchinductor_cache" + TRITON_CACHE_DIR: "/tmp/.triton" + USER: "vllm" + VLLM_ALLOW_LONG_MAX_MODEL_LEN: "1" + VLLM_CPU_KVCACHE_SPACE: "6" + VLLM_CPU_NUM_OF_RESERVED_CPU: "0" + VLLM_CPU_SGL_KERNEL: "1" + VLLM_ENGINE_ITERATION_TIMEOUT_S: "120" + VLLM_RPC_TIMEOUT: "100000" +--- +# Source: vllm/templates/pvc.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: vllm-qwen-3-4b-cpu-pvc + namespace: default +spec: + accessModes: + - ReadWriteOnce + storageClassName: local-path + resources: + requests: + storage: 250Gi # Adjust this according to model storage size +--- +# Source: vllm/templates/service.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +# Source: vllm/templates/deployment.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: "performance" + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + # + # serviceAccountName: default + securityContext: + null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + - secretRef: + name: vllm-qwen-3-4b-cpu-secret + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" + imagePullPolicy: IfNotPresent + # command: + # - /bin/bash + # - -c + # - | + # python3 -m vllm.entrypoints.openai.api_server --dtype bfloat16 --model Qwen/Qwen3-4B --port 2080 --tensor-parallel-size 1 --block-size 128 --max-model-len 8192 --disable-log-requests + args: + - "--block-size" + - "128" + - "--dtype" + - "bfloat16" + - "--distributed_executor_backend" + - "mp" + - "--enable_chunked_prefill" + - "--enforce-eager" + - "--max-num-batched-tokens" + - "2048" + - "--max-num-seqs" + - "256" + - "--enable-prefix-caching" + # CPU deployment - add parallelism settings + - "--tensor-parallel-size" + - "1" + - "--pipeline-parallel-size" + - "1" + - "--model" + - "Qwen/Qwen3-4B" + - --served-model-name + - "Qwen/Qwen3-4B" + - "--port" + - "2080" + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 98 + httpGet: + path: /health + port: http + initialDelaySeconds: 120 + periodSeconds: 30 + resources: + requests: + cpu: "48" + memory: "16Gi" + limits: + cpu: "48" + memory: "16Gi" + + volumes: + - name: model-volume + persistentVolumeClaim: + claimName: vllm-qwen-3-4b-cpu-pvc + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - "true" + # extra time to finish processing buffered requests on CPU before pod is forcibly terminated + terminationGracePeriodSeconds: 120 +--- +# Source: vllm/templates/apisixroutes.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/chat-template-configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/ingress.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# Please edit the object below. Lines beginning with a '#' will be ignored, +# and an empty file will abort the edit. If an error occurs while saving this file will be +# reopened with the relevant failures. +--- +# Source: vllm/templates/ingress_eks.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/route.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/servicemonitor.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/image.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/image.txt new file mode 100644 index 00000000..da78ab5c --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/image.txt @@ -0,0 +1 @@ +openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 docker.io/openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 ["--rest_port=8000","--model_path=/models/OpenVINO/Qwen3-4B-fp16-ov","--model_name=Qwen3-4B-fp16-ov","--cache_dir=/models/.ov_cache","--log_level=INFO"] diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/node-cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/node-cpus.txt new file mode 100644 index 00000000..93544bfd --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/node-cpus.txt @@ -0,0 +1 @@ +node cpuset 0-23,48-71 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/notes.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/notes.txt new file mode 100644 index 00000000..2a1bd789 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/notes.txt @@ -0,0 +1,2 @@ +block 2 engine B did not come up +No resources found in k3d-gpu-agent namespace. diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/ovms.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/ovms.yaml new file mode 100644 index 00000000..c9c1bb61 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/ovms.yaml @@ -0,0 +1,89 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: '48' + memory: 6Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + hostPath: + path: /var/apb-models + type: Directory +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/values.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/values.yaml new file mode 100644 index 00000000..c1dc074b --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/values.yaml @@ -0,0 +1,437 @@ +accelDevice: '' +cpu_balloon_annotation: performance +resources: + requests: + cpu: '{{ .Values.cpu }}' + memory: '{{ .Values.memory }}' +block_size: 128 +max_num_seqs: 256 +max_seq_len_to_capture: 2048 +d_type: bfloat16 +max_model_len: 8192 +image: + repository: vllm/vllm-openai-cpu + tag: v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + pullPolicy: IfNotPresent +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' +VLLM_CPU_SGL_KERNEL: '1' +VLLM_NO_USAGE_STATS: 1 +DO_NOT_TRACK: 1 +LLM_MODEL_ID: '' +modelConfigs: + meta-llama/Llama-3.1-8B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + HF_HUB_DISABLE_XET: '1' + VLLM_CPU_SGL_KERNEL: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + speculativeConfig: '{"method":"draft_model","model":"meta-llama/Llama-3.2-1B-Instruct","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + meta-llama/Llama-3.2-3B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + deepseek-ai/DeepSeek-R1-Distill-Qwen-32B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + deepseek-ai/DeepSeek-R1-Distill-Llama-8B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-1.7B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - hermes + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-4B-Instruct-2507: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - hermes + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen2.5-Coder-7B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_coder + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-Coder-30B-A3B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '2' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --trust-remote-code + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + speculativeConfig: '{"method":"draft_model","model":"Qwen/Qwen3-0.6B","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen2.5-Coder-14B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCHDYNAMO_DISABLE: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + speculativeConfig: '{"method":"draft_model","model":"Qwen/Qwen2.5-Coder-0.5B-Instruct","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + HF_HUB_OFFLINE: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-30B-A3B-Instruct-2507: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + HF_HUB_DISABLE_XET: '1' + VLLM_CPU_SGL_KERNEL: '1' + TRITON_CACHE_DIR: /tmp/.triton + TORCHINDUCTOR_CACHE_DIR: /tmp/.torch_compile + XDG_CACHE_HOME: /tmp/.cache + HF_HOME: /tmp/.cache/huggingface + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + google/gemma-4-26B-A4B-it: + configMapValues: + TRITON_CACHE_DIR: /tmp/.triton + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - gemma4 + - --chat-template + - /workspace/vllm/examples/tool_chat_template_gemma4.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + openai/whisper-small: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCHDYNAMO_DISABLE: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + XDG_CACHE_HOME: /tmp/.cache + HF_HOME: /tmp/huggingface + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --dtype + - float32 + - --enforce-eager + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' +defaultModelConfigs: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' +memory: 16Gi +cpu: '8' diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm-c.err b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm-c.err new file mode 100644 index 00000000..e69de29b diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm-c.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm-c.yaml new file mode 100644 index 00000000..4cc2806f --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm-c.yaml @@ -0,0 +1,175 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-c-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +data: + http_proxy: '' + https_proxy: '' + no_proxy: '' + TORCHINDUCTOR_CACHE_DIR: /tmp + NUMBA_CACHE_DIR: /tmp + HF_HOME: /data + OUTLINES_CACHE_DIR: /tmp/.cache/outlines + VLLM_NO_USAGE_STATS: '1' + DO_NOT_TRACK: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_RPC_TIMEOUT: '100000' + HF_HUB_OFFLINE: '1' +--- +apiVersion: v1 +kind: Service +metadata: + name: vllm-c-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + h7x-arm: c +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-c + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + h7x-arm: c + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: performance + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + h7x-arm: c + spec: + securityContext: null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + imagePullPolicy: IfNotPresent + args: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --tensor-parallel-size + - '1' + - --pipeline-parallel-size + - '1' + - --model + - /data/Qwen3-4B + - --served-model-name + - Qwen/Qwen3-4B + - --port + - '2080' + - --max-model-len + - '32768' + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 200 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: '48' + memory: 16Gi + limits: + cpu: '48' + memory: 16Gi + volumes: + - name: model-volume + hostPath: + path: /var/apb-models + type: Directory + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' + terminationGracePeriodSeconds: 120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm.yaml new file mode 100644 index 00000000..304325c2 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/h7x-20261020-225730/vllm.yaml @@ -0,0 +1,173 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +data: + http_proxy: '' + https_proxy: '' + no_proxy: '' + TORCHINDUCTOR_CACHE_DIR: /tmp + NUMBA_CACHE_DIR: /tmp + HF_HOME: /data + OUTLINES_CACHE_DIR: /tmp/.cache/outlines + VLLM_NO_USAGE_STATS: '1' + DO_NOT_TRACK: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_RPC_TIMEOUT: '100000' + HF_HUB_OFFLINE: '1' +--- +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: performance + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + securityContext: null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + imagePullPolicy: IfNotPresent + args: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --tensor-parallel-size + - '1' + - --pipeline-parallel-size + - '1' + - --model + - /data/Qwen3-4B + - --served-model-name + - Qwen/Qwen3-4B + - --port + - '2080' + - --max-model-len + - '32768' + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 200 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: '48' + memory: 16Gi + limits: + cpu: '48' + memory: 16Gi + volumes: + - name: model-volume + hostPath: + path: /var/apb-models + type: Directory + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' + terminationGracePeriodSeconds: 120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/post.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/post.txt new file mode 100644 index 00000000..e6a66ff5 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/post.txt @@ -0,0 +1,16 @@ +2026-10-20T23:13:58Z + 23:13:58 up 35 days, 28 min, 11 users, load average: 2.33, 3.27, 6.69 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +41.9 3899938 root sglang::schedul +39.6 3900351 root sglang::schedul +24.3 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 3.5 4127548 root cloudflared + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3417441260 219645104 94% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/pre.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/pre.txt new file mode 100644 index 00000000..75776ec7 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/pre.txt @@ -0,0 +1,16 @@ +2026-10-20T22:57:30Z + 22:57:30 up 35 days, 11 min, 10 users, load average: 4.49, 14.46, 13.03 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +41.9 3899938 root sglang::schedul +39.6 3900351 root sglang::schedul +24.3 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3401983828 235102536 94% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/rc b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/rc new file mode 100644 index 00000000..0cfbf088 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/rc @@ -0,0 +1 @@ +2 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/serving.jsonl b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/serving.jsonl new file mode 100644 index 00000000..90b06292 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/serving.jsonl @@ -0,0 +1,99 @@ +{"ts": 1792537060.759, "seconds": 10.0, "load1": 11.22, "cpu": {"qwen38-b-hr": 1.013, "qwen38-a-hr": 1.176, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.058, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.487, "aiperf_procs": 0} +{"ts": 1792537070.789, "seconds": 10.031, "load1": 9.8, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.158, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.411, "aiperf_procs": 0} +{"ts": 1792537080.822, "seconds": 10.032, "load1": 8.37, "cpu": {"qwen38-b-hr": 1.005, "qwen38-a-hr": 1.121, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.397, "aiperf_procs": 0} +{"ts": 1792537090.851, "seconds": 10.029, "load1": 7.46, "cpu": {"qwen38-b-hr": 0.969, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.002}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792537100.886, "seconds": 10.035, "load1": 6.92, "cpu": {"qwen38-b-hr": 0.963, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.354, "aiperf_procs": 0} +{"ts": 1792537110.915, "seconds": 10.028, "load1": 6.31, "cpu": {"qwen38-b-hr": 0.993, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.016, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.389, "aiperf_procs": 0} +{"ts": 1792537121.026, "seconds": 10.112, "load1": 5.97, "cpu": {"qwen38-b-hr": 0.952, "qwen38-a-hr": 1.12, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.0, "loki": 0.049, "xpumd": 0.003}, "serving_cpu": 2.369, "aiperf_procs": 0} +{"ts": 1792537131.056, "seconds": 10.03, "load1": 5.58, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.028, "xpumd": 0.002}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792537141.089, "seconds": 10.032, "load1": 5.56, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.373, "aiperf_procs": 0} +{"ts": 1792537151.12, "seconds": 10.031, "load1": 5.31, "cpu": {"qwen38-b-hr": 0.948, "qwen38-a-hr": 1.111, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.321, "aiperf_procs": 0} +{"ts": 1792537161.15, "seconds": 10.03, "load1": 5.25, "cpu": {"qwen38-b-hr": 0.968, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.344, "aiperf_procs": 0} +{"ts": 1792537171.182, "seconds": 10.032, "load1": 5.2, "cpu": {"qwen38-b-hr": 0.967, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.002}, "serving_cpu": 2.354, "aiperf_procs": 0} +{"ts": 1792537181.285, "seconds": 10.103, "load1": 4.78, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.102, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.009, "xpumd": 0.002}, "serving_cpu": 2.349, "aiperf_procs": 0} +{"ts": 1792537191.317, "seconds": 10.032, "load1": 4.51, "cpu": {"qwen38-b-hr": 0.975, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.361, "aiperf_procs": 0} +{"ts": 1792537201.349, "seconds": 10.032, "load1": 4.29, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.102, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.058, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.411, "aiperf_procs": 0} +{"ts": 1792537211.38, "seconds": 10.031, "load1": 4.17, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.375, "aiperf_procs": 0} +{"ts": 1792537221.408, "seconds": 10.029, "load1": 4.22, "cpu": {"qwen38-b-hr": 0.963, "qwen38-a-hr": 1.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.336, "aiperf_procs": 0} +{"ts": 1792537231.438, "seconds": 10.03, "load1": 4.03, "cpu": {"qwen38-b-hr": 0.965, "qwen38-a-hr": 1.09, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.016, "xpumd": 0.003}, "serving_cpu": 2.331, "aiperf_procs": 0} +{"ts": 1792537241.556, "seconds": 10.118, "load1": 5.73, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.137, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.009, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.395, "aiperf_procs": 0} +{"ts": 1792537251.59, "seconds": 10.034, "load1": 5.16, "cpu": {"qwen38-b-hr": 0.94, "qwen38-a-hr": 1.09, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.284, "aiperf_procs": 0} +{"ts": 1792537261.634, "seconds": 10.044, "load1": 4.91, "cpu": {"qwen38-b-hr": 0.966, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.359, "aiperf_procs": 0} +{"ts": 1792537271.665, "seconds": 10.031, "load1": 4.47, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.163, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.022, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.42, "aiperf_procs": 0} +{"ts": 1792537281.696, "seconds": 10.031, "load1": 4.01, "cpu": {"qwen38-b-hr": 0.943, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.308, "aiperf_procs": 0} +{"ts": 1792537291.73, "seconds": 10.035, "load1": 3.85, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.344, "aiperf_procs": 0} +{"ts": 1792537301.838, "seconds": 10.108, "load1": 5.18, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.035, "prometheus": 0.008, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.409, "aiperf_procs": 0} +{"ts": 1792537311.872, "seconds": 10.033, "load1": 4.53, "cpu": {"qwen38-b-hr": 0.959, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.328, "aiperf_procs": 0} +{"ts": 1792537321.903, "seconds": 10.032, "load1": 4.38, "cpu": {"qwen38-b-hr": 0.953, "qwen38-a-hr": 1.105, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.016, "xpumd": 0.003}, "serving_cpu": 2.324, "aiperf_procs": 0} +{"ts": 1792537331.935, "seconds": 10.032, "load1": 4.09, "cpu": {"qwen38-b-hr": 0.994, "qwen38-a-hr": 1.113, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.366, "aiperf_procs": 0} +{"ts": 1792537341.965, "seconds": 10.03, "load1": 3.76, "cpu": {"qwen38-b-hr": 0.956, "qwen38-a-hr": 1.113, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.014, "xpumd": 0.003}, "serving_cpu": 2.332, "aiperf_procs": 0} +{"ts": 1792537351.996, "seconds": 10.03, "load1": 3.49, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.371, "aiperf_procs": 0} +{"ts": 1792537362.118, "seconds": 10.122, "load1": 5.27, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.008, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.004}, "serving_cpu": 2.4, "aiperf_procs": 0} +{"ts": 1792537372.434, "seconds": 10.316, "load1": 5.07, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.104, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.358, "aiperf_procs": 0} +{"ts": 1792537382.464, "seconds": 10.03, "load1": 4.98, "cpu": {"qwen38-b-hr": 0.993, "qwen38-a-hr": 1.161, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.0, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.019, "xpumd": 0.003}, "serving_cpu": 2.415, "aiperf_procs": 0} +{"ts": 1792537392.496, "seconds": 10.032, "load1": 4.9, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.162, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792537402.525, "seconds": 10.029, "load1": 4.84, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.356, "aiperf_procs": 0} +{"ts": 1792537412.558, "seconds": 10.033, "load1": 5.35, "cpu": {"qwen38-b-hr": 0.968, "qwen38-a-hr": 1.156, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.376, "aiperf_procs": 0} +{"ts": 1792537422.682, "seconds": 10.124, "load1": 4.9, "cpu": {"qwen38-b-hr": 0.954, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.323, "aiperf_procs": 0} +{"ts": 1792537432.708, "seconds": 10.027, "load1": 5.25, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.169, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792537442.738, "seconds": 10.03, "load1": 6.81, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.164, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.012, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.416, "aiperf_procs": 0} +{"ts": 1792537452.773, "seconds": 10.035, "load1": 6.0, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.378, "aiperf_procs": 0} +{"ts": 1792537462.805, "seconds": 10.032, "load1": 5.16, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.397, "aiperf_procs": 0} +{"ts": 1792537472.835, "seconds": 10.03, "load1": 4.66, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.152, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.398, "aiperf_procs": 0} +{"ts": 1792537482.93, "seconds": 10.095, "load1": 4.11, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.202, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.002}, "serving_cpu": 2.489, "aiperf_procs": 0} +{"ts": 1792537492.965, "seconds": 10.035, "load1": 3.79, "cpu": {"qwen38-b-hr": 1.012, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.41, "aiperf_procs": 0} +{"ts": 1792537502.998, "seconds": 10.034, "load1": 3.75, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.124, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.375, "aiperf_procs": 0} +{"ts": 1792537513.027, "seconds": 10.029, "load1": 3.63, "cpu": {"qwen38-b-hr": 0.982, "qwen38-a-hr": 1.115, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.35, "aiperf_procs": 0} +{"ts": 1792537523.06, "seconds": 10.032, "load1": 3.3, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.369, "aiperf_procs": 0} +{"ts": 1792537533.094, "seconds": 10.035, "load1": 3.25, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.154, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.411, "aiperf_procs": 0} +{"ts": 1792537543.212, "seconds": 10.118, "load1": 3.13, "cpu": {"qwen38-b-hr": 1.025, "qwen38-a-hr": 1.177, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.185, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.024, "drm-exporter": 0.001, "loki": 0.033, "xpumd": 0.003}, "serving_cpu": 2.521, "aiperf_procs": 0} +{"ts": 1792537553.246, "seconds": 10.034, "load1": 2.96, "cpu": {"qwen38-b-hr": 0.978, "qwen38-a-hr": 1.076, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.026, "xpumd": 0.002}, "serving_cpu": 2.324, "aiperf_procs": 0} +{"ts": 1792537563.28, "seconds": 10.034, "load1": 2.83, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.021, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.003}, "serving_cpu": 2.408, "aiperf_procs": 0} +{"ts": 1792537573.31, "seconds": 10.029, "load1": 2.61, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792537583.339, "seconds": 10.029, "load1": 2.36, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.124, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.357, "aiperf_procs": 0} +{"ts": 1792537593.372, "seconds": 10.033, "load1": 2.22, "cpu": {"qwen38-b-hr": 0.972, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.002}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792537603.489, "seconds": 10.117, "load1": 1.96, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.156, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.403, "aiperf_procs": 0} +{"ts": 1792537613.52, "seconds": 10.031, "load1": 1.66, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.375, "aiperf_procs": 0} +{"ts": 1792537623.55, "seconds": 10.03, "load1": 1.95, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.149, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.406, "aiperf_procs": 0} +{"ts": 1792537633.581, "seconds": 10.031, "load1": 2.27, "cpu": {"qwen38-b-hr": 0.95, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.348, "aiperf_procs": 0} +{"ts": 1792537643.616, "seconds": 10.035, "load1": 2.62, "cpu": {"qwen38-b-hr": 0.942, "qwen38-a-hr": 1.092, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.028, "xpumd": 0.003}, "serving_cpu": 2.308, "aiperf_procs": 0} +{"ts": 1792537653.646, "seconds": 10.031, "load1": 2.98, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.375, "aiperf_procs": 0} +{"ts": 1792537663.762, "seconds": 10.116, "load1": 3.56, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.367, "aiperf_procs": 0} +{"ts": 1792537673.796, "seconds": 10.034, "load1": 5.56, "cpu": {"qwen38-b-hr": 0.972, "qwen38-a-hr": 1.1, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.33, "aiperf_procs": 0} +{"ts": 1792537683.827, "seconds": 10.03, "load1": 4.93, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.168, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.01}, "serving_cpu": 2.437, "aiperf_procs": 0} +{"ts": 1792537693.86, "seconds": 10.033, "load1": 4.7, "cpu": {"qwen38-b-hr": 0.948, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.009, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.321, "aiperf_procs": 0} +{"ts": 1792537703.889, "seconds": 10.029, "load1": 4.29, "cpu": {"qwen38-b-hr": 0.954, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.336, "aiperf_procs": 0} +{"ts": 1792537713.92, "seconds": 10.031, "load1": 3.78, "cpu": {"qwen38-b-hr": 0.97, "qwen38-a-hr": 1.169, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.407, "aiperf_procs": 0} +{"ts": 1792537724.028, "seconds": 10.107, "load1": 3.2, "cpu": {"qwen38-b-hr": 0.993, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.03, "xpumd": 0.001}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792537734.058, "seconds": 10.03, "load1": 3.1, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.364, "aiperf_procs": 0} +{"ts": 1792537744.089, "seconds": 10.031, "load1": 2.69, "cpu": {"qwen38-b-hr": 0.97, "qwen38-a-hr": 1.114, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.333, "aiperf_procs": 0} +{"ts": 1792537754.12, "seconds": 10.031, "load1": 2.28, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.364, "aiperf_procs": 0} +{"ts": 1792537764.151, "seconds": 10.032, "load1": 1.93, "cpu": {"qwen38-b-hr": 0.964, "qwen38-a-hr": 1.149, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.021, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.384, "aiperf_procs": 0} +{"ts": 1792537774.185, "seconds": 10.034, "load1": 1.71, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.15, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792537784.299, "seconds": 10.114, "load1": 1.6, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792537794.331, "seconds": 10.032, "load1": 1.66, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.113, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.002}, "serving_cpu": 2.38, "aiperf_procs": 0} +{"ts": 1792537804.362, "seconds": 10.031, "load1": 1.65, "cpu": {"qwen38-b-hr": 0.961, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.012, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.351, "aiperf_procs": 0} +{"ts": 1792537814.393, "seconds": 10.031, "load1": 1.47, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.367, "aiperf_procs": 0} +{"ts": 1792537824.424, "seconds": 10.031, "load1": 1.47, "cpu": {"qwen38-b-hr": 0.949, "qwen38-a-hr": 1.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.32, "aiperf_procs": 0} +{"ts": 1792537834.454, "seconds": 10.031, "load1": 1.46, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.016, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792537844.561, "seconds": 10.107, "load1": 1.55, "cpu": {"qwen38-b-hr": 0.972, "qwen38-a-hr": 1.103, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.332, "aiperf_procs": 0} +{"ts": 1792537854.593, "seconds": 10.032, "load1": 1.46, "cpu": {"qwen38-b-hr": 0.948, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.023, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.354, "aiperf_procs": 0} +{"ts": 1792537864.624, "seconds": 10.03, "load1": 1.63, "cpu": {"qwen38-b-hr": 0.949, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.317, "aiperf_procs": 0} +{"ts": 1792537874.653, "seconds": 10.03, "load1": 2.3, "cpu": {"qwen38-b-hr": 0.943, "qwen38-a-hr": 1.056, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.259, "aiperf_procs": 0} +{"ts": 1792537884.686, "seconds": 10.032, "load1": 2.65, "cpu": {"qwen38-b-hr": 0.928, "qwen38-a-hr": 1.07, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.257, "aiperf_procs": 0} +{"ts": 1792537894.715, "seconds": 10.03, "load1": 2.86, "cpu": {"qwen38-b-hr": 0.961, "qwen38-a-hr": 1.081, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.182, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.311, "aiperf_procs": 0} +{"ts": 1792537904.804, "seconds": 10.089, "load1": 2.96, "cpu": {"qwen38-b-hr": 0.932, "qwen38-a-hr": 1.114, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.303, "aiperf_procs": 0} +{"ts": 1792537914.833, "seconds": 10.029, "load1": 3.04, "cpu": {"qwen38-b-hr": 0.886, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.023, "xpumd": 0.003}, "serving_cpu": 2.291, "aiperf_procs": 0} +{"ts": 1792537924.862, "seconds": 10.029, "load1": 3.26, "cpu": {"qwen38-b-hr": 0.885, "qwen38-a-hr": 1.051, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.202, "aiperf_procs": 0} +{"ts": 1792537934.892, "seconds": 10.03, "load1": 3.51, "cpu": {"qwen38-b-hr": 0.892, "qwen38-a-hr": 1.056, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.201, "aiperf_procs": 0} +{"ts": 1792537944.924, "seconds": 10.032, "load1": 3.35, "cpu": {"qwen38-b-hr": 0.901, "qwen38-a-hr": 1.064, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.222, "aiperf_procs": 0} +{"ts": 1792537954.955, "seconds": 10.031, "load1": 3.07, "cpu": {"qwen38-b-hr": 0.879, "qwen38-a-hr": 1.05, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.027, "drm-exporter": 0.001, "loki": 0.047, "xpumd": 0.003}, "serving_cpu": 2.262, "aiperf_procs": 0} +{"ts": 1792537965.06, "seconds": 10.105, "load1": 3.12, "cpu": {"qwen38-b-hr": 0.92, "qwen38-a-hr": 1.029, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.02, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.018, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.031, "xpumd": 0.002}, "serving_cpu": 2.247, "aiperf_procs": 0} +{"ts": 1792537975.09, "seconds": 10.03, "load1": 2.94, "cpu": {"qwen38-b-hr": 0.93, "qwen38-a-hr": 1.049, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.234, "aiperf_procs": 0} +{"ts": 1792537985.121, "seconds": 10.031, "load1": 2.81, "cpu": {"qwen38-b-hr": 0.908, "qwen38-a-hr": 1.043, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.014, "xpumd": 0.002}, "serving_cpu": 2.216, "aiperf_procs": 0} +{"ts": 1792537995.152, "seconds": 10.032, "load1": 2.85, "cpu": {"qwen38-b-hr": 0.908, "qwen38-a-hr": 1.073, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.021, "xpumd": 0.003}, "serving_cpu": 2.254, "aiperf_procs": 0} +{"ts": 1792538005.184, "seconds": 10.032, "load1": 2.72, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.157, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.403, "aiperf_procs": 0} +{"ts": 1792538015.213, "seconds": 10.029, "load1": 2.61, "cpu": {"qwen38-b-hr": 0.994, "qwen38-a-hr": 1.137, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.009, "xpumd": 0.003}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792538025.322, "seconds": 10.109, "load1": 2.67, "cpu": {"qwen38-b-hr": 0.993, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792538035.352, "seconds": 10.03, "load1": 2.33, "cpu": {"qwen38-b-hr": 1.013, "qwen38-a-hr": 1.164, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.008, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.027, "xpumd": 0.003}, "serving_cpu": 2.453, "aiperf_procs": 0} +{"ts": 1792538045.381, "seconds": 10.028, "load1": 2.36, "cpu": {"qwen38-b-hr": 1.01, "qwen38-a-hr": 1.164, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.059, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.034, "prometheus": 0.011, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.49, "aiperf_procs": 0} diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/wait_s b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/wait_s new file mode 100644 index 00000000..52bd8e43 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke1/wait_s @@ -0,0 +1 @@ +120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/agent.err b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/agent.err new file mode 100644 index 00000000..a5632022 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/agent.err @@ -0,0 +1 @@ +==> agent: OpenVINO/Qwen3-4B-fp16-ov as 'Qwen3-4B-fp16-ov' on CPU, 48 CPU(s) diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/agent.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/agent.yaml new file mode 100644 index 00000000..fb6896df --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/agent.yaml @@ -0,0 +1,104 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +# Models and the compiled-model cache live here, so restarts never re-download. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ovms-models + namespace: k3d-gpu-agent +spec: + accessModes: [ReadWriteOnce] + resources: + requests: + storage: 20Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + # --pull downloads the model once and writes its graph.pbtxt (device, + # parsers). On later starts the files are already there and only the + # graph is rewritten, so a device change takes effect with no download. + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + # No liveness probe: compiling a model for a GPU takes minutes. + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: "48" + memory: 6Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + persistentVolumeClaim: + claimName: ovms-models +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/eat.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/eat.yaml new file mode 100644 index 00000000..0c5bb018 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/eat.yaml @@ -0,0 +1,253 @@ +--- +# Source: vllm/templates/secret.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: Secret +metadata: + name: vllm-qwen-3-4b-cpu-secret + labels: + app: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +type: Opaque +data: +--- +# Source: vllm/templates/configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +data: + http_proxy: "" + https_proxy: "" + no_proxy: "" + TORCHINDUCTOR_CACHE_DIR: "/tmp" + NUMBA_CACHE_DIR: "/tmp" + HF_HOME: "/data" + OUTLINES_CACHE_DIR: "/tmp/.cache/outlines" + VLLM_NO_USAGE_STATS: "1" + DO_NOT_TRACK: "1" + HF_HUB_DISABLE_XET: "1" + TORCH_INDUCTOR_CACHE_DIR: "/tmp/torchinductor_cache" + TRITON_CACHE_DIR: "/tmp/.triton" + USER: "vllm" + VLLM_ALLOW_LONG_MAX_MODEL_LEN: "1" + VLLM_CPU_KVCACHE_SPACE: "6" + VLLM_CPU_NUM_OF_RESERVED_CPU: "0" + VLLM_CPU_SGL_KERNEL: "1" + VLLM_ENGINE_ITERATION_TIMEOUT_S: "120" + VLLM_RPC_TIMEOUT: "100000" +--- +# Source: vllm/templates/pvc.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: vllm-qwen-3-4b-cpu-pvc + namespace: default +spec: + accessModes: + - ReadWriteOnce + storageClassName: local-path + resources: + requests: + storage: 250Gi # Adjust this according to model storage size +--- +# Source: vllm/templates/service.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +# Source: vllm/templates/deployment.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: "performance" + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + # + # serviceAccountName: default + securityContext: + null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + - secretRef: + name: vllm-qwen-3-4b-cpu-secret + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" + imagePullPolicy: IfNotPresent + # command: + # - /bin/bash + # - -c + # - | + # python3 -m vllm.entrypoints.openai.api_server --dtype bfloat16 --model Qwen/Qwen3-4B --port 2080 --tensor-parallel-size 1 --block-size 128 --max-model-len 8192 --disable-log-requests + args: + - "--block-size" + - "128" + - "--dtype" + - "bfloat16" + - "--distributed_executor_backend" + - "mp" + - "--enable_chunked_prefill" + - "--enforce-eager" + - "--max-num-batched-tokens" + - "2048" + - "--max-num-seqs" + - "256" + - "--enable-prefix-caching" + # CPU deployment - add parallelism settings + - "--tensor-parallel-size" + - "1" + - "--pipeline-parallel-size" + - "1" + - "--model" + - "Qwen/Qwen3-4B" + - --served-model-name + - "Qwen/Qwen3-4B" + - "--port" + - "2080" + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 98 + httpGet: + path: /health + port: http + initialDelaySeconds: 120 + periodSeconds: 30 + resources: + requests: + cpu: "48" + memory: "16Gi" + limits: + cpu: "48" + memory: "16Gi" + + volumes: + - name: model-volume + persistentVolumeClaim: + claimName: vllm-qwen-3-4b-cpu-pvc + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - "true" + # extra time to finish processing buffered requests on CPU before pod is forcibly terminated + terminationGracePeriodSeconds: 120 +--- +# Source: vllm/templates/apisixroutes.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/chat-template-configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/ingress.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# Please edit the object below. Lines beginning with a '#' will be ignored, +# and an empty file will abort the edit. If an error occurs while saving this file will be +# reopened with the relevant failures. +--- +# Source: vllm/templates/ingress_eks.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/route.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/servicemonitor.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/node-cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/node-cpus.txt new file mode 100644 index 00000000..93544bfd --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/node-cpus.txt @@ -0,0 +1 @@ +node cpuset 0-23,48-71 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/notes.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/notes.txt new file mode 100644 index 00000000..2a712559 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/notes.txt @@ -0,0 +1,190 @@ +block 1 engine B did not come up +NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +default vllm-qwen-3-4b-cpu-8446c7b875-l9qgn 0/1 Running 9 (5m29s ago) 30m 10.42.0.10 k3d-k3dgpu-x-h7-server-0 +kube-system coredns-577d995dff-bb2l7 1/1 Running 0 30m 10.42.0.8 k3d-k3dgpu-x-h7-server-0 +kube-system helm-install-gateway-api-crd-dn272 0/1 Completed 0 30m 10.42.0.9 k3d-k3dgpu-x-h7-server-0 +kube-system intel-gpu-plugin-gcznx 1/1 Running 0 30m 10.42.0.5 k3d-k3dgpu-x-h7-server-0 +kube-system local-path-provisioner-6858d854cf-szgm8 1/1 Running 0 30m 10.42.0.2 k3d-k3dgpu-x-h7-server-0 +kube-system metrics-server-778c4649b4-w6cxk 1/1 Running 0 30m 10.42.0.7 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-gc-7d6955597d-4v97t 1/1 Running 0 30m 10.42.0.3 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-master-74b6cfb7df-vjxh7 1/1 Running 0 30m 10.42.0.6 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-worker-8gcqm 1/1 Running 0 30m 10.42.0.4 k3d-k3dgpu-x-h7-server-0 +Name: vllm-qwen-3-4b-cpu-8446c7b875-l9qgn +Namespace: default +Priority: 0 +Service Account: default +Node: k3d-k3dgpu-x-h7-server-0/172.19.0.2 +Start Time: Tue, 20 Oct 2026 23:36:54 +0000 +Labels: app.kubernetes.io/instance=vllm-qwen-3-4b-cpu + app.kubernetes.io/name=vllm + name=vllm + pod-template-hash=8446c7b875 +Annotations: balloon.balloons.resource-policy.nri.io: performance +Status: Running +IP: 10.42.0.10 +IPs: + IP: 10.42.0.10 +Controlled By: ReplicaSet/vllm-qwen-3-4b-cpu-8446c7b875 +Containers: + vllm: + Container ID: containerd://331d5a7189b6b18e1da076b60b46364f61edbc1363f62d5e3c95d25e65287c0f + Image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + Image ID: docker.io/vllm/vllm-openai-cpu@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + Port: 2080/TCP (http) + Host Port: 0/TCP (http) + SeccompProfile: RuntimeDefault + Args: + --block-size + 128 + --dtype + bfloat16 + --distributed_executor_backend + mp + --enable_chunked_prefill + --enforce-eager + --max-num-batched-tokens + 2048 + --max-num-seqs + 256 + --enable-prefix-caching + --tensor-parallel-size + 1 + --pipeline-parallel-size + 1 + --model + /data/Qwen3-4B + --served-model-name + Qwen/Qwen3-4B + --port + 2080 + --max-model-len + 32768 + State: Running + Started: Wed, 21 Oct 2026 00:06:25 +0000 + Last State: Terminated + Reason: OOMKilled + Exit Code: 137 + Started: Wed, 21 Oct 2026 00:00:32 +0000 + Finished: Wed, 21 Oct 2026 00:01:25 +0000 + Ready: False + Restart Count: 9 + Limits: + cpu: 48 + memory: 16Gi + Requests: + cpu: 48 + memory: 16Gi + Readiness: http-get http://:http/health delay=10s timeout=1s period=5s #success=1 #failure=200 + Environment Variables from: + vllm-qwen-3-4b-cpu-config ConfigMap Optional: false + Environment: + Mounts: + /data from model-volume (rw) + /dev/shm from shm (rw) + /root/.cache/vllm from vllm-cache (rw) + /tmp from tmp (rw) + /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-k7dz2 (ro) +Conditions: + Type Status + PodReadyToStartContainers True + Initialized True + Ready False + ContainersReady False + PodScheduled True +Volumes: + model-volume: + Type: HostPath (bare host directory volume) + Path: /var/apb-models + HostPathType: Directory + shm: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: Memory + SizeLimit: 1Gi + tmp: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + vllm-cache: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + kube-api-access-k7dz2: + Type: Projected (a volume that contains injected data from multiple sources) + TokenExpirationSeconds: 3607 + ConfigMapName: kube-root-ca.crt + Optional: false + DownwardAPI: true +QoS Class: Guaranteed +Node-Selectors: +Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s + node.kubernetes.io/unreachable:NoExecute op=Exists for 300s +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Scheduled 30m default-scheduler Successfully assigned default/vllm-qwen-3-4b-cpu-8446c7b875-l9qgn to k3d-k3dgpu-x-h7-server-0 + Normal Pulling 30m kubelet spec.containers{vllm}: Pulling image "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" + Normal Pulled 29m kubelet spec.containers{vllm}: Successfully pulled image "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" in 55.638s (55.638s including waiting). Image size: 1755702090 bytes. + Warning Unhealthy 23m (x40 over 28m) kubelet spec.containers{vllm}: Readiness probe failed: Get "http://10.42.0.10:2080/health": dial tcp 10.42.0.10:2080: connect: connection refused + Normal Started 6m22s (x9 over 29m) kubelet spec.containers{vllm}: Container started + Warning BackOff 3m (x21 over 27m) kubelet spec.containers{vllm}: Back-off restarting failed container vllm in pod vllm-qwen-3-4b-cpu-8446c7b875-l9qgn_default(0e4df37b-dc2d-4ca5-8ee2-5a2ea5506755) + Normal Created 29s (x10 over 29m) kubelet spec.containers{vllm}: Container created + Normal Pulled 29s (x9 over 28m) kubelet spec.containers{vllm}: Container image "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" already present on machine and can be accessed by the pod +No resources found in k3d-gpu-agent namespace. +--- logs pod/vllm-qwen-3-4b-cpu-8446c7b875-l9qgn +WARNING 10-21 00:06:37 [argparse_utils.py:257] With `vllm serve`, you should provide the model as a positional argument or in a config file instead of via the `--model` option. The `--model` option will be removed in a future version. +(APIServer pid=1) INFO 10-21 00:06:37 [api_utils.py:339] +(APIServer pid=1) INFO 10-21 00:06:37 [api_utils.py:339] █ █ █▄ ▄█ +(APIServer pid=1) INFO 10-21 00:06:37 [api_utils.py:339] ▄▄ ▄█ █ █ █ ▀▄▀ █ version 0.24.0 +(APIServer pid=1) INFO 10-21 00:06:37 [api_utils.py:339] █▄█▀ █ █ █ █ model /data/Qwen3-4B +(APIServer pid=1) INFO 10-21 00:06:37 [api_utils.py:339] ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀ ▀ +(APIServer pid=1) INFO 10-21 00:06:37 [api_utils.py:339] +(APIServer pid=1) INFO 10-21 00:06:37 [api_utils.py:273] non-default args: {'model_tag': '/data/Qwen3-4B', 'port': 2080, 'model': '/data/Qwen3-4B', 'dtype': 'bfloat16', 'max_model_len': 32768, 'enforce_eager': True, 'served_model_name': ['Qwen/Qwen3-4B'], 'distributed_executor_backend': 'mp', 'block_size': 128, 'enable_prefix_caching': True, 'max_num_batched_tokens': 2048, 'max_num_seqs': 256, 'enable_chunked_prefill': True} +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_RPC_TIMEOUT +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP_PORT +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP_ADDR +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP_PROTO +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_SERVICE_HOST +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP_PROTO +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_SERVICE_PORT_VLLM +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_SERVICE_PORT_VLLM +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP_PORT +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP_ADDR +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_SERVICE_HOST +(APIServer pid=1) WARNING 10-21 00:06:37 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_SERVICE_PORT +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] Error saving model info cache. +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1311, in mkdir +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] os.mkdir(self, mode) +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] FileNotFoundError: [Errno 2] No such file or directory: '/.cache/vllm/modelinfos' +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] During handling of the above exception, another exception occurred: +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1311, in mkdir +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] os.mkdir(self, mode) +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] FileNotFoundError: [Errno 2] No such file or directory: '/.cache/vllm' +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] During handling of the above exception, another exception occurred: +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] File "/opt/venv/lib/python3.12/site-packages/vllm/model_executor/models/registry.py", line 891, in _save_modelinfo_to_cache +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] cache_dir.mkdir(parents=True, exist_ok=True) +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1315, in mkdir +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] self.parent.mkdir(parents=True, exist_ok=True) +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1315, in mkdir +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] self.parent.mkdir(parents=True, exist_ok=True) +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1311, in mkdir +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] os.mkdir(self, mode) +(APIServer pid=1) ERROR 10-21 00:06:49 [registry.py:896] OSError: [Errno 30] Read-only file system: '/.cache' +(APIServer pid=1) INFO 10-21 00:06:49 [model.py:598] Resolved architecture: Qwen3ForCausalLM +(APIServer pid=1) INFO 10-21 00:06:49 [model.py:1725] Using max model len 32768 +(APIServer pid=1) INFO 10-21 00:06:49 [vllm.py:1006] Asynchronous scheduling is enabled. +(APIServer pid=1) WARNING 10-21 00:06:49 [vllm.py:1062] Enforce eager set, disabling torch.compile and CUDAGraphs. This is equivalent to setting -cc.mode=none -cc.cudagraph_mode=none +(APIServer pid=1) WARNING 10-21 00:06:49 [vllm.py:1110] Inductor compilation was disabled by user settings, optimizations settings that are only active during inductor compilation will be ignored. +(APIServer pid=1) INFO 10-21 00:06:49 [kernel.py:276] Final IR op priority after setting platform defaults: IrOpPriorityConfig(rms_norm=['native'], fused_add_rms_norm=['native']) +(APIServer pid=1) INFO 10-21 00:06:49 [compilation.py:310] Enabled custom fusions: norm_quant, act_quant diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/ovms.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/ovms.yaml new file mode 100644 index 00000000..c9c1bb61 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/ovms.yaml @@ -0,0 +1,89 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: '48' + memory: 6Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + hostPath: + path: /var/apb-models + type: Directory +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/values.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/values.yaml new file mode 100644 index 00000000..c1dc074b --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/values.yaml @@ -0,0 +1,437 @@ +accelDevice: '' +cpu_balloon_annotation: performance +resources: + requests: + cpu: '{{ .Values.cpu }}' + memory: '{{ .Values.memory }}' +block_size: 128 +max_num_seqs: 256 +max_seq_len_to_capture: 2048 +d_type: bfloat16 +max_model_len: 8192 +image: + repository: vllm/vllm-openai-cpu + tag: v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + pullPolicy: IfNotPresent +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' +VLLM_CPU_SGL_KERNEL: '1' +VLLM_NO_USAGE_STATS: 1 +DO_NOT_TRACK: 1 +LLM_MODEL_ID: '' +modelConfigs: + meta-llama/Llama-3.1-8B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + HF_HUB_DISABLE_XET: '1' + VLLM_CPU_SGL_KERNEL: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + speculativeConfig: '{"method":"draft_model","model":"meta-llama/Llama-3.2-1B-Instruct","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + meta-llama/Llama-3.2-3B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + deepseek-ai/DeepSeek-R1-Distill-Qwen-32B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + deepseek-ai/DeepSeek-R1-Distill-Llama-8B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-1.7B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - hermes + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-4B-Instruct-2507: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - hermes + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen2.5-Coder-7B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_coder + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-Coder-30B-A3B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '2' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --trust-remote-code + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + speculativeConfig: '{"method":"draft_model","model":"Qwen/Qwen3-0.6B","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen2.5-Coder-14B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCHDYNAMO_DISABLE: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + speculativeConfig: '{"method":"draft_model","model":"Qwen/Qwen2.5-Coder-0.5B-Instruct","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + HF_HUB_OFFLINE: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-30B-A3B-Instruct-2507: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + HF_HUB_DISABLE_XET: '1' + VLLM_CPU_SGL_KERNEL: '1' + TRITON_CACHE_DIR: /tmp/.triton + TORCHINDUCTOR_CACHE_DIR: /tmp/.torch_compile + XDG_CACHE_HOME: /tmp/.cache + HF_HOME: /tmp/.cache/huggingface + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + google/gemma-4-26B-A4B-it: + configMapValues: + TRITON_CACHE_DIR: /tmp/.triton + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - gemma4 + - --chat-template + - /workspace/vllm/examples/tool_chat_template_gemma4.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + openai/whisper-small: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCHDYNAMO_DISABLE: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + XDG_CACHE_HOME: /tmp/.cache + HF_HOME: /tmp/huggingface + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --dtype + - float32 + - --enforce-eager + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' +defaultModelConfigs: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' +memory: 16Gi +cpu: '8' diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm-c.err b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm-c.err new file mode 100644 index 00000000..e69de29b diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm-c.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm-c.yaml new file mode 100644 index 00000000..4cc2806f --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm-c.yaml @@ -0,0 +1,175 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-c-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +data: + http_proxy: '' + https_proxy: '' + no_proxy: '' + TORCHINDUCTOR_CACHE_DIR: /tmp + NUMBA_CACHE_DIR: /tmp + HF_HOME: /data + OUTLINES_CACHE_DIR: /tmp/.cache/outlines + VLLM_NO_USAGE_STATS: '1' + DO_NOT_TRACK: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_RPC_TIMEOUT: '100000' + HF_HUB_OFFLINE: '1' +--- +apiVersion: v1 +kind: Service +metadata: + name: vllm-c-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + h7x-arm: c +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-c + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + h7x-arm: c + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: performance + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + h7x-arm: c + spec: + securityContext: null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + imagePullPolicy: IfNotPresent + args: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --tensor-parallel-size + - '1' + - --pipeline-parallel-size + - '1' + - --model + - /data/Qwen3-4B + - --served-model-name + - Qwen/Qwen3-4B + - --port + - '2080' + - --max-model-len + - '32768' + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 200 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: '48' + memory: 16Gi + limits: + cpu: '48' + memory: 16Gi + volumes: + - name: model-volume + hostPath: + path: /var/apb-models + type: Directory + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' + terminationGracePeriodSeconds: 120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm.yaml new file mode 100644 index 00000000..304325c2 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/h7x-20261020-233558/vllm.yaml @@ -0,0 +1,173 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +data: + http_proxy: '' + https_proxy: '' + no_proxy: '' + TORCHINDUCTOR_CACHE_DIR: /tmp + NUMBA_CACHE_DIR: /tmp + HF_HOME: /data + OUTLINES_CACHE_DIR: /tmp/.cache/outlines + VLLM_NO_USAGE_STATS: '1' + DO_NOT_TRACK: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_RPC_TIMEOUT: '100000' + HF_HUB_OFFLINE: '1' +--- +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: performance + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + securityContext: null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + imagePullPolicy: IfNotPresent + args: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --tensor-parallel-size + - '1' + - --pipeline-parallel-size + - '1' + - --model + - /data/Qwen3-4B + - --served-model-name + - Qwen/Qwen3-4B + - --port + - '2080' + - --max-model-len + - '32768' + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 200 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: '48' + memory: 16Gi + limits: + cpu: '48' + memory: 16Gi + volumes: + - name: model-volume + hostPath: + path: /var/apb-models + type: Directory + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' + terminationGracePeriodSeconds: 120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/post.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/post.txt new file mode 100644 index 00000000..09da00a1 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/post.txt @@ -0,0 +1,16 @@ +2026-10-21T00:06:57Z + 00:06:57 up 35 days, 1:21, 19 users, load average: 2.47, 2.30, 3.62 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +41.9 3899938 root sglang::schedul +39.6 3900351 root sglang::schedul +24.3 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp +11.6 4169397 root kworker/62:7-mm_percpu_wq + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3422018248 215068116 95% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/pre.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/pre.txt new file mode 100644 index 00000000..2e3cd5c7 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/pre.txt @@ -0,0 +1,16 @@ +2026-10-20T23:35:58Z + 23:35:58 up 35 days, 50 min, 17 users, load average: 4.40, 6.01, 9.26 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +42.0 3899938 root sglang::schedul +39.6 3900351 root sglang::schedul +24.3 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3421933060 215153304 95% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/rc b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/rc new file mode 100644 index 00000000..0cfbf088 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/rc @@ -0,0 +1 @@ +2 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/serving.jsonl b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/serving.jsonl new file mode 100644 index 00000000..702ed94f --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/serving.jsonl @@ -0,0 +1,186 @@ +{"ts": 1792539368.902, "seconds": 10.0, "load1": 4.88, "cpu": {"qwen38-b-hr": 1.008, "qwen38-a-hr": 1.162, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.03, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.445, "aiperf_procs": 0} +{"ts": 1792539378.931, "seconds": 10.029, "load1": 5.05, "cpu": {"qwen38-b-hr": 1.048, "qwen38-a-hr": 1.17, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.474, "aiperf_procs": 0} +{"ts": 1792539388.962, "seconds": 10.031, "load1": 5.44, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.371, "aiperf_procs": 0} +{"ts": 1792539398.989, "seconds": 10.027, "load1": 6.51, "cpu": {"qwen38-b-hr": 0.947, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.344, "aiperf_procs": 0} +{"ts": 1792539409.019, "seconds": 10.03, "load1": 6.74, "cpu": {"qwen38-b-hr": 0.982, "qwen38-a-hr": 1.097, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.015, "xpumd": 0.003}, "serving_cpu": 2.346, "aiperf_procs": 0} +{"ts": 1792539419.054, "seconds": 10.034, "load1": 6.84, "cpu": {"qwen38-b-hr": 0.959, "qwen38-a-hr": 1.138, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.35, "aiperf_procs": 0} +{"ts": 1792539429.151, "seconds": 10.097, "load1": 6.49, "cpu": {"qwen38-b-hr": 0.934, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.324, "aiperf_procs": 0} +{"ts": 1792539439.184, "seconds": 10.033, "load1": 6.55, "cpu": {"qwen38-b-hr": 0.951, "qwen38-a-hr": 1.086, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.288, "aiperf_procs": 0} +{"ts": 1792539449.215, "seconds": 10.031, "load1": 6.39, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.104, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.34, "aiperf_procs": 0} +{"ts": 1792539459.246, "seconds": 10.031, "load1": 6.09, "cpu": {"qwen38-b-hr": 0.945, "qwen38-a-hr": 1.1, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.299, "aiperf_procs": 0} +{"ts": 1792539469.277, "seconds": 10.031, "load1": 6.07, "cpu": {"qwen38-b-hr": 0.969, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.326, "aiperf_procs": 0} +{"ts": 1792539479.31, "seconds": 10.033, "load1": 9.83, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.113, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.347, "aiperf_procs": 0} +{"ts": 1792539489.419, "seconds": 10.108, "load1": 9.16, "cpu": {"qwen38-b-hr": 0.968, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.343, "aiperf_procs": 0} +{"ts": 1792539499.447, "seconds": 10.029, "load1": 8.59, "cpu": {"qwen38-b-hr": 0.958, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.338, "aiperf_procs": 0} +{"ts": 1792539509.478, "seconds": 10.031, "load1": 8.02, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.101, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.343, "aiperf_procs": 0} +{"ts": 1792539519.51, "seconds": 10.031, "load1": 7.56, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.02, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.021, "xpumd": 0.002}, "serving_cpu": 2.403, "aiperf_procs": 0} +{"ts": 1792539529.538, "seconds": 10.029, "load1": 7.09, "cpu": {"qwen38-b-hr": 0.972, "qwen38-a-hr": 1.151, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.189, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.059, "xpumd": 0.003}, "serving_cpu": 2.452, "aiperf_procs": 0} +{"ts": 1792539539.57, "seconds": 10.032, "load1": 10.46, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.111, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.024, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.027, "xpumd": 0.002}, "serving_cpu": 2.398, "aiperf_procs": 0} +{"ts": 1792539549.688, "seconds": 10.118, "load1": 9.62, "cpu": {"qwen38-b-hr": 0.964, "qwen38-a-hr": 1.148, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.002}, "serving_cpu": 2.376, "aiperf_procs": 0} +{"ts": 1792539559.718, "seconds": 10.03, "load1": 8.6, "cpu": {"qwen38-b-hr": 0.964, "qwen38-a-hr": 1.111, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.333, "aiperf_procs": 0} +{"ts": 1792539569.748, "seconds": 10.03, "load1": 7.74, "cpu": {"qwen38-b-hr": 0.971, "qwen38-a-hr": 1.115, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.335, "aiperf_procs": 0} +{"ts": 1792539579.78, "seconds": 10.032, "load1": 7.16, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.409, "aiperf_procs": 0} +{"ts": 1792539589.995, "seconds": 10.215, "load1": 6.68, "cpu": {"qwen38-b-hr": 1.012, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.024, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.02, "xpumd": 0.003}, "serving_cpu": 2.409, "aiperf_procs": 0} +{"ts": 1792539600.025, "seconds": 10.03, "load1": 6.42, "cpu": {"qwen38-b-hr": 1.022, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.0, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.389, "aiperf_procs": 0} +{"ts": 1792539610.147, "seconds": 10.122, "load1": 6.2, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.355, "aiperf_procs": 0} +{"ts": 1792539620.177, "seconds": 10.03, "load1": 6.4, "cpu": {"qwen38-b-hr": 0.963, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.348, "aiperf_procs": 0} +{"ts": 1792539630.21, "seconds": 10.033, "load1": 6.65, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.371, "aiperf_procs": 0} +{"ts": 1792539640.243, "seconds": 10.033, "load1": 6.7, "cpu": {"qwen38-b-hr": 0.973, "qwen38-a-hr": 1.101, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.012, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.002}, "serving_cpu": 2.352, "aiperf_procs": 0} +{"ts": 1792539650.276, "seconds": 10.033, "load1": 6.67, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.164, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.42, "aiperf_procs": 0} +{"ts": 1792539660.308, "seconds": 10.032, "load1": 6.49, "cpu": {"qwen38-b-hr": 1.012, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.411, "aiperf_procs": 0} +{"ts": 1792539670.418, "seconds": 10.109, "load1": 6.18, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.16, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.039, "prometheus": 0.008, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.002}, "serving_cpu": 2.409, "aiperf_procs": 0} +{"ts": 1792539680.45, "seconds": 10.032, "load1": 5.91, "cpu": {"qwen38-b-hr": 0.957, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.352, "aiperf_procs": 0} +{"ts": 1792539690.481, "seconds": 10.032, "load1": 5.7, "cpu": {"qwen38-b-hr": 0.975, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.001}, "serving_cpu": 2.37, "aiperf_procs": 0} +{"ts": 1792539700.512, "seconds": 10.031, "load1": 5.36, "cpu": {"qwen38-b-hr": 0.958, "qwen38-a-hr": 1.149, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.36, "aiperf_procs": 0} +{"ts": 1792539710.543, "seconds": 10.031, "load1": 5.31, "cpu": {"qwen38-b-hr": 0.957, "qwen38-a-hr": 1.078, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.285, "aiperf_procs": 0} +{"ts": 1792539720.572, "seconds": 10.029, "load1": 5.09, "cpu": {"qwen38-b-hr": 1.022, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.013, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.434, "aiperf_procs": 0} +{"ts": 1792539730.673, "seconds": 10.101, "load1": 4.46, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.018, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.376, "aiperf_procs": 0} +{"ts": 1792539740.706, "seconds": 10.033, "load1": 4.0, "cpu": {"qwen38-b-hr": 0.99, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792539750.739, "seconds": 10.033, "load1": 3.54, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.151, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.001}, "serving_cpu": 2.404, "aiperf_procs": 0} +{"ts": 1792539760.769, "seconds": 10.03, "load1": 3.24, "cpu": {"qwen38-b-hr": 1.033, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.002}, "serving_cpu": 2.436, "aiperf_procs": 0} +{"ts": 1792539770.799, "seconds": 10.03, "load1": 3.13, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.378, "aiperf_procs": 0} +{"ts": 1792539780.833, "seconds": 10.033, "load1": 3.03, "cpu": {"qwen38-b-hr": 0.964, "qwen38-a-hr": 1.085, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.301, "aiperf_procs": 0} +{"ts": 1792539790.945, "seconds": 10.112, "load1": 2.96, "cpu": {"qwen38-b-hr": 0.957, "qwen38-a-hr": 1.114, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.327, "aiperf_procs": 0} +{"ts": 1792539800.976, "seconds": 10.032, "load1": 2.96, "cpu": {"qwen38-b-hr": 0.971, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.021, "xpumd": 0.003}, "serving_cpu": 2.344, "aiperf_procs": 0} +{"ts": 1792539811.007, "seconds": 10.03, "load1": 2.96, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.111, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.377, "aiperf_procs": 0} +{"ts": 1792539821.039, "seconds": 10.032, "load1": 4.49, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.115, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.206, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.006, "node-exporter": 0.045, "prometheus": 0.008, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.433, "aiperf_procs": 0} +{"ts": 1792539831.073, "seconds": 10.034, "load1": 3.87, "cpu": {"qwen38-b-hr": 0.952, "qwen38-a-hr": 1.082, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.284, "aiperf_procs": 0} +{"ts": 1792539841.102, "seconds": 10.029, "load1": 3.51, "cpu": {"qwen38-b-hr": 0.963, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.017, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.362, "aiperf_procs": 0} +{"ts": 1792539851.222, "seconds": 10.12, "load1": 3.21, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.12, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.355, "aiperf_procs": 0} +{"ts": 1792539861.253, "seconds": 10.031, "load1": 2.88, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 2.339, "aiperf_procs": 0} +{"ts": 1792539871.281, "seconds": 10.028, "load1": 2.98, "cpu": {"qwen38-b-hr": 0.97, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.364, "aiperf_procs": 0} +{"ts": 1792539881.31, "seconds": 10.029, "load1": 3.22, "cpu": {"qwen38-b-hr": 1.017, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.409, "aiperf_procs": 0} +{"ts": 1792539891.341, "seconds": 10.031, "load1": 3.26, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792539901.371, "seconds": 10.029, "load1": 3.6, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.373, "aiperf_procs": 0} +{"ts": 1792539911.473, "seconds": 10.102, "load1": 7.51, "cpu": {"qwen38-b-hr": 0.969, "qwen38-a-hr": 1.08, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.301, "aiperf_procs": 0} +{"ts": 1792539921.505, "seconds": 10.032, "load1": 6.98, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.135, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.07, "xpumd": 0.003}, "serving_cpu": 2.426, "aiperf_procs": 0} +{"ts": 1792539931.533, "seconds": 10.027, "load1": 6.84, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.156, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.026, "xpumd": 0.002}, "serving_cpu": 2.436, "aiperf_procs": 0} +{"ts": 1792539941.564, "seconds": 10.031, "load1": 6.48, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.121, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.392, "aiperf_procs": 0} +{"ts": 1792539951.597, "seconds": 10.033, "load1": 8.1, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.177, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.41, "aiperf_procs": 0} +{"ts": 1792539961.852, "seconds": 10.255, "load1": 7.55, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.009, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.003}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792539971.959, "seconds": 10.107, "load1": 6.85, "cpu": {"qwen38-b-hr": 1.016, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 2.405, "aiperf_procs": 0} +{"ts": 1792539981.989, "seconds": 10.03, "load1": 6.18, "cpu": {"qwen38-b-hr": 0.969, "qwen38-a-hr": 1.137, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.362, "aiperf_procs": 0} +{"ts": 1792539992.02, "seconds": 10.031, "load1": 5.59, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.151, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.393, "aiperf_procs": 0} +{"ts": 1792540002.052, "seconds": 10.032, "load1": 5.04, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.353, "aiperf_procs": 0} +{"ts": 1792540012.083, "seconds": 10.031, "load1": 4.58, "cpu": {"qwen38-b-hr": 0.937, "qwen38-a-hr": 1.114, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.002}, "serving_cpu": 2.314, "aiperf_procs": 0} +{"ts": 1792540022.117, "seconds": 10.034, "load1": 4.12, "cpu": {"qwen38-b-hr": 0.958, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.001}, "serving_cpu": 2.345, "aiperf_procs": 0} +{"ts": 1792540032.232, "seconds": 10.115, "load1": 3.64, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.108, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.019, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.351, "aiperf_procs": 0} +{"ts": 1792540042.263, "seconds": 10.031, "load1": 3.08, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.152, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.397, "aiperf_procs": 0} +{"ts": 1792540052.297, "seconds": 10.033, "load1": 2.68, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.372, "aiperf_procs": 0} +{"ts": 1792540062.328, "seconds": 10.031, "load1": 2.35, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.016, "xpumd": 0.003}, "serving_cpu": 2.374, "aiperf_procs": 0} +{"ts": 1792540072.358, "seconds": 10.03, "load1": 1.98, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.35, "aiperf_procs": 0} +{"ts": 1792540082.387, "seconds": 10.029, "load1": 1.84, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.357, "aiperf_procs": 0} +{"ts": 1792540092.506, "seconds": 10.119, "load1": 1.78, "cpu": {"qwen38-b-hr": 1.02, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.424, "aiperf_procs": 0} +{"ts": 1792540102.536, "seconds": 10.031, "load1": 1.5, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.367, "aiperf_procs": 0} +{"ts": 1792540112.569, "seconds": 10.033, "load1": 1.51, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.137, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.028, "xpumd": 0.003}, "serving_cpu": 2.416, "aiperf_procs": 0} +{"ts": 1792540122.6, "seconds": 10.031, "load1": 1.81, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.389, "aiperf_procs": 0} +{"ts": 1792540132.63, "seconds": 10.03, "load1": 2.22, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.361, "aiperf_procs": 0} +{"ts": 1792540142.66, "seconds": 10.03, "load1": 2.58, "cpu": {"qwen38-b-hr": 0.973, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.362, "aiperf_procs": 0} +{"ts": 1792540152.771, "seconds": 10.11, "load1": 2.64, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.115, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.356, "aiperf_procs": 0} +{"ts": 1792540162.8, "seconds": 10.03, "load1": 3.0, "cpu": {"qwen38-b-hr": 1.027, "qwen38-a-hr": 1.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.398, "aiperf_procs": 0} +{"ts": 1792540172.832, "seconds": 10.032, "load1": 3.23, "cpu": {"qwen38-b-hr": 1.03, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.432, "aiperf_procs": 0} +{"ts": 1792540182.861, "seconds": 10.029, "load1": 3.28, "cpu": {"qwen38-b-hr": 1.017, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.408, "aiperf_procs": 0} +{"ts": 1792540192.891, "seconds": 10.03, "load1": 3.16, "cpu": {"qwen38-b-hr": 1.015, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.163, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792540202.921, "seconds": 10.03, "load1": 2.91, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.36, "aiperf_procs": 0} +{"ts": 1792540213.015, "seconds": 10.094, "load1": 2.61, "cpu": {"qwen38-b-hr": 0.97, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.37, "aiperf_procs": 0} +{"ts": 1792540223.047, "seconds": 10.032, "load1": 2.28, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.365, "aiperf_procs": 0} +{"ts": 1792540233.078, "seconds": 10.03, "load1": 2.08, "cpu": {"qwen38-b-hr": 0.967, "qwen38-a-hr": 1.151, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.015, "xpumd": 0.001}, "serving_cpu": 2.386, "aiperf_procs": 0} +{"ts": 1792540243.112, "seconds": 10.035, "load1": 1.92, "cpu": {"qwen38-b-hr": 1.002, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.009, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.001}, "serving_cpu": 2.405, "aiperf_procs": 0} +{"ts": 1792540253.143, "seconds": 10.031, "load1": 2.31, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.086, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.344, "aiperf_procs": 0} +{"ts": 1792540263.174, "seconds": 10.031, "load1": 2.03, "cpu": {"qwen38-b-hr": 1.008, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.365, "aiperf_procs": 0} +{"ts": 1792540273.289, "seconds": 10.115, "load1": 1.94, "cpu": {"qwen38-b-hr": 0.975, "qwen38-a-hr": 1.086, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.317, "aiperf_procs": 0} +{"ts": 1792540283.319, "seconds": 10.031, "load1": 1.79, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.163, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.033, "xpumd": 0.003}, "serving_cpu": 2.429, "aiperf_procs": 0} +{"ts": 1792540293.35, "seconds": 10.03, "load1": 1.67, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.042, "xpumd": 0.002}, "serving_cpu": 2.428, "aiperf_procs": 0} +{"ts": 1792540303.38, "seconds": 10.031, "load1": 1.56, "cpu": {"qwen38-b-hr": 1.008, "qwen38-a-hr": 1.137, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.009, "xpumd": 0.001}, "serving_cpu": 2.4, "aiperf_procs": 0} +{"ts": 1792540313.41, "seconds": 10.03, "load1": 1.4, "cpu": {"qwen38-b-hr": 1.019, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.023, "xpumd": 0.003}, "serving_cpu": 2.425, "aiperf_procs": 0} +{"ts": 1792540323.44, "seconds": 10.03, "load1": 1.35, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.38, "aiperf_procs": 0} +{"ts": 1792540333.551, "seconds": 10.111, "load1": 1.45, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.023, "xpumd": 0.001}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792540343.583, "seconds": 10.032, "load1": 1.44, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.378, "aiperf_procs": 0} +{"ts": 1792540353.616, "seconds": 10.033, "load1": 1.62, "cpu": {"qwen38-b-hr": 0.978, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.017, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.386, "aiperf_procs": 0} +{"ts": 1792540363.645, "seconds": 10.029, "load1": 1.69, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.148, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.384, "aiperf_procs": 0} +{"ts": 1792540373.674, "seconds": 10.029, "load1": 1.9, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.009, "xpumd": 0.001}, "serving_cpu": 2.374, "aiperf_procs": 0} +{"ts": 1792540383.707, "seconds": 10.033, "load1": 2.3, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.138, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.027, "xpumd": 0.003}, "serving_cpu": 2.418, "aiperf_procs": 0} +{"ts": 1792540393.813, "seconds": 10.106, "load1": 2.56, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.365, "aiperf_procs": 0} +{"ts": 1792540403.845, "seconds": 10.032, "load1": 2.63, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.362, "aiperf_procs": 0} +{"ts": 1792540413.878, "seconds": 10.034, "load1": 2.61, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.357, "aiperf_procs": 0} +{"ts": 1792540423.911, "seconds": 10.033, "load1": 2.83, "cpu": {"qwen38-b-hr": 0.978, "qwen38-a-hr": 1.114, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.345, "aiperf_procs": 0} +{"ts": 1792540433.941, "seconds": 10.03, "load1": 2.63, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.38, "aiperf_procs": 0} +{"ts": 1792540443.972, "seconds": 10.03, "load1": 2.6, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.161, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.017, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.447, "aiperf_procs": 0} +{"ts": 1792540454.076, "seconds": 10.104, "load1": 2.27, "cpu": {"qwen38-b-hr": 0.993, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.372, "aiperf_procs": 0} +{"ts": 1792540464.109, "seconds": 10.033, "load1": 2.0, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.162, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.409, "aiperf_procs": 0} +{"ts": 1792540474.139, "seconds": 10.03, "load1": 1.85, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.016, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.002}, "serving_cpu": 2.394, "aiperf_procs": 0} +{"ts": 1792540484.172, "seconds": 10.034, "load1": 1.95, "cpu": {"qwen38-b-hr": 0.973, "qwen38-a-hr": 1.093, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.321, "aiperf_procs": 0} +{"ts": 1792540494.202, "seconds": 10.03, "load1": 2.11, "cpu": {"qwen38-b-hr": 0.948, "qwen38-a-hr": 1.092, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.292, "aiperf_procs": 0} +{"ts": 1792540504.234, "seconds": 10.032, "load1": 2.24, "cpu": {"qwen38-b-hr": 0.969, "qwen38-a-hr": 1.085, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.312, "aiperf_procs": 0} +{"ts": 1792540514.34, "seconds": 10.106, "load1": 2.61, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792540524.37, "seconds": 10.03, "load1": 4.66, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792540534.403, "seconds": 10.033, "load1": 4.25, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.12, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.021, "xpumd": 0.002}, "serving_cpu": 2.362, "aiperf_procs": 0} +{"ts": 1792540544.433, "seconds": 10.03, "load1": 3.67, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.015, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.375, "aiperf_procs": 0} +{"ts": 1792540554.465, "seconds": 10.032, "load1": 3.26, "cpu": {"qwen38-b-hr": 1.014, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.405, "aiperf_procs": 0} +{"ts": 1792540564.494, "seconds": 10.029, "load1": 2.91, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.418, "aiperf_procs": 0} +{"ts": 1792540574.602, "seconds": 10.108, "load1": 2.76, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.104, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.359, "aiperf_procs": 0} +{"ts": 1792540584.631, "seconds": 10.029, "load1": 2.49, "cpu": {"qwen38-b-hr": 0.96, "qwen38-a-hr": 1.115, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.328, "aiperf_procs": 0} +{"ts": 1792540594.66, "seconds": 10.029, "load1": 2.5, "cpu": {"qwen38-b-hr": 0.961, "qwen38-a-hr": 1.089, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.313, "aiperf_procs": 0} +{"ts": 1792540604.691, "seconds": 10.031, "load1": 2.19, "cpu": {"qwen38-b-hr": 1.004, "qwen38-a-hr": 1.113, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.369, "aiperf_procs": 0} +{"ts": 1792540614.725, "seconds": 10.034, "load1": 2.23, "cpu": {"qwen38-b-hr": 0.973, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.368, "aiperf_procs": 0} +{"ts": 1792540624.758, "seconds": 10.032, "load1": 2.51, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.12, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.36, "aiperf_procs": 0} +{"ts": 1792540634.858, "seconds": 10.1, "load1": 2.5, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.16, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.403, "aiperf_procs": 0} +{"ts": 1792540644.888, "seconds": 10.03, "load1": 2.73, "cpu": {"qwen38-b-hr": 0.956, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.023, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.003}, "serving_cpu": 2.358, "aiperf_procs": 0} +{"ts": 1792540654.916, "seconds": 10.028, "load1": 2.69, "cpu": {"qwen38-b-hr": 0.971, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.337, "aiperf_procs": 0} +{"ts": 1792540664.948, "seconds": 10.032, "load1": 2.73, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.166, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.053, "xpumd": 0.003}, "serving_cpu": 2.466, "aiperf_procs": 0} +{"ts": 1792540674.982, "seconds": 10.034, "load1": 2.7, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.026, "xpumd": 0.001}, "serving_cpu": 2.398, "aiperf_procs": 0} +{"ts": 1792540685.014, "seconds": 10.032, "load1": 2.59, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.393, "aiperf_procs": 0} +{"ts": 1792540695.117, "seconds": 10.103, "load1": 2.5, "cpu": {"qwen38-b-hr": 1.012, "qwen38-a-hr": 1.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792540705.148, "seconds": 10.031, "load1": 2.26, "cpu": {"qwen38-b-hr": 0.994, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.003}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792540715.179, "seconds": 10.031, "load1": 2.15, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.397, "aiperf_procs": 0} +{"ts": 1792540725.212, "seconds": 10.032, "load1": 2.35, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.113, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792540735.241, "seconds": 10.03, "load1": 2.3, "cpu": {"qwen38-b-hr": 0.99, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.371, "aiperf_procs": 0} +{"ts": 1792540745.271, "seconds": 10.03, "load1": 1.95, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.114, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.017, "xpumd": 0.003}, "serving_cpu": 2.364, "aiperf_procs": 0} +{"ts": 1792540755.387, "seconds": 10.116, "load1": 1.81, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.015, "node-exporter": 0.038, "prometheus": 0.008, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.415, "aiperf_procs": 0} +{"ts": 1792540765.42, "seconds": 10.033, "load1": 1.68, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.35, "aiperf_procs": 0} +{"ts": 1792540775.452, "seconds": 10.032, "load1": 1.72, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.033, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.015, "xpumd": 0.003}, "serving_cpu": 2.368, "aiperf_procs": 0} +{"ts": 1792540785.486, "seconds": 10.034, "load1": 1.53, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.023, "xpumd": 0.002}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792540795.518, "seconds": 10.032, "load1": 1.76, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.098, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.353, "aiperf_procs": 0} +{"ts": 1792540805.55, "seconds": 10.032, "load1": 2.03, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.121, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.01, "alloy": 0.009, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.359, "aiperf_procs": 0} +{"ts": 1792540815.655, "seconds": 10.105, "load1": 1.87, "cpu": {"qwen38-b-hr": 0.948, "qwen38-a-hr": 1.103, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.309, "aiperf_procs": 0} +{"ts": 1792540825.688, "seconds": 10.032, "load1": 1.58, "cpu": {"qwen38-b-hr": 0.952, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.313, "aiperf_procs": 0} +{"ts": 1792540835.717, "seconds": 10.029, "load1": 1.57, "cpu": {"qwen38-b-hr": 0.952, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.335, "aiperf_procs": 0} +{"ts": 1792540845.747, "seconds": 10.03, "load1": 1.71, "cpu": {"qwen38-b-hr": 0.941, "qwen38-a-hr": 1.094, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.018, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.305, "aiperf_procs": 0} +{"ts": 1792540855.778, "seconds": 10.031, "load1": 1.83, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.359, "aiperf_procs": 0} +{"ts": 1792540865.81, "seconds": 10.032, "load1": 2.17, "cpu": {"qwen38-b-hr": 0.944, "qwen38-a-hr": 1.101, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.301, "aiperf_procs": 0} +{"ts": 1792540875.915, "seconds": 10.106, "load1": 2.45, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.17, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.018, "xpumd": 0.003}, "serving_cpu": 2.429, "aiperf_procs": 0} +{"ts": 1792540885.948, "seconds": 10.033, "load1": 3.07, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.178, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.202, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.009, "xpumd": 0.002}, "serving_cpu": 2.476, "aiperf_procs": 0} +{"ts": 1792540896.01, "seconds": 10.061, "load1": 2.99, "cpu": {"qwen38-b-hr": 0.968, "qwen38-a-hr": 1.104, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.328, "aiperf_procs": 0} +{"ts": 1792540906.041, "seconds": 10.031, "load1": 3.46, "cpu": {"qwen38-b-hr": 0.958, "qwen38-a-hr": 1.106, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.321, "aiperf_procs": 0} +{"ts": 1792540916.073, "seconds": 10.032, "load1": 3.55, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.085, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.326, "aiperf_procs": 0} +{"ts": 1792540926.104, "seconds": 10.031, "load1": 3.24, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792540936.212, "seconds": 10.107, "load1": 2.97, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.021, "xpumd": 0.001}, "serving_cpu": 2.376, "aiperf_procs": 0} +{"ts": 1792540946.244, "seconds": 10.032, "load1": 2.66, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.115, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.36, "aiperf_procs": 0} +{"ts": 1792540956.274, "seconds": 10.03, "load1": 2.33, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.135, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.021, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.421, "aiperf_procs": 0} +{"ts": 1792540966.303, "seconds": 10.029, "load1": 2.43, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792540976.334, "seconds": 10.031, "load1": 2.52, "cpu": {"qwen38-b-hr": 1.032, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.163, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.421, "aiperf_procs": 0} +{"ts": 1792540986.366, "seconds": 10.032, "load1": 2.43, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.388, "aiperf_procs": 0} +{"ts": 1792540996.48, "seconds": 10.114, "load1": 2.21, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.157, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.413, "aiperf_procs": 0} +{"ts": 1792541006.51, "seconds": 10.03, "load1": 1.87, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.37, "aiperf_procs": 0} +{"ts": 1792541016.541, "seconds": 10.031, "load1": 1.89, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.115, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.379, "aiperf_procs": 0} +{"ts": 1792541026.571, "seconds": 10.031, "load1": 1.76, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.405, "aiperf_procs": 0} +{"ts": 1792541036.603, "seconds": 10.032, "load1": 1.72, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.356, "aiperf_procs": 0} +{"ts": 1792541046.633, "seconds": 10.03, "load1": 1.62, "cpu": {"qwen38-b-hr": 1.016, "qwen38-a-hr": 1.159, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.069, "xpumd": 0.003}, "serving_cpu": 2.499, "aiperf_procs": 0} +{"ts": 1792541056.74, "seconds": 10.107, "load1": 1.69, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.159, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.001}, "serving_cpu": 2.416, "aiperf_procs": 0} +{"ts": 1792541066.773, "seconds": 10.032, "load1": 1.66, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.023, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.415, "aiperf_procs": 0} +{"ts": 1792541076.804, "seconds": 10.031, "load1": 1.8, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.159, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.014, "xpumd": 0.002}, "serving_cpu": 2.438, "aiperf_procs": 0} +{"ts": 1792541086.835, "seconds": 10.031, "load1": 1.6, "cpu": {"qwen38-b-hr": 0.944, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.318, "aiperf_procs": 0} +{"ts": 1792541096.867, "seconds": 10.032, "load1": 1.66, "cpu": {"qwen38-b-hr": 0.944, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.023, "xpumd": 0.003}, "serving_cpu": 2.352, "aiperf_procs": 0} +{"ts": 1792541106.895, "seconds": 10.029, "load1": 1.48, "cpu": {"qwen38-b-hr": 0.962, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.337, "aiperf_procs": 0} +{"ts": 1792541117.011, "seconds": 10.115, "load1": 1.64, "cpu": {"qwen38-b-hr": 0.939, "qwen38-a-hr": 1.093, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.285, "aiperf_procs": 0} +{"ts": 1792541127.045, "seconds": 10.034, "load1": 1.77, "cpu": {"qwen38-b-hr": 0.937, "qwen38-a-hr": 1.1, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.288, "aiperf_procs": 0} +{"ts": 1792541137.074, "seconds": 10.03, "load1": 1.88, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.093, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.321, "aiperf_procs": 0} +{"ts": 1792541147.104, "seconds": 10.03, "load1": 2.28, "cpu": {"qwen38-b-hr": 0.961, "qwen38-a-hr": 1.104, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.027, "xpumd": 0.002}, "serving_cpu": 2.339, "aiperf_procs": 0} +{"ts": 1792541157.137, "seconds": 10.033, "load1": 2.39, "cpu": {"qwen38-b-hr": 0.962, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.375, "aiperf_procs": 0} +{"ts": 1792541167.168, "seconds": 10.031, "load1": 2.64, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.001}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792541177.286, "seconds": 10.118, "load1": 2.38, "cpu": {"qwen38-b-hr": 0.959, "qwen38-a-hr": 1.091, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.304, "aiperf_procs": 0} +{"ts": 1792541187.318, "seconds": 10.032, "load1": 2.17, "cpu": {"qwen38-b-hr": 0.966, "qwen38-a-hr": 1.079, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.018, "xpumd": 0.001}, "serving_cpu": 2.308, "aiperf_procs": 0} +{"ts": 1792541197.347, "seconds": 10.029, "load1": 2.46, "cpu": {"qwen38-b-hr": 0.968, "qwen38-a-hr": 1.096, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.328, "aiperf_procs": 0} +{"ts": 1792541207.379, "seconds": 10.032, "load1": 2.46, "cpu": {"qwen38-b-hr": 0.956, "qwen38-a-hr": 1.081, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.293, "aiperf_procs": 0} +{"ts": 1792541217.408, "seconds": 10.029, "load1": 2.47, "cpu": {"qwen38-b-hr": 0.962, "qwen38-a-hr": 1.108, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.326, "aiperf_procs": 0} +{"ts": 1792541227.437, "seconds": 10.029, "load1": 2.94, "cpu": {"qwen38-b-hr": 1.019, "qwen38-a-hr": 1.181, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.058, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.493, "aiperf_procs": 0} diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/wait_s b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/wait_s new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke2/wait_s @@ -0,0 +1 @@ +0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/agent.err b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/agent.err new file mode 100644 index 00000000..6dff4df0 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/agent.err @@ -0,0 +1 @@ +==> agent: OpenVINO/Qwen3-4B-fp16-ov as 'Qwen3-4B-fp16-ov' on CPU, 16 CPU(s) diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/agent.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/agent.yaml new file mode 100644 index 00000000..dad6ed4c --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/agent.yaml @@ -0,0 +1,104 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +# Models and the compiled-model cache live here, so restarts never re-download. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ovms-models + namespace: k3d-gpu-agent +spec: + accessModes: [ReadWriteOnce] + resources: + requests: + storage: 20Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + # --pull downloads the model once and writes its graph.pbtxt (device, + # parsers). On later starts the files are already there and only the + # graph is rewritten, so a device change takes effect with no download. + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + # No liveness probe: compiling a model for a GPU takes minutes. + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: "16" + memory: 6Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + persistentVolumeClaim: + claimName: ovms-models +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/cpus.txt new file mode 100644 index 00000000..cc52351a --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/cpus.txt @@ -0,0 +1 @@ +A Cpus_allowed_list: 0-7,48-55 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/eat.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/eat.yaml new file mode 100644 index 00000000..a6c07d9e --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/eat.yaml @@ -0,0 +1,253 @@ +--- +# Source: vllm/templates/secret.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: Secret +metadata: + name: vllm-qwen-3-4b-cpu-secret + labels: + app: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +type: Opaque +data: +--- +# Source: vllm/templates/configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +data: + http_proxy: "" + https_proxy: "" + no_proxy: "" + TORCHINDUCTOR_CACHE_DIR: "/tmp" + NUMBA_CACHE_DIR: "/tmp" + HF_HOME: "/data" + OUTLINES_CACHE_DIR: "/tmp/.cache/outlines" + VLLM_NO_USAGE_STATS: "1" + DO_NOT_TRACK: "1" + HF_HUB_DISABLE_XET: "1" + TORCH_INDUCTOR_CACHE_DIR: "/tmp/torchinductor_cache" + TRITON_CACHE_DIR: "/tmp/.triton" + USER: "vllm" + VLLM_ALLOW_LONG_MAX_MODEL_LEN: "1" + VLLM_CPU_KVCACHE_SPACE: "6" + VLLM_CPU_NUM_OF_RESERVED_CPU: "0" + VLLM_CPU_SGL_KERNEL: "1" + VLLM_ENGINE_ITERATION_TIMEOUT_S: "120" + VLLM_RPC_TIMEOUT: "100000" +--- +# Source: vllm/templates/pvc.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: vllm-qwen-3-4b-cpu-pvc + namespace: default +spec: + accessModes: + - ReadWriteOnce + storageClassName: local-path + resources: + requests: + storage: 250Gi # Adjust this according to model storage size +--- +# Source: vllm/templates/service.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +# Source: vllm/templates/deployment.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: "performance" + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + # + # serviceAccountName: default + securityContext: + null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + - secretRef: + name: vllm-qwen-3-4b-cpu-secret + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" + imagePullPolicy: IfNotPresent + # command: + # - /bin/bash + # - -c + # - | + # python3 -m vllm.entrypoints.openai.api_server --dtype bfloat16 --model Qwen/Qwen3-4B --port 2080 --tensor-parallel-size 1 --block-size 128 --max-model-len 8192 --disable-log-requests + args: + - "--block-size" + - "128" + - "--dtype" + - "bfloat16" + - "--distributed_executor_backend" + - "mp" + - "--enable_chunked_prefill" + - "--enforce-eager" + - "--max-num-batched-tokens" + - "2048" + - "--max-num-seqs" + - "256" + - "--enable-prefix-caching" + # CPU deployment - add parallelism settings + - "--tensor-parallel-size" + - "1" + - "--pipeline-parallel-size" + - "1" + - "--model" + - "Qwen/Qwen3-4B" + - --served-model-name + - "Qwen/Qwen3-4B" + - "--port" + - "2080" + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 98 + httpGet: + path: /health + port: http + initialDelaySeconds: 120 + periodSeconds: 30 + resources: + requests: + cpu: "16" + memory: "16Gi" + limits: + cpu: "16" + memory: "16Gi" + + volumes: + - name: model-volume + persistentVolumeClaim: + claimName: vllm-qwen-3-4b-cpu-pvc + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - "true" + # extra time to finish processing buffered requests on CPU before pod is forcibly terminated + terminationGracePeriodSeconds: 120 +--- +# Source: vllm/templates/apisixroutes.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/chat-template-configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/ingress.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# Please edit the object below. Lines beginning with a '#' will be ignored, +# and an empty file will abort the edit. If an error occurs while saving this file will be +# reopened with the relevant failures. +--- +# Source: vllm/templates/ingress_eks.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/route.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/servicemonitor.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/image.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/image.txt new file mode 100644 index 00000000..da78ab5c --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/image.txt @@ -0,0 +1 @@ +openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 docker.io/openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 ["--rest_port=8000","--model_path=/models/OpenVINO/Qwen3-4B-fp16-ov","--model_name=Qwen3-4B-fp16-ov","--cache_dir=/models/.ov_cache","--log_level=INFO"] diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/node-cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/node-cpus.txt new file mode 100644 index 00000000..7c5ae641 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/node-cpus.txt @@ -0,0 +1 @@ +node cpuset 0-7,48-55 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/notes.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/notes.txt new file mode 100644 index 00000000..bc5a1db1 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke3/h7x-20261021-002504/notes.txt @@ -0,0 +1,193 @@ +block 2 engine B did not come up +NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +default vllm-qwen-3-4b-cpu-7bffcdcdf9-dps92 0/1 CrashLoopBackOff 8 (4m58s ago) 30m 10.42.0.11 k3d-k3dgpu-x-h7-server-0 +kube-system coredns-577d995dff-tpp2h 1/1 Running 0 31m 10.42.0.6 k3d-k3dgpu-x-h7-server-0 +kube-system helm-install-gateway-api-crd-c2hk4 0/1 Completed 0 31m 10.42.0.4 k3d-k3dgpu-x-h7-server-0 +kube-system intel-gpu-plugin-jth49 1/1 Running 0 31m 10.42.0.8 k3d-k3dgpu-x-h7-server-0 +kube-system local-path-provisioner-6858d854cf-g42f9 1/1 Running 0 31m 10.42.0.9 k3d-k3dgpu-x-h7-server-0 +kube-system metrics-server-778c4649b4-49f9x 1/1 Running 0 31m 10.42.0.2 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-gc-7d6955597d-hx52v 1/1 Running 0 31m 10.42.0.7 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-master-74b6cfb7df-zjgnk 1/1 Running 0 31m 10.42.0.5 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-worker-645dp 1/1 Running 0 31m 10.42.0.3 k3d-k3dgpu-x-h7-server-0 +Name: vllm-qwen-3-4b-cpu-7bffcdcdf9-dps92 +Namespace: default +Priority: 0 +Service Account: default +Node: k3d-k3dgpu-x-h7-server-0/172.19.0.2 +Start Time: Wed, 21 Oct 2026 00:26:50 +0000 +Labels: app.kubernetes.io/instance=vllm-qwen-3-4b-cpu + app.kubernetes.io/name=vllm + name=vllm + pod-template-hash=7bffcdcdf9 +Annotations: balloon.balloons.resource-policy.nri.io: performance +Status: Running +IP: 10.42.0.11 +IPs: + IP: 10.42.0.11 +Controlled By: ReplicaSet/vllm-qwen-3-4b-cpu-7bffcdcdf9 +Containers: + vllm: + Container ID: containerd://bc608f1e89d82f79439d00869f42087cd4b7e9c9c7f5c5ef4b07ac2fa9b66999 + Image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + Image ID: docker.io/vllm/vllm-openai-cpu@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + Port: 2080/TCP (http) + Host Port: 0/TCP (http) + SeccompProfile: RuntimeDefault + Args: + --block-size + 128 + --dtype + bfloat16 + --distributed_executor_backend + mp + --enable_chunked_prefill + --enforce-eager + --max-num-batched-tokens + 2048 + --max-num-seqs + 256 + --enable-prefix-caching + --tensor-parallel-size + 1 + --pipeline-parallel-size + 1 + --model + /data/Qwen3-4B + --served-model-name + Qwen/Qwen3-4B + --port + 2080 + --max-model-len + 32768 + State: Waiting + Reason: CrashLoopBackOff + Last State: Terminated + Reason: OOMKilled + Exit Code: 137 + Started: Wed, 21 Oct 2026 00:50:57 +0000 + Finished: Wed, 21 Oct 2026 00:51:52 +0000 + Ready: False + Restart Count: 8 + Limits: + cpu: 16 + memory: 16Gi + Requests: + cpu: 16 + memory: 16Gi + Readiness: http-get http://:http/health delay=10s timeout=1s period=5s #success=1 #failure=200 + Environment Variables from: + vllm-qwen-3-4b-cpu-config ConfigMap Optional: false + Environment: + Mounts: + /data from model-volume (rw) + /dev/shm from shm (rw) + /root/.cache/vllm from vllm-cache (rw) + /tmp from tmp (rw) + /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-xvllw (ro) +Conditions: + Type Status + PodReadyToStartContainers True + Initialized True + Ready False + ContainersReady False + PodScheduled True +Volumes: + model-volume: + Type: HostPath (bare host directory volume) + Path: /var/apb-models + HostPathType: Directory + shm: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: Memory + SizeLimit: 1Gi + tmp: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + vllm-cache: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + kube-api-access-xvllw: + Type: Projected (a volume that contains injected data from multiple sources) + TokenExpirationSeconds: 3607 + ConfigMapName: kube-root-ca.crt + Optional: false + DownwardAPI: true +QoS Class: Guaranteed +Node-Selectors: +Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s + node.kubernetes.io/unreachable:NoExecute op=Exists for 300s +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Scheduled 30m default-scheduler Successfully assigned default/vllm-qwen-3-4b-cpu-7bffcdcdf9-dps92 to k3d-k3dgpu-x-h7-server-0 + Normal Pulling 30m kubelet spec.containers{vllm}: Pulling image "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" + Normal Pulled 29m kubelet spec.containers{vllm}: Successfully pulled image "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" in 44.465s (44.465s including waiting). Image size: 1755702090 bytes. + Warning Unhealthy 23m (x41 over 29m) kubelet spec.containers{vllm}: Readiness probe failed: Get "http://10.42.0.11:2080/health": dial tcp 10.42.0.11:2080: connect: connection refused + Normal Created 5m53s (x9 over 29m) kubelet spec.containers{vllm}: Container created + Normal Started 5m53s (x9 over 29m) kubelet spec.containers{vllm}: Container started + Normal Pulled 5m53s (x8 over 28m) kubelet spec.containers{vllm}: Container image "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" already present on machine and can be accessed by the pod + Warning BackOff 3m45s (x19 over 27m) kubelet spec.containers{vllm}: Back-off restarting failed container vllm in pod vllm-qwen-3-4b-cpu-7bffcdcdf9-dps92_default(7760c517-3588-4a1a-93d0-774396aeb585) +No resources found in k3d-gpu-agent namespace. +--- logs pod/vllm-qwen-3-4b-cpu-7bffcdcdf9-dps92 +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] Error saving model info cache. +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1311, in mkdir +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] os.mkdir(self, mode) +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] FileNotFoundError: [Errno 2] No such file or directory: '/.cache/vllm/modelinfos' +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] During handling of the above exception, another exception occurred: +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1311, in mkdir +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] os.mkdir(self, mode) +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] FileNotFoundError: [Errno 2] No such file or directory: '/.cache/vllm' +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] During handling of the above exception, another exception occurred: +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] File "/opt/venv/lib/python3.12/site-packages/vllm/model_executor/models/registry.py", line 891, in _save_modelinfo_to_cache +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] cache_dir.mkdir(parents=True, exist_ok=True) +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1315, in mkdir +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] self.parent.mkdir(parents=True, exist_ok=True) +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1315, in mkdir +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] self.parent.mkdir(parents=True, exist_ok=True) +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1311, in mkdir +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] os.mkdir(self, mode) +(APIServer pid=1) ERROR 10-21 00:51:21 [registry.py:896] OSError: [Errno 30] Read-only file system: '/.cache' +(APIServer pid=1) INFO 10-21 00:51:21 [model.py:598] Resolved architecture: Qwen3ForCausalLM +(APIServer pid=1) INFO 10-21 00:51:21 [model.py:1725] Using max model len 32768 +(APIServer pid=1) INFO 10-21 00:51:21 [vllm.py:1006] Asynchronous scheduling is enabled. +(APIServer pid=1) WARNING 10-21 00:51:21 [vllm.py:1062] Enforce eager set, disabling torch.compile and CUDAGraphs. This is equivalent to setting -cc.mode=none -cc.cudagraph_mode=none +(APIServer pid=1) WARNING 10-21 00:51:21 [vllm.py:1110] Inductor compilation was disabled by user settings, optimizations settings that are only active during inductor compilation will be ignored. +(APIServer pid=1) INFO 10-21 00:51:21 [kernel.py:276] Final IR op priority after setting platform defaults: IrOpPriorityConfig(rms_norm=['native'], fused_add_rms_norm=['native']) +(APIServer pid=1) INFO 10-21 00:51:21 [compilation.py:310] Enabled custom fusions: norm_quant, act_quant +(EngineCore pid=111) INFO 10-21 00:51:33 [core.py:114] Initializing a V1 LLM engine (v0.24.0) with config: model='/data/Qwen3-4B', speculative_config=None, tokenizer='/data/Qwen3-4B', skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, tokenizer_revision=None, trust_remote_code=False, dtype=torch.bfloat16, max_seq_len=32768, download_dir=None, load_format=auto, tensor_parallel_size=1, pipeline_parallel_size=1, data_parallel_size=1, decode_context_parallel_size=1, dcp_comm_backend=ag_rs, disable_custom_all_reduce=True, quantization=None, quantization_config=None, enforce_eager=True, enable_return_routed_experts=False, kv_cache_dtype=auto, device_config=cpu, structured_outputs_config=StructuredOutputsConfig(backend='auto', disable_any_whitespace=False, disable_additional_properties=False, reasoning_parser='', reasoning_parser_plugin='', enable_in_reasoning=False), observability_config=ObservabilityConfig(show_hidden_metrics_for_version=None, otlp_traces_endpoint=None, collect_detailed_traces=None, kv_cache_metrics=False, kv_cache_metrics_sample=0.01, cudagraph_metrics=False, enable_layerwise_nvtx_tracing=False, enable_mfu_metrics=False, enable_mm_processor_stats=False, enable_logging_iteration_details=False, jit_monitor_verbose=False), seed=0, served_model_name=Qwen/Qwen3-4B, enable_prefix_caching=True, enable_chunked_prefill=True, pooler_config=None, compilation_config={'mode': , 'debug_dump_path': None, 'cache_dir': '', 'compile_cache_save_format': 'binary', 'backend': 'inductor', 'custom_ops': ['all'], 'ir_enable_torch_wrap': False, 'splitting_ops': [], 'compile_mm_encoder': False, 'cudagraph_mm_encoder': False, 'encoder_cudagraph_token_budgets': [], 'encoder_cudagraph_max_vision_items_per_batch': 0, 'encoder_cudagraph_max_frames_per_batch': None, 'compile_sizes': None, 'compile_ranges_endpoints': [2048], 'inductor_compile_config': {'enable_auto_functionalized_v2': False, 'size_asserts': False, 'alignment_asserts': False, 'scalar_asserts': False}, 'inductor_passes': {}, 'cudagraph_mode': , 'cudagraph_num_of_warmups': 0, 'cudagraph_capture_sizes': [], 'cudagraph_copy_inputs': False, 'cudagraph_specialize_lora': True, 'use_inductor_graph_partition': False, 'pass_config': {'fuse_norm_quant': True, 'fuse_act_quant': True, 'fuse_attn_quant': False, 'enable_sp': False, 'fuse_gemm_comms': False, 'fuse_allreduce_rms': False, 'fuse_rope_kvcache_cat_mla': False, 'fuse_act_padding': False}, 'max_cudagraph_capture_size': None, 'dynamic_shapes_config': {'type': , 'evaluate_guards': False, 'assume_32_bit_indexing': False}, 'local_cache_dir': None, 'fast_moe_cold_start': False, 'static_all_moe_layers': []}, kernel_config=KernelConfig(ir_op_priority=IrOpPriorityConfig(rms_norm=['native'], fused_add_rms_norm=['native']), enable_flashinfer_autotune=True, moe_backend='auto', linear_backend='auto') +(EngineCore pid=111) INFO 10-21 00:51:33 [multiproc_executor.py:140] DP group leader: node_rank=0, node_rank_within_dp=0, master_addr=127.0.0.1, mq_connect_ip=10.42.0.11 (local), world_size=1, local_world_size=1 +(EngineCore pid=111) WARNING 10-21 00:51:33 [ompmultiprocessing.py:63] VLLM_CPU_NUM_OF_RESERVED_CPU is less than the minimum requirement: 1 cores +(EngineCore pid=111) INFO 10-21 00:51:33 [ompmultiprocessing.py:185] OpenMP thread binding info: +(EngineCore pid=111) INFO 10-21 00:51:33 [ompmultiprocessing.py:185] VLLM_CPU_OMP_THREADS_BIND='auto', auto_setup=True, skip_setup=False +(EngineCore pid=111) INFO 10-21 00:51:33 [ompmultiprocessing.py:185] local_world_size=1, reserve_cpu_num=0 +(EngineCore pid=111) INFO 10-21 00:51:33 [ompmultiprocessing.py:185] local_rank=0, core ids=[48, 49, 50, 51, 52, 53, 54, 55] +(EngineCore pid=111) INFO 10-21 00:51:33 [ompmultiprocessing.py:185] reserved_cpus=[] +[W1021 00:51:45.770032002 utils.cpp:41] Warning: numa_migrate_pages failed. errno: 1 (function init_cpu_memory_env) +[W1021 00:51:45.770056840 utils.cpp:68] Warning: NUMA binding: Using MEMBIND policy for memory allocation on the NUMA nodes (0). Memory allocations will be strictly bound to these NUMA nodes. (function init_cpu_memory_env) +(Worker pid=167) INFO 10-21 00:51:45 [parallel_state.py:1588] world_size=1 rank=0 local_rank=0 distributed_init_method=tcp://127.0.0.1:45557 backend=gloo +(Worker pid=167) INFO 10-21 00:51:45 [parallel_state.py:1923] rank 0 in world size 1 is assigned as DP rank 0, PP rank 0, PCP rank 0, TP rank 0, EP rank N/A, EPLB rank N/A +(Worker pid=167) INFO 10-21 00:51:46 [model_runner.py:281] Loading model from scratch... +(Worker pid=167) INFO 10-21 00:51:46 [selector.py:138] Using HND KV cache layout for CPU_ATTN backend. +(Worker pid=167) INFO 10-21 00:51:46 [weight_utils.py:849] Filesystem type for checkpoints: OVERLAY. Checkpoint size: 7.49 GiB. Available RAM: 387.40 GiB. +(Worker pid=167) INFO 10-21 00:51:46 [weight_utils.py:872] Auto-prefetch is disabled because the filesystem (OVERLAY) is not a recognized network FS (NFS/Lustre). If you want to force prefetching, start vLLM with --safetensors-load-strategy=prefetch. +(Worker pid=167) Loading safetensors checkpoint shards: 0% Completed | 0/3 [00:00 agent: OpenVINO/Qwen3-4B-fp16-ov as 'Qwen3-4B-fp16-ov' on CPU, 16 CPU(s) diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/agent.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/agent.yaml new file mode 100644 index 00000000..dad6ed4c --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/agent.yaml @@ -0,0 +1,104 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +# Models and the compiled-model cache live here, so restarts never re-download. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ovms-models + namespace: k3d-gpu-agent +spec: + accessModes: [ReadWriteOnce] + resources: + requests: + storage: 20Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + # --pull downloads the model once and writes its graph.pbtxt (device, + # parsers). On later starts the files are already there and only the + # graph is rewritten, so a device change takes effect with no download. + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + # No liveness probe: compiling a model for a GPU takes minutes. + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: "16" + memory: 6Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + persistentVolumeClaim: + claimName: ovms-models +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/commit.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/commit.txt new file mode 100644 index 00000000..9278487e --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/commit.txt @@ -0,0 +1 @@ +4eaca98f1c54f62acf502364111ba6aad9ed4ae7 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/cpus.txt new file mode 100644 index 00000000..bf30b137 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/cpus.txt @@ -0,0 +1 @@ +B Cpus_allowed_list: 0-7,48-55 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/eat.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/eat.yaml new file mode 100644 index 00000000..b261dfcc --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/eat.yaml @@ -0,0 +1,253 @@ +--- +# Source: vllm/templates/secret.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: Secret +metadata: + name: vllm-qwen-3-4b-cpu-secret + labels: + app: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +type: Opaque +data: +--- +# Source: vllm/templates/configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +data: + http_proxy: "" + https_proxy: "" + no_proxy: "" + TORCHINDUCTOR_CACHE_DIR: "/tmp" + NUMBA_CACHE_DIR: "/tmp" + HF_HOME: "/data" + OUTLINES_CACHE_DIR: "/tmp/.cache/outlines" + VLLM_NO_USAGE_STATS: "1" + DO_NOT_TRACK: "1" + HF_HUB_DISABLE_XET: "1" + TORCH_INDUCTOR_CACHE_DIR: "/tmp/torchinductor_cache" + TRITON_CACHE_DIR: "/tmp/.triton" + USER: "vllm" + VLLM_ALLOW_LONG_MAX_MODEL_LEN: "1" + VLLM_CPU_KVCACHE_SPACE: "6" + VLLM_CPU_NUM_OF_RESERVED_CPU: "0" + VLLM_CPU_SGL_KERNEL: "1" + VLLM_ENGINE_ITERATION_TIMEOUT_S: "120" + VLLM_RPC_TIMEOUT: "100000" +--- +# Source: vllm/templates/pvc.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: vllm-qwen-3-4b-cpu-pvc + namespace: default +spec: + accessModes: + - ReadWriteOnce + storageClassName: local-path + resources: + requests: + storage: 250Gi # Adjust this according to model storage size +--- +# Source: vllm/templates/service.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +# Source: vllm/templates/deployment.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: "performance" + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + # + # serviceAccountName: default + securityContext: + null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + - secretRef: + name: vllm-qwen-3-4b-cpu-secret + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" + imagePullPolicy: IfNotPresent + # command: + # - /bin/bash + # - -c + # - | + # python3 -m vllm.entrypoints.openai.api_server --dtype bfloat16 --model Qwen/Qwen3-4B --port 2080 --tensor-parallel-size 1 --block-size 128 --max-model-len 8192 --disable-log-requests + args: + - "--block-size" + - "128" + - "--dtype" + - "bfloat16" + - "--distributed_executor_backend" + - "mp" + - "--enable_chunked_prefill" + - "--enforce-eager" + - "--max-num-batched-tokens" + - "2048" + - "--max-num-seqs" + - "256" + - "--enable-prefix-caching" + # CPU deployment - add parallelism settings + - "--tensor-parallel-size" + - "1" + - "--pipeline-parallel-size" + - "1" + - "--model" + - "Qwen/Qwen3-4B" + - --served-model-name + - "Qwen/Qwen3-4B" + - "--port" + - "2080" + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 98 + httpGet: + path: /health + port: http + initialDelaySeconds: 120 + periodSeconds: 30 + resources: + requests: + cpu: "16" + memory: "32Gi" + limits: + cpu: "16" + memory: "32Gi" + + volumes: + - name: model-volume + persistentVolumeClaim: + claimName: vllm-qwen-3-4b-cpu-pvc + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - "true" + # extra time to finish processing buffered requests on CPU before pod is forcibly terminated + terminationGracePeriodSeconds: 120 +--- +# Source: vllm/templates/apisixroutes.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/chat-template-configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/ingress.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# Please edit the object below. Lines beginning with a '#' will be ignored, +# and an empty file will abort the edit. If an error occurs while saving this file will be +# reopened with the relevant failures. +--- +# Source: vllm/templates/ingress_eks.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/route.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/servicemonitor.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/image.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/image.txt new file mode 100644 index 00000000..b8534899 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/image.txt @@ -0,0 +1 @@ +vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 docker.io/vllm/vllm-openai-cpu@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 ["--block-size","128","--dtype","bfloat16","--distributed_executor_backend","mp","--enable_chunked_prefill","--enforce-eager","--max-num-batched-tokens","2048","--max-num-seqs","256","--enable-prefix-caching","--tensor-parallel-size","1","--pipeline-parallel-size","1","--model","/data/Qwen3-4B","--served-model-name","Qwen/Qwen3-4B","--port","2080","--max-model-len","32768"] diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/node-cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/node-cpus.txt new file mode 100644 index 00000000..7c5ae641 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/node-cpus.txt @@ -0,0 +1 @@ +node cpuset 0-7,48-55 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/node-image.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/node-image.txt new file mode 100644 index 00000000..33553567 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/node-image.txt @@ -0,0 +1 @@ +cryptoandcoffee/k3d-gpu:0.1.61 sha256:8cd264aa68c77681d7fa474693944de0db8d55de5881253e4029bf72a67e175c diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/notes.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/notes.txt new file mode 100644 index 00000000..ca98af43 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/notes.txt @@ -0,0 +1,185 @@ +block 2 engine C did not come up +NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +default vllm-c-6564f9c959-4gc7q 0/1 Running 9 (5m34s ago) 30m 10.42.0.11 k3d-k3dgpu-x-h7-server-0 +kube-system coredns-577d995dff-ff99k 1/1 Running 0 32m 10.42.0.6 k3d-k3dgpu-x-h7-server-0 +kube-system helm-install-gateway-api-crd-hqf7d 0/1 Completed 0 32m 10.42.0.4 k3d-k3dgpu-x-h7-server-0 +kube-system intel-gpu-plugin-zjwjk 1/1 Running 0 32m 10.42.0.9 k3d-k3dgpu-x-h7-server-0 +kube-system local-path-provisioner-6858d854cf-zd8pg 1/1 Running 0 32m 10.42.0.7 k3d-k3dgpu-x-h7-server-0 +kube-system metrics-server-778c4649b4-rkfzq 1/1 Running 0 32m 10.42.0.8 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-gc-7d6955597d-lm4pp 1/1 Running 0 32m 10.42.0.2 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-master-74b6cfb7df-fthb6 1/1 Running 0 32m 10.42.0.3 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-worker-v5mwc 1/1 Running 0 32m 10.42.0.5 k3d-k3dgpu-x-h7-server-0 +Name: vllm-c-6564f9c959-4gc7q +Namespace: default +Priority: 0 +Service Account: default +Node: k3d-k3dgpu-x-h7-server-0/172.19.0.2 +Start Time: Wed, 21 Oct 2026 03:16:38 +0000 +Labels: app.kubernetes.io/instance=vllm-qwen-3-4b-cpu + app.kubernetes.io/name=vllm + h7x-arm=c + name=vllm + pod-template-hash=6564f9c959 +Annotations: balloon.balloons.resource-policy.nri.io: performance +Status: Running +IP: 10.42.0.11 +IPs: + IP: 10.42.0.11 +Controlled By: ReplicaSet/vllm-c-6564f9c959 +Containers: + vllm: + Container ID: containerd://955942e0f6f0e27b9b395be53d09d4610040e8fa7af9cb548a8d53826e747db9 + Image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + Image ID: docker.io/vllm/vllm-openai-cpu@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + Port: 2080/TCP (http) + Host Port: 0/TCP (http) + SeccompProfile: RuntimeDefault + Args: + --block-size + 128 + --dtype + bfloat16 + --distributed_executor_backend + mp + --enable_chunked_prefill + --max-num-batched-tokens + 2048 + --max-num-seqs + 256 + --enable-prefix-caching + --tensor-parallel-size + 1 + --pipeline-parallel-size + 1 + --model + /data/Qwen3-4B + --served-model-name + Qwen/Qwen3-4B + --port + 2080 + --max-model-len + 32768 + State: Running + Started: Wed, 21 Oct 2026 03:46:11 +0000 + Last State: Terminated + Reason: Error + Exit Code: 1 + Started: Wed, 21 Oct 2026 03:40:10 +0000 + Finished: Wed, 21 Oct 2026 03:41:04 +0000 + Ready: False + Restart Count: 9 + Limits: + cpu: 16 + memory: 32Gi + Requests: + cpu: 16 + memory: 32Gi + Readiness: http-get http://:http/health delay=10s timeout=1s period=5s #success=1 #failure=200 + Environment Variables from: + vllm-qwen-3-4b-cpu-config ConfigMap Optional: false + Environment: + Mounts: + /data from model-volume (rw) + /dev/shm from shm (rw) + /root/.cache/vllm from vllm-cache (rw) + /tmp from tmp (rw) + /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-hdrfb (ro) +Conditions: + Type Status + PodReadyToStartContainers True + Initialized True + Ready False + ContainersReady False + PodScheduled True +Volumes: + model-volume: + Type: HostPath (bare host directory volume) + Path: /var/apb-models + HostPathType: Directory + shm: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: Memory + SizeLimit: 1Gi + tmp: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + vllm-cache: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + kube-api-access-hdrfb: + Type: Projected (a volume that contains injected data from multiple sources) + TokenExpirationSeconds: 3607 + ConfigMapName: kube-root-ca.crt + Optional: false + DownwardAPI: true +QoS Class: Guaranteed +Node-Selectors: +Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s + node.kubernetes.io/unreachable:NoExecute op=Exists for 300s +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Scheduled 30m default-scheduler Successfully assigned default/vllm-c-6564f9c959-4gc7q to k3d-k3dgpu-x-h7-server-0 + Warning Unhealthy 24m (x39 over 29m) kubelet spec.containers{vllm}: Readiness probe failed: Get "http://10.42.0.11:2080/health": dial tcp 10.42.0.11:2080: connect: connection refused + Warning BackOff 4m20s (x19 over 28m) kubelet spec.containers{vllm}: Back-off restarting failed container vllm in pod vllm-c-6564f9c959-4gc7q_default(85ffe1b6-18ba-4f2d-9e11-59c0492a5742) + Normal Pulled 27s (x10 over 30m) kubelet spec.containers{vllm}: Container image "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" already present on machine and can be accessed by the pod + Normal Created 27s (x10 over 30m) kubelet spec.containers{vllm}: Container created + Normal Started 27s (x10 over 30m) kubelet spec.containers{vllm}: Container started +No resources found in k3d-gpu-agent namespace. +--- logs pod/vllm-c-6564f9c959-4gc7q +WARNING 10-21 03:46:23 [argparse_utils.py:257] With `vllm serve`, you should provide the model as a positional argument or in a config file instead of via the `--model` option. The `--model` option will be removed in a future version. +(APIServer pid=1) INFO 10-21 03:46:23 [api_utils.py:339] +(APIServer pid=1) INFO 10-21 03:46:23 [api_utils.py:339] █ █ █▄ ▄█ +(APIServer pid=1) INFO 10-21 03:46:23 [api_utils.py:339] ▄▄ ▄█ █ █ █ ▀▄▀ █ version 0.24.0 +(APIServer pid=1) INFO 10-21 03:46:23 [api_utils.py:339] █▄█▀ █ █ █ █ model /data/Qwen3-4B +(APIServer pid=1) INFO 10-21 03:46:23 [api_utils.py:339] ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀ ▀ +(APIServer pid=1) INFO 10-21 03:46:23 [api_utils.py:339] +(APIServer pid=1) INFO 10-21 03:46:23 [api_utils.py:273] non-default args: {'model_tag': '/data/Qwen3-4B', 'port': 2080, 'model': '/data/Qwen3-4B', 'dtype': 'bfloat16', 'max_model_len': 32768, 'served_model_name': ['Qwen/Qwen3-4B'], 'distributed_executor_backend': 'mp', 'block_size': 128, 'enable_prefix_caching': True, 'max_num_batched_tokens': 2048, 'max_num_seqs': 256, 'enable_chunked_prefill': True} +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_RPC_TIMEOUT +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_SERVICE_HOST +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP_PROTO +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP_ADDR +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP_ADDR +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_SERVICE_PORT_VLLM +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP_PORT +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_SERVICE_PORT_VLLM +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP_PROTO +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP_PORT +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP +(APIServer pid=1) WARNING 10-21 03:46:23 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_SERVICE_HOST +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] Error saving model info cache. +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1311, in mkdir +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] os.mkdir(self, mode) +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] FileNotFoundError: [Errno 2] No such file or directory: '/.cache/vllm/modelinfos' +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] During handling of the above exception, another exception occurred: +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1311, in mkdir +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] os.mkdir(self, mode) +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] FileNotFoundError: [Errno 2] No such file or directory: '/.cache/vllm' +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] During handling of the above exception, another exception occurred: +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] File "/opt/venv/lib/python3.12/site-packages/vllm/model_executor/models/registry.py", line 891, in _save_modelinfo_to_cache +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] cache_dir.mkdir(parents=True, exist_ok=True) +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1315, in mkdir +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] self.parent.mkdir(parents=True, exist_ok=True) +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1315, in mkdir +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] self.parent.mkdir(parents=True, exist_ok=True) +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1311, in mkdir +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] os.mkdir(self, mode) +(APIServer pid=1) ERROR 10-21 03:46:36 [registry.py:896] OSError: [Errno 30] Read-only file system: '/.cache' +(APIServer pid=1) INFO 10-21 03:46:36 [model.py:598] Resolved architecture: Qwen3ForCausalLM +(APIServer pid=1) INFO 10-21 03:46:36 [model.py:1725] Using max model len 32768 +(APIServer pid=1) INFO 10-21 03:46:36 [vllm.py:1006] Asynchronous scheduling is enabled. +(APIServer pid=1) INFO 10-21 03:46:36 [kernel.py:276] Final IR op priority after setting platform defaults: IrOpPriorityConfig(rms_norm=['native'], fused_add_rms_norm=['native']) diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/ovms.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/ovms.yaml new file mode 100644 index 00000000..d140d0b9 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/ovms.yaml @@ -0,0 +1,89 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: '16' + memory: 6Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + hostPath: + path: /var/apb-models + type: Directory +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/values.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/values.yaml new file mode 100644 index 00000000..c1dc074b --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/values.yaml @@ -0,0 +1,437 @@ +accelDevice: '' +cpu_balloon_annotation: performance +resources: + requests: + cpu: '{{ .Values.cpu }}' + memory: '{{ .Values.memory }}' +block_size: 128 +max_num_seqs: 256 +max_seq_len_to_capture: 2048 +d_type: bfloat16 +max_model_len: 8192 +image: + repository: vllm/vllm-openai-cpu + tag: v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + pullPolicy: IfNotPresent +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' +VLLM_CPU_SGL_KERNEL: '1' +VLLM_NO_USAGE_STATS: 1 +DO_NOT_TRACK: 1 +LLM_MODEL_ID: '' +modelConfigs: + meta-llama/Llama-3.1-8B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + HF_HUB_DISABLE_XET: '1' + VLLM_CPU_SGL_KERNEL: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + speculativeConfig: '{"method":"draft_model","model":"meta-llama/Llama-3.2-1B-Instruct","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + meta-llama/Llama-3.2-3B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + deepseek-ai/DeepSeek-R1-Distill-Qwen-32B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + deepseek-ai/DeepSeek-R1-Distill-Llama-8B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-1.7B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - hermes + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-4B-Instruct-2507: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - hermes + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen2.5-Coder-7B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_coder + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-Coder-30B-A3B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '2' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --trust-remote-code + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + speculativeConfig: '{"method":"draft_model","model":"Qwen/Qwen3-0.6B","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen2.5-Coder-14B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCHDYNAMO_DISABLE: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + speculativeConfig: '{"method":"draft_model","model":"Qwen/Qwen2.5-Coder-0.5B-Instruct","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + HF_HUB_OFFLINE: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-30B-A3B-Instruct-2507: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + HF_HUB_DISABLE_XET: '1' + VLLM_CPU_SGL_KERNEL: '1' + TRITON_CACHE_DIR: /tmp/.triton + TORCHINDUCTOR_CACHE_DIR: /tmp/.torch_compile + XDG_CACHE_HOME: /tmp/.cache + HF_HOME: /tmp/.cache/huggingface + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + google/gemma-4-26B-A4B-it: + configMapValues: + TRITON_CACHE_DIR: /tmp/.triton + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - gemma4 + - --chat-template + - /workspace/vllm/examples/tool_chat_template_gemma4.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + openai/whisper-small: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCHDYNAMO_DISABLE: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + XDG_CACHE_HOME: /tmp/.cache + HF_HOME: /tmp/huggingface + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --dtype + - float32 + - --enforce-eager + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' +defaultModelConfigs: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' +memory: 16Gi +cpu: '8' diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm-c.err b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm-c.err new file mode 100644 index 00000000..e69de29b diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm-c.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm-c.yaml new file mode 100644 index 00000000..6e128bcd --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm-c.yaml @@ -0,0 +1,175 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-c-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +data: + http_proxy: '' + https_proxy: '' + no_proxy: '' + TORCHINDUCTOR_CACHE_DIR: /tmp + NUMBA_CACHE_DIR: /tmp + HF_HOME: /data + OUTLINES_CACHE_DIR: /tmp/.cache/outlines + VLLM_NO_USAGE_STATS: '1' + DO_NOT_TRACK: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_RPC_TIMEOUT: '100000' + HF_HUB_OFFLINE: '1' +--- +apiVersion: v1 +kind: Service +metadata: + name: vllm-c-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + h7x-arm: c +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-c + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + h7x-arm: c + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: performance + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + h7x-arm: c + spec: + securityContext: null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + imagePullPolicy: IfNotPresent + args: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --tensor-parallel-size + - '1' + - --pipeline-parallel-size + - '1' + - --model + - /data/Qwen3-4B + - --served-model-name + - Qwen/Qwen3-4B + - --port + - '2080' + - --max-model-len + - '32768' + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 200 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: '16' + memory: 32Gi + limits: + cpu: '16' + memory: 32Gi + volumes: + - name: model-volume + hostPath: + path: /var/apb-models + type: Directory + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' + terminationGracePeriodSeconds: 120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm.yaml new file mode 100644 index 00000000..a8947c63 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/h7x-20261021-031357/vllm.yaml @@ -0,0 +1,173 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +data: + http_proxy: '' + https_proxy: '' + no_proxy: '' + TORCHINDUCTOR_CACHE_DIR: /tmp + NUMBA_CACHE_DIR: /tmp + HF_HOME: /data + OUTLINES_CACHE_DIR: /tmp/.cache/outlines + VLLM_NO_USAGE_STATS: '1' + DO_NOT_TRACK: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_RPC_TIMEOUT: '100000' + HF_HUB_OFFLINE: '1' +--- +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: performance + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + securityContext: null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + imagePullPolicy: IfNotPresent + args: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --tensor-parallel-size + - '1' + - --pipeline-parallel-size + - '1' + - --model + - /data/Qwen3-4B + - --served-model-name + - Qwen/Qwen3-4B + - --port + - '2080' + - --max-model-len + - '32768' + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 200 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: '16' + memory: 32Gi + limits: + cpu: '16' + memory: 32Gi + volumes: + - name: model-volume + hostPath: + path: /var/apb-models + type: Directory + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' + terminationGracePeriodSeconds: 120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/post.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/post.txt new file mode 100644 index 00000000..96c8d050 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/post.txt @@ -0,0 +1,16 @@ +2026-10-21T03:46:41Z + 03:46:41 up 35 days, 5:01, 12 users, load average: 2.77, 2.28, 2.91 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +42.0 3899938 root sglang::schedul +39.7 3900351 root sglang::schedul +24.4 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3455486844 181599520 96% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/pre.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/pre.txt new file mode 100644 index 00000000..0d69392a --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/pre.txt @@ -0,0 +1,16 @@ +2026-10-21T03:13:57Z + 03:13:57 up 35 days, 4:28, 9 users, load average: 4.08, 4.08, 3.46 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +42.0 3899938 root sglang::schedul +39.7 3900351 root sglang::schedul +24.4 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3456527968 180558396 96% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/rc b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/rc new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/rc @@ -0,0 +1 @@ +0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/serving.jsonl b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/serving.jsonl new file mode 100644 index 00000000..00d1e857 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/serving.jsonl @@ -0,0 +1,196 @@ +{"ts": 1792552447.369, "seconds": 10.0, "load1": 3.52, "cpu": {"qwen38-b-hr": 1.026, "qwen38-a-hr": 1.152, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.06, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.021, "xpumd": 0.003}, "serving_cpu": 2.503, "aiperf_procs": 0} +{"ts": 1792552457.403, "seconds": 10.034, "load1": 2.98, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.149, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.021, "node-exporter": 0.028, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.42, "aiperf_procs": 0} +{"ts": 1792552467.435, "seconds": 10.032, "load1": 2.84, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.028, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792552477.467, "seconds": 10.032, "load1": 3.17, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.016, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.364, "aiperf_procs": 0} +{"ts": 1792552487.497, "seconds": 10.03, "load1": 3.0, "cpu": {"qwen38-b-hr": 0.955, "qwen38-a-hr": 1.096, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.311, "aiperf_procs": 0} +{"ts": 1792552497.529, "seconds": 10.032, "load1": 2.76, "cpu": {"qwen38-b-hr": 0.928, "qwen38-a-hr": 1.088, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.048, "xpumd": 0.002}, "serving_cpu": 2.311, "aiperf_procs": 0} +{"ts": 1792552507.643, "seconds": 10.114, "load1": 2.73, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.108, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.032, "xpumd": 0.003}, "serving_cpu": 2.369, "aiperf_procs": 0} +{"ts": 1792552517.675, "seconds": 10.032, "load1": 3.24, "cpu": {"qwen38-b-hr": 0.971, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.027, "xpumd": 0.002}, "serving_cpu": 2.361, "aiperf_procs": 0} +{"ts": 1792552527.71, "seconds": 10.036, "load1": 2.74, "cpu": {"qwen38-b-hr": 0.954, "qwen38-a-hr": 1.099, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.02, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.312, "aiperf_procs": 0} +{"ts": 1792552537.744, "seconds": 10.033, "load1": 3.1, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.015, "xpumd": 0.002}, "serving_cpu": 2.366, "aiperf_procs": 0} +{"ts": 1792552547.775, "seconds": 10.032, "load1": 3.16, "cpu": {"qwen38-b-hr": 0.972, "qwen38-a-hr": 1.114, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.023, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.018, "xpumd": 0.003}, "serving_cpu": 2.373, "aiperf_procs": 0} +{"ts": 1792552557.805, "seconds": 10.03, "load1": 3.3, "cpu": {"qwen38-b-hr": 0.95, "qwen38-a-hr": 1.124, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.333, "aiperf_procs": 0} +{"ts": 1792552567.905, "seconds": 10.1, "load1": 3.02, "cpu": {"qwen38-b-hr": 1.014, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.403, "aiperf_procs": 0} +{"ts": 1792552577.939, "seconds": 10.035, "load1": 2.94, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.377, "aiperf_procs": 0} +{"ts": 1792552587.968, "seconds": 10.029, "load1": 2.94, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.188, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.035, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.031, "xpumd": 0.002}, "serving_cpu": 2.476, "aiperf_procs": 0} +{"ts": 1792552597.999, "seconds": 10.031, "load1": 2.72, "cpu": {"qwen38-b-hr": 1.014, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.425, "aiperf_procs": 0} +{"ts": 1792552608.031, "seconds": 10.031, "load1": 2.91, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.172, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.419, "aiperf_procs": 0} +{"ts": 1792552618.063, "seconds": 10.032, "load1": 3.24, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.378, "aiperf_procs": 0} +{"ts": 1792552628.167, "seconds": 10.104, "load1": 3.42, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.158, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.414, "aiperf_procs": 0} +{"ts": 1792552638.197, "seconds": 10.03, "load1": 3.75, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.155, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.39, "aiperf_procs": 0} +{"ts": 1792552648.23, "seconds": 10.033, "load1": 3.87, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.137, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792552658.264, "seconds": 10.034, "load1": 3.81, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.148, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.021, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.432, "aiperf_procs": 0} +{"ts": 1792552668.297, "seconds": 10.033, "load1": 3.92, "cpu": {"qwen38-b-hr": 0.978, "qwen38-a-hr": 1.148, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.38, "aiperf_procs": 0} +{"ts": 1792552678.329, "seconds": 10.032, "load1": 4.01, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.168, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.407, "aiperf_procs": 0} +{"ts": 1792552688.447, "seconds": 10.117, "load1": 4.98, "cpu": {"qwen38-b-hr": 1.004, "qwen38-a-hr": 1.162, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.423, "aiperf_procs": 0} +{"ts": 1792552698.476, "seconds": 10.03, "load1": 4.83, "cpu": {"qwen38-b-hr": 0.972, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.009, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.003}, "serving_cpu": 2.379, "aiperf_procs": 0} +{"ts": 1792552708.508, "seconds": 10.032, "load1": 4.54, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.161, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.009, "xpumd": 0.002}, "serving_cpu": 2.422, "aiperf_procs": 0} +{"ts": 1792552718.541, "seconds": 10.034, "load1": 4.15, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 2.421, "aiperf_procs": 0} +{"ts": 1792552728.571, "seconds": 10.03, "load1": 3.91, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.003}, "serving_cpu": 2.392, "aiperf_procs": 0} +{"ts": 1792552738.601, "seconds": 10.03, "load1": 3.93, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.165, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.405, "aiperf_procs": 0} +{"ts": 1792552748.719, "seconds": 10.118, "load1": 3.94, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.357, "aiperf_procs": 0} +{"ts": 1792552758.748, "seconds": 10.029, "load1": 3.56, "cpu": {"qwen38-b-hr": 0.993, "qwen38-a-hr": 1.154, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792552768.779, "seconds": 10.031, "load1": 3.78, "cpu": {"qwen38-b-hr": 1.005, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.018, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.423, "aiperf_procs": 0} +{"ts": 1792552778.814, "seconds": 10.035, "load1": 8.24, "cpu": {"qwen38-b-hr": 1.023, "qwen38-a-hr": 1.148, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.006, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.439, "aiperf_procs": 0} +{"ts": 1792552788.845, "seconds": 10.031, "load1": 7.5, "cpu": {"qwen38-b-hr": 1.012, "qwen38-a-hr": 1.166, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.006, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.441, "aiperf_procs": 0} +{"ts": 1792552798.877, "seconds": 10.032, "load1": 7.04, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.009, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.386, "aiperf_procs": 0} +{"ts": 1792552808.993, "seconds": 10.116, "load1": 6.82, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.15, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.012, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.413, "aiperf_procs": 0} +{"ts": 1792552819.026, "seconds": 10.033, "load1": 6.54, "cpu": {"qwen38-b-hr": 1.021, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.008, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.435, "aiperf_procs": 0} +{"ts": 1792552829.056, "seconds": 10.03, "load1": 6.08, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.15, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792552839.086, "seconds": 10.03, "load1": 5.76, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.02, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.008, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.027, "xpumd": 0.003}, "serving_cpu": 2.423, "aiperf_procs": 0} +{"ts": 1792552849.117, "seconds": 10.031, "load1": 5.72, "cpu": {"qwen38-b-hr": 1.017, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.002}, "serving_cpu": 2.425, "aiperf_procs": 0} +{"ts": 1792552859.147, "seconds": 10.03, "load1": 5.37, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.154, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.016, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.439, "aiperf_procs": 0} +{"ts": 1792552869.259, "seconds": 10.112, "load1": 5.31, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.008, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.379, "aiperf_procs": 0} +{"ts": 1792552879.289, "seconds": 10.03, "load1": 5.11, "cpu": {"qwen38-b-hr": 1.017, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.418, "aiperf_procs": 0} +{"ts": 1792552889.322, "seconds": 10.033, "load1": 5.02, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.39, "aiperf_procs": 0} +{"ts": 1792552899.353, "seconds": 10.031, "load1": 5.02, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.404, "aiperf_procs": 0} +{"ts": 1792552909.387, "seconds": 10.034, "load1": 5.09, "cpu": {"qwen38-b-hr": 1.008, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.413, "aiperf_procs": 0} +{"ts": 1792552919.417, "seconds": 10.03, "load1": 5.15, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.406, "aiperf_procs": 0} +{"ts": 1792552929.521, "seconds": 10.104, "load1": 5.2, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.168, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.064, "xpumd": 0.002}, "serving_cpu": 2.503, "aiperf_procs": 0} +{"ts": 1792552939.552, "seconds": 10.032, "load1": 5.25, "cpu": {"qwen38-b-hr": 1.026, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.017, "xpumd": 0.002}, "serving_cpu": 2.431, "aiperf_procs": 0} +{"ts": 1792552949.584, "seconds": 10.032, "load1": 5.05, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.405, "aiperf_procs": 0} +{"ts": 1792552959.617, "seconds": 10.033, "load1": 4.97, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.152, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.42, "aiperf_procs": 0} +{"ts": 1792552969.649, "seconds": 10.033, "load1": 4.74, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.035, "xpumd": 0.003}, "serving_cpu": 2.446, "aiperf_procs": 0} +{"ts": 1792552979.681, "seconds": 10.032, "load1": 4.55, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.15, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792552989.795, "seconds": 10.114, "load1": 4.24, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.38, "aiperf_procs": 0} +{"ts": 1792552999.826, "seconds": 10.03, "load1": 3.96, "cpu": {"qwen38-b-hr": 1.027, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.429, "aiperf_procs": 0} +{"ts": 1792553009.862, "seconds": 10.036, "load1": 3.89, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.017, "xpumd": 0.002}, "serving_cpu": 2.402, "aiperf_procs": 0} +{"ts": 1792553019.895, "seconds": 10.034, "load1": 4.07, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.12, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.361, "aiperf_procs": 0} +{"ts": 1792553029.929, "seconds": 10.033, "load1": 3.98, "cpu": {"qwen38-b-hr": 1.004, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.013, "xpumd": 0.003}, "serving_cpu": 2.42, "aiperf_procs": 0} +{"ts": 1792553039.96, "seconds": 10.032, "load1": 3.68, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.412, "aiperf_procs": 0} +{"ts": 1792553050.066, "seconds": 10.106, "load1": 3.5, "cpu": {"qwen38-b-hr": 1.005, "qwen38-a-hr": 1.166, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.002}, "serving_cpu": 2.453, "aiperf_procs": 0} +{"ts": 1792553060.095, "seconds": 10.029, "load1": 3.35, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.392, "aiperf_procs": 0} +{"ts": 1792553070.127, "seconds": 10.032, "load1": 3.22, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.018, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.433, "aiperf_procs": 0} +{"ts": 1792553080.158, "seconds": 10.031, "load1": 3.5, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.003}, "serving_cpu": 2.417, "aiperf_procs": 0} +{"ts": 1792553090.189, "seconds": 10.03, "load1": 3.34, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.006, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.404, "aiperf_procs": 0} +{"ts": 1792553100.219, "seconds": 10.03, "load1": 3.43, "cpu": {"qwen38-b-hr": 0.971, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.366, "aiperf_procs": 0} +{"ts": 1792553110.324, "seconds": 10.104, "load1": 3.21, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.178, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.377, "aiperf_procs": 0} +{"ts": 1792553120.354, "seconds": 10.03, "load1": 3.49, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.008, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792553130.383, "seconds": 10.029, "load1": 3.42, "cpu": {"qwen38-b-hr": 1.002, "qwen38-a-hr": 1.154, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.018, "xpumd": 0.002}, "serving_cpu": 2.428, "aiperf_procs": 0} +{"ts": 1792553140.413, "seconds": 10.03, "load1": 3.59, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.386, "aiperf_procs": 0} +{"ts": 1792553150.446, "seconds": 10.033, "load1": 3.73, "cpu": {"qwen38-b-hr": 0.966, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.373, "aiperf_procs": 0} +{"ts": 1792553160.475, "seconds": 10.029, "load1": 3.76, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.027, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.413, "aiperf_procs": 0} +{"ts": 1792553170.6, "seconds": 10.125, "load1": 3.87, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.15, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.036, "prometheus": 0.011, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.408, "aiperf_procs": 0} +{"ts": 1792553180.63, "seconds": 10.03, "load1": 3.73, "cpu": {"qwen38-b-hr": 0.97, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792553190.662, "seconds": 10.032, "load1": 3.69, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.137, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.034, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.397, "aiperf_procs": 0} +{"ts": 1792553200.694, "seconds": 10.033, "load1": 3.66, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.149, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.404, "aiperf_procs": 0} +{"ts": 1792553210.726, "seconds": 10.031, "load1": 3.79, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.003}, "serving_cpu": 2.384, "aiperf_procs": 0} +{"ts": 1792553220.756, "seconds": 10.03, "load1": 3.83, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.185, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.452, "aiperf_procs": 0} +{"ts": 1792553230.881, "seconds": 10.124, "load1": 3.94, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.165, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.415, "aiperf_procs": 0} +{"ts": 1792553240.912, "seconds": 10.031, "load1": 3.8, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.177, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.036, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.378, "aiperf_procs": 0} +{"ts": 1792553250.943, "seconds": 10.031, "load1": 3.76, "cpu": {"qwen38-b-hr": 1.014, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.037, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.42, "aiperf_procs": 0} +{"ts": 1792553260.972, "seconds": 10.029, "load1": 3.73, "cpu": {"qwen38-b-hr": 0.99, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.394, "aiperf_procs": 0} +{"ts": 1792553271.002, "seconds": 10.029, "load1": 4.01, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.156, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.422, "aiperf_procs": 0} +{"ts": 1792553281.033, "seconds": 10.032, "load1": 4.01, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.151, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.414, "aiperf_procs": 0} +{"ts": 1792553291.147, "seconds": 10.114, "load1": 4.01, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.371, "aiperf_procs": 0} +{"ts": 1792553301.179, "seconds": 10.032, "load1": 3.93, "cpu": {"qwen38-b-hr": 0.994, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.407, "aiperf_procs": 0} +{"ts": 1792553311.21, "seconds": 10.031, "load1": 5.3, "cpu": {"qwen38-b-hr": 1.016, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.411, "aiperf_procs": 0} +{"ts": 1792553321.242, "seconds": 10.032, "load1": 4.95, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.157, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.002}, "serving_cpu": 2.439, "aiperf_procs": 0} +{"ts": 1792553331.274, "seconds": 10.031, "load1": 4.73, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.397, "aiperf_procs": 0} +{"ts": 1792553341.307, "seconds": 10.033, "load1": 4.32, "cpu": {"qwen38-b-hr": 1.022, "qwen38-a-hr": 1.18, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.464, "aiperf_procs": 0} +{"ts": 1792553351.416, "seconds": 10.11, "load1": 4.19, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.155, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.406, "aiperf_procs": 0} +{"ts": 1792553361.447, "seconds": 10.031, "load1": 4.0, "cpu": {"qwen38-b-hr": 1.005, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.4, "aiperf_procs": 0} +{"ts": 1792553371.48, "seconds": 10.032, "load1": 4.0, "cpu": {"qwen38-b-hr": 0.973, "qwen38-a-hr": 1.12, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.355, "aiperf_procs": 0} +{"ts": 1792553381.51, "seconds": 10.03, "load1": 4.23, "cpu": {"qwen38-b-hr": 1.002, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.062, "xpumd": 0.003}, "serving_cpu": 2.431, "aiperf_procs": 0} +{"ts": 1792553391.54, "seconds": 10.03, "load1": 4.12, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.002}, "serving_cpu": 2.384, "aiperf_procs": 0} +{"ts": 1792553401.568, "seconds": 10.029, "load1": 4.17, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.012, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792553411.686, "seconds": 10.117, "load1": 4.28, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.177, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.002}, "serving_cpu": 2.4, "aiperf_procs": 0} +{"ts": 1792553421.715, "seconds": 10.03, "load1": 4.24, "cpu": {"qwen38-b-hr": 0.982, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.009, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.381, "aiperf_procs": 0} +{"ts": 1792553431.746, "seconds": 10.031, "load1": 4.35, "cpu": {"qwen38-b-hr": 1.005, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.177, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.009, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.023, "xpumd": 0.002}, "serving_cpu": 2.414, "aiperf_procs": 0} +{"ts": 1792553441.776, "seconds": 10.031, "load1": 4.23, "cpu": {"qwen38-b-hr": 1.016, "qwen38-a-hr": 1.154, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.009, "xpumd": 0.002}, "serving_cpu": 2.444, "aiperf_procs": 0} +{"ts": 1792553451.812, "seconds": 10.036, "load1": 3.9, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.158, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.003}, "serving_cpu": 2.428, "aiperf_procs": 0} +{"ts": 1792553461.844, "seconds": 10.032, "load1": 3.83, "cpu": {"qwen38-b-hr": 0.978, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.371, "aiperf_procs": 0} +{"ts": 1792553471.968, "seconds": 10.123, "load1": 4.03, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.153, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.41, "aiperf_procs": 0} +{"ts": 1792553482.001, "seconds": 10.033, "load1": 3.8, "cpu": {"qwen38-b-hr": 0.975, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.006, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.028, "xpumd": 0.002}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792553492.031, "seconds": 10.03, "load1": 3.67, "cpu": {"qwen38-b-hr": 0.982, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.008, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792553502.064, "seconds": 10.033, "load1": 3.34, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.008, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792553512.099, "seconds": 10.035, "load1": 3.06, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.003}, "serving_cpu": 2.37, "aiperf_procs": 0} +{"ts": 1792553522.13, "seconds": 10.03, "load1": 3.05, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.378, "aiperf_procs": 0} +{"ts": 1792553532.245, "seconds": 10.116, "load1": 3.05, "cpu": {"qwen38-b-hr": 1.008, "qwen38-a-hr": 1.106, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.02, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.38, "aiperf_procs": 0} +{"ts": 1792553542.278, "seconds": 10.033, "load1": 3.05, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.177, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.006, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.004}, "serving_cpu": 2.398, "aiperf_procs": 0} +{"ts": 1792553552.309, "seconds": 10.031, "load1": 2.81, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.026, "xpumd": 0.003}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792553562.341, "seconds": 10.031, "load1": 2.83, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 2.418, "aiperf_procs": 0} +{"ts": 1792553572.374, "seconds": 10.034, "load1": 2.71, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.016, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.002}, "serving_cpu": 2.398, "aiperf_procs": 0} +{"ts": 1792553582.406, "seconds": 10.032, "load1": 2.91, "cpu": {"qwen38-b-hr": 0.99, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.378, "aiperf_procs": 0} +{"ts": 1792553592.521, "seconds": 10.116, "load1": 2.84, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.155, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.415, "aiperf_procs": 0} +{"ts": 1792553602.554, "seconds": 10.033, "load1": 2.72, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792553612.584, "seconds": 10.031, "load1": 2.99, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.397, "aiperf_procs": 0} +{"ts": 1792553622.616, "seconds": 10.032, "load1": 3.39, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.177, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.414, "aiperf_procs": 0} +{"ts": 1792553632.648, "seconds": 10.032, "load1": 3.65, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.008, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792553642.682, "seconds": 10.034, "load1": 3.85, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.388, "aiperf_procs": 0} +{"ts": 1792553652.781, "seconds": 10.099, "load1": 4.26, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.008, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.381, "aiperf_procs": 0} +{"ts": 1792553662.81, "seconds": 10.029, "load1": 4.29, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.138, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.176, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792553672.84, "seconds": 10.03, "load1": 4.32, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.177, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.018, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.378, "aiperf_procs": 0} +{"ts": 1792553682.87, "seconds": 10.03, "load1": 4.27, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.138, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.402, "aiperf_procs": 0} +{"ts": 1792553692.902, "seconds": 10.032, "load1": 4.23, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.152, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.421, "aiperf_procs": 0} +{"ts": 1792553702.931, "seconds": 10.029, "load1": 4.04, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.177, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.008, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.389, "aiperf_procs": 0} +{"ts": 1792553713.041, "seconds": 10.11, "load1": 3.65, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.002}, "serving_cpu": 2.39, "aiperf_procs": 0} +{"ts": 1792553723.073, "seconds": 10.033, "load1": 3.54, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.367, "aiperf_procs": 0} +{"ts": 1792553733.103, "seconds": 10.029, "load1": 3.24, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.35, "aiperf_procs": 0} +{"ts": 1792553743.133, "seconds": 10.031, "load1": 2.97, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.359, "aiperf_procs": 0} +{"ts": 1792553753.167, "seconds": 10.034, "load1": 2.9, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.108, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.347, "aiperf_procs": 0} +{"ts": 1792553763.199, "seconds": 10.032, "load1": 2.76, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.017, "node-exporter": 0.029, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792553773.303, "seconds": 10.104, "load1": 2.65, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.069, "xpumd": 0.003}, "serving_cpu": 2.419, "aiperf_procs": 0} +{"ts": 1792553783.333, "seconds": 10.03, "load1": 2.39, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.158, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.002}, "serving_cpu": 2.431, "aiperf_procs": 0} +{"ts": 1792553793.363, "seconds": 10.03, "load1": 2.25, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.148, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.014, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.392, "aiperf_procs": 0} +{"ts": 1792553803.392, "seconds": 10.029, "load1": 2.06, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.121, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.355, "aiperf_procs": 0} +{"ts": 1792553813.422, "seconds": 10.03, "load1": 2.19, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.002}, "serving_cpu": 2.417, "aiperf_procs": 0} +{"ts": 1792553823.454, "seconds": 10.032, "load1": 2.15, "cpu": {"qwen38-b-hr": 0.994, "qwen38-a-hr": 1.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.367, "aiperf_procs": 0} +{"ts": 1792553833.549, "seconds": 10.095, "load1": 2.28, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.153, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792553843.581, "seconds": 10.033, "load1": 1.92, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.001}, "serving_cpu": 2.41, "aiperf_procs": 0} +{"ts": 1792553853.614, "seconds": 10.033, "load1": 1.86, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.345, "aiperf_procs": 0} +{"ts": 1792553863.647, "seconds": 10.033, "load1": 1.96, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.16, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.024, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.417, "aiperf_procs": 0} +{"ts": 1792553873.676, "seconds": 10.03, "load1": 2.44, "cpu": {"qwen38-b-hr": 1.026, "qwen38-a-hr": 1.156, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.437, "aiperf_procs": 0} +{"ts": 1792553883.708, "seconds": 10.031, "load1": 2.53, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.164, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.003}, "serving_cpu": 2.44, "aiperf_procs": 0} +{"ts": 1792553893.825, "seconds": 10.118, "load1": 2.6, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792553903.857, "seconds": 10.031, "load1": 2.82, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.16, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.429, "aiperf_procs": 0} +{"ts": 1792553913.887, "seconds": 10.03, "load1": 3.31, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.015, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.402, "aiperf_procs": 0} +{"ts": 1792553923.917, "seconds": 10.03, "load1": 3.25, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.394, "aiperf_procs": 0} +{"ts": 1792553933.947, "seconds": 10.031, "load1": 3.13, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.377, "aiperf_procs": 0} +{"ts": 1792553943.976, "seconds": 10.029, "load1": 2.65, "cpu": {"qwen38-b-hr": 1.012, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792553954.09, "seconds": 10.114, "load1": 2.32, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.405, "aiperf_procs": 0} +{"ts": 1792553964.12, "seconds": 10.03, "load1": 2.34, "cpu": {"qwen38-b-hr": 1.002, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792553974.149, "seconds": 10.029, "load1": 2.45, "cpu": {"qwen38-b-hr": 0.975, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.003}, "serving_cpu": 2.369, "aiperf_procs": 0} +{"ts": 1792553984.18, "seconds": 10.031, "load1": 2.07, "cpu": {"qwen38-b-hr": 0.972, "qwen38-a-hr": 1.138, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.001}, "serving_cpu": 2.368, "aiperf_procs": 0} +{"ts": 1792553994.214, "seconds": 10.034, "load1": 1.83, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.371, "aiperf_procs": 0} +{"ts": 1792554004.245, "seconds": 10.031, "load1": 1.84, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.149, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.017, "xpumd": 0.002}, "serving_cpu": 2.415, "aiperf_procs": 0} +{"ts": 1792554014.346, "seconds": 10.102, "load1": 1.8, "cpu": {"qwen38-b-hr": 0.964, "qwen38-a-hr": 1.159, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.379, "aiperf_procs": 0} +{"ts": 1792554024.377, "seconds": 10.031, "load1": 2.06, "cpu": {"qwen38-b-hr": 0.967, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.367, "aiperf_procs": 0} +{"ts": 1792554034.41, "seconds": 10.033, "load1": 2.13, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.165, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.015, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.421, "aiperf_procs": 0} +{"ts": 1792554044.441, "seconds": 10.031, "load1": 2.18, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792554054.472, "seconds": 10.031, "load1": 2.47, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.166, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.035, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.433, "aiperf_procs": 0} +{"ts": 1792554064.503, "seconds": 10.031, "load1": 2.46, "cpu": {"qwen38-b-hr": 1.017, "qwen38-a-hr": 1.162, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.008, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.436, "aiperf_procs": 0} +{"ts": 1792554074.624, "seconds": 10.121, "load1": 2.39, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.376, "aiperf_procs": 0} +{"ts": 1792554084.654, "seconds": 10.031, "load1": 2.33, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.157, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.163, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792554094.69, "seconds": 10.036, "load1": 2.13, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.377, "aiperf_procs": 0} +{"ts": 1792554104.722, "seconds": 10.032, "load1": 2.19, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.163, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.019, "xpumd": 0.003}, "serving_cpu": 2.407, "aiperf_procs": 0} +{"ts": 1792554114.752, "seconds": 10.03, "load1": 2.0, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.165, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.051, "xpumd": 0.002}, "serving_cpu": 2.437, "aiperf_procs": 0} +{"ts": 1792554124.785, "seconds": 10.033, "load1": 2.15, "cpu": {"qwen38-b-hr": 1.012, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.003}, "serving_cpu": 2.432, "aiperf_procs": 0} +{"ts": 1792554134.896, "seconds": 10.111, "load1": 2.43, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.157, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.002}, "serving_cpu": 2.415, "aiperf_procs": 0} +{"ts": 1792554144.929, "seconds": 10.032, "load1": 2.75, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.395, "aiperf_procs": 0} +{"ts": 1792554154.961, "seconds": 10.032, "load1": 3.1, "cpu": {"qwen38-b-hr": 1.002, "qwen38-a-hr": 1.152, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.015, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.019, "xpumd": 0.002}, "serving_cpu": 2.431, "aiperf_procs": 0} +{"ts": 1792554164.99, "seconds": 10.03, "load1": 3.3, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.373, "aiperf_procs": 0} +{"ts": 1792554175.023, "seconds": 10.033, "load1": 2.94, "cpu": {"qwen38-b-hr": 0.969, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.021, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792554185.053, "seconds": 10.03, "load1": 2.72, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.398, "aiperf_procs": 0} +{"ts": 1792554195.173, "seconds": 10.121, "load1": 2.37, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.363, "aiperf_procs": 0} +{"ts": 1792554205.204, "seconds": 10.03, "load1": 2.16, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.378, "aiperf_procs": 0} +{"ts": 1792554215.233, "seconds": 10.029, "load1": 1.9, "cpu": {"qwen38-b-hr": 1.005, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792554225.264, "seconds": 10.031, "load1": 1.61, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.027, "xpumd": 0.003}, "serving_cpu": 2.389, "aiperf_procs": 0} +{"ts": 1792554235.292, "seconds": 10.028, "load1": 1.44, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.376, "aiperf_procs": 0} +{"ts": 1792554245.323, "seconds": 10.031, "load1": 1.44, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.032, "prometheus": 0.009, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.37, "aiperf_procs": 0} +{"ts": 1792554255.437, "seconds": 10.113, "load1": 1.3, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.039, "prometheus": 0.008, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.002}, "serving_cpu": 2.427, "aiperf_procs": 0} +{"ts": 1792554265.465, "seconds": 10.029, "load1": 1.17, "cpu": {"qwen38-b-hr": 0.978, "qwen38-a-hr": 1.115, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.358, "aiperf_procs": 0} +{"ts": 1792554275.496, "seconds": 10.031, "load1": 1.45, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.414, "aiperf_procs": 0} +{"ts": 1792554285.526, "seconds": 10.03, "load1": 1.52, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.154, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792554295.557, "seconds": 10.031, "load1": 1.43, "cpu": {"qwen38-b-hr": 0.978, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792554305.588, "seconds": 10.03, "load1": 1.21, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.366, "aiperf_procs": 0} +{"ts": 1792554315.693, "seconds": 10.106, "load1": 1.1, "cpu": {"qwen38-b-hr": 1.005, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.368, "aiperf_procs": 0} +{"ts": 1792554325.724, "seconds": 10.031, "load1": 1.16, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.137, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.003}, "serving_cpu": 2.406, "aiperf_procs": 0} +{"ts": 1792554335.755, "seconds": 10.031, "load1": 1.2, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792554345.787, "seconds": 10.032, "load1": 1.34, "cpu": {"qwen38-b-hr": 1.01, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792554355.82, "seconds": 10.033, "load1": 1.13, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.352, "aiperf_procs": 0} +{"ts": 1792554365.851, "seconds": 10.03, "load1": 1.42, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.36, "aiperf_procs": 0} +{"ts": 1792554375.946, "seconds": 10.096, "load1": 1.83, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.016, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792554385.979, "seconds": 10.033, "load1": 2.24, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.135, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.373, "aiperf_procs": 0} +{"ts": 1792554396.011, "seconds": 10.032, "load1": 2.58, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.019, "xpumd": 0.003}, "serving_cpu": 2.394, "aiperf_procs": 0} +{"ts": 1792554406.041, "seconds": 10.03, "load1": 3.43, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.014, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.373, "aiperf_procs": 0} diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/wait_s b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/wait_s new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke4/wait_s @@ -0,0 +1 @@ +0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/agent.err b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/agent.err new file mode 100644 index 00000000..42af9269 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/agent.err @@ -0,0 +1,2 @@ +==> fit: OpenVINO/Qwen3-4B-fp16-ov on CPU (AMX) via ovms, context 40960 x 53 seqs, host 307.7 GiB (pod limit 339Gi), host reserve 50.3 GiB +==> agent: OpenVINO/Qwen3-4B-fp16-ov as 'Qwen3-4B-fp16-ov' on CPU, 16 CPU(s) diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/agent.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/agent.yaml new file mode 100644 index 00000000..78d83fff --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/agent.yaml @@ -0,0 +1,109 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +# Models and the compiled-model cache live here, so restarts never re-download. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ovms-models + namespace: k3d-gpu-agent +spec: + accessModes: [ReadWriteOnce] + resources: + requests: + storage: 20Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + k3d-gpu.io/agent-fit: "cpu 53x40960" + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + # --pull downloads the model once and writes its graph.pbtxt (device, + # parsers). On later starts the files are already there and only the + # graph is rewritten, so a device change takes effect with no download. + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + - --max_num_seqs=53 + - --cache_size=298 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + # No liveness probe: compiling a model for a GPU takes minutes. + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: "16" + memory: 339Gi + limits: + memory: 339Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + persistentVolumeClaim: + claimName: ovms-models +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/commit.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/commit.txt new file mode 100644 index 00000000..536b66b6 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/commit.txt @@ -0,0 +1 @@ +411eaa06e68125f2dc584d0b9f5c304379a42172 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/cpus.txt new file mode 100644 index 00000000..bf30b137 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/cpus.txt @@ -0,0 +1 @@ +B Cpus_allowed_list: 0-7,48-55 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/eat.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/eat.yaml new file mode 100644 index 00000000..8cecbbb2 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/eat.yaml @@ -0,0 +1,253 @@ +--- +# Source: vllm/templates/secret.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: Secret +metadata: + name: vllm-qwen-3-4b-cpu-secret + labels: + app: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +type: Opaque +data: +--- +# Source: vllm/templates/configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +data: + http_proxy: "" + https_proxy: "" + no_proxy: "" + TORCHINDUCTOR_CACHE_DIR: "/tmp" + NUMBA_CACHE_DIR: "/tmp" + HF_HOME: "/data" + OUTLINES_CACHE_DIR: "/tmp/.cache/outlines" + VLLM_NO_USAGE_STATS: "1" + DO_NOT_TRACK: "1" + HF_HUB_DISABLE_XET: "1" + TORCH_INDUCTOR_CACHE_DIR: "/tmp/torchinductor_cache" + TRITON_CACHE_DIR: "/tmp/.triton" + USER: "vllm" + VLLM_ALLOW_LONG_MAX_MODEL_LEN: "1" + VLLM_CPU_KVCACHE_SPACE: "6" + VLLM_CPU_NUM_OF_RESERVED_CPU: "0" + VLLM_CPU_SGL_KERNEL: "1" + VLLM_ENGINE_ITERATION_TIMEOUT_S: "120" + VLLM_RPC_TIMEOUT: "100000" +--- +# Source: vllm/templates/pvc.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: vllm-qwen-3-4b-cpu-pvc + namespace: default +spec: + accessModes: + - ReadWriteOnce + storageClassName: local-path + resources: + requests: + storage: 250Gi # Adjust this according to model storage size +--- +# Source: vllm/templates/service.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +# Source: vllm/templates/deployment.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: "performance" + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + # + # serviceAccountName: default + securityContext: + null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + - secretRef: + name: vllm-qwen-3-4b-cpu-secret + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" + imagePullPolicy: IfNotPresent + # command: + # - /bin/bash + # - -c + # - | + # python3 -m vllm.entrypoints.openai.api_server --dtype bfloat16 --model Qwen/Qwen3-4B --port 2080 --tensor-parallel-size 1 --block-size 128 --max-model-len 8192 --disable-log-requests + args: + - "--block-size" + - "128" + - "--dtype" + - "bfloat16" + - "--distributed_executor_backend" + - "mp" + - "--enable_chunked_prefill" + - "--enforce-eager" + - "--max-num-batched-tokens" + - "2048" + - "--max-num-seqs" + - "256" + - "--enable-prefix-caching" + # CPU deployment - add parallelism settings + - "--tensor-parallel-size" + - "1" + - "--pipeline-parallel-size" + - "1" + - "--model" + - "Qwen/Qwen3-4B" + - --served-model-name + - "Qwen/Qwen3-4B" + - "--port" + - "2080" + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 98 + httpGet: + path: /health + port: http + initialDelaySeconds: 120 + periodSeconds: 30 + resources: + requests: + cpu: "16" + memory: "22Gi" + limits: + cpu: "16" + memory: "22Gi" + + volumes: + - name: model-volume + persistentVolumeClaim: + claimName: vllm-qwen-3-4b-cpu-pvc + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - "true" + # extra time to finish processing buffered requests on CPU before pod is forcibly terminated + terminationGracePeriodSeconds: 120 +--- +# Source: vllm/templates/apisixroutes.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/chat-template-configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/ingress.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# Please edit the object below. Lines beginning with a '#' will be ignored, +# and an empty file will abort the edit. If an error occurs while saving this file will be +# reopened with the relevant failures. +--- +# Source: vllm/templates/ingress_eks.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/route.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/servicemonitor.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/fit.json b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/fit.json new file mode 100644 index 00000000..af857dd5 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/fit.json @@ -0,0 +1,132 @@ +{ + "arch": "qwen3", + "ctx": 32768, + "degraded": false, + "dram_tok_s": null, + "engine": "vllm", + "explain": [ + "model Qwen/Qwen3-4B: safetensors (qwen3) weights, 7.5 GiB to serve", + " embed 0.7 GiB (lookup table)", + " other 6.8 GiB", + "context cap: 40960 (max_position_embeddings)", + "host RAM: MemTotal 503.3 GiB, MemAvailable 389.8 GiB (others already hold 113.5 GiB)", + "host reserve = max(10% x MemTotal, 4.0 GiB) = 50.3 GiB", + "host budget = 389.8 GiB - 50.3 GiB = 339.5 GiB", + "GPUs:", + " card1 (0000:12:00.0): VRAM 31.9 GiB, in use 16.1 GiB; reserve max(5%, 1.0 GiB) = 1.6 GiB; budget 14.1 GiB; BUSY (others hold >= 50%), not used", + " card2 (0000:48:00.0): VRAM 31.9 GiB, in use 15.4 GiB; reserve max(5%, 1.0 GiB) = 1.6 GiB; budget 14.9 GiB", + " card3 (0000:7c:00.0): VRAM 31.9 GiB, in use 16.1 GiB; reserve max(5%, 1.0 GiB) = 1.6 GiB; budget 14.2 GiB; BUSY (others hold >= 50%), not used", + " card4 (0000:96:00.0): VRAM 31.9 GiB, in use 15.4 GiB; reserve max(5%, 1.0 GiB) = 1.6 GiB; budget 14.9 GiB", + "CPU: Intel(R) Xeon(R) 6741P, AMX; DRAM bandwidth unknown, unknown (no STREAM run cached; SMBIOS needs root)", + "engine vllm: vllm: architecture qwen3 not checked", + " KV cache (2 B per element):", + " full attention: 36 layers x 2 (K, V) x 8 kv heads x 128 head dim x 2 B = 147456 B/token", + "placements, as asked:", + " vllm/cpu: FITS", + " host budget / 1.10 slack 307.6 GiB - weights 7.5 GiB - activations 0.0 GiB - runtime 6.0 GiB = 294.1 GiB for KV", + " KV: 65 seqs x 4608.0 MiB at 32768 tokens = 293.0 GiB", + "k8s: memory request = limit = ceil(306.5 GiB x 1.10) = 338Gi", + "guard rungs (seqs x context): 65x32768, 32x32768, 16x32768, 8x32768, 4x32768, 2x32768, 1x32768, 1x16384, 1x8192, 1x4096", + "engine flags: --max-model-len=32768 --max-num-seqs=65 VLLM_CPU_KVCACHE_SPACE=293" + ], + "fits": true, + "flags": [ + "--max-model-len=32768", + "--max-num-seqs=65", + "VLLM_CPU_KVCACHE_SPACE=293" + ], + "format": "safetensors", + "gpu_bytes": 0, + "gpus": 0, + "guard": { + "calm_samples": 60, + "calm_some_avg60": 5.0, + "cooldown_samples": 12, + "emergency_samples": 3, + "full_avg10": 5.0, + "host_bytes": 329136018432, + "mem_available_floor": 27021677772, + "placement": "cpu", + "rung_kv_bytes": [ + 314606354432, + 154618822656, + 77309411328, + 38654705664, + 19327352832, + 9663676416, + 5368709120, + 3221225472, + 2147483648, + 1073741824 + ], + "rung_memory_limit": [ + "338Gi", + "174Gi", + "95Gi", + "55Gi", + "35Gi", + "25Gi", + "21Gi", + "19Gi", + "18Gi", + "16Gi" + ], + "rungs": [ + [ + 65, + 32768 + ], + [ + 32, + 32768 + ], + [ + 16, + 32768 + ], + [ + 8, + 32768 + ], + [ + 4, + 32768 + ], + [ + 2, + 32768 + ], + [ + 1, + 32768 + ], + [ + 1, + 16384 + ], + [ + 1, + 8192 + ], + [ + 1, + 4096 + ] + ], + "some_avg10": 20.0 + }, + "host_bytes": 329136018432, + "host_reserve": 54043355545, + "k8s": { + "memory_limit": "338Gi", + "memory_request": "338Gi" + }, + "kv_bytes": 314606354432, + "model": "Qwen/Qwen3-4B", + "note": "vllm: architecture qwen3 not checked", + "placement": "cpu", + "schema": "k3d-gpu.fit/v1", + "seqs": 65, + "summary": "fit: Qwen/Qwen3-4B on CPU (AMX) via vllm, context 32768 x 65 seqs, host 306.5 GiB (pod limit 338Gi), host reserve 50.3 GiB", + "tp": 1 +} diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/image.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/image.txt new file mode 100644 index 00000000..b8534899 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/image.txt @@ -0,0 +1 @@ +vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 docker.io/vllm/vllm-openai-cpu@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 ["--block-size","128","--dtype","bfloat16","--distributed_executor_backend","mp","--enable_chunked_prefill","--enforce-eager","--max-num-batched-tokens","2048","--max-num-seqs","256","--enable-prefix-caching","--tensor-parallel-size","1","--pipeline-parallel-size","1","--model","/data/Qwen3-4B","--served-model-name","Qwen/Qwen3-4B","--port","2080","--max-model-len","32768"] diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/node-cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/node-cpus.txt new file mode 100644 index 00000000..7c5ae641 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/node-cpus.txt @@ -0,0 +1 @@ +node cpuset 0-7,48-55 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/node-image.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/node-image.txt new file mode 100644 index 00000000..33553567 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/node-image.txt @@ -0,0 +1 @@ +cryptoandcoffee/k3d-gpu:0.1.61 sha256:8cd264aa68c77681d7fa474693944de0db8d55de5881253e4029bf72a67e175c diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/notes.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/notes.txt new file mode 100644 index 00000000..6e3ed69e --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/notes.txt @@ -0,0 +1,263 @@ +block 2 engine C did not come up +NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +default vllm-c-6f48b74bcd-7sp44 0/1 Running 9 (5m42s ago) 30m 10.42.0.11 k3d-k3dgpu-x-h7-server-0 +kube-system coredns-577d995dff-fgpkv 1/1 Running 0 33m 10.42.0.8 k3d-k3dgpu-x-h7-server-0 +kube-system helm-install-gateway-api-crd-k2fm6 0/1 Completed 0 33m 10.42.0.6 k3d-k3dgpu-x-h7-server-0 +kube-system intel-gpu-plugin-shmct 1/1 Running 0 33m 10.42.0.9 k3d-k3dgpu-x-h7-server-0 +kube-system local-path-provisioner-6858d854cf-2jjpr 1/1 Running 0 33m 10.42.0.7 k3d-k3dgpu-x-h7-server-0 +kube-system metrics-server-778c4649b4-ddzg4 1/1 Running 0 33m 10.42.0.2 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-gc-7d6955597d-b4mbh 1/1 Running 0 33m 10.42.0.4 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-master-74b6cfb7df-5tgc2 1/1 Running 0 33m 10.42.0.5 k3d-k3dgpu-x-h7-server-0 +node-feature-discovery nfd-worker-8729f 1/1 Running 0 33m 10.42.0.3 k3d-k3dgpu-x-h7-server-0 +Name: vllm-c-6f48b74bcd-7sp44 +Namespace: default +Priority: 0 +Service Account: default +Node: k3d-k3dgpu-x-h7-server-0/172.19.0.2 +Start Time: Wed, 21 Oct 2026 04:15:47 +0000 +Labels: app.kubernetes.io/instance=vllm-qwen-3-4b-cpu + app.kubernetes.io/name=vllm + h7x-arm=c + name=vllm + pod-template-hash=6f48b74bcd +Annotations: balloon.balloons.resource-policy.nri.io: performance +Status: Running +IP: 10.42.0.11 +IPs: + IP: 10.42.0.11 +Controlled By: ReplicaSet/vllm-c-6f48b74bcd +Containers: + vllm: + Container ID: containerd://885e6fb44f76669d28d4cff4ab14e1082fc0270c593fc44e2d2f7a7eccfd54e6 + Image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + Image ID: docker.io/vllm/vllm-openai-cpu@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + Port: 2080/TCP (http) + Host Port: 0/TCP (http) + SeccompProfile: RuntimeDefault + Args: + --block-size + 128 + --dtype + bfloat16 + --distributed_executor_backend + mp + --enable_chunked_prefill + --max-num-batched-tokens + 2048 + --max-num-seqs + 256 + --enable-prefix-caching + --tensor-parallel-size + 1 + --pipeline-parallel-size + 1 + --model + /data/Qwen3-4B + --served-model-name + Qwen/Qwen3-4B + --port + 2080 + --max-model-len + 32768 + State: Running + Started: Wed, 21 Oct 2026 04:45:13 +0000 + Last State: Terminated + Reason: Error + Exit Code: 1 + Started: Wed, 21 Oct 2026 04:39:12 +0000 + Finished: Wed, 21 Oct 2026 04:40:05 +0000 + Ready: False + Restart Count: 9 + Limits: + cpu: 16 + memory: 22Gi + Requests: + cpu: 16 + memory: 22Gi + Readiness: http-get http://:http/health delay=10s timeout=1s period=5s #success=1 #failure=200 + Environment Variables from: + vllm-qwen-3-4b-cpu-config ConfigMap Optional: false + Environment: + VLLM_CACHE_ROOT: /root/.cache/vllm + Mounts: + /data from model-volume (rw) + /dev/shm from shm (rw) + /root/.cache/vllm from vllm-cache (rw) + /tmp from tmp (rw) + /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-94rt7 (ro) +Conditions: + Type Status + PodReadyToStartContainers True + Initialized True + Ready False + ContainersReady False + PodScheduled True +Volumes: + model-volume: + Type: HostPath (bare host directory volume) + Path: /var/apb-models + HostPathType: Directory + shm: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: Memory + SizeLimit: 1Gi + tmp: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + vllm-cache: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: + kube-api-access-94rt7: + Type: Projected (a volume that contains injected data from multiple sources) + TokenExpirationSeconds: 3607 + ConfigMapName: kube-root-ca.crt + Optional: false + DownwardAPI: true +QoS Class: Guaranteed +Node-Selectors: +Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s + node.kubernetes.io/unreachable:NoExecute op=Exists for 300s +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Scheduled 30m default-scheduler Successfully assigned default/vllm-c-6f48b74bcd-7sp44 to k3d-k3dgpu-x-h7-server-0 + Warning Unhealthy 24m (x37 over 29m) kubelet spec.containers{vllm}: Readiness probe failed: Get "http://10.42.0.11:2080/health": dial tcp 10.42.0.11:2080: connect: connection refused + Warning BackOff 4m34s (x17 over 28m) kubelet spec.containers{vllm}: Back-off restarting failed container vllm in pod vllm-c-6f48b74bcd-7sp44_default(42fa473c-cd62-4d90-9292-d8d252d4f6a1) + Normal Pulled 34s (x10 over 29m) kubelet spec.containers{vllm}: Container image "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" already present on machine and can be accessed by the pod + Normal Created 34s (x10 over 29m) kubelet spec.containers{vllm}: Container created + Normal Started 34s (x10 over 29m) kubelet spec.containers{vllm}: Container started +No resources found in k3d-gpu-agent namespace. +--- logs pod/vllm-c-6f48b74bcd-7sp44 --previous +(EngineCore pid=110) File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/concurrent/futures/_base.py", line 449, in result +(EngineCore pid=110) return self.__get_result() +(EngineCore pid=110) ^^^^^^^^^^^^^^^^^^^ +(EngineCore pid=110) File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result +(EngineCore pid=110) raise self._exception +(EngineCore pid=110) File "/opt/venv/lib/python3.12/site-packages/vllm/v1/executor/multiproc_executor.py", line 95, in _wait_for_response +(EngineCore pid=110) response = self.aggregate(self.get_response()) +(EngineCore pid=110) ^^^^^^^^^^^^^^^^^^^ +(EngineCore pid=110) File "/opt/venv/lib/python3.12/site-packages/vllm/v1/executor/multiproc_executor.py", line 391, in get_response +(EngineCore pid=110) raise RuntimeError( +(EngineCore pid=110) RuntimeError: Worker failed with error '[Errno 13] Permission denied: '/root/.cache'', please check the stack trace above for the root cause +(EngineCore pid=110) INFO 10-21 04:40:04 [multiproc_executor.py:426] [shutdown] Executor: waiting for worker exit count=0 +(EngineCore pid=110) INFO 10-21 04:40:04 [multiproc_executor.py:433] [shutdown] Executor: all workers exited gracefully +(APIServer pid=1) Traceback (most recent call last): +(APIServer pid=1) File "/opt/venv/bin/vllm", line 10, in +(APIServer pid=1) sys.exit(main()) +(APIServer pid=1) ^^^^^^ +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/entrypoints/cli/main.py", line 95, in main +(APIServer pid=1) args.dispatch_function(args) +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/entrypoints/cli/serve.py", line 148, in cmd +(APIServer pid=1) uvloop.run(run_server(args)) +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/uvloop/__init__.py", line 96, in run +(APIServer pid=1) return __asyncio.run( +(APIServer pid=1) ^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/asyncio/runners.py", line 195, in run +(APIServer pid=1) return runner.run(main) +(APIServer pid=1) ^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/asyncio/runners.py", line 118, in run +(APIServer pid=1) return self._loop.run_until_complete(task) +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/uvloop/__init__.py", line 48, in wrapper +(APIServer pid=1) return await main +(APIServer pid=1) ^^^^^^^^^^ +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/entrypoints/openai/api_server.py", line 663, in run_server +(APIServer pid=1) await run_server_worker(listen_address, sock, args, **uvicorn_kwargs) +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/entrypoints/openai/api_server.py", line 677, in run_server_worker +(APIServer pid=1) async with build_async_engine_client( +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__ +(APIServer pid=1) return await anext(self.gen) +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/entrypoints/openai/api_server.py", line 99, in build_async_engine_client +(APIServer pid=1) async with build_async_engine_client_from_engine_args( +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__ +(APIServer pid=1) return await anext(self.gen) +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/entrypoints/openai/api_server.py", line 135, in build_async_engine_client_from_engine_args +(APIServer pid=1) async_llm = AsyncLLM.from_vllm_config( +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/v1/engine/async_llm.py", line 217, in from_vllm_config +(APIServer pid=1) return cls( +(APIServer pid=1) ^^^^ +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/v1/engine/async_llm.py", line 146, in __init__ +(APIServer pid=1) self.engine_core = EngineCoreClient.make_async_mp_client( +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/tracing/otel.py", line 178, in sync_wrapper +(APIServer pid=1) return func(*args, **kwargs) +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/v1/engine/core_client.py", line 132, in make_async_mp_client +(APIServer pid=1) return AsyncMPClient(*client_args) +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/tracing/otel.py", line 178, in sync_wrapper +(APIServer pid=1) return func(*args, **kwargs) +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/v1/engine/core_client.py", line 963, in __init__ +(APIServer pid=1) super().__init__( +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/v1/engine/core_client.py", line 573, in __init__ +(APIServer pid=1) with launch_core_engines( +(APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 144, in __exit__ +(APIServer pid=1) next(self.gen) +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/v1/engine/utils.py", line 1213, in launch_core_engines +(APIServer pid=1) wait_for_engine_startup( +(APIServer pid=1) File "/opt/venv/lib/python3.12/site-packages/vllm/v1/engine/utils.py", line 1272, in wait_for_engine_startup +(APIServer pid=1) raise RuntimeError( +(APIServer pid=1) RuntimeError: Engine core initialization failed. See root cause above. Failed core proc(s): {'EngineCore': 1} +/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/multiprocessing/resource_tracker.py:279: UserWarning: resource_tracker: There appear to be 1 leaked shared_memory objects to clean up at shutdown + warnings.warn('resource_tracker: There appear to be %d ' +--- logs pod/vllm-c-6f48b74bcd-7sp44 +WARNING 10-21 04:45:25 [argparse_utils.py:257] With `vllm serve`, you should provide the model as a positional argument or in a config file instead of via the `--model` option. The `--model` option will be removed in a future version. +(APIServer pid=1) INFO 10-21 04:45:25 [api_utils.py:339] +(APIServer pid=1) INFO 10-21 04:45:25 [api_utils.py:339] █ █ █▄ ▄█ +(APIServer pid=1) INFO 10-21 04:45:25 [api_utils.py:339] ▄▄ ▄█ █ █ █ ▀▄▀ █ version 0.24.0 +(APIServer pid=1) INFO 10-21 04:45:25 [api_utils.py:339] █▄█▀ █ █ █ █ model /data/Qwen3-4B +(APIServer pid=1) INFO 10-21 04:45:25 [api_utils.py:339] ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀ ▀ +(APIServer pid=1) INFO 10-21 04:45:25 [api_utils.py:339] +(APIServer pid=1) INFO 10-21 04:45:25 [api_utils.py:273] non-default args: {'model_tag': '/data/Qwen3-4B', 'port': 2080, 'model': '/data/Qwen3-4B', 'dtype': 'bfloat16', 'max_model_len': 32768, 'served_model_name': ['Qwen/Qwen3-4B'], 'distributed_executor_backend': 'mp', 'block_size': 128, 'enable_prefix_caching': True, 'max_num_batched_tokens': 2048, 'max_num_seqs': 256, 'enable_chunked_prefill': True} +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_RPC_TIMEOUT +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_SERVICE_PORT_VLLM +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP_PROTO +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_SERVICE_HOST +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP_ADDR +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_SERVICE_HOST +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_SERVICE_PORT_VLLM +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP_PORT +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP_PORT +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_QWEN_3_4B_CPU_SERVICE_PORT_80_TCP_PROTO +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_SERVICE_PORT +(APIServer pid=1) WARNING 10-21 04:45:25 [envs.py:2004] Unknown vLLM environment variable detected: VLLM_C_SERVICE_PORT_80_TCP_ADDR +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] Error saving model info cache. +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1311, in mkdir +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] os.mkdir(self, mode) +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] PermissionError: [Errno 13] Permission denied: '/root/.cache/vllm/modelinfos' +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] During handling of the above exception, another exception occurred: +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] Traceback (most recent call last): +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] File "/opt/venv/lib/python3.12/site-packages/vllm/model_executor/models/registry.py", line 891, in _save_modelinfo_to_cache +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] cache_dir.mkdir(parents=True, exist_ok=True) +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 1320, in mkdir +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] if not exist_ok or not self.is_dir(): +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] ^^^^^^^^^^^^^ +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 875, in is_dir +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] return S_ISDIR(self.stat().st_mode) +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] ^^^^^^^^^^^ +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] File "/opt/uv/python/cpython-3.12.13-linux-x86_64-gnu/lib/python3.12/pathlib.py", line 840, in stat +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] return os.stat(self, follow_symlinks=follow_symlinks) +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +(APIServer pid=1) ERROR 10-21 04:45:37 [registry.py:896] PermissionError: [Errno 13] Permission denied: '/root/.cache/vllm/modelinfos' +(APIServer pid=1) INFO 10-21 04:45:37 [model.py:598] Resolved architecture: Qwen3ForCausalLM +(APIServer pid=1) INFO 10-21 04:45:37 [model.py:1725] Using max model len 32768 +(APIServer pid=1) INFO 10-21 04:45:37 [vllm.py:1006] Asynchronous scheduling is enabled. +(APIServer pid=1) INFO 10-21 04:45:37 [kernel.py:276] Final IR op priority after setting platform defaults: IrOpPriorityConfig(rms_norm=['native'], fused_add_rms_norm=['native']) diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/ovms.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/ovms.yaml new file mode 100644 index 00000000..34221e92 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/ovms.yaml @@ -0,0 +1,94 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + k3d-gpu.io/agent-fit: cpu 53x40960 + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + - --max_num_seqs=53 + - --cache_size=298 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: '16' + memory: 339Gi + limits: + memory: 339Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + hostPath: + path: /var/apb-models + type: Directory +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/values.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/values.yaml new file mode 100644 index 00000000..c1dc074b --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/values.yaml @@ -0,0 +1,437 @@ +accelDevice: '' +cpu_balloon_annotation: performance +resources: + requests: + cpu: '{{ .Values.cpu }}' + memory: '{{ .Values.memory }}' +block_size: 128 +max_num_seqs: 256 +max_seq_len_to_capture: 2048 +d_type: bfloat16 +max_model_len: 8192 +image: + repository: vllm/vllm-openai-cpu + tag: v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + pullPolicy: IfNotPresent +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' +VLLM_CPU_SGL_KERNEL: '1' +VLLM_NO_USAGE_STATS: 1 +DO_NOT_TRACK: 1 +LLM_MODEL_ID: '' +modelConfigs: + meta-llama/Llama-3.1-8B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + HF_HUB_DISABLE_XET: '1' + VLLM_CPU_SGL_KERNEL: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + speculativeConfig: '{"method":"draft_model","model":"meta-llama/Llama-3.2-1B-Instruct","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + meta-llama/Llama-3.2-3B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + deepseek-ai/DeepSeek-R1-Distill-Qwen-32B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + deepseek-ai/DeepSeek-R1-Distill-Llama-8B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-1.7B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - hermes + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-4B-Instruct-2507: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - hermes + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen2.5-Coder-7B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_coder + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-Coder-30B-A3B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '2' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --trust-remote-code + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + speculativeConfig: '{"method":"draft_model","model":"Qwen/Qwen3-0.6B","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen2.5-Coder-14B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCHDYNAMO_DISABLE: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + speculativeConfig: '{"method":"draft_model","model":"Qwen/Qwen2.5-Coder-0.5B-Instruct","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + HF_HUB_OFFLINE: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-30B-A3B-Instruct-2507: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + HF_HUB_DISABLE_XET: '1' + VLLM_CPU_SGL_KERNEL: '1' + TRITON_CACHE_DIR: /tmp/.triton + TORCHINDUCTOR_CACHE_DIR: /tmp/.torch_compile + XDG_CACHE_HOME: /tmp/.cache + HF_HOME: /tmp/.cache/huggingface + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + google/gemma-4-26B-A4B-it: + configMapValues: + TRITON_CACHE_DIR: /tmp/.triton + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - gemma4 + - --chat-template + - /workspace/vllm/examples/tool_chat_template_gemma4.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + openai/whisper-small: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCHDYNAMO_DISABLE: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + XDG_CACHE_HOME: /tmp/.cache + HF_HOME: /tmp/huggingface + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --dtype + - float32 + - --enforce-eager + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' +defaultModelConfigs: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' +memory: 16Gi +cpu: '8' diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-c.err b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-c.err new file mode 100644 index 00000000..e69de29b diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-c.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-c.yaml new file mode 100644 index 00000000..54a1e334 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-c.yaml @@ -0,0 +1,178 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-c-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +data: + http_proxy: '' + https_proxy: '' + no_proxy: '' + TORCHINDUCTOR_CACHE_DIR: /tmp + NUMBA_CACHE_DIR: /tmp + HF_HOME: /data + OUTLINES_CACHE_DIR: /tmp/.cache/outlines + VLLM_NO_USAGE_STATS: '1' + DO_NOT_TRACK: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_RPC_TIMEOUT: '100000' + HF_HUB_OFFLINE: '1' +--- +apiVersion: v1 +kind: Service +metadata: + name: vllm-c-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + h7x-arm: c +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-c + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + h7x-arm: c + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: performance + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + h7x-arm: c + spec: + securityContext: null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + imagePullPolicy: IfNotPresent + args: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --tensor-parallel-size + - '1' + - --pipeline-parallel-size + - '1' + - --model + - /data/Qwen3-4B + - --served-model-name + - Qwen/Qwen3-4B + - --port + - '2080' + - --max-model-len + - '32768' + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 200 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: '16' + memory: 22Gi + limits: + cpu: '16' + memory: 22Gi + env: + - name: VLLM_CACHE_ROOT + value: /root/.cache/vllm + volumes: + - name: model-volume + hostPath: + path: /var/apb-models + type: Directory + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' + terminationGracePeriodSeconds: 120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-mem.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-mem.txt new file mode 100644 index 00000000..a5abd008 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm-mem.txt @@ -0,0 +1 @@ +vLLM memory limit 22Gi from k3d-gpu fit diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm.yaml new file mode 100644 index 00000000..41160636 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/h7x-20261021-041226/vllm.yaml @@ -0,0 +1,173 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +data: + http_proxy: '' + https_proxy: '' + no_proxy: '' + TORCHINDUCTOR_CACHE_DIR: /tmp + NUMBA_CACHE_DIR: /tmp + HF_HOME: /data + OUTLINES_CACHE_DIR: /tmp/.cache/outlines + VLLM_NO_USAGE_STATS: '1' + DO_NOT_TRACK: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_RPC_TIMEOUT: '100000' + HF_HUB_OFFLINE: '1' +--- +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: performance + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + securityContext: null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + imagePullPolicy: IfNotPresent + args: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --tensor-parallel-size + - '1' + - --pipeline-parallel-size + - '1' + - --model + - /data/Qwen3-4B + - --served-model-name + - Qwen/Qwen3-4B + - --port + - '2080' + - --max-model-len + - '32768' + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 200 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: '16' + memory: 22Gi + limits: + cpu: '16' + memory: 22Gi + volumes: + - name: model-volume + hostPath: + path: /var/apb-models + type: Directory + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' + terminationGracePeriodSeconds: 120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/post.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/post.txt new file mode 100644 index 00000000..1a34c09b --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/post.txt @@ -0,0 +1,16 @@ +2026-10-21T04:45:51Z + 04:45:51 up 35 days, 6:00, 13 users, load average: 2.68, 2.37, 2.49 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +42.0 3899938 root sglang::schedul +39.7 3900351 root sglang::schedul +24.4 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 8.6 157735 root kworker/92:2-events + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3382696036 254390328 94% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/pre.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/pre.txt new file mode 100644 index 00000000..c6d3b5b9 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/pre.txt @@ -0,0 +1,16 @@ +2026-10-21T04:12:25Z + 04:12:25 up 35 days, 5:26, 11 users, load average: 2.55, 2.38, 3.05 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +42.0 3899938 root sglang::schedul +39.7 3900351 root sglang::schedul +24.4 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3439844496 197241868 95% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/rc b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/rc new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/rc @@ -0,0 +1 @@ +0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/serving.jsonl b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/serving.jsonl new file mode 100644 index 00000000..d33d8205 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/serving.jsonl @@ -0,0 +1,200 @@ +{"ts": 1792555956.153, "seconds": 10.0, "load1": 2.39, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.159, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.063, "grafana": 0.015, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.469, "aiperf_procs": 0} +{"ts": 1792555966.184, "seconds": 10.031, "load1": 2.26, "cpu": {"qwen38-b-hr": 1.014, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.431, "aiperf_procs": 0} +{"ts": 1792555976.214, "seconds": 10.03, "load1": 2.21, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.113, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.343, "aiperf_procs": 0} +{"ts": 1792555986.244, "seconds": 10.03, "load1": 2.03, "cpu": {"qwen38-b-hr": 0.96, "qwen38-a-hr": 1.101, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.311, "aiperf_procs": 0} +{"ts": 1792555996.272, "seconds": 10.028, "load1": 2.42, "cpu": {"qwen38-b-hr": 1.01, "qwen38-a-hr": 1.155, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.425, "aiperf_procs": 0} +{"ts": 1792556006.307, "seconds": 10.035, "load1": 2.36, "cpu": {"qwen38-b-hr": 0.96, "qwen38-a-hr": 1.095, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.318, "aiperf_procs": 0} +{"ts": 1792556016.407, "seconds": 10.1, "load1": 2.3, "cpu": {"qwen38-b-hr": 0.969, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.073, "xpumd": 0.002}, "serving_cpu": 2.417, "aiperf_procs": 0} +{"ts": 1792556026.439, "seconds": 10.032, "load1": 2.19, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.079, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.009, "xpumd": 0.003}, "serving_cpu": 2.32, "aiperf_procs": 0} +{"ts": 1792556036.468, "seconds": 10.03, "load1": 2.31, "cpu": {"qwen38-b-hr": 0.953, "qwen38-a-hr": 1.103, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.021, "xpumd": 0.002}, "serving_cpu": 2.318, "aiperf_procs": 0} +{"ts": 1792556046.5, "seconds": 10.031, "load1": 2.25, "cpu": {"qwen38-b-hr": 0.952, "qwen38-a-hr": 1.083, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.287, "aiperf_procs": 0} +{"ts": 1792556056.53, "seconds": 10.031, "load1": 2.45, "cpu": {"qwen38-b-hr": 0.943, "qwen38-a-hr": 1.091, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.287, "aiperf_procs": 0} +{"ts": 1792556066.563, "seconds": 10.032, "load1": 2.3, "cpu": {"qwen38-b-hr": 0.942, "qwen38-a-hr": 1.115, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.014, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.332, "aiperf_procs": 0} +{"ts": 1792556076.668, "seconds": 10.106, "load1": 2.48, "cpu": {"qwen38-b-hr": 0.936, "qwen38-a-hr": 1.091, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.015, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.018, "xpumd": 0.002}, "serving_cpu": 2.305, "aiperf_procs": 0} +{"ts": 1792556086.699, "seconds": 10.03, "load1": 2.33, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.346, "aiperf_procs": 0} +{"ts": 1792556096.728, "seconds": 10.029, "load1": 2.45, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.107, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.35, "aiperf_procs": 0} +{"ts": 1792556106.758, "seconds": 10.03, "load1": 2.61, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 2.394, "aiperf_procs": 0} +{"ts": 1792556116.787, "seconds": 10.029, "load1": 2.75, "cpu": {"qwen38-b-hr": 0.993, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.379, "aiperf_procs": 0} +{"ts": 1792556126.819, "seconds": 10.032, "load1": 3.02, "cpu": {"qwen38-b-hr": 0.975, "qwen38-a-hr": 1.124, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.002}, "serving_cpu": 2.369, "aiperf_procs": 0} +{"ts": 1792556136.93, "seconds": 10.111, "load1": 3.8, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.034, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.398, "aiperf_procs": 0} +{"ts": 1792556146.962, "seconds": 10.031, "load1": 3.67, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.377, "aiperf_procs": 0} +{"ts": 1792556156.992, "seconds": 10.03, "load1": 3.64, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.34, "aiperf_procs": 0} +{"ts": 1792556167.02, "seconds": 10.028, "load1": 3.94, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.022, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.388, "aiperf_procs": 0} +{"ts": 1792556177.051, "seconds": 10.031, "load1": 4.09, "cpu": {"qwen38-b-hr": 1.01, "qwen38-a-hr": 1.1, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.37, "aiperf_procs": 0} +{"ts": 1792556187.08, "seconds": 10.03, "load1": 3.84, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.121, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.379, "aiperf_procs": 0} +{"ts": 1792556197.187, "seconds": 10.107, "load1": 3.95, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.105, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.002}, "serving_cpu": 2.364, "aiperf_procs": 0} +{"ts": 1792556207.217, "seconds": 10.03, "load1": 3.49, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.368, "aiperf_procs": 0} +{"ts": 1792556217.251, "seconds": 10.034, "load1": 3.5, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.353, "aiperf_procs": 0} +{"ts": 1792556227.284, "seconds": 10.033, "load1": 3.57, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.087, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.315, "aiperf_procs": 0} +{"ts": 1792556237.319, "seconds": 10.035, "load1": 3.33, "cpu": {"qwen38-b-hr": 0.965, "qwen38-a-hr": 1.103, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.325, "aiperf_procs": 0} +{"ts": 1792556247.351, "seconds": 10.032, "load1": 3.19, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.085, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.32, "aiperf_procs": 0} +{"ts": 1792556257.468, "seconds": 10.116, "load1": 3.59, "cpu": {"qwen38-b-hr": 0.955, "qwen38-a-hr": 1.099, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.31, "aiperf_procs": 0} +{"ts": 1792556267.498, "seconds": 10.03, "load1": 3.27, "cpu": {"qwen38-b-hr": 0.96, "qwen38-a-hr": 1.12, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.33, "aiperf_procs": 0} +{"ts": 1792556277.528, "seconds": 10.03, "load1": 3.0, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.101, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.352, "aiperf_procs": 0} +{"ts": 1792556287.56, "seconds": 10.031, "load1": 2.93, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.003}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792556297.593, "seconds": 10.033, "load1": 2.78, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.364, "aiperf_procs": 0} +{"ts": 1792556307.623, "seconds": 10.03, "load1": 2.74, "cpu": {"qwen38-b-hr": 1.002, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.39, "aiperf_procs": 0} +{"ts": 1792556317.738, "seconds": 10.115, "load1": 2.93, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792556327.77, "seconds": 10.032, "load1": 2.78, "cpu": {"qwen38-b-hr": 0.99, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.378, "aiperf_procs": 0} +{"ts": 1792556337.802, "seconds": 10.032, "load1": 2.8, "cpu": {"qwen38-b-hr": 1.013, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.39, "aiperf_procs": 0} +{"ts": 1792556347.833, "seconds": 10.032, "load1": 2.53, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.374, "aiperf_procs": 0} +{"ts": 1792556357.864, "seconds": 10.03, "load1": 2.51, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792556367.895, "seconds": 10.031, "load1": 2.74, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.374, "aiperf_procs": 0} +{"ts": 1792556377.993, "seconds": 10.098, "load1": 2.94, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.149, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.246, "drm-exporter": 0.001, "loki": 0.066, "xpumd": 0.003}, "serving_cpu": 2.719, "aiperf_procs": 0} +{"ts": 1792556388.023, "seconds": 10.03, "load1": 3.18, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.151, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.008, "drm-exporter": 0.001, "loki": 0.009, "xpumd": 0.002}, "serving_cpu": 2.408, "aiperf_procs": 0} +{"ts": 1792556398.054, "seconds": 10.03, "load1": 3.47, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.003}, "serving_cpu": 2.419, "aiperf_procs": 0} +{"ts": 1792556408.087, "seconds": 10.033, "load1": 3.54, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.384, "aiperf_procs": 0} +{"ts": 1792556418.119, "seconds": 10.032, "load1": 3.54, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.107, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.012, "drm-exporter": 0.001, "loki": 0.021, "xpumd": 0.003}, "serving_cpu": 2.383, "aiperf_procs": 0} +{"ts": 1792556428.147, "seconds": 10.028, "load1": 3.3, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.12, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.002}, "serving_cpu": 2.356, "aiperf_procs": 0} +{"ts": 1792556438.248, "seconds": 10.101, "load1": 3.03, "cpu": {"qwen38-b-hr": 0.959, "qwen38-a-hr": 1.121, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.343, "aiperf_procs": 0} +{"ts": 1792556448.278, "seconds": 10.03, "load1": 2.56, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.108, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.001}, "serving_cpu": 2.339, "aiperf_procs": 0} +{"ts": 1792556458.31, "seconds": 10.032, "load1": 2.24, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792556468.341, "seconds": 10.031, "load1": 2.2, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.023, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.373, "aiperf_procs": 0} +{"ts": 1792556478.376, "seconds": 10.034, "load1": 2.1, "cpu": {"qwen38-b-hr": 1.023, "qwen38-a-hr": 1.148, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.003}, "serving_cpu": 2.446, "aiperf_procs": 0} +{"ts": 1792556488.406, "seconds": 10.03, "load1": 2.24, "cpu": {"qwen38-b-hr": 1.016, "qwen38-a-hr": 1.149, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.421, "aiperf_procs": 0} +{"ts": 1792556498.516, "seconds": 10.11, "load1": 2.29, "cpu": {"qwen38-b-hr": 1.036, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.411, "aiperf_procs": 0} +{"ts": 1792556508.547, "seconds": 10.031, "load1": 2.46, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.386, "aiperf_procs": 0} +{"ts": 1792556518.578, "seconds": 10.031, "load1": 2.75, "cpu": {"qwen38-b-hr": 1.013, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.392, "aiperf_procs": 0} +{"ts": 1792556528.609, "seconds": 10.031, "load1": 2.41, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.149, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.009, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.398, "aiperf_procs": 0} +{"ts": 1792556538.638, "seconds": 10.029, "load1": 2.18, "cpu": {"qwen38-b-hr": 0.975, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.374, "aiperf_procs": 0} +{"ts": 1792556548.67, "seconds": 10.032, "load1": 2.24, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.103, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.002}, "serving_cpu": 2.352, "aiperf_procs": 0} +{"ts": 1792556558.776, "seconds": 10.106, "load1": 2.21, "cpu": {"qwen38-b-hr": 1.015, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792556568.808, "seconds": 10.032, "load1": 2.26, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.356, "aiperf_procs": 0} +{"ts": 1792556578.837, "seconds": 10.028, "load1": 2.06, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.363, "aiperf_procs": 0} +{"ts": 1792556588.867, "seconds": 10.03, "load1": 1.75, "cpu": {"qwen38-b-hr": 1.022, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792556598.898, "seconds": 10.032, "load1": 1.77, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.36, "aiperf_procs": 0} +{"ts": 1792556608.93, "seconds": 10.032, "load1": 2.05, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.348, "aiperf_procs": 0} +{"ts": 1792556619.043, "seconds": 10.113, "load1": 2.36, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.105, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.37, "aiperf_procs": 0} +{"ts": 1792556629.074, "seconds": 10.031, "load1": 2.76, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.153, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792556639.106, "seconds": 10.032, "load1": 3.18, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.017, "xpumd": 0.003}, "serving_cpu": 2.407, "aiperf_procs": 0} +{"ts": 1792556649.136, "seconds": 10.03, "load1": 4.02, "cpu": {"qwen38-b-hr": 1.023, "qwen38-a-hr": 1.159, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.174, "aiperf010": 0.0, "xe-exporter": 0.02, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.45, "aiperf_procs": 0} +{"ts": 1792556659.167, "seconds": 10.031, "load1": 3.86, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.02, "grafana": 0.006, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.407, "aiperf_procs": 0} +{"ts": 1792556669.199, "seconds": 10.032, "load1": 3.64, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.389, "aiperf_procs": 0} +{"ts": 1792556679.305, "seconds": 10.106, "load1": 3.62, "cpu": {"qwen38-b-hr": 1.02, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.412, "aiperf_procs": 0} +{"ts": 1792556689.337, "seconds": 10.032, "load1": 3.44, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.046, "xpumd": 0.003}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792556699.368, "seconds": 10.031, "load1": 3.07, "cpu": {"qwen38-b-hr": 1.002, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.018, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.023, "xpumd": 0.002}, "serving_cpu": 2.43, "aiperf_procs": 0} +{"ts": 1792556709.396, "seconds": 10.028, "load1": 2.74, "cpu": {"qwen38-b-hr": 1.034, "qwen38-a-hr": 1.156, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.003}, "serving_cpu": 2.458, "aiperf_procs": 0} +{"ts": 1792556719.426, "seconds": 10.03, "load1": 2.4, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.0, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.001}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792556729.456, "seconds": 10.03, "load1": 2.19, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.389, "aiperf_procs": 0} +{"ts": 1792556739.571, "seconds": 10.116, "load1": 2.01, "cpu": {"qwen38-b-hr": 1.005, "qwen38-a-hr": 1.119, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792556749.604, "seconds": 10.033, "load1": 2.01, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.135, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.016, "xpumd": 0.003}, "serving_cpu": 2.377, "aiperf_procs": 0} +{"ts": 1792556759.635, "seconds": 10.031, "load1": 2.15, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792556769.665, "seconds": 10.03, "load1": 2.05, "cpu": {"qwen38-b-hr": 1.002, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.404, "aiperf_procs": 0} +{"ts": 1792556779.699, "seconds": 10.035, "load1": 2.12, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.18, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.016, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.439, "aiperf_procs": 0} +{"ts": 1792556789.733, "seconds": 10.034, "load1": 1.87, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.168, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.026, "xpumd": 0.003}, "serving_cpu": 2.429, "aiperf_procs": 0} +{"ts": 1792556799.85, "seconds": 10.117, "load1": 1.66, "cpu": {"qwen38-b-hr": 0.973, "qwen38-a-hr": 1.184, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.424, "aiperf_procs": 0} +{"ts": 1792556809.884, "seconds": 10.034, "load1": 1.71, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.183, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.426, "aiperf_procs": 0} +{"ts": 1792556819.917, "seconds": 10.033, "load1": 1.6, "cpu": {"qwen38-b-hr": 0.971, "qwen38-a-hr": 1.147, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.374, "aiperf_procs": 0} +{"ts": 1792556829.946, "seconds": 10.029, "load1": 1.75, "cpu": {"qwen38-b-hr": 1.008, "qwen38-a-hr": 1.18, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.445, "aiperf_procs": 0} +{"ts": 1792556839.979, "seconds": 10.033, "load1": 1.79, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.155, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792556850.011, "seconds": 10.032, "load1": 1.74, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.204, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.44, "aiperf_procs": 0} +{"ts": 1792556860.114, "seconds": 10.104, "load1": 1.86, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.178, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.438, "aiperf_procs": 0} +{"ts": 1792556870.146, "seconds": 10.031, "load1": 2.63, "cpu": {"qwen38-b-hr": 1.005, "qwen38-a-hr": 1.138, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792556880.175, "seconds": 10.029, "load1": 2.84, "cpu": {"qwen38-b-hr": 1.016, "qwen38-a-hr": 1.151, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.421, "aiperf_procs": 0} +{"ts": 1792556890.208, "seconds": 10.033, "load1": 2.86, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.001}, "serving_cpu": 2.403, "aiperf_procs": 0} +{"ts": 1792556900.238, "seconds": 10.031, "load1": 2.96, "cpu": {"qwen38-b-hr": 1.049, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.012, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.0, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.453, "aiperf_procs": 0} +{"ts": 1792556910.272, "seconds": 10.033, "load1": 3.29, "cpu": {"qwen38-b-hr": 1.029, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.432, "aiperf_procs": 0} +{"ts": 1792556920.392, "seconds": 10.12, "load1": 3.33, "cpu": {"qwen38-b-hr": 1.019, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.037, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.013, "xpumd": 0.001}, "serving_cpu": 2.423, "aiperf_procs": 0} +{"ts": 1792556930.422, "seconds": 10.03, "load1": 3.12, "cpu": {"qwen38-b-hr": 1.014, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.032, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.405, "aiperf_procs": 0} +{"ts": 1792556940.454, "seconds": 10.031, "load1": 2.87, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.354, "aiperf_procs": 0} +{"ts": 1792556950.486, "seconds": 10.033, "load1": 2.51, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.364, "aiperf_procs": 0} +{"ts": 1792556960.521, "seconds": 10.035, "load1": 2.36, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.372, "aiperf_procs": 0} +{"ts": 1792556970.554, "seconds": 10.033, "load1": 2.23, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.356, "aiperf_procs": 0} +{"ts": 1792556980.659, "seconds": 10.105, "load1": 2.27, "cpu": {"qwen38-b-hr": 0.995, "qwen38-a-hr": 1.149, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.397, "aiperf_procs": 0} +{"ts": 1792556990.689, "seconds": 10.03, "load1": 2.08, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.365, "aiperf_procs": 0} +{"ts": 1792557000.72, "seconds": 10.031, "load1": 1.83, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.377, "aiperf_procs": 0} +{"ts": 1792557010.755, "seconds": 10.035, "load1": 1.78, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.018, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792557020.787, "seconds": 10.032, "load1": 1.74, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.397, "aiperf_procs": 0} +{"ts": 1792557030.82, "seconds": 10.033, "load1": 1.47, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.019, "xpumd": 0.003}, "serving_cpu": 2.365, "aiperf_procs": 0} +{"ts": 1792557040.919, "seconds": 10.099, "load1": 1.32, "cpu": {"qwen38-b-hr": 0.967, "qwen38-a-hr": 1.092, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.322, "aiperf_procs": 0} +{"ts": 1792557050.952, "seconds": 10.032, "load1": 1.35, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.349, "aiperf_procs": 0} +{"ts": 1792557060.985, "seconds": 10.033, "load1": 1.29, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.113, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.351, "aiperf_procs": 0} +{"ts": 1792557071.017, "seconds": 10.032, "load1": 1.24, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.365, "aiperf_procs": 0} +{"ts": 1792557081.048, "seconds": 10.031, "load1": 1.43, "cpu": {"qwen38-b-hr": 1.014, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.396, "aiperf_procs": 0} +{"ts": 1792557091.079, "seconds": 10.031, "load1": 1.43, "cpu": {"qwen38-b-hr": 1.01, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.375, "aiperf_procs": 0} +{"ts": 1792557101.195, "seconds": 10.115, "load1": 1.29, "cpu": {"qwen38-b-hr": 1.013, "qwen38-a-hr": 1.104, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.372, "aiperf_procs": 0} +{"ts": 1792557111.23, "seconds": 10.035, "load1": 1.17, "cpu": {"qwen38-b-hr": 0.994, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.014, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.375, "aiperf_procs": 0} +{"ts": 1792557121.263, "seconds": 10.033, "load1": 1.54, "cpu": {"qwen38-b-hr": 1.012, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.072, "xpumd": 0.002}, "serving_cpu": 2.459, "aiperf_procs": 0} +{"ts": 1792557131.294, "seconds": 10.031, "load1": 1.84, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.002}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792557141.327, "seconds": 10.033, "load1": 1.93, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.018, "xpumd": 0.003}, "serving_cpu": 2.385, "aiperf_procs": 0} +{"ts": 1792557151.359, "seconds": 10.032, "load1": 2.25, "cpu": {"qwen38-b-hr": 1.013, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.41, "aiperf_procs": 0} +{"ts": 1792557161.454, "seconds": 10.095, "load1": 2.36, "cpu": {"qwen38-b-hr": 0.99, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.393, "aiperf_procs": 0} +{"ts": 1792557171.487, "seconds": 10.033, "load1": 2.22, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.021, "xpumd": 0.002}, "serving_cpu": 2.39, "aiperf_procs": 0} +{"ts": 1792557181.521, "seconds": 10.034, "load1": 2.56, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.4, "aiperf_procs": 0} +{"ts": 1792557191.55, "seconds": 10.029, "load1": 2.78, "cpu": {"qwen38-b-hr": 0.975, "qwen38-a-hr": 1.114, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.344, "aiperf_procs": 0} +{"ts": 1792557201.582, "seconds": 10.031, "load1": 2.74, "cpu": {"qwen38-b-hr": 0.973, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.356, "aiperf_procs": 0} +{"ts": 1792557211.611, "seconds": 10.029, "load1": 2.62, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.114, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.026, "xpumd": 0.002}, "serving_cpu": 2.37, "aiperf_procs": 0} +{"ts": 1792557221.727, "seconds": 10.116, "load1": 2.53, "cpu": {"qwen38-b-hr": 0.971, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.019, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.371, "aiperf_procs": 0} +{"ts": 1792557231.758, "seconds": 10.031, "load1": 2.68, "cpu": {"qwen38-b-hr": 1.004, "qwen38-a-hr": 1.157, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.412, "aiperf_procs": 0} +{"ts": 1792557241.792, "seconds": 10.034, "load1": 2.66, "cpu": {"qwen38-b-hr": 1.004, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.405, "aiperf_procs": 0} +{"ts": 1792557251.824, "seconds": 10.032, "load1": 2.4, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792557261.855, "seconds": 10.03, "load1": 2.1, "cpu": {"qwen38-b-hr": 1.01, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.002, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.023, "xpumd": 0.003}, "serving_cpu": 2.403, "aiperf_procs": 0} +{"ts": 1792557271.884, "seconds": 10.03, "load1": 2.39, "cpu": {"qwen38-b-hr": 1.02, "qwen38-a-hr": 1.155, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.426, "aiperf_procs": 0} +{"ts": 1792557281.99, "seconds": 10.106, "load1": 2.33, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.38, "aiperf_procs": 0} +{"ts": 1792557292.021, "seconds": 10.031, "load1": 2.2, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.131, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.38, "aiperf_procs": 0} +{"ts": 1792557302.052, "seconds": 10.031, "load1": 2.09, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.0, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792557312.082, "seconds": 10.03, "load1": 2.07, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.345, "aiperf_procs": 0} +{"ts": 1792557322.114, "seconds": 10.032, "load1": 1.98, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792557332.148, "seconds": 10.035, "load1": 1.83, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.121, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.376, "aiperf_procs": 0} +{"ts": 1792557342.264, "seconds": 10.116, "load1": 1.7, "cpu": {"qwen38-b-hr": 0.982, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.363, "aiperf_procs": 0} +{"ts": 1792557352.295, "seconds": 10.031, "load1": 1.44, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.002}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792557362.327, "seconds": 10.032, "load1": 1.29, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.109, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.342, "aiperf_procs": 0} +{"ts": 1792557372.365, "seconds": 10.039, "load1": 1.55, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.393, "aiperf_procs": 0} +{"ts": 1792557382.395, "seconds": 10.03, "load1": 1.62, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.36, "aiperf_procs": 0} +{"ts": 1792557392.425, "seconds": 10.03, "load1": 1.91, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792557402.534, "seconds": 10.109, "load1": 2.08, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.417, "aiperf_procs": 0} +{"ts": 1792557412.567, "seconds": 10.033, "load1": 2.21, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.018, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.001}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792557422.597, "seconds": 10.03, "load1": 2.4, "cpu": {"qwen38-b-hr": 0.978, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.363, "aiperf_procs": 0} +{"ts": 1792557432.628, "seconds": 10.031, "load1": 2.43, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.126, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.376, "aiperf_procs": 0} +{"ts": 1792557442.658, "seconds": 10.03, "load1": 4.54, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.046, "xpumd": 0.003}, "serving_cpu": 2.431, "aiperf_procs": 0} +{"ts": 1792557452.689, "seconds": 10.031, "load1": 3.89, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.03, "xpumd": 0.002}, "serving_cpu": 2.387, "aiperf_procs": 0} +{"ts": 1792557462.808, "seconds": 10.119, "load1": 3.74, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.105, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.003}, "serving_cpu": 2.384, "aiperf_procs": 0} +{"ts": 1792557472.841, "seconds": 10.033, "load1": 3.47, "cpu": {"qwen38-b-hr": 1.01, "qwen38-a-hr": 1.132, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 2.394, "aiperf_procs": 0} +{"ts": 1792557482.871, "seconds": 10.03, "load1": 3.25, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.108, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.016, "xpumd": 0.003}, "serving_cpu": 2.367, "aiperf_procs": 0} +{"ts": 1792557492.904, "seconds": 10.033, "load1": 2.83, "cpu": {"qwen38-b-hr": 1.008, "qwen38-a-hr": 1.148, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.409, "aiperf_procs": 0} +{"ts": 1792557502.934, "seconds": 10.03, "load1": 2.78, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.158, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.406, "aiperf_procs": 0} +{"ts": 1792557512.963, "seconds": 10.029, "load1": 2.58, "cpu": {"qwen38-b-hr": 0.982, "qwen38-a-hr": 1.118, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.35, "aiperf_procs": 0} +{"ts": 1792557523.079, "seconds": 10.116, "load1": 2.57, "cpu": {"qwen38-b-hr": 1.0, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.02, "otel-collector": 0.001, "tempo": 0.021, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.025, "xpumd": 0.002}, "serving_cpu": 2.447, "aiperf_procs": 0} +{"ts": 1792557533.109, "seconds": 10.03, "load1": 2.4, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.114, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.354, "aiperf_procs": 0} +{"ts": 1792557543.142, "seconds": 10.033, "load1": 2.19, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792557553.173, "seconds": 10.031, "load1": 3.59, "cpu": {"qwen38-b-hr": 1.008, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.396, "aiperf_procs": 0} +{"ts": 1792557563.206, "seconds": 10.032, "load1": 3.5, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.377, "aiperf_procs": 0} +{"ts": 1792557573.238, "seconds": 10.032, "load1": 3.42, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.138, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.026, "xpumd": 0.002}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792557583.356, "seconds": 10.118, "load1": 3.29, "cpu": {"qwen38-b-hr": 0.99, "qwen38-a-hr": 1.115, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.36, "aiperf_procs": 0} +{"ts": 1792557593.387, "seconds": 10.031, "load1": 3.17, "cpu": {"qwen38-b-hr": 0.967, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.365, "aiperf_procs": 0} +{"ts": 1792557603.418, "seconds": 10.031, "load1": 3.21, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.415, "aiperf_procs": 0} +{"ts": 1792557613.451, "seconds": 10.033, "load1": 2.72, "cpu": {"qwen38-b-hr": 1.036, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.436, "aiperf_procs": 0} +{"ts": 1792557623.48, "seconds": 10.03, "load1": 2.92, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.14, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.009, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.402, "aiperf_procs": 0} +{"ts": 1792557633.508, "seconds": 10.028, "load1": 2.93, "cpu": {"qwen38-b-hr": 0.993, "qwen38-a-hr": 1.113, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.017, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.369, "aiperf_procs": 0} +{"ts": 1792557643.629, "seconds": 10.12, "load1": 3.1, "cpu": {"qwen38-b-hr": 1.02, "qwen38-a-hr": 1.136, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.422, "aiperf_procs": 0} +{"ts": 1792557653.659, "seconds": 10.03, "load1": 3.07, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.002}, "serving_cpu": 2.366, "aiperf_procs": 0} +{"ts": 1792557663.689, "seconds": 10.03, "load1": 3.06, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.365, "aiperf_procs": 0} +{"ts": 1792557673.721, "seconds": 10.031, "load1": 2.75, "cpu": {"qwen38-b-hr": 0.982, "qwen38-a-hr": 1.152, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.389, "aiperf_procs": 0} +{"ts": 1792557683.75, "seconds": 10.029, "load1": 2.64, "cpu": {"qwen38-b-hr": 1.01, "qwen38-a-hr": 1.164, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.427, "aiperf_procs": 0} +{"ts": 1792557693.781, "seconds": 10.032, "load1": 2.53, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.371, "aiperf_procs": 0} +{"ts": 1792557703.893, "seconds": 10.112, "load1": 2.38, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.365, "aiperf_procs": 0} +{"ts": 1792557713.925, "seconds": 10.032, "load1": 2.39, "cpu": {"qwen38-b-hr": 0.964, "qwen38-a-hr": 1.154, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.368, "aiperf_procs": 0} +{"ts": 1792557723.956, "seconds": 10.032, "load1": 2.41, "cpu": {"qwen38-b-hr": 0.979, "qwen38-a-hr": 1.148, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.015, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.002}, "serving_cpu": 2.411, "aiperf_procs": 0} +{"ts": 1792557733.987, "seconds": 10.031, "load1": 2.51, "cpu": {"qwen38-b-hr": 0.984, "qwen38-a-hr": 1.135, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.375, "aiperf_procs": 0} +{"ts": 1792557744.016, "seconds": 10.029, "load1": 2.43, "cpu": {"qwen38-b-hr": 1.008, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.41, "aiperf_procs": 0} +{"ts": 1792557754.046, "seconds": 10.03, "load1": 2.36, "cpu": {"qwen38-b-hr": 0.981, "qwen38-a-hr": 1.13, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.375, "aiperf_procs": 0} +{"ts": 1792557764.162, "seconds": 10.116, "load1": 2.38, "cpu": {"qwen38-b-hr": 0.973, "qwen38-a-hr": 1.159, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.384, "aiperf_procs": 0} +{"ts": 1792557774.191, "seconds": 10.029, "load1": 2.24, "cpu": {"qwen38-b-hr": 1.006, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.403, "aiperf_procs": 0} +{"ts": 1792557784.226, "seconds": 10.035, "load1": 1.97, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.152, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.39, "aiperf_procs": 0} +{"ts": 1792557794.256, "seconds": 10.031, "load1": 1.83, "cpu": {"qwen38-b-hr": 0.973, "qwen38-a-hr": 1.154, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.386, "aiperf_procs": 0} +{"ts": 1792557804.286, "seconds": 10.03, "load1": 1.55, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.108, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.346, "aiperf_procs": 0} +{"ts": 1792557814.318, "seconds": 10.033, "load1": 1.39, "cpu": {"qwen38-b-hr": 0.96, "qwen38-a-hr": 1.135, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.346, "aiperf_procs": 0} +{"ts": 1792557824.423, "seconds": 10.105, "load1": 1.25, "cpu": {"qwen38-b-hr": 0.959, "qwen38-a-hr": 1.137, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.35, "aiperf_procs": 0} +{"ts": 1792557834.457, "seconds": 10.033, "load1": 1.28, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.003}, "serving_cpu": 2.376, "aiperf_procs": 0} +{"ts": 1792557844.489, "seconds": 10.032, "load1": 1.16, "cpu": {"qwen38-b-hr": 0.968, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.018, "node-exporter": 0.03, "prometheus": 0.01, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.057, "xpumd": 0.002}, "serving_cpu": 2.436, "aiperf_procs": 0} +{"ts": 1792557854.523, "seconds": 10.034, "load1": 1.06, "cpu": {"qwen38-b-hr": 0.977, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.0, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.023, "xpumd": 0.002}, "serving_cpu": 2.362, "aiperf_procs": 0} +{"ts": 1792557864.551, "seconds": 10.029, "load1": 0.89, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.017, "xpumd": 0.003}, "serving_cpu": 2.405, "aiperf_procs": 0} +{"ts": 1792557874.587, "seconds": 10.036, "load1": 1.3, "cpu": {"qwen38-b-hr": 0.986, "qwen38-a-hr": 1.116, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.163, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.359, "aiperf_procs": 0} +{"ts": 1792557884.698, "seconds": 10.112, "load1": 1.79, "cpu": {"qwen38-b-hr": 0.968, "qwen38-a-hr": 1.139, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 2.368, "aiperf_procs": 0} +{"ts": 1792557894.73, "seconds": 10.032, "load1": 2.05, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.382, "aiperf_procs": 0} +{"ts": 1792557904.76, "seconds": 10.03, "load1": 2.51, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.127, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.373, "aiperf_procs": 0} +{"ts": 1792557914.79, "seconds": 10.029, "load1": 2.52, "cpu": {"qwen38-b-hr": 0.988, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.023, "xpumd": 0.002}, "serving_cpu": 2.395, "aiperf_procs": 0} +{"ts": 1792557924.819, "seconds": 10.03, "load1": 2.88, "cpu": {"qwen38-b-hr": 0.996, "qwen38-a-hr": 1.112, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.362, "aiperf_procs": 0} +{"ts": 1792557934.848, "seconds": 10.029, "load1": 3.06, "cpu": {"qwen38-b-hr": 0.97, "qwen38-a-hr": 1.123, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.002}, "serving_cpu": 2.349, "aiperf_procs": 0} +{"ts": 1792557944.955, "seconds": 10.107, "load1": 2.74, "cpu": {"qwen38-b-hr": 0.991, "qwen38-a-hr": 1.151, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.02, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.014, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.026, "xpumd": 0.003}, "serving_cpu": 2.435, "aiperf_procs": 0} +{"ts": 1792557954.986, "seconds": 10.03, "load1": 2.71, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.135, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.018, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.392, "aiperf_procs": 0} diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/wait_s b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/wait_s new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke5/wait_s @@ -0,0 +1 @@ +0 From f846a44f5eb0b5fe708bcb56d0c0292e091ae8e1 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 21 Oct 2026 14:05:48 -0700 Subject: [PATCH 12/85] ledger(H7x): smoke 6 (C up with VLLM_CACHE_ROOT=/tmp/vllm) --- EXPERIMENTS.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index c27c8481..6ff1dac0 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -1659,7 +1659,7 @@ say nothing about the graded result. ### H7x pre-registration: H7 to its full protocol on the Xeon 6741P (2026-10-20) -Written 2026-10-20T23:10Z, revised 2026-10-21T04:00Z after four setup smokes, before any H7x +Written 2026-10-20T23:10Z, revised 2026-10-21T21:10Z after six setup smokes, before any H7x measurement (the smokes started the engines and sent no request; see below). H7 keeps its INCONCLUSIVE verdict on the i9-13900T. @@ -1743,8 +1743,10 @@ come up, the run continues without it and C/B is reported as not measured. Smoke 04:12-04:47Z, order B C, 16 CPUs, the fit's 22Gi): B Ready in 141 s; C with `VLLM_CACHE_ROOT=/root/.cache/vllm` (the chart's cache volume) failed on `PermissionError: [Errno 13] Permission denied: '/root/.cache'` (read with `--previous`), so the -cache root moved to `/tmp/vllm`. A sixth smoke (C only) runs before this row is merged and is -reported in its run section. `H7X_READY_S=1800` is used for the run, because the first vLLM +cache root moved to `/tmp/vllm`. Smoke 6 (2026-10-21 06:54-06:58Z, C only, 16 CPUs, the fit's +22Gi, `VLLM_CACHE_ROOT=/tmp/vllm`): C Ready in 184 s on 0-7,48-55. All three arms have now come up +on this host with the run's settings; no request was sent in any smoke. Smoke records: +`bench/xhost/results/2026-10-21/H7x-smokes/` (smoke 6 is added with the run). `H7X_READY_S=1800` is used for the run, because the first vLLM start in a fresh cluster pulls its 7.4 GB image. **Hold.** One hold, cap 4200 s (11 blocks; a vLLM cold start is the slow step). If the cap ends From d11f725c8facabc585629307eb666c3e3b04ac38 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 21 Oct 2026 14:16:01 -0700 Subject: [PATCH 13/85] H7x review fixes: run-order pairing, restart and no-rate voids, RAPL preflight, endpoint check, score on exit, FIT=off for A, cap 10800 s, disclosures, smoke 6 record --- EXPERIMENTS.md | 53 ++- bench/apb/h7x.py | 32 +- bench/apb/h7x.sh | 31 +- bench/apb/test_h7x.py | 29 +- .../smoke6/h7x-20261021-065424/agent.err | 2 + .../smoke6/h7x-20261021-065424/agent.yaml | 109 +++++ .../smoke6/h7x-20261021-065424/commit.txt | 1 + .../smoke6/h7x-20261021-065424/cpus.txt | 1 + .../smoke6/h7x-20261021-065424/eat.yaml | 253 ++++++++++ .../smoke6/h7x-20261021-065424/fit.json | 132 ++++++ .../smoke6/h7x-20261021-065424/image.txt | 1 + .../smoke6/h7x-20261021-065424/node-cpus.txt | 1 + .../smoke6/h7x-20261021-065424/node-image.txt | 1 + .../smoke6/h7x-20261021-065424/ovms.yaml | 94 ++++ .../smoke6/h7x-20261021-065424/values.yaml | 437 ++++++++++++++++++ .../smoke6/h7x-20261021-065424/vllm-c.err | 0 .../smoke6/h7x-20261021-065424/vllm-c.yaml | 178 +++++++ .../smoke6/h7x-20261021-065424/vllm-mem.txt | 1 + .../smoke6/h7x-20261021-065424/vllm.yaml | 173 +++++++ .../2026-10-21/H7x-smokes/smoke6/post.txt | 16 + .../2026-10-21/H7x-smokes/smoke6/pre.txt | 16 + .../results/2026-10-21/H7x-smokes/smoke6/rc | 1 + .../H7x-smokes/smoke6/serving.jsonl | 24 + .../2026-10-21/H7x-smokes/smoke6/wait_s | 1 + 24 files changed, 1555 insertions(+), 32 deletions(-) create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/agent.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/agent.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/commit.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/eat.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/fit.json create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/image.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/node-cpus.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/node-image.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/ovms.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/values.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-c.err create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-c.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-mem.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm.yaml create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/post.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/pre.txt create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/rc create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/serving.jsonl create mode 100644 bench/xhost/results/2026-10-21/H7x-smokes/smoke6/wait_s diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index 6ff1dac0..dd017a3d 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -94,7 +94,7 @@ setup too weak to decide). Only `SUPPORTED` backs a claim. | H34x | H34's hypothesis on the Xeon 6741P: same-engine CPU Fast Draft (OVMS 2026.4.1, `OpenVINO/Qwen3-0.6B-int4-ov` draft on the CPU) beats the `OpenVINO/Qwen3-4B-int4-ov` target alone on single-stream decode, under matched background load. A replication: the original models are kept. | Written 2026-10-20, before any H34x measurement. At `typical`: median paired B/A decode tok/s 1.40 (1.15-1.70) and median paired B/A package J/token 0.75 (0.60-0.95); SUPPORTED by H34's rule (tok/s >= 1.20 with its CI above 1.0, J/token <= 0.85 with its CI below 1.0) at 0.6, REFUTED 0.25 (the draft's share of a faster target step grows), INCONCLUSIVE 0.15. | H34's `bench/hetero-spec/h34.sh` and `h34.py`, n = 12 pairs A B / B A, 5 s load window per request, unchanged except as listed in the cross-host pre-registration: cluster `k3dgpu-x-h34`, `K3D_GPU_VENDORS=none`, node container on CPUs 0-23,48-71, crescent amendment C1, `typical` only. Run 2026-10-20 ([H34x run](#h34x-run-xeon-6741p-2026-10-20)): load MATCHED, 12/12 pairs; B/A decode tok/s 0.758 (CI 0.688-0.809) and package J/token 1.241 (CI 1.168-1.347), B slower and costlier in 12/12 pairs (A 37.2, B 28.0 tok/s): the draft slows decode on this Xeon. | REFUTED | | H25x | H25's hypothesis (T part) on the Xeon 6741P: agents that send a byte-identical system prompt and tools to one OVMS CPU server reuse one prefix KV, so an added agent's first chunk arrives at least 4x sooner with the shipping prefix caching on than with `--enable_prefix_caching=false`. A replication: the original model and prefix shape are kept. | Written 2026-10-20, before any H25x measurement. Added-agent median TTFT OFF 1.2 s (0.5-2.5), ON 0.15 s (0.06-0.4), ratio 8x (4.5-14), the ratio's 95% CI lower bound >= 4x; c/OFF >= 0.8. SUPPORTED 0.75; the risk is fixed per-request overhead, which a 5-10x faster prefill leaves as a larger share of the ON time. M (memory per agent) not measured, as in H25 run 4. | H25's `bench/shared-prefix/run.sh` and `probe.py score` (A3 first-chunk TTFT, A4 amendment-27 load rule), ON OFF interleaved 3+3 rounds, unchanged except as listed in the cross-host pre-registration: cluster `k3dgpu-x-h25`, `K3D_GPU_VENDORS=none`, node container on CPUs 0-23,48-71 (`NODE_CPUS`), crescent amendment C1, `typical` only. Run 2026-10-21 ([H25x run](#h25x-run-xeon-6741p-2026-10-21)): load MATCHED (amendment 27), no round void; added agent's first chunk 0.245 s ON vs 1.724 s OFF (7.05x, CI 6.94-7.13, n = 15 per arm), c/OFF 0.99, every round pair >= 4x: T SUPPORTED; M not measured (A3). | SUPPORTED | | H28x | H28's hypothesis on the Xeon 6741P: N = 8 agent pods that mmap one 1 GiB model through an image volume share one page-cache copy and become ready in at most half the time of pods that copy it into an emptyDir. A replication (H28 has no model; the 1 GiB blob is kept). | Written 2026-10-20, before any H28x measurement. Memory parts hold (0.95): T PSS <= 160 MiB per pod, model page cache about 1.0x size (T) vs about 9x (C). Time part uncertain: the copy runs at memory speed on this host, so the fixed pod-start cost is a larger share of both arms; T/C round-median ready 0.55 (0.35-0.8). SUPPORTED 0.35, REFUTED (time part) 0.5, other rows 0.15. | H28's `bench/zero-copy-models/probe.sh` (A1, A2), arms C T T C C T plus the unscored warm-up, unchanged except as listed in the cross-host pre-registration: cluster `k3dgpu-x-h28`, crescent amendment C1 passed to the plain `k3d cluster create`, `typical` only, scored by `bench/zero-copy-models/score.py` (H28's table, committed with this pre-registration). | PENDING | -| H7x | H7's hypothesis on the Xeon 6741P, run to H7's full protocol: OVMS's decode lead over EAT's vLLM CPU engine comes from weight precision, not from the engine. One checkpoint (`Qwen/Qwen3-4B` @ `1cfa9a72`), OVMS 2026.4.1 on its 16-bit IR (`OpenVINO/Qwen3-4B-fp16-ov` @ `00298f1c`) and vLLM CPU v0.24.0 in bf16 with EAT's chart defaults decode within 15% of each other, and land within 15% in effective weight bandwidth. A replication: H7's models and versions are kept. | Written 2026-10-20, before any H7x measurement. On AMX both engines compute in bf16 and batch-1 decode reads the same 8.0 GB per token, so the engine gap shrinks: R = OVMS/vLLM decode 1.10 (0.85-1.40); SUPPORTED 0.45, REFUTED 0.30, INCONCLUSIVE 0.25. Reported, not scored: prefill TTFT on ~1936 tokens vLLM/OVMS 1.5 (0.7-4; the i9 gap of 4.3x was outside H7's prediction), C/B decode (`--enforce-eager` dropped) 1.0-1.3, decode incremental J/token per arm. | `bench/apb/h7x.sh` (H7's `h7.sh` extended to the pre-registered protocol: H2's workloads and energy method, blocks A B B A A B B A A B, then one C block with `--enforce-eager` dropped), scored by `bench/apb/h7x.py`; decision rule, host changes and hold in [H7x pre-registration](#h7x-pre-registration-h7-to-its-full-protocol-on-the-xeon-6741p-2026-10-20). | PENDING | +| H7x | H7's hypothesis on the Xeon 6741P, run to H7's full protocol: OVMS's decode lead over EAT's vLLM CPU engine comes from weight precision, not from the engine. One checkpoint (`Qwen/Qwen3-4B` @ `1cfa9a72`), OVMS 2026.4.1 on its 16-bit IR (`OpenVINO/Qwen3-4B-fp16-ov` @ `00298f1c`) and vLLM CPU v0.24.0 in bf16 with EAT's chart defaults decode within 15% of each other, and land within 15% in effective weight bandwidth. A replication: H7's models and versions are kept. | Written 2026-10-20, before any H7x measurement. On AMX both engines compute in bf16 and batch-1 decode reads the same 8.0 GB per token, so the engine gap shrinks: R = OVMS/vLLM decode 1.10 (0.85-1.40); SUPPORTED 0.45, REFUTED 0.30, INCONCLUSIVE 0.25. Reported, not scored: prefill TTFT on ~1850 tokens vLLM/OVMS 1.5 (0.7-4; the i9 gap of 4.3x was outside H7's prediction), C/B decode (`--enforce-eager` dropped) 1.0-1.3, decode incremental J/token per arm. | `bench/apb/h7x.sh` (H7's `h7.sh` extended to the pre-registered protocol: H2's workloads and energy method, blocks A B B A A B B A A B, then one C block with `--enforce-eager` dropped), scored by `bench/apb/h7x.py`; decision rule, host changes and hold in [H7x pre-registration](#h7x-pre-registration-h7-to-its-full-protocol-on-the-xeon-6741p-2026-10-20). | PENDING | | H55 | On the i9-13900T, an SLO gate on the E-core neighbour's `cpu.max`, set from the P-core inference server's own median TTFT, keeps CPU-served prefill within +10% of quiet while the neighbour keeps more throughput than H5's frequency-cap frontier (CMIN: +23.3% at 72.4% neighbour loss) and than the best static quota at the same penalty. | Written 2026-10-20, before any H55 measurement; control rule revised the same day, still before any measurement (see the section). Pre-registered prior, not a result: N0 about +40% (H5 replicate), K50 +20 to +30% at about 50% loss, K25 +8 to +15% at about 75% loss. A_slo climbs only while the penalty at its level is at most +5%, so it is expected to stay at the 25-37.5% levels, close to K25: +8 to +15% at 70-78% loss, failing (b) or (c). Expected verdict REFUTED: package power is the coupling, duty-cycling the neighbour is less power-efficient per op than H5's frequency cap, and a closed-loop c = 1 prefill load leaves no idle gap to admit it into. If H55 holds, A_slo settles at 50% or above at +10% or less. | H5 amendment A1's host-level harness (OVMS 2026.4.1, `OpenVINO/Qwen3-4B-int4-ov`, `bench/prefill-guard/prompt.txt` with a unique tag per request, CPUs 0-14; `stress-ng --cpu 15 --cpu-method matrixprod` on CPUs 17-31; tool proxy on CPU 16), with a 900 s closed-loop prefill window per run (16 tokens, concurrency 1). Arms Q, N0 (`cpu.max max`), K50 (`750000 100000`), K25 (`375000 100000`) and A_slo (`bench/admission/ctl.py` steps 25-100% of 15 CPUs on windows of 20 requests: down if the window median > 1.10 x the round's quiet reference, the median of 20 pre-roll requests; up if it is at most 1.05 x that), 5x5 Latin square, one round per lock hold. Supported only if A_slo's median penalty is at most +10%, its neighbour loss is below 72.4%, and no static arm reaches +10% at a loss no higher than A_slo's plus the neighbour's own N0 run-to-run spread; inconclusive gates and the hold cap in [H55 pre-registration](#h55-pre-registration-slo-gated-admission-of-an-e-core-neighbour-2026-10-20). Not run. A SUPPORTED H55 does not ship a controller by itself: kubelet owns the sandbox pod's `cpu.max` (`limits cpu "1"`). | PENDING | | H56 | Two measurement holds in disjoint cpuset slices of the Xeon 6741P do not perturb each other: an A1 B24 agent block in slice 0 (CPUs 0-23,48-71) behaves equivalently, in per-attempt time, within-budget success and tasks completed, alone and with a concurrent identical A1 hold in slice 1 (CPUs 24-47,72-95), without an all-core clock drop on slice 0 and with the package below its power limit. It decides whether crescent may run two A1-or-lighter holds at once ([adoption rule](#h56-pre-registration-parallel-slice-holds-on-crescent-2026-10-20)); it is not a k3d-gpu product claim. | Written 2026-10-20, before any run; predictions unchanged by the 2026-10-21 revision, priors updated to its narrower bands. Geometric-mean W/A time ratio 1.04 (0.99-1.09); paired success W - A -0.01 (-0.06 to +0.04); completion W/A 0.97 (0.90-1.00); own-slice MHz W/A 0.97; W package 0.75 PL1 (0.55-0.95), A package 0.5 PL1; time pairs 80 (50-96). Batch-1 int4 decode is DRAM-bound, and the sibling's decode and its stream load share DRAM, L3 and package power. Verdict priors: SUPPORTED 0.30, INCONCLUSIVE 0.45, REFUTED 0.25. | Stage 0 first, read-only: `bench/eatflow/crescent/lockwait.py` over both campaigns' `campaign.log`; if lock wait our slots could remove is under 0.10 of hold time, stage 1 is not run and the row stays PENDING (`h56.sh` refuses through `h56.py gate`). [Amendment S0](#h56-pre-registration-parallel-slice-holds-on-crescent-2026-10-20) (2026-10-21, before any stage-1 hold, stage-0 reading disclosed): the share is pooled lock wait over hold time across every campaign log on crescent, nothing netted out; bar 0.10 unchanged. Then one W wiring smoke, which must show slice-0 setup <= 900 s and >= 3 tasks in 120 s. Stage 1: `bench/eatflow/crescent/h56.sh N` for N = 1..8, order A W W A A W W A, one condition-hold per exclusive campaign lock (slot locks first). A: slice 0 alone, slice 1 idle. W: the sibling in slice 1 first (cap 3000 s, budget 1800 s), slice 0 from the sibling's run budget on (cap 2400 s, budget 720 s, the same as A). Hold pairs (1,2) (4,3) (5,6) (8,7), tasks by id; 90% two-stage bootstrap CIs (hold pairs, then tasks; 10,000, seed 56; TOST at alpha 0.05). SUPPORTED: all 8 positions filled, time CI inside [1/1.05, 1.05], success CI inside [-1/24, +1/24], completion W/A >= 1/1.05, >= 60 time pairs, own-slice MHz W/A >= 0.95, W package < 0.95 PL1 and PL1 read. REFUTED: the time CI wholly outside its band, the success CI wholly outside its band, or the completion CI wholly below 1/1.05. Otherwise INCONCLUSIVE. VOID holds are replaced, at most 2. `bench/eatflow/crescent/h56.py score`. | PENDING | @@ -1659,8 +1659,8 @@ say nothing about the graded result. ### H7x pre-registration: H7 to its full protocol on the Xeon 6741P (2026-10-20) -Written 2026-10-20T23:10Z, revised 2026-10-21T21:10Z after six setup smokes, before any H7x -measurement (the smokes started the engines and sent no request; see below). H7 keeps its +Written 2026-10-20T23:10Z, revised 2026-10-21T21:10Z after six setup smokes and 2026-10-21T22:30Z after a review, before +any H7x measurement (the smokes started the engines and sent no request; see below). H7 keeps its INCONCLUSIVE verdict on the i9-13900T. **Why.** H7's i9 run was short of its own pre-registration (3 and 2 blocks instead of 5 ABBA @@ -1668,13 +1668,19 @@ rounds, no `--enforce-eager`-dropped arm, no energy) and its decode gap (15.6% o 13.5% of OVMS's) straddled the line. This row runs the whole protocol, on the CPU EAT's vLLM path is written for (Xeon with AMX), and fixes in advance how the 15% line is read. -**Arms** (H7's): A = OVMS 2026.4.1 (`openvino/model_server@sha256:a928903f...76fc58`), -`agent manifest` CPU, `OpenVINO/Qwen3-4B-fp16-ov` @ `00298f1c`, no draft -(`K3D_GPU_AGENT_DRAFT=off`; H7 predates the CPU Fast Draft default); B = vLLM CPU v0.24.0 +**Arms** (H7's run, which itself departed from H7's pre-registration: that named +`Qwen3-4B-Instruct-2507`, and the run used `Qwen/Qwen3-4B` because OpenVINO publishes a 16-bit IR +of it; H7x keeps the run's checkpoint): A = OVMS 2026.4.1 +(`openvino/model_server@sha256:a928903f...76fc58`), `agent manifest` CPU, +`OpenVINO/Qwen3-4B-fp16-ov` @ `00298f1c`, no draft (`K3D_GPU_AGENT_DRAFT=off`; H7 predates the CPU +Fast Draft default) and no host fit (`K3D_GPU_FIT=off`; H7 predates #174, which would set +`--cache_size` and `--max_num_seqs` from this host); B = vLLM CPU v0.24.0 (`vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f860...981a1`) with EAT's chart at `0d3438d` (`xeon-values.yaml` + `integrations/eat/vllm-values.yaml`, KV 6 GiB, `--max-model-len 32768`), `Qwen/Qwen3-4B` @ `1cfa9a72` in bf16; C = B with `--enforce-eager` removed (and a writable -`VLLM_CACHE_ROOT`, see the smokes) and nothing else changed (its own Deployment and Service, selector label `h7x-arm: c`). The int4 second arm runs +`VLLM_CACHE_ROOT`, see the smokes) and nothing else changed (its own Deployment and Service, selector label `h7x-arm: c`). +C is one block, reported only: narrower than H7's "split engine from config", which this row does +not decide. The int4 second arm runs only if vLLM v0.24.0 CPU is first shown to load an int4 build of the same checkpoint (H7); it is not run. @@ -1684,18 +1690,23 @@ a time; consecutive blocks of one engine keep the server up, as `h7.sh` does. Pe and 1 prefill warm-up (excluded), `bench/energy.sh` over a 20 s model-loaded idle, then `bench/energy.sh` around each workload through `bench/llm_load.py` (temperature 0, `ignore_eos`, unique prompts, streamed): decode 5 x (default ~30-token prompt, 256 out, c=1); prefill -5 x (unique ~1936-token prompt, 16 out, c=1); conc4 8 x 128 out at 4 in flight. Energy: +5 x (a unique prompt of 56 copies of one sentence, about 1850 tokens; H2's was ~1936 tokens of +other text; `prompt_tokens` is recorded per request), 16 out, c=1); conc4 8 x 128 out at 4 in +flight. Requests go through `kubectl port-forward`, as in H7 (H2 used a NodePort); each engine's +`/models` must answer through it before its block starts. Energy: RAPL `intel-rapl:0` package through `sudo`, incremental J = E - idle W x t (H2). **Decision rule** (fixed now; H7 left the reading of "within 15%" open). R = median A decode tok/s / median B decode tok/s over every request of the valid blocks; gap(x) = max(x, 1/x) - 1. -Block pairs in run order (the k-th A block with the k-th B block; 5 pairs), r_k = ratio of -their block medians. R_bw = R x (A weight bytes / B weight bytes) = R x 0.99999. -- SUPPORTED: gap(R) < 0.15, gap(R_bw) < 0.15 and gap(r_k) < 0.15 for all 5 pairs. -- REFUTED: gap(R) >= 0.15 and all 5 r_k on the same side of 1 as R with gap(r_k) >= 0.15 +Blocks pair in run order: the k-th A block with the k-th B block, void blocks counted in the +order (5 pairs); a pair with a void block is dropped, and "all pairs" below means all remaining +pairs. r_k = ratio of their block medians. R_bw = R x (A weight bytes / B weight bytes) = R x 0.99999. +- SUPPORTED: gap(R) < 0.15, gap(R_bw) < 0.15 and gap(r_k) < 0.15 for all pairs. +- REFUTED: gap(R) >= 0.15 and all r_k on the same side of 1 as R with gap(r_k) >= 0.15 (either engine faster by 15% or more, consistently). -- INCONCLUSIVE: anything else, or >= 2 void blocks in A or B (a block is void when its decode - phase has fewer than 5 ok requests or a request stops short of 256 tokens). +- INCONCLUSIVE: anything else, or >= 2 void blocks or fewer than 4 valid blocks in A or B (a + block is void when its decode phase has fewer than 5 ok requests, a request stops short of 256 + tokens or has no decode rate, or the serving pod restarted during the block, `restarts.txt`). - Reported, never gating: C/B decode, prefill TTFT and conc4 per arm, decode incremental J/token per arm. `bench/apb/h7x.py` applies this mechanically (unit tests in `bench/apb/test_h7x.py`). @@ -1746,12 +1757,16 @@ come up, the run continues without it and C/B is reported as not measured. Smoke cache root moved to `/tmp/vllm`. Smoke 6 (2026-10-21 06:54-06:58Z, C only, 16 CPUs, the fit's 22Gi, `VLLM_CACHE_ROOT=/tmp/vllm`): C Ready in 184 s on 0-7,48-55. All three arms have now come up on this host with the run's settings; no request was sent in any smoke. Smoke records: -`bench/xhost/results/2026-10-21/H7x-smokes/` (smoke 6 is added with the run). `H7X_READY_S=1800` is used for the run, because the first vLLM +`bench/xhost/results/2026-10-21/H7x-smokes/` (1-6). `H7X_READY_S=1800` is used for the run, because the first vLLM start in a fresh cluster pulls its 7.4 GB image. -**Hold.** One hold, cap 4200 s (11 blocks; a vLLM cold start is the slow step). If the cap ends -the run before all 10 A/B blocks, the blocks that ran are scored by the same rule, and fewer than -4 valid blocks in A or B reads INCONCLUSIVE. +**Hold.** One hold, cap 10800 s. Budget: 11 blocks of about 2 warm-ups, 20 s idle, 5 x 256 +decode, 5 prefills of ~1850 tokens and 8 x 128 at c=4 (300-900 s each on 16 CPUs, the bf16 vLLM +prefill the slowest), 6 engine starts of 30-240 s, about 16 GB of staging; an earlier draft's +4200 s was too short. Before `up`, `bench/energy.sh` runs once as a RAPL preflight; if it fails +the hold stops before any block. If the cap ends the run before all 10 A/B blocks, `h7x.sh`'s exit +trap scores the blocks that ran by the same rule, and fewer than 4 valid blocks in A or B reads +INCONCLUSIVE. **Reproduce.** @@ -1761,7 +1776,7 @@ C1="--kubelet-arg=eviction-hard=memory.available<100Mi,nodefs.available<1%,image $X/hfvenv/bin/python bench/xhost/fetch_models.py $X/models \ OpenVINO/Qwen3-4B-fp16-ov@00298f1c614ffdc000814d8cbe1b7613aa73cdca Qwen/Qwen3-4B@1cfa9a7208912126459214e8b04321603b3df60c git -C $X/eat-src checkout 0d3438d # https://github.com/intel/enterprise-agent-toolkit -bench/xhost/hold.sh H7x 4200 env K3D_GPU_IMAGE=cryptoandcoffee/k3d-gpu:0.1.61 K3D_GPU_VENDORS=none \ +bench/xhost/hold.sh H7x 10800 env K3D_GPU_IMAGE=cryptoandcoffee/k3d-gpu:0.1.61 K3D_GPU_VENDORS=none \ K3D_GPU_K3S_ARGS="$C1" K3D_GPU_CLUSTER=k3dgpu-x-h7 H7X_CPUS=16 H7X_NODE_CPUS=0-7,48-55 H7X_READY_S=1800 H7X_VLLM_MEM=fit \ APB_MODELS=$X/models APB_EAT_CHART=$X/eat-src/core/helm-charts/vllm APB_OUT=$X/runs/H7x \ bench/apb/h7x.sh diff --git a/bench/apb/h7x.py b/bench/apb/h7x.py index 9e70788a..1c66c8b9 100755 --- a/bench/apb/h7x.py +++ b/bench/apb/h7x.py @@ -5,13 +5,15 @@ b---energy.json and b--idle-energy.json (bench/energy.sh). E is A (OVMS fp16), B (vLLM CPU bf16, EAT chart defaults) or C (B without --enforce-eager). -A block is void when its decode phase has fewer than 5 ok requests or any request stopped -short of 256 output tokens. With >= 2 void blocks, or fewer than 4 valid blocks (a hold cut +A block is void when its decode phase has fewer than 5 ok requests, any request stopped short +of 256 output tokens or has no decode rate, or the engine's pod restarted during the block +(restarts.txt: "b "). With >= 2 void blocks, or fewer than 4 valid blocks (a hold cut short by its cap), in arm A or B the run is INCONCLUSIVE. Decision (pre-registered in H7x): R = median A decode tok/s / median B decode tok/s over every request of the valid blocks; gap(x) = max(x, 1/x) - 1. Blocks pair in run order: the k-th A -block with the k-th B block (ABBAABBAAB gives 5 pairs), r_k = ratio of their block medians. +block with the k-th B block, void blocks included in the count (ABBAABBAAB gives 5 pairs); a pair +with a void block is dropped. r_k = ratio of their block medians. SUPPORTED gap(R) < 0.15, gap(R_bw) < 0.15 and gap(r_k) < 0.15 for every pair REFUTED gap(R) >= 0.15 and every r_k on R's side of 1 with gap(r_k) >= 0.15 INCONCLUSIVE otherwise @@ -41,8 +43,22 @@ def load(path): return None +def restarts(run): + """{block: True} for blocks whose pod restarted (restarts.txt from h7x.sh).""" + out = {} + try: + with open(os.path.join(run, "restarts.txt")) as f: + for line in f: + p = line.split() + if len(p) == 4 and p[0].startswith("b"): + out[int(p[0][1:])] = p[2] != p[3] + except OSError: + pass + return out + + def blocks(run): - out = [] + out, rs = [], restarts(run) for p in glob.glob(os.path.join(run, "b*-*-decode.json")): m = re.match(r"b(\d+)-([ABC])-decode\.json$", os.path.basename(p)) if not m: @@ -57,7 +73,9 @@ def blocks(run): rec["idle"] = load(os.path.join(run, f"b{i}-{e}-idle-energy.json")) dec = [s for s in (rec["decode"] or {}).get("samples", []) if s.get("ok")] rec["decode_tps"] = [s["decode_tokens_per_s"] for s in dec if s.get("decode_tokens_per_s")] - rec["void"] = len(dec) < 5 or any(s.get("output_tokens") != 256 for s in dec) + rec["restarted"] = rs.get(i, False) + rec["void"] = (len(dec) < 5 or len(rec["decode_tps"]) < len(dec) or rec["restarted"] + or any(s.get("output_tokens") != 256 for s in dec)) out.append(rec) return sorted(out, key=lambda r: r["block"]) @@ -79,7 +97,9 @@ def score(recs): med = {e: st.median(t for r in arms[e] for t in r["decode_tps"]) for e in "ABC" if arms[e]} R = med["A"] / med["B"] R_bw = (A_BYTES * med["A"]) / (B_BYTES * med["B"]) - pairs = [st.median(a["decode_tps"]) / st.median(b["decode_tps"]) for a, b in zip(arms["A"], arms["B"])] + run_order = {e: [r for r in recs if r["engine"] == e] for e in "AB"} + pairs = [st.median(a["decode_tps"]) / st.median(b["decode_tps"]) + for a, b in zip(run_order["A"], run_order["B"]) if not (a["void"] or b["void"])] side = all((r > 1) == (R > 1) for r in pairs) if gap(R) < 0.15 and gap(R_bw) < 0.15 and all(gap(r) < 0.15 for r in pairs): v = "SUPPORTED" diff --git a/bench/apb/h7x.sh b/bench/apb/h7x.sh index cb438691..6b8a78b2 100755 --- a/bench/apb/h7x.sh +++ b/bench/apb/h7x.sh @@ -40,7 +40,13 @@ export KUBECONFIG=${OUT}/kubeconfig t0=$(date +%s) stamp() { echo "== $1 $(date -u +%FT%TZ) (+$(( $(date +%s) - t0 ))s)"; } PF= -cleanup() { [ -n "${PF}" ] && kill "${PF}" 2>/dev/null; stamp cleanup; k3d cluster delete "${K3D_GPU_CLUSTER}" >/dev/null 2>&1; stamp deleted; } +scored=0 +score() { # the decision rule over whatever blocks ran (also on a cap TERM) + [ "${scored}" = 1 ] || [ "${H7X_SMOKE:-0}" = 1 ] || [ "${H7X_RENDER_ONLY:-0}" = 1 ] && return 0 + scored=1 + python3 "${HERE}/h7x.py" "${OUT}" > "${OUT}/verdict.json" 2>>"${OUT}/notes.txt" && cat "${OUT}/verdict.json" +} +cleanup() { [ -n "${PF}" ] && kill "${PF}" 2>/dev/null; score; stamp cleanup; k3d cluster delete "${K3D_GPU_CLUSTER}" >/dev/null 2>&1; stamp deleted; } trap cleanup EXIT trap 'exit 143' TERM INT HUP nodes() { docker ps --filter "label=k3d.cluster=${K3D_GPU_CLUSTER}" --filter "label=k3d.role=server" --format '{{.Names}}'; } @@ -57,7 +63,9 @@ stage() { # stage stamp render # H7's OVMS arm has no draft (it predates the CPU Fast Draft default of #116). -K3D_GPU_AGENT_DEVICE=CPU K3D_GPU_AGENT_MODEL=OpenVINO/Qwen3-4B-fp16-ov K3D_GPU_AGENT_CPUS=${CPUS} K3D_GPU_AGENT_DRAFT=off \ +# H7 also predates the host fit (#174), which would size A's KV pool to this host; K3D_GPU_FIT=off +# keeps the manifest as H7 rendered it. +K3D_GPU_FIT=off K3D_GPU_AGENT_DEVICE=CPU K3D_GPU_AGENT_MODEL=OpenVINO/Qwen3-4B-fp16-ov K3D_GPU_AGENT_CPUS=${CPUS} K3D_GPU_AGENT_DRAFT=off \ "${K}" agent manifest > "${OUT}/agent.yaml" 2> "${OUT}/agent.err" || { cat "${OUT}/agent.err"; exit 1; } python3 "${HERE}/stage.py" ovms "${OUT}/agent.yaml" "${OUT}/ovms.yaml" if [ "${VLLM_MEM}" = fit ]; then @@ -105,6 +113,11 @@ EOF [ -s "${OUT}/vllm-c.yaml" ] || { echo "C manifest not rendered"; exit 1; } diff <(grep -c -- --enforce-eager "${OUT}/vllm.yaml") <(echo 1) >/dev/null || { echo "B has no --enforce-eager"; exit 1; } if [ "${H7X_RENDER_ONLY:-0}" = 1 ]; then trap - EXIT; ls "${OUT}"; exit 0; fi +if [ "${H7X_SMOKE:-0}" != 1 ]; then + # energy.sh reads RAPL through sudo; a block whose energy.sh fails leaves no record. + "${ENERGY}" --json "${OUT}/preflight-energy.json" -- sleep 1 2>>"${OUT}/energy.log" \ + || { echo "RAPL preflight failed (bench/energy.sh): see energy.log"; exit 1; } +fi stamp up K3D_GPU_NODE_LABELS=ei-infra-eligible=true,ei-inference-eligible=true timeout 300 "${K}" up > "${OUT}/up.log" 2>&1 \ || { echo "up failed"; tail -20 "${OUT}/up.log"; exit 1; } @@ -148,7 +161,12 @@ up_engine() { # up_engine A|B|C: every other server scaled to 0 first, so only kubectl -n default port-forward "svc/${s}" 18001:80 >/dev/null 2>&1 & PF=$! BASE=http://127.0.0.1:18001/v1 MODEL=Qwen/Qwen3-4B NS=default ;; esac - sleep 3 + local k + for k in $(seq 60); do + curl -fsS -m 5 "${BASE}/models" >/dev/null 2>&1 && break + [ "${k}" = 60 ] && { echo "$1: ${BASE}/models not answering through the port-forward"; return 1; } + sleep 2 + done cur=$1 local n pid n=$(nodes | head -1) @@ -157,6 +175,9 @@ up_engine() { # up_engine A|B|C: every other server scaled to 0 first, so only [ -n "${pid}" ] && echo "$1 $(docker exec "${n}" grep Cpus_allowed_list "/proc/${pid}/status")" >> "${OUT}/cpus.txt" kubectl -n "${NS}" get pods -o jsonpath='{range .items[*]}{.spec.containers[0].image}{" "}{.status.containerStatuses[0].imageID}{" "}{.spec.containers[0].args}{"\n"}{end}' >> "${OUT}/image.txt" } +restarts_now() { # restart count of the serving pod (a change voids the block in h7x.py) + kubectl -n "${NS}" get pods -o jsonpath='{range .items[*]}{.status.containerStatuses[0].restartCount}{"+"}{end}' 2>/dev/null +} load() { # load llm_load args... local b=$1 e=$2 w=$3; shift 3 "${ENERGY}" --json "${OUT}/b${b}-${e}-${w}-energy.json" -- \ @@ -187,12 +208,14 @@ for e in ${ORDER}; do python3 "${LOAD}" --base-url "${BASE}" --model "${MODEL}" --temperature 0 --prompt "${PREFILL}" --max-tokens 16 --ignore-eos \ --unique-prompts --requests 1 --warmup 0 --label warm >/dev/null 2>&1 "${ENERGY}" --json "${OUT}/b${i}-${e}-idle-energy.json" -- sleep 20 2>>"${OUT}/energy.log" + r0=$(restarts_now) load "${i}" "${e}" decode --max-tokens 256 --requests 5 --concurrency 1 load "${i}" "${e}" prefill --prompt "${PREFILL}" --max-tokens 16 --requests 5 --concurrency 1 load "${i}" "${e}" conc4 --max-tokens 128 --requests 8 --concurrency 4 + echo "b${i} ${e} ${r0} $(restarts_now)" >> "${OUT}/restarts.txt" stamp "block ${i} engine ${e} done" done git -C "${REPO}" rev-parse HEAD > "${OUT}/commit.txt" docker inspect --format '{{.Config.Image}} {{.Image}}' "$(nodes | head -1)" > "${OUT}/node-image.txt" -[ "${H7X_SMOKE:-0}" = 1 ] || python3 "${HERE}/h7x.py" "${OUT}" | tee "${OUT}/verdict.json" +score stamp finished diff --git a/bench/apb/test_h7x.py b/bench/apb/test_h7x.py index 1b1cac8c..a5bef172 100644 --- a/bench/apb/test_h7x.py +++ b/bench/apb/test_h7x.py @@ -12,7 +12,7 @@ ORDER = "A B B A A B B A A B C".split() -def write_run(d, tps, tokens=256, n=5, skip=()): +def write_run(d, tps, tokens=256, n=5, skip=(), void_blocks=(), no_rate_blocks=(), restarts=()): """tps: {engine: tok/s or [per-block tok/s in run order]}""" seen = {} for i, e in enumerate(ORDER, start=1): @@ -21,8 +21,12 @@ def write_run(d, tps, tokens=256, n=5, skip=()): k = seen.get(e, 0) seen[e] = k + 1 v = tps[e][k] if isinstance(tps[e], list) else tps[e] - dec = {"phases": [{"samples": [{"ok": True, "output_tokens": tokens, "decode_tokens_per_s": v + j * 0.01} - for j in range(n)], "output_tokens_total": tokens * n}]} + tok = 200 if i in void_blocks else tokens + dec = {"phases": [{"samples": [{"ok": True, "output_tokens": tok, + "decode_tokens_per_s": None if i in no_rate_blocks else v + j * 0.01} + for j in range(n)], "output_tokens_total": tok * n}]} + with open(os.path.join(d, "restarts.txt"), "a") as rf: + rf.write(f"b{i} {e} 0 {1 if i in restarts else 0}\n") pre = {"phases": [{"samples": [{"ok": True, "ttft_s": 2.0}] * 5}]} c4 = {"phases": [{"samples": [], "aggregate_tokens_per_s": 3 * v}]} for w, obj in (("decode", dec), ("prefill", pre), ("conc4", c4)): @@ -68,6 +72,25 @@ def test_cap_cut_run_with_three_a_blocks_is_inconclusive(self): v = run({"A": 20.0, "B": 18.5, "C": 18.5}, skip=(8, 9, 10, 11)) self.assertEqual(v["verdict"], "INCONCLUSIVE") + def test_pairs_follow_run_order_with_a_void_block(self): + # Drifting rates, A about 1.10x B in every run-order pair. Voiding A's first block must + # drop that pair, not shift every A block onto the next B block. + a = [10.0, 10.4, 10.8, 11.2, 11.6] + b = [x / 1.10 for x in a] + v = run({"A": a, "B": b, "C": b}, void_blocks=(1,)) + self.assertEqual(len(v["pair_ratios"]), 4) + self.assertTrue(all(abs(r - 1.10) < 0.01 for r in v["pair_ratios"]), v["pair_ratios"]) + self.assertEqual(v["verdict"], "SUPPORTED") + + def test_block_without_decode_rates_is_void(self): + v = run({"A": 20.0, "B": 18.5, "C": 18.5}, no_rate_blocks=(2,)) + self.assertEqual(v["void"]["B"], 1) + + def test_pod_restart_voids_the_block(self): + v = run({"A": 20.0, "B": 18.5, "C": 18.5}, restarts=(4,)) + self.assertEqual(v["void"]["A"], 1) + self.assertEqual(v["verdict"], "SUPPORTED") + def test_incremental_energy_per_token(self): v = run({"A": 20.0, "B": 18.5, "C": 18.5}) # (9000 J - 100 W x 60 s) / 1280 tokens diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/agent.err b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/agent.err new file mode 100644 index 00000000..7f5a1cbb --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/agent.err @@ -0,0 +1,2 @@ +==> fit: OpenVINO/Qwen3-4B-fp16-ov on CPU (AMX) via ovms, context 40960 x 52 seqs, host 302.0 GiB (pod limit 333Gi), host reserve 50.3 GiB +==> agent: OpenVINO/Qwen3-4B-fp16-ov as 'Qwen3-4B-fp16-ov' on CPU, 16 CPU(s) diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/agent.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/agent.yaml new file mode 100644 index 00000000..b8db7b04 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/agent.yaml @@ -0,0 +1,109 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +# Models and the compiled-model cache live here, so restarts never re-download. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ovms-models + namespace: k3d-gpu-agent +spec: + accessModes: [ReadWriteOnce] + resources: + requests: + storage: 20Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + k3d-gpu.io/agent-fit: "cpu 52x40960" + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + # --pull downloads the model once and writes its graph.pbtxt (device, + # parsers). On later starts the files are already there and only the + # graph is rewritten, so a device change takes effect with no download. + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + - --max_num_seqs=52 + - --cache_size=292 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + # No liveness probe: compiling a model for a GPU takes minutes. + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: "16" + memory: 333Gi + limits: + memory: 333Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + persistentVolumeClaim: + claimName: ovms-models +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/commit.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/commit.txt new file mode 100644 index 00000000..8684c81d --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/commit.txt @@ -0,0 +1 @@ +c30f27fd2a7fb9bf262e037b431719e20ff392c1 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/cpus.txt new file mode 100644 index 00000000..8239c7ca --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/cpus.txt @@ -0,0 +1 @@ +C Cpus_allowed_list: 0-7,48-55 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/eat.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/eat.yaml new file mode 100644 index 00000000..8cecbbb2 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/eat.yaml @@ -0,0 +1,253 @@ +--- +# Source: vllm/templates/secret.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: Secret +metadata: + name: vllm-qwen-3-4b-cpu-secret + labels: + app: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +type: Opaque +data: +--- +# Source: vllm/templates/configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +data: + http_proxy: "" + https_proxy: "" + no_proxy: "" + TORCHINDUCTOR_CACHE_DIR: "/tmp" + NUMBA_CACHE_DIR: "/tmp" + HF_HOME: "/data" + OUTLINES_CACHE_DIR: "/tmp/.cache/outlines" + VLLM_NO_USAGE_STATS: "1" + DO_NOT_TRACK: "1" + HF_HUB_DISABLE_XET: "1" + TORCH_INDUCTOR_CACHE_DIR: "/tmp/torchinductor_cache" + TRITON_CACHE_DIR: "/tmp/.triton" + USER: "vllm" + VLLM_ALLOW_LONG_MAX_MODEL_LEN: "1" + VLLM_CPU_KVCACHE_SPACE: "6" + VLLM_CPU_NUM_OF_RESERVED_CPU: "0" + VLLM_CPU_SGL_KERNEL: "1" + VLLM_ENGINE_ITERATION_TIMEOUT_S: "120" + VLLM_RPC_TIMEOUT: "100000" +--- +# Source: vllm/templates/pvc.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: vllm-qwen-3-4b-cpu-pvc + namespace: default +spec: + accessModes: + - ReadWriteOnce + storageClassName: local-path + resources: + requests: + storage: 250Gi # Adjust this according to model storage size +--- +# Source: vllm/templates/service.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +# Source: vllm/templates/deployment.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: "0.5" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: "performance" + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + # + # serviceAccountName: default + securityContext: + null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + - secretRef: + name: vllm-qwen-3-4b-cpu-secret + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: "vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1" + imagePullPolicy: IfNotPresent + # command: + # - /bin/bash + # - -c + # - | + # python3 -m vllm.entrypoints.openai.api_server --dtype bfloat16 --model Qwen/Qwen3-4B --port 2080 --tensor-parallel-size 1 --block-size 128 --max-model-len 8192 --disable-log-requests + args: + - "--block-size" + - "128" + - "--dtype" + - "bfloat16" + - "--distributed_executor_backend" + - "mp" + - "--enable_chunked_prefill" + - "--enforce-eager" + - "--max-num-batched-tokens" + - "2048" + - "--max-num-seqs" + - "256" + - "--enable-prefix-caching" + # CPU deployment - add parallelism settings + - "--tensor-parallel-size" + - "1" + - "--pipeline-parallel-size" + - "1" + - "--model" + - "Qwen/Qwen3-4B" + - --served-model-name + - "Qwen/Qwen3-4B" + - "--port" + - "2080" + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 98 + httpGet: + path: /health + port: http + initialDelaySeconds: 120 + periodSeconds: 30 + resources: + requests: + cpu: "16" + memory: "22Gi" + limits: + cpu: "16" + memory: "22Gi" + + volumes: + - name: model-volume + persistentVolumeClaim: + claimName: vllm-qwen-3-4b-cpu-pvc + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - "true" + # extra time to finish processing buffered requests on CPU before pod is forcibly terminated + terminationGracePeriodSeconds: 120 +--- +# Source: vllm/templates/apisixroutes.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/chat-template-configmap.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/ingress.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# Please edit the object below. Lines beginning with a '#' will be ignored, +# and an empty file will abort the edit. If an error occurs while saving this file will be +# reopened with the relevant failures. +--- +# Source: vllm/templates/ingress_eks.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/route.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +--- +# Source: vllm/templates/servicemonitor.yaml +# Copyright (C) 2025-2026 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/fit.json b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/fit.json new file mode 100644 index 00000000..e6671b18 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/fit.json @@ -0,0 +1,132 @@ +{ + "arch": "qwen3", + "ctx": 32768, + "degraded": false, + "dram_tok_s": null, + "engine": "vllm", + "explain": [ + "model Qwen/Qwen3-4B: safetensors (qwen3) weights, 7.5 GiB to serve", + " embed 0.7 GiB (lookup table)", + " other 6.8 GiB", + "context cap: 40960 (max_position_embeddings)", + "host RAM: MemTotal 503.3 GiB, MemAvailable 387.9 GiB (others already hold 115.4 GiB)", + "host reserve = max(10% x MemTotal, 4.0 GiB) = 50.3 GiB", + "host budget = 387.9 GiB - 50.3 GiB = 337.6 GiB", + "GPUs:", + " card1 (0000:12:00.0): VRAM 31.9 GiB, in use 16.1 GiB; reserve max(5%, 1.0 GiB) = 1.6 GiB; budget 14.1 GiB; BUSY (others hold >= 50%), not used", + " card2 (0000:48:00.0): VRAM 31.9 GiB, in use 15.4 GiB; reserve max(5%, 1.0 GiB) = 1.6 GiB; budget 14.9 GiB", + " card3 (0000:7c:00.0): VRAM 31.9 GiB, in use 16.1 GiB; reserve max(5%, 1.0 GiB) = 1.6 GiB; budget 14.2 GiB; BUSY (others hold >= 50%), not used", + " card4 (0000:96:00.0): VRAM 31.9 GiB, in use 15.4 GiB; reserve max(5%, 1.0 GiB) = 1.6 GiB; budget 14.9 GiB", + "CPU: Intel(R) Xeon(R) 6741P, AMX; DRAM bandwidth unknown, unknown (no STREAM run cached; SMBIOS needs root)", + "engine vllm: vllm: architecture qwen3 not checked", + " KV cache (2 B per element):", + " full attention: 36 layers x 2 (K, V) x 8 kv heads x 128 head dim x 2 B = 147456 B/token", + "placements, as asked:", + " vllm/cpu: FITS", + " host budget / 1.10 slack 305.9 GiB - weights 7.5 GiB - activations 0.0 GiB - runtime 6.0 GiB = 292.4 GiB for KV", + " KV: 64 seqs x 4608.0 MiB at 32768 tokens = 288.0 GiB", + "k8s: memory request = limit = ceil(301.5 GiB x 1.10) = 332Gi", + "guard rungs (seqs x context): 64x32768, 32x32768, 16x32768, 8x32768, 4x32768, 2x32768, 1x32768, 1x16384, 1x8192, 1x4096", + "engine flags: --max-model-len=32768 --max-num-seqs=64 VLLM_CPU_KVCACHE_SPACE=288" + ], + "fits": true, + "flags": [ + "--max-model-len=32768", + "--max-num-seqs=64", + "VLLM_CPU_KVCACHE_SPACE=288" + ], + "format": "safetensors", + "gpu_bytes": 0, + "gpus": 0, + "guard": { + "calm_samples": 60, + "calm_some_avg60": 5.0, + "cooldown_samples": 12, + "emergency_samples": 3, + "full_avg10": 5.0, + "host_bytes": 323767309312, + "mem_available_floor": 27021677772, + "placement": "cpu", + "rung_kv_bytes": [ + 309237645312, + 154618822656, + 77309411328, + 38654705664, + 19327352832, + 9663676416, + 5368709120, + 3221225472, + 2147483648, + 1073741824 + ], + "rung_memory_limit": [ + "332Gi", + "174Gi", + "95Gi", + "55Gi", + "35Gi", + "25Gi", + "21Gi", + "19Gi", + "18Gi", + "16Gi" + ], + "rungs": [ + [ + 64, + 32768 + ], + [ + 32, + 32768 + ], + [ + 16, + 32768 + ], + [ + 8, + 32768 + ], + [ + 4, + 32768 + ], + [ + 2, + 32768 + ], + [ + 1, + 32768 + ], + [ + 1, + 16384 + ], + [ + 1, + 8192 + ], + [ + 1, + 4096 + ] + ], + "some_avg10": 20.0 + }, + "host_bytes": 323767309312, + "host_reserve": 54043355545, + "k8s": { + "memory_limit": "332Gi", + "memory_request": "332Gi" + }, + "kv_bytes": 309237645312, + "model": "Qwen/Qwen3-4B", + "note": "vllm: architecture qwen3 not checked", + "placement": "cpu", + "schema": "k3d-gpu.fit/v1", + "seqs": 64, + "summary": "fit: Qwen/Qwen3-4B on CPU (AMX) via vllm, context 32768 x 64 seqs, host 301.5 GiB (pod limit 332Gi), host reserve 50.3 GiB", + "tp": 1 +} diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/image.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/image.txt new file mode 100644 index 00000000..77277c7a --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/image.txt @@ -0,0 +1 @@ +vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 docker.io/vllm/vllm-openai-cpu@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 ["--block-size","128","--dtype","bfloat16","--distributed_executor_backend","mp","--enable_chunked_prefill","--max-num-batched-tokens","2048","--max-num-seqs","256","--enable-prefix-caching","--tensor-parallel-size","1","--pipeline-parallel-size","1","--model","/data/Qwen3-4B","--served-model-name","Qwen/Qwen3-4B","--port","2080","--max-model-len","32768"] diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/node-cpus.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/node-cpus.txt new file mode 100644 index 00000000..7c5ae641 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/node-cpus.txt @@ -0,0 +1 @@ +node cpuset 0-7,48-55 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/node-image.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/node-image.txt new file mode 100644 index 00000000..33553567 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/node-image.txt @@ -0,0 +1 @@ +cryptoandcoffee/k3d-gpu:0.1.61 sha256:8cd264aa68c77681d7fa474693944de0db8d55de5881253e4029bf72a67e175c diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/ovms.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/ovms.yaml new file mode 100644 index 00000000..84be2f14 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/ovms.yaml @@ -0,0 +1,94 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: CPU + k3d-gpu.io/agent-fit: cpu 52x40960 + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + initContainers: + - name: pull + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3-4B-fp16-ov + - --model_repository_path=/models + - --model_name=Qwen3-4B-fp16-ov + - --task=text_generation + - --target_device=CPU + - --tool_parser=hermes3 + - --reasoning_parser=qwen3 + - --max_num_seqs=52 + - --cache_size=292 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3-4B-fp16-ov + - --model_name=Qwen3-4B-fp16-ov + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: '16' + memory: 333Gi + limits: + memory: 333Gi + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + hostPath: + path: /var/apb-models + type: Directory +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/values.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/values.yaml new file mode 100644 index 00000000..c1dc074b --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/values.yaml @@ -0,0 +1,437 @@ +accelDevice: '' +cpu_balloon_annotation: performance +resources: + requests: + cpu: '{{ .Values.cpu }}' + memory: '{{ .Values.memory }}' +block_size: 128 +max_num_seqs: 256 +max_seq_len_to_capture: 2048 +d_type: bfloat16 +max_model_len: 8192 +image: + repository: vllm/vllm-openai-cpu + tag: v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + pullPolicy: IfNotPresent +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' +VLLM_CPU_SGL_KERNEL: '1' +VLLM_NO_USAGE_STATS: 1 +DO_NOT_TRACK: 1 +LLM_MODEL_ID: '' +modelConfigs: + meta-llama/Llama-3.1-8B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + HF_HUB_DISABLE_XET: '1' + VLLM_CPU_SGL_KERNEL: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + speculativeConfig: '{"method":"draft_model","model":"meta-llama/Llama-3.2-1B-Instruct","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + meta-llama/Llama-3.2-3B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + deepseek-ai/DeepSeek-R1-Distill-Qwen-32B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + deepseek-ai/DeepSeek-R1-Distill-Llama-8B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-1.7B: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - hermes + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-4B-Instruct-2507: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - hermes + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen2.5-Coder-7B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_coder + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-Coder-30B-A3B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '2' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --trust-remote-code + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + speculativeConfig: '{"method":"draft_model","model":"Qwen/Qwen3-0.6B","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen2.5-Coder-14B-Instruct: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCHDYNAMO_DISABLE: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + speculativeConfig: '{"method":"draft_model","model":"Qwen/Qwen2.5-Coder-0.5B-Instruct","num_speculative_tokens":5}' + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + HF_HUB_OFFLINE: '1' + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - llama3_json + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + Qwen/Qwen3-30B-A3B-Instruct-2507: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + HF_HUB_DISABLE_XET: '1' + VLLM_CPU_SGL_KERNEL: '1' + TRITON_CACHE_DIR: /tmp/.triton + TORCHINDUCTOR_CACHE_DIR: /tmp/.torch_compile + XDG_CACHE_HOME: /tmp/.cache + HF_HOME: /tmp/.cache/huggingface + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - qwen3_xml + - --chat-template + - /workspace/vllm/examples/tool_chat_template_qwen3coder.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + google/gemma-4-26B-A4B-it: + configMapValues: + TRITON_CACHE_DIR: /tmp/.triton + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --enable-prefix-caching + - --enable-auto-tool-choice + - --tool-call-parser + - gemma4 + - --chat-template + - /workspace/vllm/examples/tool_chat_template_gemma4.jinja + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' + openai/whisper-small: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCHDYNAMO_DISABLE: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + XDG_CACHE_HOME: /tmp/.cache + HF_HOME: /tmp/huggingface + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --dtype + - float32 + - --enforce-eager + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' +defaultModelConfigs: + configMapValues: + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_RPC_TIMEOUT: '100000' + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + extraCmdArgs: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + tensor_parallel_size: '{{ .Values.tensor_parallel_size }}' + pipeline_parallel_size: '{{ .Values.pipeline_parallel_size }}' +memory: 16Gi +cpu: '8' diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-c.err b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-c.err new file mode 100644 index 00000000..e69de29b diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-c.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-c.yaml new file mode 100644 index 00000000..bdc7465e --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-c.yaml @@ -0,0 +1,178 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-c-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +data: + http_proxy: '' + https_proxy: '' + no_proxy: '' + TORCHINDUCTOR_CACHE_DIR: /tmp + NUMBA_CACHE_DIR: /tmp + HF_HOME: /data + OUTLINES_CACHE_DIR: /tmp/.cache/outlines + VLLM_NO_USAGE_STATS: '1' + DO_NOT_TRACK: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_RPC_TIMEOUT: '100000' + HF_HUB_OFFLINE: '1' +--- +apiVersion: v1 +kind: Service +metadata: + name: vllm-c-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + h7x-arm: c +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-c + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + h7x-arm: c + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: performance + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + h7x-arm: c + spec: + securityContext: null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + imagePullPolicy: IfNotPresent + args: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --tensor-parallel-size + - '1' + - --pipeline-parallel-size + - '1' + - --model + - /data/Qwen3-4B + - --served-model-name + - Qwen/Qwen3-4B + - --port + - '2080' + - --max-model-len + - '32768' + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 200 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: '16' + memory: 22Gi + limits: + cpu: '16' + memory: 22Gi + env: + - name: VLLM_CACHE_ROOT + value: /tmp/vllm + volumes: + - name: model-volume + hostPath: + path: /var/apb-models + type: Directory + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' + terminationGracePeriodSeconds: 120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-mem.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-mem.txt new file mode 100644 index 00000000..a5abd008 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm-mem.txt @@ -0,0 +1 @@ +vLLM memory limit 22Gi from k3d-gpu fit diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm.yaml b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm.yaml new file mode 100644 index 00000000..41160636 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/h7x-20261021-065424/vllm.yaml @@ -0,0 +1,173 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: vllm-qwen-3-4b-cpu-config + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +data: + http_proxy: '' + https_proxy: '' + no_proxy: '' + TORCHINDUCTOR_CACHE_DIR: /tmp + NUMBA_CACHE_DIR: /tmp + HF_HOME: /data + OUTLINES_CACHE_DIR: /tmp/.cache/outlines + VLLM_NO_USAGE_STATS: '1' + DO_NOT_TRACK: '1' + HF_HUB_DISABLE_XET: '1' + TORCH_INDUCTOR_CACHE_DIR: /tmp/torchinductor_cache + TRITON_CACHE_DIR: /tmp/.triton + USER: vllm + VLLM_ALLOW_LONG_MAX_MODEL_LEN: '1' + VLLM_CPU_KVCACHE_SPACE: '6' + VLLM_CPU_NUM_OF_RESERVED_CPU: '0' + VLLM_CPU_SGL_KERNEL: '1' + VLLM_ENGINE_ITERATION_TIMEOUT_S: '120' + VLLM_RPC_TIMEOUT: '100000' + HF_HUB_OFFLINE: '1' +--- +apiVersion: v1 +kind: Service +metadata: + name: vllm-qwen-3-4b-cpu-service + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 2080 + protocol: TCP + name: vllm + selector: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-qwen-3-4b-cpu + labels: + helm.sh/chart: vllm-0-latest + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + app.kubernetes.io/version: '0.5' + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + template: + metadata: + annotations: + balloon.balloons.resource-policy.nri.io: performance + labels: + app.kubernetes.io/name: vllm + app.kubernetes.io/instance: vllm-qwen-3-4b-cpu + name: vllm + spec: + securityContext: null + containers: + - name: vllm + envFrom: + - configMapRef: + name: vllm-qwen-3-4b-cpu-config + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_NICE + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + image: vllm/vllm-openai-cpu:v0.24.0@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1 + imagePullPolicy: IfNotPresent + args: + - --block-size + - '128' + - --dtype + - bfloat16 + - --distributed_executor_backend + - mp + - --enable_chunked_prefill + - --enforce-eager + - --max-num-batched-tokens + - '2048' + - --max-num-seqs + - '256' + - --enable-prefix-caching + - --tensor-parallel-size + - '1' + - --pipeline-parallel-size + - '1' + - --model + - /data/Qwen3-4B + - --served-model-name + - Qwen/Qwen3-4B + - --port + - '2080' + - --max-model-len + - '32768' + volumeMounts: + - mountPath: /data + name: model-volume + - mountPath: /dev/shm + name: shm + - mountPath: /tmp + name: tmp + - mountPath: /root/.cache/vllm + name: vllm-cache + ports: + - name: http + containerPort: 2080 + protocol: TCP + readinessProbe: + failureThreshold: 200 + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + resources: + requests: + cpu: '16' + memory: 22Gi + limits: + cpu: '16' + memory: 22Gi + volumes: + - name: model-volume + hostPath: + path: /var/apb-models + type: Directory + - name: shm + emptyDir: + medium: Memory + sizeLimit: 1Gi + - name: tmp + emptyDir: {} + - name: vllm-cache + emptyDir: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ei-inference-eligible + operator: In + values: + - 'true' + terminationGracePeriodSeconds: 120 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/post.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/post.txt new file mode 100644 index 00000000..c3d80974 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/post.txt @@ -0,0 +1,16 @@ +2026-10-21T06:58:21Z + 06:58:21 up 35 days, 8:12, 13 users, load average: 4.22, 3.40, 3.64 +%CPU PID USER COMMAND +45.5 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +42.0 3899938 root sglang::schedul +39.7 3900351 root sglang::schedul +24.4 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3416790104 220296260 94% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/pre.txt b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/pre.txt new file mode 100644 index 00000000..139be8f8 --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/pre.txt @@ -0,0 +1,16 @@ +2026-10-21T06:54:24Z + 06:54:24 up 35 days, 8:08, 16 users, load average: 3.70, 3.41, 3.76 +%CPU PID USER COMMAND +45.5 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +42.0 3899938 root sglang::schedul +39.7 3900351 root sglang::schedul +24.4 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3416782100 220304264 94% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/rc b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/rc new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/rc @@ -0,0 +1 @@ +0 diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/serving.jsonl b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/serving.jsonl new file mode 100644 index 00000000..b54492aa --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/serving.jsonl @@ -0,0 +1,24 @@ +{"ts": 1792565674.99, "seconds": 10.0, "load1": 3.44, "cpu": {"qwen38-b-hr": 1.01, "qwen38-a-hr": 1.168, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.058, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.029, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.477, "aiperf_procs": 0} +{"ts": 1792565685.023, "seconds": 10.033, "load1": 3.38, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.164, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.019, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.015, "xpumd": 0.003}, "serving_cpu": 2.444, "aiperf_procs": 0} +{"ts": 1792565695.057, "seconds": 10.034, "load1": 2.93, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.172, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 2.389, "aiperf_procs": 0} +{"ts": 1792565705.087, "seconds": 10.03, "load1": 2.85, "cpu": {"qwen38-b-hr": 0.976, "qwen38-a-hr": 1.124, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.173, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.362, "aiperf_procs": 0} +{"ts": 1792565715.118, "seconds": 10.032, "load1": 2.95, "cpu": {"qwen38-b-hr": 0.956, "qwen38-a-hr": 1.122, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.175, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.341, "aiperf_procs": 0} +{"ts": 1792565725.149, "seconds": 10.031, "load1": 2.72, "cpu": {"qwen38-b-hr": 0.974, "qwen38-a-hr": 1.11, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.163, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.021, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.349, "aiperf_procs": 0} +{"ts": 1792565735.248, "seconds": 10.099, "load1": 2.38, "cpu": {"qwen38-b-hr": 0.942, "qwen38-a-hr": 1.09, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.164, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.017, "xpumd": 0.002}, "serving_cpu": 2.29, "aiperf_procs": 0} +{"ts": 1792565745.278, "seconds": 10.03, "load1": 2.32, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.072, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.333, "aiperf_procs": 0} +{"ts": 1792565755.309, "seconds": 10.031, "load1": 2.49, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.077, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.322, "aiperf_procs": 0} +{"ts": 1792565765.339, "seconds": 10.03, "load1": 2.35, "cpu": {"qwen38-b-hr": 0.978, "qwen38-a-hr": 1.091, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.323, "aiperf_procs": 0} +{"ts": 1792565775.371, "seconds": 10.032, "load1": 2.37, "cpu": {"qwen38-b-hr": 0.997, "qwen38-a-hr": 1.159, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.417, "aiperf_procs": 0} +{"ts": 1792565785.402, "seconds": 10.031, "load1": 2.32, "cpu": {"qwen38-b-hr": 1.009, "qwen38-a-hr": 1.153, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.032, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.42, "aiperf_procs": 0} +{"ts": 1792565795.522, "seconds": 10.121, "load1": 3.63, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.168, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.035, "prometheus": 0.011, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.428, "aiperf_procs": 0} +{"ts": 1792565805.554, "seconds": 10.032, "load1": 3.46, "cpu": {"qwen38-b-hr": 0.989, "qwen38-a-hr": 1.15, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.395, "aiperf_procs": 0} +{"ts": 1792565815.587, "seconds": 10.033, "load1": 3.47, "cpu": {"qwen38-b-hr": 1.004, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.004, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.003}, "serving_cpu": 2.404, "aiperf_procs": 0} +{"ts": 1792565825.618, "seconds": 10.031, "load1": 3.16, "cpu": {"qwen38-b-hr": 0.999, "qwen38-a-hr": 1.148, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.4, "aiperf_procs": 0} +{"ts": 1792565835.649, "seconds": 10.032, "load1": 2.91, "cpu": {"qwen38-b-hr": 1.001, "qwen38-a-hr": 1.134, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792565845.681, "seconds": 10.031, "load1": 3.08, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.138, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.07, "xpumd": 0.002}, "serving_cpu": 2.452, "aiperf_procs": 0} +{"ts": 1792565855.79, "seconds": 10.11, "load1": 2.99, "cpu": {"qwen38-b-hr": 0.983, "qwen38-a-hr": 1.128, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.369, "aiperf_procs": 0} +{"ts": 1792565865.821, "seconds": 10.031, "load1": 3.06, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.133, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.02, "xpumd": 0.002}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792565875.854, "seconds": 10.033, "load1": 3.29, "cpu": {"qwen38-b-hr": 1.007, "qwen38-a-hr": 1.162, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.42, "aiperf_procs": 0} +{"ts": 1792565885.884, "seconds": 10.03, "load1": 4.19, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.135, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.177, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.012, "xpumd": 0.003}, "serving_cpu": 2.398, "aiperf_procs": 0} +{"ts": 1792565895.925, "seconds": 10.041, "load1": 4.24, "cpu": {"qwen38-b-hr": 0.99, "qwen38-a-hr": 1.144, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.022, "xpumd": 0.002}, "serving_cpu": 2.412, "aiperf_procs": 0} +{"ts": 1792565905.954, "seconds": 10.03, "load1": 4.28, "cpu": {"qwen38-b-hr": 1.012, "qwen38-a-hr": 1.159, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.058, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.003}, "serving_cpu": 2.468, "aiperf_procs": 0} diff --git a/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/wait_s b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/wait_s new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/xhost/results/2026-10-21/H7x-smokes/smoke6/wait_s @@ -0,0 +1 @@ +0 From 8caef3186efe3f650009ae6a2a7d58f5ccb4c7fe Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:24:27 -0700 Subject: [PATCH 14/85] bench_test: an engine-death stream and a cut stream must be recorded as errors H54a hold 2's B1g sample 2 stopped at 252 of 256 tokens when vLLM's engine died: the stream carried an error chunk and [DONE] but no finish_reason and no usage, and llm_load.py recorded it ok. The stub gains --die-at (that stream) and --cut-at (a connection closed mid-stream); both new checks fail against the current llm_load.py. --- tests/bench_test.sh | 28 ++++++++++++++++++++++++++++ tests/openai_stub.py | 19 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/tests/bench_test.sh b/tests/bench_test.sh index c9e1c61d..a5eb2d4d 100755 --- a/tests/bench_test.sh +++ b/tests/bench_test.sh @@ -141,6 +141,30 @@ s = j["phases"][0]["samples"][0] assert s["ok"] and s["output_tokens"] is None and s["tokens_per_s"] is None and s["ttft_s"] and s["chunks"] == 5, s EOF } +# H54a hold 2, B1g sample 2: vLLM's engine died at 252 of 256 tokens; the stream carried an +# error chunk and [DONE] but no finish_reason and no usage, and was recorded ok. +load_engine_death() { + "${LOAD[@]}" --base-url "http://127.0.0.1:${STUB_PORT}/v1" --model stub --requests 1 --max-tokens 256 --warmup 0 --out "${LJ}" + [ $? -eq 1 ] || return 1 + pyassert "${LJ}" <<'EOF' +ph = j["phases"][0] +s = ph["samples"][0] +assert not s["ok"] and "error in stream" in s["error"] and s["content_chunks"] == 252 and s["chunks"] == 254, s +assert s["finish_reason"] is None and s["output_tokens"] is None and s["decode_tokens_per_s"] is None, s +assert ph["ok"] == 0 and ph["errors"] == 1 and ph["stats"]["latency_s"]["n"] == 0, ph +EOF +} +# A server killed mid-stream: content, then the connection closes with no finish_reason or [DONE]. +load_cut_stream() { + "${LOAD[@]}" --base-url "http://127.0.0.1:${STUB_PORT}/v1" --model stub --requests 1 --max-tokens 256 --warmup 0 --out "${LJ}" + [ $? -eq 1 ] || return 1 + pyassert "${LJ}" <<'EOF' +ph = j["phases"][0] +s = ph["samples"][0] +assert not s["ok"] and "without a finish_reason" in s["error"] and s["content_chunks"] == 100, s +assert ph["ok"] == 0 and ph["errors"] == 1, ph +EOF +} load_unique_prompts() { python3 -B - "${ROOT}/bench" <<'EOF' @@ -180,6 +204,10 @@ check "llm_load: max_tokens is sent" load_max_tokens check "llm_load: wrong path is an error and a non-zero exit" load_wrong_path stub --tokens 4 --no-usage --close check "llm_load: no usage chunk leaves tokens null; non-chunked stream parses" load_no_usage +stub --tokens 256 --itl 0 --die-at 252 +check "llm_load: a stream ended by engine death (error chunk, no finish_reason) is an error" load_engine_death +stub --tokens 256 --itl 0 --cut-at 100 --close +check "llm_load: a stream cut off without a finish_reason is an error" load_cut_stream # ---- noisy.sh ------------------------------------------------------------------- diff --git a/tests/openai_stub.py b/tests/openai_stub.py index 4faf53cd..0eb05060 100644 --- a/tests/openai_stub.py +++ b/tests/openai_stub.py @@ -10,6 +10,10 @@ Prints "listening " once ready. --no-usage drops the usage chunk; --close sends the stream without chunked encoding and closes the connection. +--die-at N sends N tokens, then an error chunk and [DONE] with no finish_reason, +the way vLLM's server ends a stream when its engine dies mid-decode. +--cut-at N sends N tokens and closes the connection: no finish_reason, no usage, +no [DONE] (a server process that is killed mid-stream; use with --close). """ import argparse @@ -53,6 +57,19 @@ def do_POST(self): base = {"object": "chat.completion.chunk", "created": int(time.time()), "model": req.get("model")} time.sleep(opts.ttft) self.send_chunk(json.dumps({**base, "choices": [{"index": 0, "delta": {"role": "assistant", "content": None}, "finish_reason": None}]})) + stop = opts.die_at or opts.cut_at + if stop: + for i in range(min(n, stop)): + self.send_chunk(json.dumps({**base, "choices": [{"index": 0, "delta": {"content": f"tok{i} "}, "finish_reason": None}]})) + if opts.cut_at: + self.close_connection = True + return + # vLLM's create_streaming_error_response body, the same object its HTTP 500 carries + self.send_chunk(json.dumps({"error": {"message": "EngineCore encountered an issue.", "type": "InternalServerError", "param": None, "code": 500}})) + self.send_chunk("[DONE]") + if not opts.close: + self.wfile.write(b"0\r\n\r\n") + return for i in range(n): if i: time.sleep(opts.itl) @@ -78,6 +95,8 @@ def main(): p.add_argument("--close", action="store_true") p.add_argument("--reasoning", type=int, default=0, help="first N tokens in delta.reasoning (Ollama v0.40.5 thinking)") p.add_argument("--eos-at", type=int, default=0, help="stop after N tokens whatever max_tokens/ignore_eos ask") + p.add_argument("--die-at", type=int, default=0, help="send N tokens, then an error chunk and [DONE] (engine death)") + p.add_argument("--cut-at", type=int, default=0, help="send N tokens, then close the connection (server killed)") p.add_argument("--prefix", default="/v1,/v3", help="API roots served, comma list") opts = p.parse_args() srv = http.server.ThreadingHTTPServer(("127.0.0.1", opts.port), make_handler(opts)) From eb481a15206505e1848d5b2639d89f24c75b2072 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:24:30 -0700 Subject: [PATCH 15/85] llm_load: a stream with an error object or no finish_reason is an error A request is ok only when its stream carried content, no error object and a finish_reason. vLLM ends a stream with an error chunk and [DONE] when its engine dies mid-decode, and a killed server closes the connection with no finish_reason; both were counted as short completions. Every sample now records finish_reason. tests/fake_ovms.py sets finish_reason on its last token chunk, as OVMS does (openai_completions.cpp, mapFinishReason). --- bench/llm_load.py | 22 +++++++++++++++++++++- tests/fake_ovms.py | 7 ++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/bench/llm_load.py b/bench/llm_load.py index 667f5a6d..a58dd9f8 100755 --- a/bench/llm_load.py +++ b/bench/llm_load.py @@ -19,6 +19,10 @@ when the server sends no usage tokens_per_s output_tokens / latency_s decode_tokens_per_s (output_tokens - 1) / (latency_s - ttft_s) + finish_reason the last non-null choices[].finish_reason +A request is ok only when its stream carried content, no error object and a +finish_reason: a stream the server ends early (vLLM sends an error chunk and +[DONE] when its engine dies mid-decode) is an error, not a short completion. Each concurrency level is one phase: --requests requests, at most --concurrency in flight. The JSON has every sample plus median/p90/min/max per metric. """ @@ -86,7 +90,8 @@ def one_request(args, idx): if args.api_key: headers["Authorization"] = f"Bearer {args.api_key}" conn_cls = http.client.HTTPSConnection if scheme == "https" else http.client.HTTPConnection - sample = {"index": idx, "ok": False, "error": None, "chunks": 0, "content_chunks": 0, "text_chars": 0} + sample = {"index": idx, "ok": False, "error": None, "chunks": 0, "content_chunks": 0, "text_chars": 0, + "finish_reason": None} for m in METRICS: sample[m] = None t0 = time.perf_counter() @@ -98,6 +103,8 @@ def one_request(args, idx): sample["error"] = f"HTTP {resp.status}: {resp.read(500).decode('utf-8', 'replace')}" return sample usage = None + finish = None + stream_error = None done = False while not done: raw = resp.readline() @@ -117,7 +124,13 @@ def one_request(args, idx): sample["chunks"] += 1 if chunk.get("usage"): usage = chunk["usage"] + if "error" in chunk or chunk.get("object") == "error": + err = chunk.get("error", chunk) + msg = err.get("message") if isinstance(err, dict) else err + stream_error = str(msg or err)[:500] for choice in chunk.get("choices") or []: + if choice.get("finish_reason"): + finish = choice["finish_reason"] delta = choice.get("delta") or {} # reasoning_content: vLLM/OVMS; reasoning: Ollama's OpenAI layer # (openai/openai.go, v0.40.5), which streams Qwen3 thinking there. @@ -131,9 +144,16 @@ def one_request(args, idx): sample["latency_s"] = time.perf_counter() - t0 resp.read() # the rest of the body (chunked terminator), so close() is clean conn.close() + sample["finish_reason"] = finish + if stream_error is not None: + sample["error"] = f"error in stream: {stream_error}" + return sample if sample["ttft_s"] is None: sample["error"] = "stream ended without any content" return sample + if finish is None: + sample["error"] = "stream ended without a finish_reason" + return sample if usage and isinstance(usage.get("completion_tokens"), int): n = usage["completion_tokens"] sample["output_tokens"] = n diff --git a/tests/fake_ovms.py b/tests/fake_ovms.py index e0c351d7..8206ec11 100755 --- a/tests/fake_ovms.py +++ b/tests/fake_ovms.py @@ -65,10 +65,11 @@ def do_POST(self): def send(obj): self.wfile.write(b"data: " + json.dumps(obj).encode() + b"\n\n") self.wfile.flush() - send({"choices": [{"delta": {"role": "assistant"}}]}) - for _ in range(n): + send({"choices": [{"delta": {"role": "assistant"}, "finish_reason": None}]}) + for i in range(n): time.sleep(self.delay) - send({"choices": [{"delta": {"content": "tok "}}]}) + # OVMS sets finish_reason ("length" at max_tokens) on the last token's chunk + send({"choices": [{"delta": {"content": "tok "}, "finish_reason": "length" if i == n - 1 else None}]}) send({"choices": [], "usage": {"prompt_tokens": 5, "completion_tokens": n}}) self.wfile.write(b"data: [DONE]\n\n") From 47446a7f0fe1899bc88accbaff1e0f87e6aeee20 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 21 Oct 2026 14:40:46 -0700 Subject: [PATCH 16/85] ledger(H57dp, H57de): pre-register the unpinned llama.cpp arm on the i9-13900T Follow-up to the H57d run (#194): strictly pinned llama.cpp threads slowed 2.3-2.7x on the busy host. Two holds (H57d's remaining cap): Ld-mtp-u vs Ld-mtp (H57dp) and vs Od (H57de). Ported from #201, which closed when its base branch was deleted. --- EXPERIMENTS.md | 42 ++++++++++++++++++++++++++++++++++ docs/intel/technical-report.md | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index f983bb1e..638651f4 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -80,6 +80,8 @@ setup too weak to decide). Only `SUPPORTED` backs a claim. | H57da | On an AMX-less client CPU (i9-13900T, the 16 P-core CPUs, AVX2 and VNNI, no AVX-512), with the Gemma 4 26B-A4B QAT family, k3d-gpu's own CPU pick Od (`agent manifest` auto on the P-cores: OVMS 2026.4.1, `OpenVINO/gemma-4-26b-a4b-it-int4-ov`) is the fastest single-stream arm: no other arm passing the quality gate (llama.cpp with Google's QAT Q4_0 GGUF, with or without the QAT MTP drafter) decodes at N=1 5% or more faster. A microbench, not an agent claim. | Written 2026-10-20, before any H57d measurement. N=1 median decode tok/s: Od in [8, 20] (0.5); Ld (llama.cpp Q4_0, 8 threads) in [12, 30] (0.5); Ld/Od in [1.1, 1.8] (0.5); every arm's GSM8K 0-49 score >= 0.80 (0.6). REFUTED (0.55), SUPPORTED (0.25), INCONCLUSIVE (0.2). Not gated: TTFT on a 1,000-token prompt, aggregate tok/s at N=4, package J/token gross and net of idle. | [H57d pre-registration](#h57d-pre-registration-gemma-4-26b-a4b-qat-on-the-amx-less-client-cpu-i9-13900t-2026-10-20): H54's measurement protocol per arm (`bench/llm_load.py`, 256 tokens, greedy, `ignore_eos`; RAPL per phase; GSM8K items 0-49 graded as H54), one arm serving at a time, arm order rotated over 3 performance holds, quality in a 4th, at most 5 holds of at most 45 min. Statistic: R = median N=1 decode of the fastest other gate-passing arm X / Od's, over the pooled requests of the 3 holds, 95% bootstrap CI (H54's). REFUTED: Od fails the quality gate, or CI lower bound >= 1.05 and X faster than Od in each of the 3 holds. SUPPORTED: Od passes the gate and CI upper bound < 1.05. INCONCLUSIVE otherwise, or when Od or every other arm is not delivered, or the load gate fails. Run 2026-10-21 ([H57d run](#h57d-run-i9-13900t-2026-10-21)): Ld-mtp/Od 0.785 (95% CI 0.692-1.561), per hold 0.72, 0.79, 1.44; Od 6.90, Ld 3.50, Ld-mtp 5.41 tok/s pooled N=1; all 50/50 on GSM8K; load matched (1.80 <= 2.0). The strict-pinned llama.cpp arms tracked host load 2.3-2.7x, Od 1.3x. | INCONCLUSIVE | | H57dm | On the same client and model, the CPU Fast Draft rule extends to Gemma 4's MTP drafter: llama.cpp Ld-mtp (Ld plus Google's QAT MTP assistant, converted to Q4_0 GGUF here, `--spec-type draft-mtp`, default draft length) decodes at N=1 at least 1.20x Ld (H34's bar) with the quality gate passed. | Written 2026-10-20, before any H57d measurement. Ld-mtp/Ld in [0.8, 1.3] (0.6): Google's MTP note says the 26B A4B drafter may not pay at batch 1, and llama.cpp's MTP PR saw no MoE gain. REFUTED (0.65), INCONCLUSIVE (0.15), SUPPORTED (0.2). Not gated: the N=4 ratio and the J/token ratio. | As H57da (same holds and records). Statistic: Rm = median N=1 decode Ld-mtp / Ld, pooled, H54's bootstrap CI. SUPPORTED: Rm >= 1.20, CI lower bound > 1.0, Ld-mtp faster in each of the 3 holds, and Ld-mtp passes the gate. REFUTED: CI upper bound < 1.20, or Ld-mtp fails the gate. INCONCLUSIVE otherwise, or when either arm is not delivered or the load gate fails. Run 2026-10-21 ([H57d run](#h57d-run-i9-13900t-2026-10-21)): Ld-mtp/Ld 1.548 (95% CI 1.057-3.017), faster in each hold (1.47, 1.58, 1.52), 50/50 quality. Scope: llama.cpp b11749, default draft length 3, i9-13900T P-cores, single stream, busy shared host. | SUPPORTED | | H57db | Inside EAT's banking flow (B24) with Gemma 4 26B-A4B QAT on the i9-13900T, k3d-gpu auto on the P-cores delivers far more tasks within budget than EAT stock CPU (vLLM CPU bf16 on the QAT bf16 weights, `xeon-values.yaml` entry `cpu-gemma4-26b-a4b`), interleaved pairs under rule L3. | Written 2026-10-20: not runnable here as registered (memory), so INCONCLUSIVE (not run) is expected (0.9). | [H57d pre-registration](#h57d-pre-registration-gemma-4-26b-a4b-qat-on-the-amx-less-client-cpu-i9-13900t-2026-10-20), H57db: runs only if the memory gate passes at a hold's start (MemAvailable >= 100 GiB: 51.6 GB of bf16 weights resident plus `VLLM_CPU_KVCACHE_SPACE` 40 GiB), with H50's procedure, rule L3 (PR #157) and at most 1 hold, where fewer than 16 complete pairs read INCONCLUSIVE by L3; otherwise INCONCLUSIVE (not run), with the reading recorded. Not run ([H57d run](#h57d-run-i9-13900t-2026-10-21)): memory gate failed, MemAvailable 42.9 GB at the campaign's start (< 100 GiB). | INCONCLUSIVE | +| H57dp | On the i9-13900T P-cores under the shared host's own load, llama.cpp with Gemma 4 QAT Q4_0 and the QAT MTP drafter decodes faster unpinned (8 threads, no `-C`/`--cpu-strict`) than strictly pinned one thread per physical P-core: N=1 ratio >= 1.10. | Written 2026-10-21, after H57d, before any H57dp measurement. SUPPORTED (0.5); Ld-mtp-u/Ld-mtp in [1.0, 1.8] (0.6). | [H57dp pre-registration](#h57dp-pre-registration-llamacpp-thread-pinning-on-the-busy-client-i9-13900t-2026-10-21): 2 holds of at most 75 min, H57d's protocol. SUPPORTED: pooled median ratio >= 1.10, CI lower bound > 1.0, faster in both holds. REFUTED: CI upper bound < 1.10. Else INCONCLUSIVE, or when the load gate fails. | PENDING | +| H57de | H57da with the unpinned llama.cpp arm: no arm decodes Gemma 4 QAT at N=1 5% or more faster than k3d-gpu's OVMS pick Od on the i9-13900T P-cores. | Written 2026-10-21, before any H57de measurement. REFUTED (0.5); Ld-mtp-u/Od in [1.0, 1.6] (0.5). | [H57dp pre-registration](#h57dp-pre-registration-llamacpp-thread-pinning-on-the-busy-client-i9-13900t-2026-10-21): same holds as H57dp. REFUTED: Ld-mtp-u/Od CI lower bound >= 1.05 and faster in both holds. SUPPORTED: CI upper bound < 1.05. Else INCONCLUSIVE, or when the load gate fails. | PENDING | | H52w | A plain `k3d-gpu up` on wildct, a client Raptor Lake host (i7-13700, 8 P-cores + 8 E-cores, AVX2 and AVX-VNNI, no AVX-512, no AMX, one NUMA node), with only the box owner's GPU opt-out (`K3D_GPU_VENDORS=auto,-nvidia,-intel`), detects every CPU engine actually present and advertises each usable one, with nothing missing and nothing phantom; the two NVIDIA cards and the Intel iGPU are named as detected and opted out, and nothing in the cluster mounts or advertises a GPU. | Written 2026-10-20 from an inventory read from sysfs, /proc and PCI sysfs, not from k3d-gpu. Hybrid active, balloons policy running, the P-core test pod inside CPUs 0-15 and the E-core one inside 16-23 (0.8); launcher ISA labels exactly AVXVNNI, VAES, GFNI, SHA, CETIBT, CETSS, and no AVX512 or AMX label from any source (0.85); no NUMA, DSA, IAA, QAT, NPU or Gaudi object (0.9); `up` names nvidia and intel as opted out, no GPU resource, no GPU plugin pod, no pod mounting `/dev/dri` or `/dev/nvidia*` (0.85, given the opt-out fix). SUPPORTED (0.6), REFUTED (0.4). | The table in [the wildct pre-registration](#wildct-pre-registration-client-raptor-lake-i7-13700-2026-10-20): `bench/wildct/h52w.sh` under `bench/wildct/hold.sh` (inventory, `detect` as found, `doctor`, `up`, node object, pod GPU scan, `k3d-gpu test`, `down`, inventory again), the installed release. SUPPORTED: every row matches. REFUTED: any row does not. | PENDING | | H18w | H18's hypothesis on wildct: `k3d-gpu sandbox up` keeps agent sandboxes on the E-cores and inside a default-deny egress policy on k3d (kube-router), while public egress (PyPI) still works. A replication: H18's runner, image source (the release node image) and parts (a), (b), (c). | Written 2026-10-20, before any H18w measurement. Every run meets (a), (b) and (c) (0.8): sandbox `Cpus_allowed_list` inside 16-23; TCP to `100.66.38.121:22` (tailscale CGNAT) and `192.168.8.238:22` (host LAN) refused from the sandbox with the drop-log counter > 0, connected from the control pod; `pip install --user tomli_w==1.2.0` exits 0. | H18's `bench/sandbox_round.sh`, n = 3 runs in one hold, unchanged except as listed in [the wildct pre-registration](#wildct-pre-registration-client-raptor-lake-i7-13700-2026-10-20): cluster `k3dgpu-w-sbx`, the GPU opt-out, rule W3, the release node image, RAPL through rule W4. Outcome table: H18's. | PENDING | | H25w | H25's hypothesis (T part) on wildct: agents that send a byte-identical system prompt and tools to one OVMS CPU server reuse one prefix KV, so an added agent's first chunk arrives at least 4x sooner with the shipping prefix caching on than with `--enable_prefix_caching=false`. A replication: original model, prefix shape, probe, scorer and thresholds. | Written 2026-10-20, before any H25w measurement. Added-agent median TTFT OFF 10 s (7-15), ON 1.0 s (0.6-1.6), ratio 10x (6-14), CI lower bound >= 4x; c/OFF >= 0.8. SUPPORTED 0.8. | H25's `bench/shared-prefix/run.sh` and `probe.py score` (A3 first-chunk TTFT, A4 amendment-27 load rule), ON OFF interleaved 3+3 rounds at `typical`, unchanged except as listed in the wildct pre-registration: cluster `k3dgpu-w-h25`, the GPU opt-out, rule W2 (load on E-cores 20-23 only), W3, W4, new seeds (`SEED_BASE=2560`). | PENDING | @@ -3852,6 +3854,46 @@ weights plus `VLLM_CPU_KVCACHE_SPACE` 40 GiB). No bf16 weights were downloaded a Cleanup: every `k3dgpu-d-*` cluster was deleted at each hold's end; the campaign's model files, images it pulled and its directory on the second disk are removed after this run. +### H57dp pre-registration: llama.cpp thread pinning on the busy client (i9-13900T, 2026-10-21) + +Written 2026-10-21, after the [H57d run](#h57d-run-i9-13900t-2026-10-21) and before any H57dp +measurement. **Why.** In H57d the llama.cpp arms (8 threads, `-C 0x5555 --cpu-strict 1`, one per +physical P-core) slowed 2.3-2.7x between the quiet hold and the busy ones, OVMS (threads free over +the P-core balloon) 1.3x, so H57da did not resolve. Strict pinning lets one foreign process on +one CPU stall every decode step. H57dp tests that mechanism directly and re-asks H57da with the +arm it suggests. + +**Arms** (H57d's files, images, protocol, cluster, balloon and phases unchanged): + +| Arm | Change from H57d | +|---|---| +| Ld-mtp | as H57d (pinned) | +| Ld-mtp-u | Ld-mtp without `-C` and `--cpu-strict` (8 threads, scheduled by the kernel inside the pod's P-core cpuset 0-15); every other flag identical | +| Od | as H57d | + +**Rows.** + +- H57dp: Ld-mtp-u decodes at N=1 at least 1.10x Ld-mtp. Statistic: pooled median ratio with + H54's bootstrap CI. SUPPORTED: ratio >= 1.10, CI lower bound > 1.0, faster in both holds. + REFUTED: CI upper bound < 1.10. Otherwise INCONCLUSIVE. Prediction: SUPPORTED (0.5), ratio in + [1.0, 1.8] (0.6). +- H57de: H57da's question with the unpinned arm: no arm decodes at N=1 5% or more faster than Od. + X = Ld-mtp-u. REFUTED: Ld-mtp-u/Od CI lower bound >= 1.05 and faster in both holds. SUPPORTED: + CI upper bound < 1.05. Otherwise INCONCLUSIVE. Prediction: REFUTED (0.5), Ld-mtp-u/Od in + [1.0, 1.6] (0.5). + +**Quality.** Ld-mtp-u runs the same binary, model files and greedy settings as Ld-mtp; only CPU +affinity changes. It gets no separate GSM8K run: H57d's Ld-mtp record (50/50) stands for it, and +Od's (50/50). This is disclosed in the run section. + +**Load.** H57d's hold-start rule (`load1` <= 24) and load gate (spread of foreign P-core load +<= max(2.0, 25%)). No phase is voided on load; an unmatched load reads INCONCLUSIVE. + +**Holds.** The 2 holds left of H57d's 6-hold cap (H57db's unused one and H57da/H57dm's unused +spare), each at most 75 min under the host lock, orders (Ld-mtp-u, Od, Ld-mtp) and (Ld-mtp, +Ld-mtp-u, Od). A failed hold counts. The runner change (an `Ld-mtp-u` render and a two-hold +scorer) lands in a dated amendment with tests before the first hold. + ### Wildct pre-registration: client Raptor Lake (i7-13700, 2026-10-20) Written 2026-10-20, before any H52w, H18w, H25w, H28w, H34w or H57w measurement on this host. diff --git a/docs/intel/technical-report.md b/docs/intel/technical-report.md index 7492fe9a..7f237dc0 100644 --- a/docs/intel/technical-report.md +++ b/docs/intel/technical-report.md @@ -11,7 +11,7 @@ This report covers what was measured, and how. Every result but H52, H25x, H27x, - Seventeen hypotheses are SUPPORTED. Sixteen are scoped to that host; H25x is H25 replicated on the Xeon 6741P. H57dm (the Gemma 4 QAT MTP drafter speeds llama.cpp decode on the P-cores) is the newest. - Fourteen are REFUTED. Six of them changed shipped defaults. - 23 are INCONCLUSIVE, mostly because the shared host throttles or its load was unmatched. H54a and H54d (Gemma 4 26B-A4B QAT on the Xeon 6741P) are INCONCLUSIVE because EAT's stock vLLM CPU arm stalled in both of H54a's holds, so no arm could be scored against it. H57da (k3d-gpu's OVMS pick vs llama.cpp for Gemma 4 QAT on the i9-13900T) did not resolve: the strictly pinned llama.cpp arms tracked host load; H57db did not run (memory). -- 20 are PENDING: the Xeon 6741P rows H50, H50o, H51, H52b, H53, H54q, H54b, H54c and the zero-touch thesis row H58, the cross-host replication H28x, H55 (SLO-gated admission of an E-core neighbour on the i9-13900T), H56 (two holds at once in cpuset slices of the Xeon 6741P), and the second client host's (wildct, i7-13700) rows H52w, H18w, H25w, H28w, H34w, H57wa, H57wm and H57wb, pre-registered and not yet run. H52, the first row run on that host (a Xeon 6741P with four Arc Pro B70s), is REFUTED. H27x, H27 re-run on the Xeon (AMX), is REFUTED as on the i9. H34x, H34 re-run there, is REFUTED: the CPU Fast Draft that sped up the i9 slowed decode on the Xeon. +- 22 are PENDING: the i9-13900T thread-pinning follow-ups H57dp and H57de, the Xeon 6741P rows H50, H50o, H51, H52b, H53, H54q, H54b, H54c and the zero-touch thesis row H58, the cross-host replication H28x, H55 (SLO-gated admission of an E-core neighbour on the i9-13900T), H56 (two holds at once in cpuset slices of the Xeon 6741P), and the second client host's (wildct, i7-13700) rows H52w, H18w, H25w, H28w, H34w, H57wa, H57wm and H57wb, pre-registered and not yet run. H52, the first row run on that host (a Xeon 6741P with four Arc Pro B70s), is REFUTED. H27x, H27 re-run on the Xeon (AMX), is REFUTED as on the i9. H34x, H34 re-run there, is REFUTED: the CPU Fast Draft that sped up the i9 slowed decode on the Xeon. - Every other Intel family is detected and configured in fixture tests only. None has a measurement. No world-first, superlative or priority claim is made; [docs/provenance.md](../provenance.md) supports none. From 80c18be56de95695e18736619beb29b39eaf36c7 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:26:27 -0700 Subject: [PATCH 17/85] ledger(H57dp): amendment R1, the Ld-mtp-u render, the two-hold scorer and an affinity check The runner the H57dp pre-registration asks for before its first hold. h57d.py gains the Ld-mtp-u arm (Ld-mtp without -C/--cpu-strict, every other flag unchanged), the H57dp hold orders behind 'h57d.py order ROW HOLD', and 'h57d.py score-p' for H57dp and H57de over the two holds. hold.sh takes its default order from the row, so H57d and H57w keep theirs, and refuses an unregistered H57dp hold or mode before taking the lock. The amendment adds one INCONCLUSIVE condition: each server's recorded thread affinity must show the treatment (Ld-mtp's single-CPU threads on CPUs 0,2..14 as in every H57d record, none for Ld-mtp-u). Flag defaults were read from llama.cpp b11749's source. Re-scoring the committed H57d records still reproduces verdict.json byte for byte; a test now covers it. --- EXPERIMENTS.md | 72 ++++++++++ bench/h57d/h57d.py | 149 ++++++++++++++++++--- bench/h57d/hold.sh | 22 ++-- bench/h57d/test_h57d.py | 282 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 494 insertions(+), 31 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index 638651f4..ca8b07d2 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -3894,6 +3894,78 @@ spare), each at most 75 min under the host lock, orders (Ld-mtp-u, Od, Ld-mtp) a Ld-mtp-u, Od). A failed hold counts. The runner change (an `Ld-mtp-u` render and a two-hold scorer) lands in a dated amendment with tests before the first hold. +### H57dp amendment R1: the Ld-mtp-u render, the two-hold scorer and an affinity check (2026-10-28) + +Recorded 2026-10-28, before any H57dp or H57de measurement: no H57dp hold, smoke or request has +run, and the H57d campaign directory no longer exists on the host. It adds the runner the +[H57dp pre-registration](#h57dp-pre-registration-llamacpp-thread-pinning-on-the-busy-client-i9-13900t-2026-10-21) +asks for. Nothing here changes either row's arms, model files, statistic, thresholds, hold count, +hold orders or prediction. It adds one INCONCLUSIVE condition, the affinity check below. + +**Files.** H57d's runner (`bench/h57d`, H57d amendment R1), extended: + +- `h57d.py`: arm `Ld-mtp-u`, Ld-mtp's render, rank, port and API under service `ld-mtp-u`. + `llamacpp_args(mtp, pinned=False)` drops `-C 0x5555 --cpu-strict 1` and keeps every other flag + in the same order (`-t 8 --jinja -md --spec-type draft-mtp`, the default draft + length). The H57dp orders (hold 1: Ld-mtp-u, Od, Ld-mtp; hold 2: Ld-mtp, Ld-mtp-u, Od) come + from `h57d.py order ROW HOLD`. `h57d.py score-p` is the two-hold scorer. H57d's `score` path is + unchanged: re-scoring the committed H57d records reproduces `verdict.json` byte for byte, and a + test now compares the re-score with it. +- `hold.sh`: the default arm order is `h57d.py order "${H57D_ROW}" `, which is H57d's for + every row except H57dp, so H57w is unchanged. With `H57D_ROW=H57dp` only performance holds 1 + and 2 exist. An unregistered hold or mode exits 2 before the lock is taken or anything is + written. +- `test_h57d.py` (in CI): the unpinned flags; the Ld-mtp-u render, which is Ld-mtp's with only + its name and the four pinning flags changed; the row orders; the `hold.sh` guards; every + H57dp and H57de branch on synthetic two-hold records; the affinity parser on the H57d records; + and the H57d re-score. + +`arm.sh`, `hold-run.sh`, `k3d-shim.sh`, `convert.sh` and `reproduce.sh` are unchanged. +`reproduce.sh` prints Ld-mtp-u's flags with the other arms'. + +**Flags read at b11749** (the llama.cpp source at tag `b11749`). `common/common.h` defaults +`mask_valid` to false ("Default: any CPU") and `strict_cpu` to false. `postprocess_cpu_params` +(`common/arg.cpp`, lines 886-890) gives the batch and draft parameter sets the main set when +their own thread count is unset. `ggml/src/ggml-cpu/ggml-cpu.c` sets a thread's affinity only +for a valid mask (`ggml_thread_cpumask_is_valid`). So without `-C` and `--cpu-strict` no +llama.cpp thread sets its affinity, and every thread may run on any CPU of the pod's cpuset +(0-15, the P-core balloon). + +**Scorer (`score-p`).** It reads `results/H57dp/hold1` and `hold2`. Per arm it takes the 16 +pooled N=1 requests (8 per hold), the per-hold medians and the ratio of medians with H54's +bootstrap CI, as H57d does. An arm is delivered when it was measured in both holds. One load +gate, H57d's, covers the delivered arms. Each row checks, in order: both its arms delivered, the +affinity check, the load gate, then the pre-registered outcome rules. There is no quality gate: +quality is inherited as registered, and the report says so. + +**Affinity check (added).** `arm.sh` records each server's per-thread affinity table after +readiness (`cpus.txt`). In H57d every Ld and Ld-mtp table had its single-CPU threads on exactly +CPUs 0, 2, ..., 14 (9 threads, 2 on CPU 0), and no Od table had any. Per hold, Ld-mtp passes when +its single-CPU threads sit on exactly those CPUs, and Ld-mtp-u passes when it has none. H57dp +needs both arms to pass, H57de needs Ld-mtp-u. A failing arm, or one with no table, makes the row +INCONCLUSIVE (affinity not as registered), so no verdict rests on a treatment that did not apply. + +**Models.** H57dp downloads H57d's revisions again and builds the drafter with `convert.sh` +unchanged. Before the first hold, every LFS file's sha256 must equal the committed +`bench/h57d/results/2026-10-21/weights.sha256`, and the drafter Q4_0 GGUF must equal H57d's +(sha256 `8eb21d5b...`, 321,145,696 bytes). Otherwise no hold runs and the mismatch is recorded. + +**Smoke.** One wiring smoke of Ld-mtp-u alone may run under the lock before hold 1 (`SMOKE=1`: +readiness, one 16-token request, the affinity table). It runs no scored request, is not one of +the 2 holds, and is discarded and disclosed in the run section, as H57d's smokes were. + +**Commands** (`LOCK` = the host's `live.lock`, `SUDO_ASKPASS` for RAPL): + +```bash +LOCK= G=~/k3dgpu-h57d bench/h57d/convert.sh # drafter GGUF + Od's graph.pbtxt +SMOKE=1 LOCK= bench/h57d/hold.sh smoke-p perf Ld-mtp-u # wiring smoke, discarded +for h in 1 2; do LOCK= H57D_ROW=H57dp bench/h57d/hold.sh $h perf; done +python3 bench/h57d/h57d.py score-p ~/k3dgpu-h57d/results/H57dp > verdict.json +``` + +Holds as registered: 2, each at most 75 min (`timeout -k 30 4500`), with H57d's start rule, +floors, watchdog and cluster deletion. + ### Wildct pre-registration: client Raptor Lake (i7-13700, 2026-10-20) Written 2026-10-20, before any H52w, H18w, H25w, H28w, H34w or H57w measurement on this host. diff --git a/bench/h57d/h57d.py b/bench/h57d/h57d.py index 7d0143ea..98e1a08d 100644 --- a/bench/h57d/h57d.py +++ b/bench/h57d/h57d.py @@ -1,14 +1,18 @@ #!/usr/bin/env python3 """h57d.py: the H57d runner's arm table and renders, P-core load sampler, load gate and -scorer (EXPERIMENTS.md "H57d pre-registration" and "H57d amendment R1"). +scorers (EXPERIMENTS.md "H57d pre-registration", "H57d amendment R1", "H57dp pre-registration" +and "H57dp amendment R1"). h57d.py arms the arm table as JSON h57d.py field ARM KEY one field of an arm (for arm.sh) - h57d.py render ARM OUT.yaml Namespace + Deployment + Service for Ld, Ld-mtp + h57d.py order ROW HOLD a results row's registered arm order for one hold (for + hold.sh): H57dp's two holds, else H57d's (H57w too) + h57d.py render ARM OUT.yaml Namespace + Deployment + Service for Ld, Ld-mtp, Ld-mtp-u h57d.py od-ro IN.yaml OUT.yaml Od's staged render on a read-only model bind h57d.py sample OUT.jsonl NODE every 5 s until killed: P-core (CPUs 0-15) busy CPU-s/s, the k3d node container's CPU-s/s, load1, package C h57d.py score RESULTS_DIR the H57da and H57dm verdicts from the recorded holds + h57d.py score-p RESULTS_DIR the H57dp and H57de verdicts from the two H57dp holds The GSM8K grader, the bootstrap and the 1,000-token TTFT prompt are H54's (bench/h54). Python 3 standard library only, except render (PyYAML).""" @@ -33,32 +37,49 @@ LLAMACPP = h54.IMG["llamacpp"] # server-b11749, H54's pin PCORES = list(range(16)) # CPUs 0-15: the 8 P-cores and their HT siblings MASK = "0x5555" # CPUs 0, 2, ..., 14: one thread per physical P-core +MASK_CPUS = [i for i in range(32) if int(MASK, 16) >> i & 1] # rank: 0 OpenVINO / Google, 2 built here. svc/ns/port/api: where the OpenAI API answers. ARMS = { "Od": dict(rank=0, deploy="k3d-gpu", model=OVB, svc="ovms", ns="k3d-gpu-agent", port=8000, api="/v3"), "Ld": dict(rank=0, deploy="render", svc="ld", ns=NS, port=8080, api="/v1"), "Ld-mtp": dict(rank=2, deploy="render", svc="ld-mtp", ns=NS, port=8080, api="/v1"), + # H57dp: Ld-mtp without -C and --cpu-strict, its 8 threads left to the kernel inside the + # pod's P-core cpuset. + "Ld-mtp-u": dict(rank=2, deploy="render", svc="ld-mtp-u", ns=NS, port=8080, api="/v1"), } SERVED = "gemma" +H57D_ARMS = ("Od", "Ld", "Ld-mtp") # the arms H57da and H57dm score (and H57w's replication) # Rotated arm orders of performance holds 1-3, and the quality hold's order. ORDERS = {1: ["Od", "Ld", "Ld-mtp"], 2: ["Ld", "Ld-mtp", "Od"], 3: ["Ld-mtp", "Od", "Ld"], 4: ["Ld", "Od", "Ld-mtp"]} +# H57dp and H57de: two performance holds, no quality hold (EXPERIMENTS.md "H57dp pre-registration"). +P_ARMS = ("Ld-mtp", "Ld-mtp-u", "Od") +P_ORDERS = {1: ["Ld-mtp-u", "Od", "Ld-mtp"], 2: ["Ld-mtp", "Ld-mtp-u", "Od"]} +P_QUALITY = ("inherited, not re-measured (H57dp pre-registration): H57d's Ld-mtp record (50/50) " + "stands for Ld-mtp-u and Od's (50/50) for Od; neither row has a quality gate here") -def llamacpp_args(mtp): - a = ["-m", f"/models/{GGUF}", "--host", "0.0.0.0", "--port", "8080", "--alias", SERVED, - "-t", "8", "-C", MASK, "--cpu-strict", "1", "--jinja"] +def orders(row): + """A results row's registered arm orders: H57dp's two holds, else H57d's (H57w's too).""" + return P_ORDERS if row == "H57dp" else ORDERS + + +def llamacpp_args(mtp, pinned=True): + a = ["-m", f"/models/{GGUF}", "--host", "0.0.0.0", "--port", "8080", "--alias", SERVED, "-t", "8"] + if pinned: + a += ["-C", MASK, "--cpu-strict", "1"] + a += ["--jinja"] if mtp: a += ["-md", f"/models/{DRAFTER_GGUF}", "--spec-type", "draft-mtp"] return a def render(arm): - if arm not in ("Ld", "Ld-mtp"): + if arm not in ("Ld", "Ld-mtp", "Ld-mtp-u"): raise SystemExit(f"h57d.py render: {arm} is not rendered here") name = ARMS[arm]["svc"] c = {"name": "server", "image": LLAMACPP, "imagePullPolicy": "IfNotPresent", - "args": llamacpp_args(arm == "Ld-mtp"), + "args": llamacpp_args(arm != "Ld", pinned=arm != "Ld-mtp-u"), "ports": [{"name": "http", "containerPort": 8080}], # Od's request and balloon (k3d-gpu agent_cpus on a hybrid node: every P-core CPU). "resources": {"requests": {"cpu": "16", "memory": "6Gi"}}, @@ -209,12 +230,14 @@ def measured(arm_dir): return os.path.exists(st) and jload(st).get("status") == "measured" -def collect(results): - hd = hold_dirs(results) +def collect(results, names=H57D_ARMS, holds=(1, 2, 3), hd=None, quality_hold=4): + """Per arm: pooled and per-hold N=1 decode, foreign P-core load over the N=1 phases, and the + quality record of quality_hold (None: no quality hold, H57dp).""" + hd = hd or hold_dirs(results) arms = {} - for a in ARMS: + for a in names: rec = {"decode": [], "per_hold": {}, "foreign": [], "quality": None, "holds_measured": 0} - for k in (1, 2, 3): + for k in holds: ad = os.path.join(hd[k], a) if not measured(ad): continue @@ -233,8 +256,8 @@ def collect(results): f = foreign(samples, r["t0"], r["t1"]) if f is not None: rec["foreign"].append(f) - q = os.path.join(hd[4], a, "quality.json") - if measured(os.path.join(hd[4], a)) and os.path.exists(q): + q = None if quality_hold is None else os.path.join(hd[quality_hold], a, "quality.json") + if q and measured(os.path.dirname(q)) and os.path.exists(q): qq = jload(q) rec["quality"] = {"correct": qq["correct"], "n": qq["n"], "score": qq["score"]} rec["median"] = h54.median(rec["decode"]) @@ -250,13 +273,13 @@ def gate(arms): return {k: bool(a["quality"]) and a["quality"]["score"] >= best - 0.10 - 1e-9 for k, a in arms.items()}, best -def delivered(a): - return a["holds_measured"] == 3 +def delivered(a, holds=3): + return a["holds_measured"] == holds -def ratio(num, den): +def ratio(num, den, holds=(1, 2, 3)): lo, hi = h54.boot_ratio(num["decode"], den["decode"]) - per = {k: num["per_hold"][k] / den["per_hold"][k] for k in (1, 2, 3)} + per = {k: num["per_hold"][k] / den["per_hold"][k] for k in holds} return {"ratio": num["median"] / den["median"], "ci": [lo, hi], "per_hold": per, "all_holds_faster": all(v > 1 for v in per.values())} @@ -316,16 +339,102 @@ def score(results): return rep +def single_cpu_threads(cpus_txt): + """{cpu: threads} for the server threads whose affinity is a single CPU, from the thread table + arm.sh writes to cpus.txt after readiness; None when the file or its table is missing.""" + try: + with open(cpus_txt) as f: + lines = f.read().splitlines() + except OSError: + return None + head = "server threads by affinity:" + if head not in lines: + return None + out = {} + for line in lines[lines.index(head) + 1:]: + f = line.split() + if len(f) == 2 and f[0].isdigit() and f[1].isdigit(): + out[int(f[1])] = out.get(int(f[1]), 0) + int(f[0]) + return out + + +def score_p(results): + """H57dp (Ld-mtp-u vs Ld-mtp) and H57de (Ld-mtp-u vs Od) from results/hold1 and hold2. As + H57d: an arm is delivered when it was measured in every hold, and one load gate covers the + delivered arms. Quality is inherited (P_QUALITY), so neither row is gated on it. Affinity + check, per hold, from cpus.txt: Ld-mtp's single-CPU threads sit exactly on MASK's CPUs and + Ld-mtp-u has none; a row whose arm fails it, or has no table, is INCONCLUSIVE.""" + holds = (1, 2) + hd = {k: os.path.join(results, f"hold{k}") for k in holds} + arms = collect(results, P_ARMS, holds, hd, quality_hold=None) + dl = {k: delivered(a, len(holds)) for k, a in arms.items()} + lg = load_gate({k: a["foreign_mean"] for k, a in arms.items() if dl[k]}) + aff = {} + for a, want in (("Ld-mtp", set(MASK_CPUS)), ("Ld-mtp-u", set())): + got = {k: single_cpu_threads(os.path.join(hd[k], a, "cpus.txt")) for k in holds} + aff[a] = {"single_cpu_threads": got, "as_registered": all(g is not None and set(g) == want for g in got.values())} + rep = {"arms": {k: {x: v for x, v in a.items() if x not in ("decode", "foreign", "quality")} for k, a in arms.items()}, + "delivered": dl, "quality": P_QUALITY, "affinity": aff, "load_gate": lg} + u = arms["Ld-mtp-u"] + + def precheck(den): + """The INCONCLUSIVE reason that stops a row before its statistic, or None.""" + if not (dl["Ld-mtp-u"] and dl[den]): + return f"Ld-mtp-u or {den} not delivered in both holds" + off = [a for a in ("Ld-mtp-u", den) if a in aff and not aff[a]["as_registered"]] + if off: + return "thread affinity not as registered: " + ", ".join(off) + if not lg["matched"]: + return "load unmatched: " + lg["reason"] + return None + + # H57dp: Ld-mtp-u vs Ld-mtp, bar 1.10. + why = precheck("Ld-mtp") + if why: + dp = {"verdict": "INCONCLUSIVE", "reason": why} + else: + dp = ratio(u, arms["Ld-mtp"], holds) + if dp["ratio"] >= 1.10 and dp["ci"][0] > 1.0 and dp["all_holds_faster"]: + dp.update(verdict="SUPPORTED", reason="ratio >= 1.10, CI lower bound > 1.0, faster in both holds") + elif dp["ci"][1] < 1.10: + dp.update(verdict="REFUTED", reason="CI upper bound < 1.10") + else: + dp.update(verdict="INCONCLUSIVE", reason="not resolved against 1.10") + rep["H57dp"] = dp + + # H57de: H57da's rule with X = Ld-mtp-u, bar 1.05. + why = precheck("Od") + if why: + de = {"x": "Ld-mtp-u", "verdict": "INCONCLUSIVE", "reason": why} + else: + de = {"x": "Ld-mtp-u", **ratio(u, arms["Od"], holds)} + if de["ci"][0] >= 1.05 and de["all_holds_faster"]: + de.update(verdict="REFUTED", reason="Ld-mtp-u/Od CI lower bound >= 1.05 and faster in both holds") + elif de["ci"][1] < 1.05: + de.update(verdict="SUPPORTED", reason="Ld-mtp-u/Od CI upper bound < 1.05") + else: + de.update(verdict="INCONCLUSIVE", reason="CI not resolved against 1.05") + rep["H57de"] = de + return rep + + def main(argv): if not argv: raise SystemExit(__doc__) cmd, a = argv[0], argv[1:] if cmd == "arms": - print(json.dumps({"arms": ARMS, "orders": ORDERS, "served": SERVED, "llamacpp": LLAMACPP, - "args": {"Ld": llamacpp_args(False), "Ld-mtp": llamacpp_args(True)}}, indent=1)) + print(json.dumps({"arms": ARMS, "orders": ORDERS, "orders_h57dp": P_ORDERS, "served": SERVED, + "llamacpp": LLAMACPP, + "args": {"Ld": llamacpp_args(False), "Ld-mtp": llamacpp_args(True), + "Ld-mtp-u": llamacpp_args(True, pinned=False)}}, indent=1)) elif cmd == "field": v = ARMS[a[0]].get(a[1], "") print(v) + elif cmd == "order": + o = orders(a[0]) + if not a[1].isdigit() or int(a[1]) not in o: + raise SystemExit(f"h57d.py order: {a[0]} registers no hold {a[1]}") + print(" ".join(o[int(a[1])])) elif cmd == "render": import yaml with open(a[1], "w") as f: @@ -340,6 +449,8 @@ def main(argv): sample(a[0], a[1]) elif cmd == "score": print(json.dumps(score(a[0]), indent=1)) + elif cmd == "score-p": + print(json.dumps(score_p(a[0]), indent=1)) else: raise SystemExit(f"h57d.py: unknown command {cmd}") return 0 diff --git a/bench/h57d/hold.sh b/bench/h57d/hold.sh index 8ad4163d..b9c900c5 100644 --- a/bench/h57d/hold.sh +++ b/bench/h57d/hold.sh @@ -1,15 +1,17 @@ #!/usr/bin/env bash # hold.sh HOLD MODE [ARM...]: one H57d hold on the i9-13900T (EXPERIMENTS.md "H57d -# pre-registration" and "H57d amendment R1"). Takes the host's live.lock (flock -w 21600), -# waits while load1 > 24 (2-min polls, at most 60 min, then runs flagged), refuses to start when -# / would have < 15 GB free or MemAvailable < 20 GiB, creates cluster k3dgpu-d-h57d-, -# runs each ARM (default: the hold's registered order) with the load sampler beside it and a -# disk watchdog, and deletes the cluster at the end, also on failure. Everything runs under -# `timeout -k 30 4500`. MODE: perf | quality. Records: ${G}/results/H57d/hold/. +# pre-registration", "H57d amendment R1" and "H57dp amendment R1"). Takes the host's live.lock +# (flock -w 21600), waits while load1 > 24 (2-min polls, at most 60 min, then runs flagged), +# refuses to start when / would have < 15 GB free or MemAvailable < 20 GiB, creates cluster +# k3dgpu-d-h57d-, runs each ARM (default: the hold's registered order for H57D_ROW) with +# the load sampler beside it and a disk watchdog, and deletes the cluster at the end, also on +# failure. Everything runs under `timeout -k 30 4500`. MODE: perf | quality. Records: +# ${G}/results/${H57D_ROW}/hold/. # G campaign dir (default ~/k3dgpu-h57d), models under G/models # LOCK the host lock file; SUDO_ASKPASS for energy.sh's RAPL reader # H57D_PREFIX cluster prefix (default k3dgpu-d-); H57D_LOAD1_MAX hold-start load1 (default 24); -# H57D_ROW results row name (default H57d): another host's replication (H57w on wildct) +# H57D_ROW results row name (default H57d): another host's replication (H57w on wildct), or +# H57dp (holds 1-2, perf only, the H57dp orders) set -uo pipefail HOLD=$1 MODE=$2 shift 2 @@ -19,12 +21,14 @@ REPO=$(cd "${HERE}/../.." && pwd) export REPO G MODE PREFIX=${H57D_PREFIX:-k3dgpu-d-} L1MAX=${H57D_LOAD1_MAX:-24} case ${HOLD} in smoke*) R=${G}/smoke/${HOLD} ;; *) R=${G}/results/${H57D_ROW:-H57d}/hold${HOLD} ;; esac -mkdir -p "${R}" "${G}/results" +if [ "${H57D_ROW:-H57d}" = H57dp ] && [ "${MODE}" != perf ]; then echo "H57dp registers performance holds only"; exit 2; fi if [ $# -eq 0 ]; then - read -r -a ARMS_RUN <<< "$(python3 "${HERE}/h57d.py" arms | python3 -c 'import json,sys; o=json.load(sys.stdin)["orders"]; print(" ".join(o[sys.argv[1]]))' "${HOLD}")" + read -r -a ARMS_RUN <<< "$(python3 "${HERE}/h57d.py" order "${H57D_ROW:-H57d}" "${HOLD}")" + [ "${#ARMS_RUN[@]}" -gt 0 ] || exit 2 else ARMS_RUN=("$@") fi +mkdir -p "${R}" "${G}/results" export H57D_PREFIX=${PREFIX} PATH=${G}/bin:${PATH} CLUSTER=${PREFIX}h57d-${HOLD//[^a-z0-9]/} KUBECONFIG=${R}/kubeconfig log() { echo "== H57d-hold${HOLD} $* $(date -u +%FT%TZ)" | tee -a "${G}/results/campaign.log"; } free_gb() { df -P -B1G / | awk 'NR==2 {print $4}'; } diff --git a/bench/h57d/test_h57d.py b/bench/h57d/test_h57d.py index 5afa65ba..51aa890b 100644 --- a/bench/h57d/test_h57d.py +++ b/bench/h57d/test_h57d.py @@ -41,9 +41,9 @@ def test_mask_is_one_thread_per_physical_pcore(self): def test_orders_rotate(self): o = h57d.ORDERS for k in (1, 2, 3, 4): - self.assertEqual(sorted(o[k]), sorted(h57d.ARMS)) - self.assertEqual({o[k][0] for k in (1, 2, 3)}, set(h57d.ARMS)) # each arm first once - self.assertEqual({o[k][2] for k in (1, 2, 3)}, set(h57d.ARMS)) # and last once + self.assertEqual(sorted(o[k]), sorted(h57d.H57D_ARMS)) + self.assertEqual({o[k][0] for k in (1, 2, 3)}, set(h57d.H57D_ARMS)) # each arm first once + self.assertEqual({o[k][2] for k in (1, 2, 3)}, set(h57d.H57D_ARMS)) # and last once @unittest.skipUnless(HAVE_YAML, "PyYAML") def test_render_pcores(self): @@ -225,6 +225,282 @@ def test_not_faster_in_every_hold(self): self.assertFalse(r["H57da"]["all_holds_faster"]) self.assertNotEqual(r["H57da"]["verdict"], "REFUTED") + def test_committed_h57d_verdict_unchanged(self): + # The scorer's H57d path must still give the committed H57d run's verdict.json, as + # `h57d.py score` writes it (JSON, so the per-hold keys are strings). + res = os.path.join(HERE, "results", "2026-10-21") + self.assertEqual(json.loads(json.dumps(h57d.score(res))), json.load(open(os.path.join(res, "verdict.json")))) + + +# ---- H57dp amendment R1: the unpinned arm, the row's orders, the two-hold scorer ------------- + +PIN = ["-C", "0x5555", "--cpu-strict", "1"] + + +class Unpinned(unittest.TestCase): + def test_unpinned_drops_only_the_pinning_flags(self): + pinned = h57d.llamacpp_args(True) + u = h57d.llamacpp_args(True, pinned=False) + for f in ("-C", "--cpu-strict", "--cpu-range", "-Cr"): + self.assertNotIn(f, u) + i = pinned.index("-C") + self.assertEqual(pinned[i:i + 4], PIN) + self.assertEqual(u, pinned[:i] + pinned[i + 4:]) # every other flag identical, same order + self.assertEqual(u[u.index("-t") + 1], "8") + self.assertEqual(u[u.index("--spec-type") + 1], "draft-mtp") + self.assertEqual(h57d.llamacpp_args(True, pinned=True), pinned) + + def test_arm_table(self): + a = h57d.ARMS["Ld-mtp-u"] + self.assertEqual(a["svc"], "ld-mtp-u") + self.assertEqual({k: v for k, v in a.items() if k != "svc"}, + {k: v for k, v in h57d.ARMS["Ld-mtp"].items() if k != "svc"}) + self.assertNotIn("Ld-mtp-u", h57d.H57D_ARMS) # H57d's rows never see it + r = subprocess.run([sys.executable, os.path.join(HERE, "h57d.py"), "field", "Ld-mtp-u", "svc"], + capture_output=True, text=True) + self.assertEqual(r.stdout.strip(), "ld-mtp-u") + + @unittest.skipUnless(HAVE_YAML, "PyYAML") + def test_render_matches_ld_mtp_but_affinity(self): + u, m = h57d.render("Ld-mtp-u"), h57d.render("Ld-mtp") + cu = u[1]["spec"]["template"]["spec"]["containers"][0] + self.assertEqual(cu["args"], h57d.llamacpp_args(True, pinned=False)) + # Ld-mtp's render with its name and the four pinning flags swapped is Ld-mtp-u's render. + s = json.dumps(m).replace('"ld-mtp"', '"ld-mtp-u"').replace(', "-C", "0x5555", "--cpu-strict", "1"', "") + self.assertEqual(json.loads(s), u) + + def test_cli_arms_lists_unpinned_flags(self): + r = subprocess.run([sys.executable, os.path.join(HERE, "h57d.py"), "arms"], capture_output=True, text=True) + j = json.loads(r.stdout) + self.assertEqual(j["args"]["Ld-mtp-u"], h57d.llamacpp_args(True, pinned=False)) + self.assertEqual(j["orders"], {str(k): v for k, v in h57d.ORDERS.items()}) + + +class RowOrders(unittest.TestCase): + def test_h57dp_orders_as_registered(self): + self.assertEqual(h57d.P_ORDERS, {1: ["Ld-mtp-u", "Od", "Ld-mtp"], 2: ["Ld-mtp", "Ld-mtp-u", "Od"]}) + self.assertEqual(sorted(h57d.P_ARMS), ["Ld-mtp", "Ld-mtp-u", "Od"]) + for k in (1, 2): + self.assertEqual(sorted(h57d.P_ORDERS[k]), sorted(h57d.P_ARMS)) + + def test_orders_by_row(self): + self.assertIs(h57d.orders("H57dp"), h57d.P_ORDERS) + self.assertIs(h57d.orders("H57d"), h57d.ORDERS) + self.assertIs(h57d.orders("H57w"), h57d.ORDERS) # wildct's replication keeps H57d's + + def run_order(self, row, hold): + return subprocess.run([sys.executable, os.path.join(HERE, "h57d.py"), "order", row, hold], + capture_output=True, text=True) + + def test_cli_order(self): + self.assertEqual(self.run_order("H57dp", "1").stdout.strip(), "Ld-mtp-u Od Ld-mtp") + self.assertEqual(self.run_order("H57dp", "2").stdout.strip(), "Ld-mtp Ld-mtp-u Od") + self.assertEqual(self.run_order("H57d", "3").stdout.strip(), "Ld-mtp Od Ld") + self.assertEqual(self.run_order("H57w", "4").stdout.strip(), "Ld Od Ld-mtp") + for row, hold in (("H57dp", "3"), ("H57d", "smoke1")): + r = self.run_order(row, hold) + self.assertNotEqual(r.returncode, 0) + self.assertEqual(r.stdout, "") + + +class HoldGuards(unittest.TestCase): + """hold.sh refuses an unregistered hold before it takes the lock or writes anything. LOCK + points into a missing directory, so a hold.sh that got past the guards fails fast (exit 4) + instead of waiting on a real lock.""" + + def run_hold(self, row, hold, mode): + with tempfile.TemporaryDirectory() as g: + env = dict(os.environ, G=g, LOCK=os.path.join(g, "missing", "live.lock"), H57D_ROW=row) + r = subprocess.run(["bash", os.path.join(HERE, "hold.sh"), hold, mode], env=env, + capture_output=True, text=True, timeout=60) + return r, os.listdir(g) + + def test_h57dp_refuses_quality_and_third_hold(self): + for hold, mode in (("1", "quality"), ("3", "perf")): + r, made = self.run_hold("H57dp", hold, mode) + self.assertEqual(r.returncode, 2, r.stdout + r.stderr) + self.assertEqual(made, []) + + def test_h57d_unregistered_hold(self): + r, made = self.run_hold("H57d", "9", "perf") + self.assertEqual(r.returncode, 2, r.stdout + r.stderr) + self.assertEqual(made, []) + + +PINNED_CPUS = """cpuset 0-15 +Cpus_allowed_list:\t0-15 +avx512f 0 amx 0 nproc 16 +server threads by affinity: + 2 0 + 34 0-15 + 1 10 + 1 12 + 1 14 + 1 2 + 1 4 + 1 6 + 1 8 +""" +FLOATING_CPUS = """cpuset 0-15 +Cpus_allowed_list:\t0-15 +avx512f 0 amx 0 nproc 16 +server threads by affinity: + 42 0-15 +""" + + +def write_p_holds(root, decode, foreign=None, missing=(), cpus=None): + """The two H57dp holds. decode: {arm: tok/s centre, or (hold 1, hold 2)}; foreign: {arm: CPU-s/s}; + cpus: {(hold, arm): cpus.txt text, or None for no file} over the default (Ld-mtp pinned as + recorded in H57d, the others floating).""" + rng = random.Random(11) + cpus = cpus or {} + foreign = foreign or {a: 3.0 for a in h57d.P_ARMS} + for k in (1, 2): + hd = os.path.join(root, f"hold{k}") + os.makedirs(hd) + t = 1000.0 * k + samples = [] + for arm in h57d.P_ORDERS[k]: + ad = os.path.join(hd, arm) + os.makedirs(ad) + if (k, arm) in missing: + json.dump({"status": "not_deliverable"}, open(os.path.join(ad, "status.json"), "w")) + continue + json.dump({"status": "measured"}, open(os.path.join(ad, "status.json"), "w")) + ct = cpus.get((k, arm), PINNED_CPUS if arm == "Ld-mtp" else FLOATING_CPUS) + if ct is not None: + open(os.path.join(ad, "cpus.txt"), "w").write(ct) + c = decode[arm][k - 1] if isinstance(decode[arm], tuple) else decode[arm] + s = [{"ok": True, "decode_tokens_per_s": c * (1 + rng.uniform(-0.03, 0.03))} for _ in range(8)] + json.dump({"phases": [{"samples": s}]}, open(os.path.join(ad, "load-n1.json"), "w")) + with open(os.path.join(ad, "phases.jsonl"), "w") as f: + f.write(json.dumps({"phase": "n1", "t0": t, "t1": t + 100}) + "\n") + for ts in range(int(t) + 5, int(t) + 101, 5): + samples.append({"ts": ts, "seconds": 5, "pcore_busy": 8.0 + foreign[arm], "node_cpu": 8.0}) + t += 200 + with open(os.path.join(hd, "load.jsonl"), "w") as f: + for s in samples: + f.write(json.dumps(s) + "\n") + + +class ScoreP(unittest.TestCase): + def run_score(self, decode, **kw): + with tempfile.TemporaryDirectory() as d: + write_p_holds(d, decode, **kw) + return h57d.score_p(d) + + def test_unpinned_faster_than_both(self): + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0}) + self.assertEqual(r["H57dp"]["verdict"], "SUPPORTED") + self.assertAlmostEqual(r["H57dp"]["ratio"], 1.6, delta=0.1) + self.assertEqual(sorted(r["H57dp"]["per_hold"]), [1, 2]) + self.assertEqual(r["H57de"]["verdict"], "REFUTED") + self.assertEqual(r["H57de"]["x"], "Ld-mtp-u") + self.assertTrue(r["load_gate"]["matched"]) + + def test_pinning_does_not_matter_od_fastest(self): + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": 5.0, "Od": 7.0}) + self.assertEqual(r["H57dp"]["verdict"], "REFUTED") # CI upper bound < 1.10 + self.assertLess(r["H57dp"]["ci"][1], 1.10) + self.assertEqual(r["H57de"]["verdict"], "SUPPORTED") # CI upper bound < 1.05 + self.assertLess(r["H57de"]["ci"][1], 1.05) + + def test_near_thresholds_inconclusive(self): + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": 5.4, "Od": 5.2}) + dp, de = r["H57dp"], r["H57de"] + self.assertLess(dp["ratio"], 1.10) # not SUPPORTED + self.assertGreaterEqual(dp["ci"][1], 1.10) # not REFUTED + self.assertEqual(dp["verdict"], "INCONCLUSIVE") + self.assertLess(de["ci"][0], 1.05) # not REFUTED + self.assertGreaterEqual(de["ci"][1], 1.05) # not SUPPORTED + self.assertEqual(de["verdict"], "INCONCLUSIVE") + + def test_not_faster_in_both_holds(self): + # Ld-mtp-u 2x faster in hold 1, 3% slower in hold 2: the pooled ratio clears 1.10, the + # per-hold rule does not. + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": (10.0, 4.85), "Od": (4.0, 4.0)}) + self.assertFalse(r["H57dp"]["all_holds_faster"]) + self.assertNotEqual(r["H57dp"]["verdict"], "SUPPORTED") + self.assertTrue(r["H57de"]["all_holds_faster"]) + + def test_od_slower_in_one_hold_blocks_refuted(self): + r = self.run_score({"Ld-mtp": 4.0, "Ld-mtp-u": (9.0, 6.0), "Od": (6.0, 6.5)}) + self.assertFalse(r["H57de"]["all_holds_faster"]) + self.assertEqual(r["H57de"]["verdict"], "INCONCLUSIVE") + + def test_load_unmatched(self): + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0}, foreign={"Ld-mtp": 1.0, "Ld-mtp-u": 5.0, "Od": 1.0}) + self.assertFalse(r["load_gate"]["matched"]) + for row in ("H57dp", "H57de"): + self.assertEqual(r[row]["verdict"], "INCONCLUSIVE") + self.assertIn("load unmatched", r[row]["reason"]) + + def test_arm_missing_a_hold(self): + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0}, missing={(2, "Od")}) + self.assertFalse(r["delivered"]["Od"]) + self.assertEqual(r["H57de"]["verdict"], "INCONCLUSIVE") + self.assertIn("not delivered", r["H57de"]["reason"]) + self.assertEqual(r["H57dp"]["verdict"], "SUPPORTED") # its own two arms were delivered + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0}, missing={(1, "Ld-mtp-u")}) + for row in ("H57dp", "H57de"): + self.assertEqual(r[row]["verdict"], "INCONCLUSIVE") + + def test_no_quality_gate_and_no_third_hold(self): + with tempfile.TemporaryDirectory() as d: + write_p_holds(d, {"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0}) + # A stray hold3 (a third hold is not registered) is never read. + write_holds(os.path.join(d, "stray"), {"Od": 1.0, "Ld": 1.0, "Ld-mtp": 1.0}, Score.Q) + os.rename(os.path.join(d, "stray", "hold3"), os.path.join(d, "hold3")) + r = h57d.score_p(d) + self.assertEqual({a["holds_measured"] for a in r["arms"].values()}, {2}) + self.assertNotIn("gate", r) + self.assertIn("inherited", r["quality"]) + + def test_affinity_read_from_cpus_txt(self): + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0}) + self.assertTrue(r["affinity"]["Ld-mtp"]["as_registered"]) + self.assertTrue(r["affinity"]["Ld-mtp-u"]["as_registered"]) + self.assertEqual(r["affinity"]["Ld-mtp"]["single_cpu_threads"][1], {c: 2 if c == 0 else 1 for c in range(0, 16, 2)}) + self.assertEqual(r["affinity"]["Ld-mtp-u"]["single_cpu_threads"][2], {}) + + def test_unpinned_arm_found_pinned(self): + # Ld-mtp-u's server shows threads bound to one CPU in hold 2: the treatment did not apply. + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0}, cpus={(2, "Ld-mtp-u"): PINNED_CPUS}) + self.assertFalse(r["affinity"]["Ld-mtp-u"]["as_registered"]) + for row in ("H57dp", "H57de"): + self.assertEqual(r[row]["verdict"], "INCONCLUSIVE") + self.assertIn("affinity", r[row]["reason"]) + + def test_pinned_arm_found_floating(self): + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0}, cpus={(1, "Ld-mtp"): FLOATING_CPUS}) + self.assertEqual(r["H57dp"]["verdict"], "INCONCLUSIVE") + self.assertIn("affinity", r["H57dp"]["reason"]) + self.assertEqual(r["H57de"]["verdict"], "REFUTED") # H57de reads only Ld-mtp-u's affinity + + def test_affinity_not_recorded(self): + r = self.run_score({"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0}, cpus={(1, "Ld-mtp-u"): None}) + self.assertIsNone(r["affinity"]["Ld-mtp-u"]["single_cpu_threads"][1]) + for row in ("H57dp", "H57de"): + self.assertEqual(r[row]["verdict"], "INCONCLUSIVE") + + def test_single_cpu_threads_on_the_h57d_records(self): + res = os.path.join(HERE, "results", "2026-10-21") + for k in (1, 2, 3, 4): + for arm in ("Ld", "Ld-mtp"): + got = h57d.single_cpu_threads(os.path.join(res, f"hold{k}", arm, "cpus.txt")) + self.assertEqual(sorted(got), h57d.MASK_CPUS) + self.assertEqual(h57d.single_cpu_threads(os.path.join(res, f"hold{k}", "Od", "cpus.txt")), {}) + self.assertIsNone(h57d.single_cpu_threads(os.path.join(res, "missing.txt"))) + + def test_cli_score_p(self): + with tempfile.TemporaryDirectory() as d: + write_p_holds(d, {"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0}) + out = subprocess.run([sys.executable, os.path.join(HERE, "h57d.py"), "score-p", d], + capture_output=True, text=True) + self.assertEqual(out.returncode, 0, out.stderr) + self.assertEqual(json.loads(out.stdout)["H57dp"]["verdict"], "SUPPORTED") + if __name__ == "__main__": unittest.main() From 9f795a863aeff6baaba92276a78c1fc223e6d5bc Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:29:53 -0700 Subject: [PATCH 18/85] bench(h54): unscored diagnostic for the B1g stall B1g (EAT stock vLLM CPU v0.24.0 serving Gemma 4 26B-A4B QAT) stopped mid-decode in both H54a holds and died on the 300 s execute_model RPC timeout. The records show when it stopped but not what the worker was doing. bench/h54/diag/b1g-stall.sh starts B1g's container exactly as the committed H54a render has it, with plain docker instead of k3d, under the bench lock and the hold-start rule, sends sequential 256-token greedy requests with the harness client, and on a stall records every thread of the container's processes twice and a py-spy dump of each. It is a diagnostic only: not a hold, not an arm, nothing is scored from it. Tests for the render, the thread snapshot and the stall watcher run in CI. --- .github/workflows/ci.yml | 1 + bench/h54/diag/b1g-stall.sh | 123 ++++++++++++++++ bench/h54/diag/b1g_diag.py | 253 ++++++++++++++++++++++++++++++++ bench/h54/diag/test_b1g_diag.py | 144 ++++++++++++++++++ 4 files changed, 521 insertions(+) create mode 100755 bench/h54/diag/b1g-stall.sh create mode 100755 bench/h54/diag/b1g_diag.py create mode 100644 bench/h54/diag/test_b1g_diag.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f75d16a..dc926fc3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -257,6 +257,7 @@ jobs: - run: python3 bench/models/test_qat_grid.py - run: python3 bench/prefill-guard/test_analyze.py - run: python3 bench/h54/test_h54.py + - run: python3 bench/h54/diag/test_b1g_diag.py - run: python3 bench/h54gpu/test_h54gpu.py - run: python3 bench/h57d/test_h57d.py - run: python3 bench/admission/test_ctl.py diff --git a/bench/h54/diag/b1g-stall.sh b/bench/h54/diag/b1g-stall.sh new file mode 100755 index 00000000..1d486774 --- /dev/null +++ b/bench/h54/diag/b1g-stall.sh @@ -0,0 +1,123 @@ +#!/usr/bin/env bash +# b1g-stall.sh OUTDIR: UNSCORED diagnostic of the H54a B1g stall (EXPERIMENTS.md, "H54a run": +# vLLM CPU v0.24.0 stopped mid-decode in both holds, EngineDeadError after the 300 s +# execute_model RPC timeout). Not a hold, not an arm; no hypothesis is scored from it. +# +# It starts B1g's container exactly as rendered in the committed H54a record +# (bench/h54/results/2026-10-21/H54a/hold2/B1g/deploy.yaml: image digest, args, env ConfigMap, +# chat-template ConfigMap, user 1001, read-only root, capabilities, no CPU or memory request or +# limit) with plain `docker run` instead of k3d, sends sequential 256-token greedy requests with +# the harness client (bench/llm_load.py, the H54a N=1 settings), and watches vLLM's /metrics. +# On a stall it records each thread of the container's processes twice, 10 s apart, and a +# py-spy dump of each process, then waits for the engine to die or 400 s. +# +# Box rules: the exclusive bench lock (~/k3dgpu-bench.lock, the K=1 hold lock), the hold-start +# rule (load1 <= 12 and no aiperf process, else wait up to 30 min, then refuse), the 97% disk +# line, `timeout -k 30 2400` on the whole run, no GPU device, nothing that serves is touched. +# The container is this script's own (name k3dgpu-diag-b1g-*): it is stopped and removed at the +# end, also on failure. Model weights are mounted read-only. +set -uo pipefail +OUT=${1:?usage: b1g-stall.sh OUTDIR} +D=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +H=$(cd "${D}/.." && pwd) +REPO=$(cd "${H}/../.." && pwd) +IMAGE=${DIAG_IMAGE:-vllm/vllm-openai-cpu@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1} +MODELS=${DIAG_MODELS:-${HOME}/k3dgpu-gemma/models} +MDIR=google_gemma-4-26B-A4B-it-qat-q4_0-unquantized +DEPLOY=${DIAG_DEPLOY:-${H}/results/2026-10-21/H54a/hold2/B1g/deploy.yaml} +PORT=${DIAG_PORT:-18080} +REQS=${DIAG_REQUESTS:-60} +export DIAG_PYSPY=${DIAG_PYSPY:-${HOME}/k3dgpu-gemma/b1g-diag/pyspy/bin/py-spy} +NAME=k3dgpu-diag-b1g-$(date -u +%H%M%S) +PY=python3 +mkdir -p "${OUT}" +log() { echo "$(date -u +%FT%TZ) $*" | tee -a "${OUT}/diag.log"; } +aiperf_n() { docker top aiperf010 -eo pid,args 2>/dev/null | awk 'NR>1 && $0 !~ /sleep infinity/' | wc -l; } +disk() { df -P / | awk 'NR==2 {gsub("%", "", $5); print $5}'; } +snapshot() { date -u +%FT%TZ; uptime; ps -eo pcpu,pid,user,comm --sort=-pcpu | head -11; echo "aiperf_procs: $(aiperf_n)"; df -P / | tail -1; docker ps --format '{{.Names}} {{.Status}}'; } + +if [ ! -x "${DIAG_PYSPY}" ]; then # py-spy 0.4.2 (pinned) in its own venv, outside the lock + python3 -m venv "$(dirname "$(dirname "${DIAG_PYSPY}")")" && "$(dirname "${DIAG_PYSPY}")/pip" install -q py-spy==0.4.2 \ + || { echo "py-spy install failed" >&2; exit 2; } +fi +if [ -z "${DIAG_LOCKED:-}" ]; then + log "waiting for the bench lock" + exec 9> "${HOME}/k3dgpu-bench.lock" + flock -w 7200 9 || { log "lock not taken in 7200 s"; exit 4; } + log "lock taken" + export DIAG_LOCKED=1 + exec timeout -k 30 2400 bash "$0" "$@" +fi + +waited=0 +while :; do + l1=$(cut -d' ' -f1 /proc/loadavg) a=$(aiperf_n) + if awk -v l="${l1}" 'BEGIN {exit !(l > 12)}' || [ "${a}" -gt 0 ]; then + [ "${waited}" -lt 1800 ] || { log "busy after 30 min (load1 ${l1}, aiperf ${a}): not run"; exit 5; } + log "busy (load1 ${l1}, aiperf ${a}): waiting 120 s" + sleep 120; waited=$(( waited + 120 )); continue + fi + break +done +[ "$(disk)" -le 97 ] || { log "disk $(disk)% > 97%: not run"; exit 5; } +snapshot > "${OUT}/pre.txt" +{ echo "repo: $(git -C "${REPO}" rev-parse HEAD) dirty=$(git -C "${REPO}" status --porcelain | wc -l)" + echo "image: ${IMAGE}"; docker image inspect "${IMAGE}" --format 'id={{.Id}} entrypoint={{json .Config.Entrypoint}}' + echo "model: ${MODELS}/${MDIR}"; (cd "${MODELS}/${MDIR}" && sha256sum config.json generation_config.json model.safetensors.index.json) + echo "py-spy: $(${DIAG_PYSPY} --version 2>&1)"; uname -r; nproc; } > "${OUT}/reproduce.txt" 2>&1 + +${PY} "${D}/b1g_diag.py" render "${DEPLOY}" "${OUT}/render" || { log "render failed"; exit 2; } +mapfile -t ARGS < <(${PY} -c 'import json,sys; print("\n".join(json.load(open(sys.argv[1]))))' "${OUT}/render/args.json") +cleanup() { + docker logs "${NAME}" > "${OUT}/server.log" 2>&1 + docker inspect "${NAME}" > "${OUT}/container.json" 2>/dev/null + docker stop -t 30 "${NAME}" > /dev/null 2>&1 + docker rm "${NAME}" > /dev/null 2>&1 + [ -n "${SP:-}" ] && kill "${SP}" 2>/dev/null + snapshot > "${OUT}/post.txt" + gzip -f "${OUT}/server.log" + log "cleaned up ${NAME}" +} +trap cleanup EXIT +trap 'exit 143' TERM INT + +log "start ${NAME} (${IMAGE})" +docker run -d --name "${NAME}" --label k3dgpu.diag=b1g-stall --restart no \ + --user 1001 --read-only --cap-drop ALL --cap-add SYS_NICE --security-opt no-new-privileges \ + --ipc private --shm-size 1g \ + --tmpfs /tmp:rw,exec,size=8g --tmpfs /root/.cache/vllm:rw,exec,size=1g \ + -v "${MODELS}/${MDIR}:/data/${MDIR}:ro" -v "${OUT}/render/templates:/workspace/vllm/examples:ro" \ + --env-file "${OUT}/render/env.list" -p "127.0.0.1:${PORT}:2080" \ + "${IMAGE}" "${ARGS[@]}" > "${OUT}/container-id" 2>> "${OUT}/diag.log" || { log "docker run failed"; exit 3; } +CID=$(cat "${OUT}/container-id") +ROOT=$(docker inspect -f '{{.State.Pid}}' "${NAME}") +CG=/sys/fs/cgroup/system.slice/docker-${CID}.scope/cpu.stat +python3 "${REPO}/bench/eatflow/crescent/serving.py" "${OUT}/serving.jsonl" & +SP=$! + +base=http://127.0.0.1:${PORT}/v1 +t0=${SECONDS} +until curl -sf -m 5 "${base}/models" > "${OUT}/models.json" 2>/dev/null \ + && curl -sf -m 120 "${base}/chat/completions" -H 'Content-Type: application/json' \ + -d '{"model":"google/gemma-4-26B-A4B-it","messages":[{"role":"user","content":"Say hello."}],"max_tokens":16,"temperature":0}' \ + > "${OUT}/hello.json" 2>/dev/null; do + [ "$(docker inspect -f '{{.State.Running}}' "${NAME}" 2>/dev/null)" = true ] || { log "container exited before ready"; exit 3; } + [ $(( SECONDS - t0 )) -lt 1500 ] || { log "not ready after 1500 s"; exit 3; } + sleep 10 +done +log "ready after $(( SECONDS - t0 )) s; ${REQS} sequential requests" + +${PY} "${REPO}/bench/llm_load.py" --base-url "${base}" --model google/gemma-4-26B-A4B-it \ + --requests "${REQS}" --concurrency 1 --warmup 0 --max-tokens 256 --temperature 0 --unique-prompts \ + --ignore-eos --timeout 1800 --label "UNSCORED B1g stall diagnostic" --out "${OUT}/load.json" \ + >> "${OUT}/diag.log" 2>&1 & +CP=$! +${PY} "${D}/b1g_diag.py" watch "http://127.0.0.1:${PORT}" "${CG}" "${OUT}" "${CP}" "${ROOT}" +rc=$? +case ${rc} in + 0) log "no stall in ${REQS} requests" ;; + 1) log "stall recorded (stall.json)"; kill "${CP}" 2>/dev/null ;; + *) log "watch rc ${rc}" ;; +esac +wait "${CP}" 2>/dev/null +exit 0 diff --git a/bench/h54/diag/b1g_diag.py b/bench/h54/diag/b1g_diag.py new file mode 100755 index 00000000..dd194f4f --- /dev/null +++ b/bench/h54/diag/b1g_diag.py @@ -0,0 +1,253 @@ +#!/usr/bin/env python3 +"""b1g_diag.py: helpers for the UNSCORED B1g stall diagnostic (bench/h54/diag/b1g-stall.sh). + +Nothing here is a hold or an arm, and no hypothesis is scored from what it records. + + b1g_diag.py render DEPLOY.yaml OUTDIR + Reads B1g's committed render (the Deployment, its env ConfigMap and its chat-template + ConfigMap) and writes what `docker run` needs to start the same container outside k3d: + OUTDIR/env.list (docker --env-file), OUTDIR/args.json (the container args), + OUTDIR/templates/ (the mounted chat template) and OUTDIR/render.json (image, + securityContext, volumes, hostIPC, resources, as rendered). + b1g_diag.py snap PID OUTFILE + One per-thread table of every process in PID's tree (state, utime+stime ticks, CPU, + wchan, current syscall, voluntary/involuntary context switches, kernel stack). Run as root + for wchan/syscall/stack of another user's process. + b1g_diag.py watch URL CGROUP_CPU_STAT OUTDIR CLIENT_PID ROOT_PID + Polls URL/metrics every 5 s and the container's cgroup CPU. When a request is running and + vllm:generation_tokens_total has not moved for STALL_S (30 s), it records the stall, takes + two thread snapshots 10 s apart and a py-spy dump of every process in the tree, then keeps + polling until the container exits or 400 s after the stall began. It returns when the + client process ends with no stall, or after the stall record is complete. +""" +import json +import os +import re +import subprocess +import sys +import time +import urllib.request + +EXPECTED_IMAGE = ("vllm/vllm-openai-cpu:v0.24.0@sha256:" + "b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1") +STALL_S = float(os.environ.get("DIAG_STALL_S", "30")) +STEP_S = float(os.environ.get("DIAG_STEP_S", "5")) +AFTER_S = float(os.environ.get("DIAG_AFTER_S", "400")) +PYSPY = os.environ.get("DIAG_PYSPY", "") + + +def _docs(path): + import yaml + with open(path) as f: + return [d for d in yaml.safe_load_all(f) if d] + + +def render(deploy, outdir): + docs = _docs(deploy) + dep = next(d for d in docs if d.get("kind") == "Deployment") + spec = dep["spec"]["template"]["spec"] + (c,) = [c for c in spec["containers"] if c["name"] == "vllm"] + if c["image"] != EXPECTED_IMAGE: + raise SystemExit(f"render: image {c['image']!r} is not B1g's {EXPECTED_IMAGE!r}") + cms = {d["metadata"]["name"]: d.get("data") or {} for d in docs if d.get("kind") == "ConfigMap"} + env = {} + for ef in c.get("envFrom", []): + env.update(cms[ef["configMapRef"]["name"]]) + for e in c.get("env", []): + env[e["name"]] = e.get("value", "") + vols = {v["name"]: v for v in spec.get("volumes", [])} + tmpl = None + for m in c.get("volumeMounts", []): + v = vols[m["name"]] + if "configMap" in v and m["mountPath"] == "/workspace/vllm/examples": + tmpl = cms[v["configMap"]["name"]] + if not tmpl: + raise SystemExit("render: no chat-template ConfigMap mounted at /workspace/vllm/examples") + os.makedirs(os.path.join(outdir, "templates"), exist_ok=True) + for name, body in tmpl.items(): + with open(os.path.join(outdir, "templates", name), "w") as f: + f.write(body) + with open(os.path.join(outdir, "env.list"), "w") as f: + for k, v in env.items(): + if "\n" in str(v): + raise SystemExit(f"render: env {k} has a newline; --env-file cannot carry it") + f.write(f"{k}={v}\n") + with open(os.path.join(outdir, "args.json"), "w") as f: + json.dump([str(a) for a in c["args"]], f, indent=1) + with open(os.path.join(outdir, "render.json"), "w") as f: + json.dump({"image": c["image"], "securityContext": c.get("securityContext"), + "podSecurityContext": spec.get("securityContext"), "hostIPC": spec.get("hostIPC"), + "resources": c.get("resources"), "volumeMounts": c.get("volumeMounts"), + "volumes": spec.get("volumes"), "templates": sorted(tmpl)}, f, indent=1) + return env, c["args"] + + +def _read(path): + try: + with open(path) as f: + return f.read() + except OSError as e: + return f"<{e.__class__.__name__}>" + + +def tree(root): + """PIDs of root and all its descendants, from /proc/*/stat ppid.""" + kids = {} + for p in os.listdir("/proc"): + if not p.isdigit(): + continue + s = _read(f"/proc/{p}/stat") + m = re.match(r"\d+ \(.*\) \S (\d+)", s) + if m: + kids.setdefault(int(m.group(1)), []).append(int(p)) + out, todo = [], [int(root)] + while todo: + p = todo.pop() + out.append(p) + todo.extend(kids.get(p, [])) + return sorted(out) + + +def thread_rows(pid): + rows = [] + base = f"/proc/{pid}/task" + try: + tids = sorted(int(t) for t in os.listdir(base)) + except OSError: + return rows + for tid in tids: + t = f"{base}/{tid}" + stat = _read(f"{t}/stat") + m = re.match(r"\d+ \((.*)\) (\S) (.*)", stat) + if not m: + continue + f = m.group(3).split() # fields from ppid (field 4) on + status = _read(f"{t}/status") + vcs = re.search(r"^voluntary_ctxt_switches:\s+(\d+)", status, re.M) + ncs = re.search(r"^nonvoluntary_ctxt_switches:\s+(\d+)", status, re.M) + rows.append({ + "tid": tid, "comm": m.group(1), "state": m.group(2), + "ticks": int(f[10]) + int(f[11]), # utime + stime (fields 14, 15) + "cpu": int(f[35]), # processor (field 39) + "wchan": _read(f"{t}/wchan").strip(), + "syscall": _read(f"{t}/syscall").strip(), + "vcs": int(vcs.group(1)) if vcs else None, "ncs": int(ncs.group(1)) if ncs else None, + "stack": _read(f"{t}/stack").strip().splitlines()[:12], + }) + return rows + + +def snap(root, outfile): + procs = [] + for pid in tree(root): + procs.append({"pid": pid, "cmdline": _read(f"/proc/{pid}/cmdline").replace("\0", " ").strip(), + "comm": _read(f"/proc/{pid}/comm").strip(), "threads": thread_rows(pid)}) + rec = {"ts": time.time(), "root": int(root), "loadavg": _read("/proc/loadavg").strip(), + "pressure": {k: _read(f"/proc/pressure/{k}").strip() for k in ("cpu", "memory", "io")}, + "procs": procs} + with open(outfile, "w") as f: + json.dump(rec, f, indent=1) + return rec + + +def metrics(url): + with urllib.request.urlopen(url.rstrip("/") + "/metrics", timeout=10) as r: + text = r.read().decode() + def val(name): + tot, seen = 0.0, False + for line in text.splitlines(): + if line.startswith(name + "{") or line.startswith(name + " "): + tot += float(line.rsplit(" ", 1)[1]) + seen = True + return tot if seen else None + return {"gen": val("vllm:generation_tokens_total"), "running": val("vllm:num_requests_running")} + + +def cg_usage(path): + for line in _read(path).splitlines(): + if line.startswith("usage_usec"): + return int(line.split()[1]) + return None + + +def alive(pid): + """pid exists and is not a zombie (an exited child nobody has reaped yet).""" + m = re.match(r"\d+ \(.*\) (\S)", _read(f"/proc/{int(pid)}/stat")) + return bool(m) and m.group(1) not in ("Z", "X") + + +def _sudo_self(*args): + return subprocess.run(["sudo", "-n", sys.executable, os.path.abspath(__file__), *args], + capture_output=True, text=True, timeout=120) + + +def pyspy(pid, outfile): + if not PYSPY: + return "DIAG_PYSPY unset" + p = subprocess.run(["sudo", "-n", PYSPY, "dump", "--pid", str(pid), "--native", "--locals"], + capture_output=True, text=True, timeout=180) + with open(outfile, "w") as f: + f.write(f"# rc={p.returncode}\n{p.stdout}\n# stderr\n{p.stderr}") + return p.returncode + + +def watch(url, cgroup, outdir, client_pid, root_pid): + with open(os.path.join(outdir, "watch.jsonl"), "a") as log: + return _watch(log, url, cgroup, outdir, client_pid, root_pid) + + +def _watch(log, url, cgroup, outdir, client_pid, root_pid): + last_gen, last_change, last_cg, last_t = None, time.time(), cg_usage(cgroup), time.time() + stall = None + while True: + now = time.time() + try: + m = metrics(url) + except Exception as e: # the server going away is itself a record + m = {"gen": None, "running": None, "error": f"{e.__class__.__name__}: {e}"} + cg = cg_usage(cgroup) + cpu = None if (cg is None or last_cg is None) else (cg - last_cg) / 1e6 / max(now - last_t, 1e-6) + last_cg, last_t = cg, now + if m.get("gen") is not None and m["gen"] != last_gen: + last_gen, last_change = m["gen"], now + row = {"ts": now, **m, "container_cpu_s_per_s": cpu, "load1": _read("/proc/loadavg").split()[0]} + log.write(json.dumps(row) + "\n") + log.flush() + if stall is None and (m.get("running") or 0) >= 1 and now - last_change >= STALL_S: + stall = {"onset_ts": last_change, "detected_ts": now, "gen_tokens_at_onset": last_gen} + for i, gap in (("a", 0), ("b", 10)): + time.sleep(gap) + p = _sudo_self("snap", str(root_pid), os.path.join(outdir, f"threads-{i}.json")) + stall[f"snap_{i}_rc"] = p.returncode + for pid in tree(root_pid): + stall[f"pyspy_{pid}"] = pyspy(pid, os.path.join(outdir, f"pyspy-{pid}.txt")) + with open(os.path.join(outdir, "stall.json"), "w") as f: + json.dump(stall, f, indent=1) + if stall is not None and (not alive(root_pid) or now - stall["onset_ts"] >= AFTER_S): + stall["end_ts"], stall["container_alive_at_end"] = now, alive(root_pid) + with open(os.path.join(outdir, "stall.json"), "w") as f: + json.dump(stall, f, indent=1) + return 1 + if stall is None and not alive(client_pid): + with open(os.path.join(outdir, "nostall.json"), "w") as f: + json.dump({"ts": now, "gen_tokens": last_gen}, f) + return 0 + time.sleep(STEP_S) + + +def main(argv): + cmd = argv[1] if len(argv) > 1 else "" + if cmd == "render" and len(argv) == 4: + render(argv[2], argv[3]) + return 0 + if cmd == "snap" and len(argv) == 4: + snap(argv[2], argv[3]) + return 0 + if cmd == "watch" and len(argv) == 7: + return watch(*argv[2:7]) + print(__doc__, file=sys.stderr) + return 2 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/bench/h54/diag/test_b1g_diag.py b/bench/h54/diag/test_b1g_diag.py new file mode 100644 index 00000000..7a4e9f87 --- /dev/null +++ b/bench/h54/diag/test_b1g_diag.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python3 +"""Tests for bench/h54/diag/b1g_diag.py (the UNSCORED B1g stall diagnostic's helpers): the +render reproduces B1g's committed container (args, env, chat template), the thread snapshot +reads a live process tree, and the stall watcher records a stall against a stub server whose +token counter stops. No docker, no network beyond 127.0.0.1.""" +import hashlib +import http.server +import json +import os +import subprocess +import sys +import tempfile +import threading +import time +import unittest + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, HERE) +import b1g_diag # noqa: E402 + +DEPLOY = os.path.join(HERE, "..", "results", "2026-10-21", "H54a", "hold2", "B1g", "deploy.yaml") + +try: + import yaml + HAVE_YAML = True +except ImportError: + HAVE_YAML = False + + +@unittest.skipUnless(HAVE_YAML, "PyYAML not installed") +class Render(unittest.TestCase): + def test_render_matches_the_committed_deployment(self): + docs = [d for d in yaml.safe_load_all(open(DEPLOY)) if d] + dep = next(d for d in docs if d.get("kind") == "Deployment") + (c,) = dep["spec"]["template"]["spec"]["containers"] + with tempfile.TemporaryDirectory() as t: + env, args = b1g_diag.render(DEPLOY, t) + self.assertEqual(json.load(open(os.path.join(t, "args.json"))), [str(a) for a in c["args"]]) + lines = open(os.path.join(t, "env.list")).read().splitlines() + self.assertIn("VLLM_CPU_KVCACHE_SPACE=40", lines) + self.assertIn("VLLM_RPC_TIMEOUT=100000", lines) + self.assertIn("TRITON_CACHE_DIR=/tmp/.triton", lines) + self.assertFalse(any(ln.startswith("VLLM_CPU_OMP_THREADS_BIND=") for ln in lines)) + tmpl = os.path.join(t, "templates", "tool_chat_template_gemma4.jinja") + cm = next(d for d in docs if d.get("kind") == "ConfigMap" and "chat-templates" in d["metadata"]["name"]) + self.assertEqual(hashlib.sha256(open(tmpl, "rb").read()).hexdigest(), + hashlib.sha256(cm["data"]["tool_chat_template_gemma4.jinja"].encode()).hexdigest()) + r = json.load(open(os.path.join(t, "render.json"))) + self.assertIsNone(r["resources"]) + self.assertTrue(r["securityContext"]["readOnlyRootFilesystem"]) + self.assertEqual(r["securityContext"]["runAsUser"], 1001) + + def test_render_refuses_another_image(self): + with tempfile.TemporaryDirectory() as t: + bad = os.path.join(t, "deploy.yaml") + with open(bad, "w") as f: + f.write(open(DEPLOY).read().replace("b0e6f8604413a8bf", "0000000000000000")) + with self.assertRaises(SystemExit): + b1g_diag.render(bad, os.path.join(t, "out")) + + +class Snap(unittest.TestCase): + def test_snapshot_of_a_live_tree(self): + child = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(30)"]) + try: + with tempfile.TemporaryDirectory() as t: + rec = b1g_diag.snap(os.getpid(), os.path.join(t, "s.json")) + pids = [p["pid"] for p in rec["procs"]] + self.assertIn(os.getpid(), pids) + self.assertIn(child.pid, pids) + me = next(p for p in rec["procs"] if p["pid"] == os.getpid()) + self.assertTrue(me["threads"]) + th = me["threads"][0] + for k in ("tid", "state", "ticks", "cpu", "wchan", "syscall", "vcs", "ncs", "stack"): + self.assertIn(k, th) + finally: + child.kill() + child.wait() + + +class Stub(http.server.BaseHTTPRequestHandler): + gen = [0.0] + frozen = [False] + + def do_GET(self): + if not self.frozen[0]: + self.gen[0] += 10 + body = ("# HELP x\n" + f'vllm:generation_tokens_total{{model_name="m"}} {self.gen[0]}\n' + 'vllm:num_requests_running{model_name="m"} 1.0\n').encode() + self.send_response(200) + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def log_message(self, *a): + pass + + +class Watch(unittest.TestCase): + def setUp(self): + self.srv = http.server.ThreadingHTTPServer(("127.0.0.1", 0), Stub) + threading.Thread(target=self.srv.serve_forever, daemon=True).start() + self.url = f"http://127.0.0.1:{self.srv.server_address[1]}" + Stub.gen[0], Stub.frozen[0] = 0.0, False + + def tearDown(self): + self.srv.shutdown() + self.srv.server_close() + + def _watch(self, t, client, root): + b1g_diag.STALL_S, b1g_diag.STEP_S, b1g_diag.AFTER_S = 0.6, 0.2, 2.0 + b1g_diag._sudo_self = lambda *a: subprocess.CompletedProcess(a, 0) # no sudo in tests + b1g_diag.PYSPY = "" + return b1g_diag.watch(self.url, "/nonexistent/cpu.stat", t, client, root) + + def test_metrics_parse(self): + m = b1g_diag.metrics(self.url) + self.assertEqual(m["running"], 1.0) + self.assertGreater(m["gen"], 0) + + def test_frozen_counter_is_a_stall(self): + Stub.frozen[0] = True + with tempfile.TemporaryDirectory() as t: + rc = self._watch(t, os.getpid(), os.getpid()) + self.assertEqual(rc, 1) + s = json.load(open(os.path.join(t, "stall.json"))) + self.assertIn("onset_ts", s) + self.assertTrue(s["container_alive_at_end"]) + rows = [json.loads(x) for x in open(os.path.join(t, "watch.jsonl"))] + self.assertTrue(all(r["running"] == 1.0 for r in rows)) + + def test_moving_counter_ends_with_the_client(self): + client = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(1.5)"]) + with tempfile.TemporaryDirectory() as t: + rc = self._watch(t, client.pid, os.getpid()) + client.wait() + self.assertEqual(rc, 0) + self.assertTrue(os.path.exists(os.path.join(t, "nostall.json"))) + self.assertFalse(os.path.exists(os.path.join(t, "stall.json"))) + + +if __name__ == "__main__": + unittest.main() From 20ccb04d45add8b07c623ed6c64c1fa4f7d60b56 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:31:25 -0700 Subject: [PATCH 19/85] docs: H52b finding, no safe host-setup path for IAA on crescent On crescent iaa_crypto's kernel work queue claims all 256 WQ entries of iax1, iax3 and iax5, so no user work queue fits beside it. host-setup --apply leaves those devices alone, with or without --with-kernel-wqs, and prints a shrink suggestion that nothing runs (#203). That is in policy: --apply only adds, and the shrink cuts a kernel service's own queue, which the kernel's iaa-crypto document says needs an iaa_crypto reload to take effect, with compression after a resize never tested. The note records the live sysfs read (read-only), what host-setup --apply --with-kernel-wqs does on a fake root of that state (DSA and QAT configured, no IAA command), and the consequence: H52b's IAA clause cannot hold on this host while host-setup ships as it is. No code change and no ledger amendment. --- docs/intel/h52b-iaa.md | 87 ++++++++++++++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 2 files changed, 88 insertions(+) create mode 100644 docs/intel/h52b-iaa.md diff --git a/docs/intel/h52b-iaa.md b/docs/intel/h52b-iaa.md new file mode 100644 index 00000000..29543b13 --- /dev/null +++ b/docs/intel/h52b-iaa.md @@ -0,0 +1,87 @@ +# H52b finding: no safe host-setup path for IAA on crescent + +Recorded 2026-10-28 PDT, before any H52b step. Not a measurement and not a ledger +amendment. The [H52b pre-registration](../../EXPERIMENTS.md#h50-h52-pre-registration-the-xeon-6741p-2026-10-20) +and its [amendment D1](../../EXPERIMENTS.md#h52-amendment-d1-the-fixes-and-h52b-2026-10-20) +stay as written. + +## Finding + +On crescent (Xeon 6741P), `iaa_crypto`'s kernel work queue claims all 256 WQ entries +of each IAA device (iax1, iax3, iax5). No user work queue fits beside it. +`k3d-gpu host-setup --apply` leaves those devices alone, with or without +`--with-kernel-wqs`. It prints a shrink suggestion with its revert and runs nothing +for IAA. This is the design that main ships, and it is in policy. It is not a missing +path, so this change adds no code. + +Consequence: after `host-setup --apply` on this host, `host-setup` reports 0 IAA +devices configured and the node advertises no IAA resource. H52b's IAA clause needs +IAA allocatable > 0 at the count host-setup reports configuring. That clause cannot +hold on crescent while host-setup ships as it is. DSA and QAT do have an `--apply` +path (below). H58 clause (d) excuses an engine that H52b records as unusable on this +host. That record belongs in the H52b run section, not here. + +## Host state read + +Read 2026-10-29 05:17 UTC (2026-10-28 22:17 PDT). The read used `ssh crescent` and +plain `cat` of `/sys/bus/dsa/devices`, `/sys/module/zswap/parameters` and +`/proc/crypto`. It made no write. + +```text +kernel 7.0.0-31-generic +dsa0 dsa2 dsa4 state=disabled max_work_queues_size=256 pasid_enabled=1 (no WQ configured) +iax1 iax3 iax5 state=enabled max_work_queues_size=256 pasid_enabled=1 + wq1.0 wq3.0 wq5.0 size=256 state=enabled type=kernel name=iaa_crypto driver=crypto +zswap enabled=N compressor=lzo +/proc/crypto deflate-iaa: refcnt 1, selftest passed +/dev/iax, /dev/dsa: absent +accel-config: not on PATH and not in /usr/bin, /usr/local/bin, /usr/sbin, /usr/local/sbin, /bin, /sbin +``` + +This matches the H52 inventory and the [#198 pre-check](../../bench/eatflow/results/2026-10-21/H52b/roundtrip-iax1/README.md). + +## What host-setup does on that state + +The check used a fake root shaped like the read above: three DSA PFs disabled, three +IAA devices at 256 of 256, three QAT 4xxx PFs with 0 of 16 VFs, Ubuntu 26.04. On it, +`host-setup --apply --with-kernel-wqs` ran on main `6d5cab69` with `sudo` stubbed. +The plan had 8 commands, and the stub log shows what each did: + +- `apt-get install -y accel-config`, from the 26.04 archive. +- `modprobe vfio-pci`, and `sriov_numvfs` set to 16 on each QAT PF. +- On dsa0, dsa2 and dsa4: 1 engine, 1 group and 1 shared user WQ (threshold 15, + size 16), then the device and the WQ enabled. +- On iax1, iax3 and iax5: a `suggest:` line, its apply and its revert. No `iax` + command reached the stub. + +`tests/host_setup_test.sh` already asserts the IAA half: "crescent --apply runs +nothing (the IAA shrink is a suggestion only)". + +## Why the shrink is not applied + +1. **The rule.** The launcher never changes host configuration. `host-setup --apply` + runs the commands `doctor` prints, after a y/N prompt ([intel.md](../intel.md)). + Its idxd steps only add. Class `new` configures a device nobody configured. + Class `kernel` (#162, opt-in `--with-kernel-wqs`) puts a user WQ in unclaimed WQ + entries. It writes the kernel WQs back exactly as read. +2. **The shrink takes, it does not add.** It cuts `iaa_crypto`'s WQ from 256 to 240 + entries to free room for a 16-entry user WQ. That changes another owner's + configuration of a kernel service. #203 made it a suggestion that nothing runs, + `--with-kernel-wqs` included. #203 merged 2026-10-21, before any H52b step. +3. **The driver's own procedure needs a reload.** The kernel's IAA crypto document + says how to change the WQ attributes of `iaa_crypto`. First disable the devices and + WQs. Then remove and reinsert the `iaa_crypto` module, so that the new config is + applied to `deflate-iaa` + ([iaa-crypto.rst, v7.0](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/driver-api/crypto/iaa/iaa-crypto.rst?h=v7.0), + "IAA Default Configuration"). The shrink path does not reload the module. A reload + unregisters `deflate-iaa` for the whole host. The v7.0 driver source re-adds a WQ to + its table on every bind (`iaa_crypto_probe`), so a shrunk WQ may serve without a + reload. No one has tested that. +4. **No evidence that compression survives.** The #198 pre-check proved only that an + identical config round-trips byte for byte. It left `iaa_crypto` compression + UNVERIFIED. No host has run a shrink. + +Applying the shrink would first need its own pre-registered test. That test would run +the shrink and its revert on a host. It would show `deflate-iaa` compressing and +decompressing on the shrunk WQ, and the inventory restored after the revert. That is +outside this note. diff --git a/mkdocs.yml b/mkdocs.yml index 28409ba2..145dc566 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -52,6 +52,7 @@ nav: - Capacity oracle design: moat-design.md - Security audit: security-audit.md - Intel technical report: intel/technical-report.md + - H52b IAA finding: intel/h52b-iaa.md - Upstream draft (EAT/EAS): intel/upstream-eat.md - Development: - Branch consolidation: dev/consolidation.md From 42f1eadb28bcb0903e0a207dcfc2878d4b2342d0 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:36:07 -0700 Subject: [PATCH 20/85] H7x second review: a block that left no decode record is void and keeps its run-order place h7x.py built its block list only from the b--decode.json files present. A block whose workloads ran but whose bench/energy.sh exited before llm_load left no decode record, so it was dropped: it never counted as void and every later A block paired with the wrong B block. With rates drifting 4% per A block at A = 1.12 x B, deleting block 4's records moved the verdict from SUPPORTED to INCONCLUSIVE (pairs 1.120, 1.163, 1.161, 1.160). The block list now also comes from restarts.txt, which h7x.sh writes for every block whose workloads ran; such a block with no decode record has no ok request and is void, as the pre-registration's "void blocks counted in the order" requires. A regression test removes block 4's records and expects one void A block and the same four 1.12 pairs and verdict as the void-with-records case. The ledger's plugin sentence now cites smokes 2 and 3 (smoke 1's record has no pod listing; 4 and 5 show the plugin too), the decision rule names the no-record case, and the pre-registration header records this revision; no prediction changed. h7x.sh's header gives the prefill prompt as 56 copies of one sentence, about 1850 tokens, as the ledger and the code do. --- EXPERIMENTS.md | 19 ++++++++++++------- bench/apb/h7x.py | 29 ++++++++++++++++++----------- bench/apb/h7x.sh | 4 ++-- bench/apb/test_h7x.py | 23 ++++++++++++++++++++++- 4 files changed, 54 insertions(+), 21 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index dd017a3d..8341bb35 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -1659,9 +1659,11 @@ say nothing about the graded result. ### H7x pre-registration: H7 to its full protocol on the Xeon 6741P (2026-10-20) -Written 2026-10-20T23:10Z, revised 2026-10-21T21:10Z after six setup smokes and 2026-10-21T22:30Z after a review, before -any H7x measurement (the smokes started the engines and sent no request; see below). H7 keeps its -INCONCLUSIVE verdict on the i9-13900T. +Written 2026-10-20T23:10Z, revised 2026-10-21T21:10Z after six setup smokes, 2026-10-21T22:30Z +after a review and 2026-10-29T05:40Z after a second review (a block that left no decode record is +void and keeps its place in the run order; the plugin sentence cites only the smokes whose records +show it; no prediction changed), before any H7x measurement (the smokes started the engines and +sent no request; see below). H7 keeps its INCONCLUSIVE verdict on the i9-13900T. **Why.** H7's i9 run was short of its own pre-registration (3 and 2 blocks instead of 5 ABBA rounds, no `--enforce-eager`-dropped arm, no energy) and its decode gap (15.6% of vLLM's rate, @@ -1706,7 +1708,9 @@ pairs. r_k = ratio of their block medians. R_bw = R x (A weight bytes / B weight (either engine faster by 15% or more, consistently). - INCONCLUSIVE: anything else, or >= 2 void blocks or fewer than 4 valid blocks in A or B (a block is void when its decode phase has fewer than 5 ok requests, a request stops short of 256 - tokens or has no decode rate, or the serving pod restarted during the block, `restarts.txt`). + tokens or has no decode rate, or the serving pod restarted during the block, `restarts.txt`; a + block listed in `restarts.txt` with no decode record, as when its `bench/energy.sh` fails, has + no ok request and is void). - Reported, never gating: C/B decode, prefill TTFT and conc4 per arm, decode incremental J/token per arm. `bench/apb/h7x.py` applies this mechanically (unit tests in `bench/apb/test_h7x.py`). @@ -1738,9 +1742,10 @@ B not Ready in 900 s. Smoke 2 (23:36-00:07Z, order B C, `H7X_READY_S=1800`, 48 C diagnostics added to `h7x.sh`): B `OOMKilled` (exit 137) 9 times at its 16 GiB limit. Smoke 3 (2026-10-21 00:25-00:57Z, order A B C, 16 CPUs on 0-7,48-55): A ready in 28 s on 0-7,48-55; B OOMKilled again at 16 GiB (vLLM bound 8 OpenMP threads to cores 48-55), last log line the KV -allocation ("6.0/16.0 GiB for KV cache"). All three smokes also showed the node image's baked -`intel-gpu-plugin` DaemonSet running despite `K3D_GPU_VENDORS=none` (a launcher bug, fixed -separately); no pod requested a GPU, so no arm used one. This corrects X3 of the cross-host +allocation ("6.0/16.0 GiB for KV cache"). Smokes 2 and 3 (the first with pod diagnostics; smoke +1's record has no pod listing) also showed the node image's baked `intel-gpu-plugin` DaemonSet +running despite `K3D_GPU_VENDORS=none` (a launcher bug, fixed separately; smokes 4 and 5 show it +too); no pod requested a GPU, so no arm used one. This corrects X3 of the cross-host pre-registration, which said no GPU plugin is deployed. Smoke 4 (2026-10-21 03:14-03:47Z, order B C, 16 CPUs, `H7X_VLLM_MEM=32Gi`): B Ready in 112 s on 0-7,48-55; C restarted 9 times (exit 1) and was not Ready in 1800 s. The likely cause, not confirmed (the failed container's log was not diff --git a/bench/apb/h7x.py b/bench/apb/h7x.py index 1c66c8b9..d4a14ca6 100755 --- a/bench/apb/h7x.py +++ b/bench/apb/h7x.py @@ -5,10 +5,12 @@ b---energy.json and b--idle-energy.json (bench/energy.sh). E is A (OVMS fp16), B (vLLM CPU bf16, EAT chart defaults) or C (B without --enforce-eager). -A block is void when its decode phase has fewer than 5 ok requests, any request stopped short -of 256 output tokens or has no decode rate, or the engine's pod restarted during the block -(restarts.txt: "b "). With >= 2 void blocks, or fewer than 4 valid blocks (a hold cut -short by its cap), in arm A or B the run is INCONCLUSIVE. +The blocks are those listed in restarts.txt ("b ", one +line per block whose workloads ran) plus any with a decode record. A block is void when its decode +phase has fewer than 5 ok requests (none when it left no decode record), any request stopped short +of 256 output tokens or has no decode rate, or the engine's pod restarted during the block. With +>= 2 void blocks, or fewer than 4 valid blocks (a hold cut short by its cap), in arm A or B the +run is INCONCLUSIVE. Decision (pre-registered in H7x): R = median A decode tok/s / median B decode tok/s over every request of the valid blocks; gap(x) = max(x, 1/x) - 1. Blocks pair in run order: the k-th A @@ -44,26 +46,31 @@ def load(path): def restarts(run): - """{block: True} for blocks whose pod restarted (restarts.txt from h7x.sh).""" + """{block: (engine, restarted)} for every block whose workloads ran: h7x.sh writes + "b " to restarts.txt after each block's workloads.""" out = {} try: with open(os.path.join(run, "restarts.txt")) as f: for line in f: p = line.split() - if len(p) == 4 and p[0].startswith("b"): - out[int(p[0][1:])] = p[2] != p[3] + if len(p) >= 2 and re.fullmatch(r"b\d+", p[0]) and p[1] in ("A", "B", "C"): + out[int(p[0][1:])] = (p[1], len(p) == 4 and p[2] != p[3]) except OSError: pass return out def blocks(run): + """Blocks in run order: every block in restarts.txt or with a decode record. A block that ran + but left no decode record (its energy.sh failed before llm_load) is void, and keeps its place + in the run order.""" out, rs = [], restarts(run) + ran = {i: e for i, (e, _) in rs.items()} for p in glob.glob(os.path.join(run, "b*-*-decode.json")): m = re.match(r"b(\d+)-([ABC])-decode\.json$", os.path.basename(p)) - if not m: - continue - i, e = int(m.group(1)), m.group(2) + if m: + ran[int(m.group(1))] = m.group(2) + for i, e in ran.items(): rec = {"block": i, "engine": e} for w in ("decode", "prefill", "conc4"): d = load(os.path.join(run, f"b{i}-{e}-{w}.json")) @@ -73,7 +80,7 @@ def blocks(run): rec["idle"] = load(os.path.join(run, f"b{i}-{e}-idle-energy.json")) dec = [s for s in (rec["decode"] or {}).get("samples", []) if s.get("ok")] rec["decode_tps"] = [s["decode_tokens_per_s"] for s in dec if s.get("decode_tokens_per_s")] - rec["restarted"] = rs.get(i, False) + rec["restarted"] = rs.get(i, (e, False))[1] rec["void"] = (len(dec) < 5 or len(rec["decode_tps"]) < len(dec) or rec["restarted"] or any(s.get("output_tokens") != 256 for s in dec)) out.append(rec) diff --git a/bench/apb/h7x.sh b/bench/apb/h7x.sh index 6b8a78b2..d79e0670 100755 --- a/bench/apb/h7x.sh +++ b/bench/apb/h7x.sh @@ -5,8 +5,8 @@ # (B with --enforce-eager dropped). One server runs at a time. Per block, after 1 decode and # 1 prefill warm-up (excluded): bench/energy.sh over a 20 s model-loaded idle, then over each # workload through bench/llm_load.py: decode 5 x (default ~30-token prompt, 256 out), -# prefill 5 x (unique ~1936-token prompt, 16 out), conc4 8 x 128 out at 4 in flight; all -# greedy, ignore_eos, unique prompts. bench/apb/h7x.py scores the run. +# prefill 5 x (a unique prompt of 56 copies of one sentence, ~1850 tokens, 16 out), conc4 8 x 128 +# out at 4 in flight; all greedy, ignore_eos, unique prompts. bench/apb/h7x.py scores the run. # # Environment: # APB_MODELS dir with OpenVINO/Qwen3-4B-fp16-ov and Qwen/Qwen3-4B (bench/xhost/fetch_models.py) (required) diff --git a/bench/apb/test_h7x.py b/bench/apb/test_h7x.py index a5bef172..80081992 100644 --- a/bench/apb/test_h7x.py +++ b/bench/apb/test_h7x.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """Unit tests for bench/apb/h7x.py (the H7x decision rule). Stdlib only.""" +import glob import json import os import sys @@ -35,9 +36,14 @@ def write_run(d, tps, tokens=256, n=5, skip=(), void_blocks=(), no_rate_blocks=( json.dump({"joules": 9000.0, "seconds": 60.0}, open(os.path.join(d, f"b{i}-{e}-decode-energy.json"), "w")) -def run(tps, **kw): +def run(tps, unrecorded=(), **kw): + """unrecorded: blocks that ran (listed in restarts.txt) but left no workload records, as when + bench/energy.sh exits before starting llm_load.""" with tempfile.TemporaryDirectory() as d: write_run(d, tps, **kw) + for i in unrecorded: + for f in glob.glob(os.path.join(d, f"b{i}-*.json")): + os.remove(f) return h7x.score(h7x.blocks(d)) @@ -82,6 +88,21 @@ def test_pairs_follow_run_order_with_a_void_block(self): self.assertTrue(all(abs(r - 1.10) < 0.01 for r in v["pair_ratios"]), v["pair_ratios"]) self.assertEqual(v["verdict"], "SUPPORTED") + def test_block_that_left_no_records_is_void_and_keeps_its_place(self): + # Rates drift 4% per A block and A is 1.12x B in every run-order pair. Block 4 (A) ran + # (restarts.txt lists it) but its energy.sh failed, so it left no decode record. It must + # count as a void A block and drop pair (4,3), not vanish and shift A onto later B blocks. + a = [10.0, 10.4, 10.8, 11.2, 11.6] + b = [x / 1.12 for x in a] + gone = run({"A": a, "B": b, "C": b}, unrecorded=(4,)) + kept = run({"A": a, "B": b, "C": b}, void_blocks=(4,)) + self.assertEqual(gone["void"]["A"], 1) + self.assertIn({"block": 4, "engine": "A", "void": True, "decode_tps": []}, gone["blocks"]) + self.assertEqual(len(gone["pair_ratios"]), 4) + self.assertTrue(all(abs(r - 1.12) < 0.01 for r in gone["pair_ratios"]), gone["pair_ratios"]) + self.assertEqual(gone["pair_ratios"], kept["pair_ratios"]) + self.assertEqual((gone["verdict"], kept["verdict"]), ("SUPPORTED", "SUPPORTED")) + def test_block_without_decode_rates_is_void(self): v = run({"A": 20.0, "B": 18.5, "C": 18.5}, no_rate_blocks=(2,)) self.assertEqual(v["void"]["B"], 1) From 1b0c4e72070070e45dc0b7c4c40bf6047162398a Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:37:52 -0700 Subject: [PATCH 21/85] results(H54b, H54c): raw records of the 2026-10-21 Arc Pro B70 holds; B1g erratum The H54b holds 1-2 and H54c hold 1 records from crescent (~/k3dgpu-gemma/results/H54b, H54c and the campaign's run logs), byte-equal to the host's copies; logs over 20 kB gzipped, kubeconfigs left out. Beside the raw files, written after the holds: NOTES, the X1q and X1q-mtp runner-bug errata, and REPRODUCE-supplement.txt (host, driver, firmware, tools, GGUF sha256s). H54a hold2/B1g/ERRATUM.txt: sample 2 of load-n1.json stopped at 252 of 256 tokens when the engine died and was recorded ok; B1g completed 2 of 8 N=1 requests, not 3. The raw record is unchanged. --- .../2026-10-21/H54a/hold2/B1g/ERRATUM.txt | 15 + .../2026-10-21/H54b/NOTES-2026-10-21.txt | 25 + .../results/2026-10-21/H54b/arms-score.json | 7 + .../results/2026-10-21/H54b/hold1/REPRODUCE | 13 + .../2026-10-21/H54b/hold1/X1q.ERRATUM.txt | 8 + .../results/2026-10-21/H54b/hold1/X1q.log | 1 + .../2026-10-21/H54b/hold1/X1q.not-deliverable | 1 + .../results/2026-10-21/H54b/hold1/X1q.yaml | 111 ++++ .../results/2026-10-21/H54b/hold1/arms.log | 25 + .../results/2026-10-21/H54b/hold1/cluster.log | 30 + .../2026-10-21/H54b/hold1/gpu-hold.txt | 4 + .../2026-10-21/H54b/hold1/gpu-hold.yaml | 32 + .../results/2026-10-21/H54b/hold2/REPRODUCE | 14 + .../2026-10-21/H54b/hold2/X1q-mtp.ERRATUM.txt | 7 + .../2026-10-21/H54b/hold2/X1q-mtp.yaml | 0 .../results/2026-10-21/H54b/hold2/arms.log | 28 + .../results/2026-10-21/H54b/hold2/cluster.log | 29 + .../2026-10-21/H54b/hold2/gpu-hold.txt | 4 + .../2026-10-21/H54b/hold2/gpu-hold.yaml | 32 + .../results/2026-10-21/H54b/hold2/lsq.boot_s | 1 + .../results/2026-10-21/H54b/hold2/lsq.dri | 10 + .../2026-10-21/H54b/hold2/lsq.gpu-energy | 2 + .../2026-10-21/H54b/hold2/lsq.gsm8k.json | 409 ++++++++++++ .../H54b/hold2/lsq.idle-energy.json | 1 + .../results/2026-10-21/H54b/hold2/lsq.log.gz | Bin 0 -> 23068 bytes .../2026-10-21/H54b/hold2/lsq.n1-energy.json | 1 + .../results/2026-10-21/H54b/hold2/lsq.n1.json | 212 +++++++ .../2026-10-21/H54b/hold2/lsq.n16-energy.json | 1 + .../2026-10-21/H54b/hold2/lsq.n16.json | 596 ++++++++++++++++++ .../2026-10-21/H54b/hold2/lsq.n4-energy.json | 1 + .../results/2026-10-21/H54b/hold2/lsq.n4.json | 340 ++++++++++ .../results/2026-10-21/H54b/hold2/lsq.pf.log | 148 +++++ .../2026-10-21/H54b/hold2/lsq.smoke.json | 1 + .../2026-10-21/H54b/hold2/lsq.ttft.json | 148 +++++ .../results/2026-10-21/H54b/hold2/lsq.yaml | 19 + .../h54gpu/results/2026-10-21/H54b/score.json | 23 + .../2026-10-21/H54b/smoke-hold1/REPRODUCE | 13 + .../2026-10-21/H54b/smoke-hold1/X1q.yaml | 107 ++++ .../H54b/smoke-hold1/allocatable.json | 1 + .../2026-10-21/H54b/smoke-hold1/arms.log | 14 + .../2026-10-21/H54b/smoke-hold1/cluster.log | 30 + .../2026-10-21/H54b/smoke-hold1/gpu-hold.txt | 4 + .../2026-10-21/H54b/smoke-hold1/gpu-hold.yaml | 32 + .../H54b/xe_clients-2105-2202Z.json | 1 + .../H54b/xe_vram_used_bytes-2105-2202Z.json | 1 + .../H54c/hold1/NOTES-2026-10-21.txt | 7 + .../results/2026-10-21/H54c/hold1/REPRODUCE | 11 + .../results/2026-10-21/H54c/hold1/arms.log | 30 + .../results/2026-10-21/H54c/hold1/bytes.json | 12 + .../results/2026-10-21/H54c/hold1/cg.boot_s | 1 + .../results/2026-10-21/H54c/hold1/cg.dri | 10 + .../results/2026-10-21/H54c/hold1/cg.fuser | 17 + .../2026-10-21/H54c/hold1/cg.gpu-energy | 2 + .../2026-10-21/H54c/hold1/cg.idle-energy.json | 1 + .../results/2026-10-21/H54c/hold1/cg.log | 132 ++++ .../2026-10-21/H54c/hold1/cg.n1-energy.json | 1 + .../results/2026-10-21/H54c/hold1/cg.n1.json | 208 ++++++ .../results/2026-10-21/H54c/hold1/cg.pf.log | 35 + .../2026-10-21/H54c/hold1/cg.smoke.json | 1 + .../results/2026-10-21/H54c/hold1/cg.yaml | 15 + .../results/2026-10-21/H54c/hold1/cluster.log | 18 + .../results/2026-10-21/H54c/hold1/gg.boot_s | 1 + .../results/2026-10-21/H54c/hold1/gg.dri | 10 + .../results/2026-10-21/H54c/hold1/gg.fuser | 17 + .../2026-10-21/H54c/hold1/gg.gpu-energy | 2 + .../2026-10-21/H54c/hold1/gg.idle-energy.json | 1 + .../results/2026-10-21/H54c/hold1/gg.log | 120 ++++ .../2026-10-21/H54c/hold1/gg.n1-energy.json | 1 + .../results/2026-10-21/H54c/hold1/gg.n1.json | 208 ++++++ .../results/2026-10-21/H54c/hold1/gg.pf.log | 24 + .../2026-10-21/H54c/hold1/gg.smoke.json | 1 + .../results/2026-10-21/H54c/hold1/gg.yaml | 15 + .../results/2026-10-21/H54c/hold1/gg2.boot_s | 1 + .../results/2026-10-21/H54c/hold1/gg2.dri | 10 + .../results/2026-10-21/H54c/hold1/gg2.fuser | 17 + .../2026-10-21/H54c/hold1/gg2.gpu-energy | 2 + .../H54c/hold1/gg2.idle-energy.json | 1 + .../results/2026-10-21/H54c/hold1/gg2.log | 120 ++++ .../2026-10-21/H54c/hold1/gg2.n1-energy.json | 1 + .../results/2026-10-21/H54c/hold1/gg2.n1.json | 208 ++++++ .../results/2026-10-21/H54c/hold1/gg2.pf.log | 24 + .../2026-10-21/H54c/hold1/gg2.smoke.json | 1 + .../results/2026-10-21/H54c/hold1/gg2.yaml | 15 + .../results/2026-10-21/H54c/hold1/hg.boot_s | 1 + .../results/2026-10-21/H54c/hold1/hg.dri | 10 + .../results/2026-10-21/H54c/hold1/hg.fuser | 17 + .../2026-10-21/H54c/hold1/hg.gpu-energy | 2 + .../2026-10-21/H54c/hold1/hg.idle-energy.json | 1 + .../results/2026-10-21/H54c/hold1/hg.log | 122 ++++ .../2026-10-21/H54c/hold1/hg.n1-energy.json | 1 + .../results/2026-10-21/H54c/hold1/hg.n1.json | 208 ++++++ .../results/2026-10-21/H54c/hold1/hg.pf.log | 24 + .../2026-10-21/H54c/hold1/hg.smoke.json | 1 + .../results/2026-10-21/H54c/hold1/hg.yaml | 15 + .../2026-10-21/H54c/hold1/verdict.json | 16 + .../H54c/hold1/xe_clients-2105-2202Z.json | 1 + .../hold1/xe_vram_used_bytes-2105-2202Z.json | 1 + .../H54c/smoke-hold1-failed-sa/arms.log | 6 + .../H54c/smoke-hold1-failed-sa/bytes.json | 12 + .../H54c/smoke-hold1-failed-sa/cg.log | 1 + .../H54c/smoke-hold1-failed-sa/cg.yaml | 15 + .../H54c/smoke-hold1-failed-sa/cluster.log | 18 + .../H54c/smoke-hold1-failed-sa/verdict.json | 13 + .../2026-10-21/H54c/smoke-hold1/arms.log | 9 + .../2026-10-21/H54c/smoke-hold1/bytes.json | 12 + .../2026-10-21/H54c/smoke-hold1/cg.boot_s | 1 + .../2026-10-21/H54c/smoke-hold1/cg.dri | 10 + .../2026-10-21/H54c/smoke-hold1/cg.fuser | 33 + .../2026-10-21/H54c/smoke-hold1/cg.gpu-energy | 2 + .../H54c/smoke-hold1/cg.idle-energy.json | 1 + .../2026-10-21/H54c/smoke-hold1/cg.log | 123 ++++ .../H54c/smoke-hold1/cg.n1-energy.json | 1 + .../2026-10-21/H54c/smoke-hold1/cg.n1.json | 208 ++++++ .../2026-10-21/H54c/smoke-hold1/cg.pf.log | 19 + .../2026-10-21/H54c/smoke-hold1/cg.smoke.json | 1 + .../2026-10-21/H54c/smoke-hold1/cg.yaml | 15 + .../2026-10-21/H54c/smoke-hold1/cluster.log | 18 + .../2026-10-21/H54c/smoke-hold1/verdict.json | 13 + .../2026-10-21/REPRODUCE-supplement.txt | 25 + .../2026-10-21/runs/H54b-hold1/hold.log | 4 + .../2026-10-21/runs/H54b-hold1/post.txt | 16 + .../2026-10-21/runs/H54b-hold1/pre.txt | 16 + .../results/2026-10-21/runs/H54b-hold1/rc | 1 + .../2026-10-21/runs/H54b-hold1/serving.jsonl | 14 + .../results/2026-10-21/runs/H54b-hold1/wait_s | 1 + .../2026-10-21/runs/H54b-hold2/hold.log | 6 + .../2026-10-21/runs/H54b-hold2/post.txt | 16 + .../2026-10-21/runs/H54b-hold2/pre.txt | 16 + .../results/2026-10-21/runs/H54b-hold2/rc | 1 + .../runs/H54b-hold2/serving.jsonl.gz | Bin 0 -> 3070 bytes .../results/2026-10-21/runs/H54b-hold2/wait_s | 1 + .../results/2026-10-21/runs/H54b-smoke1.out | 4 + .../2026-10-21/runs/H54b-smoke1/hold.log | 3 + .../2026-10-21/runs/H54b-smoke1/post.txt | 16 + .../2026-10-21/runs/H54b-smoke1/pre.txt | 16 + .../results/2026-10-21/runs/H54b-smoke1/rc | 1 + .../2026-10-21/runs/H54b-smoke1/serving.jsonl | 11 + .../2026-10-21/runs/H54b-smoke1/wait_s | 1 + .../2026-10-21/runs/H54c-hold1/hold.log | 10 + .../2026-10-21/runs/H54c-hold1/post.txt | 16 + .../2026-10-21/runs/H54c-hold1/pre.txt | 16 + .../results/2026-10-21/runs/H54c-hold1/rc | 1 + .../runs/H54c-hold1/serving.jsonl.gz | Bin 0 -> 3148 bytes .../results/2026-10-21/runs/H54c-hold1/wait_s | 1 + .../runs/H54c-smoke1-failed-sa/hold.log | 4 + .../runs/H54c-smoke1-failed-sa/post.txt | 16 + .../runs/H54c-smoke1-failed-sa/pre.txt | 16 + .../2026-10-21/runs/H54c-smoke1-failed-sa/rc | 1 + .../runs/H54c-smoke1-failed-sa/serving.jsonl | 3 + .../runs/H54c-smoke1-failed-sa/wait_s | 1 + .../results/2026-10-21/runs/H54c-smoke1.out | 4 + .../results/2026-10-21/runs/H54c-smoke2.out | 5 + .../2026-10-21/runs/H54c-smoke2/hold.log | 4 + .../2026-10-21/runs/H54c-smoke2/post.txt | 16 + .../2026-10-21/runs/H54c-smoke2/pre.txt | 16 + .../results/2026-10-21/runs/H54c-smoke2/rc | 1 + .../2026-10-21/runs/H54c-smoke2/serving.jsonl | 21 + .../2026-10-21/runs/H54c-smoke2/wait_s | 1 + bench/h54gpu/results/2026-10-21/runs/arms.log | 3 + .../results/2026-10-21/runs/campaign.log | 30 + .../2026-10-21/runs/fetch-qwen-bf16.out | 1 + .../2026-10-21/runs/h54bc-campaign.out | 20 + .../results/2026-10-21/runs/h54bc-predisk.txt | 1 + 163 files changed, 5131 insertions(+) create mode 100644 bench/h54/results/2026-10-21/H54a/hold2/B1g/ERRATUM.txt create mode 100644 bench/h54gpu/results/2026-10-21/H54b/NOTES-2026-10-21.txt create mode 100644 bench/h54gpu/results/2026-10-21/H54b/arms-score.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold1/REPRODUCE create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.ERRATUM.txt create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.log create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.not-deliverable create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold1/arms.log create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold1/cluster.log create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold1/gpu-hold.txt create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold1/gpu-hold.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/REPRODUCE create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/X1q-mtp.ERRATUM.txt create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/X1q-mtp.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/arms.log create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/cluster.log create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/gpu-hold.txt create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/gpu-hold.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.boot_s create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.dri create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.gpu-energy create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.gsm8k.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.idle-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.log.gz create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n1-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n1.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n16-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n16.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n4-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n4.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.pf.log create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.smoke.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.ttft.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54b/score.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/REPRODUCE create mode 100644 bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/X1q.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/allocatable.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/arms.log create mode 100644 bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/cluster.log create mode 100644 bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/gpu-hold.txt create mode 100644 bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/gpu-hold.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54b/xe_clients-2105-2202Z.json create mode 100644 bench/h54gpu/results/2026-10-21/H54b/xe_vram_used_bytes-2105-2202Z.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/NOTES-2026-10-21.txt create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/REPRODUCE create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/arms.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/bytes.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.boot_s create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.dri create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.fuser create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.gpu-energy create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.idle-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.n1-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.n1.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.pf.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.smoke.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cg.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/cluster.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.boot_s create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.dri create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.fuser create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.gpu-energy create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.idle-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.n1-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.n1.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.pf.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.smoke.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.boot_s create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.dri create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.fuser create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.gpu-energy create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.idle-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.n1-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.n1.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.pf.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.smoke.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.boot_s create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.dri create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.fuser create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.gpu-energy create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.idle-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.n1-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.n1.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.pf.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.smoke.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/hg.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/verdict.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/xe_clients-2105-2202Z.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/hold1/xe_vram_used_bytes-2105-2202Z.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/arms.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/bytes.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cg.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cg.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cluster.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/verdict.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/arms.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/bytes.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.boot_s create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.dri create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.fuser create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.gpu-energy create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.idle-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.n1-energy.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.n1.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.pf.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.smoke.json create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.yaml create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cluster.log create mode 100644 bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/verdict.json create mode 100644 bench/h54gpu/results/2026-10-21/REPRODUCE-supplement.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold1/hold.log create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold1/post.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold1/pre.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold1/rc create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold1/serving.jsonl create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold1/wait_s create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold2/hold.log create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold2/post.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold2/pre.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold2/rc create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold2/serving.jsonl.gz create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-hold2/wait_s create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-smoke1.out create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-smoke1/hold.log create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-smoke1/post.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-smoke1/pre.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-smoke1/rc create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-smoke1/serving.jsonl create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54b-smoke1/wait_s create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-hold1/hold.log create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-hold1/post.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-hold1/pre.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-hold1/rc create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-hold1/serving.jsonl.gz create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-hold1/wait_s create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/hold.log create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/post.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/pre.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/rc create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/serving.jsonl create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/wait_s create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke1.out create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke2.out create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/hold.log create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/post.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/pre.txt create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/rc create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/serving.jsonl create mode 100644 bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/wait_s create mode 100644 bench/h54gpu/results/2026-10-21/runs/arms.log create mode 100644 bench/h54gpu/results/2026-10-21/runs/campaign.log create mode 100644 bench/h54gpu/results/2026-10-21/runs/fetch-qwen-bf16.out create mode 100644 bench/h54gpu/results/2026-10-21/runs/h54bc-campaign.out create mode 100644 bench/h54gpu/results/2026-10-21/runs/h54bc-predisk.txt diff --git a/bench/h54/results/2026-10-21/H54a/hold2/B1g/ERRATUM.txt b/bench/h54/results/2026-10-21/H54a/hold2/B1g/ERRATUM.txt new file mode 100644 index 00000000..0c25eb0a --- /dev/null +++ b/bench/h54/results/2026-10-21/H54a/hold2/B1g/ERRATUM.txt @@ -0,0 +1,15 @@ +Erratum, found in review on 2026-10-21 after #191, landed 2026-10-28. load-n1.json is left as recorded. + +Sample index 2 of load-n1.json reads ok=true, finished=true, but it did not complete. It stopped at +252 of 256 content chunks after 314.0 s with output_tokens=null (chunks 254: the role chunk, 252 +content chunks and one more with no content and no usage). The engine dump in server.log.gz agrees +(num_output_tokens=[252]), and the API server logged "Error in chat completion stream generator": +vLLM ended the stream with an error chunk and [DONE] when its engine died. bench/llm_load.py then +counted any stream with content as ok. So B1g completed 2 of 8 N=1 requests in hold 2 (decode 17.92 +and 18.17 tok/s), not 3. + +bench/llm_load.py now records finish_reason and marks a stream that carries an error object, or ends +without a finish_reason, as an error (tests/bench_test.sh: load_engine_death, load_cut_stream). The +verdict does not change: B1g's status is failed under amendment R3, and its N=1 median already used +only the 2 rates. Any ratio over these 2 rates is descriptive only, with no interval (EXPERIMENTS.md, +H54a run, corrections). diff --git a/bench/h54gpu/results/2026-10-21/H54b/NOTES-2026-10-21.txt b/bench/h54gpu/results/2026-10-21/H54b/NOTES-2026-10-21.txt new file mode 100644 index 00000000..8d458309 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/NOTES-2026-10-21.txt @@ -0,0 +1,25 @@ +H54b run notes (written after the holds, 2026-10-21 ~22:05Z). Raw records untouched. +Campaign: CARDS=2,3 STOP_BHR=1 bench/h54gpu/campaign.sh "1:X1q" "f:Intel/Qwen3.8-27B-q4km-AutoRound:4b30b30e0ac2cc54a2f50738cfccd6c608f94ad4:24.7" "2:X1q-mtp Lsq" "c1:2" +at k3d-gpu 9f81e008 (origin/main bench/h54gpu head). Lock taken 21:12:26Z, released ~21:59Z. +qwen38-b-hr stopped 21:12:32Z, restarted, chat answered 21:58:57Z (77 s after start). + +Not deliverable (disk), never started: B2q, Sq, Sq-mtp need Qwen/Qwen3.8-27B @1d4bf0f2 (55.6 GB + 25 GB guard = 80.6 GB); +headroom under the 96% line at 21:07Z was 75.9 GB (df -B1: used 3499624255488 of 3724393213952). Rq: RedHat INT4 19.5 + 45 GB +guard = 64.5 GB > 57 GB headroom left after the q4km fetch. Not fetched. + +X1q (hold 1): runner bug. bench/h54gpu/h54b.sh run_agent calls kubectl rollout status / port-forward / exec / logs +without -n k3d-gpu-agent; k3d-gpu agent manifest now puts the deployment in namespace k3d-gpu-agent. +rollout status failed in 1 s ("deployments.apps ovms not found in namespace default"). X1q.not-deliverable says +"not deliverable in 900 s": wrong text, the engine was never waited on. +X1q-mtp (hold 2): second runner bug. "${2:+K3D_GPU_AGENT_PREFIX_CACHING=false}" expands to a word, not an +assignment: "K3D_GPU_AGENT_PREFIX_CACHING=false: command not found"; manifest not rendered. + +Lsq (hold 2): ran, but NOT on one card. The privileged pinned pod saw every render node (lsq.dri lists card0-4, +renderD128-131: the emptyDir over /dev/dri did not hide them). llama.cpp SYCL split the Q4_K_M model across all four +B70s: xe_vram_used_bytes (prometheus, saved here) rose 21:25-21:38Z by ~3.5 GB on card1 and card2 (bdf 12:00.0, +48:00.0 = qwen38-a-hr cards) and ~5.9/6.4 GB on card3/card4. So Lsq is a 4-card layer-split run sharing two +cards with live qwen38-a-hr: descriptive only, not a one-card arm. lsq.gpu-energy reads card 2 only. +qwen38-a-hr logged no errors and its VRAM returned to baseline afterwards. + +Score (score.py on arms-score.json): INCONCLUSIVE, no gate reference (B2q and Sq not deliverable). +H54b cap (2 holds) is used up. diff --git a/bench/h54gpu/results/2026-10-21/H54b/arms-score.json b/bench/h54gpu/results/2026-10-21/H54b/arms-score.json new file mode 100644 index 00000000..121b1ac5 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/arms-score.json @@ -0,0 +1,7 @@ +{"B2q": {"run": null, "correct": null, "rank": 1, "cards": 2}, + "Sq": {"run": null, "correct": null, "rank": 1, "cards": 1}, + "Sq-mtp": {"run": null, "correct": null, "rank": 1, "cards": 1}, + "Rq": {"run": null, "correct": null, "rank": 2, "cards": 1}, + "X1q": {"run": null, "correct": null, "rank": 1, "cards": 1}, + "X1q-mtp": {"run": null, "correct": null, "rank": 1, "cards": 1}, + "Lsq": {"run": "hold2/lsq.n1.json", "correct": 48, "rank": 1, "cards": 4}} diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold1/REPRODUCE b/bench/h54gpu/results/2026-10-21/H54b/hold1/REPRODUCE new file mode 100644 index 00000000..7da3cec7 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold1/REPRODUCE @@ -0,0 +1,13 @@ +# Reproduce (EXPERIMENTS.md, H54 pre-registration and amendment G1) +date: 2026-10-21T21:12:53Z host: 905a08313800 +commit: 9f81e00853c9676b6787ba333a675c69a2a7d890 +command: cd /home/devcloud/k3dgpu-gemma/k3d-gpu && CARDS=2,3 bash bench/h54gpu/hold.sh 2400 bash bench/h54gpu/h54b.sh 1 X1q +node image: cryptoandcoffee/k3d-gpu:0.1.61@sha256:8cd264aa68c77681d7fa474693944de0db8d55de5881253e4029bf72a67e175c +image: openvino/model_server:2026.4.1-gpu@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 +image: ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba73574a1e12cd237c88b512c8bb39ba6f703e873912b76cb8988a81bd +image: intel/llm-scaler-vllm:1.5@sha256:52218ad85513ab6686d4c090c83c2bd8c5b02423c63aa4dabd41837fe641fe3b +image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e +model: edff62728a3c79ec541983b86a21674500e0f05b +model: google/gemma-4-26B-A4B-it-qat-q4_0-gguf d1c082be9cf3c8a514acf63b8761f4b41935842e +model: google/gemma-4-26B-A4B-it-qat-q4_0-unquantized-assistant 9537141506fe8875b3ed45b264af13580cb29166 +model: google/gemma-4-26B-A4B-it-qat-q4_0-unquantized f1e06dc520982d9b9edd76859fdb7ab209449949 diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.ERRATUM.txt b/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.ERRATUM.txt new file mode 100644 index 00000000..4b09fa46 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.ERRATUM.txt @@ -0,0 +1,8 @@ +Erratum, written 2026-10-21 after the hold. X1q.not-deliverable is left as recorded. + +X1q.not-deliverable says "not deliverable in 900 s". That text is wrong. OVMS was never waited on. +Cause: a runner bug. bench/h54gpu/h54b.sh run_agent calls kubectl rollout status, port-forward, +exec and logs without -n k3d-gpu-agent. `k3d-gpu agent manifest` puts the deployment in namespace +k3d-gpu-agent, so rollout status failed after 1 s (X1q.log: deployments.apps "ovms" not found in +namespace "default"; arms.log: arm started 21:14:41Z, recorded not deliverable 21:14:42Z). +This is not an OVMS or B70 result. diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.log b/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.log new file mode 100644 index 00000000..f2b7442c --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.log @@ -0,0 +1 @@ +error: error from server (NotFound): deployments.apps "ovms" not found in namespace "default" diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.not-deliverable b/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.not-deliverable new file mode 100644 index 00000000..534e7052 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.not-deliverable @@ -0,0 +1 @@ +not deliverable in 900 s diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.yaml b/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.yaml new file mode 100644 index 00000000..bb915f86 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold1/X1q.yaml @@ -0,0 +1,111 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +# Models and the compiled-model cache live here, so restarts never re-download. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ovms-models + namespace: k3d-gpu-agent +spec: + accessModes: [ReadWriteOnce] + resources: + requests: + storage: 40Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: GPU + k3d-gpu.io/agent-fit: "gpu 6x32768" + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + supplementalGroups: [990] + nodeSelector: + gpu.intel.com/xmx: "true" + initContainers: + # --pull downloads the model once and writes its graph.pbtxt (device, + # parsers). On later starts the files are already there and only the + # graph is rewritten, so a device change takes effect with no download. + - name: pull + image: openvino/model_server:2026.4.1-gpu@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3.8-27B-int4-ov + - --model_repository_path=/models + - --model_name=m + - --task=text_generation + - --target_device=GPU + - --max_num_seqs=6 + - --cache_size=12 + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server:2026.4.1-gpu@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3.8-27B-int4-ov + - --model_name=m + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + # No liveness probe: compiling a model for a GPU takes minutes. + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: "2" + memory: 19Gi + limits: + memory: 19Gi + gpu.intel.com/xe: 1 + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + persistentVolumeClaim: + claimName: ovms-models +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold1/arms.log b/bench/h54gpu/results/2026-10-21/H54b/hold1/arms.log new file mode 100644 index 00000000..526bb453 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold1/arms.log @@ -0,0 +1,25 @@ +== H54b hold 1 cards 2,3 arms X1q 2026-10-21T21:12:54Z +pod/gpu-hold-0 created +pod/gpu-hold-1 created +pod/gpu-hold-2 created +pod/gpu-hold-3 created +pod/gpu-hold-0 condition met +pod/gpu-hold-1 condition met +pod/gpu-hold-2 condition met +pod/gpu-hold-3 condition met +pod "gpu-hold-2" deleted from default namespace +pod "gpu-hold-3" deleted from default namespace +== device-plugin arms: allowed (gpu-hold-0: renderD128 gpu-hold-1: renderD129 gpu-hold-2: renderD130 gpu-hold-3: renderD131) 2026-10-21T21:14:41Z +== arm X1q 2026-10-21T21:14:41Z +==> fit: OpenVINO/Qwen3.8-27B-int4-ov on 1 GPU via ovms, context 32768 x 6 seqs, GPU 28.5 GiB/card, host 16.6 GiB (pod limit 19Gi), host reserve 50.3 GiB +==> agent: OpenVINO/Qwen3.8-27B-int4-ov as 'm' on GPU (gpu.intel.com/xe), 2 CPU(s) +namespace/k3d-gpu-agent created +persistentvolumeclaim/ovms-models created +deployment.apps/ovms created +service/ovms created +Error from server (NotFound): deployments.apps "ovms" not found +== arm X1q not deliverable 2026-10-21T21:14:42Z +namespace "k3d-gpu-agent" deleted +persistentvolumeclaim "ovms-models" deleted from k3d-gpu-agent namespace +deployment.apps "ovms" deleted from k3d-gpu-agent namespace +service "ovms" deleted from k3d-gpu-agent namespace diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold1/cluster.log b/bench/h54gpu/results/2026-10-21/H54b/hold1/cluster.log new file mode 100644 index 00000000..e7420db9 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold1/cluster.log @@ -0,0 +1,30 @@ +WARN: present but disabled: DSA dsa0 dsa2 dsa4, QAT 0000:01:00.0 0000:06:00.0 0000:0b:00.0 (no user work queues / VFs), so not in the cluster — enable them: k3d-gpu host-setup --apply, then k3d-gpu down && k3d-gpu up (exact commands: k3d-gpu doctor) +==> Accelerators: intel amx +==> Experimental features (auto): dra image-volume +==> Creating k3d cluster 'k3dgpu-g-h54b-1' with image cryptoandcoffee/k3d-gpu:0.1.61@sha256:8cd264aa68c77681d7fa474693944de0db8d55de5881253e4029bf72a67e175c... +INFO[0000] Prep: Network +INFO[0000] Created network 'k3d-k3dgpu-g-h54b-1' +INFO[0000] Created image volume k3d-k3dgpu-g-h54b-1-images +INFO[0000] Starting new tools node... +INFO[0000] Starting node 'k3d-k3dgpu-g-h54b-1-tools' +INFO[0001] Creating node 'k3d-k3dgpu-g-h54b-1-server-0' +INFO[0001] Using the k3d-tools node to gather environment information +INFO[0001] HostIP: using network gateway 172.19.0.1 address +INFO[0001] Starting cluster 'k3dgpu-g-h54b-1' +INFO[0001] Starting servers... +INFO[0001] Starting node 'k3d-k3dgpu-g-h54b-1-server-0' +INFO[0004] All agents already running. +INFO[0004] All helpers already running. +INFO[0004] Injecting records for hostAliases (incl. host.k3d.internal) and for 1 network members into CoreDNS configmap... +INFO[0006] Cluster 'k3dgpu-g-h54b-1' created successfully! +INFO[0006] You can now use it like this: +kubectl cluster-info +==> Waiting for nodes Ready... +node/k3d-k3dgpu-g-h54b-1-server-0 condition met +==> Waiting for cluster DNS (CoreDNS)... +==> intel device plugin auto-deployed by k3s. +==> Verifying accelerators are schedulable... +Waiting for daemon set "intel-gpu-plugin" rollout to finish: 0 of 1 updated pods are available... +daemon set "intel-gpu-plugin" successfully rolled out +WARN: present but disabled: DSA dsa0 dsa2 dsa4, QAT 0000:01:00.0 0000:06:00.0 0000:0b:00.0 (no user work queues / VFs), so not in the cluster — enable them: k3d-gpu host-setup --apply, then k3d-gpu down && k3d-gpu up (exact commands: k3d-gpu doctor) +==> Accelerators schedulable: intel=4 amx=1. Try: k3d-gpu test diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold1/gpu-hold.txt b/bench/h54gpu/results/2026-10-21/H54b/hold1/gpu-hold.txt new file mode 100644 index 00000000..0c78d4ab --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold1/gpu-hold.txt @@ -0,0 +1,4 @@ +gpu-hold-0: renderD128 +gpu-hold-1: renderD129 +gpu-hold-2: renderD130 +gpu-hold-3: renderD131 diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold1/gpu-hold.yaml b/bench/h54gpu/results/2026-10-21/H54b/hold1/gpu-hold.yaml new file mode 100644 index 00000000..15c0570f --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold1/gpu-hold.yaml @@ -0,0 +1,32 @@ +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-0} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-1} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-2} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-3} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/REPRODUCE b/bench/h54gpu/results/2026-10-21/H54b/hold2/REPRODUCE new file mode 100644 index 00000000..a54f209e --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/REPRODUCE @@ -0,0 +1,14 @@ +# Reproduce (EXPERIMENTS.md, H54 pre-registration and amendment G1) +date: 2026-10-21T21:17:58Z host: 905a08313800 +commit: 9f81e00853c9676b6787ba333a675c69a2a7d890 +command: cd /home/devcloud/k3dgpu-gemma/k3d-gpu && CARDS=2,3 bash bench/h54gpu/hold.sh 2400 bash bench/h54gpu/h54b.sh 2 X1q-mtp Lsq +node image: cryptoandcoffee/k3d-gpu:0.1.61@sha256:8cd264aa68c77681d7fa474693944de0db8d55de5881253e4029bf72a67e175c +image: openvino/model_server:2026.4.1-gpu@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 +image: ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba73574a1e12cd237c88b512c8bb39ba6f703e873912b76cb8988a81bd +image: intel/llm-scaler-vllm:1.5@sha256:52218ad85513ab6686d4c090c83c2bd8c5b02423c63aa4dabd41837fe641fe3b +image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e +model: Intel/Qwen3.8-27B-q4km-AutoRound 4b30b30e0ac2cc54a2f50738cfccd6c608f94ad4 +model: edff62728a3c79ec541983b86a21674500e0f05b +model: google/gemma-4-26B-A4B-it-qat-q4_0-gguf d1c082be9cf3c8a514acf63b8761f4b41935842e +model: google/gemma-4-26B-A4B-it-qat-q4_0-unquantized-assistant 9537141506fe8875b3ed45b264af13580cb29166 +model: google/gemma-4-26B-A4B-it-qat-q4_0-unquantized f1e06dc520982d9b9edd76859fdb7ab209449949 diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/X1q-mtp.ERRATUM.txt b/bench/h54gpu/results/2026-10-21/H54b/hold2/X1q-mtp.ERRATUM.txt new file mode 100644 index 00000000..a9e16f54 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/X1q-mtp.ERRATUM.txt @@ -0,0 +1,7 @@ +Erratum, written 2026-10-21 after the hold. Raw records are left as recorded. + +X1q-mtp never rendered (X1q-mtp.yaml is empty). Cause: a runner bug. In bench/h54gpu/h54b.sh, +"${2:+K3D_GPU_AGENT_PREFIX_CACHING=false}" at the start of a command line expands to a word, not an +environment assignment, so bash ran it as a command (arms.log: "line 140: +K3D_GPU_AGENT_PREFIX_CACHING=false: command not found", then "manifest failed"). +This is not an OVMS or B70 result. diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/X1q-mtp.yaml b/bench/h54gpu/results/2026-10-21/H54b/hold2/X1q-mtp.yaml new file mode 100644 index 00000000..e69de29b diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/arms.log b/bench/h54gpu/results/2026-10-21/H54b/hold2/arms.log new file mode 100644 index 00000000..314be1a5 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/arms.log @@ -0,0 +1,28 @@ +== H54b hold 2 cards 2,3 arms X1q-mtp Lsq 2026-10-21T21:17:59Z +pod/gpu-hold-0 created +pod/gpu-hold-1 created +pod/gpu-hold-2 created +pod/gpu-hold-3 created +pod/gpu-hold-0 condition met +pod/gpu-hold-1 condition met +pod/gpu-hold-2 condition met +pod/gpu-hold-3 condition met +pod "gpu-hold-0" deleted from default namespace +pod "gpu-hold-2" deleted from default namespace +== device-plugin arms: allowed (gpu-hold-0: renderD131 gpu-hold-1: renderD128 gpu-hold-2: renderD130 gpu-hold-3: renderD129) 2026-10-21T21:19:47Z +== arm X1q-mtp 2026-10-21T21:19:47Z +/home/devcloud/k3dgpu-gemma/k3d-gpu/bench/h54gpu/h54b.sh: line 140: K3D_GPU_AGENT_PREFIX_CACHING=false: command not found +== arm X1q-mtp: manifest failed 2026-10-21T21:19:47Z +== arm Lsq 2026-10-21T21:20:07Z +pod/lsq created +energy: zone=intel-rapl:0 (package-0) joules=7572.788 seconds=60.018 avg_watts=126.176 command_seconds=60.002 samples=13 exit=0 +concurrency=1 ok=8/8 ttft_median=0.644s ttft_p90=0.699s latency_median=9.986s tok/s_median=25.6 aggregate_tok/s=25.6 +energy: zone=intel-rapl:0 (package-0) joules=14231.752 seconds=109.857 avg_watts=129.549 command_seconds=109.841 samples=23 exit=0 +concurrency=4 ok=16/16 ttft_median=1.964s ttft_p90=2.098s latency_median=18.448s tok/s_median=13.9 aggregate_tok/s=55.9 +energy: zone=intel-rapl:0 (package-0) joules=13420.889 seconds=103.407 avg_watts=129.787 command_seconds=103.392 samples=22 exit=0 +concurrency=16 ok=32/32 ttft_median=56.857s ttft_p90=57.544s latency_median=73.348s tok/s_median=3.5 aggregate_tok/s=55.7 +energy: zone=intel-rapl:0 (package-0) joules=23136.138 seconds=177.939 avg_watts=130.023 command_seconds=177.922 samples=37 exit=0 +concurrency=1 ok=4/4 ttft_median=1.574s ttft_p90=2.940s latency_median=2.157s tok/s_median=7.4 aggregate_tok/s=6.5 +gsm8k 48/50 +== arm lsq done 2026-10-21T21:38:21Z +pod "lsq" deleted from default namespace diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/cluster.log b/bench/h54gpu/results/2026-10-21/H54b/hold2/cluster.log new file mode 100644 index 00000000..673157db --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/cluster.log @@ -0,0 +1,29 @@ +WARN: present but disabled: DSA dsa0 dsa2 dsa4, QAT 0000:01:00.0 0000:06:00.0 0000:0b:00.0 (no user work queues / VFs), so not in the cluster — enable them: k3d-gpu host-setup --apply, then k3d-gpu down && k3d-gpu up (exact commands: k3d-gpu doctor) +==> Accelerators: intel amx +==> Experimental features (auto): dra image-volume +==> Creating k3d cluster 'k3dgpu-g-h54b-2' with image cryptoandcoffee/k3d-gpu:0.1.61@sha256:8cd264aa68c77681d7fa474693944de0db8d55de5881253e4029bf72a67e175c... +INFO[0000] Prep: Network +INFO[0000] Created network 'k3d-k3dgpu-g-h54b-2' +INFO[0000] Created image volume k3d-k3dgpu-g-h54b-2-images +INFO[0000] Starting new tools node... +INFO[0000] Starting node 'k3d-k3dgpu-g-h54b-2-tools' +INFO[0001] Creating node 'k3d-k3dgpu-g-h54b-2-server-0' +INFO[0001] Using the k3d-tools node to gather environment information +INFO[0001] HostIP: using network gateway 172.19.0.1 address +INFO[0001] Starting cluster 'k3dgpu-g-h54b-2' +INFO[0001] Starting servers... +INFO[0001] Starting node 'k3d-k3dgpu-g-h54b-2-server-0' +INFO[0004] All agents already running. +INFO[0004] All helpers already running. +INFO[0004] Injecting records for hostAliases (incl. host.k3d.internal) and for 1 network members into CoreDNS configmap... +INFO[0006] Cluster 'k3dgpu-g-h54b-2' created successfully! +INFO[0006] You can now use it like this: +kubectl cluster-info +==> Waiting for nodes Ready... +node/k3d-k3dgpu-g-h54b-2-server-0 condition met +==> Waiting for cluster DNS (CoreDNS)... +==> intel device plugin auto-deployed by k3s. +==> Verifying accelerators are schedulable... +daemon set "intel-gpu-plugin" successfully rolled out +WARN: present but disabled: DSA dsa0 dsa2 dsa4, QAT 0000:01:00.0 0000:06:00.0 0000:0b:00.0 (no user work queues / VFs), so not in the cluster — enable them: k3d-gpu host-setup --apply, then k3d-gpu down && k3d-gpu up (exact commands: k3d-gpu doctor) +==> Accelerators schedulable: intel=4 amx=1. Try: k3d-gpu test diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/gpu-hold.txt b/bench/h54gpu/results/2026-10-21/H54b/hold2/gpu-hold.txt new file mode 100644 index 00000000..65066466 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/gpu-hold.txt @@ -0,0 +1,4 @@ +gpu-hold-0: renderD131 +gpu-hold-1: renderD128 +gpu-hold-2: renderD130 +gpu-hold-3: renderD129 diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/gpu-hold.yaml b/bench/h54gpu/results/2026-10-21/H54b/hold2/gpu-hold.yaml new file mode 100644 index 00000000..15c0570f --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/gpu-hold.yaml @@ -0,0 +1,32 @@ +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-0} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-1} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-2} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-3} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.boot_s b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.boot_s new file mode 100644 index 00000000..c1d1ffbb --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.boot_s @@ -0,0 +1 @@ +266 diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.dri b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.dri new file mode 100644 index 00000000..45f4f53d --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.dri @@ -0,0 +1,10 @@ +total 0 +crw-rw---- 1 root video 226, 0 Oct 21 21:23 card0 +crw-rw---- 1 root video 226, 1 Oct 21 21:23 card1 +crw-rw---- 1 root video 226, 2 Oct 21 21:23 card2 +crw-rw---- 1 root video 226, 3 Oct 21 21:23 card3 +crw-rw---- 1 root video 226, 4 Oct 21 21:23 card4 +crw-rw---- 1 root 990 226, 128 Oct 21 21:23 renderD128 +crw-rw---- 1 root 990 226, 129 Oct 21 21:23 renderD129 +crw-rw---- 1 root 990 226, 130 Oct 21 21:18 renderD130 +crw-rw---- 1 root 990 226, 131 Oct 21 21:23 renderD131 diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.gpu-energy b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.gpu-energy new file mode 100644 index 00000000..ed07e517 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.gpu-energy @@ -0,0 +1,2 @@ +before card2 2026-10-21T21:25:33Z card=311477294932067 pkg=218272054208435 +after card2 2026-10-21T21:38:21Z card=311592801957397 pkg=218350242111267 diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.gsm8k.json b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.gsm8k.json new file mode 100644 index 00000000..baa8b2b8 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.gsm8k.json @@ -0,0 +1,409 @@ +{ + "model": "m", + "first": 0, + "last": 49, + "rows": [ + { + "item": 0, + "gold": "18", + "pred": "18", + "correct": true, + "error": null, + "reply": "To determine how much money Janet makes every day at the farmers' market, we need to calculate the number of eggs she has available to sell and then multiply that by the price per egg.\n\n**Step 1: Calculate the total number of eggs laid per day.**\nJanet's ducks lay 16 eggs per day.\nTotal eggs = 16\n\n**Step 2: Calculate the number of eggs consumed or used by Janet.**\n* She eats 3 eggs for breakfast.\n* She uses 4 eggs to bake muffins.\nTotal eggs used = $3 + 4 = 7$ eggs\n\n**Step 3: Calculate the number of eggs remaining for sale.**\nRemaining eggs = Total eggs - Total eggs used\nRemaining eggs = $16 - 7 = 9$ eggs\n\n**Step 4: Calculate the daily revenue from selling the eggs.**\nShe sells the remaining eggs for $2 per egg.\nDaily revenue = Remaining eggs $\\times$ Price per egg\nDaily revenue = $9 \\times 2 = 18$ dollars\n\nJanet makes $18 every day at the farmers' market.\n\nAnswer: 18" + }, + { + "item": 1, + "gold": "3", + "pred": "3", + "correct": true, + "error": null, + "reply": "To find the total number of bolts required for the robe, we need to determine the amount of blue fiber and white fiber needed and then sum them up.\n\n1. **Blue fiber**: The problem states that the robe takes 2 bolts of blue fiber.\n $$ \\text{Blue fiber} = 2 \\text{ bolts} $$\n\n2. **White fiber**: The problem states that it takes \"half that much\" white fiber. \"That much\" refers to the amount of blue fiber.\n $$ \\text{White fiber} = \\frac{1}{2} \\times \\text{Blue fiber} $$\n $$ \\text{White fiber} = \\frac{1}{2} \\times 2 = 1 \\text{ bolt} $$\n\n3. **Total bolts**: Add the amount of blue fiber and white fiber together.\n $$ \\text{Total} = \\text{Blue fiber} + \\text{White fiber} $$\n $$ \\text{Total} = 2 + 1 = 3 \\text{ bolts} $$\n\nAnswer: 3" + }, + { + "item": 2, + "gold": "70000", + "pred": "70000", + "correct": true, + "error": null, + "reply": "To determine Josh's profit, we need to calculate his total cost, the final value of the house, and then subtract the total cost from the final value.\n\n**Step 1: Calculate the total cost (investment).**\nJosh bought the house for $\\$80,000$ and spent $\\$50,000$ on repairs.\n$$ \\text{Total Cost} = \\text{Purchase Price} + \\text{Repair Costs} $$\n$$ \\text{Total Cost} = \\$80,000 + \\$50,000 = \\$130,000 $$\n\n**Step 2: Calculate the final value of the house.**\nThe problem states that the repairs increased the value of the house by $150\\%$. This percentage increase is applied to the original purchase price of the house.\n\nFirst, calculate the amount of the increase:\n$$ \\text{Increase Amount} = \\text{Original Value} \\times \\text{Percentage Increase} $$\n$$ \\text{Increase Amount} = \\$80,000 \\times 1.50 $$\n$$ \\text{Increase Amount} = \\$120,000 $$\n\nNext, add this increase to the original value to find the new market value:\n$$ \\text{Final Value} = \\text{Original Value} + \\text{Increase Amount} $$\n$$ \\text{Final Value} = \\$80,000 + \\$120,000 = \\$200,000 $$\n\n*Note: An alternative interpretation could be that the \"value\" refers to the total investment, but in real estate contexts, \"value of the house\" typically refers to the market value of the property itself, which is based on the original purchase price plus the appreciation due to improvements. The standard interpretation is that the house's market value increased by 150% of its original price.*\n\n**Step 3: Calculate the profit.**\nProfit is the final value minus the total cost.\n$$ \\text{Profit} = \\text{Final Value} - \\text{Total Cost} $$\n$$ \\text{Profit} = \\$200,000 - \\$130,000 $$\n$$ \\text{Profit} = \\$70,000 $$\n\nAnswer: 70000" + }, + { + "item": 3, + "gold": "540", + "pred": "540", + "correct": true, + "error": null, + "reply": "To find the total number of meters James runs in a week, we need to break down the information given:\n\n1. **Number of sprints per session:** 3 sprints\n2. **Distance per sprint:** 60 meters\n3. **Frequency:** 3 times a week\n\n**Step 1: Calculate the distance run in one session.**\n$$ \\text{Distance per session} = \\text{Number of sprints} \\times \\text{Distance per sprint} $$\n$$ \\text{Distance per session} = 3 \\times 60 \\text{ meters} = 180 \\text{ meters} $$\n\n**Step 2: Calculate the total distance run in a week.**\n$$ \\text{Total weekly distance} = \\text{Distance per session} \\times \\text{Number of sessions per week} $$\n$$ \\text{Total weekly distance} = 180 \\text{ meters} \\times 3 $$\n\n**Step 3: Perform the multiplication.**\n$$ 180 \\times 3 = 540 $$\n\nSo, James runs a total of 540 meters in a week.\n\nAnswer: 540" + }, + { + "item": 4, + "gold": "20", + "pred": "20", + "correct": true, + "error": null, + "reply": "To determine how many cups of feed Wendi needs to give her chickens in the final meal, we need to calculate the total daily feed required for the flock and subtract the amount already given in the morning and afternoon.\n\n**Step 1: Calculate the total daily feed required for the flock.**\nWendi has 20 chickens.\nEach chicken requires 3 cups of feed per day.\n$$ \\text{Total Daily Feed} = \\text{Number of Chickens} \\times \\text{Feed per Chicken} $$\n$$ \\text{Total Daily Feed} = 20 \\times 3 = 60 \\text{ cups} $$\n\n**Step 2: Calculate the total feed already given.**\nIn the morning, she gives 15 cups.\nIn the afternoon, she gives 25 cups.\n$$ \\text{Feed Given So Far} = \\text{Morning Feed} + \\text{Afternoon Feed} $$\n$$ \\text{Feed Given So Far} = 15 + 25 = 40 \\text{ cups} $$\n\n**Step 3: Calculate the feed needed for the final meal.**\nSubtract the feed already given from the total daily feed required.\n$$ \\text{Final Meal Feed} = \\text{Total Daily Feed} - \\text{Feed Given So Far} $$\n$$ \\text{Final Meal Feed} = 60 - 40 = 20 \\text{ cups} $$\n\nAnswer: 20" + }, + { + "item": 5, + "gold": "64", + "pred": "64", + "correct": true, + "error": null, + "reply": "To determine the total cost for Kylar to buy 16 glasses, we need to analyze the pricing structure and calculate the cost for each group of glasses.\n\n**1. Analyze the Pricing Structure**\n* The price of the first glass in a pair is $\\$5$.\n* The price of the second glass in a pair is $60\\%$ of the first glass's price.\n* This pattern repeats for every subsequent pair of glasses.\n\n**2. Calculate the Cost of One Pair**\n* Cost of the 1st glass: $\\$5$\n* Cost of the 2nd glass: $60\\%$ of $\\$5 = 0.60 \\times 5 = \\$3$\n* Total cost for one pair (2 glasses): $\\$5 + \\$3 = \\$8$\n\n**3. Determine the Number of Pairs**\n* Kylar wants to buy 16 glasses.\n* Since the discount applies to \"every second glass,\" we can group the 16 glasses into pairs.\n* Number of pairs = $16 / 2 = 8$ pairs.\n\n**4. Calculate the Total Cost**\n* Total Cost = (Number of pairs) $\\times$ (Cost per pair)\n* Total Cost = $8 \\times \\$8$\n* Total Cost = $\\$64$\n\n**Verification:**\nLet's list the cost of each glass to be sure:\n1. $\\$5$\n2. $\\$3$\n3. $\\$5$\n4. $\\$3$\n5. $\\$5$\n6. $\\$3$\n7. $\\$5$\n8. $\\$3$\n9. $\\$5$\n10. $\\$3$\n11. $\\$5$\n12. $\\$3$\n13. $\\$5$\n14. $\\$3$\n15. $\\$5$\n16. $\\$3$\n\nSumming these up:\nThere are 8 glasses costing $\\$5$ and 8 glasses costing $\\$3$.\nTotal = $(8 \\times 5) + (8 \\times 3) = 40 + 24 = 64$.\n\nAnswer: 64" + }, + { + "item": 6, + "gold": "260", + "pred": "260", + "correct": true, + "error": null, + "reply": "To find the total number of sheep in Toulouse, Charleston, and Seattle, we will determine the number of sheep in each city step-by-step based on the given relationships.\n\n**Step 1: Determine the number of sheep in Seattle.**\nThe problem states that Seattle has 20 sheep.\n$$ \\text{Seattle} = 20 $$\n\n**Step 2: Determine the number of sheep in Charleston.**\nThe problem states that Charleston has 4 times as many sheep as Seattle.\n$$ \\text{Charleston} = 4 \\times \\text{Seattle} $$\n$$ \\text{Charleston} = 4 \\times 20 $$\n$$ \\text{Charleston} = 80 $$\n\n**Step 3: Determine the number of sheep in Toulouse.**\nThe problem states that Toulouse has twice as many sheep as Charleston.\n$$ \\text{Toulouse} = 2 \\times \\text{Charleston} $$\n$$ \\text{Toulouse} = 2 \\times 80 $$\n$$ \\text{Toulouse} = 160 $$\n\n**Step 4: Calculate the total number of sheep.**\nTo find the total, we sum the number of sheep in all three cities.\n$$ \\text{Total} = \\text{Seattle} + \\text{Charleston} + \\text{Toulouse} $$\n$$ \\text{Total} = 20 + 80 + 160 $$\n\nFirst, add Seattle and Charleston:\n$$ 20 + 80 = 100 $$\n\nThen, add Toulouse:\n$$ 100 + 160 = 260 $$\n\nThe total number of sheep is 260.\n\nAnswer: 260" + }, + { + "item": 7, + "gold": "160", + "pred": "160", + "correct": true, + "error": null, + "reply": "To find the total time it takes to download the file, we need to break the process down into three distinct phases:\n1. The initial partial download before the restart.\n2. The time spent on the system restart.\n3. The full download after the restart.\n\n**Step 1: Calculate the time for the initial partial download.**\n\n* Total file size: $200 \\text{ GB}$\n* Download speed: $2 \\text{ GB/minute}$\n* The restart happens at $40\\%$ of the way through.\n\nFirst, calculate the amount of data downloaded before the restart:\n$$ \\text{Data downloaded} = 200 \\text{ GB} \\times 0.40 = 80 \\text{ GB} $$\n\nNext, calculate the time it took to download this $80 \\text{ GB}$:\n$$ \\text{Time}_1 = \\frac{\\text{Data downloaded}}{\\text{Speed}} = \\frac{80 \\text{ GB}}{2 \\text{ GB/minute}} = 40 \\text{ minutes} $$\n\n**Step 2: Account for the restart time.**\n\nThe problem states that the restart takes $20$ minutes.\n$$ \\text{Time}_2 = 20 \\text{ minutes} $$\n\n**Step 3: Calculate the time for the full download after the restart.**\n\nAfter the restart, Carla has to download the entire file from the beginning.\n* Total file size: $200 \\text{ GB}$\n* Download speed: $2 \\text{ GB/minute}$\n\nCalculate the time for this full download:\n$$ \\text{Time}_3 = \\frac{\\text{Total file size}}{\\text{Speed}} = \\frac{200 \\text{ GB}}{2 \\text{ GB/minute}} = 100 \\text{ minutes} $$\n\n**Step 4: Calculate the total time.**\n\nSum the times from all three phases:\n$$ \\text{Total Time} = \\text{Time}_1 + \\text{Time}_2 + \\text{Time}_3 $$\n$$ \\text{Total Time} = 40 \\text{ minutes} + 20 \\text{ minutes} + 100 \\text{ minutes} $$\n$$ \\text{Total Time} = 160 \\text{ minutes} $$\n\nAnswer: 160" + }, + { + "item": 8, + "gold": "45", + "pred": "45", + "correct": true, + "error": null, + "reply": "To determine how far John is from home at the end of the 4 hours, we need to calculate the total distance he traveled away from home and the total distance he traveled back towards home.\n\n**Step 1: Calculate the distance John traveled away from home.**\nJohn drives for 3 hours at a speed of 60 mph.\n$$ \\text{Distance}_{\\text{away}} = \\text{Speed} \\times \\text{Time} $$\n$$ \\text{Distance}_{\\text{away}} = 60 \\text{ mph} \\times 3 \\text{ hours} = 180 \\text{ miles} $$\n\nSo, John is 180 miles away from home when he turns around.\n\n**Step 2: Calculate the distance John traveled back towards home.**\nJohn tries to get home in 4 hours. Let's break down his journey back into segments:\n\n1. **First 2 hours:** Standstill traffic.\n * Speed = 0 mph\n * Time = 2 hours\n * $$ \\text{Distance}_1 = 0 \\text{ mph} \\times 2 \\text{ hours} = 0 \\text{ miles} $$\n\n2. **Next half-hour (0.5 hours):** Driving at 30 mph.\n * Speed = 30 mph\n * Time = 0.5 hours\n * $$ \\text{Distance}_2 = 30 \\text{ mph} \\times 0.5 \\text{ hours} = 15 \\text{ miles} $$\n\n3. **Remaining time:**\n * Total time allocated for the return trip is 4 hours.\n * Time already spent = 2 hours (traffic) + 0.5 hours (driving) = 2.5 hours.\n * Remaining time = $4 - 2.5 = 1.5$ hours.\n * Speed = 80 mph\n * $$ \\text{Distance}_3 = 80 \\text{ mph} \\times 1.5 \\text{ hours} = 120 \\text{ miles} $$\n\n**Step 3: Calculate the total distance traveled back.**\n$$ \\text{Total Distance}_{\\text{back}} = \\text{Distance}_1 + \\text{Distance}_2 + \\text{Distance}_3 $$\n$$ \\text{Total Distance}_{\\text{back}} = 0 + 15 + 120 = 135 \\text{ miles} $$\n\n**Step 4: Calculate the final distance from home.**\nJohn started 180 miles away from home. He traveled 135 miles back towards home.\n$$ \\text{Distance from home} = \\text{Distance}_{\\text{away}} - \\text{Total Distance}_{\\text{back}} $$\n$$ \\text{Distance from home} = 180 \\text{ miles} - 135 \\text{ miles} = 45 \\text{ miles} $$\n\nAnswer: 45" + }, + { + "item": 9, + "gold": "460", + "pred": "460", + "correct": true, + "error": null, + "reply": "To calculate Eliza's total earnings for the week, we need to break down her work hours into regular hours and overtime hours, and then apply the respective pay rates.\n\n**Step 1: Determine the regular and overtime hours.**\n* Eliza's regular work week is 40 hours.\n* She worked a total of 45 hours.\n* Regular hours = 40 hours.\n* Overtime hours = Total hours - Regular hours = $45 - 40 = 5$ hours.\n\n**Step 2: Determine the hourly rates.**\n* Regular hourly rate = $\\$10$.\n* Overtime rate = $1.2 \\times$ Regular hourly rate.\n* Overtime rate = $1.2 \\times 10 = \\$12$ per hour.\n\n**Step 3: Calculate earnings for regular hours.**\n* Earnings from regular hours = Regular hours $\\times$ Regular hourly rate\n* Earnings from regular hours = $40 \\times 10 = \\$400$.\n\n**Step 4: Calculate earnings for overtime hours.**\n* Earnings from overtime hours = Overtime hours $\\times$ Overtime hourly rate\n* Earnings from overtime hours = $5 \\times 12 = \\$60$.\n\n**Step 5: Calculate total earnings.**\n* Total earnings = Earnings from regular hours + Earnings from overtime hours\n* Total earnings = $400 + 60 = \\$460$.\n\nAnswer: 460" + }, + { + "item": 10, + "gold": "366", + "pred": "366", + "correct": true, + "error": null, + "reply": "Let's break down the problem step by step to calculate the total number of downloads over the three months.\n\n**Step 1: Determine the downloads in the first month.**\nThe problem states that there were 60 downloads in the first month.\n$$D_1 = 60$$\n\n**Step 2: Determine the downloads in the second month.**\nThe number of downloads in the second month was three times as many as the downloads in the first month.\n$$D_2 = 3 \\times D_1$$\n$$D_2 = 3 \\times 60$$\n$$D_2 = 180$$\n\n**Step 3: Determine the downloads in the third month.**\nThe number of downloads in the third month was the second month's downloads reduced by 30%.\nFirst, calculate 30% of the second month's downloads:\n$$30\\% \\text{ of } 180 = 0.30 \\times 180 = 54$$\n\nNow, subtract this reduction from the second month's total:\n$$D_3 = D_2 - 54$$\n$$D_3 = 180 - 54$$\n$$D_3 = 126$$\n\nAlternatively, reducing by 30% is equivalent to keeping 70%:\n$$D_3 = 0.70 \\times 180 = 126$$\n\n**Step 4: Calculate the total downloads over the three months.**\nSum the downloads from all three months:\n$$\\text{Total} = D_1 + D_2 + D_3$$\n$$\\text{Total} = 60 + 180 + 126$$\n\nCalculate the sum:\n$$60 + 180 = 240$$\n$$240 + 126 = 366$$\n\nThe total number of downloads over the three months is 366.\n\nAnswer: 366" + }, + { + "item": 11, + "gold": "694", + "pred": "694", + "correct": true, + "error": null, + "reply": "To find the total cost of the pastries Toula bought, we need to calculate the cost for each type of pastry separately and then sum them up.\n\n**1. Calculate the cost of the donuts:**\n* Quantity: 3 dozen\n* Cost per dozen: $68\n* Total cost for donuts = $3 \\times 68$\n * $3 \\times 60 = 180$\n * $3 \\times 8 = 24$\n * $180 + 24 = 204$\n* Cost for donuts = **$204**\n\n**2. Calculate the cost of the mini cupcakes:**\n* Quantity: 2 dozen\n* Cost per dozen: $80\n* Total cost for mini cupcakes = $2 \\times 80$\n * $2 \\times 80 = 160$\n* Cost for mini cupcakes = **$160**\n\n**3. Calculate the cost of the mini cheesecakes:**\n* Quantity: 6 dozen\n* Cost per dozen: $55\n* Total cost for mini cheesecakes = $6 \\times 55$\n * $6 \\times 50 = 300$\n * $6 \\times 5 = 30$\n * $300 + 30 = 330$\n* Cost for mini cheesecakes = **$330**\n\n**4. Calculate the total cost:**\n* Total Cost = (Cost of donuts) + (Cost of mini cupcakes) + (Cost of mini cheesecakes)\n* Total Cost = $204 + 160 + 330$\n\nLet's add them step-by-step:\n* $204 + 160 = 364$\n* $364 + 330 = 694$\n\nThe total cost is $694.\n\nAnswer: 694" + }, + { + "item": 12, + "gold": "13", + "pred": "12", + "correct": false, + "error": null, + "reply": "To determine how many years it will take for Carlos to start earning money on the lemon tree, we need to calculate the net profit per year and compare it to the initial cost.\n\n**Step 1: Calculate the annual revenue.**\nThe tree produces 7 lemons per year.\nEach lemon sells for $1.5.\n$$ \\text{Annual Revenue} = 7 \\times 1.5 = 10.5 \\text{ dollars} $$\n\n**Step 2: Calculate the annual net profit.**\nThe cost to water and feed the tree is $3 per year.\n$$ \\text{Annual Net Profit} = \\text{Annual Revenue} - \\text{Annual Cost} $$\n$$ \\text{Annual Net Profit} = 10.5 - 3 = 7.5 \\text{ dollars} $$\n\n**Step 3: Determine the number of years to recover the initial investment.**\nThe initial cost to plant the tree is $90. We need to find the number of years ($n$) such that the cumulative net profit is greater than or equal to the initial cost.\n\n$$ n \\times 7.5 \\ge 90 $$\n\nSolving for $n$:\n$$ n \\ge \\frac{90}{7.5} $$\n\nLet's perform the division:\n$$ \\frac{90}{7.5} = \\frac{900}{75} $$\nDivide both numerator and denominator by 25:\n$$ \\frac{900}{25} = 36 $$\n$$ \\frac{75}{25} = 3 $$\n$$ \\frac{36}{3} = 12 $$\n\nSo, $n \\ge 12$.\n\n**Step 4: Verify the result.**\n* After 11 years: $11 \\times 7.5 = 82.5$ dollars. This is less than $90, so he is still at a loss.\n* After 12 years: $12 \\times 7.5 = 90$ dollars. This equals the initial cost. At the end of the 12th year, he has recovered his initial investment.\n\nThe question asks \"How many years will it take before he starts earning money\". Usually, \"earning money\" implies breaking even or making a profit. Since he breaks even exactly at the end of year 12, he starts earning money (profit) in the 13th year, but the time required to reach the point where he is no longer losing money is 12 years. In the context of such problems, the answer is typically the number of years required to break even.\n\nLet's re-read carefully: \"How many years will it take before he starts earning money\".\nIf he breaks even at year 12, he has earned $0 profit at the end of year 12. He starts earning *positive* money in year 13. However, standard interpretation for \"time to break even\" or \"time to recover cost\" is the integer number of years where the cumulative profit covers the cost. Let's look at the phrasing again. \"Starts earning money\" often means the point where the investment is paid off.\n\nLet's check the cumulative balance:\nYear 0: -$90\nYear 1: -$90 + $7.5 = -$82.5\n...\nYear 11: -$90 + (11 * 7.5) = -$90 + $82.5 = -$7.5\nYear 12: -$90 + (12 * 7.5) = -$90 + $90 = $0\n\nAt the end of year 12, he has recovered his cost. He has not yet made a profit, but he has stopped losing money relative to the initial outlay. In financial terms, this is the break-even point. The question asks how many years it takes *before* he starts earning. This is slightly ambiguous. Does it mean when does the profit become positive? Or when does he recover the cost?\n\nUsually, in these math problems, if the division results in a whole number, that is the answer. If it were 12.1 years, the answer would be 13. Since it is exactly 12, the answer is 12.\n\nAnswer: 12" + }, + { + "item": 13, + "gold": "18", + "pred": "18", + "correct": true, + "error": null, + "reply": "Let $x$ be the number of vacuum cleaners Melanie started with.\n\n**Step 1: Sales at the green house**\nShe sold a third of her vacuum cleaners at the green house.\nNumber sold = $\\frac{1}{3}x$\nRemaining after green house = $x - \\frac{1}{3}x = \\frac{2}{3}x$\n\n**Step 2: Sales at the red house**\nShe sold 2 more vacuum cleaners to the red house.\nRemaining after red house = $\\frac{2}{3}x - 2$\n\n**Step 3: Sales at the orange house**\nShe sold half of what was left at the orange house.\nLet $R$ be the amount remaining before the orange house, so $R = \\frac{2}{3}x - 2$.\nShe sold $\\frac{1}{2}R$.\nRemaining after orange house = $R - \\frac{1}{2}R = \\frac{1}{2}R$\nSubstituting $R$:\nRemaining = $\\frac{1}{2} \\left( \\frac{2}{3}x - 2 \\right)$\n\n**Step 4: Final condition**\nWe are told that Melanie has 5 vacuum cleaners left.\nSo, we set the remaining amount equal to 5:\n$$ \\frac{1}{2} \\left( \\frac{2}{3}x - 2 \\right) = 5 $$\n\n**Step 5: Solve for $x$**\nMultiply both sides by 2 to eliminate the fraction:\n$$ \\frac{2}{3}x - 2 = 10 $$\n\nAdd 2 to both sides:\n$$ \\frac{2}{3}x = 12 $$\n\nMultiply both sides by $\\frac{3}{2}$ to isolate $x$:\n$$ x = 12 \\times \\frac{3}{2} $$\n$$ x = 6 \\times 3 $$\n$$ x = 18 $$\n\n**Verification:**\n1. Start with 18.\n2. Sell 1/3 at green house: $18 / 3 = 6$. Remaining: $18 - 6 = 12$.\n3. Sell 2 at red house: $12 - 2 = 10$.\n4. Sell half of what is left at orange house: $10 / 2 = 5$. Remaining: $10 - 5 = 5$.\n5. Final count is 5. This matches the problem statement.\n\nAnswer: 18" + }, + { + "item": 14, + "gold": "60", + "pred": "60", + "correct": true, + "error": null, + "reply": "Here is the step-by-step solution to the problem:\n\n**Step 1: Determine the number of students enrolled in contemporary dance.**\nThe total number of students is 20.\n20% of the students enrolled in contemporary dance.\n$$ \\text{Contemporary students} = 20 \\times 0.20 = 4 $$\n\n**Step 2: Determine the number of remaining students after contemporary dance enrollment.**\n$$ \\text{Remaining students} = \\text{Total students} - \\text{Contemporary students} $$\n$$ \\text{Remaining students} = 20 - 4 = 16 $$\n\n**Step 3: Determine the number of students enrolled in jazz dance.**\n25% of the *remaining* students enrolled in jazz dance.\n$$ \\text{Jazz students} = 16 \\times 0.25 = 4 $$\n\n**Step 4: Determine the number of students enrolled in hip-hop dance.**\nThe rest of the students enrolled in hip-hop dance.\nFirst, find the number of students remaining after jazz dance enrollment:\n$$ \\text{Students left for hip-hop} = \\text{Remaining students} - \\text{Jazz students} $$\n$$ \\text{Students left for hip-hop} = 16 - 4 = 12 $$\nSo, 12 students enrolled in hip-hop dance.\n\n**Step 5: Calculate the percentage of the entire students enrolled in hip-hop dance.**\n$$ \\text{Percentage} = \\left( \\frac{\\text{Hip-hop students}}{\\text{Total students}} \\right) \\times 100\\% $$\n$$ \\text{Percentage} = \\left( \\frac{12}{20} \\right) \\times 100\\% $$\n$$ \\text{Percentage} = 0.6 \\times 100\\% = 60\\% $$\n\nAnswer: 60" + }, + { + "item": 15, + "gold": "125", + "pred": "125", + "correct": true, + "error": null, + "reply": "To determine which purchase plan yields the maximum profit, we need to calculate the profit for each option based on the given market growth rates.\n\n**Option 1: Jewelry**\n* Initial Cost: $\\$5,000$\n* Market Growth Rate: $2.5\\%$\n* Profit Calculation:\n $$ \\text{Profit}_{\\text{jewelry}} = 5000 \\times 0.025 $$\n $$ \\text{Profit}_{\\text{jewelry}} = 125 $$\n* The profit from the jewelry is $\\$125$.\n\n**Option 2: Electronic Gadgets**\n* Initial Cost: $\\$8,000$\n* Market Growth Rate: $1.2\\%$\n* Profit Calculation:\n $$ \\text{Profit}_{\\text{gadgets}} = 8000 \\times 0.012 $$\n $$ \\text{Profit}_{\\text{gadgets}} = 96 $$\n* The profit from the electronic gadgets is $\\$96$.\n\n**Comparison**\n* Profit from Jewelry: $\\$125$\n* Profit from Electronic Gadgets: $\\$96$\n\nComparing the two profits, $\\$125 > \\$96$. Therefore, the merchant should choose the jewelry to maximize profit. The maximum profit is $\\$125$.\n\nAnswer: 125" + }, + { + "item": 16, + "gold": "230", + "pred": "230", + "correct": true, + "error": null, + "reply": "To find the total distance covered by each train in the two days, we need to sum the distances traveled on each day.\n\n**Step 1: Identify the distance traveled on the first day.**\nThe problem states that on the first day, the trains travel westward for 80 miles.\nDistance on Day 1 = 80 miles.\n\n**Step 2: Identify the distance traveled on the second day.**\nThe problem states that on the next day (Day 2), the trains travel northwards, covering 150 miles.\nDistance on Day 2 = 150 miles.\n\n**Step 3: Calculate the total distance covered.**\nThe total distance covered is the sum of the distances traveled on both days. Note that the question asks for the \"distance covered,\" which refers to the total path length traveled, not the displacement (straight-line distance from start to finish).\n\n$$ \\text{Total Distance} = \\text{Distance on Day 1} + \\text{Distance on Day 2} $$\n$$ \\text{Total Distance} = 80 \\text{ miles} + 150 \\text{ miles} $$\n$$ \\text{Total Distance} = 230 \\text{ miles} $$\n\nSince both trains follow the same path and cover the same distances, the distance covered by each train is 230 miles.\n\nAnswer: 230" + }, + { + "item": 17, + "gold": "57500", + "pred": "57500", + "correct": true, + "error": null, + "reply": "To calculate Jill's annual salary, we need to determine her earnings from both jobs separately and then sum them up.\n\n**Step 1: Calculate annual earnings as a teacher.**\n* Hourly rate: $20\n* Hours per week: 35\n* Weeks per year: 50\n\n$$ \\text{Teacher Earnings} = 20 \\times 35 \\times 50 $$\n\nFirst, calculate the weekly earnings:\n$$ 20 \\times 35 = 700 \\text{ dollars per week} $$\n\nThen, calculate the annual earnings:\n$$ 700 \\times 50 = 35,000 \\text{ dollars} $$\n\n**Step 2: Calculate annual earnings as a cheerleading coach.**\n* Hourly rate: $30\n* Hours per week: 15\n* Weeks per year: 50\n\n$$ \\text{Coach Earnings} = 30 \\times 15 \\times 50 $$\n\nFirst, calculate the weekly earnings:\n$$ 30 \\times 15 = 450 \\text{ dollars per week} $$\n\nThen, calculate the annual earnings:\n$$ 450 \\times 50 = 22,500 \\text{ dollars} $$\n\n**Step 3: Calculate total annual salary.**\n$$ \\text{Total Salary} = \\text{Teacher Earnings} + \\text{Coach Earnings} $$\n$$ \\text{Total Salary} = 35,000 + 22,500 $$\n$$ \\text{Total Salary} = 57,500 $$\n\nAnswer: 57500" + }, + { + "item": 18, + "gold": "7", + "pred": "7", + "correct": true, + "error": null, + "reply": "To determine how many dozens of eggs Claire eats in 4 weeks, we can follow these steps:\n\n1. **Calculate the number of days in 4 weeks:**\n There are 7 days in a week.\n $$4 \\text{ weeks} \\times 7 \\text{ days/week} = 28 \\text{ days}$$\n\n2. **Calculate the total number of eggs consumed:**\n Claire eats 3 eggs every morning.\n $$28 \\text{ days} \\times 3 \\text{ eggs/day} = 84 \\text{ eggs}$$\n\n3. **Convert the total number of eggs into dozens:**\n One dozen equals 12 eggs.\n $$84 \\text{ eggs} \\div 12 \\text{ eggs/dozen} = 7 \\text{ dozens}$$\n\nAnswer: 7" + }, + { + "item": 19, + "gold": "6", + "pred": "6", + "correct": true, + "error": null, + "reply": "To find the speed Marissa needs to walk the remaining distance, we need to determine the total time allowed for the hike and the time she has already spent.\n\n**Step 1: Calculate the total time allowed for the hike.**\nThe total distance of the trail is 12 miles.\nMarissa wants her average speed to be 4 miles per hour.\nUsing the formula $\\text{Time} = \\frac{\\text{Distance}}{\\text{Speed}}$:\n$$ \\text{Total Time} = \\frac{12 \\text{ miles}}{4 \\text{ mph}} = 3 \\text{ hours} $$\n\n**Step 2: Calculate the time already spent.**\nMarissa took 1 hour to walk the first 4 miles.\nShe took another 1 hour to walk the next 2 miles.\n$$ \\text{Time Spent} = 1 \\text{ hour} + 1 \\text{ hour} = 2 \\text{ hours} $$\n\n**Step 3: Calculate the remaining distance.**\nTotal distance = 12 miles.\nDistance covered so far = 4 miles + 2 miles = 6 miles.\n$$ \\text{Remaining Distance} = 12 \\text{ miles} - 6 \\text{ miles} = 6 \\text{ miles} $$\n\n**Step 4: Calculate the remaining time available.**\nTotal time allowed = 3 hours.\nTime spent = 2 hours.\n$$ \\text{Remaining Time} = 3 \\text{ hours} - 2 \\text{ hours} = 1 \\text{ hour} $$\n\n**Step 5: Calculate the required speed for the remaining distance.**\nShe needs to cover the remaining 6 miles in the remaining 1 hour.\n$$ \\text{Required Speed} = \\frac{\\text{Remaining Distance}}{\\text{Remaining Time}} = \\frac{6 \\text{ miles}}{1 \\text{ hour}} = 6 \\text{ mph} $$\n\nAnswer: 6" + }, + { + "item": 20, + "gold": "15", + "pred": "15", + "correct": true, + "error": null, + "reply": "To find the total amount of water in the remaining mixture, we need to calculate the amount of water in each drink separately and then sum them up, accounting for the spill.\n\n**Step 1: Calculate the water in the original orange drink.**\n* Total volume of orange drink = 10 liters.\n* Proportion of water = $\\frac{2}{3}$.\n* Water in orange drink = $10 \\times \\frac{2}{3} = \\frac{20}{3}$ liters.\n\n**Step 2: Account for the spilled orange drink.**\n* The problem states that 1 liter of the orange drink is spilled.\n* Since the drink is a uniform mixture, the spilled liter has the same composition as the rest of the orange drink.\n* Water in the spilled liter = $1 \\times \\frac{2}{3} = \\frac{2}{3}$ liters.\n* Remaining volume of orange drink = $10 - 1 = 9$ liters.\n* Water in the remaining orange drink = $\\frac{20}{3} - \\frac{2}{3} = \\frac{18}{3} = 6$ liters.\n * *Alternative check*: Remaining volume is 9 liters. Water proportion is $\\frac{2}{3}$. Water = $9 \\times \\frac{2}{3} = 6$ liters.\n\n**Step 3: Calculate the water in the pineapple drink.**\n* Total volume of pineapple drink = 15 liters.\n* Proportion of water = $\\frac{3}{5}$.\n* Water in pineapple drink = $15 \\times \\frac{3}{5}$.\n* Calculation: $15 / 5 = 3$, and $3 \\times 3 = 9$ liters.\n\n**Step 4: Calculate the total water in the final mixture.**\n* The final mixture consists of the remaining orange drink and the full pineapple drink.\n* Total water = (Water in remaining orange drink) + (Water in pineapple drink)\n* Total water = $6 + 9 = 15$ liters.\n\n**Verification of Total Volume:**\n* Remaining orange drink: 9 liters.\n* Pineapple drink: 15 liters.\n* Total volume = $9 + 15 = 24$ liters. This matches the problem statement.\n\nAnswer: 15" + }, + { + "item": 21, + "gold": "14", + "pred": "14", + "correct": true, + "error": null, + "reply": "To determine how many years ago Raymond's son was born, we need to calculate the current age of Raymond's son or directly calculate the time elapsed since his birth.\n\n**Step 1: Determine Raymond's current age.**\nWe know that Raymond was born 6 years before Samantha.\nSamantha's current age is 31.\nTherefore, Raymond's current age is:\n$$ \\text{Raymond's Age} = \\text{Samantha's Age} + 6 $$\n$$ \\text{Raymond's Age} = 31 + 6 = 37 \\text{ years old} $$\n\n**Step 2: Determine the age of Raymond's son.**\nWe know that Raymond had a son when he was 23 years old.\nSince Raymond is currently 37 years old, the son's current age is:\n$$ \\text{Son's Age} = \\text{Raymond's Current Age} - \\text{Raymond's Age when Son was Born} $$\n$$ \\text{Son's Age} = 37 - 23 = 14 \\text{ years old} $$\n\n**Step 3: Determine how many years ago the son was born.**\nThe number of years ago the son was born is equal to the son's current age.\n$$ \\text{Years Ago} = 14 $$\n\n**Alternative Method:**\n1. Calculate the difference in age between Raymond and his son: $23$ years.\n2. Calculate Raymond's current age: $31 + 6 = 37$ years.\n3. Calculate the time elapsed since the son's birth: $37 - 23 = 14$ years.\n\nAnswer: 14" + }, + { + "item": 22, + "gold": "7", + "pred": "7", + "correct": true, + "error": null, + "reply": "To determine the total number of DVDs Billy sold on Tuesday, we can break down the sales by customer group:\n\n1. **First group:** The first 3 customers buy 1 DVD each.\n $$3 \\text{ customers} \\times 1 \\text{ DVD/customer} = 3 \\text{ DVDs}$$\n\n2. **Second group:** The next 2 customers buy 2 DVDs each.\n $$2 \\text{ customers} \\times 2 \\text{ DVDs/customer} = 4 \\text{ DVDs}$$\n\n3. **Third group:** The last 3 customers don't buy any DVDs.\n $$3 \\text{ customers} \\times 0 \\text{ DVDs/customer} = 0 \\text{ DVDs}$$\n\nNow, we sum the DVDs sold from each group to find the total:\n$$3 + 4 + 0 = 7 \\text{ DVDs}$$\n\nAnswer: 7" + }, + { + "item": 23, + "gold": "8", + "pred": "8", + "correct": true, + "error": null, + "reply": "To determine how many centimeters shorter the candle will be, we need to calculate the total duration of time the candle burns and then multiply that by the rate of melting.\n\n**Step 1: Calculate the duration of burning.**\nThe candle burns from 1:00 PM to 5:00 PM.\n$$ \\text{Duration} = 5:00 \\text{ PM} - 1:00 \\text{ PM} = 4 \\text{ hours} $$\n\n**Step 2: Calculate the total amount melted.**\nThe candle melts at a rate of 2 centimeters per hour.\n$$ \\text{Total melted} = \\text{Rate} \\times \\text{Duration} $$\n$$ \\text{Total melted} = 2 \\text{ cm/hour} \\times 4 \\text{ hours} $$\n$$ \\text{Total melted} = 8 \\text{ cm} $$\n\nThe candle will be 8 centimeters shorter after burning for this period.\n\nAnswer: 8" + }, + { + "item": 24, + "gold": "26", + "pred": "26", + "correct": true, + "error": null, + "reply": "To find the original price of the book, we can set up an equation based on the information given.\n\n1. **Identify the variables:**\n * Let $P$ be the original price of the book.\n * The discount rate is $25\\%$.\n * The final price paid by Kyle is $\\$19.50$.\n\n2. **Understand the relationship:**\n * A $25\\%$ discount means Kyle paid $100\\% - 25\\% = 75\\%$ of the original price.\n * Therefore, the final price is equal to $75\\%$ of the original price.\n\n3. **Set up the equation:**\n $$ 0.75 \\times P = 19.50 $$\n\n4. **Solve for $P$:**\n To isolate $P$, divide both sides by $0.75$:\n $$ P = \\frac{19.50}{0.75} $$\n\n To make the division easier, we can multiply the numerator and the denominator by 100 to remove the decimals:\n $$ P = \\frac{1950}{75} $$\n\n Now, perform the division:\n * $1950 \\div 75$\n * We know that $75 \\times 2 = 150$.\n * $195 - 150 = 45$. Bring down the 0 to get 450.\n * $75 \\times 6 = 450$.\n * So, $1950 \\div 75 = 26$.\n\n Alternatively:\n $$ \\frac{19.50}{0.75} = \\frac{19.50}{3/4} = 19.50 \\times \\frac{4}{3} $$\n $$ 19.50 \\div 3 = 6.50 $$\n $$ 6.50 \\times 4 = 26.00 $$\n\n5. **Conclusion:**\n The original price of the book was $\\$26.00$.\n\nAnswer: 26" + }, + { + "item": 25, + "gold": "2", + "pred": "2", + "correct": true, + "error": null, + "reply": "To find the number of boxes of pizza Marie ordered, we need to calculate the total cost of the other items and subtract that from the total amount paid. Then, we divide the remaining amount by the cost of one box of pizza.\n\n**Step 1: Calculate the cost of the chicken meal.**\nCost of chicken meal = $12\n\n**Step 2: Calculate the cost of the milk.**\nNumber of packs of milk = 5\nCost per pack = $3\nTotal cost of milk = $5 \\times 3 = 15$\n\n**Step 3: Calculate the cost of the apples.**\nNumber of apples = 4\nCost per apple = $1.50\nTotal cost of apples = $4 \\times 1.50 = 6$\n\n**Step 4: Calculate the total cost of the known items.**\nTotal cost of known items = Cost of chicken + Cost of milk + Cost of apples\nTotal cost of known items = $12 + 15 + 6 = 33$\n\n**Step 5: Determine the amount spent on pizza.**\nTotal amount paid = $50\nAmount spent on pizza = Total amount paid - Total cost of known items\nAmount spent on pizza = $50 - 33 = 17$\n\n**Step 6: Calculate the number of boxes of pizza.**\nCost per box of pizza = $8.50\nNumber of boxes = Amount spent on pizza / Cost per box\nNumber of boxes = $17 / 8.50$\n\n$$17 \\div 8.5 = 2$$\n\nMarie ordered 2 boxes of pizza.\n\nAnswer: 2" + }, + { + "item": 26, + "gold": "243", + "pred": "243", + "correct": true, + "error": null, + "reply": "To find the total amount Mishka spent, we need to calculate the cost for each type of item and then sum them up.\n\n**1. Calculate the cost of the shorts:**\n* Number of pairs: 3\n* Cost per pair: $16.50\n* Total cost for shorts = $3 \\times 16.50$\n * $3 \\times 16 = 48$\n * $3 \\times 0.50 = 1.50$\n * $48 + 1.50 = 49.50$\n* Cost for shorts = **$49.50**\n\n**2. Calculate the cost of the pants:**\n* Number of pairs: 3\n* Cost per pair: $22.50\n* Total cost for pants = $3 \\times 22.50$\n * $3 \\times 22 = 66$\n * $3 \\times 0.50 = 1.50$\n * $66 + 1.50 = 67.50$\n* Cost for pants = **$67.50**\n\n**3. Calculate the cost of the shoes:**\n* Number of pairs: 3\n* Cost per pair: $42.00\n* Total cost for shoes = $3 \\times 42.00$\n * $3 \\times 40 = 120$\n * $3 \\times 2 = 6$\n * $120 + 6 = 126$\n* Cost for shoes = **$126.00**\n\n**4. Calculate the total expenditure:**\n* Total = Cost of shorts + Cost of pants + Cost of shoes\n* Total = $49.50 + 67.50 + 126.00$\n\nLet's add the first two amounts:\n$49.50 + 67.50 = 117.00$\n\nNow add the cost of the shoes:\n$117.00 + 126.00 = 243.00$\n\nMishka spent a total of $243.\n\nAnswer: 243" + }, + { + "item": 27, + "gold": "16", + "pred": "16", + "correct": true, + "error": null, + "reply": "To determine how much Cynthia will spend on ice cream after 60 days, we need to calculate the total number of servings she consumes and then determine how many cartons she needs to buy.\n\n**Step 1: Calculate the total number of servings needed.**\nCynthia eats 1 serving every night for 60 days.\n$$ \\text{Total servings} = 1 \\text{ serving/day} \\times 60 \\text{ days} = 60 \\text{ servings} $$\n\n**Step 2: Calculate the number of cartons needed.**\nEach carton contains 15 servings.\n$$ \\text{Number of cartons} = \\frac{\\text{Total servings}}{\\text{Servings per carton}} = \\frac{60}{15} $$\n$$ \\text{Number of cartons} = 4 \\text{ cartons} $$\n\n**Step 3: Calculate the total cost.**\nEach carton costs $4.00.\n$$ \\text{Total cost} = \\text{Number of cartons} \\times \\text{Cost per carton} $$\n$$ \\text{Total cost} = 4 \\times \\$4.00 = \\$16.00 $$\n\nCynthia will spend $16.00 on ice cream.\n\nAnswer: 16" + }, + { + "item": 28, + "gold": "25", + "pred": "25", + "correct": true, + "error": null, + "reply": "To find the distance Henry traveled between his first and second stops, we can determine the location of each stop relative to the start of the trip.\n\n1. **Total distance of the trip:** 60 miles.\n2. **Location of the first stop:** The problem states he stopped after 20 miles. So, the first stop is at the 20-mile mark.\n3. **Location of the second stop:** The problem states the second stop was 15 miles before the end of the trip.\n * To find the mile marker for the second stop, subtract the distance remaining from the total distance:\n $$60 \\text{ miles} - 15 \\text{ miles} = 45 \\text{ miles}$$\n * So, the second stop is at the 45-mile mark.\n\n4. **Distance between the stops:** Subtract the location of the first stop from the location of the second stop.\n $$45 \\text{ miles} - 20 \\text{ miles} = 25 \\text{ miles}$$\n\nHenry traveled 25 miles between his first and second stops.\n\nAnswer: 25" + }, + { + "item": 29, + "gold": "104", + "pred": "104", + "correct": true, + "error": null, + "reply": "To find the cost of the boots, we need to determine the total cost of the two pairs of high heels and then use the relationship given in the problem.\n\n**Step 1: Determine the cost of the second pair of high heels.**\nThe problem states that one pair of heels costs $\\$33$ and the other costs twice as much.\n$$ \\text{Cost of second pair} = 2 \\times 33 = 66 $$\n\n**Step 2: Calculate the total cost of the two pairs of high heels.**\n$$ \\text{Total cost of heels} = \\text{Cost of first pair} + \\text{Cost of second pair} $$\n$$ \\text{Total cost of heels} = 33 + 66 = 99 $$\n\n**Step 3: Determine the cost of the boots.**\nThe problem states that the two pairs of high heels together cost five dollars less than the boots. Let $B$ be the cost of the boots.\n$$ \\text{Total cost of heels} = B - 5 $$\n$$ 99 = B - 5 $$\n\nTo solve for $B$, add 5 to both sides of the equation:\n$$ B = 99 + 5 $$\n$$ B = 104 $$\n\nSo, the boots cost $\\$104$.\n\nAnswer: 104" + }, + { + "item": 30, + "gold": "109", + "pred": "109", + "correct": true, + "error": null, + "reply": "To find Allen's age 10 years from now, we first need to determine their current ages based on the given ratio and total age.\n\n**Step 1: Define variables based on the ratio.**\nLet Darrell's current age be $7x$ and Allen's current age be $11x$, where $x$ is a common multiplier.\n\n**Step 2: Set up an equation using the total age.**\nThe problem states that their total age now is 162. Therefore:\n$$7x + 11x = 162$$\n\n**Step 3: Solve for $x$.**\nCombine like terms:\n$$18x = 162$$\n\nDivide both sides by 18:\n$$x = \\frac{162}{18}$$\n$$x = 9$$\n\n**Step 4: Calculate Allen's current age.**\nAllen's current age is $11x$:\n$$\\text{Allen's current age} = 11 \\times 9 = 99$$\n\n**Step 5: Calculate Allen's age 10 years from now.**\nAdd 10 to Allen's current age:\n$$\\text{Allen's future age} = 99 + 10 = 109$$\n\nAnswer: 109" + }, + { + "item": 31, + "gold": "80", + "pred": "80", + "correct": true, + "error": null, + "reply": "To find the average guess, we need to determine the number of jelly beans each friend guessed and then calculate the mean of these three values.\n\n**Step 1: Determine the first friend's guess.**\nThe first friend guesses:\n$$ G_1 = 80 $$\n\n**Step 2: Determine the second friend's guess.**\nThe second friend says \"20 more than half the first one\".\nFirst, find half of the first guess:\n$$ \\frac{80}{2} = 40 $$\nThen, add 20 to this value:\n$$ G_2 = 40 + 20 = 60 $$\n\n**Step 3: Determine the third friend's guess.**\nThe third friend says \"25% more than the first one\".\nFirst, calculate 25% of the first guess:\n$$ 0.25 \\times 80 = 20 $$\nThen, add this amount to the first guess:\n$$ G_3 = 80 + 20 = 100 $$\n\n**Step 4: Calculate the average guess.**\nThe average is the sum of the guesses divided by the number of guesses (which is 3).\n$$ \\text{Average} = \\frac{G_1 + G_2 + G_3}{3} $$\n$$ \\text{Average} = \\frac{80 + 60 + 100}{3} $$\n$$ \\text{Average} = \\frac{240}{3} $$\n$$ \\text{Average} = 80 $$\n\nAnswer: 80" + }, + { + "item": 32, + "gold": "35", + "pred": "35", + "correct": true, + "error": null, + "reply": "To determine how many hours per week John spends taking care of his dogs, we can follow these steps:\n\n1. **Calculate the daily time spent per dog:**\n The problem states that each dog takes $0.5$ hours a day to walk and take care of their business.\n\n2. **Calculate the total daily time spent on all dogs:**\n John has 10 dogs.\n $$ \\text{Total daily time} = \\text{Number of dogs} \\times \\text{Time per dog} $$\n $$ \\text{Total daily time} = 10 \\times 0.5 \\text{ hours} = 5 \\text{ hours} $$\n\n3. **Calculate the weekly time spent:**\n There are 7 days in a week.\n $$ \\text{Total weekly time} = \\text{Total daily time} \\times \\text{Days in a week} $$\n $$ \\text{Total weekly time} = 5 \\text{ hours/day} \\times 7 \\text{ days/week} $$\n $$ \\text{Total weekly time} = 35 \\text{ hours} $$\n\nAnswer: 35" + }, + { + "item": 33, + "gold": "70", + "pred": "70", + "correct": true, + "error": null, + "reply": "Let $g$ be the number of gold coins and $s$ be the number of silver coins.\n\nWe are given two pieces of information:\n1. The total number of coins is 110:\n $$g + s = 110$$\n2. There are 30 more gold coins than silver coins:\n $$g = s + 30$$\n\nWe can substitute the second equation into the first equation:\n$$(s + 30) + s = 110$$\n\nCombine like terms:\n$$2s + 30 = 110$$\n\nSubtract 30 from both sides:\n$$2s = 80$$\n\nDivide by 2:\n$$s = 40$$\n\nSo, there are 40 silver coins. Now, we find the number of gold coins using the second equation:\n$$g = s + 30$$\n$$g = 40 + 30$$\n$$g = 70$$\n\nLet's check the answer:\n- Total coins: $70 + 40 = 110$. (Correct)\n- Difference: $70 - 40 = 30$. (Correct)\n\nGretchen has 70 gold coins.\n\nAnswer: 70" + }, + { + "item": 34, + "gold": "23", + "pred": "23", + "correct": true, + "error": null, + "reply": "To find the number of jewels Siobhan has, we will determine the number of jewels each person has step-by-step based on the information provided.\n\n**Step 1: Determine Raymond's jewels.**\nThe problem states that Raymond has 40 jewels.\n$$ R = 40 $$\n\n**Step 2: Determine Aaron's jewels.**\nThe problem states that Aaron has 5 more jewels than half of Raymond's jewels.\nFirst, calculate half of Raymond's jewels:\n$$ \\frac{R}{2} = \\frac{40}{2} = 20 $$\nThen, add 5 to this amount to find Aaron's total:\n$$ A = 20 + 5 = 25 $$\nSo, Aaron has 25 jewels.\n\n**Step 3: Determine Siobhan's jewels.**\nThe problem states that Siobhan has 2 fewer jewels than Aaron.\n$$ S = A - 2 $$\nSubstitute Aaron's count:\n$$ S = 25 - 2 = 23 $$\n\nSo, Siobhan has 23 jewels.\n\nAnswer: 23" + }, + { + "item": 35, + "gold": "9", + "pred": "9", + "correct": true, + "error": null, + "reply": "To find the total number of points Mike scored, we need to calculate the points scored in each 20-minute interval and then sum them up.\n\n**Step 1: Determine the points scored in the first 20 minutes.**\nThe problem states that in the first 20 minutes, Mike scores 4 points.\n$$ \\text{Points}_{\\text{first}} = 4 $$\n\n**Step 2: Determine the points scored in the second 20 minutes.**\nThe problem states that in the second 20 minutes, he scores 25% more points than in the first 20 minutes.\nFirst, calculate 25% of the points scored in the first interval:\n$$ 25\\% \\text{ of } 4 = 0.25 \\times 4 = 1 $$\n\nNow, add this increase to the original number of points to find the total for the second interval:\n$$ \\text{Points}_{\\text{second}} = 4 + 1 = 5 $$\n\nAlternatively, you can calculate it directly:\n$$ \\text{Points}_{\\text{second}} = 4 \\times (1 + 0.25) = 4 \\times 1.25 = 5 $$\n\n**Step 3: Calculate the total points.**\nAdd the points from the first and second intervals together:\n$$ \\text{Total Points} = \\text{Points}_{\\text{first}} + \\text{Points}_{\\text{second}} $$\n$$ \\text{Total Points} = 4 + 5 = 9 $$\n\nAnswer: 9" + }, + { + "item": 36, + "gold": "75", + "pred": "75", + "correct": true, + "error": null, + "reply": "To determine how much Terry spends on yogurt over 30 days, we need to calculate the total number of yogurts he consumes and then apply the sale price.\n\n**Step 1: Calculate the total number of yogurts consumed.**\nTerry eats 2 yogurts per day.\nThe time period is 30 days.\n$$ \\text{Total yogurts} = 2 \\text{ yogurts/day} \\times 30 \\text{ days} = 60 \\text{ yogurts} $$\n\n**Step 2: Determine the cost per yogurt or the cost per bundle.**\nThe sale price is 4 yogurts for $\\$5.00$.\nWe can find the cost of one yogurt:\n$$ \\text{Cost per yogurt} = \\frac{\\$5.00}{4} = \\$1.25 $$\n\nAlternatively, we can determine how many bundles of 4 yogurts are in the total count:\n$$ \\text{Number of bundles} = \\frac{60 \\text{ yogurts}}{4 \\text{ yogurts/bundle}} = 15 \\text{ bundles} $$\n\n**Step 3: Calculate the total cost.**\nUsing the cost per yogurt:\n$$ \\text{Total Cost} = 60 \\text{ yogurts} \\times \\$1.25/\\text{yogurt} = \\$75.00 $$\n\nUsing the number of bundles:\n$$ \\text{Total Cost} = 15 \\text{ bundles} \\times \\$5.00/\\text{bundle} = \\$75.00 $$\n\nBoth methods yield the same result.\n\nAnswer: 75" + }, + { + "item": 37, + "gold": "2", + "pred": "2", + "correct": true, + "error": null, + "reply": "To determine how many Lego sets John still has, we need to track his money flow and the number of items involved.\n\n**Step 1: Calculate the total money John received from selling his toys.**\nJohn starts with 13 Lego sets.\nHe sells them for $15 each.\nTotal money earned = $13 \\text{ sets} \\times \\$15/\\text{set}$\n$13 \\times 15 = 195$\nSo, John has $\\$195$ in total.\n\n**Step 2: Calculate the total money John spent on video games.**\nHe buys 8 video games.\nEach video game costs $20.\nTotal money spent = $8 \\text{ games} \\times \\$20/\\text{game}$\n$8 \\times 20 = 160$\nSo, John spent $\\$160$.\n\n**Step 3: Verify the remaining money.**\nThe problem states he has $5 left.\nLet's check if this matches our calculation:\nRemaining money = Total money earned - Total money spent\nRemaining money = $\\$195 - \\$160 = \\$35$\n\nThere is a discrepancy here. The problem states he has **$5 left**, but based on the initial number of sets (13) and the prices given, he should have $35 left. This implies that the statement \"He has 13 lego sets\" refers to the number he *started* with, but perhaps he didn't sell all of them? Or, more likely, the problem implies that the \"13 lego sets\" is the initial inventory, and we need to find out how many he *didn't* sell to make the math work with the final balance of $5.\n\nLet's re-read carefully: \"He has 13 lego sets and he sells them for $15 each.\" This phrasing usually implies he sells all 13. However, the financial outcome ($5 left) contradicts selling all 13.\n\nLet's assume the question is asking us to deduce the number of unsold sets based on the final balance. Let $x$ be the number of Lego sets he actually sold.\nMoney from sales = $15x$\nMoney spent on games = $8 \\times 20 = 160$\nMoney left = $5$\n\nEquation:\n$15x - 160 = 5$\n$15x = 165$\n$x = 165 / 15$\n$x = 11$\n\nSo, John sold 11 Lego sets.\n\nThe question asks: \"How many lego sets does he still have?\"\nHe started with 13 sets.\nHe sold 11 sets.\nSets remaining = $13 - 11 = 2$.\n\nLet's double-check this scenario:\n1. John has 13 sets.\n2. He sells 11 of them for $15 each: $11 \\times 15 = \\$165$.\n3. He buys 8 video games for $20 each: $8 \\times 20 = \\$160$.\n4. He has $\\$165 - \\$160 = \\$5$ left.\n5. This matches the problem statement perfectly.\n\nTherefore, the number of Lego sets he still has is 2.\n\nAnswer: 2" + }, + { + "item": 38, + "gold": "10", + "pred": "10", + "correct": true, + "error": null, + "reply": "To find John's running speed, we need to determine his total distance and his total time, then use the formula:\n$$ \\text{Speed} = \\frac{\\text{Distance}}{\\text{Time}} $$\n\n**Step 1: Determine the total time spent running.**\nJohn runs 3 days a week.\n* On the first day, he runs for 3 hours.\n* On the other two days, he runs \"half as much\" as the first day.\n * Time per day for the other two days = $3 \\text{ hours} / 2 = 1.5 \\text{ hours}$.\n* Total time for the other two days = $1.5 \\text{ hours} \\times 2 = 3 \\text{ hours}$.\n\nTotal time spent running per week:\n$$ \\text{Total Time} = 3 \\text{ hours (Day 1)} + 3 \\text{ hours (Days 2 \\& 3)} = 6 \\text{ hours} $$\n\n**Step 2: Determine the total distance.**\nThe problem states that John runs 60 miles a week.\n$$ \\text{Total Distance} = 60 \\text{ miles} $$\n\n**Step 3: Calculate the speed.**\n$$ \\text{Speed} = \\frac{60 \\text{ miles}}{6 \\text{ hours}} $$\n$$ \\text{Speed} = 10 \\text{ miles per hour} $$\n\nAnswer: 10" + }, + { + "item": 39, + "gold": "18", + "pred": "18", + "correct": true, + "error": null, + "reply": "To find the total distance Dana travels, we need to determine her running speed and her walking speed, and then calculate the distance covered during each activity based on the time spent.\n\n**Step 1: Determine Dana's speeds.**\n\nWe are given the following relationships:\n1. Running speed ($v_r$) is four times the walking speed ($v_w$):\n $$v_r = 4 \\times v_w$$\n2. Skipping speed ($v_s$) is half as fast as the running speed:\n $$v_s = \\frac{1}{2} \\times v_r$$\n3. The skipping speed is 3 miles per hour:\n $$v_s = 3 \\text{ mph}$$\n\nFirst, let's find the running speed ($v_r$) using the skipping speed:\n$$3 = \\frac{1}{2} \\times v_r$$\n$$v_r = 3 \\times 2$$\n$$v_r = 6 \\text{ mph}$$\n\nNext, let's find the walking speed ($v_w$) using the running speed:\n$$6 = 4 \\times v_w$$\n$$v_w = \\frac{6}{4}$$\n$$v_w = 1.5 \\text{ mph}$$\n\nSo, Dana runs at 6 mph and walks at 1.5 mph.\n\n**Step 2: Determine the time spent on each activity.**\n\nThe total time is 6 hours.\n* Time spent running ($t_r$) is one-third of the total time:\n $$t_r = \\frac{1}{3} \\times 6 \\text{ hours} = 2 \\text{ hours}$$\n* Time spent walking ($t_w$) is two-thirds of the total time:\n $$t_w = \\frac{2}{3} \\times 6 \\text{ hours} = 4 \\text{ hours}$$\n\n(Check: $2 + 4 = 6$ hours, which matches the total time.)\n\n**Step 3: Calculate the distance for each activity.**\n\n* Distance run ($d_r$):\n $$d_r = v_r \\times t_r$$\n $$d_r = 6 \\text{ mph} \\times 2 \\text{ hours} = 12 \\text{ miles}$$\n\n* Distance walked ($d_w$):\n $$d_w = v_w \\times t_w$$\n $$d_w = 1.5 \\text{ mph} \\times 4 \\text{ hours} = 6 \\text{ miles}$$\n\n**Step 4: Calculate the total distance.**\n\n$$Total Distance = d_r + d_w$$\n$$Total Distance = 12 \\text{ miles} + 6 \\text{ miles} = 18 \\text{ miles}$$\n\nAnswer: 18" + }, + { + "item": 40, + "gold": "8", + "pred": "8", + "correct": true, + "error": null, + "reply": "To find the age of Brandon's iPhone, we need to determine the ages of the other iPhones step-by-step based on the given relationships.\n\n**Step 1: Determine the age of Suzy's iPhone.**\nThe problem states that Suzy\u2019s iPhone is 1 year old.\n$$ \\text{Suzy's iPhone age} = 1 \\text{ year} $$\n\n**Step 2: Determine the age of Ben's iPhone.**\nThe problem states that Ben's iPhone is \"two times older than Suzy's iPhone.\" In standard mathematical word problems, this phrasing is often interpreted as \"twice as old as\" or \"two times the age of.\" Let's assume the standard multiplicative relationship:\n$$ \\text{Ben's iPhone age} = 2 \\times \\text{Suzy's iPhone age} $$\n$$ \\text{Ben's iPhone age} = 2 \\times 1 = 2 \\text{ years} $$\n\n*Note: If \"two times older\" were interpreted strictly as \"age + 2 * age\" (i.e., 3 times the age), Ben's phone would be 3 years old. However, in most elementary algebra contexts, \"X times older\" is treated synonymously with \"X times as old.\" Given the simplicity of the numbers, the multiplicative interpretation ($2 \\times$) is the standard intended meaning.*\n\n**Step 3: Determine the age of Brandon's iPhone.**\nThe problem states that Brandon's iPhone is \"four times as old as Ben's iPhone.\"\n$$ \\text{Brandon's iPhone age} = 4 \\times \\text{Ben's iPhone age} $$\n$$ \\text{Brandon's iPhone age} = 4 \\times 2 = 8 \\text{ years} $$\n\n**Conclusion:**\nSuzy's iPhone is 1 year old.\nBen's iPhone is $1 \\times 2 = 2$ years old.\nBrandon's iPhone is $2 \\times 4 = 8$ years old.\n\nAnswer: 8" + }, + { + "item": 41, + "gold": "200", + "pred": "200", + "correct": true, + "error": null, + "reply": "To solve this problem, we need to determine the maximum distance Polly can stand from the dragon while still being able to hit it with the javelin, and then subtract the dragon's fire range from that distance to find how far *outside* the fire range she can stand.\n\n**Step 1: Determine Polly's throwing distance with the gemstone.**\n* Without the gemstone, Polly can throw the javelin 400 feet.\n* With the gemstone, she can throw it three times farther.\n* Throwing distance with gemstone = $400 \\text{ feet} \\times 3 = 1200 \\text{ feet}$.\n\n**Step 2: Determine the dragon's fire range.**\n* The dragon breathes fire upon anything within a distance of 1000 feet.\n* Fire range = 1000 feet.\n\n**Step 3: Calculate how far outside the fire range Polly can stand.**\n* Polly can stand at a maximum distance of 1200 feet from the dragon to hit it.\n* The dragon's fire reaches up to 1000 feet.\n* To find the distance outside the fire range, we subtract the fire range from the maximum throwing distance:\n $$1200 \\text{ feet} - 1000 \\text{ feet} = 200 \\text{ feet}$$\n\nSo, Polly can stand 200 feet outside the reach of the dragon's flames and still hit the dragon.\n\nAnswer: 200" + }, + { + "item": 42, + "gold": "26", + "pred": "26", + "correct": true, + "error": null, + "reply": "To find out how many pieces of pie were taken by the guests, we need to determine the total number of pieces initially available and subtract the number of pieces remaining.\n\n**Step 1: Calculate the total number of pie pieces.**\nGrandma Jones baked 5 apple pies.\nEach pie was cut into 8 pieces.\nTotal pieces = Number of pies $\\times$ Pieces per pie\nTotal pieces = $5 \\times 8 = 40$ pieces.\n\n**Step 2: Determine the number of pieces taken.**\nWe know that 14 pieces were remaining at the end of the evening.\nPieces taken = Total pieces - Remaining pieces\nPieces taken = $40 - 14$\n\n**Step 3: Perform the subtraction.**\n$40 - 14 = 26$\n\nSo, 26 pieces of pie were taken by the guests.\n\nAnswer: 26" + }, + { + "item": 43, + "gold": "48", + "pred": "48", + "correct": true, + "error": null, + "reply": "To determine how many grams of chips can be eaten, we need to follow these steps:\n\n1. **Calculate the remaining calorie allowance:**\n The daily calorie target is 2000 calories, and 1800 calories have already been consumed.\n $$ \\text{Remaining Calories} = 2000 - 1800 = 200 \\text{ calories} $$\n\n2. **Determine the weight of one serving:**\n The total weight of the bag is 300g, and it contains 5 servings.\n $$ \\text{Weight per Serving} = \\frac{300 \\text{ g}}{5} = 60 \\text{ g per serving} $$\n\n3. **Determine the calories per gram:**\n One serving (60g) contains 250 calories.\n $$ \\text{Calories per gram} = \\frac{250 \\text{ calories}}{60 \\text{ g}} = \\frac{25}{6} \\text{ calories/g} \\approx 4.167 \\text{ calories/g} $$\n\n4. **Calculate the maximum grams of chips that can be eaten:**\n We have 200 calories remaining. We divide the remaining calories by the calories per gram to find the weight.\n $$ \\text{Grams allowed} = \\frac{\\text{Remaining Calories}}{\\text{Calories per gram}} $$\n $$ \\text{Grams allowed} = \\frac{200}{\\frac{25}{6}} $$\n $$ \\text{Grams allowed} = 200 \\times \\frac{6}{25} $$\n $$ \\text{Grams allowed} = \\frac{1200}{25} $$\n $$ \\text{Grams allowed} = 48 \\text{ g} $$\n\nAlternatively, we can calculate the fraction of a serving allowed:\n$$ \\text{Fraction of serving} = \\frac{200 \\text{ calories}}{250 \\text{ calories/serving}} = 0.8 \\text{ servings} $$\n$$ \\text{Grams allowed} = 0.8 \\text{ servings} \\times 60 \\text{ g/serving} = 48 \\text{ g} $$\n\nAnswer: 48" + }, + { + "item": 44, + "gold": "20", + "pred": "20", + "correct": true, + "error": null, + "reply": "To find Charlie's net profit, we need to calculate his total revenue and subtract his total costs.\n\n**Step 1: Calculate the total revenue.**\nCharlie sells 20 candles at a price of $2.00 each.\n$$ \\text{Total Revenue} = 20 \\text{ candles} \\times \\$2.00/\\text{candle} = \\$40.00 $$\n\n**Step 2: Calculate the total cost of supplies.**\nWe know that 1 pound of beeswax makes 10 tapered candles.\nTo make 20 candles, we need to determine how many pounds of beeswax are required:\n$$ \\text{Pounds of beeswax needed} = \\frac{20 \\text{ candles}}{10 \\text{ candles/pound}} = 2 \\text{ pounds} $$\n\nThe cost for 1 pound of beeswax and wicks is $10.00. Therefore, the cost for 2 pounds is:\n$$ \\text{Total Cost} = 2 \\text{ pounds} \\times \\$10.00/\\text{pound} = \\$20.00 $$\n\n**Step 3: Calculate the net profit.**\nNet profit is defined as Total Revenue minus Total Cost.\n$$ \\text{Net Profit} = \\text{Total Revenue} - \\text{Total Cost} $$\n$$ \\text{Net Profit} = \\$40.00 - \\$20.00 = \\$20.00 $$\n\nAnswer: 20" + }, + { + "item": 45, + "gold": "104", + "pred": "7", + "correct": false, + "error": null, + "reply": "To find the total number of hours Meredith spent writing articles over the three days, we need to determine the number of articles written each day and then multiply by the time it takes to write one article.\n\n**Step 1: Determine the number of articles written on Monday.**\nAccording to the problem, Meredith wrote 5 articles on Monday.\n$$ \\text{Articles on Monday} = 5 $$\n\n**Step 2: Determine the number of articles written on Tuesday.**\nThe problem states she wrote \"$2/5$ times more articles on Tuesday than on Monday.\"\nThis phrasing can be interpreted in two ways in common language, but in mathematical contexts, \"X times more than Y\" usually means $Y + (X \\times Y)$. However, sometimes it is used loosely to mean \"X times as many as Y\". Let's look at the context.\nIf it means \"2/5 times as many\":\n$$ \\text{Articles on Tuesday} = 5 \\times \\frac{2}{5} = 2 $$\nIf it means \"2/5 times more than\":\n$$ \\text{Articles on Tuesday} = 5 + (5 \\times \\frac{2}{5}) = 5 + 2 = 7 $$\n\nLet's re-read carefully: \"2/5 times more articles on Tuesday than on Monday\".\nStandard mathematical interpretation of \"A is $k$ times more than B\" is $A = B + k \\cdot B$.\nHowever, in many word problems of this level, \"times more\" is often used synonymously with \"times as many\". Let's check the next part of the problem to see if integer results or logical flow suggest one interpretation.\n\"On Wednesday, she wrote twice the number of articles she wrote on Tuesday.\"\n\nCase 1: \"Times as many\" (Tuesday = 2)\n- Monday: 5\n- Tuesday: 2\n- Wednesday: $2 \\times 2 = 4$\n- Total Articles: $5 + 2 + 4 = 11$\n- Total Hours: $11 \\times 4 = 44$\n\nCase 2: \"Times more than\" (Tuesday = 7)\n- Monday: 5\n- Tuesday: 7\n- Wednesday: $2 \\times 7 = 14$\n- Total Articles: $5 + 7 + 14 = 26$\n- Total Hours: $26 \\times 4 = 104$\n\nLet's analyze the phrase \"2/5 times more\". If I have 5 apples and you have 2/5 times more, you have 2 more apples, so you have 7. If the problem meant \"2/5 as many\", it would typically say \"2/5 as many articles\". The word \"more\" implies addition. Therefore, the calculation $5 + (2/5 \\times 5) = 7$ is the strictly correct linguistic interpretation.\n\nLet's double-check standard test question conventions. Often, \"times more\" is a source of ambiguity. However, \"2/5 times more\" is a specific fraction. If it were \"twice as many\", it's clear. \"2/5 times more\" is a small increase.\nLet's consider the source or style. If this is a standard arithmetic problem, \"2/5 times more\" is frequently intended to mean multiplication by the fraction itself (i.e., $5 \\times 2/5 = 2$) by less rigorous authors who confuse \"more\" with \"as many\".\nLet's look at the numbers.\nIf Tuesday = 2, Wednesday = 4. Total = 11 articles.\nIf Tuesday = 7, Wednesday = 14. Total = 26 articles.\n\nLet's re-read the prompt again. \"2/5 times more articles on Tuesday than on Monday\".\nIn strict English:\n\"50% more\" means $1.5 \\times$ original.\n\"2/5 times more\" means $(1 + 2/5) \\times$ original = $1.4 \\times$ original.\n$5 \\times 1.4 = 7$.\n\nHowever, in many online math problems and lower-level curricula, \"times more\" is often treated as \"times as many\". Let's look for clues. \"2/5 times more\" is a very specific phrasing. If the author meant 2 articles, they likely would have said \"2/5 as many\". The use of \"more\" strongly points to the additive interpretation.\n\nLet's calculate based on the strict interpretation (Additive):\n1. **Monday**: 5 articles.\n2. **Tuesday**: $5 + (5 \\times \\frac{2}{5}) = 5 + 2 = 7" + }, + { + "item": 46, + "gold": "163", + "pred": "163", + "correct": true, + "error": null, + "reply": "To find the number of Post-it notes in the package Candice purchased, we can set up an equation based on the total number of notes she started with, added, used, and had remaining.\n\n**1. Identify the given values:**\n* Initial notes in purse: $80$\n* Notes purchased (unknown): Let this be $x$\n* Notes used on cups: $220$\n* Notes remaining: $23$\n\n**2. Formulate the equation:**\nThe total number of notes available is the sum of the initial notes and the purchased notes. This total must equal the sum of the notes used and the notes remaining.\n\n$$ \\text{Initial Notes} + \\text{Purchased Notes} = \\text{Used Notes} + \\text{Remaining Notes} $$\n\nSubstituting the known values:\n$$ 80 + x = 220 + 23 $$\n\n**3. Solve for $x$:**\nFirst, calculate the total number of notes used and remaining:\n$$ 220 + 23 = 243 $$\n\nNow, the equation is:\n$$ 80 + x = 243 $$\n\nSubtract $80$ from both sides to isolate $x$:\n$$ x = 243 - 80 $$\n$$ x = 163 $$\n\n**4. Verification:**\n* Start with 80 notes.\n* Buy 163 notes. Total = $80 + 163 = 243$ notes.\n* Use 220 notes. Remaining = $243 - 220 = 23$ notes.\n* This matches the problem statement.\n\nAnswer: 163" + }, + { + "item": 47, + "gold": "800", + "pred": "800", + "correct": true, + "error": null, + "reply": "Let's break down the problem step by step.\n\n**Step 1: Determine the number of blue ties bought.**\nJohn spent $200 on blue ties, and each blue tie costs $40.\n$$ \\text{Number of blue ties} = \\frac{\\text{Total spent on blue ties}}{\\text{Cost per blue tie}} $$\n$$ \\text{Number of blue ties} = \\frac{200}{40} = 5 $$\n\n**Step 2: Determine the number of red ties bought.**\nThe problem states that John buys twice as many red ties as blue ties.\n$$ \\text{Number of red ties} = 2 \\times \\text{Number of blue ties} $$\n$$ \\text{Number of red ties} = 2 \\times 5 = 10 $$\n\n**Step 3: Determine the cost of a red tie.**\nThe red ties cost 50% more than blue ties. The cost of a blue tie is $40.\n$$ \\text{Cost of red tie} = \\text{Cost of blue tie} + (50\\% \\times \\text{Cost of blue tie}) $$\n$$ \\text{Cost of red tie} = 40 + (0.50 \\times 40) $$\n$$ \\text{Cost of red tie} = 40 + 20 = 60 $$\nSo, each red tie costs $60.\n\n**Step 4: Calculate the total amount spent on red ties.**\n$$ \\text{Total spent on red ties} = \\text{Number of red ties} \\times \\text{Cost per red tie} $$\n$$ \\text{Total spent on red ties} = 10 \\times 60 = 600 $$\n\n**Step 5: Calculate the total amount spent on all ties.**\n$$ \\text{Total spent} = \\text{Total spent on blue ties} + \\text{Total spent on red ties} $$\nWe are given that the total spent on blue ties is $200.\n$$ \\text{Total spent} = 200 + 600 = 800 $$\n\nAnswer: 800" + }, + { + "item": 48, + "gold": "8", + "pred": "8", + "correct": true, + "error": null, + "reply": "To determine how many pieces of wire Tracy obtained, we need to ensure that the units of measurement are consistent before performing the division.\n\n**Step 1: Convert the total length of the wire into inches.**\nThe total length of the wire is given as 4 feet.\nWe know that 1 foot is equal to 12 inches.\nTherefore, the total length in inches is:\n$$ 4 \\text{ feet} \\times 12 \\text{ inches/foot} = 48 \\text{ inches} $$\n\n**Step 2: Divide the total length by the length of each piece.**\nEach piece of wire is 6 inches long.\nTo find the number of pieces, we divide the total length in inches by the length of one piece:\n$$ \\frac{48 \\text{ inches}}{6 \\text{ inches/piece}} = 8 \\text{ pieces} $$\n\n**Conclusion:**\nTracy obtained 8 pieces of wire.\n\nAnswer: 8" + }, + { + "item": 49, + "gold": "30", + "pred": "30", + "correct": true, + "error": null, + "reply": "To find the total number of unoccupied units in the building, we can follow these steps:\n\n**Step 1: Calculate the total number of units in the building.**\nThe building has 15 floors, and each floor contains 8 units.\n$$ \\text{Total Units} = \\text{Number of Floors} \\times \\text{Units per Floor} $$\n$$ \\text{Total Units} = 15 \\times 8 = 120 $$\n\n**Step 2: Determine the fraction of the building that is unoccupied.**\nWe are given that $3/4$ of the building is occupied. Therefore, the fraction of the building that is unoccupied is:\n$$ \\text{Unoccupied Fraction} = 1 - \\frac{3}{4} = \\frac{1}{4} $$\n\n**Step 3: Calculate the number of unoccupied units.**\nMultiply the total number of units by the unoccupied fraction.\n$$ \\text{Unoccupied Units} = \\text{Total Units} \\times \\text{Unoccupied Fraction} $$\n$$ \\text{Unoccupied Units} = 120 \\times \\frac{1}{4} $$\n$$ \\text{Unoccupied Units} = \\frac{120}{4} = 30 $$\n\nAlternatively, we could calculate the occupied units first:\n$$ \\text{Occupied Units} = 120 \\times \\frac{3}{4} = 90 $$\n$$ \\text{Unoccupied Units} = 120 - 90 = 30 $$\n\nBoth methods yield the same result.\n\nAnswer: 30" + } + ], + "correct": 48, + "n": 50 +} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.idle-energy.json b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.idle-energy.json new file mode 100644 index 00000000..b75c2194 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.idle-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":7572.788,"seconds":60.018,"avg_watts":126.176,"command_seconds":60.002,"energy_uj":7572787681,"max_energy_range_uj":262143328850,"samples":13,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.log.gz b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..18bc0933508bf4d403702d22a2c1bde762b4c288 GIT binary patch literal 23068 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 literal 0 HcmV?d00001 diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n1-energy.json b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n1-energy.json new file mode 100644 index 00000000..77a5bc35 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n1-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":14231.752,"seconds":109.857,"avg_watts":129.549,"command_seconds":109.841,"energy_uj":14231752385,"max_energy_range_uj":262143328850,"samples":23,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n1.json b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n1.json new file mode 100644 index 00000000..918a7d1f --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n1.json @@ -0,0 +1,212 @@ +{ + "tool": "k3d-gpu/bench/llm_load.py", + "schema": 1, + "started_at": "2026-10-21T21:25:33Z", + "config": { + "base_url": "http://127.0.0.1:18080/v1", + "model": "m", + "prompt": "Explain in three short paragraphs how a CPU cache hierarchy reduces memory latency, and what a cache miss costs.", + "max_tokens": 256, + "temperature": 0.0, + "ignore_eos": true, + "extra_body": { + "chat_template_kwargs": { + "enable_thinking": false + } + }, + "unique_prompts": true, + "requests": 8, + "concurrency": "1", + "warmup": 3, + "timeout": 900.0, + "label": "lsq", + "out": "/home/devcloud/k3dgpu-gemma/results/H54b/hold2/lsq.n1.json", + "run_id": "f426f23d" + }, + "phases": [ + { + "concurrency": 1, + "requests": 8, + "ok": 8, + "errors": 0, + "wall_s": 79.9056954048574, + "output_tokens_total": 2048, + "aggregate_tokens_per_s": 25.630213085856003, + "requests_per_s": 0.10011801986662501, + "stats": { + "first_chunk_s": { + "n": 8, + "median": 0.6443026803899556, + "p90": 0.6988746677525342, + "min": 0.6426870720461011, + "max": 0.6988746677525342 + }, + "ttft_s": { + "n": 8, + "median": 0.6443363418802619, + "p90": 0.6989114689640701, + "min": 0.6427180669270456, + "max": 0.6989114689640701 + }, + "latency_s": { + "n": 8, + "median": 9.986142967361957, + "p90": 10.01601637294516, + "min": 9.964887354057282, + "max": 10.01601637294516 + }, + "output_tokens": { + "n": 8, + "median": 256.0, + "p90": 256, + "min": 256, + "max": 256 + }, + "tokens_per_s": { + "n": 8, + "median": 25.635525990686993, + "p90": 25.690205107613945, + "min": 25.55906365044454, + "max": 25.690205107613945 + }, + "decode_tokens_per_s": { + "n": 8, + "median": 27.294807009041357, + "p90": 27.49705518701382, + "min": 27.208462514313585, + "max": 27.49705518701382 + } + }, + "samples": [ + { + "index": 0, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 0.6988746677525342, + "ttft_s": 0.6989114689640701, + "latency_s": 9.972631809767336, + "output_tokens": 256, + "tokens_per_s": 25.670254841783088, + "decode_tokens_per_s": 27.49705518701382, + "prompt_tokens": 46, + "finished": true + }, + { + "index": 1, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 0.6824868218973279, + "ttft_s": 0.6825250717811286, + "latency_s": 9.981647942680866, + "output_tokens": 256, + "tokens_per_s": 25.647067645549885, + "decode_tokens_per_s": 27.421941137909435, + "prompt_tokens": 46, + "finished": true + }, + { + "index": 2, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 0.6446592477150261, + "ttft_s": 0.6446910668164492, + "latency_s": 9.982864836696535, + "output_tokens": 256, + "tokens_per_s": 25.643941312212924, + "decode_tokens_per_s": 27.307266525976686, + "prompt_tokens": 46, + "finished": true + }, + { + "index": 3, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 0.6439461130648851, + "ttft_s": 0.6439816169440746, + "latency_s": 9.998172607738525, + "output_tokens": 256, + "tokens_per_s": 25.60467897922242, + "decode_tokens_per_s": 27.260508177665816, + "prompt_tokens": 46, + "finished": true + }, + { + "index": 4, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 0.6451822542585433, + "ttft_s": 0.6452176691964269, + "latency_s": 9.997024415060878, + "output_tokens": 256, + "tokens_per_s": 25.607619764769883, + "decode_tokens_per_s": 27.26745824947312, + "prompt_tokens": 46, + "finished": true + }, + { + "index": 5, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 0.6432129861786962, + "ttft_s": 0.6432482860982418, + "latency_s": 9.964887354057282, + "output_tokens": 256, + "tokens_per_s": 25.690205107613945, + "decode_tokens_per_s": 27.355704092481226, + "prompt_tokens": 46, + "finished": true + }, + { + "index": 6, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 0.6426870720461011, + "ttft_s": 0.6427180669270456, + "latency_s": 9.989421098027378, + "output_tokens": 256, + "tokens_per_s": 25.62711066916106, + "decode_tokens_per_s": 27.28234749210603, + "prompt_tokens": 46, + "finished": true + }, + { + "index": 7, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 0.6438886411488056, + "ttft_s": 0.6439322330988944, + "latency_s": 10.01601637294516, + "output_tokens": 256, + "tokens_per_s": 25.55906365044454, + "decode_tokens_per_s": 27.208462514313585, + "prompt_tokens": 47, + "finished": true + } + ] + } + ] +} diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n16-energy.json b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n16-energy.json new file mode 100644 index 00000000..abffb79d --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n16-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":23136.138,"seconds":177.939,"avg_watts":130.023,"command_seconds":177.922,"energy_uj":23136138464,"max_energy_range_uj":262143328850,"samples":37,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n16.json b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n16.json new file mode 100644 index 00000000..645459d5 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n16.json @@ -0,0 +1,596 @@ +{ + "tool": "k3d-gpu/bench/llm_load.py", + "schema": 1, + "started_at": "2026-10-21T21:29:06Z", + "config": { + "base_url": "http://127.0.0.1:18080/v1", + "model": "m", + "prompt": "Explain in three short paragraphs how a CPU cache hierarchy reduces memory latency, and what a cache miss costs.", + "max_tokens": 256, + "temperature": 0.0, + "ignore_eos": true, + "extra_body": { + "chat_template_kwargs": { + "enable_thinking": false + } + }, + "unique_prompts": true, + "requests": 32, + "concurrency": "16", + "warmup": 3, + "timeout": 900.0, + "label": "lsq", + "out": "/home/devcloud/k3dgpu-gemma/results/H54b/hold2/lsq.n16.json", + "run_id": "2b748f72" + }, + "phases": [ + { + "concurrency": 16, + "requests": 32, + "ok": 32, + "errors": 0, + "wall_s": 147.08325457712635, + "output_tokens_total": 8192, + "aggregate_tokens_per_s": 55.696347103227474, + "requests_per_s": 0.21756385587198232, + "stats": { + "first_chunk_s": { + "n": 32, + "median": 56.85698579158634, + "p90": 57.54385761497542, + "min": 1.239808248821646, + "max": 57.54797320486978 + }, + "ttft_s": { + "n": 32, + "median": 56.85702438908629, + "p90": 57.54390600929037, + "min": 1.239836101885885, + "max": 57.54800020623952 + }, + "latency_s": { + "n": 32, + "median": 73.34832191327587, + "p90": 74.06744538620114, + "min": 17.760391059331596, + "max": 74.07135435799137 + }, + "output_tokens": { + "n": 32, + "median": 256.0, + "p90": 256, + "min": 256, + "max": 256 + }, + "tokens_per_s": { + "n": 32, + "median": 3.490272009441717, + "p90": 14.412750721117302, + "min": 3.45612689573268, + "max": 14.414097028876707 + }, + "decode_tokens_per_s": { + "n": 32, + "median": 15.463554604440992, + "p90": 15.571309019667872, + "min": 15.38170040728011, + "max": 15.57206358010134 + } + }, + "samples": [ + { + "index": 0, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.2405646638944745, + "ttft_s": 1.2406113897450268, + "latency_s": 17.760482330806553, + "output_tokens": 256, + "tokens_per_s": 14.414022954542942, + "decode_tokens_per_s": 15.43595594116756, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 1, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1256, + "first_chunk_s": 1.2406760528683662, + "ttft_s": 1.2407032498158514, + "latency_s": 17.762050073128194, + "output_tokens": 256, + "tokens_per_s": 14.412750721117302, + "decode_tokens_per_s": 15.43457701887741, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 2, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.239808248821646, + "ttft_s": 1.239836101885885, + "latency_s": 17.76065473910421, + "output_tokens": 256, + "tokens_per_s": 14.413883033059388, + "decode_tokens_per_s": 15.435070476806308, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 3, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.2404199792072177, + "ttft_s": 1.240447262302041, + "latency_s": 17.760391059331596, + "output_tokens": 256, + "tokens_per_s": 14.414097028876707, + "decode_tokens_per_s": 15.435887865783869, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 4, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 19.76452959002927, + "ttft_s": 19.76455830503255, + "latency_s": 36.14029401028529, + "output_tokens": 256, + "tokens_per_s": 7.083506291541073, + "decode_tokens_per_s": 15.57181946446567, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 5, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 19.764943356160074, + "ttft_s": 19.76497065415606, + "latency_s": 36.140449644997716, + "output_tokens": 256, + "tokens_per_s": 7.0834757872314835, + "decode_tokens_per_s": 15.57206358010134, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 6, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 19.76265931688249, + "ttft_s": 19.762703971005976, + "latency_s": 36.13897649105638, + "output_tokens": 256, + "tokens_per_s": 7.083764535040291, + "decode_tokens_per_s": 15.571309019667872, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 7, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1327, + "first_chunk_s": 38.124038332141936, + "ttft_s": 38.12406580708921, + "latency_s": 54.50008633732796, + "output_tokens": 256, + "tokens_per_s": 4.697240265189481, + "decode_tokens_per_s": 15.57154862679464, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 8, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 19.76256602909416, + "ttft_s": 19.762594481930137, + "latency_s": 36.13901740312576, + "output_tokens": 256, + "tokens_per_s": 7.083756515689268, + "decode_tokens_per_s": 15.571166012692515, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 9, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 38.12291958602145, + "ttft_s": 38.122968948446214, + "latency_s": 54.4997090450488, + "output_tokens": 256, + "tokens_per_s": 4.697272783390338, + "decode_tokens_per_s": 15.570864439187176, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 10, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 38.12148341536522, + "ttft_s": 38.12152735237032, + "latency_s": 54.498528397176415, + "output_tokens": 256, + "tokens_per_s": 4.697374544397118, + "decode_tokens_per_s": 15.570616335820064, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 11, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1366, + "first_chunk_s": 56.48381001316011, + "ttft_s": 56.48383922316134, + "latency_s": 73.00542613398284, + "output_tokens": 256, + "tokens_per_s": 3.5065886682200484, + "decode_tokens_per_s": 15.434352727520212, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 12, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 56.48258946929127, + "ttft_s": 56.482616033405066, + "latency_s": 73.00484323035926, + "output_tokens": 256, + "tokens_per_s": 3.5066166664068903, + "decode_tokens_per_s": 15.433754599804091, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 13, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 38.1205250849016, + "ttft_s": 38.12055310513824, + "latency_s": 54.49838862521574, + "output_tokens": 256, + "tokens_per_s": 4.697386591748732, + "decode_tokens_per_s": 15.569822989576183, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 14, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 56.48091307794675, + "ttft_s": 56.48094045789912, + "latency_s": 73.00210877601057, + "output_tokens": 256, + "tokens_per_s": 3.506748014437151, + "decode_tokens_per_s": 15.434743783855431, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 15, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 56.48014789214358, + "ttft_s": 56.48019396606833, + "latency_s": 73.0008788718842, + "output_tokens": 256, + "tokens_per_s": 3.506807095422473, + "decode_tokens_per_s": 15.435195420392706, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 16, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1321, + "first_chunk_s": 57.23369438899681, + "ttft_s": 57.23372232494876, + "latency_s": 73.69451922317967, + "output_tokens": 256, + "tokens_per_s": 3.473799716702385, + "decode_tokens_per_s": 15.491352063726975, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 17, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1394, + "first_chunk_s": 57.23200025130063, + "ttft_s": 57.232028594240546, + "latency_s": 73.69238304207101, + "output_tokens": 256, + "tokens_per_s": 3.4739004145631913, + "decode_tokens_per_s": 15.491768467574516, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 18, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 57.230921033769846, + "ttft_s": 57.23095572274178, + "latency_s": 73.6915119709447, + "output_tokens": 256, + "tokens_per_s": 3.4739414778317537, + "decode_tokens_per_s": 15.49157854418435, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 19, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 57.23016157001257, + "ttft_s": 57.23020955501124, + "latency_s": 73.6912176925689, + "output_tokens": 256, + "tokens_per_s": 3.4739553506633847, + "decode_tokens_per_s": 15.491153267714424, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 20, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1334, + "first_chunk_s": 57.433655025903136, + "ttft_s": 57.43368400679901, + "latency_s": 73.85386168770492, + "output_tokens": 256, + "tokens_per_s": 3.4663048640910605, + "decode_tokens_per_s": 15.529673609837062, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 21, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 57.433542512822896, + "ttft_s": 57.433571356814355, + "latency_s": 73.85360867809504, + "output_tokens": 256, + "tokens_per_s": 3.4663167390482506, + "decode_tokens_per_s": 15.529806358571124, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 22, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 57.43126057321206, + "ttft_s": 57.431306429207325, + "latency_s": 73.851324822288, + "output_tokens": 256, + "tokens_per_s": 3.4664239350617625, + "decode_tokens_per_s": 15.529824260577918, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 23, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1321, + "first_chunk_s": 57.431832088157535, + "ttft_s": 57.43186084693298, + "latency_s": 73.85355510516092, + "output_tokens": 256, + "tokens_per_s": 3.466319253494008, + "decode_tokens_per_s": 15.52823941246102, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 24, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 57.48398680007085, + "ttft_s": 57.4840152869001, + "latency_s": 74.0613218890503, + "output_tokens": 256, + "tokens_per_s": 3.4565950683881685, + "decode_tokens_per_s": 15.382474736090396, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 25, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 57.48406510800123, + "ttft_s": 57.484093490988016, + "latency_s": 74.06139139970765, + "output_tokens": 256, + "tokens_per_s": 3.4565918241850713, + "decode_tokens_per_s": 15.382482802934394, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 26, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 57.48248154018074, + "ttft_s": 57.482509959023446, + "latency_s": 74.0600034352392, + "output_tokens": 256, + "tokens_per_s": 3.456656604449875, + "decode_tokens_per_s": 15.382301333181431, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 27, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 57.48164193239063, + "ttft_s": 57.48169462522492, + "latency_s": 74.05983574409038, + "output_tokens": 256, + "tokens_per_s": 3.456664431239001, + "decode_tokens_per_s": 15.38170040728011, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 28, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 57.54797320486978, + "ttft_s": 57.54800020623952, + "latency_s": 74.07135435799137, + "output_tokens": 256, + "tokens_per_s": 3.45612689573268, + "decode_tokens_per_s": 15.43270195978728, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 29, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 57.54688481101766, + "ttft_s": 57.5469124391675, + "latency_s": 74.06970399105921, + "output_tokens": 256, + "tokens_per_s": 3.456203902622605, + "decode_tokens_per_s": 15.433227442175456, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 30, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1323, + "first_chunk_s": 57.54385761497542, + "ttft_s": 57.54390600929037, + "latency_s": 74.06744538620114, + "output_tokens": 256, + "tokens_per_s": 3.4563092957394357, + "decode_tokens_per_s": 15.432528962670379, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 31, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 57.5440242360346, + "ttft_s": 57.54406155040488, + "latency_s": 74.06796199129894, + "output_tokens": 256, + "tokens_per_s": 3.456285188865779, + "decode_tokens_per_s": 15.432191746260763, + "prompt_tokens": 48, + "finished": true + } + ] + } + ] +} diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n4-energy.json b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n4-energy.json new file mode 100644 index 00000000..f9eb6370 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n4-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":13420.889,"seconds":103.407,"avg_watts":129.787,"command_seconds":103.392,"energy_uj":13420888860,"max_energy_range_uj":262143328850,"samples":22,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n4.json b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n4.json new file mode 100644 index 00000000..25848e16 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.n4.json @@ -0,0 +1,340 @@ +{ + "tool": "k3d-gpu/bench/llm_load.py", + "schema": 1, + "started_at": "2026-10-21T21:27:23Z", + "config": { + "base_url": "http://127.0.0.1:18080/v1", + "model": "m", + "prompt": "Explain in three short paragraphs how a CPU cache hierarchy reduces memory latency, and what a cache miss costs.", + "max_tokens": 256, + "temperature": 0.0, + "ignore_eos": true, + "extra_body": { + "chat_template_kwargs": { + "enable_thinking": false + } + }, + "unique_prompts": true, + "requests": 16, + "concurrency": "4", + "warmup": 3, + "timeout": 900.0, + "label": "lsq", + "out": "/home/devcloud/k3dgpu-gemma/results/H54b/hold2/lsq.n4.json", + "run_id": "00e8518c" + }, + "phases": [ + { + "concurrency": 4, + "requests": 16, + "ok": 16, + "errors": 0, + "wall_s": 73.32399781607091, + "output_tokens_total": 4096, + "aggregate_tokens_per_s": 55.861656783561955, + "requests_per_s": 0.2182095968107889, + "stats": { + "first_chunk_s": { + "n": 16, + "median": 1.9637499956879765, + "p90": 2.09760964801535, + "min": 1.3488043881952763, + "max": 2.0977690112777054 + }, + "ttft_s": { + "n": 16, + "median": 1.9637784655205905, + "p90": 2.097637650091201, + "min": 1.3488533799536526, + "max": 2.0977971930988133 + }, + "latency_s": { + "n": 16, + "median": 18.448291637236252, + "p90": 18.58550304081291, + "min": 17.836920314002782, + "max": 18.585742968134582 + }, + "output_tokens": { + "n": 16, + "median": 256.0, + "p90": 256, + "min": 256, + "max": 256 + }, + "tokens_per_s": { + "n": 16, + "median": 13.876982428663931, + "p90": 14.350467079053901, + "min": 13.773998727891279, + "max": 14.352253387544065 + }, + "decode_tokens_per_s": { + "n": 16, + "median": 15.465806029819017, + "p90": 15.548502489906737, + "min": 15.390183772533538, + "max": 15.548541592857932 + } + }, + "samples": [ + { + "index": 0, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.3513017371296883, + "ttft_s": 1.351330656092614, + "latency_s": 17.83932046685368, + "output_tokens": 256, + "tokens_per_s": 14.35032239460356, + "decode_tokens_per_s": 15.465802861763748, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 1, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.350422129034996, + "ttft_s": 1.3504544566385448, + "latency_s": 17.8391406070441, + "output_tokens": 256, + "tokens_per_s": 14.350467079053901, + "decode_tokens_per_s": 15.46514971987189, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 2, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1335, + "first_chunk_s": 1.3511178530752659, + "ttft_s": 1.351167757064104, + "latency_s": 17.839150812942535, + "output_tokens": 256, + "tokens_per_s": 14.350458869054949, + "decode_tokens_per_s": 15.465809197874286, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 3, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.3488043881952763, + "ttft_s": 1.3488533799536526, + "latency_s": 17.836920314002782, + "output_tokens": 256, + "tokens_per_s": 14.352253387544065, + "decode_tokens_per_s": 15.46573052013789, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 4, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1361, + "first_chunk_s": 1.9739598245359957, + "ttft_s": 1.974003710784018, + "latency_s": 18.542532270774245, + "output_tokens": 256, + "tokens_per_s": 13.80609704552024, + "decode_tokens_per_s": 15.390624404376824, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 5, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.9741354030556977, + "ttft_s": 1.9741625278256834, + "latency_s": 18.542096013668925, + "output_tokens": 256, + "tokens_per_s": 13.806421874381465, + "decode_tokens_per_s": 15.391177192852034, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 6, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.9733343194238842, + "ttft_s": 1.9733628924004734, + "latency_s": 18.54236582107842, + "output_tokens": 256, + "tokens_per_s": 13.806220979039615, + "decode_tokens_per_s": 15.390183772533538, + "prompt_tokens": 47, + "finished": true + }, + { + "index": 7, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.9737914982251823, + "ttft_s": 1.97381936525926, + "latency_s": 18.542224479373544, + "output_tokens": 256, + "tokens_per_s": 13.806326219638619, + "decode_tokens_per_s": 15.390739074986206, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 8, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.9531961479224265, + "ttft_s": 1.953257683198899, + "latency_s": 18.353686592075974, + "output_tokens": 256, + "tokens_per_s": 13.948151436263792, + "decode_tokens_per_s": 15.548373851489696, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 9, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1354, + "first_chunk_s": 1.9541656719520688, + "ttft_s": 1.9541940386407077, + "latency_s": 18.35448726080358, + "output_tokens": 256, + "tokens_per_s": 13.947542982946397, + "decode_tokens_per_s": 15.548502489906737, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 10, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.952338902745396, + "ttft_s": 1.9523664959706366, + "latency_s": 18.35314325382933, + "output_tokens": 256, + "tokens_per_s": 13.948564366302014, + "decode_tokens_per_s": 15.548044081376371, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 11, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 1.9526803586632013, + "ttft_s": 1.952708888798952, + "latency_s": 18.352960865944624, + "output_tokens": 256, + "tokens_per_s": 13.948702984215933, + "decode_tokens_per_s": 15.548541592857932, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 12, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 2.097466384060681, + "ttft_s": 2.097513912245631, + "latency_s": 18.58511574799195, + "output_tokens": 256, + "tokens_per_s": 13.774463579956977, + "decode_tokens_per_s": 15.466166792501108, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 13, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1404, + "first_chunk_s": 2.0974101601168513, + "ttft_s": 2.097438157070428, + "latency_s": 18.58550304081291, + "output_tokens": 256, + "tokens_per_s": 13.774176541675292, + "decode_tokens_per_s": 15.465732443316282, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 14, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1326, + "first_chunk_s": 2.0977690112777054, + "ttft_s": 2.0977971930988133, + "latency_s": 18.585742968134582, + "output_tokens": 256, + "tokens_per_s": 13.773998727891279, + "decode_tokens_per_s": 15.465844167567127, + "prompt_tokens": 48, + "finished": true + }, + { + "index": 15, + "ok": true, + "error": null, + "chunks": 259, + "content_chunks": 256, + "text_chars": 1241, + "first_chunk_s": 2.09760964801535, + "ttft_s": 2.097637650091201, + "latency_s": 18.585426460020244, + "output_tokens": 256, + "tokens_per_s": 13.77423329783099, + "decode_tokens_per_s": 15.465991403676732, + "prompt_tokens": 48, + "finished": true + } + ] + } + ] +} diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.pf.log b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.pf.log new file mode 100644 index 00000000..ea1cc74f --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.pf.log @@ -0,0 +1,148 @@ +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +Forwarding from 127.0.0.1:18080 -> 8080 +Forwarding from [::1]:18080 -> 8080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.smoke.json b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.smoke.json new file mode 100644 index 00000000..5b867a3b --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.smoke.json @@ -0,0 +1 @@ +{"choices":[{"finish_reason":"length","index":0,"message":{"role":"assistant","content":"","reasoning_content":"The user is asking me to say hi. This is a simple, friendly greeting"}}],"created":1792617873,"model":"/models/Intel_Qwen3.8-27B-q4km-AutoRound/Qwen3.8-27B-Q4_K_M.gguf","system_fingerprint":"b11749-1d88cb05f","object":"chat.completion","usage":{"completion_tokens":16,"prompt_tokens":55,"total_tokens":71,"prompt_tokens_details":{"cached_tokens":0}},"id":"chatcmpl-XGCfMrcozuGYulPs5c1i5jLlMqGUOm2t","timings":{"cache_n":0,"prompt_n":55,"prompt_ms":4012.167,"prompt_per_token_ms":72.9484909090909,"prompt_per_second":13.708302770049203,"predicted_n":16,"predicted_ms":541.543,"predicted_per_token_ms":36.102866666666664,"predicted_per_second":27.69863150294621}} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.ttft.json b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.ttft.json new file mode 100644 index 00000000..98f8025b --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.ttft.json @@ -0,0 +1,148 @@ +{ + "tool": "k3d-gpu/bench/llm_load.py", + "schema": 1, + "started_at": "2026-10-21T21:32:04Z", + "config": { + "base_url": "http://127.0.0.1:18080/v1", + "model": "m", + "prompt": "Note 1: engineers who study cache hierarchies measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 2: engineers who study branch prediction measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 3: engineers who study memory controllers measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 4: engineers who study vector units measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 5: engineers who study page tables measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 6: engineers who study interconnects measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 7: engineers who study power states measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 8: engineers who study prefetchers measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 9: engineers who study cache hierarchies measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 10: engineers who study branch prediction measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 11: engineers who study memory controllers measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 12: engineers who study vector units measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 13: engineers who study page tables measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 14: engineers who study interconnects measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 15: engineers who study power states measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 16: engineers who study prefetchers measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 17: engineers who study cache hierarchies measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 18: engineers who study branch prediction measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 19: engineers who study memory controllers measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nNote 20: engineers who study vector units measure how often the common case is fast, how expensive the rare case is, and how the two combine under a realistic workload, and they write down every assumption before the first measurement.\nSummarize the notes above in one sentence.", + "max_tokens": 16, + "temperature": 0.0, + "ignore_eos": false, + "extra_body": { + "chat_template_kwargs": { + "enable_thinking": false + } + }, + "unique_prompts": true, + "requests": 4, + "concurrency": "1", + "warmup": 0, + "timeout": 900.0, + "label": "lsq", + "out": "/home/devcloud/k3dgpu-gemma/results/H54b/hold2/lsq.ttft.json", + "run_id": "2a879009" + }, + "phases": [ + { + "concurrency": 1, + "requests": 4, + "ok": 4, + "errors": 0, + "wall_s": 9.874711315147579, + "output_tokens_total": 64, + "aggregate_tokens_per_s": 6.481202129101788, + "requests_per_s": 0.4050751330688617, + "stats": { + "first_chunk_s": { + "n": 4, + "median": 1.5736631960608065, + "p90": 2.9404181060381234, + "min": 1.5393584971316159, + "max": 2.9404181060381234 + }, + "ttft_s": { + "n": 4, + "median": 1.5737130101770163, + "p90": 2.9404796520248055, + "min": 1.5394041580148041, + "max": 2.9404796520248055 + }, + "latency_s": { + "n": 4, + "median": 2.1565404783468693, + "p90": 3.4745005602017045, + "min": 2.085265518166125, + "max": 3.4745005602017045 + }, + "output_tokens": { + "n": 4, + "median": 16.0, + "p90": 16, + "min": 16, + "max": 16 + }, + "tokens_per_s": { + "n": 4, + "median": 7.419391303537353, + "p90": 7.672883793748775, + "min": 4.60497839121694, + "max": 7.672883793748775 + }, + "decode_tokens_per_s": { + "n": 4, + "median": 27.226155616420346, + "p90": 28.123267539507612, + "min": 24.62317703935303, + "max": 28.123267539507612 + } + }, + "samples": [ + { + "index": 0, + "ok": true, + "error": null, + "chunks": 19, + "content_chunks": 16, + "text_chars": 107, + "first_chunk_s": 2.9404181060381234, + "ttft_s": 2.9404796520248055, + "latency_s": 3.4745005602017045, + "output_tokens": 16, + "tokens_per_s": 4.60497839121694, + "decode_tokens_per_s": 28.088787855158515, + "prompt_tokens": 995, + "finished": true + }, + { + "index": 1, + "ok": true, + "error": null, + "chunks": 19, + "content_chunks": 16, + "text_chars": 107, + "first_chunk_s": 1.5393584971316159, + "ttft_s": 1.5394041580148041, + "latency_s": 2.1485863109119236, + "output_tokens": 16, + "tokens_per_s": 7.446756929773571, + "decode_tokens_per_s": 24.62317703935303, + "prompt_tokens": 995, + "finished": true + }, + { + "index": 2, + "ok": true, + "error": null, + "chunks": 19, + "content_chunks": 16, + "text_chars": 107, + "first_chunk_s": 1.551846357062459, + "ttft_s": 1.5518993302248418, + "latency_s": 2.085265518166125, + "output_tokens": 16, + "tokens_per_s": 7.672883793748775, + "decode_tokens_per_s": 28.123267539507612, + "prompt_tokens": 995, + "finished": true + }, + { + "index": 3, + "ok": true, + "error": null, + "chunks": 19, + "content_chunks": 16, + "text_chars": 107, + "first_chunk_s": 1.595480035059154, + "ttft_s": 1.5955266901291907, + "latency_s": 2.164494645781815, + "output_tokens": 16, + "tokens_per_s": 7.392025677301135, + "decode_tokens_per_s": 26.363523377682178, + "prompt_tokens": 995, + "finished": true + } + ] + } + ] +} diff --git a/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.yaml b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.yaml new file mode 100644 index 00000000..21776855 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/hold2/lsq.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Pod +metadata: {name: lsq} +spec: + restartPolicy: Never + containers: + - name: server + image: ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba73574a1e12cd237c88b512c8bb39ba6f703e873912b76cb8988a81bd + command: ["/app/llama-server"] + args: ["-m","/models/Intel_Qwen3.8-27B-q4km-AutoRound/Qwen3.8-27B-Q4_K_M.gguf","-ngl","99","--jinja","-c","8192","--host","0.0.0.0","--port","8080"] + env: [] + securityContext: {privileged: true} + ports: [{containerPort: 8080}] + volumeMounts: [{name: models, mountPath: /models}, {name: dri, mountPath: /dev/dri}, {name: card, mountPath: /dev/dri/renderD130}, {name: shm, mountPath: /dev/shm}] + volumes: + - {name: models, hostPath: {path: /models}} + - {name: dri, emptyDir: {medium: Memory}} + - {name: card, hostPath: {path: /dev/dri/renderD130, type: CharDevice}} + - {name: shm, emptyDir: {medium: Memory, sizeLimit: 16Gi}} diff --git a/bench/h54gpu/results/2026-10-21/H54b/score.json b/bench/h54gpu/results/2026-10-21/H54b/score.json new file mode 100644 index 00000000..b42ce421 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/score.json @@ -0,0 +1,23 @@ +{ + "medians": { + "B2q": null, + "Sq": null, + "Sq-mtp": null, + "Rq": null, + "X1q": null, + "X1q-mtp": null, + "Lsq": 27.294807009041357 + }, + "correct": { + "B2q": null, + "Sq": null, + "Sq-mtp": null, + "Rq": null, + "X1q": null, + "X1q-mtp": null, + "Lsq": 48 + }, + "gate_ref": "Sq", + "verdict": "INCONCLUSIVE", + "why": "no gate reference (B2q and Sq missing)" +} diff --git a/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/REPRODUCE b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/REPRODUCE new file mode 100644 index 00000000..6482f0e5 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/REPRODUCE @@ -0,0 +1,13 @@ +# Reproduce (EXPERIMENTS.md, H54 pre-registration and amendment G1) +date: 2026-10-21T03:46:41Z host: 905a08313800 +commit: 4890864756d1577c01c7b0e674ea1b07e6224285 +command: cd /home/devcloud/k3dgpu-gemma/k3d-gpu && CARDS=2,3 bash bench/h54gpu/hold.sh 2400 bash bench/h54gpu/h54b.sh 1 +node image: cryptoandcoffee/k3d-gpu:0.1.61@sha256:8cd264aa68c77681d7fa474693944de0db8d55de5881253e4029bf72a67e175c +image: openvino/model_server:2026.4.1-gpu@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 +image: ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba73574a1e12cd237c88b512c8bb39ba6f703e873912b76cb8988a81bd +image: intel/llm-scaler-vllm:1.5@sha256:52218ad85513ab6686d4c090c83c2bd8c5b02423c63aa4dabd41837fe641fe3b +image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e +model: edff62728a3c79ec541983b86a21674500e0f05b +model: google/gemma-4-26B-A4B-it-qat-q4_0-gguf d1c082be9cf3c8a514acf63b8761f4b41935842e +model: google/gemma-4-26B-A4B-it-qat-q4_0-unquantized-assistant 9537141506fe8875b3ed45b264af13580cb29166 +model: google/gemma-4-26B-A4B-it-qat-q4_0-unquantized f1e06dc520982d9b9edd76859fdb7ab209449949 diff --git a/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/X1q.yaml b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/X1q.yaml new file mode 100644 index 00000000..9911ff84 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/X1q.yaml @@ -0,0 +1,107 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k3d-gpu-agent +--- +# Models and the compiled-model cache live here, so restarts never re-download. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ovms-models + namespace: k3d-gpu-agent +spec: + accessModes: [ReadWriteOnce] + resources: + requests: + storage: 40Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ovms + namespace: k3d-gpu-agent + labels: + app: ovms +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: ovms + template: + metadata: + labels: + app: ovms + annotations: + k3d-gpu.io/agent-device: GPU + spec: + securityContext: + runAsUser: 5000 + runAsGroup: 5000 + fsGroup: 5000 + supplementalGroups: [990] + nodeSelector: + gpu.intel.com/xmx: "true" + initContainers: + # --pull downloads the model once and writes its graph.pbtxt (device, + # parsers). On later starts the files are already there and only the + # graph is rewritten, so a device change takes effect with no download. + - name: pull + image: openvino/model_server:2026.4.1-gpu@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --pull + - --source_model=OpenVINO/Qwen3.8-27B-int4-ov + - --model_repository_path=/models + - --model_name=m + - --task=text_generation + - --target_device=GPU + volumeMounts: + - name: models + mountPath: /models + containers: + - name: ovms + image: openvino/model_server:2026.4.1-gpu@sha256:a928903fe429f1e3e27107cc45932d30d95febfd2d1159dc50869c3eac76fc58 + imagePullPolicy: IfNotPresent + args: + - --rest_port=8000 + - --model_path=/models/OpenVINO/Qwen3.8-27B-int4-ov + - --model_name=m + - --cache_dir=/models/.ov_cache + - --log_level=INFO + ports: + - name: http + containerPort: 8000 + # No liveness probe: compiling a model for a GPU takes minutes. + readinessProbe: + httpGet: + path: /v2/health/ready + port: http + periodSeconds: 5 + resources: + requests: + cpu: "2" + memory: 6Gi + limits: + gpu.intel.com/xe: 1 + volumeMounts: + - name: models + mountPath: /models + volumes: + - name: models + persistentVolumeClaim: + claimName: ovms-models +--- +apiVersion: v1 +kind: Service +metadata: + name: ovms + namespace: k3d-gpu-agent +spec: + selector: + app: ovms + ports: + - name: http + port: 8000 + targetPort: http diff --git a/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/allocatable.json b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/allocatable.json new file mode 100644 index 00000000..c99f51a3 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/allocatable.json @@ -0,0 +1 @@ +{"cpu":"96","ephemeral-storage":"3687149282645","gpu.intel.com/xe":"4","hugepages-1Gi":"0","hugepages-2Mi":"0","memory":"527664744Ki","pods":"110"} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/arms.log b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/arms.log new file mode 100644 index 00000000..b856a96b --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/arms.log @@ -0,0 +1,14 @@ +== H54b hold 1 cards 2,3 arms 2026-10-21T03:46:41Z +pod/gpu-hold-0 created +pod/gpu-hold-1 created +pod/gpu-hold-2 created +pod/gpu-hold-3 created +pod/gpu-hold-0 condition met +pod/gpu-hold-1 condition met +pod/gpu-hold-2 condition met +pod/gpu-hold-3 condition met +pod "gpu-hold-2" deleted from default namespace +pod "gpu-hold-3" deleted from default namespace +== device-plugin arms: allowed1 (gpu-hold-0: renderD128 gpu-hold-1: renderD129 gpu-hold-2: renderD130 gpu-hold-3: renderD131) 2026-10-21T03:48:31Z +==> agent: OpenVINO/Qwen3.8-27B-int4-ov as 'm' on GPU (gpu.intel.com/xe), 2 CPU(s) +== smoke done: manifest rc=0 1 xe lines 2026-10-21T03:48:31Z diff --git a/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/cluster.log b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/cluster.log new file mode 100644 index 00000000..e7420db9 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/cluster.log @@ -0,0 +1,30 @@ +WARN: present but disabled: DSA dsa0 dsa2 dsa4, QAT 0000:01:00.0 0000:06:00.0 0000:0b:00.0 (no user work queues / VFs), so not in the cluster — enable them: k3d-gpu host-setup --apply, then k3d-gpu down && k3d-gpu up (exact commands: k3d-gpu doctor) +==> Accelerators: intel amx +==> Experimental features (auto): dra image-volume +==> Creating k3d cluster 'k3dgpu-g-h54b-1' with image cryptoandcoffee/k3d-gpu:0.1.61@sha256:8cd264aa68c77681d7fa474693944de0db8d55de5881253e4029bf72a67e175c... +INFO[0000] Prep: Network +INFO[0000] Created network 'k3d-k3dgpu-g-h54b-1' +INFO[0000] Created image volume k3d-k3dgpu-g-h54b-1-images +INFO[0000] Starting new tools node... +INFO[0000] Starting node 'k3d-k3dgpu-g-h54b-1-tools' +INFO[0001] Creating node 'k3d-k3dgpu-g-h54b-1-server-0' +INFO[0001] Using the k3d-tools node to gather environment information +INFO[0001] HostIP: using network gateway 172.19.0.1 address +INFO[0001] Starting cluster 'k3dgpu-g-h54b-1' +INFO[0001] Starting servers... +INFO[0001] Starting node 'k3d-k3dgpu-g-h54b-1-server-0' +INFO[0004] All agents already running. +INFO[0004] All helpers already running. +INFO[0004] Injecting records for hostAliases (incl. host.k3d.internal) and for 1 network members into CoreDNS configmap... +INFO[0006] Cluster 'k3dgpu-g-h54b-1' created successfully! +INFO[0006] You can now use it like this: +kubectl cluster-info +==> Waiting for nodes Ready... +node/k3d-k3dgpu-g-h54b-1-server-0 condition met +==> Waiting for cluster DNS (CoreDNS)... +==> intel device plugin auto-deployed by k3s. +==> Verifying accelerators are schedulable... +Waiting for daemon set "intel-gpu-plugin" rollout to finish: 0 of 1 updated pods are available... +daemon set "intel-gpu-plugin" successfully rolled out +WARN: present but disabled: DSA dsa0 dsa2 dsa4, QAT 0000:01:00.0 0000:06:00.0 0000:0b:00.0 (no user work queues / VFs), so not in the cluster — enable them: k3d-gpu host-setup --apply, then k3d-gpu down && k3d-gpu up (exact commands: k3d-gpu doctor) +==> Accelerators schedulable: intel=4 amx=1. Try: k3d-gpu test diff --git a/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/gpu-hold.txt b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/gpu-hold.txt new file mode 100644 index 00000000..0c78d4ab --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/gpu-hold.txt @@ -0,0 +1,4 @@ +gpu-hold-0: renderD128 +gpu-hold-1: renderD129 +gpu-hold-2: renderD130 +gpu-hold-3: renderD131 diff --git a/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/gpu-hold.yaml b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/gpu-hold.yaml new file mode 100644 index 00000000..15c0570f --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/smoke-hold1/gpu-hold.yaml @@ -0,0 +1,32 @@ +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-0} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-1} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-2} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- +apiVersion: v1 +kind: Pod +metadata: {name: gpu-hold-3} +spec: + restartPolicy: Never + containers: + - {name: hold, image: busybox:1.37@sha256:bdf57e528e45e4433820e045b29b4597825a1c9e38353532d90a01445013f82e, command: [sleep, "86400"], resources: {limits: {gpu.intel.com/xe: 1}}} +--- diff --git a/bench/h54gpu/results/2026-10-21/H54b/xe_clients-2105-2202Z.json b/bench/h54gpu/results/2026-10-21/H54b/xe_clients-2105-2202Z.json new file mode 100644 index 00000000..8fefa0d9 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/xe_clients-2105-2202Z.json @@ -0,0 +1 @@ +{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"__name__":"xe_clients","bdf":"0000:12:00.0","card":"card1","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"11"],[1792616730,"11"],[1792616760,"11"],[1792616790,"11"],[1792616820,"11"],[1792616850,"11"],[1792616880,"11"],[1792616910,"11"],[1792616940,"11"],[1792616970,"11"],[1792617000,"11"],[1792617030,"11"],[1792617060,"11"],[1792617090,"11"],[1792617120,"11"],[1792617150,"11"],[1792617180,"9"],[1792617210,"9"],[1792617240,"9"],[1792617270,"9"],[1792617300,"9"],[1792617330,"9"],[1792617360,"9"],[1792617390,"9"],[1792617420,"9"],[1792617450,"9"],[1792617480,"9"],[1792617510,"9"],[1792617540,"9"],[1792617570,"9"],[1792617600,"9"],[1792617630,"9"],[1792617660,"9"],[1792617690,"9"],[1792617720,"9"],[1792617750,"9"],[1792617780,"9"],[1792617810,"11"],[1792617840,"11"],[1792617870,"11"],[1792617900,"11"],[1792617930,"11"],[1792617960,"11"],[1792617990,"11"],[1792618020,"11"],[1792618050,"11"],[1792618080,"11"],[1792618110,"11"],[1792618140,"11"],[1792618170,"11"],[1792618200,"11"],[1792618230,"11"],[1792618260,"11"],[1792618290,"11"],[1792618320,"11"],[1792618350,"11"],[1792618380,"11"],[1792618410,"11"],[1792618440,"11"],[1792618470,"11"],[1792618500,"11"],[1792618530,"11"],[1792618560,"11"],[1792618590,"11"],[1792618620,"11"],[1792618650,"11"],[1792618680,"11"],[1792618710,"9"],[1792618740,"9"],[1792618770,"9"],[1792618800,"9"],[1792618830,"9"],[1792618860,"9"],[1792618890,"9"],[1792618920,"9"],[1792618950,"11"],[1792618980,"11"],[1792619010,"11"],[1792619040,"11"],[1792619070,"11"],[1792619100,"11"],[1792619130,"9"],[1792619160,"11"],[1792619190,"11"],[1792619220,"11"],[1792619250,"11"],[1792619280,"11"],[1792619310,"11"],[1792619340,"11"],[1792619370,"9"],[1792619400,"11"],[1792619430,"11"],[1792619460,"11"],[1792619490,"11"],[1792619520,"11"],[1792619550,"11"],[1792619580,"11"],[1792619610,"9"],[1792619640,"11"],[1792619670,"11"],[1792619700,"11"],[1792619730,"11"],[1792619760,"11"],[1792619790,"11"],[1792619820,"11"],[1792619850,"9"],[1792619880,"9"],[1792619910,"9"],[1792619940,"11"],[1792619970,"11"],[1792620000,"11"],[1792620030,"11"],[1792620060,"11"],[1792620090,"11"],[1792620120,"11"]]},{"metric":{"__name__":"xe_clients","bdf":"0000:48:00.0","card":"card2","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"11"],[1792616730,"11"],[1792616760,"11"],[1792616790,"11"],[1792616820,"11"],[1792616850,"11"],[1792616880,"11"],[1792616910,"11"],[1792616940,"11"],[1792616970,"11"],[1792617000,"11"],[1792617030,"11"],[1792617060,"11"],[1792617090,"11"],[1792617120,"11"],[1792617150,"11"],[1792617180,"9"],[1792617210,"9"],[1792617240,"9"],[1792617270,"9"],[1792617300,"9"],[1792617330,"9"],[1792617360,"9"],[1792617390,"9"],[1792617420,"9"],[1792617450,"9"],[1792617480,"9"],[1792617510,"9"],[1792617540,"9"],[1792617570,"9"],[1792617600,"9"],[1792617630,"9"],[1792617660,"9"],[1792617690,"9"],[1792617720,"9"],[1792617750,"9"],[1792617780,"9"],[1792617810,"11"],[1792617840,"11"],[1792617870,"11"],[1792617900,"11"],[1792617930,"11"],[1792617960,"11"],[1792617990,"11"],[1792618020,"11"],[1792618050,"11"],[1792618080,"11"],[1792618110,"11"],[1792618140,"11"],[1792618170,"11"],[1792618200,"11"],[1792618230,"11"],[1792618260,"11"],[1792618290,"11"],[1792618320,"11"],[1792618350,"11"],[1792618380,"11"],[1792618410,"11"],[1792618440,"11"],[1792618470,"11"],[1792618500,"11"],[1792618530,"11"],[1792618560,"11"],[1792618590,"11"],[1792618620,"11"],[1792618650,"11"],[1792618680,"11"],[1792618710,"9"],[1792618740,"9"],[1792618770,"9"],[1792618800,"9"],[1792618830,"9"],[1792618860,"9"],[1792618890,"9"],[1792618920,"9"],[1792618950,"11"],[1792618980,"11"],[1792619010,"11"],[1792619040,"11"],[1792619070,"11"],[1792619100,"11"],[1792619130,"9"],[1792619160,"11"],[1792619190,"11"],[1792619220,"11"],[1792619250,"11"],[1792619280,"11"],[1792619310,"11"],[1792619340,"11"],[1792619370,"9"],[1792619400,"11"],[1792619430,"11"],[1792619460,"11"],[1792619490,"11"],[1792619520,"11"],[1792619550,"11"],[1792619580,"11"],[1792619610,"9"],[1792619640,"11"],[1792619670,"11"],[1792619700,"11"],[1792619730,"11"],[1792619760,"11"],[1792619790,"11"],[1792619820,"11"],[1792619850,"9"],[1792619880,"9"],[1792619910,"9"],[1792619940,"11"],[1792619970,"11"],[1792620000,"11"],[1792620030,"11"],[1792620060,"11"],[1792620090,"11"],[1792620120,"11"]]},{"metric":{"__name__":"xe_clients","bdf":"0000:7c:00.0","card":"card3","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"11"],[1792616730,"11"],[1792616760,"11"],[1792616790,"11"],[1792616820,"11"],[1792616850,"11"],[1792616880,"11"],[1792616910,"11"],[1792616940,"11"],[1792616970,"11"],[1792617000,"11"],[1792617030,"11"],[1792617060,"11"],[1792617090,"11"],[1792617120,"11"],[1792617150,"8"],[1792617180,"3"],[1792617210,"3"],[1792617240,"3"],[1792617270,"3"],[1792617300,"3"],[1792617330,"3"],[1792617360,"3"],[1792617390,"3"],[1792617420,"3"],[1792617450,"3"],[1792617480,"3"],[1792617510,"3"],[1792617540,"3"],[1792617570,"3"],[1792617600,"3"],[1792617630,"3"],[1792617660,"3"],[1792617690,"3"],[1792617720,"3"],[1792617750,"3"],[1792617780,"3"],[1792617810,"5"],[1792617840,"5"],[1792617870,"5"],[1792617900,"5"],[1792617930,"5"],[1792617960,"5"],[1792617990,"5"],[1792618020,"5"],[1792618050,"5"],[1792618080,"5"],[1792618110,"5"],[1792618140,"5"],[1792618170,"5"],[1792618200,"5"],[1792618230,"5"],[1792618260,"5"],[1792618290,"5"],[1792618320,"5"],[1792618350,"5"],[1792618380,"5"],[1792618410,"5"],[1792618440,"5"],[1792618470,"5"],[1792618500,"5"],[1792618530,"5"],[1792618560,"5"],[1792618590,"5"],[1792618620,"5"],[1792618650,"5"],[1792618680,"5"],[1792618710,"3"],[1792618740,"3"],[1792618770,"3"],[1792618800,"3"],[1792618830,"3"],[1792618860,"3"],[1792618890,"3"],[1792618920,"3"],[1792618950,"5"],[1792618980,"5"],[1792619010,"5"],[1792619040,"5"],[1792619070,"5"],[1792619100,"5"],[1792619130,"3"],[1792619160,"5"],[1792619190,"5"],[1792619220,"5"],[1792619250,"5"],[1792619280,"5"],[1792619310,"5"],[1792619340,"5"],[1792619370,"3"],[1792619400,"5"],[1792619430,"5"],[1792619460,"5"],[1792619490,"5"],[1792619520,"5"],[1792619550,"5"],[1792619580,"5"],[1792619610,"3"],[1792619640,"5"],[1792619670,"5"],[1792619700,"5"],[1792619730,"5"],[1792619760,"5"],[1792619790,"5"],[1792619820,"5"],[1792619850,"3"],[1792619880,"4"],[1792619910,"7"],[1792619940,"11"],[1792619970,"11"],[1792620000,"11"],[1792620030,"11"],[1792620060,"11"],[1792620090,"11"],[1792620120,"11"]]},{"metric":{"__name__":"xe_clients","bdf":"0000:96:00.0","card":"card4","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"11"],[1792616730,"11"],[1792616760,"11"],[1792616790,"11"],[1792616820,"11"],[1792616850,"11"],[1792616880,"11"],[1792616910,"11"],[1792616940,"11"],[1792616970,"11"],[1792617000,"11"],[1792617030,"11"],[1792617060,"11"],[1792617090,"11"],[1792617120,"11"],[1792617150,"8"],[1792617180,"3"],[1792617210,"3"],[1792617240,"3"],[1792617270,"3"],[1792617300,"3"],[1792617330,"3"],[1792617360,"3"],[1792617390,"3"],[1792617420,"3"],[1792617450,"3"],[1792617480,"3"],[1792617510,"3"],[1792617540,"3"],[1792617570,"3"],[1792617600,"3"],[1792617630,"3"],[1792617660,"3"],[1792617690,"3"],[1792617720,"3"],[1792617750,"3"],[1792617780,"3"],[1792617810,"5"],[1792617840,"5"],[1792617870,"5"],[1792617900,"5"],[1792617930,"5"],[1792617960,"5"],[1792617990,"5"],[1792618020,"5"],[1792618050,"5"],[1792618080,"5"],[1792618110,"5"],[1792618140,"5"],[1792618170,"5"],[1792618200,"5"],[1792618230,"5"],[1792618260,"5"],[1792618290,"5"],[1792618320,"5"],[1792618350,"5"],[1792618380,"5"],[1792618410,"5"],[1792618440,"5"],[1792618470,"5"],[1792618500,"5"],[1792618530,"5"],[1792618560,"5"],[1792618590,"5"],[1792618620,"5"],[1792618650,"5"],[1792618680,"5"],[1792618710,"3"],[1792618740,"3"],[1792618770,"3"],[1792618800,"3"],[1792618830,"3"],[1792618860,"3"],[1792618890,"3"],[1792618920,"3"],[1792618950,"5"],[1792618980,"5"],[1792619010,"5"],[1792619040,"5"],[1792619070,"5"],[1792619100,"5"],[1792619130,"3"],[1792619160,"5"],[1792619190,"5"],[1792619220,"5"],[1792619250,"5"],[1792619280,"5"],[1792619310,"5"],[1792619340,"5"],[1792619370,"3"],[1792619400,"5"],[1792619430,"5"],[1792619460,"5"],[1792619490,"5"],[1792619520,"5"],[1792619550,"5"],[1792619580,"5"],[1792619610,"3"],[1792619640,"5"],[1792619670,"5"],[1792619700,"5"],[1792619730,"5"],[1792619760,"5"],[1792619790,"5"],[1792619820,"5"],[1792619850,"3"],[1792619880,"4"],[1792619910,"7"],[1792619940,"11"],[1792619970,"11"],[1792620000,"11"],[1792620030,"11"],[1792620060,"11"],[1792620090,"11"],[1792620120,"11"]]}]}} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54b/xe_vram_used_bytes-2105-2202Z.json b/bench/h54gpu/results/2026-10-21/H54b/xe_vram_used_bytes-2105-2202Z.json new file mode 100644 index 00000000..a7ee5f2f --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54b/xe_vram_used_bytes-2105-2202Z.json @@ -0,0 +1 @@ +{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"__name__":"xe_vram_used_bytes","bdf":"0000:12:00.0","card":"card1","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"17269661696"],[1792616730,"17269661696"],[1792616760,"17269661696"],[1792616790,"17269661696"],[1792616820,"17269661696"],[1792616850,"17269661696"],[1792616880,"17269661696"],[1792616910,"17269661696"],[1792616940,"17269661696"],[1792616970,"17269661696"],[1792617000,"17269661696"],[1792617030,"17269661696"],[1792617060,"17269661696"],[1792617090,"17269661696"],[1792617120,"17269661696"],[1792617150,"17269661696"],[1792617180,"17269661696"],[1792617210,"17269661696"],[1792617240,"17269661696"],[1792617270,"17269661696"],[1792617300,"17269661696"],[1792617330,"17269661696"],[1792617360,"17269661696"],[1792617390,"17269661696"],[1792617420,"17269661696"],[1792617450,"17269661696"],[1792617480,"17269661696"],[1792617510,"17269661696"],[1792617540,"17269661696"],[1792617570,"17269661696"],[1792617600,"17269661696"],[1792617630,"17269661696"],[1792617660,"17269661696"],[1792617690,"17269661696"],[1792617720,"17269661696"],[1792617750,"17269661696"],[1792617780,"17269661696"],[1792617810,"20585590784"],[1792617840,"20710121472"],[1792617870,"20733796352"],[1792617900,"20772024320"],[1792617930,"20772024320"],[1792617960,"20772352000"],[1792617990,"20772352000"],[1792618020,"20772352000"],[1792618050,"20772352000"],[1792618080,"20776546304"],[1792618110,"20776546304"],[1792618140,"20776546304"],[1792618170,"20776546304"],[1792618200,"20776546304"],[1792618230,"20776546304"],[1792618260,"20776546304"],[1792618290,"20776546304"],[1792618320,"20776546304"],[1792618350,"20789129216"],[1792618380,"20789129216"],[1792618410,"20789129216"],[1792618440,"20789129216"],[1792618470,"20789129216"],[1792618500,"20789129216"],[1792618530,"20789129216"],[1792618560,"20789129216"],[1792618590,"20789129216"],[1792618620,"20789129216"],[1792618650,"20789129216"],[1792618680,"20789129216"],[1792618710,"17269661696"],[1792618740,"17269661696"],[1792618770,"17269661696"],[1792618800,"17269661696"],[1792618830,"17269661696"],[1792618860,"17269661696"],[1792618890,"17269661696"],[1792618920,"17269661696"],[1792618950,"17732677632"],[1792618980,"17732677632"],[1792619010,"17732677632"],[1792619040,"17790959616"],[1792619070,"17790959616"],[1792619100,"17790959616"],[1792619130,"17269661696"],[1792619160,"20610289664"],[1792619190,"20610289664"],[1792619220,"20633522176"],[1792619250,"20638687232"],[1792619280,"20638687232"],[1792619310,"20684959744"],[1792619340,"20685287424"],[1792619370,"17269661696"],[1792619400,"18167668736"],[1792619430,"18178379776"],[1792619460,"18190639104"],[1792619490,"18195808256"],[1792619520,"18195808256"],[1792619550,"18242961408"],[1792619580,"18242961408"],[1792619610,"17269661696"],[1792619640,"20609556480"],[1792619670,"20610277376"],[1792619700,"20633509888"],[1792619730,"20638674944"],[1792619760,"20638674944"],[1792619790,"20684951552"],[1792619820,"20685279232"],[1792619850,"17269661696"],[1792619880,"17269661696"],[1792619910,"17269661696"],[1792619940,"17269661696"],[1792619970,"17269661696"],[1792620000,"17269661696"],[1792620030,"17269661696"],[1792620060,"17269661696"],[1792620090,"17269661696"],[1792620120,"17269661696"]]},{"metric":{"__name__":"xe_vram_used_bytes","bdf":"0000:48:00.0","card":"card2","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"16512073728"],[1792616730,"16512073728"],[1792616760,"16512073728"],[1792616790,"16512073728"],[1792616820,"16512073728"],[1792616850,"16512073728"],[1792616880,"16512073728"],[1792616910,"16512073728"],[1792616940,"16512073728"],[1792616970,"16512073728"],[1792617000,"16512073728"],[1792617030,"16512073728"],[1792617060,"16512073728"],[1792617090,"16512073728"],[1792617120,"16512073728"],[1792617150,"16512073728"],[1792617180,"16512073728"],[1792617210,"16512073728"],[1792617240,"16512073728"],[1792617270,"16512073728"],[1792617300,"16512073728"],[1792617330,"16512073728"],[1792617360,"16512073728"],[1792617390,"16512073728"],[1792617420,"16512073728"],[1792617450,"16512073728"],[1792617480,"16512073728"],[1792617510,"16512073728"],[1792617540,"16512073728"],[1792617570,"16512073728"],[1792617600,"16512073728"],[1792617630,"16512073728"],[1792617660,"16512073728"],[1792617690,"16512073728"],[1792617720,"16512073728"],[1792617750,"16512073728"],[1792617780,"16512073728"],[1792617810,"19524349952"],[1792617840,"19524358144"],[1792617870,"19754008576"],[1792617900,"19971010560"],[1792617930,"19971010560"],[1792617960,"19971338240"],[1792617990,"19971338240"],[1792618020,"19971338240"],[1792618050,"19971338240"],[1792618080,"19975532544"],[1792618110,"19975532544"],[1792618140,"19975532544"],[1792618170,"19975532544"],[1792618200,"19975532544"],[1792618230,"19975532544"],[1792618260,"19975532544"],[1792618290,"19975532544"],[1792618320,"19975532544"],[1792618350,"19988115456"],[1792618380,"19988115456"],[1792618410,"19988115456"],[1792618440,"19988115456"],[1792618470,"19988115456"],[1792618500,"19988115456"],[1792618530,"19988115456"],[1792618560,"19988115456"],[1792618590,"19988115456"],[1792618620,"19988115456"],[1792618650,"19988115456"],[1792618680,"19988115456"],[1792618710,"16512073728"],[1792618740,"16512073728"],[1792618770,"16512073728"],[1792618800,"16512073728"],[1792618830,"16512073728"],[1792618860,"16512073728"],[1792618890,"16512073728"],[1792618920,"16512073728"],[1792618950,"16532942848"],[1792618980,"16532942848"],[1792619010,"16532942848"],[1792619040,"16532955136"],[1792619070,"16532955136"],[1792619100,"16532955136"],[1792619130,"16512073728"],[1792619160,"19086897152"],[1792619190,"19086897152"],[1792619220,"19086913536"],[1792619250,"19262255104"],[1792619280,"19262255104"],[1792619310,"19285458944"],[1792619340,"19285786624"],[1792619370,"16512073728"],[1792619400,"16945819648"],[1792619430,"16945819648"],[1792619460,"16945836032"],[1792619490,"17037422592"],[1792619520,"17037422592"],[1792619550,"17061355520"],[1792619580,"17061355520"],[1792619610,"16512073728"],[1792619640,"19086888960"],[1792619670,"19086888960"],[1792619700,"19086905344"],[1792619730,"19262251008"],[1792619760,"19262251008"],[1792619790,"19285458944"],[1792619820,"19285786624"],[1792619850,"16512073728"],[1792619880,"16512073728"],[1792619910,"16512073728"],[1792619940,"16512073728"],[1792619970,"16512073728"],[1792620000,"16512073728"],[1792620030,"16512073728"],[1792620060,"16512073728"],[1792620090,"16512073728"],[1792620120,"16512073728"]]},{"metric":{"__name__":"xe_vram_used_bytes","bdf":"0000:7c:00.0","card":"card3","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"17251655680"],[1792616730,"17251655680"],[1792616760,"17251655680"],[1792616790,"17251655680"],[1792616820,"17251655680"],[1792616850,"17251655680"],[1792616880,"17251655680"],[1792616910,"17251655680"],[1792616940,"17251655680"],[1792616970,"17251655680"],[1792617000,"17251655680"],[1792617030,"17251655680"],[1792617060,"17251655680"],[1792617090,"17251655680"],[1792617120,"17251655680"],[1792617150,"16680751104"],[1792617180,"0"],[1792617210,"0"],[1792617240,"0"],[1792617270,"0"],[1792617300,"0"],[1792617330,"0"],[1792617360,"0"],[1792617390,"0"],[1792617420,"0"],[1792617450,"0"],[1792617480,"0"],[1792617510,"0"],[1792617540,"0"],[1792617570,"0"],[1792617600,"0"],[1792617630,"0"],[1792617660,"0"],[1792617690,"0"],[1792617720,"0"],[1792617750,"0"],[1792617780,"0"],[1792617810,"5440393216"],[1792617840,"5440401408"],[1792617870,"5670379520"],[1792617900,"5887123456"],[1792617930,"5887123456"],[1792617960,"5887451136"],[1792617990,"5887451136"],[1792618020,"5887451136"],[1792618050,"5887451136"],[1792618080,"5891645440"],[1792618110,"5891645440"],[1792618140,"5891645440"],[1792618170,"5891645440"],[1792618200,"5891645440"],[1792618230,"5891645440"],[1792618260,"5891645440"],[1792618290,"5891645440"],[1792618320,"5891645440"],[1792618350,"5904228352"],[1792618380,"5904228352"],[1792618410,"5904228352"],[1792618440,"5904228352"],[1792618470,"5904228352"],[1792618500,"5904228352"],[1792618530,"5904228352"],[1792618560,"5904228352"],[1792618590,"5904228352"],[1792618620,"5904228352"],[1792618650,"5904228352"],[1792618680,"5904228352"],[1792618710,"0"],[1792618740,"0"],[1792618770,"0"],[1792618800,"0"],[1792618830,"0"],[1792618860,"0"],[1792618890,"0"],[1792618920,"0"],[1792618950,"20873216"],[1792618980,"20873216"],[1792619010,"20873216"],[1792619040,"20885504"],[1792619070,"20885504"],[1792619100,"20885504"],[1792619130,"0"],[1792619160,"5067681792"],[1792619190,"5067681792"],[1792619220,"5067698176"],[1792619250,"5281783808"],[1792619280,"5281783808"],[1792619310,"5328384000"],[1792619340,"5328384000"],[1792619370,"0"],[1792619400,"785534976"],[1792619430,"785534976"],[1792619460,"785551360"],[1792619490,"932663296"],[1792619520,"932663296"],[1792619550,"979668992"],[1792619580,"979668992"],[1792619610,"0"],[1792619640,"5067677696"],[1792619670,"5067677696"],[1792619700,"5067694080"],[1792619730,"5281783808"],[1792619760,"5281783808"],[1792619790,"5328388096"],[1792619820,"5328388096"],[1792619850,"0"],[1792619880,"181035008"],[1792619910,"10611109888"],[1792619940,"28712878080"],[1792619970,"28712878080"],[1792620000,"22919233536"],[1792620030,"17125982208"],[1792620060,"17125982208"],[1792620090,"17125982208"],[1792620120,"17125982208"]]},{"metric":{"__name__":"xe_vram_used_bytes","bdf":"0000:96:00.0","card":"card4","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"16494178304"],[1792616730,"16494178304"],[1792616760,"16494178304"],[1792616790,"16494178304"],[1792616820,"16494178304"],[1792616850,"16494178304"],[1792616880,"16494178304"],[1792616910,"16494178304"],[1792616940,"16494178304"],[1792616970,"16494178304"],[1792617000,"16494178304"],[1792617030,"16494178304"],[1792617060,"16494178304"],[1792617090,"16494178304"],[1792617120,"16494178304"],[1792617150,"191135744"],[1792617180,"0"],[1792617210,"0"],[1792617240,"0"],[1792617270,"0"],[1792617300,"0"],[1792617330,"0"],[1792617360,"0"],[1792617390,"0"],[1792617420,"0"],[1792617450,"0"],[1792617480,"0"],[1792617510,"0"],[1792617540,"0"],[1792617570,"0"],[1792617600,"0"],[1792617630,"0"],[1792617660,"0"],[1792617690,"0"],[1792617720,"0"],[1792617750,"0"],[1792617780,"0"],[1792617810,"5953003520"],[1792617840,"5953011712"],[1792617870,"6183124992"],[1792617900,"6399729664"],[1792617930,"6399729664"],[1792617960,"6400057344"],[1792617990,"6400057344"],[1792618020,"6400057344"],[1792618050,"6400057344"],[1792618080,"6404251648"],[1792618110,"6404251648"],[1792618140,"6404251648"],[1792618170,"6404251648"],[1792618200,"6404251648"],[1792618230,"6404251648"],[1792618260,"6404251648"],[1792618290,"6404251648"],[1792618320,"6404251648"],[1792618350,"6416834560"],[1792618380,"6416834560"],[1792618410,"6416834560"],[1792618440,"6416834560"],[1792618470,"6416834560"],[1792618500,"6416834560"],[1792618530,"6416834560"],[1792618560,"6416834560"],[1792618590,"6416834560"],[1792618620,"6416834560"],[1792618650,"6416834560"],[1792618680,"6416834560"],[1792618710,"0"],[1792618740,"0"],[1792618770,"0"],[1792618800,"0"],[1792618830,"0"],[1792618860,"0"],[1792618890,"0"],[1792618920,"0"],[1792618950,"20869120"],[1792618980,"20869120"],[1792619010,"20869120"],[1792619040,"20881408"],[1792619070,"20881408"],[1792619100,"20881408"],[1792619130,"0"],[1792619160,"5176270848"],[1792619190,"5176270848"],[1792619220,"5176291328"],[1792619250,"5390835712"],[1792619280,"5390835712"],[1792619310,"5437435904"],[1792619340,"5437435904"],[1792619370,"0"],[1792619400,"1322283008"],[1792619430,"1322283008"],[1792619460,"1322303488"],[1792619490,"1470332928"],[1792619520,"1470332928"],[1792619550,"1517334528"],[1792619580,"1517334528"],[1792619610,"0"],[1792619640,"5176258560"],[1792619670,"5176258560"],[1792619700,"5176279040"],[1792619730,"5390827520"],[1792619760,"5390827520"],[1792619790,"5437431808"],[1792619820,"5437431808"],[1792619850,"0"],[1792619880,"2105344"],[1792619910,"10253180928"],[1792619940,"16502857728"],[1792619970,"16502857728"],[1792620000,"16435617792"],[1792620030,"16368377856"],[1792620060,"16368377856"],[1792620090,"16368377856"],[1792620120,"16368377856"]]}]}} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/NOTES-2026-10-21.txt b/bench/h54gpu/results/2026-10-21/H54c/hold1/NOTES-2026-10-21.txt new file mode 100644 index 00000000..c1e0d108 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/NOTES-2026-10-21.txt @@ -0,0 +1,7 @@ +H54c hold 1 notes (written after the hold). Placement violation: pods for Gg, Hg, Gg2 (and Cg) were privileged and saw +all four render nodes (gg.dri lists renderD128-131), so -ngl 99 split layers across four B70s, two of them serving +qwen38-a-hr. Evidence: xe_vram_used_bytes saved here; Gg/Hg/Gg2 windows show +2.5-3.5 GB on each of card1-card4. +The prediction model assumes one card; Gg, Hg, Gg2 are therefore not delivered as registered. predict.py on the +records gives measured/predicted 1.261 (verdict.json), which would be INCONCLUSIVE anyway (0.25 < 0.261 <= 0.40). +Recorded verdict: INCONCLUSIVE. H54c cap (1 hold) is used up. +Cg ran in server-intel-b11749 with -ngl 0: 36.8 tok/s vs 47.7 in the CPU image server-b11749 (smoke, discarded). diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/REPRODUCE b/bench/h54gpu/results/2026-10-21/H54c/hold1/REPRODUCE new file mode 100644 index 00000000..8b4a5716 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/REPRODUCE @@ -0,0 +1,11 @@ +# Reproduce (EXPERIMENTS.md, H54 pre-registration and amendment G1) +date: 2026-10-21T21:38:45Z host: 905a08313800 +commit: 9f81e00853c9676b6787ba333a675c69a2a7d890 +command: cd /home/devcloud/k3dgpu-gemma/k3d-gpu && CARDS=2,3 bash bench/h54gpu/hold.sh 2400 bash bench/h54gpu/h54c.sh 1 2 +node image: cryptoandcoffee/k3d-gpu:0.1.61@sha256:8cd264aa68c77681d7fa474693944de0db8d55de5881253e4029bf72a67e175c +image: ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba73574a1e12cd237c88b512c8bb39ba6f703e873912b76cb8988a81bd +model: Intel/Qwen3.8-27B-q4km-AutoRound 4b30b30e0ac2cc54a2f50738cfccd6c608f94ad4 +model: edff62728a3c79ec541983b86a21674500e0f05b +model: google/gemma-4-26B-A4B-it-qat-q4_0-gguf d1c082be9cf3c8a514acf63b8761f4b41935842e +model: google/gemma-4-26B-A4B-it-qat-q4_0-unquantized-assistant 9537141506fe8875b3ed45b264af13580cb29166 +model: google/gemma-4-26B-A4B-it-qat-q4_0-unquantized f1e06dc520982d9b9edd76859fdb7ab209449949 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/arms.log b/bench/h54gpu/results/2026-10-21/H54c/hold1/arms.log new file mode 100644 index 00000000..8f499659 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/arms.log @@ -0,0 +1,30 @@ +== H54c hold 1 card 2 image ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba73574a1e12cd237c88b512c8bb39ba6f703e873912b76cb8988a81bd 2026-10-21T21:38:46Z +== arm cg: -ngl 0 2026-10-21T21:38:59Z +pod/cg created +energy: zone=intel-rapl:0 (package-0) joules=7594.234 seconds=60.017 avg_watts=126.535 command_seconds=60.002 samples=13 exit=0 +concurrency=1 ok=8/8 ttft_median=1.131s ttft_p90=1.189s latency_median=8.059s tok/s_median=31.8 aggregate_tok/s=31.7 +energy: zone=intel-rapl:0 (package-0) joules=28210.068 seconds=106.587 avg_watts=264.668 command_seconds=106.571 samples=23 exit=0 +== arm cg done: {'n': 8, 'median': 36.84118741427883, 'p90': 36.97683194030288, 'min': 36.556750429710775, 'max': 36.97683194030288} 2026-10-21T21:45:18Z +pod "cg" deleted from default namespace +== arm gg: -ngl 99 2026-10-21T21:45:39Z +pod/gg created +energy: zone=intel-rapl:0 (package-0) joules=7548.230 seconds=60.018 avg_watts=125.766 command_seconds=60.002 samples=13 exit=0 +concurrency=1 ok=8/8 ttft_median=0.260s ttft_p90=0.356s latency_median=4.694s tok/s_median=54.5 aggregate_tok/s=54.8 +energy: zone=intel-rapl:0 (package-0) joules=6894.548 seconds=53.007 avg_watts=130.070 command_seconds=52.990 samples=12 exit=0 +== arm gg done: {'n': 8, 'median': 57.96706402151845, 'p90': 59.06204721313891, 'min': 57.36315493317884, 'max': 59.06204721313891} 2026-10-21T21:49:13Z +pod "gg" deleted from default namespace +== arm hg: -ngl 99 -ot exps=CPU 2026-10-21T21:49:34Z +pod/hg created +energy: zone=intel-rapl:0 (package-0) joules=7600.300 seconds=60.017 avg_watts=126.636 command_seconds=60.002 samples=13 exit=0 +concurrency=1 ok=8/8 ttft_median=0.958s ttft_p90=1.025s latency_median=5.466s tok/s_median=46.8 aggregate_tok/s=46.7 +energy: zone=intel-rapl:0 (package-0) joules=16520.610 seconds=64.762 avg_watts=255.099 command_seconds=64.746 samples=14 exit=0 +== arm hg done: {'n': 8, 'median': 56.3337991611167, 'p90': 57.32881973372036, 'min': 55.59073585692495, 'max': 57.32881973372036} 2026-10-21T21:53:20Z +pod "hg" deleted from default namespace +== arm gg2: -ngl 99 2026-10-21T21:53:41Z +pod/gg2 created +energy: zone=intel-rapl:0 (package-0) joules=7558.064 seconds=60.018 avg_watts=125.929 command_seconds=60.002 samples=13 exit=0 +concurrency=1 ok=8/8 ttft_median=0.261s ttft_p90=0.274s latency_median=4.707s tok/s_median=54.4 aggregate_tok/s=54.4 +energy: zone=intel-rapl:0 (package-0) joules=6924.788 seconds=53.205 avg_watts=130.154 command_seconds=53.188 samples=12 exit=0 +== arm gg2 done: {'n': 8, 'median': 57.38314863583636, 'p90': 57.450303048482, 'min': 57.196770789092085, 'max': 57.450303048482} 2026-10-21T21:57:16Z +pod "gg2" deleted from default namespace +== verdict INCONCLUSIVE 1.2612194709728874 2026-10-21T21:57:37Z diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/bytes.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/bytes.json new file mode 100644 index 00000000..35a45a41 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/bytes.json @@ -0,0 +1,12 @@ +{ + "B_exp": 802898880.0, + "B_rest": 1577144440, + "B_tot": 2380043320.0, + "exps_all": 12846382080, + "output_tensor": "token_embd.weight", + "n_tensors": 658, + "arch": "gemma4", + "experts": 128, + "routed": 8, + "block_count": 30 +} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.boot_s b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.boot_s new file mode 100644 index 00000000..0d389107 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.boot_s @@ -0,0 +1 @@ +212 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.dri b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.dri new file mode 100644 index 00000000..b3cf7d95 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.dri @@ -0,0 +1,10 @@ +total 0 +crw-rw---- 1 root video 226, 0 Oct 21 21:42 card0 +crw-rw---- 1 root video 226, 1 Oct 21 21:42 card1 +crw-rw---- 1 root video 226, 2 Oct 21 21:42 card2 +crw-rw---- 1 root video 226, 3 Oct 21 21:42 card3 +crw-rw---- 1 root video 226, 4 Oct 21 21:42 card4 +crw-rw---- 1 root 990 226, 128 Oct 21 21:42 renderD128 +crw-rw---- 1 root 990 226, 129 Oct 21 21:42 renderD129 +crw-rw---- 1 root 990 226, 130 Oct 21 21:38 renderD130 +crw-rw---- 1 root 990 226, 131 Oct 21 21:42 renderD131 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.fuser b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.fuser new file mode 100644 index 00000000..d62df9af --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.fuser @@ -0,0 +1,17 @@ + USER PID ACCESS COMMAND +/dev/dri/renderD128: root 3898329 F...m python + root 3900003 F...m sglang::schedul + root 3900352 F...m sglang::schedul + root 3900921 F...m sglang::detoken + root 3901745 F...m python + root 3901746 F...m python +/dev/dri/renderD129: root 3898329 F...m python + root 3900003 F...m sglang::schedul + root 3900352 F...m sglang::schedul + root 3900921 F...m sglang::detoken + root 3901745 F...m python + root 3901746 F...m python +/dev/dri/renderD130: root 3900003 F.... sglang::schedul + root 3900352 F.... sglang::schedul +/dev/dri/renderD131: root 3900003 F.... sglang::schedul + root 3900352 F.... sglang::schedul diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.gpu-energy b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.gpu-energy new file mode 100644 index 00000000..346a839e --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.gpu-energy @@ -0,0 +1,2 @@ +before 2026-10-21T21:43:31Z card=311621386067810 pkg=218370567080444 +after 2026-10-21T21:45:18Z card=311631206894592 pkg=218377519521850 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.idle-energy.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.idle-energy.json new file mode 100644 index 00000000..85684a8a --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.idle-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":7594.234,"seconds":60.017,"avg_watts":126.535,"command_seconds":60.002,"energy_uj":7594234099,"max_energy_range_uj":262143328850,"samples":13,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.log b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.log new file mode 100644 index 00000000..04089e2b --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.log @@ -0,0 +1,132 @@ +warn: LLAMA_ARG_HOST environment variable is set, but will be overwritten by command line argument --host +warn: LLAMA_ARG_PORT environment variable is set, but will be overwritten by command line argument --port +0.00.548.692 I srv llama_server: initializing ... +0.00.548.703 I cmn common_param: common_params_print_info: verbosity = 3 (adjust with the `-lv N` CLI arg) +0.00.548.974 W srv llama_server: security: no API key is set and CORS allows all origins (see https://github.com/ggml-org/llama.cpp/pull/25655) +0.00.552.690 I srv load_model: loading model '/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf' +0.01.508.830 W load: control-looking token: 212 '' was not control-type; this is probably a bug in the model. its type will be overridden +0.01.509.203 W load: control-looking token: 50 '<|tool_response>' was not control-type; this is probably a bug in the model. its type will be overridden +0.01.531.877 W load: '' is a normal token here, removing it from EOG list +0.02.108.944 I cmn init: llama threadpool init, n_threads = 48 +0.05.031.219 I srv load_model: initializing, n_slots = 4, n_ctx_slot = 8192, kv_unified = 'true' +0.05.038.082 I srv llama_server: model loaded +0.05.038.088 I srv llama_server: listening on http://0.0.0.0:8080 +0.19.838.398 I slot get_availabl: id 0 | task -1 | selected slot by LRU, n_tokens = 0, t_last = -1 +0.19.838.475 I slot launch_slot_: id 0 | task 0 | processing task, is_child = 0 +0.20.394.776 I slot print_timing: id 0 | task 0 | prompt eval time = 149.81 ms / 19 tokens ( 7.88 ms per token, 126.83 tokens per second) +0.20.394.784 I slot print_timing: id 0 | task 0 | eval time = 406.43 ms / 16 tokens ( 27.10 ms per token, 36.91 tokens per second) +0.20.394.784 I slot print_timing: id 0 | task 0 | total time = 556.24 ms / 35 tokens +0.20.394.788 I slot print_timing: id 0 | task 0 | graphs reused = 15 +0.20.394.788 I slot print_timing: id 0 | task 0 | graph reallocs = 1 / 0 (same size) / (changed size) +0.20.394.820 I slot release: id 0 | task 0 | stop processing: n_tokens = 34, truncated = 0 +1.20.684.116 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.216 (> 0.100 thold), f_keep = 0.324 +1.20.689.199 I slot launch_slot_: id 0 | task 19 | processing task, is_child = 0 +1.39.496.960 I slot print_timing: id 0 | task 19 | prompt processing, n_tokens = 40, progress = 0.92, t = 18.81 s / 2.13 tokens per second +1.42.557.961 I slot print_timing: id 0 | task 19 | n_gen = 112, tg = 36.82 t/s, tg_3s = 37.15 t/s +1.45.575.865 I slot print_timing: id 0 | task 19 | n_gen = 219, tg = 36.14 t/s, tg_3s = 35.46 t/s +1.46.599.423 I slot print_timing: id 0 | task 19 | prompt eval time = 18854.19 ms / 44 tokens ( 428.50 ms per token, 2.33 tokens per second) +1.46.599.427 I slot print_timing: id 0 | task 19 | eval time = 7055.98 ms / 256 tokens ( 27.67 ms per token, 36.14 tokens per second) +1.46.599.427 I slot print_timing: id 0 | task 19 | total time = 25910.17 ms / 300 tokens +1.46.599.428 I slot print_timing: id 0 | task 19 | graphs reused = 268 +1.46.599.429 I slot print_timing: id 0 | task 19 | graph reallocs = 2 / 0 (same size) / (changed size) +1.46.599.451 I slot release: id 0 | task 19 | stop processing: n_tokens = 306, truncated = 0 +1.46.603.199 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +1.46.636.834 I slot launch_slot_: id 0 | task 278 | processing task, is_child = 0 +1.50.643.688 I slot print_timing: id 0 | task 278 | n_gen = 113, tg = 37.14 t/s, tg_3s = 37.47 t/s +1.53.666.454 I slot print_timing: id 0 | task 278 | n_gen = 222, tg = 36.60 t/s, tg_3s = 36.06 t/s +1.54.609.384 I slot print_timing: id 0 | task 278 | prompt eval time = 991.28 ms / 44 tokens ( 22.53 ms per token, 44.39 tokens per second) +1.54.609.387 I slot print_timing: id 0 | task 278 | eval time = 6981.20 ms / 256 tokens ( 27.38 ms per token, 36.53 tokens per second) +1.54.609.388 I slot print_timing: id 0 | task 278 | total time = 7972.48 ms / 300 tokens +1.54.609.389 I slot print_timing: id 0 | task 278 | graphs reused = 521 +1.54.609.389 I slot print_timing: id 0 | task 278 | graph reallocs = 3 / 0 (same size) / (changed size) +1.54.609.410 I slot release: id 0 | task 278 | stop processing: n_tokens = 306, truncated = 0 +1.54.612.765 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +1.54.647.089 I slot launch_slot_: id 0 | task 537 | processing task, is_child = 0 +1.58.645.120 I slot print_timing: id 0 | task 537 | n_gen = 113, tg = 37.16 t/s, tg_3s = 37.49 t/s +2.01.645.830 I slot print_timing: id 0 | task 537 | n_gen = 220, tg = 36.41 t/s, tg_3s = 35.66 t/s +2.02.642.731 I slot print_timing: id 0 | task 537 | prompt eval time = 984.16 ms / 44 tokens ( 22.37 ms per token, 44.71 tokens per second) +2.02.642.734 I slot print_timing: id 0 | task 537 | eval time = 7011.43 ms / 256 tokens ( 27.50 ms per token, 36.37 tokens per second) +2.02.642.735 I slot print_timing: id 0 | task 537 | total time = 7995.59 ms / 300 tokens +2.02.642.735 I slot print_timing: id 0 | task 537 | graphs reused = 774 +2.02.642.736 I slot print_timing: id 0 | task 537 | graph reallocs = 4 / 0 (same size) / (changed size) +2.02.642.754 I slot release: id 0 | task 537 | stop processing: n_tokens = 306, truncated = 0 +2.02.648.091 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.02.681.770 I slot launch_slot_: id 0 | task 796 | processing task, is_child = 0 +2.06.760.806 I slot print_timing: id 0 | task 796 | n_gen = 113, tg = 37.06 t/s, tg_3s = 37.39 t/s +2.09.779.994 I slot print_timing: id 0 | task 796 | n_gen = 221, tg = 36.41 t/s, tg_3s = 35.77 t/s +2.10.743.865 I slot print_timing: id 0 | task 796 | prompt eval time = 1056.69 ms / 44 tokens ( 24.02 ms per token, 41.64 tokens per second) +2.10.743.868 I slot print_timing: id 0 | task 796 | eval time = 7005.35 ms / 256 tokens ( 27.47 ms per token, 36.40 tokens per second) +2.10.743.869 I slot print_timing: id 0 | task 796 | total time = 8062.04 ms / 300 tokens +2.10.743.870 I slot print_timing: id 0 | task 796 | graphs reused = 1027 +2.10.743.870 I slot print_timing: id 0 | task 796 | graph reallocs = 5 / 0 (same size) / (changed size) +2.10.743.893 I slot release: id 0 | task 796 | stop processing: n_tokens = 306, truncated = 0 +2.10.747.533 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.10.781.315 I slot launch_slot_: id 0 | task 1055 | processing task, is_child = 0 +2.14.783.475 I slot print_timing: id 0 | task 1055 | n_gen = 113, tg = 37.16 t/s, tg_3s = 37.49 t/s +2.17.808.362 I slot print_timing: id 0 | task 1055 | n_gen = 222, tg = 36.60 t/s, tg_3s = 36.03 t/s +2.18.745.415 I slot print_timing: id 0 | task 1055 | prompt eval time = 988.20 ms / 44 tokens ( 22.46 ms per token, 44.53 tokens per second) +2.18.745.423 I slot print_timing: id 0 | task 1055 | eval time = 6975.82 ms / 256 tokens ( 27.36 ms per token, 36.55 tokens per second) +2.18.745.424 I slot print_timing: id 0 | task 1055 | total time = 7964.02 ms / 300 tokens +2.18.745.425 I slot print_timing: id 0 | task 1055 | graphs reused = 1280 +2.18.745.425 I slot print_timing: id 0 | task 1055 | graph reallocs = 6 / 0 (same size) / (changed size) +2.18.745.452 I slot release: id 0 | task 1055 | stop processing: n_tokens = 306, truncated = 0 +2.18.749.213 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.18.782.992 I slot launch_slot_: id 0 | task 1314 | processing task, is_child = 0 +2.22.856.783 I slot print_timing: id 0 | task 1314 | n_gen = 112, tg = 36.94 t/s, tg_3s = 37.28 t/s +2.25.860.591 I slot print_timing: id 0 | task 1314 | n_gen = 219, tg = 36.28 t/s, tg_3s = 35.62 t/s +2.26.908.750 I slot print_timing: id 0 | task 1314 | prompt eval time = 1069.06 ms / 44 tokens ( 24.30 ms per token, 41.16 tokens per second) +2.26.908.753 I slot print_timing: id 0 | task 1314 | eval time = 7056.64 ms / 256 tokens ( 27.67 ms per token, 36.14 tokens per second) +2.26.908.753 I slot print_timing: id 0 | task 1314 | total time = 8125.70 ms / 300 tokens +2.26.908.754 I slot print_timing: id 0 | task 1314 | graphs reused = 1533 +2.26.908.755 I slot print_timing: id 0 | task 1314 | graph reallocs = 7 / 0 (same size) / (changed size) +2.26.908.778 I slot release: id 0 | task 1314 | stop processing: n_tokens = 306, truncated = 0 +2.26.912.678 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.26.946.024 I slot launch_slot_: id 0 | task 1573 | processing task, is_child = 0 +2.30.950.144 I slot print_timing: id 0 | task 1573 | n_gen = 113, tg = 37.15 t/s, tg_3s = 37.48 t/s +2.33.976.382 I slot print_timing: id 0 | task 1573 | n_gen = 221, tg = 36.42 t/s, tg_3s = 35.69 t/s +2.34.941.616 I slot print_timing: id 0 | task 1573 | prompt eval time = 989.32 ms / 44 tokens ( 22.48 ms per token, 44.47 tokens per second) +2.34.941.619 I slot print_timing: id 0 | task 1573 | eval time = 7006.21 ms / 256 tokens ( 27.48 ms per token, 36.40 tokens per second) +2.34.941.620 I slot print_timing: id 0 | task 1573 | total time = 7995.54 ms / 300 tokens +2.34.941.620 I slot print_timing: id 0 | task 1573 | graphs reused = 1786 +2.34.941.621 I slot print_timing: id 0 | task 1573 | graph reallocs = 8 / 0 (same size) / (changed size) +2.34.941.650 I slot release: id 0 | task 1573 | stop processing: n_tokens = 306, truncated = 0 +2.34.945.563 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.34.978.729 I slot launch_slot_: id 0 | task 1832 | processing task, is_child = 0 +2.38.993.271 I slot print_timing: id 0 | task 1832 | n_gen = 112, tg = 36.67 t/s, tg_3s = 37.00 t/s +2.42.008.706 I slot print_timing: id 0 | task 1832 | n_gen = 220, tg = 36.24 t/s, tg_3s = 35.82 t/s +2.42.997.625 I slot print_timing: id 0 | task 1832 | prompt eval time = 987.36 ms / 44 tokens ( 22.44 ms per token, 44.56 tokens per second) +2.42.997.628 I slot print_timing: id 0 | task 1832 | eval time = 7031.49 ms / 256 tokens ( 27.57 ms per token, 36.27 tokens per second) +2.42.997.628 I slot print_timing: id 0 | task 1832 | total time = 8018.84 ms / 300 tokens +2.42.997.629 I slot print_timing: id 0 | task 1832 | graphs reused = 2039 +2.42.997.630 I slot print_timing: id 0 | task 1832 | graph reallocs = 9 / 0 (same size) / (changed size) +2.42.997.655 I slot release: id 0 | task 1832 | stop processing: n_tokens = 306, truncated = 0 +2.43.001.487 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.43.034.455 I slot launch_slot_: id 0 | task 2091 | processing task, is_child = 0 +2.47.108.341 I slot print_timing: id 0 | task 2091 | n_gen = 113, tg = 37.32 t/s, tg_3s = 37.65 t/s +2.50.113.508 I slot print_timing: id 0 | task 2091 | n_gen = 220, tg = 36.46 t/s, tg_3s = 35.61 t/s +2.51.103.800 I slot print_timing: id 0 | task 2091 | prompt eval time = 1072.44 ms / 44 tokens ( 24.37 ms per token, 41.03 tokens per second) +2.51.103.803 I slot print_timing: id 0 | task 2091 | eval time = 6996.85 ms / 256 tokens ( 27.44 ms per token, 36.44 tokens per second) +2.51.103.804 I slot print_timing: id 0 | task 2091 | total time = 8069.29 ms / 300 tokens +2.51.103.804 I slot print_timing: id 0 | task 2091 | graphs reused = 2292 +2.51.103.805 I slot print_timing: id 0 | task 2091 | graph reallocs = 10 / 0 (same size) / (changed size) +2.51.103.826 I slot release: id 0 | task 2091 | stop processing: n_tokens = 306, truncated = 0 +2.51.107.544 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.51.140.836 I slot launch_slot_: id 0 | task 2350 | processing task, is_child = 0 +2.55.129.185 I slot print_timing: id 0 | task 2350 | n_gen = 112, tg = 36.95 t/s, tg_3s = 37.28 t/s +2.58.130.612 I slot print_timing: id 0 | task 2350 | n_gen = 220, tg = 36.47 t/s, tg_3s = 35.98 t/s +2.59.123.554 I slot print_timing: id 0 | task 2350 | prompt eval time = 984.33 ms / 44 tokens ( 22.37 ms per token, 44.70 tokens per second) +2.59.123.556 I slot print_timing: id 0 | task 2350 | eval time = 6998.33 ms / 256 tokens ( 27.44 ms per token, 36.44 tokens per second) +2.59.123.557 I slot print_timing: id 0 | task 2350 | total time = 7982.66 ms / 300 tokens +2.59.123.558 I slot print_timing: id 0 | task 2350 | graphs reused = 2545 +2.59.123.558 I slot print_timing: id 0 | task 2350 | graph reallocs = 11 / 0 (same size) / (changed size) +2.59.123.580 I slot release: id 0 | task 2350 | stop processing: n_tokens = 306, truncated = 0 +2.59.127.447 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.442 (> 0.100 thold), f_keep = 0.075 +2.59.160.753 I slot launch_slot_: id 0 | task 2609 | processing task, is_child = 0 +3.03.204.158 I slot print_timing: id 0 | task 2609 | n_gen = 113, tg = 37.26 t/s, tg_3s = 37.59 t/s +3.06.223.094 I slot print_timing: id 0 | task 2609 | n_gen = 221, tg = 36.52 t/s, tg_3s = 35.77 t/s +3.07.186.297 I slot print_timing: id 0 | task 2609 | prompt eval time = 1037.37 ms / 45 tokens ( 23.05 ms per token, 43.38 tokens per second) +3.07.186.299 I slot print_timing: id 0 | task 2609 | eval time = 6988.12 ms / 256 tokens ( 27.40 ms per token, 36.49 tokens per second) +3.07.186.300 I slot print_timing: id 0 | task 2609 | total time = 8025.49 ms / 301 tokens +3.07.186.301 I slot print_timing: id 0 | task 2609 | graphs reused = 2798 +3.07.186.301 I slot print_timing: id 0 | task 2609 | graph reallocs = 12 / 0 (same size) / (changed size) +3.07.186.322 I slot release: id 0 | task 2609 | stop processing: n_tokens = 307, truncated = 0 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.n1-energy.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.n1-energy.json new file mode 100644 index 00000000..07489820 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.n1-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":28210.068,"seconds":106.587,"avg_watts":264.668,"command_seconds":106.571,"energy_uj":28210068224,"max_energy_range_uj":262143328850,"samples":23,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.n1.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.n1.json new file mode 100644 index 00000000..70a06f61 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.n1.json @@ -0,0 +1,208 @@ +{ + "tool": "k3d-gpu/bench/llm_load.py", + "schema": 1, + "started_at": "2026-10-21T21:43:31Z", + "config": { + "base_url": "http://127.0.0.1:18080/v1", + "model": "m", + "prompt": "Explain in three short paragraphs how a CPU cache hierarchy reduces memory latency, and what a cache miss costs.", + "max_tokens": 256, + "temperature": 0.0, + "ignore_eos": true, + "extra_body": null, + "unique_prompts": true, + "requests": 8, + "concurrency": "1", + "warmup": 3, + "timeout": 600.0, + "label": "cg", + "out": "/home/devcloud/k3dgpu-gemma/results/H54c/hold1/cg.n1.json", + "run_id": "7c501f43" + }, + "phases": [ + { + "concurrency": 1, + "requests": 8, + "ok": 8, + "errors": 0, + "wall_s": 64.54404732724652, + "output_tokens_total": 2048, + "aggregate_tokens_per_s": 31.730269247237935, + "requests_per_s": 0.12394636424702318, + "stats": { + "first_chunk_s": { + "n": 8, + "median": 1.050448794849217, + "p90": 1.1092648250050843, + "min": 1.0212924177758396, + "max": 1.1092648250050843 + }, + "ttft_s": { + "n": 8, + "median": 1.130536099197343, + "p90": 1.1893890677019954, + "min": 1.1020956807769835, + "max": 1.1893890677019954 + }, + "latency_s": { + "n": 8, + "median": 8.059238794026896, + "p90": 8.163313956931233, + "min": 8.001426063012332, + "max": 8.163313956931233 + }, + "output_tokens": { + "n": 8, + "median": 256.0, + "p90": 256, + "min": 256, + "max": 256 + }, + "tokens_per_s": { + "n": 8, + "median": 31.7647921019702, + "p90": 31.994296764597305, + "min": 31.35981310416682, + "max": 31.994296764597305 + }, + "decode_tokens_per_s": { + "n": 8, + "median": 36.84118741427883, + "p90": 36.97683194030288, + "min": 36.556750429710775, + "max": 36.97683194030288 + } + }, + "samples": [ + { + "index": 0, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 918, + "first_chunk_s": 1.0941706472076476, + "ttft_s": 1.1737912651151419, + "latency_s": 8.099452796857804, + "output_tokens": 256, + "tokens_per_s": 31.60707351727707, + "decode_tokens_per_s": 36.81958738977472, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 1, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 951, + "first_chunk_s": 1.025649328250438, + "ttft_s": 1.1052160141989589, + "latency_s": 8.001426063012332, + "output_tokens": 256, + "tokens_per_s": 31.994296764597305, + "decode_tokens_per_s": 36.97683194030288, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 2, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 881, + "first_chunk_s": 1.1065702540799975, + "ttft_s": 1.187858069781214, + "latency_s": 8.163313956931233, + "output_tokens": 256, + "tokens_per_s": 31.35981310416682, + "decode_tokens_per_s": 36.556750429710775, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 3, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 951, + "first_chunk_s": 1.0264327176846564, + "ttft_s": 1.1061781360767782, + "latency_s": 8.032640913967043, + "output_tokens": 256, + "tokens_per_s": 31.86996689405981, + "decode_tokens_per_s": 36.8153281374697, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 4, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 929, + "first_chunk_s": 1.024427445139736, + "ttft_s": 1.1043259319849312, + "latency_s": 8.055867658928037, + "output_tokens": 256, + "tokens_per_s": 31.77807913915817, + "decode_tokens_per_s": 36.68251015622322, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 5, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 994, + "first_chunk_s": 1.1092648250050843, + "ttft_s": 1.1893890677019954, + "latency_s": 8.10606448771432, + "output_tokens": 256, + "tokens_per_s": 31.581293288253214, + "decode_tokens_per_s": 36.86742322217364, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 6, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 929, + "first_chunk_s": 1.0212924177758396, + "ttft_s": 1.1020956807769835, + "latency_s": 8.019640926737338, + "output_tokens": 256, + "tokens_per_s": 31.921628703661856, + "decode_tokens_per_s": 36.86278743878294, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 7, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 954, + "first_chunk_s": 1.0744648720137775, + "ttft_s": 1.1548940623179078, + "latency_s": 8.062609929125756, + "output_tokens": 256, + "tokens_per_s": 31.751505064782236, + "decode_tokens_per_s": 36.9152415815619, + "prompt_tokens": 52, + "finished": true + } + ] + } + ] +} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.pf.log b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.pf.log new file mode 100644 index 00000000..26b7e980 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.pf.log @@ -0,0 +1,35 @@ +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +Forwarding from 127.0.0.1:18080 -> 8080 +Forwarding from [::1]:18080 -> 8080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.smoke.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.smoke.json new file mode 100644 index 00000000..d79105e9 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.smoke.json @@ -0,0 +1 @@ +{"choices":[{"finish_reason":"length","index":0,"message":{"role":"assistant","content":"","reasoning_content":"The user said \"Say hi.\"\nThe user wants a simple"}}],"created":1792618951,"model":"/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","system_fingerprint":"b11749-1d88cb05f","object":"chat.completion","usage":{"completion_tokens":16,"prompt_tokens":19,"total_tokens":35,"prompt_tokens_details":{"cached_tokens":0}},"id":"chatcmpl-40XlFf6lvDbO8ZFK5LnlrDZAEIlNAwfI","timings":{"cache_n":0,"prompt_n":19,"prompt_ms":149.81,"prompt_per_token_ms":7.884736842105263,"prompt_per_second":126.82731459849143,"predicted_n":16,"predicted_ms":406.433,"predicted_per_token_ms":27.095533333333332,"predicted_per_second":36.90645198593618}} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.yaml b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.yaml new file mode 100644 index 00000000..e712ba02 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cg.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: {name: cg} +spec: + restartPolicy: Never + containers: + - name: server + image: ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba73574a1e12cd237c88b512c8bb39ba6f703e873912b76cb8988a81bd + args: ["-m","/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","-t","48","-Cr","0-47","--cpu-strict","1","--jinja","-c","8192","--host","0.0.0.0","--port","8080","-ngl","0"] + securityContext: {privileged: true} + volumeMounts: [{name: models, mountPath: /models, readOnly: true}, {name: dri, mountPath: /dev/dri}, {name: card, mountPath: /dev/dri/renderD130}] + volumes: + - {name: models, hostPath: {path: /models}} + - {name: dri, emptyDir: {medium: Memory}} + - {name: card, hostPath: {path: /dev/dri/renderD130, type: CharDevice}} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/cluster.log b/bench/h54gpu/results/2026-10-21/H54c/hold1/cluster.log new file mode 100644 index 00000000..26c8bc1e --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/cluster.log @@ -0,0 +1,18 @@ +INFO[0000] Prep: Network +INFO[0000] Created network 'k3d-k3dgpu-g-h54c-1' +INFO[0000] Created image volume k3d-k3dgpu-g-h54c-1-images +INFO[0000] Starting new tools node... +INFO[0000] Starting node 'k3d-k3dgpu-g-h54c-1-tools' +INFO[0001] Creating node 'k3d-k3dgpu-g-h54c-1-server-0' +INFO[0001] Using the k3d-tools node to gather environment information +INFO[0001] HostIP: using network gateway 172.19.0.1 address +INFO[0001] Starting cluster 'k3dgpu-g-h54c-1' +INFO[0001] Starting servers... +INFO[0001] Starting node 'k3d-k3dgpu-g-h54c-1-server-0' +INFO[0004] All agents already running. +INFO[0004] All helpers already running. +INFO[0004] Injecting records for hostAliases (incl. host.k3d.internal) and for 1 network members into CoreDNS configmap... +INFO[0006] Cluster 'k3dgpu-g-h54c-1' created successfully! +INFO[0006] You can now use it like this: +kubectl cluster-info +node/k3d-k3dgpu-g-h54c-1-server-0 condition met diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.boot_s b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.boot_s new file mode 100644 index 00000000..398050c6 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.boot_s @@ -0,0 +1 @@ +101 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.dri b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.dri new file mode 100644 index 00000000..a084101e --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.dri @@ -0,0 +1,10 @@ +total 0 +crw-rw---- 1 root video 226, 0 Oct 21 21:45 card0 +crw-rw---- 1 root video 226, 1 Oct 21 21:45 card1 +crw-rw---- 1 root video 226, 2 Oct 21 21:45 card2 +crw-rw---- 1 root video 226, 3 Oct 21 21:45 card3 +crw-rw---- 1 root video 226, 4 Oct 21 21:45 card4 +crw-rw---- 1 root 990 226, 128 Oct 21 21:45 renderD128 +crw-rw---- 1 root 990 226, 129 Oct 21 21:45 renderD129 +crw-rw---- 1 root 990 226, 130 Oct 21 21:38 renderD130 +crw-rw---- 1 root 990 226, 131 Oct 21 21:45 renderD131 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.fuser b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.fuser new file mode 100644 index 00000000..d62df9af --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.fuser @@ -0,0 +1,17 @@ + USER PID ACCESS COMMAND +/dev/dri/renderD128: root 3898329 F...m python + root 3900003 F...m sglang::schedul + root 3900352 F...m sglang::schedul + root 3900921 F...m sglang::detoken + root 3901745 F...m python + root 3901746 F...m python +/dev/dri/renderD129: root 3898329 F...m python + root 3900003 F...m sglang::schedul + root 3900352 F...m sglang::schedul + root 3900921 F...m sglang::detoken + root 3901745 F...m python + root 3901746 F...m python +/dev/dri/renderD130: root 3900003 F.... sglang::schedul + root 3900352 F.... sglang::schedul +/dev/dri/renderD131: root 3900003 F.... sglang::schedul + root 3900352 F.... sglang::schedul diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.gpu-energy b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.gpu-energy new file mode 100644 index 00000000..3d8260ed --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.gpu-energy @@ -0,0 +1,2 @@ +before 2026-10-21T21:48:20Z card=311647962840881 pkg=218389387776428 +after 2026-10-21T21:49:13Z card=311653817855712 pkg=218393420261962 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.idle-energy.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.idle-energy.json new file mode 100644 index 00000000..6fef1745 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.idle-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":7548.230,"seconds":60.018,"avg_watts":125.766,"command_seconds":60.002,"energy_uj":7548230249,"max_energy_range_uj":262143328850,"samples":13,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.log b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.log new file mode 100644 index 00000000..902faf3a --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.log @@ -0,0 +1,120 @@ +warn: LLAMA_ARG_HOST environment variable is set, but will be overwritten by command line argument --host +warn: LLAMA_ARG_PORT environment variable is set, but will be overwritten by command line argument --port +0.00.516.855 I srv llama_server: initializing ... +0.00.516.870 I cmn common_param: common_params_print_info: verbosity = 3 (adjust with the `-lv N` CLI arg) +0.00.517.159 W srv llama_server: security: no API key is set and CORS allows all origins (see https://github.com/ggml-org/llama.cpp/pull/25655) +0.00.520.957 I srv load_model: loading model '/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf' +0.01.478.130 W load: control-looking token: 212 '' was not control-type; this is probably a bug in the model. its type will be overridden +0.01.478.503 W load: control-looking token: 50 '<|tool_response>' was not control-type; this is probably a bug in the model. its type will be overridden +0.01.501.087 W load: '' is a normal token here, removing it from EOG list +0.03.322.017 I cmn init: llama threadpool init, n_threads = 48 +1.39.295.250 I srv load_model: initializing, n_slots = 4, n_ctx_slot = 8192, kv_unified = 'true' +1.39.301.761 I srv llama_server: model loaded +1.39.301.768 I srv llama_server: listening on http://0.0.0.0:8080 +1.40.132.682 I slot get_availabl: id 0 | task -1 | selected slot by LRU, n_tokens = 0, t_last = -1 +1.40.132.746 I slot launch_slot_: id 0 | task 0 | processing task, is_child = 0 +1.40.611.425 I slot print_timing: id 0 | task 0 | prompt eval time = 123.52 ms / 19 tokens ( 6.50 ms per token, 153.82 tokens per second) +1.40.611.440 I slot print_timing: id 0 | task 0 | eval time = 355.10 ms / 16 tokens ( 23.67 ms per token, 42.24 tokens per second) +1.40.611.441 I slot print_timing: id 0 | task 0 | total time = 478.62 ms / 35 tokens +1.40.611.443 I slot print_timing: id 0 | task 0 | graphs reused = 15 +1.40.611.443 I slot print_timing: id 0 | task 0 | graph reallocs = 0 / 0 (same size) / (changed size) +1.40.611.465 I slot release: id 0 | task 0 | stop processing: n_tokens = 34, truncated = 0 +2.40.907.831 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.220 (> 0.100 thold), f_keep = 0.324 +2.40.911.213 I slot launch_slot_: id 0 | task 19 | processing task, is_child = 0 +2.45.583.495 I slot print_timing: id 0 | task 19 | n_gen = 169, tg = 55.70 t/s, tg_3s = 56.03 t/s +2.47.051.915 I slot print_timing: id 0 | task 19 | prompt eval time = 1655.83 ms / 43 tokens ( 38.51 ms per token, 25.97 tokens per second) +2.47.051.917 I slot print_timing: id 0 | task 19 | eval time = 4484.82 ms / 256 tokens ( 17.59 ms per token, 56.86 tokens per second) +2.47.051.918 I slot print_timing: id 0 | task 19 | total time = 6140.65 ms / 299 tokens +2.47.051.918 I slot print_timing: id 0 | task 19 | graphs reused = 268 +2.47.051.918 I slot print_timing: id 0 | task 19 | graph reallocs = 0 / 0 (same size) / (changed size) +2.47.051.932 I slot release: id 0 | task 19 | stop processing: n_tokens = 305, truncated = 0 +2.47.058.722 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +2.47.092.932 I slot launch_slot_: id 0 | task 278 | processing task, is_child = 0 +2.50.267.900 I slot print_timing: id 0 | task 278 | n_gen = 173, tg = 57.19 t/s, tg_3s = 57.52 t/s +2.51.758.204 I slot print_timing: id 0 | task 278 | prompt eval time = 167.28 ms / 43 tokens ( 3.89 ms per token, 257.06 tokens per second) +2.51.758.206 I slot print_timing: id 0 | task 278 | eval time = 4497.95 ms / 256 tokens ( 17.64 ms per token, 56.69 tokens per second) +2.51.758.207 I slot print_timing: id 0 | task 278 | total time = 4665.22 ms / 299 tokens +2.51.758.207 I slot print_timing: id 0 | task 278 | graphs reused = 521 +2.51.758.208 I slot print_timing: id 0 | task 278 | graph reallocs = 0 / 0 (same size) / (changed size) +2.51.758.222 I slot release: id 0 | task 278 | stop processing: n_tokens = 305, truncated = 0 +2.51.763.676 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +2.51.797.974 I slot launch_slot_: id 0 | task 537 | processing task, is_child = 0 +2.54.974.217 I slot print_timing: id 0 | task 537 | n_gen = 173, tg = 57.18 t/s, tg_3s = 57.51 t/s +2.56.469.053 I slot print_timing: id 0 | task 537 | prompt eval time = 168.02 ms / 43 tokens ( 3.91 ms per token, 255.92 tokens per second) +2.56.469.055 I slot print_timing: id 0 | task 537 | eval time = 4503.01 ms / 256 tokens ( 17.66 ms per token, 56.63 tokens per second) +2.56.469.056 I slot print_timing: id 0 | task 537 | total time = 4671.03 ms / 299 tokens +2.56.469.056 I slot print_timing: id 0 | task 537 | graphs reused = 774 +2.56.469.057 I slot print_timing: id 0 | task 537 | graph reallocs = 0 / 0 (same size) / (changed size) +2.56.469.069 I slot release: id 0 | task 537 | stop processing: n_tokens = 305, truncated = 0 +2.56.476.042 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +2.56.512.127 I slot launch_slot_: id 0 | task 796 | processing task, is_child = 0 +2.59.694.605 I slot print_timing: id 0 | task 796 | n_gen = 174, tg = 57.38 t/s, tg_3s = 57.71 t/s +3.01.173.435 I slot print_timing: id 0 | task 796 | prompt eval time = 167.28 ms / 43 tokens ( 3.89 ms per token, 257.05 tokens per second) +3.01.173.438 I slot print_timing: id 0 | task 796 | eval time = 4493.97 ms / 256 tokens ( 17.62 ms per token, 56.74 tokens per second) +3.01.173.438 I slot print_timing: id 0 | task 796 | total time = 4661.26 ms / 299 tokens +3.01.173.439 I slot print_timing: id 0 | task 796 | graphs reused = 1027 +3.01.173.439 I slot print_timing: id 0 | task 796 | graph reallocs = 0 / 0 (same size) / (changed size) +3.01.173.454 I slot release: id 0 | task 796 | stop processing: n_tokens = 305, truncated = 0 +3.01.179.255 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.01.215.769 I slot launch_slot_: id 0 | task 1055 | processing task, is_child = 0 +3.04.388.300 I slot print_timing: id 0 | task 1055 | n_gen = 177, tg = 58.55 t/s, tg_3s = 58.88 t/s +3.05.879.445 I slot print_timing: id 0 | task 1055 | prompt eval time = 166.56 ms / 43 tokens ( 3.87 ms per token, 258.16 tokens per second) +3.05.879.448 I slot print_timing: id 0 | task 1055 | eval time = 4497.05 ms / 256 tokens ( 17.64 ms per token, 56.70 tokens per second) +3.05.879.448 I slot print_timing: id 0 | task 1055 | total time = 4663.61 ms / 299 tokens +3.05.879.449 I slot print_timing: id 0 | task 1055 | graphs reused = 1280 +3.05.879.449 I slot print_timing: id 0 | task 1055 | graph reallocs = 0 / 0 (same size) / (changed size) +3.05.879.462 I slot release: id 0 | task 1055 | stop processing: n_tokens = 305, truncated = 0 +3.05.885.685 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.05.922.077 I slot launch_slot_: id 0 | task 1314 | processing task, is_child = 0 +3.09.100.767 I slot print_timing: id 0 | task 1314 | n_gen = 179, tg = 59.10 t/s, tg_3s = 59.44 t/s +3.10.573.513 I slot print_timing: id 0 | task 1314 | prompt eval time = 167.05 ms / 43 tokens ( 3.88 ms per token, 257.41 tokens per second) +3.10.573.515 I slot print_timing: id 0 | task 1314 | eval time = 4484.34 ms / 256 tokens ( 17.59 ms per token, 56.86 tokens per second) +3.10.573.515 I slot print_timing: id 0 | task 1314 | total time = 4651.39 ms / 299 tokens +3.10.573.516 I slot print_timing: id 0 | task 1314 | graphs reused = 1533 +3.10.573.516 I slot print_timing: id 0 | task 1314 | graph reallocs = 0 / 0 (same size) / (changed size) +3.10.573.530 I slot release: id 0 | task 1314 | stop processing: n_tokens = 305, truncated = 0 +3.10.579.453 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.10.615.990 I slot launch_slot_: id 0 | task 1573 | processing task, is_child = 0 +3.13.784.534 I slot print_timing: id 0 | task 1573 | n_gen = 180, tg = 59.63 t/s, tg_3s = 59.96 t/s +3.15.150.844 I slot print_timing: id 0 | task 1573 | prompt eval time = 166.42 ms / 43 tokens ( 3.87 ms per token, 258.38 tokens per second) +3.15.150.847 I slot print_timing: id 0 | task 1573 | eval time = 4368.38 ms / 256 tokens ( 17.13 ms per token, 58.37 tokens per second) +3.15.150.847 I slot print_timing: id 0 | task 1573 | total time = 4534.80 ms / 299 tokens +3.15.150.848 I slot print_timing: id 0 | task 1573 | graphs reused = 1786 +3.15.150.848 I slot print_timing: id 0 | task 1573 | graph reallocs = 0 / 0 (same size) / (changed size) +3.15.150.862 I slot release: id 0 | task 1573 | stop processing: n_tokens = 305, truncated = 0 +3.15.157.372 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.15.194.529 I slot launch_slot_: id 0 | task 1832 | processing task, is_child = 0 +3.18.422.709 I slot print_timing: id 0 | task 1832 | n_gen = 178, tg = 58.76 t/s, tg_3s = 59.10 t/s +3.19.830.169 I slot print_timing: id 0 | task 1832 | prompt eval time = 216.11 ms / 43 tokens ( 5.03 ms per token, 198.98 tokens per second) +3.19.830.171 I slot print_timing: id 0 | task 1832 | eval time = 4419.49 ms / 256 tokens ( 17.33 ms per token, 57.70 tokens per second) +3.19.830.171 I slot print_timing: id 0 | task 1832 | total time = 4635.59 ms / 299 tokens +3.19.830.172 I slot print_timing: id 0 | task 1832 | graphs reused = 2039 +3.19.830.172 I slot print_timing: id 0 | task 1832 | graph reallocs = 0 / 0 (same size) / (changed size) +3.19.830.186 I slot release: id 0 | task 1832 | stop processing: n_tokens = 305, truncated = 0 +3.19.835.702 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.19.871.933 I slot launch_slot_: id 0 | task 2091 | processing task, is_child = 0 +3.23.042.820 I slot print_timing: id 0 | task 2091 | n_gen = 174, tg = 57.58 t/s, tg_3s = 57.92 t/s +3.24.524.463 I slot print_timing: id 0 | task 2091 | prompt eval time = 166.53 ms / 43 tokens ( 3.87 ms per token, 258.22 tokens per second) +3.24.524.465 I slot print_timing: id 0 | task 2091 | eval time = 4485.96 ms / 256 tokens ( 17.59 ms per token, 56.84 tokens per second) +3.24.524.466 I slot print_timing: id 0 | task 2091 | total time = 4652.48 ms / 299 tokens +3.24.524.466 I slot print_timing: id 0 | task 2091 | graphs reused = 2292 +3.24.524.466 I slot print_timing: id 0 | task 2091 | graph reallocs = 0 / 0 (same size) / (changed size) +3.24.524.481 I slot release: id 0 | task 2091 | stop processing: n_tokens = 305, truncated = 0 +3.24.529.535 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.24.566.087 I slot launch_slot_: id 0 | task 2350 | processing task, is_child = 0 +3.27.739.678 I slot print_timing: id 0 | task 2350 | n_gen = 174, tg = 57.55 t/s, tg_3s = 57.88 t/s +3.29.124.790 I slot print_timing: id 0 | task 2350 | prompt eval time = 167.55 ms / 43 tokens ( 3.90 ms per token, 256.65 tokens per second) +3.29.124.792 I slot print_timing: id 0 | task 2350 | eval time = 4391.11 ms / 256 tokens ( 17.22 ms per token, 58.07 tokens per second) +3.29.124.793 I slot print_timing: id 0 | task 2350 | total time = 4558.65 ms / 299 tokens +3.29.124.793 I slot print_timing: id 0 | task 2350 | graphs reused = 2545 +3.29.124.793 I slot print_timing: id 0 | task 2350 | graph reallocs = 0 / 0 (same size) / (changed size) +3.29.124.806 I slot release: id 0 | task 2350 | stop processing: n_tokens = 305, truncated = 0 +3.29.130.639 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.431 (> 0.100 thold), f_keep = 0.072 +3.29.167.930 I slot launch_slot_: id 0 | task 2609 | processing task, is_child = 0 +3.32.358.226 I slot print_timing: id 0 | task 2609 | n_gen = 169, tg = 55.80 t/s, tg_3s = 56.13 t/s +3.33.828.125 I slot print_timing: id 0 | task 2609 | prompt eval time = 179.32 ms / 44 tokens ( 4.08 ms per token, 245.38 tokens per second) +3.33.828.128 I slot print_timing: id 0 | task 2609 | eval time = 4480.83 ms / 256 tokens ( 17.57 ms per token, 56.91 tokens per second) +3.33.828.128 I slot print_timing: id 0 | task 2609 | total time = 4660.15 ms / 300 tokens +3.33.828.129 I slot print_timing: id 0 | task 2609 | graphs reused = 2798 +3.33.828.129 I slot print_timing: id 0 | task 2609 | graph reallocs = 0 / 0 (same size) / (changed size) +3.33.828.143 I slot release: id 0 | task 2609 | stop processing: n_tokens = 306, truncated = 0 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.n1-energy.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.n1-energy.json new file mode 100644 index 00000000..02c448ab --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.n1-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":6894.548,"seconds":53.007,"avg_watts":130.070,"command_seconds":52.990,"energy_uj":6894548390,"max_energy_range_uj":262143328850,"samples":12,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.n1.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.n1.json new file mode 100644 index 00000000..19ee7315 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.n1.json @@ -0,0 +1,208 @@ +{ + "tool": "k3d-gpu/bench/llm_load.py", + "schema": 1, + "started_at": "2026-10-21T21:48:20Z", + "config": { + "base_url": "http://127.0.0.1:18080/v1", + "model": "m", + "prompt": "Explain in three short paragraphs how a CPU cache hierarchy reduces memory latency, and what a cache miss costs.", + "max_tokens": 256, + "temperature": 0.0, + "ignore_eos": true, + "extra_body": null, + "unique_prompts": true, + "requests": 8, + "concurrency": "1", + "warmup": 3, + "timeout": 600.0, + "label": "gg", + "out": "/home/devcloud/k3dgpu-gemma/results/H54c/hold1/gg.n1.json", + "run_id": "d797a357" + }, + "phases": [ + { + "concurrency": 1, + "requests": 8, + "ok": 8, + "errors": 0, + "wall_s": 37.359361693728715, + "output_tokens_total": 2048, + "aggregate_tokens_per_s": 54.81892374900466, + "requests_per_s": 0.21413642089454946, + "stats": { + "first_chunk_s": { + "n": 8, + "median": 0.20892868912778795, + "p90": 0.2593948501162231, + "min": 0.20811906224116683, + "max": 0.2593948501162231 + }, + "ttft_s": { + "n": 8, + "median": 0.2604933923576027, + "p90": 0.3564130640588701, + "min": 0.2598487911745906, + "max": 0.3564130640588701 + }, + "latency_s": { + "n": 8, + "median": 4.694140685489401, + "p90": 4.706077809911221, + "min": 4.57754823518917, + "max": 4.706077809911221 + }, + "output_tokens": { + "n": 8, + "median": 256.0, + "p90": 256, + "min": 256, + "max": 256 + }, + "tokens_per_s": { + "n": 8, + "median": 54.536073540338094, + "p90": 55.92513433982868, + "min": 54.3977406112691, + "max": 55.92513433982868 + }, + "decode_tokens_per_s": { + "n": 8, + "median": 57.96706402151845, + "p90": 59.06204721313891, + "min": 57.36315493317884, + "max": 59.06204721313891 + } + }, + "samples": [ + { + "index": 0, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 897, + "first_chunk_s": 0.20866152504459023, + "ttft_s": 0.2602711641229689, + "latency_s": 4.702587706036866, + "output_tokens": 256, + "tokens_per_s": 54.438112801461294, + "decode_tokens_per_s": 57.40248305001192, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 1, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 963, + "first_chunk_s": 0.2088608918711543, + "ttft_s": 0.2607156205922365, + "latency_s": 4.706077809911221, + "output_tokens": 256, + "tokens_per_s": 54.3977406112691, + "decode_tokens_per_s": 57.36315493317884, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 2, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 909, + "first_chunk_s": 0.2092225239612162, + "ttft_s": 0.2610403480939567, + "latency_s": 4.693765826057643, + "output_tokens": 256, + "tokens_per_s": 54.5404286210456, + "decode_tokens_per_s": 57.52668448963873, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 3, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 960, + "first_chunk_s": 0.2088983911089599, + "ttft_s": 0.2600548188202083, + "latency_s": 4.57754823518917, + "output_tokens": 256, + "tokens_per_s": 55.92513433982868, + "decode_tokens_per_s": 59.06204721313891, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 4, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 926, + "first_chunk_s": 0.2593948501162231, + "ttft_s": 0.3564130640588701, + "latency_s": 4.678820684086531, + "output_tokens": 256, + "tokens_per_s": 54.71464227528525, + "decode_tokens_per_s": 58.9948987731907, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 5, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 968, + "first_chunk_s": 0.20811906224116683, + "ttft_s": 0.2598487911745906, + "latency_s": 4.69451554492116, + "output_tokens": 256, + "tokens_per_s": 54.531718459630596, + "decode_tokens_per_s": 57.5015021781663, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 6, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 948, + "first_chunk_s": 0.20895898714661598, + "ttft_s": 0.26011712942272425, + "latency_s": 4.599904735106975, + "output_tokens": 256, + "tokens_per_s": 55.65332648004209, + "decode_tokens_per_s": 58.75863594476402, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 7, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 926, + "first_chunk_s": 0.22244415199384093, + "ttft_s": 0.33737757289782166, + "latency_s": 4.7032594620250165, + "output_tokens": 256, + "tokens_per_s": 54.430337528046486, + "decode_tokens_per_s": 58.40744355339817, + "prompt_tokens": 51, + "finished": true + } + ] + } + ] +} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.pf.log b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.pf.log new file mode 100644 index 00000000..ad42af6d --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.pf.log @@ -0,0 +1,24 @@ +error: unable to forward port because pod is not running. Current status=Pending +Forwarding from 127.0.0.1:18080 -> 8080 +Forwarding from [::1]:18080 -> 8080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.smoke.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.smoke.json new file mode 100644 index 00000000..f942e3e0 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.smoke.json @@ -0,0 +1 @@ +{"choices":[{"finish_reason":"length","index":0,"message":{"role":"assistant","content":"","reasoning_content":"The user said \"Say hi.\"\nThe user wants a simple"}}],"created":1792619240,"model":"/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","system_fingerprint":"b11749-1d88cb05f","object":"chat.completion","usage":{"completion_tokens":16,"prompt_tokens":19,"total_tokens":35,"prompt_tokens_details":{"cached_tokens":0}},"id":"chatcmpl-pS4Aa2x2IqdJPb5bsP7MRHggTMqqpaZY","timings":{"cache_n":0,"prompt_n":19,"prompt_ms":123.52,"prompt_per_token_ms":6.501052631578947,"prompt_per_second":153.82124352331607,"predicted_n":16,"predicted_ms":355.10200000000003,"predicted_per_token_ms":23.67346666666667,"predicted_per_second":42.24138416567634}} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.yaml b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.yaml new file mode 100644 index 00000000..4c688fdf --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: {name: gg} +spec: + restartPolicy: Never + containers: + - name: server + image: ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba73574a1e12cd237c88b512c8bb39ba6f703e873912b76cb8988a81bd + args: ["-m","/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","-t","48","-Cr","0-47","--cpu-strict","1","--jinja","-c","8192","--host","0.0.0.0","--port","8080","-ngl","99"] + securityContext: {privileged: true} + volumeMounts: [{name: models, mountPath: /models, readOnly: true}, {name: dri, mountPath: /dev/dri}, {name: card, mountPath: /dev/dri/renderD130}] + volumes: + - {name: models, hostPath: {path: /models}} + - {name: dri, emptyDir: {medium: Memory}} + - {name: card, hostPath: {path: /dev/dri/renderD130, type: CharDevice}} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.boot_s b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.boot_s new file mode 100644 index 00000000..398050c6 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.boot_s @@ -0,0 +1 @@ +101 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.dri b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.dri new file mode 100644 index 00000000..fcde8176 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.dri @@ -0,0 +1,10 @@ +total 0 +crw-rw---- 1 root video 226, 0 Oct 21 21:53 card0 +crw-rw---- 1 root video 226, 1 Oct 21 21:53 card1 +crw-rw---- 1 root video 226, 2 Oct 21 21:53 card2 +crw-rw---- 1 root video 226, 3 Oct 21 21:53 card3 +crw-rw---- 1 root video 226, 4 Oct 21 21:53 card4 +crw-rw---- 1 root 990 226, 128 Oct 21 21:53 renderD128 +crw-rw---- 1 root 990 226, 129 Oct 21 21:53 renderD129 +crw-rw---- 1 root 990 226, 130 Oct 21 21:38 renderD130 +crw-rw---- 1 root 990 226, 131 Oct 21 21:53 renderD131 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.fuser b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.fuser new file mode 100644 index 00000000..d62df9af --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.fuser @@ -0,0 +1,17 @@ + USER PID ACCESS COMMAND +/dev/dri/renderD128: root 3898329 F...m python + root 3900003 F...m sglang::schedul + root 3900352 F...m sglang::schedul + root 3900921 F...m sglang::detoken + root 3901745 F...m python + root 3901746 F...m python +/dev/dri/renderD129: root 3898329 F...m python + root 3900003 F...m sglang::schedul + root 3900352 F...m sglang::schedul + root 3900921 F...m sglang::detoken + root 3901745 F...m python + root 3901746 F...m python +/dev/dri/renderD130: root 3900003 F.... sglang::schedul + root 3900352 F.... sglang::schedul +/dev/dri/renderD131: root 3900003 F.... sglang::schedul + root 3900352 F.... sglang::schedul diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.gpu-energy b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.gpu-energy new file mode 100644 index 00000000..71f624a2 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.gpu-energy @@ -0,0 +1,2 @@ +before 2026-10-21T21:56:22Z card=311693442486206 pkg=218421414106872 +after 2026-10-21T21:57:16Z card=311699307201416 pkg=218425459020080 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.idle-energy.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.idle-energy.json new file mode 100644 index 00000000..b0a98e66 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.idle-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":7558.064,"seconds":60.018,"avg_watts":125.929,"command_seconds":60.002,"energy_uj":7558063964,"max_energy_range_uj":262143328850,"samples":13,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.log b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.log new file mode 100644 index 00000000..27228bf7 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.log @@ -0,0 +1,120 @@ +warn: LLAMA_ARG_HOST environment variable is set, but will be overwritten by command line argument --host +warn: LLAMA_ARG_PORT environment variable is set, but will be overwritten by command line argument --port +0.00.533.282 I srv llama_server: initializing ... +0.00.533.299 I cmn common_param: common_params_print_info: verbosity = 3 (adjust with the `-lv N` CLI arg) +0.00.533.585 W srv llama_server: security: no API key is set and CORS allows all origins (see https://github.com/ggml-org/llama.cpp/pull/25655) +0.00.537.310 I srv load_model: loading model '/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf' +0.01.478.649 W load: control-looking token: 212 '' was not control-type; this is probably a bug in the model. its type will be overridden +0.01.479.017 W load: control-looking token: 50 '<|tool_response>' was not control-type; this is probably a bug in the model. its type will be overridden +0.01.501.013 W load: '' is a normal token here, removing it from EOG list +0.03.309.780 I cmn init: llama threadpool init, n_threads = 48 +1.37.841.224 I srv load_model: initializing, n_slots = 4, n_ctx_slot = 8192, kv_unified = 'true' +1.37.847.741 I srv llama_server: model loaded +1.37.847.746 I srv llama_server: listening on http://0.0.0.0:8080 +1.40.155.977 I slot get_availabl: id 0 | task -1 | selected slot by LRU, n_tokens = 0, t_last = -1 +1.40.156.038 I slot launch_slot_: id 0 | task 0 | processing task, is_child = 0 +1.40.543.070 I slot print_timing: id 0 | task 0 | prompt eval time = 124.10 ms / 19 tokens ( 6.53 ms per token, 153.10 tokens per second) +1.40.543.074 I slot print_timing: id 0 | task 0 | eval time = 262.88 ms / 16 tokens ( 17.53 ms per token, 57.06 tokens per second) +1.40.543.074 I slot print_timing: id 0 | task 0 | total time = 386.98 ms / 35 tokens +1.40.543.076 I slot print_timing: id 0 | task 0 | graphs reused = 15 +1.40.543.077 I slot print_timing: id 0 | task 0 | graph reallocs = 0 / 0 (same size) / (changed size) +1.40.543.097 I slot release: id 0 | task 0 | stop processing: n_tokens = 34, truncated = 0 +2.40.837.962 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.220 (> 0.100 thold), f_keep = 0.324 +2.40.841.362 I slot launch_slot_: id 0 | task 19 | processing task, is_child = 0 +2.45.508.189 I slot print_timing: id 0 | task 19 | n_gen = 174, tg = 57.44 t/s, tg_3s = 57.77 t/s +2.46.950.112 I slot print_timing: id 0 | task 19 | prompt eval time = 1655.08 ms / 43 tokens ( 38.49 ms per token, 25.98 tokens per second) +2.46.950.114 I slot print_timing: id 0 | task 19 | eval time = 4453.62 ms / 256 tokens ( 17.47 ms per token, 57.26 tokens per second) +2.46.950.115 I slot print_timing: id 0 | task 19 | total time = 6108.70 ms / 299 tokens +2.46.950.115 I slot print_timing: id 0 | task 19 | graphs reused = 268 +2.46.950.116 I slot print_timing: id 0 | task 19 | graph reallocs = 0 / 0 (same size) / (changed size) +2.46.950.132 I slot release: id 0 | task 19 | stop processing: n_tokens = 305, truncated = 0 +2.46.955.633 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +2.46.989.979 I slot launch_slot_: id 0 | task 278 | processing task, is_child = 0 +2.50.171.051 I slot print_timing: id 0 | task 278 | n_gen = 173, tg = 57.30 t/s, tg_3s = 57.64 t/s +2.51.582.846 I slot print_timing: id 0 | task 278 | prompt eval time = 179.43 ms / 43 tokens ( 4.17 ms per token, 239.65 tokens per second) +2.51.582.849 I slot print_timing: id 0 | task 278 | eval time = 4413.39 ms / 256 tokens ( 17.31 ms per token, 57.78 tokens per second) +2.51.582.849 I slot print_timing: id 0 | task 278 | total time = 4592.82 ms / 299 tokens +2.51.582.850 I slot print_timing: id 0 | task 278 | graphs reused = 521 +2.51.582.851 I slot print_timing: id 0 | task 278 | graph reallocs = 0 / 0 (same size) / (changed size) +2.51.582.867 I slot release: id 0 | task 278 | stop processing: n_tokens = 305, truncated = 0 +2.51.587.955 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +2.51.621.465 I slot launch_slot_: id 0 | task 537 | processing task, is_child = 0 +2.54.797.575 I slot print_timing: id 0 | task 537 | n_gen = 168, tg = 55.50 t/s, tg_3s = 55.83 t/s +2.56.287.778 I slot print_timing: id 0 | task 537 | prompt eval time = 167.01 ms / 43 tokens ( 3.88 ms per token, 257.47 tokens per second) +2.56.287.780 I slot print_timing: id 0 | task 537 | eval time = 4499.26 ms / 256 tokens ( 17.64 ms per token, 56.68 tokens per second) +2.56.287.781 I slot print_timing: id 0 | task 537 | total time = 4666.27 ms / 299 tokens +2.56.287.781 I slot print_timing: id 0 | task 537 | graphs reused = 774 +2.56.287.781 I slot print_timing: id 0 | task 537 | graph reallocs = 0 / 0 (same size) / (changed size) +2.56.287.795 I slot release: id 0 | task 537 | stop processing: n_tokens = 305, truncated = 0 +2.56.295.486 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +2.56.329.411 I slot launch_slot_: id 0 | task 796 | processing task, is_child = 0 +2.59.496.725 I slot print_timing: id 0 | task 796 | n_gen = 168, tg = 55.66 t/s, tg_3s = 55.99 t/s +3.00.990.917 I slot print_timing: id 0 | task 796 | prompt eval time = 166.67 ms / 43 tokens ( 3.88 ms per token, 258.00 tokens per second) +3.00.990.919 I slot print_timing: id 0 | task 796 | eval time = 4494.79 ms / 256 tokens ( 17.63 ms per token, 56.73 tokens per second) +3.00.990.919 I slot print_timing: id 0 | task 796 | total time = 4661.45 ms / 299 tokens +3.00.990.920 I slot print_timing: id 0 | task 796 | graphs reused = 1027 +3.00.990.920 I slot print_timing: id 0 | task 796 | graph reallocs = 0 / 0 (same size) / (changed size) +3.00.990.949 I slot release: id 0 | task 796 | stop processing: n_tokens = 305, truncated = 0 +3.00.997.739 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.01.033.294 I slot launch_slot_: id 0 | task 1055 | processing task, is_child = 0 +3.04.203.262 I slot print_timing: id 0 | task 1055 | n_gen = 168, tg = 55.62 t/s, tg_3s = 55.96 t/s +3.05.690.808 I slot print_timing: id 0 | task 1055 | prompt eval time = 167.52 ms / 43 tokens ( 3.90 ms per token, 256.68 tokens per second) +3.05.690.810 I slot print_timing: id 0 | task 1055 | eval time = 4489.94 ms / 256 tokens ( 17.61 ms per token, 56.79 tokens per second) +3.05.690.810 I slot print_timing: id 0 | task 1055 | total time = 4657.47 ms / 299 tokens +3.05.690.811 I slot print_timing: id 0 | task 1055 | graphs reused = 1280 +3.05.690.811 I slot print_timing: id 0 | task 1055 | graph reallocs = 0 / 0 (same size) / (changed size) +3.05.690.825 I slot release: id 0 | task 1055 | stop processing: n_tokens = 305, truncated = 0 +3.05.697.182 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.05.733.698 I slot launch_slot_: id 0 | task 1314 | processing task, is_child = 0 +3.08.907.536 I slot print_timing: id 0 | task 1314 | n_gen = 168, tg = 55.54 t/s, tg_3s = 55.87 t/s +3.10.401.014 I slot print_timing: id 0 | task 1314 | prompt eval time = 167.03 ms / 43 tokens ( 3.88 ms per token, 257.43 tokens per second) +3.10.401.016 I slot print_timing: id 0 | task 1314 | eval time = 4500.24 ms / 256 tokens ( 17.65 ms per token, 56.66 tokens per second) +3.10.401.016 I slot print_timing: id 0 | task 1314 | total time = 4667.27 ms / 299 tokens +3.10.401.017 I slot print_timing: id 0 | task 1314 | graphs reused = 1533 +3.10.401.017 I slot print_timing: id 0 | task 1314 | graph reallocs = 0 / 0 (same size) / (changed size) +3.10.401.030 I slot release: id 0 | task 1314 | stop processing: n_tokens = 305, truncated = 0 +3.10.406.955 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.10.443.323 I slot launch_slot_: id 0 | task 1573 | processing task, is_child = 0 +3.13.615.254 I slot print_timing: id 0 | task 1573 | n_gen = 168, tg = 55.57 t/s, tg_3s = 55.90 t/s +3.15.105.948 I slot print_timing: id 0 | task 1573 | prompt eval time = 166.72 ms / 43 tokens ( 3.88 ms per token, 257.92 tokens per second) +3.15.105.950 I slot print_timing: id 0 | task 1573 | eval time = 4495.85 ms / 256 tokens ( 17.63 ms per token, 56.72 tokens per second) +3.15.105.950 I slot print_timing: id 0 | task 1573 | total time = 4662.57 ms / 299 tokens +3.15.105.951 I slot print_timing: id 0 | task 1573 | graphs reused = 1786 +3.15.105.951 I slot print_timing: id 0 | task 1573 | graph reallocs = 0 / 0 (same size) / (changed size) +3.15.105.964 I slot release: id 0 | task 1573 | stop processing: n_tokens = 305, truncated = 0 +3.15.111.577 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.15.148.113 I slot launch_slot_: id 0 | task 1832 | processing task, is_child = 0 +3.18.325.404 I slot print_timing: id 0 | task 1832 | n_gen = 168, tg = 55.47 t/s, tg_3s = 55.80 t/s +3.19.807.687 I slot print_timing: id 0 | task 1832 | prompt eval time = 166.49 ms / 43 tokens ( 3.87 ms per token, 258.28 tokens per second) +3.19.807.690 I slot print_timing: id 0 | task 1832 | eval time = 4493.04 ms / 256 tokens ( 17.62 ms per token, 56.75 tokens per second) +3.19.807.690 I slot print_timing: id 0 | task 1832 | total time = 4659.52 ms / 299 tokens +3.19.807.691 I slot print_timing: id 0 | task 1832 | graphs reused = 2039 +3.19.807.691 I slot print_timing: id 0 | task 1832 | graph reallocs = 0 / 0 (same size) / (changed size) +3.19.807.706 I slot release: id 0 | task 1832 | stop processing: n_tokens = 305, truncated = 0 +3.19.814.175 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.19.850.507 I slot launch_slot_: id 0 | task 2091 | processing task, is_child = 0 +3.23.020.460 I slot print_timing: id 0 | task 2091 | n_gen = 168, tg = 55.61 t/s, tg_3s = 55.94 t/s +3.24.519.755 I slot print_timing: id 0 | task 2091 | prompt eval time = 166.91 ms / 43 tokens ( 3.88 ms per token, 257.63 tokens per second) +3.24.519.757 I slot print_timing: id 0 | task 2091 | eval time = 4502.29 ms / 256 tokens ( 17.66 ms per token, 56.64 tokens per second) +3.24.519.757 I slot print_timing: id 0 | task 2091 | total time = 4669.20 ms / 299 tokens +3.24.519.758 I slot print_timing: id 0 | task 2091 | graphs reused = 2292 +3.24.519.758 I slot print_timing: id 0 | task 2091 | graph reallocs = 0 / 0 (same size) / (changed size) +3.24.519.771 I slot release: id 0 | task 2091 | stop processing: n_tokens = 305, truncated = 0 +3.24.525.212 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.440 (> 0.100 thold), f_keep = 0.072 +3.24.561.663 I slot launch_slot_: id 0 | task 2350 | processing task, is_child = 0 +3.27.731.768 I slot print_timing: id 0 | task 2350 | n_gen = 173, tg = 57.27 t/s, tg_3s = 57.61 t/s +3.29.238.510 I slot print_timing: id 0 | task 2350 | prompt eval time = 166.90 ms / 43 tokens ( 3.88 ms per token, 257.65 tokens per second) +3.29.238.513 I slot print_timing: id 0 | task 2350 | eval time = 4509.90 ms / 256 tokens ( 17.69 ms per token, 56.54 tokens per second) +3.29.238.513 I slot print_timing: id 0 | task 2350 | total time = 4676.80 ms / 299 tokens +3.29.238.513 I slot print_timing: id 0 | task 2350 | graphs reused = 2545 +3.29.238.514 I slot print_timing: id 0 | task 2350 | graph reallocs = 0 / 0 (same size) / (changed size) +3.29.238.526 I slot release: id 0 | task 2350 | stop processing: n_tokens = 305, truncated = 0 +3.29.245.444 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.431 (> 0.100 thold), f_keep = 0.072 +3.29.282.427 I slot launch_slot_: id 0 | task 2609 | processing task, is_child = 0 +3.32.468.099 I slot print_timing: id 0 | task 2609 | n_gen = 173, tg = 57.21 t/s, tg_3s = 57.54 t/s +3.33.957.211 I slot print_timing: id 0 | task 2609 | prompt eval time = 178.97 ms / 44 tokens ( 4.07 ms per token, 245.85 tokens per second) +3.33.957.213 I slot print_timing: id 0 | task 2609 | eval time = 4495.76 ms / 256 tokens ( 17.63 ms per token, 56.72 tokens per second) +3.33.957.214 I slot print_timing: id 0 | task 2609 | total time = 4674.74 ms / 300 tokens +3.33.957.214 I slot print_timing: id 0 | task 2609 | graphs reused = 2798 +3.33.957.215 I slot print_timing: id 0 | task 2609 | graph reallocs = 0 / 0 (same size) / (changed size) +3.33.957.229 I slot release: id 0 | task 2609 | stop processing: n_tokens = 306, truncated = 0 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.n1-energy.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.n1-energy.json new file mode 100644 index 00000000..f38481fb --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.n1-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":6924.788,"seconds":53.205,"avg_watts":130.154,"command_seconds":53.188,"energy_uj":6924787937,"max_energy_range_uj":262143328850,"samples":12,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.n1.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.n1.json new file mode 100644 index 00000000..e255543c --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.n1.json @@ -0,0 +1,208 @@ +{ + "tool": "k3d-gpu/bench/llm_load.py", + "schema": 1, + "started_at": "2026-10-21T21:56:22Z", + "config": { + "base_url": "http://127.0.0.1:18080/v1", + "model": "m", + "prompt": "Explain in three short paragraphs how a CPU cache hierarchy reduces memory latency, and what a cache miss costs.", + "max_tokens": 256, + "temperature": 0.0, + "ignore_eos": true, + "extra_body": null, + "unique_prompts": true, + "requests": 8, + "concurrency": "1", + "warmup": 3, + "timeout": 600.0, + "label": "gg2", + "out": "/home/devcloud/k3dgpu-gemma/results/H54c/hold1/gg2.n1.json", + "run_id": "e6a68419" + }, + "phases": [ + { + "concurrency": 1, + "requests": 8, + "ok": 8, + "errors": 0, + "wall_s": 37.669831899926066, + "output_tokens_total": 2048, + "aggregate_tokens_per_s": 54.36711279839875, + "requests_per_s": 0.21237153436874512, + "stats": { + "first_chunk_s": { + "n": 8, + "median": 0.20909548713825643, + "p90": 0.22259240364655852, + "min": 0.20682961214333773, + "max": 0.22259240364655852 + }, + "ttft_s": { + "n": 8, + "median": 0.2606465080752969, + "p90": 0.27448667865246534, + "min": 0.2581928772851825, + "max": 0.27448667865246534 + }, + "latency_s": { + "n": 8, + "median": 4.707336241612211, + "p90": 4.7186519098468125, + "min": 4.699701396748424, + "max": 4.7186519098468125 + }, + "output_tokens": { + "n": 8, + "median": 256.0, + "p90": 256, + "min": 256, + "max": 256 + }, + "tokens_per_s": { + "n": 8, + "median": 54.38322107190963, + "p90": 54.47154582568126, + "min": 54.25278339895829, + "max": 54.47154582568126 + }, + "decode_tokens_per_s": { + "n": 8, + "median": 57.38314863583636, + "p90": 57.450303048482, + "min": 57.196770789092085, + "max": 57.450303048482 + } + }, + "samples": [ + { + "index": 0, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 973, + "first_chunk_s": 0.20682961214333773, + "ttft_s": 0.2581928772851825, + "latency_s": 4.701757772359997, + "output_tokens": 256, + "tokens_per_s": 54.44772197856197, + "decode_tokens_per_s": 57.38635668011475, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 1, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 972, + "first_chunk_s": 0.20962025690823793, + "ttft_s": 0.26108251279219985, + "latency_s": 4.699701396748424, + "output_tokens": 256, + "tokens_per_s": 54.47154582568126, + "decode_tokens_per_s": 57.450303048482, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 2, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 965, + "first_chunk_s": 0.2098146309144795, + "ttft_s": 0.2607422489672899, + "latency_s": 4.710386481136084, + "output_tokens": 256, + "tokens_per_s": 54.34798206584869, + "decode_tokens_per_s": 57.30795243279728, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 3, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 969, + "first_chunk_s": 0.20855473494157195, + "ttft_s": 0.26055076718330383, + "latency_s": 4.704286002088338, + "output_tokens": 256, + "tokens_per_s": 54.41846007797057, + "decode_tokens_per_s": 57.384156913086095, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 4, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 959, + "first_chunk_s": 0.20873776730149984, + "ttft_s": 0.2600087309256196, + "latency_s": 4.702001855242997, + "output_tokens": 256, + "tokens_per_s": 54.444895574540354, + "decode_tokens_per_s": 57.40666247410886, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 5, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 954, + "first_chunk_s": 0.20945320697501302, + "ttft_s": 0.26089481776580215, + "latency_s": 4.711980061605573, + "output_tokens": 256, + "tokens_per_s": 54.32960170734888, + "decode_tokens_per_s": 57.289399333098785, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 6, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 960, + "first_chunk_s": 0.20833633886650205, + "ttft_s": 0.2603582600131631, + "latency_s": 4.7186519098468125, + "output_tokens": 256, + "tokens_per_s": 54.25278339895829, + "decode_tokens_per_s": 57.196770789092085, + "prompt_tokens": 50, + "finished": true + }, + { + "index": 7, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 944, + "first_chunk_s": 0.22259240364655852, + "ttft_s": 0.27448667865246534, + "latency_s": 4.718378077726811, + "output_tokens": 256, + "tokens_per_s": 54.255931971295944, + "decode_tokens_per_s": 57.382140358586625, + "prompt_tokens": 51, + "finished": true + } + ] + } + ] +} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.pf.log b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.pf.log new file mode 100644 index 00000000..ad42af6d --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.pf.log @@ -0,0 +1,24 @@ +error: unable to forward port because pod is not running. Current status=Pending +Forwarding from 127.0.0.1:18080 -> 8080 +Forwarding from [::1]:18080 -> 8080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.smoke.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.smoke.json new file mode 100644 index 00000000..fdc64795 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.smoke.json @@ -0,0 +1 @@ +{"choices":[{"finish_reason":"length","index":0,"message":{"role":"assistant","content":"","reasoning_content":"The user said \"Say hi.\"\nThe user wants a simple"}}],"created":1792619722,"model":"/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","system_fingerprint":"b11749-1d88cb05f","object":"chat.completion","usage":{"completion_tokens":16,"prompt_tokens":19,"total_tokens":35,"prompt_tokens_details":{"cached_tokens":0}},"id":"chatcmpl-LmcEIL1cufNmkNq6jP3KfO0q9KS8nOI7","timings":{"cache_n":0,"prompt_n":19,"prompt_ms":124.098,"prompt_per_token_ms":6.5314736842105265,"prompt_per_second":153.10480426759497,"predicted_n":16,"predicted_ms":262.88,"predicted_per_token_ms":17.525333333333332,"predicted_per_second":57.060255629945225}} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.yaml b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.yaml new file mode 100644 index 00000000..75db658b --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/gg2.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: {name: gg2} +spec: + restartPolicy: Never + containers: + - name: server + image: ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba73574a1e12cd237c88b512c8bb39ba6f703e873912b76cb8988a81bd + args: ["-m","/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","-t","48","-Cr","0-47","--cpu-strict","1","--jinja","-c","8192","--host","0.0.0.0","--port","8080","-ngl","99"] + securityContext: {privileged: true} + volumeMounts: [{name: models, mountPath: /models, readOnly: true}, {name: dri, mountPath: /dev/dri}, {name: card, mountPath: /dev/dri/renderD130}] + volumes: + - {name: models, hostPath: {path: /models}} + - {name: dri, emptyDir: {medium: Memory}} + - {name: card, hostPath: {path: /dev/dri/renderD130, type: CharDevice}} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.boot_s b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.boot_s new file mode 100644 index 00000000..398050c6 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.boot_s @@ -0,0 +1 @@ +101 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.dri b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.dri new file mode 100644 index 00000000..a6e6e725 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.dri @@ -0,0 +1,10 @@ +total 0 +crw-rw---- 1 root video 226, 0 Oct 21 21:49 card0 +crw-rw---- 1 root video 226, 1 Oct 21 21:49 card1 +crw-rw---- 1 root video 226, 2 Oct 21 21:49 card2 +crw-rw---- 1 root video 226, 3 Oct 21 21:49 card3 +crw-rw---- 1 root video 226, 4 Oct 21 21:49 card4 +crw-rw---- 1 root 990 226, 128 Oct 21 21:49 renderD128 +crw-rw---- 1 root 990 226, 129 Oct 21 21:49 renderD129 +crw-rw---- 1 root 990 226, 130 Oct 21 21:38 renderD130 +crw-rw---- 1 root 990 226, 131 Oct 21 21:49 renderD131 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.fuser b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.fuser new file mode 100644 index 00000000..d62df9af --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.fuser @@ -0,0 +1,17 @@ + USER PID ACCESS COMMAND +/dev/dri/renderD128: root 3898329 F...m python + root 3900003 F...m sglang::schedul + root 3900352 F...m sglang::schedul + root 3900921 F...m sglang::detoken + root 3901745 F...m python + root 3901746 F...m python +/dev/dri/renderD129: root 3898329 F...m python + root 3900003 F...m sglang::schedul + root 3900352 F...m sglang::schedul + root 3900921 F...m sglang::detoken + root 3901745 F...m python + root 3901746 F...m python +/dev/dri/renderD130: root 3900003 F.... sglang::schedul + root 3900352 F.... sglang::schedul +/dev/dri/renderD131: root 3900003 F.... sglang::schedul + root 3900352 F.... sglang::schedul diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.gpu-energy b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.gpu-energy new file mode 100644 index 00000000..dc4582da --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.gpu-energy @@ -0,0 +1,2 @@ +before 2026-10-21T21:52:15Z card=311670601159545 pkg=218405315011901 +after 2026-10-21T21:53:20Z card=311676677570739 pkg=218409544887634 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.idle-energy.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.idle-energy.json new file mode 100644 index 00000000..ada8304e --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.idle-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":7600.300,"seconds":60.017,"avg_watts":126.636,"command_seconds":60.002,"energy_uj":7600299757,"max_energy_range_uj":262143328850,"samples":13,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.log b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.log new file mode 100644 index 00000000..c5472e10 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.log @@ -0,0 +1,122 @@ +warn: LLAMA_ARG_HOST environment variable is set, but will be overwritten by command line argument --host +warn: LLAMA_ARG_PORT environment variable is set, but will be overwritten by command line argument --port +0.00.532.020 I srv llama_server: initializing ... +0.00.532.038 I cmn common_param: common_params_print_info: verbosity = 3 (adjust with the `-lv N` CLI arg) +0.00.532.334 W srv llama_server: security: no API key is set and CORS allows all origins (see https://github.com/ggml-org/llama.cpp/pull/25655) +0.00.536.103 I srv load_model: loading model '/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf' +0.01.471.315 W load: control-looking token: 212 '' was not control-type; this is probably a bug in the model. its type will be overridden +0.01.471.682 W load: control-looking token: 50 '<|tool_response>' was not control-type; this is probably a bug in the model. its type will be overridden +0.01.493.556 W load: '' is a normal token here, removing it from EOG list +0.01.514.382 W llama_model_loader: tensor overrides to CPU are used with mmap enabled - consider using --load-mode none for better performance +0.01.945.405 I cmn init: llama threadpool init, n_threads = 48 +1.33.894.325 I srv load_model: initializing, n_slots = 4, n_ctx_slot = 8192, kv_unified = 'true' +1.33.901.146 I srv llama_server: model loaded +1.33.901.152 I srv llama_server: listening on http://0.0.0.0:8080 +1.38.779.532 I slot get_availabl: id 0 | task -1 | selected slot by LRU, n_tokens = 0, t_last = -1 +1.38.779.601 I slot launch_slot_: id 0 | task 0 | processing task, is_child = 0 +1.39.176.980 I slot print_timing: id 0 | task 0 | prompt eval time = 122.75 ms / 19 tokens ( 6.46 ms per token, 154.78 tokens per second) +1.39.176.985 I slot print_timing: id 0 | task 0 | eval time = 274.57 ms / 16 tokens ( 18.30 ms per token, 54.63 tokens per second) +1.39.176.985 I slot print_timing: id 0 | task 0 | total time = 397.32 ms / 35 tokens +1.39.176.988 I slot print_timing: id 0 | task 0 | graphs reused = 15 +1.39.176.988 I slot print_timing: id 0 | task 0 | graph reallocs = 2 / 0 (same size) / (changed size) +1.39.177.015 I slot release: id 0 | task 0 | stop processing: n_tokens = 34, truncated = 0 +2.39.465.529 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.216 (> 0.100 thold), f_keep = 0.324 +2.39.468.731 I slot launch_slot_: id 0 | task 19 | processing task, is_child = 0 +2.44.600.332 I slot print_timing: id 0 | task 19 | prompt processing, n_tokens = 40, progress = 0.92, t = 5.13 s / 7.79 tokens per second +2.47.642.184 I slot print_timing: id 0 | task 19 | n_gen = 171, tg = 56.54 t/s, tg_3s = 56.87 t/s +2.49.238.710 I slot print_timing: id 0 | task 19 | prompt eval time = 5166.76 ms / 44 tokens ( 117.43 ms per token, 8.52 tokens per second) +2.49.238.713 I slot print_timing: id 0 | task 19 | eval time = 4603.17 ms / 256 tokens ( 18.05 ms per token, 55.40 tokens per second) +2.49.238.713 I slot print_timing: id 0 | task 19 | total time = 9769.93 ms / 300 tokens +2.49.238.714 I slot print_timing: id 0 | task 19 | graphs reused = 268 +2.49.238.714 I slot print_timing: id 0 | task 19 | graph reallocs = 2 / 0 (same size) / (changed size) +2.49.238.732 I slot release: id 0 | task 19 | stop processing: n_tokens = 306, truncated = 0 +2.49.242.445 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.49.278.269 I slot launch_slot_: id 0 | task 278 | processing task, is_child = 0 +2.53.112.532 I slot print_timing: id 0 | task 278 | n_gen = 170, tg = 56.27 t/s, tg_3s = 56.61 t/s +2.54.697.835 I slot print_timing: id 0 | task 278 | prompt eval time = 831.05 ms / 44 tokens ( 18.89 ms per token, 52.95 tokens per second) +2.54.697.837 I slot print_timing: id 0 | task 278 | eval time = 4588.47 ms / 256 tokens ( 17.99 ms per token, 55.57 tokens per second) +2.54.697.838 I slot print_timing: id 0 | task 278 | total time = 5419.51 ms / 300 tokens +2.54.697.838 I slot print_timing: id 0 | task 278 | graphs reused = 521 +2.54.697.839 I slot print_timing: id 0 | task 278 | graph reallocs = 2 / 0 (same size) / (changed size) +2.54.697.855 I slot release: id 0 | task 278 | stop processing: n_tokens = 306, truncated = 0 +2.54.701.227 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.54.736.607 I slot launch_slot_: id 0 | task 537 | processing task, is_child = 0 +2.58.592.794 I slot print_timing: id 0 | task 537 | n_gen = 169, tg = 55.69 t/s, tg_3s = 56.02 t/s +3.00.238.923 I slot print_timing: id 0 | task 537 | prompt eval time = 839.49 ms / 44 tokens ( 19.08 ms per token, 52.41 tokens per second) +3.00.238.926 I slot print_timing: id 0 | task 537 | eval time = 4662.77 ms / 256 tokens ( 18.29 ms per token, 54.69 tokens per second) +3.00.238.926 I slot print_timing: id 0 | task 537 | total time = 5502.26 ms / 300 tokens +3.00.238.927 I slot print_timing: id 0 | task 537 | graphs reused = 774 +3.00.238.928 I slot print_timing: id 0 | task 537 | graph reallocs = 2 / 0 (same size) / (changed size) +3.00.238.947 I slot release: id 0 | task 537 | stop processing: n_tokens = 306, truncated = 0 +3.00.243.876 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +3.00.280.262 I slot launch_slot_: id 0 | task 796 | processing task, is_child = 0 +3.04.109.033 I slot print_timing: id 0 | task 796 | n_gen = 165, tg = 54.65 t/s, tg_3s = 54.98 t/s +3.05.688.360 I slot print_timing: id 0 | task 796 | prompt eval time = 827.53 ms / 44 tokens ( 18.81 ms per token, 53.17 tokens per second) +3.05.688.362 I slot print_timing: id 0 | task 796 | eval time = 4580.51 ms / 256 tokens ( 17.96 ms per token, 55.67 tokens per second) +3.05.688.363 I slot print_timing: id 0 | task 796 | total time = 5408.04 ms / 300 tokens +3.05.688.364 I slot print_timing: id 0 | task 796 | graphs reused = 1027 +3.05.688.364 I slot print_timing: id 0 | task 796 | graph reallocs = 2 / 0 (same size) / (changed size) +3.05.688.381 I slot release: id 0 | task 796 | stop processing: n_tokens = 306, truncated = 0 +3.05.692.284 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +3.05.728.183 I slot launch_slot_: id 0 | task 1055 | processing task, is_child = 0 +3.09.567.462 I slot print_timing: id 0 | task 1055 | n_gen = 164, tg = 54.21 t/s, tg_3s = 54.55 t/s +3.11.155.101 I slot print_timing: id 0 | task 1055 | prompt eval time = 832.63 ms / 44 tokens ( 18.92 ms per token, 52.84 tokens per second) +3.11.155.103 I slot print_timing: id 0 | task 1055 | eval time = 4594.23 ms / 256 tokens ( 18.02 ms per token, 55.50 tokens per second) +3.11.155.104 I slot print_timing: id 0 | task 1055 | total time = 5426.86 ms / 300 tokens +3.11.155.105 I slot print_timing: id 0 | task 1055 | graphs reused = 1280 +3.11.155.105 I slot print_timing: id 0 | task 1055 | graph reallocs = 2 / 0 (same size) / (changed size) +3.11.155.123 I slot release: id 0 | task 1055 | stop processing: n_tokens = 306, truncated = 0 +3.11.158.536 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +3.11.195.774 I slot launch_slot_: id 0 | task 1314 | processing task, is_child = 0 +3.15.035.263 I slot print_timing: id 0 | task 1314 | n_gen = 166, tg = 54.82 t/s, tg_3s = 55.15 t/s +3.16.595.227 I slot print_timing: id 0 | task 1314 | prompt eval time = 829.62 ms / 44 tokens ( 18.85 ms per token, 53.04 tokens per second) +3.16.595.230 I slot print_timing: id 0 | task 1314 | eval time = 4569.78 ms / 256 tokens ( 17.92 ms per token, 55.80 tokens per second) +3.16.595.231 I slot print_timing: id 0 | task 1314 | total time = 5399.40 ms / 300 tokens +3.16.595.232 I slot print_timing: id 0 | task 1314 | graphs reused = 1533 +3.16.595.232 I slot print_timing: id 0 | task 1314 | graph reallocs = 2 / 0 (same size) / (changed size) +3.16.595.255 I slot release: id 0 | task 1314 | stop processing: n_tokens = 306, truncated = 0 +3.16.598.895 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +3.16.637.171 I slot launch_slot_: id 0 | task 1573 | processing task, is_child = 0 +3.20.474.339 I slot print_timing: id 0 | task 1573 | n_gen = 163, tg = 54.00 t/s, tg_3s = 54.33 t/s +3.22.104.433 I slot print_timing: id 0 | task 1573 | prompt eval time = 836.89 ms / 44 tokens ( 19.02 ms per token, 52.58 tokens per second) +3.22.104.436 I slot print_timing: id 0 | task 1573 | eval time = 4630.31 ms / 256 tokens ( 18.16 ms per token, 55.07 tokens per second) +3.22.104.437 I slot print_timing: id 0 | task 1573 | total time = 5467.21 ms / 300 tokens +3.22.104.437 I slot print_timing: id 0 | task 1573 | graphs reused = 1786 +3.22.104.438 I slot print_timing: id 0 | task 1573 | graph reallocs = 2 / 0 (same size) / (changed size) +3.22.104.456 I slot release: id 0 | task 1573 | stop processing: n_tokens = 306, truncated = 0 +3.22.108.146 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +3.22.146.576 I slot launch_slot_: id 0 | task 1832 | processing task, is_child = 0 +3.26.052.290 I slot print_timing: id 0 | task 1832 | n_gen = 168, tg = 55.62 t/s, tg_3s = 55.95 t/s +3.27.569.386 I slot print_timing: id 0 | task 1832 | prompt eval time = 903.08 ms / 44 tokens ( 20.52 ms per token, 48.72 tokens per second) +3.27.569.388 I slot print_timing: id 0 | task 1832 | eval time = 4519.68 ms / 256 tokens ( 17.72 ms per token, 56.42 tokens per second) +3.27.569.388 I slot print_timing: id 0 | task 1832 | total time = 5422.75 ms / 300 tokens +3.27.569.389 I slot print_timing: id 0 | task 1832 | graphs reused = 2039 +3.27.569.390 I slot print_timing: id 0 | task 1832 | graph reallocs = 2 / 0 (same size) / (changed size) +3.27.569.407 I slot release: id 0 | task 1832 | stop processing: n_tokens = 306, truncated = 0 +3.27.573.233 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +3.27.611.843 I slot launch_slot_: id 0 | task 2091 | processing task, is_child = 0 +3.31.507.353 I slot print_timing: id 0 | task 2091 | n_gen = 170, tg = 56.22 t/s, tg_3s = 56.56 t/s +3.33.080.433 I slot print_timing: id 0 | task 2091 | prompt eval time = 889.62 ms / 44 tokens ( 20.22 ms per token, 49.46 tokens per second) +3.33.080.435 I slot print_timing: id 0 | task 2091 | eval time = 4578.92 ms / 256 tokens ( 17.96 ms per token, 55.69 tokens per second) +3.33.080.436 I slot print_timing: id 0 | task 2091 | total time = 5468.54 ms / 300 tokens +3.33.080.436 I slot print_timing: id 0 | task 2091 | graphs reused = 2292 +3.33.080.437 I slot print_timing: id 0 | task 2091 | graph reallocs = 2 / 0 (same size) / (changed size) +3.33.080.454 I slot release: id 0 | task 2091 | stop processing: n_tokens = 306, truncated = 0 +3.33.084.031 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +3.33.122.342 I slot launch_slot_: id 0 | task 2350 | processing task, is_child = 0 +3.37.028.951 I slot print_timing: id 0 | task 2350 | n_gen = 174, tg = 57.56 t/s, tg_3s = 57.90 t/s +3.38.526.798 I slot print_timing: id 0 | task 2350 | prompt eval time = 901.14 ms / 44 tokens ( 20.48 ms per token, 48.83 tokens per second) +3.38.526.801 I slot print_timing: id 0 | task 2350 | eval time = 4503.26 ms / 256 tokens ( 17.66 ms per token, 56.63 tokens per second) +3.38.526.801 I slot print_timing: id 0 | task 2350 | total time = 5404.40 ms / 300 tokens +3.38.526.802 I slot print_timing: id 0 | task 2350 | graphs reused = 2545 +3.38.526.802 I slot print_timing: id 0 | task 2350 | graph reallocs = 2 / 0 (same size) / (changed size) +3.38.526.821 I slot release: id 0 | task 2350 | stop processing: n_tokens = 306, truncated = 0 +3.38.530.151 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.442 (> 0.100 thold), f_keep = 0.075 +3.38.568.694 I slot launch_slot_: id 0 | task 2609 | processing task, is_child = 0 +3.42.505.235 I slot print_timing: id 0 | task 2609 | n_gen = 172, tg = 56.87 t/s, tg_3s = 57.21 t/s +3.44.138.899 I slot print_timing: id 0 | task 2609 | prompt eval time = 929.80 ms / 45 tokens ( 20.66 ms per token, 48.40 tokens per second) +3.44.138.902 I slot print_timing: id 0 | task 2609 | eval time = 4640.35 ms / 256 tokens ( 18.20 ms per token, 54.95 tokens per second) +3.44.138.903 I slot print_timing: id 0 | task 2609 | total time = 5570.15 ms / 301 tokens +3.44.138.903 I slot print_timing: id 0 | task 2609 | graphs reused = 2798 +3.44.138.904 I slot print_timing: id 0 | task 2609 | graph reallocs = 2 / 0 (same size) / (changed size) +3.44.138.923 I slot release: id 0 | task 2609 | stop processing: n_tokens = 307, truncated = 0 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.n1-energy.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.n1-energy.json new file mode 100644 index 00000000..d335d74f --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.n1-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":16520.610,"seconds":64.762,"avg_watts":255.099,"command_seconds":64.746,"energy_uj":16520609746,"max_energy_range_uj":262143328850,"samples":14,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.n1.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.n1.json new file mode 100644 index 00000000..c4035a03 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.n1.json @@ -0,0 +1,208 @@ +{ + "tool": "k3d-gpu/bench/llm_load.py", + "schema": 1, + "started_at": "2026-10-21T21:52:15Z", + "config": { + "base_url": "http://127.0.0.1:18080/v1", + "model": "m", + "prompt": "Explain in three short paragraphs how a CPU cache hierarchy reduces memory latency, and what a cache miss costs.", + "max_tokens": 256, + "temperature": 0.0, + "ignore_eos": true, + "extra_body": null, + "unique_prompts": true, + "requests": 8, + "concurrency": "1", + "warmup": 3, + "timeout": 600.0, + "label": "hg", + "out": "/home/devcloud/k3dgpu-gemma/results/H54c/hold1/hg.n1.json", + "run_id": "1362331b" + }, + "phases": [ + { + "concurrency": 1, + "requests": 8, + "ok": 8, + "errors": 0, + "wall_s": 43.90043053496629, + "output_tokens_total": 2048, + "aggregate_tokens_per_s": 46.65102312308274, + "requests_per_s": 0.18223055907454194, + "stats": { + "first_chunk_s": { + "n": 8, + "median": 0.9054298470728099, + "p90": 0.9717949638143182, + "min": 0.8675621831789613, + "max": 0.9717949638143182 + }, + "ttft_s": { + "n": 8, + "median": 0.9583844654262066, + "p90": 1.0249412097036839, + "min": 0.9205635380931199, + "max": 1.0249412097036839 + }, + "latency_s": { + "n": 8, + "median": 5.465687160147354, + "p90": 5.612036452628672, + "min": 5.440236078109592, + "max": 5.612036452628672 + }, + "output_tokens": { + "n": 8, + "median": 256.0, + "p90": 256, + "min": 256, + "max": 256 + }, + "tokens_per_s": { + "n": 8, + "median": 46.83766151219915, + "p90": 47.05678141985274, + "min": 45.61623969496667, + "max": 47.05678141985274 + }, + "decode_tokens_per_s": { + "n": 8, + "median": 56.3337991611167, + "p90": 57.32881973372036, + "min": 55.59073585692495, + "max": 57.32881973372036 + } + }, + "samples": [ + { + "index": 0, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 934, + "first_chunk_s": 0.8675621831789613, + "ttft_s": 0.9205635380931199, + "latency_s": 5.448036192916334, + "output_tokens": 256, + "tokens_per_s": 46.989408831912186, + "decode_tokens_per_s": 56.32281394970835, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 1, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 885, + "first_chunk_s": 0.8724731430411339, + "ttft_s": 0.9264740413054824, + "latency_s": 5.4664615243673325, + "output_tokens": 256, + "tokens_per_s": 46.83102567517449, + "decode_tokens_per_s": 56.16755573696502, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 2, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 918, + "first_chunk_s": 0.870392540935427, + "ttft_s": 0.9237632942385972, + "latency_s": 5.440236078109592, + "output_tokens": 256, + "tokens_per_s": 47.05678141985274, + "decode_tokens_per_s": 56.4599881816278, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 3, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 946, + "first_chunk_s": 0.878747140057385, + "ttft_s": 0.9315061238594353, + "latency_s": 5.50888280197978, + "output_tokens": 256, + "tokens_per_s": 46.47040229427259, + "decode_tokens_per_s": 55.70876463343918, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 4, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 966, + "first_chunk_s": 0.9453626456670463, + "ttft_s": 0.999384886585176, + "latency_s": 5.4649127959273756, + "output_tokens": 256, + "tokens_per_s": 46.8442973492238, + "decode_tokens_per_s": 57.1041106845446, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 5, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 898, + "first_chunk_s": 0.9321125540882349, + "ttft_s": 0.9852628069929779, + "latency_s": 5.510970072355121, + "output_tokens": 256, + "tokens_per_s": 46.45280170984453, + "decode_tokens_per_s": 56.344784372525055, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 6, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 932, + "first_chunk_s": 0.9430844462476671, + "ttft_s": 0.9981590961106122, + "latency_s": 5.446183688007295, + "output_tokens": 256, + "tokens_per_s": 47.005392154458875, + "decode_tokens_per_s": 57.32881973372036, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 7, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 937, + "first_chunk_s": 0.9717949638143182, + "ttft_s": 1.0249412097036839, + "latency_s": 5.612036452628672, + "output_tokens": 256, + "tokens_per_s": 45.61623969496667, + "decode_tokens_per_s": 55.59073585692495, + "prompt_tokens": 52, + "finished": true + } + ] + } + ] +} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.pf.log b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.pf.log new file mode 100644 index 00000000..ad42af6d --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.pf.log @@ -0,0 +1,24 @@ +error: unable to forward port because pod is not running. Current status=Pending +Forwarding from 127.0.0.1:18080 -> 8080 +Forwarding from [::1]:18080 -> 8080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.smoke.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.smoke.json new file mode 100644 index 00000000..dac88440 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.smoke.json @@ -0,0 +1 @@ +{"choices":[{"finish_reason":"length","index":0,"message":{"role":"assistant","content":"","reasoning_content":"The user said \"Say hi.\"\nThe user wants a simple"}}],"created":1792619475,"model":"/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","system_fingerprint":"b11749-1d88cb05f","object":"chat.completion","usage":{"completion_tokens":16,"prompt_tokens":19,"total_tokens":35,"prompt_tokens_details":{"cached_tokens":0}},"id":"chatcmpl-fJjXMgonDJwaEDqug0Xk3Q22vJpXcNAp","timings":{"cache_n":0,"prompt_n":19,"prompt_ms":122.755,"prompt_per_token_ms":6.46078947368421,"prompt_per_second":154.77984603478473,"predicted_n":16,"predicted_ms":274.567,"predicted_per_token_ms":18.304466666666666,"predicted_per_second":54.63147428496505}} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.yaml b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.yaml new file mode 100644 index 00000000..b94a92cd --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/hg.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: {name: hg} +spec: + restartPolicy: Never + containers: + - name: server + image: ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba73574a1e12cd237c88b512c8bb39ba6f703e873912b76cb8988a81bd + args: ["-m","/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","-t","48","-Cr","0-47","--cpu-strict","1","--jinja","-c","8192","--host","0.0.0.0","--port","8080","-ngl","99","-ot","exps=CPU"] + securityContext: {privileged: true} + volumeMounts: [{name: models, mountPath: /models, readOnly: true}, {name: dri, mountPath: /dev/dri}, {name: card, mountPath: /dev/dri/renderD130}] + volumes: + - {name: models, hostPath: {path: /models}} + - {name: dri, emptyDir: {medium: Memory}} + - {name: card, hostPath: {path: /dev/dri/renderD130, type: CharDevice}} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/verdict.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/verdict.json new file mode 100644 index 00000000..69c0dc10 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/verdict.json @@ -0,0 +1,16 @@ +{ + "B_exp": 802898880.0, + "B_rest": 1577144440, + "B_tot": 2380043320.0, + "median_tps": { + "Cg": 36.84118741427883, + "Gg": 57.96706402151845, + "Hg": 56.3337991611167, + "Gg2": 57.38314863583636 + }, + "pred_t_s": 0.02238832618701526, + "pred_tps": 44.66613500476771, + "measured_over_pred": 1.2612194709728874, + "gg_drift": -0.010073226849393824, + "verdict": "INCONCLUSIVE" +} diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/xe_clients-2105-2202Z.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/xe_clients-2105-2202Z.json new file mode 100644 index 00000000..8fefa0d9 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/xe_clients-2105-2202Z.json @@ -0,0 +1 @@ +{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"__name__":"xe_clients","bdf":"0000:12:00.0","card":"card1","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"11"],[1792616730,"11"],[1792616760,"11"],[1792616790,"11"],[1792616820,"11"],[1792616850,"11"],[1792616880,"11"],[1792616910,"11"],[1792616940,"11"],[1792616970,"11"],[1792617000,"11"],[1792617030,"11"],[1792617060,"11"],[1792617090,"11"],[1792617120,"11"],[1792617150,"11"],[1792617180,"9"],[1792617210,"9"],[1792617240,"9"],[1792617270,"9"],[1792617300,"9"],[1792617330,"9"],[1792617360,"9"],[1792617390,"9"],[1792617420,"9"],[1792617450,"9"],[1792617480,"9"],[1792617510,"9"],[1792617540,"9"],[1792617570,"9"],[1792617600,"9"],[1792617630,"9"],[1792617660,"9"],[1792617690,"9"],[1792617720,"9"],[1792617750,"9"],[1792617780,"9"],[1792617810,"11"],[1792617840,"11"],[1792617870,"11"],[1792617900,"11"],[1792617930,"11"],[1792617960,"11"],[1792617990,"11"],[1792618020,"11"],[1792618050,"11"],[1792618080,"11"],[1792618110,"11"],[1792618140,"11"],[1792618170,"11"],[1792618200,"11"],[1792618230,"11"],[1792618260,"11"],[1792618290,"11"],[1792618320,"11"],[1792618350,"11"],[1792618380,"11"],[1792618410,"11"],[1792618440,"11"],[1792618470,"11"],[1792618500,"11"],[1792618530,"11"],[1792618560,"11"],[1792618590,"11"],[1792618620,"11"],[1792618650,"11"],[1792618680,"11"],[1792618710,"9"],[1792618740,"9"],[1792618770,"9"],[1792618800,"9"],[1792618830,"9"],[1792618860,"9"],[1792618890,"9"],[1792618920,"9"],[1792618950,"11"],[1792618980,"11"],[1792619010,"11"],[1792619040,"11"],[1792619070,"11"],[1792619100,"11"],[1792619130,"9"],[1792619160,"11"],[1792619190,"11"],[1792619220,"11"],[1792619250,"11"],[1792619280,"11"],[1792619310,"11"],[1792619340,"11"],[1792619370,"9"],[1792619400,"11"],[1792619430,"11"],[1792619460,"11"],[1792619490,"11"],[1792619520,"11"],[1792619550,"11"],[1792619580,"11"],[1792619610,"9"],[1792619640,"11"],[1792619670,"11"],[1792619700,"11"],[1792619730,"11"],[1792619760,"11"],[1792619790,"11"],[1792619820,"11"],[1792619850,"9"],[1792619880,"9"],[1792619910,"9"],[1792619940,"11"],[1792619970,"11"],[1792620000,"11"],[1792620030,"11"],[1792620060,"11"],[1792620090,"11"],[1792620120,"11"]]},{"metric":{"__name__":"xe_clients","bdf":"0000:48:00.0","card":"card2","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"11"],[1792616730,"11"],[1792616760,"11"],[1792616790,"11"],[1792616820,"11"],[1792616850,"11"],[1792616880,"11"],[1792616910,"11"],[1792616940,"11"],[1792616970,"11"],[1792617000,"11"],[1792617030,"11"],[1792617060,"11"],[1792617090,"11"],[1792617120,"11"],[1792617150,"11"],[1792617180,"9"],[1792617210,"9"],[1792617240,"9"],[1792617270,"9"],[1792617300,"9"],[1792617330,"9"],[1792617360,"9"],[1792617390,"9"],[1792617420,"9"],[1792617450,"9"],[1792617480,"9"],[1792617510,"9"],[1792617540,"9"],[1792617570,"9"],[1792617600,"9"],[1792617630,"9"],[1792617660,"9"],[1792617690,"9"],[1792617720,"9"],[1792617750,"9"],[1792617780,"9"],[1792617810,"11"],[1792617840,"11"],[1792617870,"11"],[1792617900,"11"],[1792617930,"11"],[1792617960,"11"],[1792617990,"11"],[1792618020,"11"],[1792618050,"11"],[1792618080,"11"],[1792618110,"11"],[1792618140,"11"],[1792618170,"11"],[1792618200,"11"],[1792618230,"11"],[1792618260,"11"],[1792618290,"11"],[1792618320,"11"],[1792618350,"11"],[1792618380,"11"],[1792618410,"11"],[1792618440,"11"],[1792618470,"11"],[1792618500,"11"],[1792618530,"11"],[1792618560,"11"],[1792618590,"11"],[1792618620,"11"],[1792618650,"11"],[1792618680,"11"],[1792618710,"9"],[1792618740,"9"],[1792618770,"9"],[1792618800,"9"],[1792618830,"9"],[1792618860,"9"],[1792618890,"9"],[1792618920,"9"],[1792618950,"11"],[1792618980,"11"],[1792619010,"11"],[1792619040,"11"],[1792619070,"11"],[1792619100,"11"],[1792619130,"9"],[1792619160,"11"],[1792619190,"11"],[1792619220,"11"],[1792619250,"11"],[1792619280,"11"],[1792619310,"11"],[1792619340,"11"],[1792619370,"9"],[1792619400,"11"],[1792619430,"11"],[1792619460,"11"],[1792619490,"11"],[1792619520,"11"],[1792619550,"11"],[1792619580,"11"],[1792619610,"9"],[1792619640,"11"],[1792619670,"11"],[1792619700,"11"],[1792619730,"11"],[1792619760,"11"],[1792619790,"11"],[1792619820,"11"],[1792619850,"9"],[1792619880,"9"],[1792619910,"9"],[1792619940,"11"],[1792619970,"11"],[1792620000,"11"],[1792620030,"11"],[1792620060,"11"],[1792620090,"11"],[1792620120,"11"]]},{"metric":{"__name__":"xe_clients","bdf":"0000:7c:00.0","card":"card3","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"11"],[1792616730,"11"],[1792616760,"11"],[1792616790,"11"],[1792616820,"11"],[1792616850,"11"],[1792616880,"11"],[1792616910,"11"],[1792616940,"11"],[1792616970,"11"],[1792617000,"11"],[1792617030,"11"],[1792617060,"11"],[1792617090,"11"],[1792617120,"11"],[1792617150,"8"],[1792617180,"3"],[1792617210,"3"],[1792617240,"3"],[1792617270,"3"],[1792617300,"3"],[1792617330,"3"],[1792617360,"3"],[1792617390,"3"],[1792617420,"3"],[1792617450,"3"],[1792617480,"3"],[1792617510,"3"],[1792617540,"3"],[1792617570,"3"],[1792617600,"3"],[1792617630,"3"],[1792617660,"3"],[1792617690,"3"],[1792617720,"3"],[1792617750,"3"],[1792617780,"3"],[1792617810,"5"],[1792617840,"5"],[1792617870,"5"],[1792617900,"5"],[1792617930,"5"],[1792617960,"5"],[1792617990,"5"],[1792618020,"5"],[1792618050,"5"],[1792618080,"5"],[1792618110,"5"],[1792618140,"5"],[1792618170,"5"],[1792618200,"5"],[1792618230,"5"],[1792618260,"5"],[1792618290,"5"],[1792618320,"5"],[1792618350,"5"],[1792618380,"5"],[1792618410,"5"],[1792618440,"5"],[1792618470,"5"],[1792618500,"5"],[1792618530,"5"],[1792618560,"5"],[1792618590,"5"],[1792618620,"5"],[1792618650,"5"],[1792618680,"5"],[1792618710,"3"],[1792618740,"3"],[1792618770,"3"],[1792618800,"3"],[1792618830,"3"],[1792618860,"3"],[1792618890,"3"],[1792618920,"3"],[1792618950,"5"],[1792618980,"5"],[1792619010,"5"],[1792619040,"5"],[1792619070,"5"],[1792619100,"5"],[1792619130,"3"],[1792619160,"5"],[1792619190,"5"],[1792619220,"5"],[1792619250,"5"],[1792619280,"5"],[1792619310,"5"],[1792619340,"5"],[1792619370,"3"],[1792619400,"5"],[1792619430,"5"],[1792619460,"5"],[1792619490,"5"],[1792619520,"5"],[1792619550,"5"],[1792619580,"5"],[1792619610,"3"],[1792619640,"5"],[1792619670,"5"],[1792619700,"5"],[1792619730,"5"],[1792619760,"5"],[1792619790,"5"],[1792619820,"5"],[1792619850,"3"],[1792619880,"4"],[1792619910,"7"],[1792619940,"11"],[1792619970,"11"],[1792620000,"11"],[1792620030,"11"],[1792620060,"11"],[1792620090,"11"],[1792620120,"11"]]},{"metric":{"__name__":"xe_clients","bdf":"0000:96:00.0","card":"card4","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"11"],[1792616730,"11"],[1792616760,"11"],[1792616790,"11"],[1792616820,"11"],[1792616850,"11"],[1792616880,"11"],[1792616910,"11"],[1792616940,"11"],[1792616970,"11"],[1792617000,"11"],[1792617030,"11"],[1792617060,"11"],[1792617090,"11"],[1792617120,"11"],[1792617150,"8"],[1792617180,"3"],[1792617210,"3"],[1792617240,"3"],[1792617270,"3"],[1792617300,"3"],[1792617330,"3"],[1792617360,"3"],[1792617390,"3"],[1792617420,"3"],[1792617450,"3"],[1792617480,"3"],[1792617510,"3"],[1792617540,"3"],[1792617570,"3"],[1792617600,"3"],[1792617630,"3"],[1792617660,"3"],[1792617690,"3"],[1792617720,"3"],[1792617750,"3"],[1792617780,"3"],[1792617810,"5"],[1792617840,"5"],[1792617870,"5"],[1792617900,"5"],[1792617930,"5"],[1792617960,"5"],[1792617990,"5"],[1792618020,"5"],[1792618050,"5"],[1792618080,"5"],[1792618110,"5"],[1792618140,"5"],[1792618170,"5"],[1792618200,"5"],[1792618230,"5"],[1792618260,"5"],[1792618290,"5"],[1792618320,"5"],[1792618350,"5"],[1792618380,"5"],[1792618410,"5"],[1792618440,"5"],[1792618470,"5"],[1792618500,"5"],[1792618530,"5"],[1792618560,"5"],[1792618590,"5"],[1792618620,"5"],[1792618650,"5"],[1792618680,"5"],[1792618710,"3"],[1792618740,"3"],[1792618770,"3"],[1792618800,"3"],[1792618830,"3"],[1792618860,"3"],[1792618890,"3"],[1792618920,"3"],[1792618950,"5"],[1792618980,"5"],[1792619010,"5"],[1792619040,"5"],[1792619070,"5"],[1792619100,"5"],[1792619130,"3"],[1792619160,"5"],[1792619190,"5"],[1792619220,"5"],[1792619250,"5"],[1792619280,"5"],[1792619310,"5"],[1792619340,"5"],[1792619370,"3"],[1792619400,"5"],[1792619430,"5"],[1792619460,"5"],[1792619490,"5"],[1792619520,"5"],[1792619550,"5"],[1792619580,"5"],[1792619610,"3"],[1792619640,"5"],[1792619670,"5"],[1792619700,"5"],[1792619730,"5"],[1792619760,"5"],[1792619790,"5"],[1792619820,"5"],[1792619850,"3"],[1792619880,"4"],[1792619910,"7"],[1792619940,"11"],[1792619970,"11"],[1792620000,"11"],[1792620030,"11"],[1792620060,"11"],[1792620090,"11"],[1792620120,"11"]]}]}} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54c/hold1/xe_vram_used_bytes-2105-2202Z.json b/bench/h54gpu/results/2026-10-21/H54c/hold1/xe_vram_used_bytes-2105-2202Z.json new file mode 100644 index 00000000..a7ee5f2f --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/hold1/xe_vram_used_bytes-2105-2202Z.json @@ -0,0 +1 @@ +{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"__name__":"xe_vram_used_bytes","bdf":"0000:12:00.0","card":"card1","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"17269661696"],[1792616730,"17269661696"],[1792616760,"17269661696"],[1792616790,"17269661696"],[1792616820,"17269661696"],[1792616850,"17269661696"],[1792616880,"17269661696"],[1792616910,"17269661696"],[1792616940,"17269661696"],[1792616970,"17269661696"],[1792617000,"17269661696"],[1792617030,"17269661696"],[1792617060,"17269661696"],[1792617090,"17269661696"],[1792617120,"17269661696"],[1792617150,"17269661696"],[1792617180,"17269661696"],[1792617210,"17269661696"],[1792617240,"17269661696"],[1792617270,"17269661696"],[1792617300,"17269661696"],[1792617330,"17269661696"],[1792617360,"17269661696"],[1792617390,"17269661696"],[1792617420,"17269661696"],[1792617450,"17269661696"],[1792617480,"17269661696"],[1792617510,"17269661696"],[1792617540,"17269661696"],[1792617570,"17269661696"],[1792617600,"17269661696"],[1792617630,"17269661696"],[1792617660,"17269661696"],[1792617690,"17269661696"],[1792617720,"17269661696"],[1792617750,"17269661696"],[1792617780,"17269661696"],[1792617810,"20585590784"],[1792617840,"20710121472"],[1792617870,"20733796352"],[1792617900,"20772024320"],[1792617930,"20772024320"],[1792617960,"20772352000"],[1792617990,"20772352000"],[1792618020,"20772352000"],[1792618050,"20772352000"],[1792618080,"20776546304"],[1792618110,"20776546304"],[1792618140,"20776546304"],[1792618170,"20776546304"],[1792618200,"20776546304"],[1792618230,"20776546304"],[1792618260,"20776546304"],[1792618290,"20776546304"],[1792618320,"20776546304"],[1792618350,"20789129216"],[1792618380,"20789129216"],[1792618410,"20789129216"],[1792618440,"20789129216"],[1792618470,"20789129216"],[1792618500,"20789129216"],[1792618530,"20789129216"],[1792618560,"20789129216"],[1792618590,"20789129216"],[1792618620,"20789129216"],[1792618650,"20789129216"],[1792618680,"20789129216"],[1792618710,"17269661696"],[1792618740,"17269661696"],[1792618770,"17269661696"],[1792618800,"17269661696"],[1792618830,"17269661696"],[1792618860,"17269661696"],[1792618890,"17269661696"],[1792618920,"17269661696"],[1792618950,"17732677632"],[1792618980,"17732677632"],[1792619010,"17732677632"],[1792619040,"17790959616"],[1792619070,"17790959616"],[1792619100,"17790959616"],[1792619130,"17269661696"],[1792619160,"20610289664"],[1792619190,"20610289664"],[1792619220,"20633522176"],[1792619250,"20638687232"],[1792619280,"20638687232"],[1792619310,"20684959744"],[1792619340,"20685287424"],[1792619370,"17269661696"],[1792619400,"18167668736"],[1792619430,"18178379776"],[1792619460,"18190639104"],[1792619490,"18195808256"],[1792619520,"18195808256"],[1792619550,"18242961408"],[1792619580,"18242961408"],[1792619610,"17269661696"],[1792619640,"20609556480"],[1792619670,"20610277376"],[1792619700,"20633509888"],[1792619730,"20638674944"],[1792619760,"20638674944"],[1792619790,"20684951552"],[1792619820,"20685279232"],[1792619850,"17269661696"],[1792619880,"17269661696"],[1792619910,"17269661696"],[1792619940,"17269661696"],[1792619970,"17269661696"],[1792620000,"17269661696"],[1792620030,"17269661696"],[1792620060,"17269661696"],[1792620090,"17269661696"],[1792620120,"17269661696"]]},{"metric":{"__name__":"xe_vram_used_bytes","bdf":"0000:48:00.0","card":"card2","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"16512073728"],[1792616730,"16512073728"],[1792616760,"16512073728"],[1792616790,"16512073728"],[1792616820,"16512073728"],[1792616850,"16512073728"],[1792616880,"16512073728"],[1792616910,"16512073728"],[1792616940,"16512073728"],[1792616970,"16512073728"],[1792617000,"16512073728"],[1792617030,"16512073728"],[1792617060,"16512073728"],[1792617090,"16512073728"],[1792617120,"16512073728"],[1792617150,"16512073728"],[1792617180,"16512073728"],[1792617210,"16512073728"],[1792617240,"16512073728"],[1792617270,"16512073728"],[1792617300,"16512073728"],[1792617330,"16512073728"],[1792617360,"16512073728"],[1792617390,"16512073728"],[1792617420,"16512073728"],[1792617450,"16512073728"],[1792617480,"16512073728"],[1792617510,"16512073728"],[1792617540,"16512073728"],[1792617570,"16512073728"],[1792617600,"16512073728"],[1792617630,"16512073728"],[1792617660,"16512073728"],[1792617690,"16512073728"],[1792617720,"16512073728"],[1792617750,"16512073728"],[1792617780,"16512073728"],[1792617810,"19524349952"],[1792617840,"19524358144"],[1792617870,"19754008576"],[1792617900,"19971010560"],[1792617930,"19971010560"],[1792617960,"19971338240"],[1792617990,"19971338240"],[1792618020,"19971338240"],[1792618050,"19971338240"],[1792618080,"19975532544"],[1792618110,"19975532544"],[1792618140,"19975532544"],[1792618170,"19975532544"],[1792618200,"19975532544"],[1792618230,"19975532544"],[1792618260,"19975532544"],[1792618290,"19975532544"],[1792618320,"19975532544"],[1792618350,"19988115456"],[1792618380,"19988115456"],[1792618410,"19988115456"],[1792618440,"19988115456"],[1792618470,"19988115456"],[1792618500,"19988115456"],[1792618530,"19988115456"],[1792618560,"19988115456"],[1792618590,"19988115456"],[1792618620,"19988115456"],[1792618650,"19988115456"],[1792618680,"19988115456"],[1792618710,"16512073728"],[1792618740,"16512073728"],[1792618770,"16512073728"],[1792618800,"16512073728"],[1792618830,"16512073728"],[1792618860,"16512073728"],[1792618890,"16512073728"],[1792618920,"16512073728"],[1792618950,"16532942848"],[1792618980,"16532942848"],[1792619010,"16532942848"],[1792619040,"16532955136"],[1792619070,"16532955136"],[1792619100,"16532955136"],[1792619130,"16512073728"],[1792619160,"19086897152"],[1792619190,"19086897152"],[1792619220,"19086913536"],[1792619250,"19262255104"],[1792619280,"19262255104"],[1792619310,"19285458944"],[1792619340,"19285786624"],[1792619370,"16512073728"],[1792619400,"16945819648"],[1792619430,"16945819648"],[1792619460,"16945836032"],[1792619490,"17037422592"],[1792619520,"17037422592"],[1792619550,"17061355520"],[1792619580,"17061355520"],[1792619610,"16512073728"],[1792619640,"19086888960"],[1792619670,"19086888960"],[1792619700,"19086905344"],[1792619730,"19262251008"],[1792619760,"19262251008"],[1792619790,"19285458944"],[1792619820,"19285786624"],[1792619850,"16512073728"],[1792619880,"16512073728"],[1792619910,"16512073728"],[1792619940,"16512073728"],[1792619970,"16512073728"],[1792620000,"16512073728"],[1792620030,"16512073728"],[1792620060,"16512073728"],[1792620090,"16512073728"],[1792620120,"16512073728"]]},{"metric":{"__name__":"xe_vram_used_bytes","bdf":"0000:7c:00.0","card":"card3","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"17251655680"],[1792616730,"17251655680"],[1792616760,"17251655680"],[1792616790,"17251655680"],[1792616820,"17251655680"],[1792616850,"17251655680"],[1792616880,"17251655680"],[1792616910,"17251655680"],[1792616940,"17251655680"],[1792616970,"17251655680"],[1792617000,"17251655680"],[1792617030,"17251655680"],[1792617060,"17251655680"],[1792617090,"17251655680"],[1792617120,"17251655680"],[1792617150,"16680751104"],[1792617180,"0"],[1792617210,"0"],[1792617240,"0"],[1792617270,"0"],[1792617300,"0"],[1792617330,"0"],[1792617360,"0"],[1792617390,"0"],[1792617420,"0"],[1792617450,"0"],[1792617480,"0"],[1792617510,"0"],[1792617540,"0"],[1792617570,"0"],[1792617600,"0"],[1792617630,"0"],[1792617660,"0"],[1792617690,"0"],[1792617720,"0"],[1792617750,"0"],[1792617780,"0"],[1792617810,"5440393216"],[1792617840,"5440401408"],[1792617870,"5670379520"],[1792617900,"5887123456"],[1792617930,"5887123456"],[1792617960,"5887451136"],[1792617990,"5887451136"],[1792618020,"5887451136"],[1792618050,"5887451136"],[1792618080,"5891645440"],[1792618110,"5891645440"],[1792618140,"5891645440"],[1792618170,"5891645440"],[1792618200,"5891645440"],[1792618230,"5891645440"],[1792618260,"5891645440"],[1792618290,"5891645440"],[1792618320,"5891645440"],[1792618350,"5904228352"],[1792618380,"5904228352"],[1792618410,"5904228352"],[1792618440,"5904228352"],[1792618470,"5904228352"],[1792618500,"5904228352"],[1792618530,"5904228352"],[1792618560,"5904228352"],[1792618590,"5904228352"],[1792618620,"5904228352"],[1792618650,"5904228352"],[1792618680,"5904228352"],[1792618710,"0"],[1792618740,"0"],[1792618770,"0"],[1792618800,"0"],[1792618830,"0"],[1792618860,"0"],[1792618890,"0"],[1792618920,"0"],[1792618950,"20873216"],[1792618980,"20873216"],[1792619010,"20873216"],[1792619040,"20885504"],[1792619070,"20885504"],[1792619100,"20885504"],[1792619130,"0"],[1792619160,"5067681792"],[1792619190,"5067681792"],[1792619220,"5067698176"],[1792619250,"5281783808"],[1792619280,"5281783808"],[1792619310,"5328384000"],[1792619340,"5328384000"],[1792619370,"0"],[1792619400,"785534976"],[1792619430,"785534976"],[1792619460,"785551360"],[1792619490,"932663296"],[1792619520,"932663296"],[1792619550,"979668992"],[1792619580,"979668992"],[1792619610,"0"],[1792619640,"5067677696"],[1792619670,"5067677696"],[1792619700,"5067694080"],[1792619730,"5281783808"],[1792619760,"5281783808"],[1792619790,"5328388096"],[1792619820,"5328388096"],[1792619850,"0"],[1792619880,"181035008"],[1792619910,"10611109888"],[1792619940,"28712878080"],[1792619970,"28712878080"],[1792620000,"22919233536"],[1792620030,"17125982208"],[1792620060,"17125982208"],[1792620090,"17125982208"],[1792620120,"17125982208"]]},{"metric":{"__name__":"xe_vram_used_bytes","bdf":"0000:96:00.0","card":"card4","instance":"xe-exporter:9101","job":"xe-gpu"},"values":[[1792616700,"16494178304"],[1792616730,"16494178304"],[1792616760,"16494178304"],[1792616790,"16494178304"],[1792616820,"16494178304"],[1792616850,"16494178304"],[1792616880,"16494178304"],[1792616910,"16494178304"],[1792616940,"16494178304"],[1792616970,"16494178304"],[1792617000,"16494178304"],[1792617030,"16494178304"],[1792617060,"16494178304"],[1792617090,"16494178304"],[1792617120,"16494178304"],[1792617150,"191135744"],[1792617180,"0"],[1792617210,"0"],[1792617240,"0"],[1792617270,"0"],[1792617300,"0"],[1792617330,"0"],[1792617360,"0"],[1792617390,"0"],[1792617420,"0"],[1792617450,"0"],[1792617480,"0"],[1792617510,"0"],[1792617540,"0"],[1792617570,"0"],[1792617600,"0"],[1792617630,"0"],[1792617660,"0"],[1792617690,"0"],[1792617720,"0"],[1792617750,"0"],[1792617780,"0"],[1792617810,"5953003520"],[1792617840,"5953011712"],[1792617870,"6183124992"],[1792617900,"6399729664"],[1792617930,"6399729664"],[1792617960,"6400057344"],[1792617990,"6400057344"],[1792618020,"6400057344"],[1792618050,"6400057344"],[1792618080,"6404251648"],[1792618110,"6404251648"],[1792618140,"6404251648"],[1792618170,"6404251648"],[1792618200,"6404251648"],[1792618230,"6404251648"],[1792618260,"6404251648"],[1792618290,"6404251648"],[1792618320,"6404251648"],[1792618350,"6416834560"],[1792618380,"6416834560"],[1792618410,"6416834560"],[1792618440,"6416834560"],[1792618470,"6416834560"],[1792618500,"6416834560"],[1792618530,"6416834560"],[1792618560,"6416834560"],[1792618590,"6416834560"],[1792618620,"6416834560"],[1792618650,"6416834560"],[1792618680,"6416834560"],[1792618710,"0"],[1792618740,"0"],[1792618770,"0"],[1792618800,"0"],[1792618830,"0"],[1792618860,"0"],[1792618890,"0"],[1792618920,"0"],[1792618950,"20869120"],[1792618980,"20869120"],[1792619010,"20869120"],[1792619040,"20881408"],[1792619070,"20881408"],[1792619100,"20881408"],[1792619130,"0"],[1792619160,"5176270848"],[1792619190,"5176270848"],[1792619220,"5176291328"],[1792619250,"5390835712"],[1792619280,"5390835712"],[1792619310,"5437435904"],[1792619340,"5437435904"],[1792619370,"0"],[1792619400,"1322283008"],[1792619430,"1322283008"],[1792619460,"1322303488"],[1792619490,"1470332928"],[1792619520,"1470332928"],[1792619550,"1517334528"],[1792619580,"1517334528"],[1792619610,"0"],[1792619640,"5176258560"],[1792619670,"5176258560"],[1792619700,"5176279040"],[1792619730,"5390827520"],[1792619760,"5390827520"],[1792619790,"5437431808"],[1792619820,"5437431808"],[1792619850,"0"],[1792619880,"2105344"],[1792619910,"10253180928"],[1792619940,"16502857728"],[1792619970,"16502857728"],[1792620000,"16435617792"],[1792620030,"16368377856"],[1792620060,"16368377856"],[1792620090,"16368377856"],[1792620120,"16368377856"]]}]}} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/arms.log b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/arms.log new file mode 100644 index 00000000..b75f03ea --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/arms.log @@ -0,0 +1,6 @@ +== H54c hold 1 card 2 image ghcr.io/ggml-org/llama.cpp:server-b11749@sha256:9fbaa06d7f4449e2ae0d02b40e0431f7c212dcf231c9e3a7777a6afc2cc8f312 2026-10-21T00:06:58Z +== arm cg: -ngl 0 2026-10-21T00:07:05Z +Error from server (Forbidden): error when creating "/home/devcloud/k3dgpu-gemma/results/H54c/smoke-hold1/cg.yaml": pods "cg" is forbidden: error looking up service account default/default: serviceaccount "default" not found +== arm cg not deliverable 2026-10-21T00:07:07Z +Error from server (NotFound): pods "cg" not found +== verdict INCONCLUSIVE None 2026-10-21T00:07:27Z diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/bytes.json b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/bytes.json new file mode 100644 index 00000000..35a45a41 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/bytes.json @@ -0,0 +1,12 @@ +{ + "B_exp": 802898880.0, + "B_rest": 1577144440, + "B_tot": 2380043320.0, + "exps_all": 12846382080, + "output_tensor": "token_embd.weight", + "n_tensors": 658, + "arch": "gemma4", + "experts": 128, + "routed": 8, + "block_count": 30 +} diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cg.log b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cg.log new file mode 100644 index 00000000..7c6b1525 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cg.log @@ -0,0 +1 @@ +error: error from server (NotFound): pods "cg" not found in namespace "default" diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cg.yaml b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cg.yaml new file mode 100644 index 00000000..1d473347 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cg.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: {name: cg} +spec: + restartPolicy: Never + containers: + - name: server + image: ghcr.io/ggml-org/llama.cpp:server-b11749@sha256:9fbaa06d7f4449e2ae0d02b40e0431f7c212dcf231c9e3a7777a6afc2cc8f312 + args: ["-m","/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","-t","48","-Cr","0-47","--cpu-strict","1","--jinja","-c","8192","--host","0.0.0.0","--port","8080","-ngl","0"] + securityContext: {privileged: true} + volumeMounts: [{name: models, mountPath: /models, readOnly: true}] + volumes: + - {name: models, hostPath: {path: /models}} + - {name: dri, emptyDir: {medium: Memory}} + - {name: card, hostPath: {path: /dev/dri/renderD130, type: CharDevice}} diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cluster.log b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cluster.log new file mode 100644 index 00000000..26c8bc1e --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/cluster.log @@ -0,0 +1,18 @@ +INFO[0000] Prep: Network +INFO[0000] Created network 'k3d-k3dgpu-g-h54c-1' +INFO[0000] Created image volume k3d-k3dgpu-g-h54c-1-images +INFO[0000] Starting new tools node... +INFO[0000] Starting node 'k3d-k3dgpu-g-h54c-1-tools' +INFO[0001] Creating node 'k3d-k3dgpu-g-h54c-1-server-0' +INFO[0001] Using the k3d-tools node to gather environment information +INFO[0001] HostIP: using network gateway 172.19.0.1 address +INFO[0001] Starting cluster 'k3dgpu-g-h54c-1' +INFO[0001] Starting servers... +INFO[0001] Starting node 'k3d-k3dgpu-g-h54c-1-server-0' +INFO[0004] All agents already running. +INFO[0004] All helpers already running. +INFO[0004] Injecting records for hostAliases (incl. host.k3d.internal) and for 1 network members into CoreDNS configmap... +INFO[0006] Cluster 'k3dgpu-g-h54c-1' created successfully! +INFO[0006] You can now use it like this: +kubectl cluster-info +node/k3d-k3dgpu-g-h54c-1-server-0 condition met diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/verdict.json b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/verdict.json new file mode 100644 index 00000000..68774498 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1-failed-sa/verdict.json @@ -0,0 +1,13 @@ +{ + "B_exp": 802898880.0, + "B_rest": 1577144440, + "B_tot": 2380043320.0, + "median_tps": { + "Cg": null, + "Gg": null, + "Hg": null, + "Gg2": null + }, + "verdict": "INCONCLUSIVE", + "why": "an arm was not delivered" +} diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/arms.log b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/arms.log new file mode 100644 index 00000000..242b7cb0 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/arms.log @@ -0,0 +1,9 @@ +== H54c hold 1 card 2 image ghcr.io/ggml-org/llama.cpp:server-b11749@sha256:9fbaa06d7f4449e2ae0d02b40e0431f7c212dcf231c9e3a7777a6afc2cc8f312 2026-10-21T00:15:13Z +== arm cg: -ngl 0 2026-10-21T00:15:24Z +pod/cg created +energy: zone=intel-rapl:0 (package-0) joules=7912.973 seconds=60.018 avg_watts=131.844 command_seconds=60.002 samples=13 exit=0 +concurrency=1 ok=8/8 ttft_median=0.287s ttft_p90=0.294s latency_median=5.637s tok/s_median=45.4 aggregate_tok/s=45.3 +energy: zone=intel-rapl:0 (package-0) joules=16536.429 seconds=62.085 avg_watts=266.350 command_seconds=62.069 samples=14 exit=0 +== arm cg done: {'n': 8, 'median': 47.65790466879267, 'p90': 47.834098319272414, 'min': 46.814164925850164, 'max': 47.834098319272414} 2026-10-21T00:18:17Z +pod "cg" deleted from default namespace +== verdict INCONCLUSIVE None 2026-10-21T00:18:39Z diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/bytes.json b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/bytes.json new file mode 100644 index 00000000..35a45a41 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/bytes.json @@ -0,0 +1,12 @@ +{ + "B_exp": 802898880.0, + "B_rest": 1577144440, + "B_tot": 2380043320.0, + "exps_all": 12846382080, + "output_tensor": "token_embd.weight", + "n_tensors": 658, + "arch": "gemma4", + "experts": 128, + "routed": 8, + "block_count": 30 +} diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.boot_s b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.boot_s new file mode 100644 index 00000000..e373ee69 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.boot_s @@ -0,0 +1 @@ +50 diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.dri b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.dri new file mode 100644 index 00000000..4291ed10 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.dri @@ -0,0 +1,10 @@ +total 0 +crw-rw---- 1 root video 226, 0 Oct 21 00:15 card0 +crw-rw---- 1 root video 226, 1 Oct 21 00:15 card1 +crw-rw---- 1 root video 226, 2 Oct 21 00:15 card2 +crw-rw---- 1 root video 226, 3 Oct 21 00:15 card3 +crw-rw---- 1 root video 226, 4 Oct 21 00:15 card4 +crw-rw---- 1 root 990 226, 128 Oct 21 00:15 renderD128 +crw-rw---- 1 root 990 226, 129 Oct 21 00:15 renderD129 +crw-rw---- 1 root 990 226, 130 Oct 21 00:15 renderD130 +crw-rw---- 1 root 990 226, 131 Oct 21 00:15 renderD131 diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.fuser b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.fuser new file mode 100644 index 00000000..ce968b8f --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.fuser @@ -0,0 +1,33 @@ + USER PID ACCESS COMMAND +/dev/dri/renderD128: root 3898329 F...m python + root 3899938 F.... sglang::schedul + root 3900003 F...m sglang::schedul + root 3900351 F.... sglang::schedul + root 3900352 F...m sglang::schedul + root 3900921 F...m sglang::detoken + root 3901745 F...m python + root 3901746 F...m python +/dev/dri/renderD129: root 3898329 F...m python + root 3899938 F.... sglang::schedul + root 3900003 F...m sglang::schedul + root 3900351 F.... sglang::schedul + root 3900352 F...m sglang::schedul + root 3900921 F...m sglang::detoken + root 3901745 F...m python + root 3901746 F...m python +/dev/dri/renderD130: root 3898661 F...m python + root 3899938 F...m sglang::schedul + root 3900003 F.... sglang::schedul + root 3900351 F...m sglang::schedul + root 3900352 F.... sglang::schedul + root 3900920 F...m sglang::detoken + root 3901598 F...m python + root 3901599 F...m python +/dev/dri/renderD131: root 3898661 F...m python + root 3899938 F...m sglang::schedul + root 3900003 F.... sglang::schedul + root 3900351 F...m sglang::schedul + root 3900352 F.... sglang::schedul + root 3900920 F...m sglang::detoken + root 3901598 F...m python + root 3901599 F...m python diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.gpu-energy b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.gpu-energy new file mode 100644 index 00000000..3fc5b043 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.gpu-energy @@ -0,0 +1,2 @@ +before 2026-10-21T00:17:15Z card=304347294461425 pkg=213224583079711 +after 2026-10-21T00:18:17Z card=304353107182312 pkg=213228690434204 diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.idle-energy.json b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.idle-energy.json new file mode 100644 index 00000000..3c2808fc --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.idle-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":7912.973,"seconds":60.018,"avg_watts":131.844,"command_seconds":60.002,"energy_uj":7912973212,"max_energy_range_uj":262143328850,"samples":13,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.log b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.log new file mode 100644 index 00000000..cad6421e --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.log @@ -0,0 +1,123 @@ +warn: LLAMA_ARG_HOST environment variable is set, but will be overwritten by command line argument --host +warn: LLAMA_ARG_PORT environment variable is set, but will be overwritten by command line argument --port +warning: no usable GPU found, --gpu-layers option will be ignored +warning: one possible reason is that llama.cpp was compiled without GPU support +warning: consult docs/build.md for compilation instructions +0.00.009.019 I srv llama_server: initializing ... +0.00.009.034 I cmn common_param: common_params_print_info: verbosity = 3 (adjust with the `-lv N` CLI arg) +0.00.009.351 W srv llama_server: security: no API key is set and CORS allows all origins (see https://github.com/ggml-org/llama.cpp/pull/25655) +0.00.013.479 I srv load_model: loading model '/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf' +0.01.040.325 W load: control-looking token: 212 '' was not control-type; this is probably a bug in the model. its type will be overridden +0.01.040.744 W load: control-looking token: 50 '<|tool_response>' was not control-type; this is probably a bug in the model. its type will be overridden +0.01.064.561 W load: '' is a normal token here, removing it from EOG list +0.13.064.915 I cmn init: llama threadpool init, n_threads = 48 +0.13.415.234 I srv load_model: initializing, n_slots = 4, n_ctx_slot = 8192, kv_unified = 'true' +0.13.421.485 I srv llama_server: model loaded +0.13.421.498 I srv llama_server: listening on http://0.0.0.0:8080 +0.22.346.864 I slot get_availabl: id 0 | task -1 | selected slot by LRU, n_tokens = 0, t_last = -1 +0.22.346.935 I slot launch_slot_: id 0 | task 0 | processing task, is_child = 0 +0.22.801.136 I slot print_timing: id 0 | task 0 | prompt eval time = 145.83 ms / 19 tokens ( 7.68 ms per token, 130.29 tokens per second) +0.22.801.140 I slot print_timing: id 0 | task 0 | eval time = 308.31 ms / 16 tokens ( 20.55 ms per token, 48.65 tokens per second) +0.22.801.141 I slot print_timing: id 0 | task 0 | total time = 454.14 ms / 35 tokens +0.22.801.145 I slot print_timing: id 0 | task 0 | graphs reused = 15 +0.22.801.146 I slot print_timing: id 0 | task 0 | graph reallocs = 0 / 0 (same size) / (changed size) +0.22.801.179 I slot release: id 0 | task 0 | stop processing: n_tokens = 34, truncated = 0 +1.23.112.502 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.216 (> 0.100 thold), f_keep = 0.324 +1.23.117.936 I slot launch_slot_: id 0 | task 19 | processing task, is_child = 0 +1.26.314.629 I slot print_timing: id 0 | task 19 | n_gen = 144, tg = 47.65 t/s, tg_3s = 47.98 t/s +1.28.737.182 I slot print_timing: id 0 | task 19 | prompt eval time = 195.41 ms / 44 tokens ( 4.44 ms per token, 225.17 tokens per second) +1.28.737.184 I slot print_timing: id 0 | task 19 | eval time = 5423.78 ms / 256 tokens ( 21.27 ms per token, 47.02 tokens per second) +1.28.737.185 I slot print_timing: id 0 | task 19 | total time = 5619.19 ms / 300 tokens +1.28.737.186 I slot print_timing: id 0 | task 19 | graphs reused = 268 +1.28.737.186 I slot print_timing: id 0 | task 19 | graph reallocs = 0 / 0 (same size) / (changed size) +1.28.737.205 I slot release: id 0 | task 19 | stop processing: n_tokens = 306, truncated = 0 +1.28.740.616 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +1.28.775.643 I slot launch_slot_: id 0 | task 278 | processing task, is_child = 0 +1.31.976.813 I slot print_timing: id 0 | task 278 | n_gen = 146, tg = 48.08 t/s, tg_3s = 48.41 t/s +1.34.316.475 I slot print_timing: id 0 | task 278 | prompt eval time = 185.46 ms / 44 tokens ( 4.21 ms per token, 237.25 tokens per second) +1.34.316.478 I slot print_timing: id 0 | task 278 | eval time = 5355.32 ms / 256 tokens ( 21.00 ms per token, 47.62 tokens per second) +1.34.316.479 I slot print_timing: id 0 | task 278 | total time = 5540.78 ms / 300 tokens +1.34.316.480 I slot print_timing: id 0 | task 278 | graphs reused = 521 +1.34.316.481 I slot print_timing: id 0 | task 278 | graph reallocs = 0 / 0 (same size) / (changed size) +1.34.316.498 I slot release: id 0 | task 278 | stop processing: n_tokens = 306, truncated = 0 +1.34.320.030 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +1.34.356.123 I slot launch_slot_: id 0 | task 537 | processing task, is_child = 0 +1.37.541.961 I slot print_timing: id 0 | task 537 | n_gen = 144, tg = 47.62 t/s, tg_3s = 47.96 t/s +1.39.937.730 I slot print_timing: id 0 | task 537 | prompt eval time = 183.00 ms / 44 tokens ( 4.16 ms per token, 240.44 tokens per second) +1.39.937.734 I slot print_timing: id 0 | task 537 | eval time = 5398.55 ms / 256 tokens ( 21.17 ms per token, 47.23 tokens per second) +1.39.937.735 I slot print_timing: id 0 | task 537 | total time = 5581.55 ms / 300 tokens +1.39.937.737 I slot print_timing: id 0 | task 537 | graphs reused = 774 +1.39.937.737 I slot print_timing: id 0 | task 537 | graph reallocs = 0 / 0 (same size) / (changed size) +1.39.937.758 I slot release: id 0 | task 537 | stop processing: n_tokens = 306, truncated = 0 +1.39.943.546 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +1.39.978.556 I slot launch_slot_: id 0 | task 796 | processing task, is_child = 0 +1.43.168.450 I slot print_timing: id 0 | task 796 | n_gen = 145, tg = 47.93 t/s, tg_3s = 48.26 t/s +1.45.584.933 I slot print_timing: id 0 | task 796 | prompt eval time = 185.39 ms / 44 tokens ( 4.21 ms per token, 237.34 tokens per second) +1.45.584.936 I slot print_timing: id 0 | task 796 | eval time = 5420.93 ms / 256 tokens ( 21.26 ms per token, 47.04 tokens per second) +1.45.584.937 I slot print_timing: id 0 | task 796 | total time = 5606.32 ms / 300 tokens +1.45.584.938 I slot print_timing: id 0 | task 796 | graphs reused = 1027 +1.45.584.938 I slot print_timing: id 0 | task 796 | graph reallocs = 0 / 0 (same size) / (changed size) +1.45.584.954 I slot release: id 0 | task 796 | stop processing: n_tokens = 306, truncated = 0 +1.45.588.525 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +1.45.623.815 I slot launch_slot_: id 0 | task 1055 | processing task, is_child = 0 +1.48.830.809 I slot print_timing: id 0 | task 1055 | n_gen = 146, tg = 48.03 t/s, tg_3s = 48.36 t/s +1.51.233.836 I slot print_timing: id 0 | task 1055 | prompt eval time = 187.80 ms / 44 tokens ( 4.27 ms per token, 234.29 tokens per second) +1.51.233.842 I slot print_timing: id 0 | task 1055 | eval time = 5422.16 ms / 256 tokens ( 21.26 ms per token, 47.03 tokens per second) +1.51.233.843 I slot print_timing: id 0 | task 1055 | total time = 5609.96 ms / 300 tokens +1.51.233.844 I slot print_timing: id 0 | task 1055 | graphs reused = 1280 +1.51.233.845 I slot print_timing: id 0 | task 1055 | graph reallocs = 0 / 0 (same size) / (changed size) +1.51.233.865 I slot release: id 0 | task 1055 | stop processing: n_tokens = 306, truncated = 0 +1.51.237.418 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +1.51.272.717 I slot launch_slot_: id 0 | task 1314 | processing task, is_child = 0 +1.54.466.226 I slot print_timing: id 0 | task 1314 | n_gen = 145, tg = 47.90 t/s, tg_3s = 48.24 t/s +1.56.852.776 I slot print_timing: id 0 | task 1314 | prompt eval time = 187.44 ms / 44 tokens ( 4.26 ms per token, 234.75 tokens per second) +1.56.852.779 I slot print_timing: id 0 | task 1314 | eval time = 5392.55 ms / 256 tokens ( 21.15 ms per token, 47.29 tokens per second) +1.56.852.780 I slot print_timing: id 0 | task 1314 | total time = 5579.99 ms / 300 tokens +1.56.852.782 I slot print_timing: id 0 | task 1314 | graphs reused = 1533 +1.56.852.782 I slot print_timing: id 0 | task 1314 | graph reallocs = 0 / 0 (same size) / (changed size) +1.56.852.803 I slot release: id 0 | task 1314 | stop processing: n_tokens = 306, truncated = 0 +1.56.856.588 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +1.56.898.014 I slot launch_slot_: id 0 | task 1573 | processing task, is_child = 0 +2.00.106.078 I slot print_timing: id 0 | task 1573 | n_gen = 140, tg = 46.02 t/s, tg_3s = 46.35 t/s +2.02.593.850 I slot print_timing: id 0 | task 1573 | prompt eval time = 187.69 ms / 44 tokens ( 4.27 ms per token, 234.42 tokens per second) +2.02.593.853 I slot print_timing: id 0 | task 1573 | eval time = 5508.06 ms / 256 tokens ( 21.60 ms per token, 46.30 tokens per second) +2.02.593.853 I slot print_timing: id 0 | task 1573 | total time = 5695.76 ms / 300 tokens +2.02.593.854 I slot print_timing: id 0 | task 1573 | graphs reused = 1786 +2.02.593.855 I slot print_timing: id 0 | task 1573 | graph reallocs = 0 / 0 (same size) / (changed size) +2.02.593.873 I slot release: id 0 | task 1573 | stop processing: n_tokens = 306, truncated = 0 +2.02.597.584 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.02.632.489 I slot launch_slot_: id 0 | task 1832 | processing task, is_child = 0 +2.05.833.931 I slot print_timing: id 0 | task 1832 | n_gen = 145, tg = 47.75 t/s, tg_3s = 48.08 t/s +2.08.213.397 I slot print_timing: id 0 | task 1832 | prompt eval time = 185.85 ms / 44 tokens ( 4.22 ms per token, 236.75 tokens per second) +2.08.213.400 I slot print_timing: id 0 | task 1832 | eval time = 5395.00 ms / 256 tokens ( 21.16 ms per token, 47.27 tokens per second) +2.08.213.401 I slot print_timing: id 0 | task 1832 | total time = 5580.85 ms / 300 tokens +2.08.213.402 I slot print_timing: id 0 | task 1832 | graphs reused = 2039 +2.08.213.403 I slot print_timing: id 0 | task 1832 | graph reallocs = 0 / 0 (same size) / (changed size) +2.08.213.420 I slot release: id 0 | task 1832 | stop processing: n_tokens = 306, truncated = 0 +2.08.217.041 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.08.252.471 I slot launch_slot_: id 0 | task 2091 | processing task, is_child = 0 +2.11.451.235 I slot print_timing: id 0 | task 2091 | n_gen = 146, tg = 48.13 t/s, tg_3s = 48.46 t/s +2.13.831.892 I slot print_timing: id 0 | task 2091 | prompt eval time = 185.79 ms / 44 tokens ( 4.22 ms per token, 236.82 tokens per second) +2.13.831.896 I slot print_timing: id 0 | task 2091 | eval time = 5393.57 ms / 256 tokens ( 21.15 ms per token, 47.28 tokens per second) +2.13.831.896 I slot print_timing: id 0 | task 2091 | total time = 5579.36 ms / 300 tokens +2.13.831.897 I slot print_timing: id 0 | task 2091 | graphs reused = 2292 +2.13.831.898 I slot print_timing: id 0 | task 2091 | graph reallocs = 0 / 0 (same size) / (changed size) +2.13.831.915 I slot release: id 0 | task 2091 | stop processing: n_tokens = 306, truncated = 0 +2.13.835.528 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.451 (> 0.100 thold), f_keep = 0.075 +2.13.870.824 I slot launch_slot_: id 0 | task 2350 | processing task, is_child = 0 +2.17.065.652 I slot print_timing: id 0 | task 2350 | n_gen = 144, tg = 47.44 t/s, tg_3s = 47.77 t/s +2.19.485.433 I slot print_timing: id 0 | task 2350 | prompt eval time = 180.29 ms / 44 tokens ( 4.10 ms per token, 244.05 tokens per second) +2.19.485.437 I slot print_timing: id 0 | task 2350 | eval time = 5434.26 ms / 256 tokens ( 21.31 ms per token, 46.92 tokens per second) +2.19.485.437 I slot print_timing: id 0 | task 2350 | total time = 5614.55 ms / 300 tokens +2.19.485.438 I slot print_timing: id 0 | task 2350 | graphs reused = 2545 +2.19.485.439 I slot print_timing: id 0 | task 2350 | graph reallocs = 0 / 0 (same size) / (changed size) +2.19.485.456 I slot release: id 0 | task 2350 | stop processing: n_tokens = 306, truncated = 0 +2.19.489.054 I slot get_availabl: id 0 | task -1 | selected slot by LCP similarity, f_sim_best = 0.442 (> 0.100 thold), f_keep = 0.075 +2.19.524.558 I slot launch_slot_: id 0 | task 2609 | processing task, is_child = 0 +2.22.713.646 I slot print_timing: id 0 | task 2609 | n_gen = 145, tg = 47.95 t/s, tg_3s = 48.29 t/s +2.25.113.740 I slot print_timing: id 0 | task 2609 | prompt eval time = 186.12 ms / 45 tokens ( 4.14 ms per token, 241.77 tokens per second) +2.25.113.744 I slot print_timing: id 0 | task 2609 | eval time = 5402.99 ms / 256 tokens ( 21.19 ms per token, 47.20 tokens per second) +2.25.113.744 I slot print_timing: id 0 | task 2609 | total time = 5589.12 ms / 301 tokens +2.25.113.745 I slot print_timing: id 0 | task 2609 | graphs reused = 2798 +2.25.113.745 I slot print_timing: id 0 | task 2609 | graph reallocs = 0 / 0 (same size) / (changed size) +2.25.113.762 I slot release: id 0 | task 2609 | stop processing: n_tokens = 307, truncated = 0 diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.n1-energy.json b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.n1-energy.json new file mode 100644 index 00000000..cb9d03a6 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.n1-energy.json @@ -0,0 +1 @@ +{"zone":"intel-rapl:0","name":"package-0","joules":16536.429,"seconds":62.085,"avg_watts":266.350,"command_seconds":62.069,"energy_uj":16536428797,"max_energy_range_uj":262143328850,"samples":14,"exit_code":0} diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.n1.json b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.n1.json new file mode 100644 index 00000000..419bd4fe --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.n1.json @@ -0,0 +1,208 @@ +{ + "tool": "k3d-gpu/bench/llm_load.py", + "schema": 1, + "started_at": "2026-10-21T00:17:15Z", + "config": { + "base_url": "http://127.0.0.1:18080/v1", + "model": "m", + "prompt": "Explain in three short paragraphs how a CPU cache hierarchy reduces memory latency, and what a cache miss costs.", + "max_tokens": 256, + "temperature": 0.0, + "ignore_eos": true, + "extra_body": null, + "unique_prompts": true, + "requests": 8, + "concurrency": "1", + "warmup": 3, + "timeout": 600.0, + "label": "cg", + "out": "/home/devcloud/k3dgpu-gemma/results/H54c/smoke-hold1/cg.n1.json", + "run_id": "296c2f8c" + }, + "phases": [ + { + "concurrency": 1, + "requests": 8, + "ok": 8, + "errors": 0, + "wall_s": 45.176201136782765, + "output_tokens_total": 2048, + "aggregate_tokens_per_s": 45.333603721993896, + "requests_per_s": 0.17708438953903866, + "stats": { + "first_chunk_s": { + "n": 8, + "median": 0.22510644141584635, + "p90": 0.2328858827240765, + "min": 0.21924399677664042, + "max": 0.2328858827240765 + }, + "ttft_s": { + "n": 8, + "median": 0.2868744891602546, + "p90": 0.2937367260456085, + "min": 0.2809989149682224, + "max": 0.2937367260456085 + }, + "latency_s": { + "n": 8, + "median": 5.636722489492968, + "p90": 5.74080601381138, + "min": 5.618393557611853, + "max": 5.74080601381138 + }, + "output_tokens": { + "n": 8, + "median": 256.0, + "p90": 256, + "min": 256, + "max": 256 + }, + "tokens_per_s": { + "n": 8, + "median": 45.4165681971875, + "p90": 45.564625791151414, + "min": 44.59304135762619, + "max": 45.564625791151414 + }, + "decode_tokens_per_s": { + "n": 8, + "median": 47.65790466879267, + "p90": 47.834098319272414, + "min": 46.814164925850164, + "max": 47.834098319272414 + } + }, + "samples": [ + { + "index": 0, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 919, + "first_chunk_s": 0.2245170739479363, + "ttft_s": 0.2856134222820401, + "latency_s": 5.6452895030379295, + "output_tokens": 256, + "tokens_per_s": 45.34754149671817, + "decode_tokens_per_s": 47.57750210233539, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 1, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 940, + "first_chunk_s": 0.22671240381896496, + "ttft_s": 0.2889821487478912, + "latency_s": 5.648781540803611, + "output_tokens": 256, + "tokens_per_s": 45.31950795951311, + "decode_tokens_per_s": 47.57640750098974, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 2, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 978, + "first_chunk_s": 0.22644060803577304, + "ttft_s": 0.2880739253014326, + "latency_s": 5.618999122176319, + "output_tokens": 256, + "tokens_per_s": 45.559715250649035, + "decode_tokens_per_s": 47.834098319272414, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 3, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 948, + "first_chunk_s": 0.2328858827240765, + "ttft_s": 0.2937367260456085, + "latency_s": 5.74080601381138, + "output_tokens": 256, + "tokens_per_s": 44.59304135762619, + "decode_tokens_per_s": 46.814164925850164, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 4, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 994, + "first_chunk_s": 0.22449582209810615, + "ttft_s": 0.2872156663797796, + "latency_s": 5.619362295139581, + "output_tokens": 256, + "tokens_per_s": 45.556770778318565, + "decode_tokens_per_s": 47.82314098877476, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 5, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 978, + "first_chunk_s": 0.22498310590162873, + "ttft_s": 0.2860189420171082, + "latency_s": 5.618393557611853, + "output_tokens": 256, + "tokens_per_s": 45.564625791151414, + "decode_tokens_per_s": 47.82109629999404, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 6, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 978, + "first_chunk_s": 0.21924399677664042, + "ttft_s": 0.2809989149682224, + "latency_s": 5.65347399469465, + "output_tokens": 256, + "tokens_per_s": 45.28189220295986, + "decode_tokens_per_s": 47.46415687664481, + "prompt_tokens": 51, + "finished": true + }, + { + "index": 7, + "ok": true, + "error": null, + "chunks": 256, + "content_chunks": 253, + "text_chars": 996, + "first_chunk_s": 0.22522977693006396, + "ttft_s": 0.2865333119407296, + "latency_s": 5.628155475948006, + "output_tokens": 256, + "tokens_per_s": 45.48559489765684, + "decode_tokens_per_s": 47.73830723524994, + "prompt_tokens": 52, + "finished": true + } + ] + } + ] +} diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.pf.log b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.pf.log new file mode 100644 index 00000000..7e7cfe81 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.pf.log @@ -0,0 +1,19 @@ +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +error: unable to forward port because pod is not running. Current status=Pending +Forwarding from 127.0.0.1:18080 -> 8080 +Forwarding from [::1]:18080 -> 8080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 +Handling connection for 18080 diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.smoke.json b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.smoke.json new file mode 100644 index 00000000..e7221ef7 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.smoke.json @@ -0,0 +1 @@ +{"choices":[{"finish_reason":"length","index":0,"message":{"role":"assistant","content":"","reasoning_content":"The user said \"Say hi.\"\nThe user wants a simple"}}],"created":1792541774,"model":"/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","system_fingerprint":"b11749-1d88cb05f","object":"chat.completion","usage":{"completion_tokens":16,"prompt_tokens":19,"total_tokens":35,"prompt_tokens_details":{"cached_tokens":0}},"id":"chatcmpl-BsKoWCG9Q4Sr4FRFOJYVo0E5PMAveKns","timings":{"cache_n":0,"prompt_n":19,"prompt_ms":145.828,"prompt_per_token_ms":7.675157894736842,"prompt_per_second":130.29047919466768,"predicted_n":16,"predicted_ms":308.315,"predicted_per_token_ms":20.554333333333332,"predicted_per_second":48.651541443004724}} \ No newline at end of file diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.yaml b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.yaml new file mode 100644 index 00000000..1d473347 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cg.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: {name: cg} +spec: + restartPolicy: Never + containers: + - name: server + image: ghcr.io/ggml-org/llama.cpp:server-b11749@sha256:9fbaa06d7f4449e2ae0d02b40e0431f7c212dcf231c9e3a7777a6afc2cc8f312 + args: ["-m","/models/google_gemma-4-26B-A4B-it-qat-q4_0-gguf/gemma-4-26B_q4_0-it.gguf","-t","48","-Cr","0-47","--cpu-strict","1","--jinja","-c","8192","--host","0.0.0.0","--port","8080","-ngl","0"] + securityContext: {privileged: true} + volumeMounts: [{name: models, mountPath: /models, readOnly: true}] + volumes: + - {name: models, hostPath: {path: /models}} + - {name: dri, emptyDir: {medium: Memory}} + - {name: card, hostPath: {path: /dev/dri/renderD130, type: CharDevice}} diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cluster.log b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cluster.log new file mode 100644 index 00000000..26c8bc1e --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/cluster.log @@ -0,0 +1,18 @@ +INFO[0000] Prep: Network +INFO[0000] Created network 'k3d-k3dgpu-g-h54c-1' +INFO[0000] Created image volume k3d-k3dgpu-g-h54c-1-images +INFO[0000] Starting new tools node... +INFO[0000] Starting node 'k3d-k3dgpu-g-h54c-1-tools' +INFO[0001] Creating node 'k3d-k3dgpu-g-h54c-1-server-0' +INFO[0001] Using the k3d-tools node to gather environment information +INFO[0001] HostIP: using network gateway 172.19.0.1 address +INFO[0001] Starting cluster 'k3dgpu-g-h54c-1' +INFO[0001] Starting servers... +INFO[0001] Starting node 'k3d-k3dgpu-g-h54c-1-server-0' +INFO[0004] All agents already running. +INFO[0004] All helpers already running. +INFO[0004] Injecting records for hostAliases (incl. host.k3d.internal) and for 1 network members into CoreDNS configmap... +INFO[0006] Cluster 'k3dgpu-g-h54c-1' created successfully! +INFO[0006] You can now use it like this: +kubectl cluster-info +node/k3d-k3dgpu-g-h54c-1-server-0 condition met diff --git a/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/verdict.json b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/verdict.json new file mode 100644 index 00000000..264ad323 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/H54c/smoke-hold1/verdict.json @@ -0,0 +1,13 @@ +{ + "B_exp": 802898880.0, + "B_rest": 1577144440, + "B_tot": 2380043320.0, + "median_tps": { + "Cg": 47.65790466879267, + "Gg": null, + "Hg": null, + "Gg2": null + }, + "verdict": "INCONCLUSIVE", + "why": "an arm was not delivered" +} diff --git a/bench/h54gpu/results/2026-10-21/REPRODUCE-supplement.txt b/bench/h54gpu/results/2026-10-21/REPRODUCE-supplement.txt new file mode 100644 index 00000000..b1de3a56 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/REPRODUCE-supplement.txt @@ -0,0 +1,25 @@ +# Supplement to the per-hold REPRODUCE headers (H54b hold1, hold2; H54c hold1) +# Read on crescent 2026-10-21T22:10Z, about 12 min after the last hold. Nothing on the host +# changed in between (no reboot, no driver or firmware change); kernel, microcode, Docker and +# tool versions match the H54a header of the same day. +cpu: Intel(R) Xeon(R) 6741P, 96 CPUs, 1 socket, 1 NUMA node, microcode 0xa000133 +kernel: 7.0.0-31-generic, in-tree xe (xe.ko.zst); Docker 29.8.0 +cards: 4x Arc Pro B70 (8086:e223), bdf 0000:12:00.0, 0000:48:00.0, 0000:7c:00.0, 0000:96:00.0; + GuC found 70.58.0 (wanted 70.54.0), compatibility 1.30.1, all four (debugfs guc_info) +cards used: the runner assigned card 2 = renderD130 (CARDS=2,3; qwen38-b-hr stopped). The pinned + pods nonetheless listed card0-4 and renderD128-131 (lsq.dri, cg/gg/hg/gg2.dri), and + llama.cpp's -ngl 99 used all four cards (xe_vram_used_bytes-2105-2202Z.json). +tools: k3d v5.9.0, kubectl v1.35.2, helm v4.1.1+g5caf004 (~/k3dgpu-gemma/bin) +models: Intel/Qwen3.8-27B-q4km-AutoRound 4b30b30e0ac2cc54a2f50738cfccd6c608f94ad4, + Qwen3.8-27B-Q4_K_M.gguf sha256 766892f84f85c3d1b90704424f90a33344983fa2959860496940bbd41041aad9 + (16810714432 B; the HF LFS etag, checked by huggingface_hub on download) + google/gemma-4-26B-A4B-it-qat-q4_0-gguf d1c082be9cf3c8a514acf63b8761f4b41935842e, + gemma-4-26B_q4_0-it.gguf sha256 3eca3b8f... (as the H54a header) + The bare "model: edff6272..." line in each REPRODUCE is + Intel/gemma-4-26B-A4B-it-int4-AutoRound @ edff6272 (no H54b or H54c arm loads it). + The other Gemma lines are listed because the models directory holds them; only the + Q4_0 GGUF is loaded by H54c, only the q4km GGUF by H54b (Lsq). +smokes: H54c smoke-hold1-failed-sa (00:06:58Z, the pod's service account did not exist yet) + and smoke-hold1 (00:15:13Z, Cg alone in the CPU image server-b11749@sha256:9fbaa06d..., + no card mounted, 47.66 tok/s); H54b smoke-hold1 (03:46:41Z, manifest render only). + Wiring smokes under the lock, discarded, not holds. diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/hold.log b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/hold.log new file mode 100644 index 00000000..5f109b6b --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/hold.log @@ -0,0 +1,4 @@ +== H54b hold 1 cards 2,3 arms X1q 2026-10-21T21:12:54Z +== device-plugin arms: allowed (gpu-hold-0: renderD128 gpu-hold-1: renderD129 gpu-hold-2: renderD130 gpu-hold-3: renderD131) 2026-10-21T21:14:41Z +== arm X1q 2026-10-21T21:14:41Z +== arm X1q not deliverable 2026-10-21T21:14:42Z diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/post.txt b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/post.txt new file mode 100644 index 00000000..90d5795d --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/post.txt @@ -0,0 +1,16 @@ +2026-10-21T21:15:08Z + 21:15:08 up 35 days, 22:29, 11 users, load average: 1.85, 8.84, 7.12 +%CPU PID USER COMMAND +46.3 3900003 root sglang::schedul +44.2 3900352 root sglang::schedul +24.6 3898329 root python +15.5 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd + 0.9 3892 10001 loki + 0.6 3941 472 grafana + 0.6 3936 nobody prometheus +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3417622356 219464008 94% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr tempo xe-exporter xpumd diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/pre.txt b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/pre.txt new file mode 100644 index 00000000..e5b426f8 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/pre.txt @@ -0,0 +1,16 @@ +2026-10-21T21:12:53Z + 21:12:53 up 35 days, 22:27, 11 users, load average: 8.50, 13.30, 8.08 +%CPU PID USER COMMAND +46.3 3900003 root sglang::schedul +44.2 3900352 root sglang::schedul +24.6 3898329 root python +15.5 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd + 0.9 3892 10001 loki + 0.6 3941 472 grafana + 0.6 3936 nobody prometheus +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3417616952 219469412 94% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr tempo xe-exporter xpumd diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/rc b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/rc new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/rc @@ -0,0 +1 @@ +0 diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/serving.jsonl b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/serving.jsonl new file mode 100644 index 00000000..0ddb3ea5 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/serving.jsonl @@ -0,0 +1,14 @@ +{"ts": 1792617183.351, "seconds": 10.0, "load1": 7.35, "cpu": {"qwen38-a-hr": 1.171, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.108, "aiperf010": 0.0, "xe-exporter": 0.057, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.025, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.002}, "serving_cpu": 1.403, "aiperf_procs": 0} +{"ts": 1792617193.382, "seconds": 10.031, "load1": 6.45, "cpu": {"qwen38-a-hr": 1.223, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.106, "aiperf010": 0.0, "xe-exporter": 0.012, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.027, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 1.41, "aiperf_procs": 0} +{"ts": 1792617203.414, "seconds": 10.032, "load1": 5.76, "cpu": {"qwen38-a-hr": 1.185, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.107, "aiperf010": 0.0, "xe-exporter": 0.012, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.025, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 1.37, "aiperf_procs": 0} +{"ts": 1792617213.445, "seconds": 10.031, "load1": 5.04, "cpu": {"qwen38-a-hr": 1.19, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.107, "aiperf010": 0.0, "xe-exporter": 0.013, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.026, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.002}, "serving_cpu": 1.375, "aiperf_procs": 0} +{"ts": 1792617223.475, "seconds": 10.03, "load1": 4.26, "cpu": {"qwen38-a-hr": 1.205, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.103, "aiperf010": 0.0, "xe-exporter": 0.014, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.017, "node-exporter": 0.028, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 1.404, "aiperf_procs": 0} +{"ts": 1792617233.511, "seconds": 10.037, "load1": 3.76, "cpu": {"qwen38-a-hr": 1.185, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.105, "aiperf010": 0.0, "xe-exporter": 0.014, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.027, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.001}, "serving_cpu": 1.369, "aiperf_procs": 0} +{"ts": 1792617243.619, "seconds": 10.108, "load1": 3.33, "cpu": {"qwen38-a-hr": 1.202, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.103, "aiperf010": 0.0, "xe-exporter": 0.014, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.027, "prometheus": 0.01, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 1.388, "aiperf_procs": 0} +{"ts": 1792617253.649, "seconds": 10.03, "load1": 3.04, "cpu": {"qwen38-a-hr": 1.172, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.104, "aiperf010": 0.0, "xe-exporter": 0.014, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.027, "prometheus": 0.007, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.062, "xpumd": 0.002}, "serving_cpu": 1.414, "aiperf_procs": 0} +{"ts": 1792617263.68, "seconds": 10.031, "load1": 2.58, "cpu": {"qwen38-a-hr": 1.182, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.105, "aiperf010": 0.0, "xe-exporter": 0.014, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.027, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.026, "xpumd": 0.003}, "serving_cpu": 1.387, "aiperf_procs": 0} +{"ts": 1792617273.711, "seconds": 10.031, "load1": 2.41, "cpu": {"qwen38-a-hr": 1.185, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.104, "aiperf010": 0.0, "xe-exporter": 0.013, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.026, "prometheus": 0.007, "alloy": 0.011, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 1.378, "aiperf_procs": 0} +{"ts": 1792617283.742, "seconds": 10.031, "load1": 2.2, "cpu": {"qwen38-a-hr": 1.155, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.106, "aiperf010": 0.0, "xe-exporter": 0.014, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.027, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 1.345, "aiperf_procs": 0} +{"ts": 1792617293.773, "seconds": 10.031, "load1": 2.09, "cpu": {"qwen38-a-hr": 1.191, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.102, "aiperf010": 0.0, "xe-exporter": 0.014, "grafana": 0.018, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.027, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.026, "xpumd": 0.002}, "serving_cpu": 1.405, "aiperf_procs": 0} +{"ts": 1792617303.892, "seconds": 10.119, "load1": 1.92, "cpu": {"qwen38-a-hr": 1.15, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.105, "aiperf010": 0.0, "xe-exporter": 0.013, "grafana": 0.008, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.026, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 1.335, "aiperf_procs": 0} +{"ts": 1792617313.921, "seconds": 10.03, "load1": 1.78, "cpu": {"qwen38-a-hr": 1.175, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.105, "aiperf010": 0.0, "xe-exporter": 0.013, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.026, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.008, "xpumd": 0.002}, "serving_cpu": 1.361, "aiperf_procs": 0} diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/wait_s b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/wait_s new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54b-hold1/wait_s @@ -0,0 +1 @@ +0 diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/hold.log b/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/hold.log new file mode 100644 index 00000000..ee75928e --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/hold.log @@ -0,0 +1,6 @@ +== H54b hold 2 cards 2,3 arms X1q-mtp Lsq 2026-10-21T21:17:59Z +== device-plugin arms: allowed (gpu-hold-0: renderD131 gpu-hold-1: renderD128 gpu-hold-2: renderD130 gpu-hold-3: renderD129) 2026-10-21T21:19:47Z +== arm X1q-mtp 2026-10-21T21:19:47Z +== arm X1q-mtp: manifest failed 2026-10-21T21:19:47Z +== arm Lsq 2026-10-21T21:20:07Z +== arm lsq done 2026-10-21T21:38:21Z diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/post.txt b/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/post.txt new file mode 100644 index 00000000..833b2f20 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/post.txt @@ -0,0 +1,16 @@ +2026-10-21T21:38:45Z + 21:38:45 up 35 days, 22:53, 13 users, load average: 2.15, 2.46, 3.38 +%CPU PID USER COMMAND +46.3 3900003 root sglang::schedul +44.2 3900352 root sglang::schedul +24.6 3898329 root python +22.2 512494 devcloud docker +15.5 872705 65532 epp + 2.9 512265 root kworker/13:0-qat_misc_wq + 2.6 511886 root kworker/u384:3 + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3435958612 201127752 95% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr tempo xe-exporter xpumd diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/pre.txt b/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/pre.txt new file mode 100644 index 00000000..8a417353 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/pre.txt @@ -0,0 +1,16 @@ +2026-10-21T21:17:58Z + 21:17:58 up 35 days, 22:32, 11 users, load average: 1.50, 5.57, 6.14 +%CPU PID USER COMMAND + 100 493054 devcloud ps +46.3 3900003 root sglang::schedul +44.2 3900352 root sglang::schedul +24.6 3898329 root python +15.5 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd + 0.9 3892 10001 loki + 0.6 3941 472 grafana +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3435858824 201227540 95% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr tempo xe-exporter xpumd diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/rc b/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/rc new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/rc @@ -0,0 +1 @@ +0 diff --git a/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/serving.jsonl.gz b/bench/h54gpu/results/2026-10-21/runs/H54b-hold2/serving.jsonl.gz new file mode 100644 index 0000000000000000000000000000000000000000..d16c461da5d51b30fb07b0778f58c00f802d0f94 GIT binary patch literal 3070 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 literal 0 HcmV?d00001 diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-hold1/wait_s b/bench/h54gpu/results/2026-10-21/runs/H54c-hold1/wait_s new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-hold1/wait_s @@ -0,0 +1 @@ +0 diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/hold.log b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/hold.log new file mode 100644 index 00000000..2ea85c51 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/hold.log @@ -0,0 +1,4 @@ +== H54c hold 1 card 2 image ghcr.io/ggml-org/llama.cpp:server-b11749@sha256:9fbaa06d7f4449e2ae0d02b40e0431f7c212dcf231c9e3a7777a6afc2cc8f312 2026-10-21T00:06:58Z +== arm cg: -ngl 0 2026-10-21T00:07:05Z +== arm cg not deliverable 2026-10-21T00:07:07Z +== verdict INCONCLUSIVE None 2026-10-21T00:07:27Z diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/post.txt b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/post.txt new file mode 100644 index 00000000..cde26054 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/post.txt @@ -0,0 +1,16 @@ +2026-10-21T00:07:28Z + 00:07:28 up 35 days, 1:21, 16 users, load average: 2.54, 2.35, 3.60 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +41.9 3899938 root sglang::schedul +39.6 3900351 root sglang::schedul +24.3 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 2.9 4173122 root kworker/u384:8-writeback + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3422018976 215067388 95% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/pre.txt b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/pre.txt new file mode 100644 index 00000000..25b8fb53 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/pre.txt @@ -0,0 +1,16 @@ +2026-10-21T00:06:57Z + 00:06:57 up 35 days, 1:21, 19 users, load average: 2.47, 2.30, 3.62 +%CPU PID USER COMMAND + 100 4169715 devcloud ps +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +41.9 3899938 root sglang::schedul +39.6 3900351 root sglang::schedul +24.3 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp +10.8 4169397 root kworker/62:7-mm_percpu_wq + 2.5 3911 nobody node_exporter +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3422018260 215068104 95% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/rc b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/rc new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/rc @@ -0,0 +1 @@ +0 diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/serving.jsonl b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/serving.jsonl new file mode 100644 index 00000000..47e526fa --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/serving.jsonl @@ -0,0 +1,3 @@ +{"ts": 1792541228.201, "seconds": 10.0, "load1": 2.94, "cpu": {"qwen38-b-hr": 1.02, "qwen38-a-hr": 1.177, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.058, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.493, "aiperf_procs": 0} +{"ts": 1792541238.229, "seconds": 10.028, "load1": 2.63, "cpu": {"qwen38-b-hr": 1.008, "qwen38-a-hr": 1.143, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.402, "aiperf_procs": 0} +{"ts": 1792541248.26, "seconds": 10.03, "load1": 2.54, "cpu": {"qwen38-b-hr": 0.998, "qwen38-a-hr": 1.157, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.408, "aiperf_procs": 0} diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/wait_s b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/wait_s new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1-failed-sa/wait_s @@ -0,0 +1 @@ +0 diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1.out b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1.out new file mode 100644 index 00000000..9bbb6411 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke1.out @@ -0,0 +1,4 @@ +== H54c-smoke1 waiting for the lock 2026-10-20T23:15:33Z +== H54c-smoke1 lock taken 2026-10-21T00:06:57Z +== H54c-smoke1 start: bash k3d-gpu/bench/h54gpu/h54c.sh 1 2 2026-10-21T00:06:58Z +== H54c-smoke1 rc=0; clusters deleted: k3dgpu-g-h54c-1; now: 2026-10-21T00:07:28Z diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2.out b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2.out new file mode 100644 index 00000000..ac14490b --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2.out @@ -0,0 +1,5 @@ +== H54c-smoke2 waiting for the lock 2026-10-21T00:08:18Z +== H54c-smoke2 lock taken 2026-10-21T00:13:12Z +== H54c-smoke2 busy (load1 28.11, aiperf 0): waiting 120 s 2026-10-21T00:13:12Z +== H54c-smoke2 start: bash k3d-gpu/bench/h54gpu/h54c.sh 1 2 2026-10-21T00:15:13Z +== H54c-smoke2 rc=0; clusters deleted: k3dgpu-g-h54c-1; now: 2026-10-21T00:18:40Z diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/hold.log b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/hold.log new file mode 100644 index 00000000..56bba1f0 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/hold.log @@ -0,0 +1,4 @@ +== H54c hold 1 card 2 image ghcr.io/ggml-org/llama.cpp:server-b11749@sha256:9fbaa06d7f4449e2ae0d02b40e0431f7c212dcf231c9e3a7777a6afc2cc8f312 2026-10-21T00:15:13Z +== arm cg: -ngl 0 2026-10-21T00:15:24Z +== arm cg done: {'n': 8, 'median': 47.65790466879267, 'p90': 47.834098319272414, 'min': 46.814164925850164, 'max': 47.834098319272414} 2026-10-21T00:18:17Z +== verdict INCONCLUSIVE None 2026-10-21T00:18:39Z diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/post.txt b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/post.txt new file mode 100644 index 00000000..35b2eba7 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/post.txt @@ -0,0 +1,16 @@ +2026-10-21T00:18:40Z + 00:18:40 up 35 days, 1:33, 13 users, load average: 23.80, 16.78, 11.40 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +42.0 3899938 root sglang::schedul +39.6 3900351 root sglang::schedul +24.4 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.4 5983 root kworker/1:9-mm_percpu_wq + 1.2 3934 root python3 +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3422108436 214977928 95% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/pre.txt b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/pre.txt new file mode 100644 index 00000000..0a25ee9b --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/pre.txt @@ -0,0 +1,16 @@ +2026-10-21T00:15:12Z + 00:15:12 up 35 days, 1:29, 14 users, load average: 5.73, 13.80, 9.68 +%CPU PID USER COMMAND +45.4 3900003 root sglang::schedul +43.5 3900352 root sglang::schedul +42.0 3899938 root sglang::schedul +39.6 3900351 root sglang::schedul +24.3 3898329 root python +17.6 3898661 root python +15.4 872705 65532 epp + 2.5 3911 nobody node_exporter + 1.2 3934 root python3 + 1.0 2651 root dockerd +aiperf_procs: 0 +/dev/nvme0n1p1 3637102748 3422101800 214984564 95% / +aiperf010 alloy drm-exporter dynamo-frontend grafana llmd-envoy llmd-epp loki node-exporter otel-collector prometheus qwen38-a-hr qwen38-b-hr tempo xe-exporter xpumd diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/rc b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/rc new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/rc @@ -0,0 +1 @@ +0 diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/serving.jsonl b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/serving.jsonl new file mode 100644 index 00000000..92f8e33d --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/serving.jsonl @@ -0,0 +1,21 @@ +{"ts": 1792541723.203, "seconds": 10.0, "load1": 4.85, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.165, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.058, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.47, "aiperf_procs": 0} +{"ts": 1792541733.235, "seconds": 10.032, "load1": 4.47, "cpu": {"qwen38-b-hr": 1.03, "qwen38-a-hr": 1.157, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.441, "aiperf_procs": 0} +{"ts": 1792541743.263, "seconds": 10.028, "load1": 3.95, "cpu": {"qwen38-b-hr": 1.013, "qwen38-a-hr": 1.142, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.0, "loki": 0.007, "xpumd": 0.002}, "serving_cpu": 2.409, "aiperf_procs": 0} +{"ts": 1792541753.293, "seconds": 10.03, "load1": 3.65, "cpu": {"qwen38-b-hr": 1.003, "qwen38-a-hr": 1.129, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.169, "aiperf010": 0.0, "xe-exporter": 0.017, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.39, "aiperf_procs": 0} +{"ts": 1792541763.322, "seconds": 10.029, "load1": 3.4, "cpu": {"qwen38-b-hr": 0.992, "qwen38-a-hr": 1.141, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.033, "prometheus": 0.01, "alloy": 0.01, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.399, "aiperf_procs": 0} +{"ts": 1792541773.352, "seconds": 10.03, "load1": 3.03, "cpu": {"qwen38-b-hr": 0.98, "qwen38-a-hr": 1.151, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.019, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.02, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.021, "xpumd": 0.003}, "serving_cpu": 2.422, "aiperf_procs": 0} +{"ts": 1792541783.467, "seconds": 10.114, "load1": 6.64, "cpu": {"qwen38-b-hr": 1.025, "qwen38-a-hr": 1.164, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.171, "aiperf010": 0.0, "xe-exporter": 0.02, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.449, "aiperf_procs": 0} +{"ts": 1792541793.497, "seconds": 10.031, "load1": 5.7, "cpu": {"qwen38-b-hr": 1.002, "qwen38-a-hr": 1.155, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.168, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.017, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.421, "aiperf_procs": 0} +{"ts": 1792541803.528, "seconds": 10.03, "load1": 5.12, "cpu": {"qwen38-b-hr": 0.987, "qwen38-a-hr": 1.162, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.011, "xpumd": 0.003}, "serving_cpu": 2.408, "aiperf_procs": 0} +{"ts": 1792541813.56, "seconds": 10.032, "load1": 4.56, "cpu": {"qwen38-b-hr": 0.985, "qwen38-a-hr": 1.145, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.166, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.38, "aiperf_procs": 0} +{"ts": 1792541823.591, "seconds": 10.031, "load1": 4.1, "cpu": {"qwen38-b-hr": 1.012, "qwen38-a-hr": 1.21, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.167, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.004, "node-exporter": 0.031, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.003}, "serving_cpu": 2.474, "aiperf_procs": 0} +{"ts": 1792541833.626, "seconds": 10.035, "load1": 3.71, "cpu": {"qwen38-b-hr": 0.99, "qwen38-a-hr": 1.146, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.391, "aiperf_procs": 0} +{"ts": 1792541843.74, "seconds": 10.114, "load1": 7.37, "cpu": {"qwen38-b-hr": 1.948, "qwen38-a-hr": 2.117, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.224, "aiperf010": 0.0, "xe-exporter": 0.02, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.037, "prometheus": 0.008, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.009, "xpumd": 0.004}, "serving_cpu": 4.39, "aiperf_procs": 0} +{"ts": 1792541853.77, "seconds": 10.031, "load1": 14.16, "cpu": {"qwen38-b-hr": 2.149, "qwen38-a-hr": 2.218, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.245, "aiperf010": 0.0, "xe-exporter": 0.025, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.006, "node-exporter": 0.037, "prometheus": 0.009, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.002}, "serving_cpu": 4.719, "aiperf_procs": 0} +{"ts": 1792541863.803, "seconds": 10.032, "load1": 20.2, "cpu": {"qwen38-b-hr": 2.106, "qwen38-a-hr": 2.254, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.239, "aiperf010": 0.0, "xe-exporter": 0.025, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.006, "node-exporter": 0.038, "prometheus": 0.009, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.01, "xpumd": 0.004}, "serving_cpu": 4.711, "aiperf_procs": 0} +{"ts": 1792541873.834, "seconds": 10.032, "load1": 25.25, "cpu": {"qwen38-b-hr": 2.121, "qwen38-a-hr": 2.252, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.241, "aiperf010": 0.0, "xe-exporter": 0.025, "grafana": 0.005, "otel-collector": 0.001, "tempo": 0.006, "node-exporter": 0.037, "prometheus": 0.009, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.037, "xpumd": 0.004}, "serving_cpu": 4.75, "aiperf_procs": 0} +{"ts": 1792541883.866, "seconds": 10.032, "load1": 29.44, "cpu": {"qwen38-b-hr": 2.13, "qwen38-a-hr": 2.214, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.239, "aiperf010": 0.0, "xe-exporter": 0.024, "grafana": 0.006, "otel-collector": 0.001, "tempo": 0.023, "node-exporter": 0.037, "prometheus": 0.014, "alloy": 0.014, "drm-exporter": 0.001, "loki": 0.061, "xpumd": 0.002}, "serving_cpu": 4.771, "aiperf_procs": 0} +{"ts": 1792541893.897, "seconds": 10.031, "load1": 33.14, "cpu": {"qwen38-b-hr": 2.109, "qwen38-a-hr": 2.251, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.239, "aiperf010": 0.0, "xe-exporter": 0.024, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.006, "node-exporter": 0.038, "prometheus": 0.009, "alloy": 0.007, "drm-exporter": 0.001, "loki": 0.014, "xpumd": 0.002}, "serving_cpu": 4.713, "aiperf_procs": 0} +{"ts": 1792541903.978, "seconds": 10.081, "load1": 32.11, "cpu": {"qwen38-b-hr": 1.358, "qwen38-a-hr": 1.483, "dynamo-frontend": 0.003, "llmd-envoy": 0.002, "llmd-epp": 0.196, "aiperf010": 0.0, "xe-exporter": 0.02, "grafana": 0.005, "otel-collector": 0.003, "tempo": 0.005, "node-exporter": 0.033, "prometheus": 0.008, "alloy": 0.006, "drm-exporter": 0.001, "loki": 0.024, "xpumd": 0.004}, "serving_cpu": 3.151, "aiperf_procs": 0} +{"ts": 1792541914.008, "seconds": 10.03, "load1": 27.86, "cpu": {"qwen38-b-hr": 1.011, "qwen38-a-hr": 1.125, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.17, "aiperf010": 0.0, "xe-exporter": 0.016, "grafana": 0.016, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.03, "prometheus": 0.007, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.006, "xpumd": 0.002}, "serving_cpu": 2.401, "aiperf_procs": 0} +{"ts": 1792541924.038, "seconds": 10.029, "load1": 23.8, "cpu": {"qwen38-b-hr": 1.031, "qwen38-a-hr": 1.173, "dynamo-frontend": 0.003, "llmd-envoy": 0.003, "llmd-epp": 0.165, "aiperf010": 0.0, "xe-exporter": 0.015, "grafana": 0.007, "otel-collector": 0.001, "tempo": 0.005, "node-exporter": 0.029, "prometheus": 0.006, "alloy": 0.005, "drm-exporter": 0.001, "loki": 0.007, "xpumd": 0.003}, "serving_cpu": 2.454, "aiperf_procs": 0} diff --git a/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/wait_s b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/wait_s new file mode 100644 index 00000000..52bd8e43 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/H54c-smoke2/wait_s @@ -0,0 +1 @@ +120 diff --git a/bench/h54gpu/results/2026-10-21/runs/arms.log b/bench/h54gpu/results/2026-10-21/runs/arms.log new file mode 100644 index 00000000..c1d2eb0e --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/arms.log @@ -0,0 +1,3 @@ +== fetch Qwen/Qwen3.8-27B: 80.6 GB would take / above 96%: not fetched 2026-10-21T07:28:22Z +== fetch Intel/Qwen3.8-27B-q4km-AutoRound@4b30b30e0ac2cc54a2f50738cfccd6c608f94ad4 (24.7 GB, dir) 2026-10-21T21:15:08Z +== fetch Intel/Qwen3.8-27B-q4km-AutoRound rc=0 df 95% 2026-10-21T21:17:58Z diff --git a/bench/h54gpu/results/2026-10-21/runs/campaign.log b/bench/h54gpu/results/2026-10-21/runs/campaign.log new file mode 100644 index 00000000..20deb49a --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/campaign.log @@ -0,0 +1,30 @@ +== H54c-smoke1 waiting for the lock 2026-10-20T23:15:33Z +== H54c-smoke1 lock taken 2026-10-21T00:06:57Z +== H54c-smoke1 start: bash k3d-gpu/bench/h54gpu/h54c.sh 1 2 2026-10-21T00:06:58Z +== H54c-smoke1 rc=0; clusters deleted: k3dgpu-g-h54c-1; now: 2026-10-21T00:07:28Z +== H54c-smoke2 waiting for the lock 2026-10-21T00:08:18Z +== H54c-smoke2 lock taken 2026-10-21T00:13:12Z +== H54c-smoke2 busy (load1 28.11, aiperf 0): waiting 120 s 2026-10-21T00:13:12Z +== H54c-smoke2 start: bash k3d-gpu/bench/h54gpu/h54c.sh 1 2 2026-10-21T00:15:13Z +== H54c-smoke2 rc=0; clusters deleted: k3dgpu-g-h54c-1; now: 2026-10-21T00:18:40Z +== H54b-smoke1 waiting for the lock 2026-10-21T03:14:11Z +== H54b-smoke1 lock taken 2026-10-21T03:46:41Z +== H54b-smoke1 start: bash k3d-gpu/bench/h54gpu/h54b.sh 1 2026-10-21T03:46:41Z +== H54b-smoke1 rc=0; clusters deleted: k3dgpu-g-h54b-1; now: 2026-10-21T03:48:32Z +== campaign waiting for the lock 2026-10-21T21:07:09Z +== campaign lock taken 2026-10-21T21:12:26Z +== campaign qwen38-b-hr stopped 2026-10-21T21:12:32Z +== H54b-hold1 lock held by the caller 2026-10-21T21:12:53Z +== H54b-hold1 start: bash /home/devcloud/k3dgpu-gemma/k3d-gpu/bench/h54gpu/h54b.sh 1 X1q 2026-10-21T21:12:53Z +== H54b-hold1 rc=0; clusters deleted: k3dgpu-g-h54b-1; now: 2026-10-21T21:15:08Z +== campaign hold 1 rc=0 2026-10-21T21:15:08Z +== campaign fetch Intel/Qwen3.8-27B-q4km-AutoRound rc=0 2026-10-21T21:17:58Z +== H54b-hold2 lock held by the caller 2026-10-21T21:17:58Z +== H54b-hold2 start: bash /home/devcloud/k3dgpu-gemma/k3d-gpu/bench/h54gpu/h54b.sh 2 X1q-mtp Lsq 2026-10-21T21:17:58Z +== H54b-hold2 rc=0; clusters deleted: k3dgpu-g-h54b-2; now: 2026-10-21T21:38:45Z +== campaign hold 2 rc=0 2026-10-21T21:38:45Z +== H54c-hold1 lock held by the caller 2026-10-21T21:38:45Z +== H54c-hold1 start: bash /home/devcloud/k3dgpu-gemma/k3d-gpu/bench/h54gpu/h54c.sh 1 2 2026-10-21T21:38:45Z +== H54c-hold1 rc=0; clusters deleted: k3dgpu-g-h54c-1; now: 2026-10-21T21:57:40Z +== campaign hold c1 rc=0 2026-10-21T21:57:40Z +== campaign qwen38-b-hr restored, chat ok 2026-10-21T21:58:57Z diff --git a/bench/h54gpu/results/2026-10-21/runs/fetch-qwen-bf16.out b/bench/h54gpu/results/2026-10-21/runs/fetch-qwen-bf16.out new file mode 100644 index 00000000..7107b796 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/fetch-qwen-bf16.out @@ -0,0 +1 @@ +== fetch Qwen/Qwen3.8-27B: 80.6 GB would take / above 96%: not fetched 2026-10-21T07:28:22Z diff --git a/bench/h54gpu/results/2026-10-21/runs/h54bc-campaign.out b/bench/h54gpu/results/2026-10-21/runs/h54bc-campaign.out new file mode 100644 index 00000000..8a867344 --- /dev/null +++ b/bench/h54gpu/results/2026-10-21/runs/h54bc-campaign.out @@ -0,0 +1,20 @@ +== campaign waiting for the lock 2026-10-21T21:07:09Z +== campaign lock taken 2026-10-21T21:12:26Z +== campaign qwen38-b-hr stopped 2026-10-21T21:12:32Z +== H54b-hold1 lock held by the caller 2026-10-21T21:12:53Z +== H54b-hold1 start: bash /home/devcloud/k3dgpu-gemma/k3d-gpu/bench/h54gpu/h54b.sh 1 X1q 2026-10-21T21:12:53Z +== H54b-hold1 rc=0; clusters deleted: k3dgpu-g-h54b-1; now: 2026-10-21T21:15:08Z +== campaign hold 1 rc=0 2026-10-21T21:15:08Z +== fetch Intel/Qwen3.8-27B-q4km-AutoRound@4b30b30e0ac2cc54a2f50738cfccd6c608f94ad4 (24.7 GB, dir) 2026-10-21T21:15:08Z + Fetching 4 files: 0%| | 0/4 [00:00 Date: Wed, 28 Oct 2026 22:38:25 -0700 Subject: [PATCH 22/85] ledger(H54b, H54c): INCONCLUSIVE, not delivered as pre-registered (the pinned pods saw all 4 cards); H54a corrections H54b and H54c rows and their run section. Every "one card" pod listed all four B70s' device nodes and llama.cpp split its layers over them, so no arm was a one-card run: both rows are INCONCLUSIVE because their arms were not delivered as pre-registered, not through predict.py's 25-40% band (its 1.261 rests on 4-card and confounded inputs). Every Gg, Hg, Gg2, Cg and Lsq number is labelled descriptive. Disclosed: the pods put VRAM and compute on the live qwen38-a-hr's two cards for about 34 minutes, which G1 did not authorise and whose impact was not measured; and this campaign stopped qwen38-b-hr itself. The X1q and X1q-mtp failures are runner bugs, with errata beside the raw records. A re-run needs an amendment that pins the device in the engine and checks isolation from inside the pod. H54a corrections (verdict unchanged): B1g completed 2 of 8 hold-2 N=1 requests, not 3; the Lg/B1g and Lg-mtp/B1g bootstrap intervals over n=2 base rates from a failing engine are struck and the ratios relabelled descriptive only; the B1g re-run probe and its harness control are named. docs/intel/technical-report.md: 25 INCONCLUSIVE, 18 PENDING; docs/intel.md gains the H54b row. The stock-arm stall is described as this harness's render of EAT's entry, cause open. --- EXPERIMENTS.md | 225 +++++++++++++++++++++++++++++++-- docs/intel.md | 12 +- docs/intel/technical-report.md | 14 +- 3 files changed, 229 insertions(+), 22 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index f983bb1e..ab4bfecf 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -71,10 +71,10 @@ setup too weak to decide). Only `SUPPORTED` backs a claim. | H52 | A plain `k3d-gpu up` (no flags, the auto-adapt default) on the Xeon 6741P host as found detects and enables every engine actually present and advertises each usable one to the scheduler, with nothing missing and nothing phantom; engines present but not configured on the host are named, not advertised. | Written 2026-10-20 from an inventory read from sysfs, lspci and CPUID, not from k3d-gpu. 4 x Arc Pro B70 (xe) as `gpu.intel.com/xe: 4`; AMX TILE, BF16, INT8, FP16 and 14 AVX-512/VNNI labels; no hybrid, NUMA, NVIDIA, Gaudi or NPU objects; DSA, IAA and QAT named as present but unconfigured (0.4: `up` may not name them). | The table in [H50-H52 pre-registration](#h50-h52-pre-registration-the-xeon-6741p-2026-10-20): `k3d-gpu doctor`, `K3D_GPU_CLUSTER=k3dgpu-h52 k3d-gpu up`, `kubectl get node -o json`, `k3d-gpu test`, and one enumeration pod per B70. SUPPORTED: every row matches. REFUTED: any row does not. Run 2026-10-20 ([H52 run](#h52-run-xeon-6741p-2026-10-20)): the four B70s (`gpu.intel.com/xe: 4`, `xmx=true`), AMX (TILE, BF16, INT8, FP16) and all 14 AVX-512/VNNI labels detected and reached pods, nothing phantom; but no media engine label on `xe`, and `up` does not name the unconfigured DSA, IAA and QAT (`doctor` does). | REFUTED | | H52b | After `k3d-gpu host-setup --apply` configures the host's DSA, IAA and QAT (the fix that adds that path, merged first), a plain `k3d-gpu up` also advertises them, and each one reaches a pod; the host is then restored exactly. | Written 2026-10-20, before the fix exists. DSA, IAA and QAT allocatable > 0, each at the count host-setup reports configuring; their test pods see `/dev/dsa`, `/dev/iax`, `/dev/vfio` (0.6). The other rows read as H52's expected table, media labels included ([amendment D1](#h52-amendment-d1-the-fixes-and-h52b-2026-10-20)). | Runs after H52, once the host-setup fix is merged; same procedure plus `host-setup --apply` before `up` and its printed revert after. SUPPORTED: the three engines advertised and reached, the H52 rows unchanged, and the host inventory read back equal to the one taken before. REFUTED: any of these fails. | PENDING | | H53 | Inside EAT's banking flow on the Arc Pro B70s with Qwen3.8-27B (thinking off), k3d-gpu's own GPU choice AG (OVMS int4 on one card, `agent manifest`, auto device) delivers far more B24 tasks within the 120 s turn budget than B2, "EAT PR #21 nearest profile (Qwen3.6-27B) on Qwen3.8 weights, fp16" (vLLM XPU v0.28.0, TP 4). A stack-vs-stack claim. | Written 2026-10-20, before any H53 measurement. AG >= 0.70 (0.6); B2 boots by ladder rung (b) (0.6); B2 >= 0.50 (0.5); block mean AG - B2 in [-0.15, +0.30] (0.5). INCONCLUSIVE (0.6), REFUTED (0.3), SUPPORTED (0.1). | Solo holds in the order AG, B2, B2, AG, AG, B2 (up to 8), blocks = hold pairs (2k-1, 2k), block-level inference: mean of per-block d over >= 3 counted blocks, t-interval. SUPPORTED: lower bound >= +30 points and AG >= 0.6, L3 gates passed. REFUTED: upper bound < +30 points. Else INCONCLUSIVE. `bench/eatflow/crescent/solo-hold.sh N ARM`, `agentbench solo-report --hyp H53 --arm-a AG --arm-b B2`. See [H53 pre-registration](#h53-pre-registration-eats-banking-flow-on-arc-pro-b70-2026-10-20). | PENDING | -| H54a | On the Xeon 6741P, Gemma 4 26B-A4B (QAT weights) single-stream: the best optimized CPU arm, chosen by the pre-registered source and speed rule, decodes at N=1 at least 3x faster than EAT stock B1g (vLLM CPU v0.24.0 bf16, `xeon-values.yaml`'s Gemma entry on the QAT bf16 weights), with a 50-item quality spot-check no more than 10 points below B1g's. A microbench, not an agent claim. | Written 2026-10-20, before any H54 measurement. N=1 median decode tok/s: B1g in [4, 15] (0.6); Lg (llama.cpp CPU, Google QAT Q4_0) in [25, 70] (0.6); A1g (k3d-gpu auto, OVMS CPU, QAT-matched IR) in [15, 60] (0.5), A1g/A1o in [0.85, 1.02] (0.6); Vq (vLLM CPU v0.32.0 bf16) in [6, 18] (0.5), Vq-mtp/Vq in [1.4, 2.5] (0.5); Lg-mtp/Lg in [1.2, 2.2] (0.4); Sg (SGLang CPU AMX) deliverable (0.6). The chosen arm is Lg or Lg-mtp (0.55). B3g not deliverable (0.8). SUPPORTED (0.65), INCONCLUSIVE (0.25), REFUTED (0.1). Not gated: TTFT on a 1,000-token prompt, aggregate tok/s at N=4 and 16 (A1g N=16/N=1 <= 1.5, 0.5), J/token. | [H54 pre-registration](#h54-pre-registration-gemma-4-26b-a4b-qat-and-qwen38-microbenches-on-crescent-2026-10-20): `bench/llm_load.py` per arm (N=1: 8 requests, N=4: 16, N=16: 32, 256 tokens, greedy, `ignore_eos`), `bench/energy.sh` RAPL per phase, GSM8K items 0-49 graded by exact match, one arm serving at a time, at most 3 holds of at most 40 min. Statistic: ratio of the chosen arm's median N=1 decode to B1g's, 95% bootstrap CI over requests. SUPPORTED: CI lower bound >= 3.0 and the quality gate passed. REFUTED: CI upper bound < 3.0, or every arm with a point ratio >= 3.0 fails the quality gate. Otherwise INCONCLUSIVE (also: B1g not deliverable, or a void phase not re-run). Run 2026-10-21, 3 holds ([H54a run](#h54a-run-xeon-6741p-2026-10-21)): stock B1g stalled in both its holds (vLLM v0.24.0 `EngineDeadError` mid-decode, cause open; no scored phase, 0/50 GSM8K, all errored), so `h54.py score-a` has no base and no chosen arm. Measured: Lg 48.74, Lg-mtp 54.52, A1g 23.25, A1o 21.73 tok/s N=1 median, GSM8K 50, 50, 49, 49 of 50; each scored phase exists only under amendment R4 (its own foreign CPU 4.4-4.8 CPU-s/s). Vq, Vq-mtp, Vi, Sg, B3g not run (cap). Descriptive, not scored: Lg-mtp over B1g's 2 hold-2 rates 3.02 (CI 2.90-3.06). | INCONCLUSIVE | +| H54a | On the Xeon 6741P, Gemma 4 26B-A4B (QAT weights) single-stream: the best optimized CPU arm, chosen by the pre-registered source and speed rule, decodes at N=1 at least 3x faster than EAT stock B1g (vLLM CPU v0.24.0 bf16, `xeon-values.yaml`'s Gemma entry on the QAT bf16 weights), with a 50-item quality spot-check no more than 10 points below B1g's. A microbench, not an agent claim. | Written 2026-10-20, before any H54 measurement. N=1 median decode tok/s: B1g in [4, 15] (0.6); Lg (llama.cpp CPU, Google QAT Q4_0) in [25, 70] (0.6); A1g (k3d-gpu auto, OVMS CPU, QAT-matched IR) in [15, 60] (0.5), A1g/A1o in [0.85, 1.02] (0.6); Vq (vLLM CPU v0.32.0 bf16) in [6, 18] (0.5), Vq-mtp/Vq in [1.4, 2.5] (0.5); Lg-mtp/Lg in [1.2, 2.2] (0.4); Sg (SGLang CPU AMX) deliverable (0.6). The chosen arm is Lg or Lg-mtp (0.55). B3g not deliverable (0.8). SUPPORTED (0.65), INCONCLUSIVE (0.25), REFUTED (0.1). Not gated: TTFT on a 1,000-token prompt, aggregate tok/s at N=4 and 16 (A1g N=16/N=1 <= 1.5, 0.5), J/token. | [H54 pre-registration](#h54-pre-registration-gemma-4-26b-a4b-qat-and-qwen38-microbenches-on-crescent-2026-10-20): `bench/llm_load.py` per arm (N=1: 8 requests, N=4: 16, N=16: 32, 256 tokens, greedy, `ignore_eos`), `bench/energy.sh` RAPL per phase, GSM8K items 0-49 graded by exact match, one arm serving at a time, at most 3 holds of at most 40 min. Statistic: ratio of the chosen arm's median N=1 decode to B1g's, 95% bootstrap CI over requests. SUPPORTED: CI lower bound >= 3.0 and the quality gate passed. REFUTED: CI upper bound < 3.0, or every arm with a point ratio >= 3.0 fails the quality gate. Otherwise INCONCLUSIVE (also: B1g not deliverable, or a void phase not re-run). Run 2026-10-21, 3 holds ([H54a run](#h54a-run-xeon-6741p-2026-10-21)): stock B1g stalled in both its holds (vLLM v0.24.0 `EngineDeadError` mid-decode, cause open; no scored phase, 0/50 GSM8K, all errored), so `h54.py score-a` has no base and no chosen arm. Measured: Lg 48.74, Lg-mtp 54.52, A1g 23.25, A1o 21.73 tok/s N=1 median, GSM8K 50, 50, 49, 49 of 50; each scored phase exists only under amendment R4 (its own foreign CPU 4.4-4.8 CPU-s/s). Vq, Vq-mtp, Vi, Sg, B3g not run (cap). Descriptive, not scored: Lg-mtp over B1g's 2 hold-2 rates 3.02 ~~(CI 2.90-3.06)~~ (descriptive only: n=2 base rates from an engine that died minutes later, no CI; correction 2026-10-28, [H54a run](#h54a-run-xeon-6741p-2026-10-21)). | INCONCLUSIVE | | H54q | QAT matters at int4 on this model: on GSM8K items 0-199, the QAT-matched OpenVINO IR OVQ (INT4_SYM, group 32, built from Google's QAT bf16 weights) is non-inferior to the bf16 QAT reference R within 5 points, and the published base-model IR OVB (`OpenVINO/gemma-4-26b-a4b-it-int4-ov`; ~~INT4_ASYM group 128~~ AWQ INT4 asymmetric group 64, router layers unquantized, per its `openvino_config.json`: [note N1](#h54-note-n1-what-ovb-is-2026-10-21)) scores below OVQ. | Written 2026-10-20, before any measurement. R accuracy in [0.85, 0.96] (0.6). OVQ - R in [-0.03, +0.02] (0.6). GGUF Q4_0 (Lg) - R in [-0.03, +0.02] (0.6). OVB - R in [-0.07, 0] (0.5). The OVB < OVQ part resolves on 200 items (0.2). INCONCLUSIVE (0.65), SUPPORTED (0.2), REFUTED (0.15). | As H54a's quality protocol on items 0-199 of `openai/gsm8k` `main` test @ `740312ad`; items 0-49 come from H54a's runs of the same arm configs; at most 1 hold of at most 40 min for the rest. Paired bootstrap 95% CI over items (10,000 resamples, seed 1). SUPPORTED: CI lower bound of OVQ - R >= -0.05 and CI upper bound of OVB - OVQ < 0. REFUTED: CI upper bound of OVQ - R < -0.05, or CI lower bound of OVB - OVQ > 0. Otherwise INCONCLUSIVE. | PENDING | -| H54b | On Arc Pro B70 with Qwen3.8-27B single-stream: the best optimized arm on ONE card (k3d-gpu auto OVMS int4, Intel's llm-scaler vLLM, or llama.cpp SYCL, with and without each one's documented MTP) decodes at N=1 at least 2x faster than EAT #21's XPU path B2q on TWO cards (vLLM XPU v0.28.0, the `xpu-qwen36-27b` profile's flags on the Qwen3.8-27B weights, TP 2). | Written 2026-10-20, before any measurement. N=1 median decode tok/s: X1q (OVMS GPU int4) in [15, 28] (0.5), X1q-mtp/X1q in [1.3, 2.2] (0.4); Sq (llm-scaler 1.5, online FP8, TP 1) deliverable (0.5), in [10, 18]; Sq-mtp/Sq in [1.4, 2.3] (0.5); Lsq (llama.cpp SYCL, Intel Q4_K_M) in [12, 24] (0.5); B2q deliverable at TP 2 (0.4), in [5, 12] (0.5). Chosen/B2q >= 2 (0.6). Cards free for a window (0.5). INCONCLUSIVE (0.6), SUPPORTED (0.3), REFUTED (0.1). | H54a's protocol on the B70s, cards only when `~/k3dgpu-bench/gpu-state.txt` lists them free; at most 2 holds of at most 40 min. Same statistic and quality gate (against B2q, or the official-weights arm Sq when B2q is not deliverable, for the gate only). SUPPORTED: CI lower bound of chosen one-card arm / B2q >= 2.0 and the gate passed. REFUTED: CI upper bound < 2.0. Otherwise INCONCLUSIVE (also: B2q not deliverable, or no free card before the campaign ends). Gemma 4 QAT on one B70 (X1g, X1o, B2g, Sgg) is described if hold time remains, never gated. | PENDING | -| H54c | Hybrid placement ("use the fast DRAM"): llama.cpp with Gemma 4 26B-A4B QAT Q4_0, routed experts on the Xeon and everything else on one B70 (Hg, `-ngl 99 -ot exps=CPU`), decodes at N=1 within 25% of a pre-stated byte-split model built from the same image's full-CPU (Cg) and full-GPU (Gg) runs. Qwen3.8-Flash-Next falls back to Gemma 4 QAT (reasons in the pre-registration). | Written 2026-10-20, before any measurement. Model: t_Hg = t_Cg x (B_exp / B_tot) + t_Gg x (B_rest / B_tot) + 60 x 30 us, bytes from the GGUF tensor table. Within 25% (0.45). Hg < Gg (0.8). Hg / Cg in [0.8, 1.6] (0.5). Gg in [30, 90] tok/s (0.4). SUPPORTED (0.45), INCONCLUSIVE (0.3), REFUTED (0.25). | One hold of at most 40 min on one free card: Cg, Gg, Hg in that order, then Gg again (drift check), all in `ghcr.io/ggml-org/llama.cpp:server-intel-b11749`, H54a's N=1 phase only. SUPPORTED: abs(Hg measured / predicted - 1) <= 0.25. REFUTED: > 0.40. Otherwise INCONCLUSIVE (also: any of the three arms not delivered, or the two Gg runs differ by > 10%). | PENDING | +| H54b | On Arc Pro B70 with Qwen3.8-27B single-stream: the best optimized arm on ONE card (k3d-gpu auto OVMS int4, Intel's llm-scaler vLLM, or llama.cpp SYCL, with and without each one's documented MTP) decodes at N=1 at least 2x faster than EAT #21's XPU path B2q on TWO cards (vLLM XPU v0.28.0, the `xpu-qwen36-27b` profile's flags on the Qwen3.8-27B weights, TP 2). | Written 2026-10-20, before any measurement. N=1 median decode tok/s: X1q (OVMS GPU int4) in [15, 28] (0.5), X1q-mtp/X1q in [1.3, 2.2] (0.4); Sq (llm-scaler 1.5, online FP8, TP 1) deliverable (0.5), in [10, 18]; Sq-mtp/Sq in [1.4, 2.3] (0.5); Lsq (llama.cpp SYCL, Intel Q4_K_M) in [12, 24] (0.5); B2q deliverable at TP 2 (0.4), in [5, 12] (0.5). Chosen/B2q >= 2 (0.6). Cards free for a window (0.5). INCONCLUSIVE (0.6), SUPPORTED (0.3), REFUTED (0.1). | H54a's protocol on the B70s, cards only when `~/k3dgpu-bench/gpu-state.txt` lists them free; at most 2 holds of at most 40 min. Same statistic and quality gate (against B2q, or the official-weights arm Sq when B2q is not deliverable, for the gate only). SUPPORTED: CI lower bound of chosen one-card arm / B2q >= 2.0 and the gate passed. REFUTED: CI upper bound < 2.0. Otherwise INCONCLUSIVE (also: B2q not deliverable, or no free card before the campaign ends). Gemma 4 QAT on one B70 (X1g, X1o, B2g, Sgg) is described if hold time remains, never gated. Run 2026-10-21, 2 holds ([H54b and H54c run](#h54b-and-h54c-run-arc-pro-b70-2026-10-21)): INCONCLUSIVE, not delivered as pre-registered: the pinned "one card" pods saw all 4 cards. B2q, Sq, Sq-mtp (Qwen bf16, 80.6 GB with its guard) and Rq were not deliverable (disk); X1q and X1q-mtp failed on two `h54b.sh` runner bugs before any engine started; Lsq ran, but its pod listed every render node and llama.cpp split the model over all four B70s, two of them serving the live `qwen38-a-hr`, so no one-card arm exists. `score.py`: "no gate reference (B2q and Sq missing)". Descriptive only, a 4-card run and not a one-card or B70 result: Lsq 27.3 tok/s N=1 median, GSM8K 48/50. | INCONCLUSIVE | +| H54c | Hybrid placement ("use the fast DRAM"): llama.cpp with Gemma 4 26B-A4B QAT Q4_0, routed experts on the Xeon and everything else on one B70 (Hg, `-ngl 99 -ot exps=CPU`), decodes at N=1 within 25% of a pre-stated byte-split model built from the same image's full-CPU (Cg) and full-GPU (Gg) runs. Qwen3.8-Flash-Next falls back to Gemma 4 QAT (reasons in the pre-registration). | Written 2026-10-20, before any measurement. Model: t_Hg = t_Cg x (B_exp / B_tot) + t_Gg x (B_rest / B_tot) + 60 x 30 us, bytes from the GGUF tensor table. Within 25% (0.45). Hg < Gg (0.8). Hg / Cg in [0.8, 1.6] (0.5). Gg in [30, 90] tok/s (0.4). SUPPORTED (0.45), INCONCLUSIVE (0.3), REFUTED (0.25). | One hold of at most 40 min on one free card: Cg, Gg, Hg in that order, then Gg again (drift check), all in `ghcr.io/ggml-org/llama.cpp:server-intel-b11749`, H54a's N=1 phase only. SUPPORTED: abs(Hg measured / predicted - 1) <= 0.25. REFUTED: > 0.40. Otherwise INCONCLUSIVE (also: any of the three arms not delivered, or the two Gg runs differ by > 10%). Run 2026-10-21, 1 hold ([H54b and H54c run](#h54b-and-h54c-run-arc-pro-b70-2026-10-21)): INCONCLUSIVE, not delivered as pre-registered: the pinned "one card" pods saw all 4 cards. Gg, Hg and Gg2 split their GPU layers over four B70s (two serving the live `qwen38-a-hr`), and Cg (`-ngl 0`) also allocated about 0.5 GB on one of those cards, so t_Cg and the prediction are confounded. The verdict does not come from `predict.py`'s band test, whose inputs are these 4-card and confounded runs. Descriptive only, not one-card or hybrid results: Cg 36.8, Gg 58.0, Hg 56.3, Gg2 57.4 tok/s N=1 median. | INCONCLUSIVE | | H54d | Inside EAT's banking flow with Gemma 4 26B-A4B (QAT), the best H54a CPU arm A* delivers far more B24 tasks within budget than EAT stock B1g, under H50's design, statistic, gates and thresholds (rule L2, amendment C1). Runs only when A* is not H50's A1 config. | Written 2026-10-20, before any measurement. A* within-budget success >= 0.60 (0.55). B1g >= 0.50 (0.6). Paired A* - B1g in [-0.10, +0.30] (0.6). A* serves B24's tool calls without a parser change (0.6). Fewer than 16 matched pairs in 3 holds (0.5). REFUTED (0.4), INCONCLUSIVE (0.5), SUPPORTED (0.1). | H50's procedure with arm A = A*, arm B = B1g; at most 3 holds of at most 40 min, until 24 pairs. SUPPORTED: paired difference CI lower bound >= +30 points and A* >= 0.6, L2, void and idle-arm checks passed. REFUTED: CI upper bound < +30 points. Otherwise INCONCLUSIVE. Not run (and so recorded) when A* is H50's A1 config: H50 answers it. Not run 2026-10-21, no hold used ([H54d: not run](#h54d-not-run-2026-10-21)): A* is undefined (H54a chose no arm), B1g stalled in both H54a holds, and H54q has not run; the caps rule makes a row with its stock or chosen arm missing INCONCLUSIVE. | INCONCLUSIVE | | H58 | The zero-touch thesis on the Xeon 6741P with four Arc Pro B70s. From a clean state, k3d-gpu brings up EAT's banking flow on Gemma 4 26B-A4B-it with no flag, no manual step and no edit. It detects and advertises every engine H52 and H52b found. It places each model by its own memory fit. Its result is within tolerance of the best hand-tuned arm on the same host. Under a controlled host memory squeeze, its guard backs off and nothing outside its own pods is OOM-killed. | Written 2026-10-20, before any H58 run and before the model optimizer (PR #163) and the fit-and-guard layer (branch `claude/fit-and-guard`) are on main. (a) Flags beyond the documented commands: 0 (0.8). (b) Manual steps or edits: 0 (0.6). (c) Decode tok/s >= 0.90x the best hand-tuned arm on this host (0.6), and within-budget B24 success within 5 points of it (0.7). (d) Every engine H52/H52b found is detected and advertised (0.75). (e) Qwen3.8-Flash-Next W4A16 (Intel AutoRound) lands on an experts-in-DRAM placement, and Gemma 4 and Qwen3.8-27B land on the GPU or the CPU, each as its fit decides, with no flag (0.5). (f) Under the squeeze: 0 OOM kills outside our pods (0.85), and the guard lowers admission (0.6). All six together: SUPPORTED (0.25), REFUTED (0.6), INCONCLUSIVE (0.15). | See [H58 pre-registration](#h58-pre-registration-the-zero-touch-thesis-on-crescent-2026-10-20). Runs last on crescent, after #163 and the fit-and-guard layer merge, with their commits recorded. SUPPORTED: (a) through (f) all hold. REFUTED: any clause fails on a valid run. A manual step found is a REFUTED run. It is fixed test-first, and the re-run is a new run with its own section. INCONCLUSIVE: no valid baseline for (c), or the run is not deliverable for reasons outside k3d-gpu. | PENDING | | H57da | On an AMX-less client CPU (i9-13900T, the 16 P-core CPUs, AVX2 and VNNI, no AVX-512), with the Gemma 4 26B-A4B QAT family, k3d-gpu's own CPU pick Od (`agent manifest` auto on the P-cores: OVMS 2026.4.1, `OpenVINO/gemma-4-26b-a4b-it-int4-ov`) is the fastest single-stream arm: no other arm passing the quality gate (llama.cpp with Google's QAT Q4_0 GGUF, with or without the QAT MTP drafter) decodes at N=1 5% or more faster. A microbench, not an agent claim. | Written 2026-10-20, before any H57d measurement. N=1 median decode tok/s: Od in [8, 20] (0.5); Ld (llama.cpp Q4_0, 8 threads) in [12, 30] (0.5); Ld/Od in [1.1, 1.8] (0.5); every arm's GSM8K 0-49 score >= 0.80 (0.6). REFUTED (0.55), SUPPORTED (0.25), INCONCLUSIVE (0.2). Not gated: TTFT on a 1,000-token prompt, aggregate tok/s at N=4, package J/token gross and net of idle. | [H57d pre-registration](#h57d-pre-registration-gemma-4-26b-a4b-qat-on-the-amx-less-client-cpu-i9-13900t-2026-10-20): H54's measurement protocol per arm (`bench/llm_load.py`, 256 tokens, greedy, `ignore_eos`; RAPL per phase; GSM8K items 0-49 graded as H54), one arm serving at a time, arm order rotated over 3 performance holds, quality in a 4th, at most 5 holds of at most 45 min. Statistic: R = median N=1 decode of the fastest other gate-passing arm X / Od's, over the pooled requests of the 3 holds, 95% bootstrap CI (H54's). REFUTED: Od fails the quality gate, or CI lower bound >= 1.05 and X faster than Od in each of the 3 holds. SUPPORTED: Od passes the gate and CI upper bound < 1.05. INCONCLUSIVE otherwise, or when Od or every other arm is not delivered, or the load gate fails. Run 2026-10-21 ([H57d run](#h57d-run-i9-13900t-2026-10-21)): Ld-mtp/Od 0.785 (95% CI 0.692-1.561), per hold 0.72, 0.79, 1.44; Od 6.90, Ld 3.50, Ld-mtp 5.41 tok/s pooled N=1; all 50/50 on GSM8K; load matched (1.80 <= 2.0). The strict-pinned llama.cpp arms tracked host load 2.3-2.7x, Od 1.3x. | INCONCLUSIVE | @@ -3384,8 +3384,10 @@ after 219 s, answered 2 of 3 warmup requests and stalled on the third at 166 out v0.24.0 logged "No available shared memory broadcast block found in 60 seconds" from 08:24:21Z, then `TimeoutError` in `shm_broadcast` and `EngineDeadError`, and the server exited at 08:28:20Z. No scored request completed (R3 rewrote its record from `measured` to `failed` at 08:50:49Z). In -hold 2 it completed 3 of 8 N=1 requests (2 with a decode rate: 17.92 and 18.17 tok/s), then died -the same way ("RPC call to execute_model timed out", `EngineDeadError`, 09:21:02Z); N=4, N=16, +hold 2 it completed ~~3 of 8 N=1 requests (2 with a decode rate: 17.92 and 18.17 tok/s)~~ 2 of 8 +N=1 requests (17.92 and 18.17 tok/s); the third stopped at 252 of 256 tokens (correction +2026-10-28, below). The engine then died the same way ("RPC call to execute_model timed out", +`EngineDeadError`, 09:21:02Z); N=4, N=16, TTFT and all 50 GSM8K items errored. R3 carries a stopped arm once, so B1g did not run a third time. Neither hold had an out-of-memory kill or an aiperf process; load1 fell to about 4-5 during the stall and the non-campaign CPU over hold 2's N=1 phase read 2.66 CPU-s/s, so neither box load @@ -3405,7 +3407,7 @@ and net of the arm's own 60 s idle power; quality: GSM8K items 0-49, exact match | Arm | Hold | Status | N=1 decode tok/s (min-max) | N=4 / N=16 aggregate tok/s | TTFT s | J/token gross / net (idle W) | GSM8K 0-49 | |---|---|---|---|---|---|---|---| | B1g | 1 | failed (stopped answering) | none | none | none | none | 0/50, 50 errors | -| B1g | 2 | failed (stopped answering) | 18.04 (17.92-18.17; 2 rates, descriptive) | none | none | none | 0/50, 50 errors | +| B1g | 2 | failed (stopped answering) | 18.04 (17.92-18.17; n=2, then the engine died; descriptive) | none | none | none | 0/50, 50 errors | | Lg | 2 | measured | 48.74 (48.09-49.02) | 88.84 / 87.19 | 2.73 | 5.80 / 2.95 (131.4) | 50/50 | | Lg-mtp | 2 | measured | 54.52 (50.50-55.54) | 121.21 / 120.05 | 2.71 | 5.34 / 2.77 (131.1) | 50/50 | | A1g | 3 | measured | 23.25 (22.98-23.39) | 30.87 / 65.52 | 5.05 | 12.80 / 6.79 (132.1) | 49/50 | @@ -3433,18 +3435,22 @@ score minus 0.10; B1g has neither a measured N=1 phase nor a score, so no arm ca no arm is chosen. The pre-registration's INCONCLUSIVE branch names this case ("B1g not deliverable"). -Read descriptively, and not as the verdict: with B1g's 2 hold-2 rates, Lg/B1g is 2.70 (bootstrap -CI 2.67-2.73) and Lg-mtp/B1g 3.02 (CI 2.90-3.06). By the source rule Lg-mtp (rank 2, 1.119x Lg at -50/50) would replace Lg (rank 0) as the chosen arm. Its CI lower bound is below 3.0, so even had -those rates counted, the row would not have been SUPPORTED; the 3x bar most likely would not have -cleared with a working B1g. No int4-vs-bf16 quality statement can be made: the bf16 arms have no +Read descriptively, and not as the verdict: with B1g's 2 hold-2 rates, Lg/B1g is 2.70 ~~(bootstrap +CI 2.67-2.73)~~ and Lg-mtp/B1g 3.02 ~~(CI 2.90-3.06)~~. Both are descriptive only: their base is n=2 +rates from an engine that died about 5 minutes later, and a bootstrap over 2 values gives no +interval, so none is stated (correction 2026-10-28). By the source rule Lg-mtp (rank 2, 1.119x Lg +at 50/50) would replace Lg (rank 0) as the chosen arm. ~~Its CI lower bound is below 3.0, so even +had those rates counted, the row would not have been SUPPORTED; the 3x bar most likely would not +have cleared with a working B1g.~~ The point ratio sits on the 3.0 bar, and an n=2 base from a +failing engine cannot say whether a working B1g would have cleared it. No int4-vs-bf16 quality +statement can be made: the bf16 arms have no score (B1g errored, Vq not run), and 49-50/50 on these items is near the ceiling. **Against the predictions.** | Prediction | Result | |---|---| -| B1g in [4, 15] (0.6) | 18.04 from 2 rates, descriptive: above the range | +| B1g in [4, 15] (0.6) | 18.04 from 2 rates (n=2, from an engine that then died), descriptive: above the range | | Lg in [25, 70] (0.6) | 48.74: held | | A1g in [15, 60] (0.5) | 23.25: held | | A1g/A1o in [0.85, 1.02] (0.6) | 1.07 (CI 1.06-1.08): missed, the QAT-matched IR decoded faster than OVB | @@ -3474,6 +3480,37 @@ The predictor has no compute, KV or kernel term and no MTP, so Lg-mtp has no cei batch 1 the OVMS arms run at about a sixth of their bandwidth ceiling and llama.cpp at about a third; the predictor is not a forecast for these engines on this host. +**Corrections (2026-10-28, from a review of the raw records on 2026-10-21 after #191; verdict +unchanged).** + +1. B1g's hold-2 N=1 phase completed 2 requests, not 3. Sample 2 of `hold2/B1g/load-n1.json` + stopped at 252 of 256 tokens after 314 s with no usage record (`content_chunks` 252, `chunks` + 254). The engine dump in `server.log.gz` reads `num_output_tokens=[252]`, and the API server + logged "Error in chat completion stream generator", so vLLM ended the stream with an error + chunk and `[DONE]`. `bench/llm_load.py` counted any stream with content as ok. It now records + `finish_reason` and marks a stream that carries an error object, or ends without a + `finish_reason`, as an error; the regression tests (`tests/bench_test.sh`: `load_engine_death`, + `load_cut_stream`) failed before the fix. The raw record is kept as recorded, with + `hold2/B1g/ERRATUM.txt` beside it. B1g's status was already `failed`, and its median already + used only the 2 rates. Of all 607 samples recorded ok in the H54a, H54b and H54c load + records (smokes included), only two have fewer output tokens than requested: this one and + hold 1's unscored B1g warm-up that stalled at 166 tokens (above). No other recorded number + changes. +2. The bootstrap intervals on Lg/B1g and Lg-mtp/B1g are struck above, and the ratios are + descriptive only: their base is 2 rates from an engine that died minutes later. No ratio + against B1g is carried to the docs. +3. Reading aids for the raw `reproduce.txt`: its `ovms_eat: 2025.4@sha256:c3707200...` line is + `openvino/model_server:2025.4` (B3g, EAT's chart, not run), and its two `...-int4-sym-g32-ov` + lines are two different directories (`k3dgpu_...` is PR #157's export for H50, `k3dgpu/...` is + A1g's), as the header above says. Its 8 unlabelled `model-0000N-of-00008.safetensors` hashes + are `Intel/gemma-4-26B-A4B-it-int4-AutoRound` @ `edff6272` (Vi, not run); each equals the Hub's + LFS sha256 at that revision (checked 2026-10-28). +4. What a B1g re-run needs (not pre-registered; a dated amendment merged before data): B1g once + through EAT's default balloon path (`balloon_policy_cpu=enabled`, with its CPU and memory + requests and limits), and Vq (vLLM v0.32.0, B1g's flags) as the harness control, so a stall + can be placed on the render, the engine version or the harness. Until then nothing here or in + the docs says EAT's stock vLLM stalls, or that k3d-gpu beats it. + ### H54d: not run (2026-10-21) No hold used, no cluster created. H54d's arm A is H54a's chosen arm A*, and H54a chose none (B1g @@ -3708,6 +3745,170 @@ B2q, X1q. Hold 2: X1q-mtp, Lsq, Sq, Sq-mtp, Rq (each only where its model was fe disk guard passes; the Intel q4km fetch runs between the holds). `ladder.py` now drops the chart render's empty documents (`--- null`, which kubectl rejects). Nothing else changes. +### H54b and H54c run (Arc Pro B70, 2026-10-21) + +Both rows are INCONCLUSIVE because their arms were not delivered as pre-registered: every +"one card" pod saw all four B70s. Recorded 2026-10-28 from the raw records of 2026-10-21; the +holds' REPRODUCE headers, NOTES and the two runner-bug errata were written on 2026-10-21. + +```text +# Reproduce +date: one lock for the campaign, 2026-10-21T21:12:26Z .. about 21:59Z (waited 5 min). + H54b hold 1 21:12:53Z .. 21:15:08Z (k3dgpu-g-h54b-1 deleted); q4km fetch + 21:15:08Z .. 21:17:58Z; H54b hold 2 21:17:58Z .. 21:38:45Z (k3dgpu-g-h54b-2); + H54c hold 1 21:38:45Z .. 21:57:40Z (k3dgpu-g-h54c-1). df / 94% at hold 1's + start, 95% after H54c (runs/*/pre.txt, post.txt). +pre-registered: H54 pre-registration; G1 (#166) and G1 revision 2 (#186, 9f81e008), both merged + before any H54b or H54c measurement +hypotheses: H54b, H54c +host: crescent: Intel(R) Xeon(R) 6741P, 96 CPUs, 1 socket, 1 NUMA node, microcode + 0xa000133; kernel 7.0.0-31-generic, in-tree xe; Docker 29.8.0; 4x Arc Pro B70 + (8086:e223; bdf 12:00.0, 48:00.0, 7c:00.0, 96:00.0), GuC 70.58.0 (compatibility + 1.30.1) on all four (REPRODUCE-supplement.txt, read 22:10Z) +k3d-gpu commit: 9f81e008 (bench/h54gpu at G1 revision 2), 0 uncommitted; k3d v5.9.0, kubectl + v1.35.2, helm v4.1.1; node image cryptoandcoffee/k3d-gpu:0.1.61@sha256:8cd264aa...e175c, + C1's K3D_GPU_K3S_ARGS +images: ghcr.io/ggml-org/llama.cpp:server-intel-b11749@sha256:ae2d41ba...81bd (Lsq, Cg, + Gg, Hg, Gg2); openvino/model_server:2026.4.1-gpu@sha256:a928903f...fc58 (X1q, + never started); intel/llm-scaler-vllm:1.5@sha256:52218ad8...fe3b (Sq, Rq, not + deliverable); busybox:1.37@sha256:bdf57e52...3f82e (placeholder pods). Discarded + smoke only: ghcr.io/ggml-org/llama.cpp:server-b11749@sha256:9fbaa06d...f312 +models: Intel/Qwen3.8-27B-q4km-AutoRound @ 4b30b30e: Qwen3.8-27B-Q4_K_M.gguf sha256 + 766892f84f85c3d1b90704424f90a33344983fa2959860496940bbd41041aad9 (16810714432 B); + google/gemma-4-26B-A4B-it-qat-q4_0-gguf @ d1c082be: gemma-4-26B_q4_0-it.gguf + sha256 3eca3b8f6d7baf218a7dd6bba5fb59a56ee25fe2d567b6f5f589b4f697eca51d; both + equal the Hub's LFS sha256 at those revisions (checked 2026-10-28). The bare + "model: edff6272..." line in each REPRODUCE is Intel/gemma-4-26B-A4B-it-int4- + AutoRound, which no H54b or H54c arm loads. Not fetched (disk): Qwen/Qwen3.8-27B + 1d4bf0f2, RedHatAI/Qwen3.8-27B-INT4 91bd022d +cards: CARDS=2,3, card 2 = renderD130 assigned to every pinned pod; qwen38-b-hr (cards + 2,3) stopped 21:12:32Z, started again 21:57:40Z, answered a chat 21:58:57Z. Every + pinned pod mounted renderD130 but listed card0-4 and renderD128-131 (*.dri) +command: CARDS=2,3 STOP_BHR=1 bench/h54gpu/campaign.sh "1:X1q" "f:Intel/Qwen3.8-27B-q4km- + AutoRound:4b30b30e...:24.7" "2:X1q-mtp Lsq" "c1:2"; python3 bench/h54gpu/score.py, + bench/h54gpu/predict.py +energy source: RAPL intel-rapl:0 package-0 via bench/energy.sh, per phase, 60 s idle before each arm +raw results: bench/h54gpu/results/2026-10-21/: H54b/ (hold1, hold2, smoke-hold1; score.json, + arms-score.json; Prometheus xe_vram_used_bytes and xe_clients exports 21:05-22:02Z; + NOTES), H54c/ (hold1 with verdict.json and the same exports; smoke-hold1, + smoke-hold1-failed-sa), runs/ (per hold pre.txt, post.txt, hold.log, + serving.jsonl; campaign and smoke logs), REPRODUCE-supplement.txt. Logs over 20 kB + are gzipped; kubeconfigs are not kept. On 2026-10-28 every file of + ~/k3dgpu-gemma/results/H54b and H54c on crescent (kubeconfigs aside) was compared + by sha256 with these: all 134 equal; the 25 run and smoke logs missing here were + copied then. +``` + +**Wiring smokes (discarded, not holds).** H54c: 00:06:58Z (Cg not created: the pod's service +account did not exist yet) and 00:15:13Z (Cg alone in the CPU image `server-b11749`, no card +mounted: 47.66 tok/s N=1 median). H54b: 03:46:41Z (placeholder pods and X1q's manifest render). + +**The placement failed: every pinned pod saw every card.** G1's pinned pods are privileged and +mount an in-memory `/dev/dri` holding only renderD130. Inside every one of them `/dev/dri` +listed card0-4 and renderD128-131 (`lsq.dri`, `cg.dri`, `gg.dri`, `hg.dri`, `gg2.dri`): a +privileged container gets the host's device nodes, and the empty directory hid none of them. +llama.cpp's log at this verbosity does not print its device list, so the split is read from +Prometheus `xe_vram_used_bytes` (GB; idle with `qwen38-b-hr` stopped -> peak in the window): + +| Window (UTC) | Arm | card1 (12:00.0, `qwen38-a-hr`) | card2 (48:00.0, `qwen38-a-hr`) | card3 (7c:00.0) | card4 (96:00.0) | +|---|---|---|---|---|---| +| 21:25-21:38 | Lsq (`-ngl 99`) | 17.27 -> 20.79 | 16.51 -> 19.99 | 0.00 -> 5.90 | 0.00 -> 6.42 | +| 21:42-21:45 | Cg (`-ngl 0`) | 17.27 -> 17.79 | 16.51 -> 16.53 | 0.00 -> 0.02 | 0.00 -> 0.02 | +| 21:46-21:49 | Gg (`-ngl 99`) | 17.27 -> 20.69 | 16.51 -> 19.29 | 0.00 -> 5.33 | 0.00 -> 5.44 | +| 21:50-21:53 | Hg (`-ngl 99 -ot exps=CPU`) | 17.27 -> 18.24 | 16.51 -> 17.06 | 0.00 -> 0.98 | 0.00 -> 1.52 | +| 21:54-21:57 | Gg2 (`-ngl 99`) | 17.27 -> 20.69 | 16.51 -> 19.29 | 0.00 -> 5.33 | 0.00 -> 5.44 | + +The hold-start card check missed this. It reads the host `fuser` table, and a device node inside +the container is a separate file, so the host never sees the engine holding the card. + +**Disclosure: a live service's cards were used, and a live service was stopped.** + +- `qwen38-a-hr` (cards 0 and 1 in its own numbering, card1 and card2 above) is a live SGLang + server. G1 allowed this campaign to stop `qwen38-b-hr` only, and says `qwen38-a-hr` is never + touched. The H54b and H54c pods put VRAM and compute on its two cards from 21:23:30Z to + 21:57:00Z (the first and last Prometheus samples above its baseline), about 34 minutes. That + was not authorised. It was serving in that window (its log shows 804 prefill batches), its log + has no error, exception or traceback line from 21:00Z to 22:05Z (read 2026-10-28), and its VRAM + read its baseline again at 21:59Z (17.27 and 16.51 GB). Its serving latency in that window was + not measured, so the impact on it is unknown, not zero. +- `qwen38-b-hr` was stopped at 21:12:32Z and started again at 21:57:40Z by this campaign's + `campaign.sh`, under G1's revision (operator-authorised). The campaign brief gave the stop and + restore of that pair to the main H50-H53 campaign, which was not asked first. It answered a + chat at 21:58:57Z. + +**H54b: what ran.** Hold 1: X1q. Hold 2: X1q-mtp, Lsq. + +- B2q, Sq, Sq-mtp: not deliverable (disk). `Qwen/Qwen3.8-27B` needs 55.6 GB plus B2q's 25 GB + guard, 80.6 GB. The fetch refused at 07:28Z (`runs/fetch-qwen-bf16.out`), and at the + campaign's start the 96% line left 68.3 GB (`runs/h54bc-predisk.txt`; NOTES records 75.9 GB + from another `df` reading). +- Rq: not deliverable (disk): 19.5 + 45 GB against about 57 GB left after the q4km fetch. +- X1q: a runner bug, not an engine result. `h54b.sh`'s `run_agent` calls `kubectl rollout + status`, `port-forward`, `exec` and `logs` without `-n k3d-gpu-agent`, and `k3d-gpu agent + manifest` puts the deployment in that namespace. Rollout status failed after 1 s (`X1q.log`: + `deployments.apps "ovms" not found in namespace "default"`). The raw `X1q.not-deliverable` + says "not deliverable in 900 s"; that text is wrong, and `X1q.ERRATUM.txt` sits beside it. +- X1q-mtp: a runner bug. `"${2:+K3D_GPU_AGENT_PREFIX_CACHING=false}"` at the start of a command + expands to a word, not an assignment ("command not found"), so the manifest never rendered + (`X1q-mtp.ERRATUM.txt`). + +| Arm | Status | N=1 decode tok/s (min-max) | N=4 / N=16 aggregate tok/s | TTFT s (803-word prompt) | GSM8K 0-49 | +|---|---|---|---|---|---| +| Lsq | ran on 4 cards, not as registered | 27.29 (27.21-27.50) | 55.86 / 55.70 | 1.57 | 48/50 | +| X1q, X1q-mtp | runner bug | none | none | none | none | +| B2q, Sq, Sq-mtp, Rq | not deliverable (disk) | none | none | none | none | + +Lsq's N=16 figure is N=4 capacity (`n_slots = 4` in its log). Every number in this table is +descriptive: a 4-card run, not a one-card or B70 result. + +**Verdict H54b: INCONCLUSIVE, not delivered as pre-registered.** `score.py` +(`H54b/score.json`) gives "no gate reference (B2q and Sq missing)". Apart from the scorer, no +arm ran on one card, so the statistic (one card against two) has no numerator either. The +2-hold cap is used. Against the predictions: B2q deliverable (0.4), not delivered; Lsq in +[12, 24] (0.5), 27.3 on four cards, not comparable; the others not run. + +**H54c: what ran.** One hold: Cg, Gg, Hg, Gg2, in `server-intel-b11749` with G1's base flags. + +| Arm | Flags | N=1 decode tok/s (min-max) | Package W during N=1 | Cards used | +|---|---|---|---|---| +| Cg | `-ngl 0` | 36.84 (36.56-36.98) | 264.7 | about 0.5 GB on card1, 0.02 GB on card3 and card4 | +| Gg | `-ngl 99` | 57.97 (57.36-59.06) | 130.1 | all four | +| Hg | `-ngl 99 -ot exps=CPU` | 56.33 (55.59-57.33) | 255.1 | all four (non-expert layers) | +| Gg2 | `-ngl 99` | 57.38 (57.20-57.45) | 130.2 | all four | + +Hg's log warns that CPU tensor overrides are in use, and the package drew about 255 W, so the +routed experts did run on the Xeon. Bytes per decoded token from the GGUF header: B_exp 0.803 GB, +B_rest 1.577 GB, B_tot 2.380 GB. + +**Verdict H54c: INCONCLUSIVE, not delivered as pre-registered** (the pre-registration's "any of +the three arms not delivered"). The model is a one-card byte split, and Gg, Hg and Gg2 were +4-card runs. `predict.py` (`H54c/hold1/verdict.json`) wrote INCONCLUSIVE through its 25-40% +band (measured/predicted 1.261), but that band reading is not the reason and is not a result: +t_Gg is a 4-card rate, and t_Cg (36.84) sits 23% below the CPU-image smoke's 47.66. With 47.66 +the same formula gives 49.2 tok/s and a ratio of 1.14, inside the SUPPORTED band, so the band +placement depends on one confounded input; the smoke ran another image, so 1.14 is a +sensitivity, not a result either. Why Cg decodes slower in the Intel image is not known; the +0.5 GB it placed on card1 is one candidate. The 1-hold cap is used. Against the predictions: +Hg < Gg (0.8), Gg in [30, 90] (0.4) and Hg/Cg in [0.8, 1.6] (0.5; 1.53) held on four cards; +none is a one-card reading. + +**What a re-run needs** (none is pre-registered; each needs a dated amendment merged before +data, with new hold caps for H54b and H54c, and must disclose that the 4-card numbers above, the +1.261 band reading and Lsq's rate have been seen): + +1. Pin the device inside the engine, not by hiding device nodes: `ONEAPI_DEVICE_SELECTOR` or + `ZE_AFFINITY_MASK`, or llama.cpp's `-sm none -mg`. +2. Check isolation from inside the pod before the phase: the engine's own device list shows + exactly one device, and `/dev/dri` lists only the assigned render node; fail the hold + otherwise. After each arm, read the per-card `xe_vram_used_bytes` delta and fail the arm if + any card but the assigned one moved. +3. Fix both `h54b.sh` bugs: the namespace on every kubectl call in `run_agent`, and + `K3D_GPU_AGENT_PREFIX_CACHING` set as an environment assignment. +4. Free disk for B2q and Sq, or record them not deliverable again. + +This is a result about this harness's placement, not about the B70, llama.cpp SYCL, OVMS or +llm-scaler. No number in this section is quoted as a one-card, hybrid or B70 result. + ### H57d amendment R1: the H57d runner, the read-only Od render and the hold length (2026-10-21) Recorded 2026-10-21, before any scored H57d request. Two wiring smokes ran first under the diff --git a/docs/intel.md b/docs/intel.md index 3af4be23..babf5be7 100644 --- a/docs/intel.md +++ b/docs/intel.md @@ -197,15 +197,19 @@ B70s with no flags; EAT stock against k3d-gpu on the Xeon CPU, with EAT's own OV as a third arm; EAT's #21 XPU path against k3d-gpu's `agent up` on the B70s; and agents per box. Rows land in [EXPERIMENTS.md](../EXPERIMENTS.md) before anything here quotes them. -Gemma 4 26B-A4B (QAT weights) rows on that Xeon. None is SUPPORTED, so this table states -direction only; the numbers, protocol and reproduce block are in the ledger. +H54 rows on that host: Gemma 4 26B-A4B (QAT weights) on the Xeon CPU, and split with a B70 +in H54c; Qwen3.8-27B on the B70s in H54b. None is SUPPORTED, so this table states direction +only; the numbers, protocol and reproduce block are in the ledger. H54b and H54c ran with a +placement failure (their "one card" pods used all four B70s), so neither says anything about +one B70. | Row | Measurement | Verdict | |----|-------------|--------| -| [ledger:H54a] | Single-stream decode, engine by engine, against EAT's stock vLLM CPU (bf16 QAT weights). EAT's stock arm stalled mid-decode in both holds under this harness (cause open), so nothing was scored against it. Of the arms measured, llama.cpp CPU on Google's QAT Q4_0 GGUF decoded ahead of k3d-gpu's OVMS arms, and its QAT MTP drafter added a little on top | INCONCLUSIVE | +| [ledger:H54a] | Single-stream decode, engine by engine, against EAT's stock vLLM CPU (bf16 QAT weights). The stock arm, as this harness rendered it (no CPU balloon, requests or limits), stalled mid-decode in both holds (cause open), so nothing was scored against it. Of the arms measured, llama.cpp CPU on Google's QAT Q4_0 GGUF decoded ahead of k3d-gpu's OVMS arms, and its QAT MTP drafter added a little on top | INCONCLUSIVE | | [ledger:H54d] | The best H54a arm inside EAT's banking flow: not run, since H54a chose no arm | INCONCLUSIVE | | [ledger:H54q] | Whether the QAT-matched int4 IR keeps the bf16 QAT quality and OpenVINO's base-model IR does not | PENDING | -| [ledger:H54c] | Experts in the Xeon's DRAM and the rest on one B70, against a byte-split model | PENDING | +| [ledger:H54b] | Qwen3.8-27B on Arc Pro B70, the best one-card arm against EAT #21's two-card XPU path. No one-card arm was delivered: the arms on Qwen bf16 or RedHat int4 weights did not fit the shared disk, two OVMS arms hit runner bugs, and llama.cpp SYCL's "one card" pod saw and used all four cards | INCONCLUSIVE | +| [ledger:H54c] | Experts in the Xeon's DRAM and the rest on one B70, against a byte-split model. The experts ran on the Xeon, but every GPU arm spread over all four cards (the same placement failure), so the one-card model was not tested | INCONCLUSIVE | Facts from `0ecf67a` that shape a k3d run: diff --git a/docs/intel/technical-report.md b/docs/intel/technical-report.md index 7492fe9a..ab5a2753 100644 --- a/docs/intel/technical-report.md +++ b/docs/intel/technical-report.md @@ -1,17 +1,17 @@ # k3d-gpu on Intel hardware: technical report -Status: working report, 2026-10-21. Ledger: [EXPERIMENTS.md](../../EXPERIMENTS.md), verdicts as of the H54a run (74 rows). +Status: working report, 2026-10-28. Ledger: [EXPERIMENTS.md](../../EXPERIMENTS.md), verdicts as of the H54b and H54c runs (74 rows). ## Abstract k3d-gpu turns one Linux host into a single-node k3s cluster (k3d) that detects the host's Intel hardware and configures it. It sets NRI balloons for hybrid P/E and NUMA CPUs, device plugins for iGPU, dGPU, NPU, DSA, IAA, QAT and Gaudi, and placement labels for agent and inference pods. -This report covers what was measured, and how. Every result but H52, H25x, H27x, H34x, H54a and H54d (a Xeon 6741P host) comes from one host: an i9-13900T (Raptor Lake-S, 8 P-cores and 16 E-cores, UHD 770 iGPU with no XMX, AVX-VNNI, no AMX, no NPU). It is a T-SKU rated at 35 W base power, but its firmware runs PL1 = PL2 = 117 W, so it does not run the T-series 35 W envelope. +This report covers what was measured, and how. Every result but H52, H25x, H27x, H34x, H54a, H54b, H54c and H54d (a Xeon 6741P host, the B70 rows on its Arc Pro B70s) comes from one host: an i9-13900T (Raptor Lake-S, 8 P-cores and 16 E-cores, UHD 770 iGPU with no XMX, AVX-VNNI, no AMX, no NPU). It is a T-SKU rated at 35 W base power, but its firmware runs PL1 = PL2 = 117 W, so it does not run the T-series 35 W envelope. - Seventeen hypotheses are SUPPORTED. Sixteen are scoped to that host; H25x is H25 replicated on the Xeon 6741P. H57dm (the Gemma 4 QAT MTP drafter speeds llama.cpp decode on the P-cores) is the newest. - Fourteen are REFUTED. Six of them changed shipped defaults. -- 23 are INCONCLUSIVE, mostly because the shared host throttles or its load was unmatched. H54a and H54d (Gemma 4 26B-A4B QAT on the Xeon 6741P) are INCONCLUSIVE because EAT's stock vLLM CPU arm stalled in both of H54a's holds, so no arm could be scored against it. H57da (k3d-gpu's OVMS pick vs llama.cpp for Gemma 4 QAT on the i9-13900T) did not resolve: the strictly pinned llama.cpp arms tracked host load; H57db did not run (memory). -- 20 are PENDING: the Xeon 6741P rows H50, H50o, H51, H52b, H53, H54q, H54b, H54c and the zero-touch thesis row H58, the cross-host replication H28x, H55 (SLO-gated admission of an E-core neighbour on the i9-13900T), H56 (two holds at once in cpuset slices of the Xeon 6741P), and the second client host's (wildct, i7-13700) rows H52w, H18w, H25w, H28w, H34w, H57wa, H57wm and H57wb, pre-registered and not yet run. H52, the first row run on that host (a Xeon 6741P with four Arc Pro B70s), is REFUTED. H27x, H27 re-run on the Xeon (AMX), is REFUTED as on the i9. H34x, H34 re-run there, is REFUTED: the CPU Fast Draft that sped up the i9 slowed decode on the Xeon. +- 25 are INCONCLUSIVE, mostly because the shared host throttles or its load was unmatched. H54a and H54d (Gemma 4 26B-A4B QAT on the Xeon 6741P) are INCONCLUSIVE because the stock vLLM CPU arm, as this harness rendered EAT's entry (no CPU balloon, requests or limits), stalled in both of H54a's holds (cause open), so no arm could be scored against it. H54b and H54c (one Arc Pro B70 against two, and experts in DRAM with the rest on one B70) are INCONCLUSIVE because their "one card" pods saw all four cards, so no arm was delivered as pre-registered. H57da (k3d-gpu's OVMS pick vs llama.cpp for Gemma 4 QAT on the i9-13900T) did not resolve: the strictly pinned llama.cpp arms tracked host load; H57db did not run (memory). +- 18 are PENDING: the Xeon 6741P rows H50, H50o, H51, H52b, H53, H54q and the zero-touch thesis row H58, the cross-host replication H28x, H55 (SLO-gated admission of an E-core neighbour on the i9-13900T), H56 (two holds at once in cpuset slices of the Xeon 6741P), and the second client host's (wildct, i7-13700) rows H52w, H18w, H25w, H28w, H34w, H57wa, H57wm and H57wb, pre-registered and not yet run. H52, the first row run on that host (a Xeon 6741P with four Arc Pro B70s), is REFUTED. H27x, H27 re-run on the Xeon (AMX), is REFUTED as on the i9. H34x, H34 re-run there, is REFUTED: the CPU Fast Draft that sped up the i9 slowed decode on the Xeon. - Every other Intel family is detected and configured in fixture tests only. None has a measurement. No world-first, superlative or priority claim is made; [docs/provenance.md](../provenance.md) supports none. @@ -100,8 +100,10 @@ The host is a shared, live machine: about 53 other containers, about 80 W idle p | H26 | E-core L2-cluster confinement of a DRAM-bandwidth neighbour: the measured R (p95 inflation, cluster over spread) was 0.83, CI 0.61-0.87, at `typical` background load, which is not a verdict [ledger:H26] | Background load unmatched across arms at both levels (hog carry-over into the load windows; the `heavy` load was removed mid-run) | | H41, H42, H44, H46 | Agent benchmark on Intel's EAT banking flow (B24) and BFCL S100 at `typical` load. The k3d-gpu CPU stack (OVMS int4, P-cores) passed 20/24 banking tasks (task median 15.6 s); the RTX 4000 AWQ stack finished them in 0.12x that time; EAT's stock vLLM CPU bf16 stack finished 1 of 24 in its hold. BFCL S100 in server-fc mode: OVMS int4 passed 81 of 100 ids, bf16 on vLLM CUDA 88 of 100. Heavy E-core load stretched the CPU stack's p95 turn 2.59x (CI 0.87-2.94) [ledger:H41] [ledger:H42] [ledger:H44] [ledger:H46] | Background load unmatched across holds (swap use and throttle on the shared host); each arm ran one block, not ABBA; B1's J per success undefined | | H47b, H49b | H47 and H49 re-run with pairs matched on idle pre-windows (load rule L2). H47b: on its 4 matched pairs a CPU draft shortened B24 task time (4 pairs: direction only). H49b: on its 3 matched pairs A1 passed 3/3 and EAT's stock vLLM CPU stack 1/3; across all 23 complete pairs, not gated, 19/23 vs 5/23 [ledger:H47b] [ledger:H49b] | Idle pre-windows did not agree within amendment 27's tolerances: 4 of 10 and 3 of 23 pairs matched (throttle/min and load-CPU busy noise) | -| H54a | Gemma 4 26B-A4B QAT single-stream on the Xeon 6741P, engine by engine. At batch 1, llama.cpp CPU on Google's QAT Q4_0 GGUF decoded ahead of k3d-gpu's OVMS arms (the QAT-matched IR and OpenVINO's published IR), and its QAT MTP drafter added a little on top. EAT's stock vLLM CPU arm stalled mid-decode in both holds, cause open (direction only; numbers in the ledger) [ledger:H54a] | The stock arm has no measured phase or score, so the pre-registered ratio and quality gate have no base; five arms were not reached in the 3-hold cap; every optimized number depends on amendment R4's void rule | +| H54a | Gemma 4 26B-A4B QAT single-stream on the Xeon 6741P, engine by engine. At batch 1, llama.cpp CPU on Google's QAT Q4_0 GGUF decoded ahead of k3d-gpu's OVMS arms (the QAT-matched IR and OpenVINO's published IR), and its QAT MTP drafter added a little on top. The stock vLLM CPU arm, as this harness rendered EAT's entry, stalled mid-decode in both holds, cause open (direction only; numbers in the ledger) [ledger:H54a] | The stock arm has no measured phase or score, so the pre-registered ratio and quality gate have no base; five arms were not reached in the 3-hold cap; every optimized number depends on amendment R4's void rule | | H54d | Not run: H54a chose no arm to put in EAT's banking flow [ledger:H54d] | Its arm A is undefined and its arm B is the arm that stalled | +| H54b | Qwen3.8-27B on Arc Pro B70: the best one-card arm against EAT #21's two-card XPU path. Nothing one-card was delivered: the arms on Qwen bf16 or RedHat int4 weights did not fit the disk, two OVMS arms failed on runner bugs, and llama.cpp SYCL ran on all four cards (direction only) [ledger:H54b] | Placement failure (the pinned pod saw every card) and no gate reference | +| H54c | Gemma 4 QAT with routed experts in the Xeon's DRAM and the rest on a B70, against a byte-split model. The experts did run on the Xeon, but every GPU arm split its layers over four cards, so the one-card model was never tested (direction only) [ledger:H54c] | Placement failure; the CPU-only input is confounded too | The external bake-offs are in the tables above: the Ollama, llama.cpp and plain OVMS ones are all decided. @@ -124,7 +126,7 @@ The external bake-offs are in the tables above: the Ollama, llama.cpp and plain ## Limitations -1. **One host.** Every measurement but the Xeon 6741P rows named in the abstract is one i9-13900T. No result transfers to another family without its own row. The campaign on that Xeon 6741P (Granite Rapids, AMX) with 4x Arc Pro B70 is in progress; its Gemma 4 microbench row H54a has no scored stock arm yet. +1. **One host.** Every measurement but the Xeon 6741P rows named in the abstract is one i9-13900T. No result transfers to another family without its own row. The campaign on that Xeon 6741P (Granite Rapids, AMX) with 4x Arc Pro B70 is in progress; its Gemma 4 microbench row H54a has no scored stock arm yet, and its B70 rows H54b and H54c ran with a placement failure (every pod saw all four cards). 2. **Shared, throttling host.** The host is live and shared, and the package throttles under the probes' own load. Most INCONCLUSIVE verdicts come from this. H22 throttles itself, so it is barred from this host. 3. **The XMX half of the device rule is untested.** H6 supports "stay on the P-cores when the iGPU has no XMX". Whether the iGPU wins when it has XMX is an open prediction. 4. **Small n.** Most SUPPORTED rows are n=3 per arm, so they show direction and correctness, not effect-size precision. From 6cbc2632ff9f367953745aac8a321febccbcba64 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:40:31 -0700 Subject: [PATCH 23/85] bench(h54): the B1g stall diagnostic samples the spinning thread and takes a control env Run 1 found one engine thread still running while every other thread slept, and py-spy's native unwinder failed on this image. On a stall the watcher now takes 5 s of perf call graphs of each engine thread still in state R (the step run 1 did by hand) and dumps Python stacks without --native. DIAG_EXTRA_ENV adds environment to B1g's for a labelled control run, never a stock one. The first CPU sample no longer divides by a near-zero interval. --- bench/h54/diag/b1g-stall.sh | 8 ++++++-- bench/h54/diag/b1g_diag.py | 29 +++++++++++++++++++++++++++-- bench/h54/diag/test_b1g_diag.py | 13 +++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/bench/h54/diag/b1g-stall.sh b/bench/h54/diag/b1g-stall.sh index 1d486774..0786c139 100755 --- a/bench/h54/diag/b1g-stall.sh +++ b/bench/h54/diag/b1g-stall.sh @@ -8,8 +8,9 @@ # chat-template ConfigMap, user 1001, read-only root, capabilities, no CPU or memory request or # limit) with plain `docker run` instead of k3d, sends sequential 256-token greedy requests with # the harness client (bench/llm_load.py, the H54a N=1 settings), and watches vLLM's /metrics. -# On a stall it records each thread of the container's processes twice, 10 s apart, and a -# py-spy dump of each process, then waits for the engine to die or 400 s. +# On a stall it records each thread of the container's processes twice, 10 s apart, 5 s of perf +# call graphs of each engine thread still running, and a py-spy dump of each process, then waits +# for the engine to die or 400 s. DIAG_EXTRA_ENV adds env to B1g's for a labelled control run. # # Box rules: the exclusive bench lock (~/k3dgpu-bench.lock, the K=1 hold lock), the hold-start # rule (load1 <= 12 and no aiperf process, else wait up to 30 min, then refuse), the 97% disk @@ -67,6 +68,9 @@ snapshot > "${OUT}/pre.txt" echo "py-spy: $(${DIAG_PYSPY} --version 2>&1)"; uname -r; nproc; } > "${OUT}/reproduce.txt" 2>&1 ${PY} "${D}/b1g_diag.py" render "${DEPLOY}" "${OUT}/render" || { log "render failed"; exit 2; } +# DIAG_EXTRA_ENV: space-separated KEY=VALUE pairs added to B1g's env (a control run, never stock). +for kv in ${DIAG_EXTRA_ENV:-}; do echo "${kv}" >> "${OUT}/render/env.list"; done +echo "extra env: ${DIAG_EXTRA_ENV:-none}" >> "${OUT}/reproduce.txt" mapfile -t ARGS < <(${PY} -c 'import json,sys; print("\n".join(json.load(open(sys.argv[1]))))' "${OUT}/render/args.json") cleanup() { docker logs "${NAME}" > "${OUT}/server.log" 2>&1 diff --git a/bench/h54/diag/b1g_diag.py b/bench/h54/diag/b1g_diag.py index dd194f4f..664c6452 100755 --- a/bench/h54/diag/b1g_diag.py +++ b/bench/h54/diag/b1g_diag.py @@ -184,13 +184,36 @@ def _sudo_self(*args): def pyspy(pid, outfile): if not PYSPY: return "DIAG_PYSPY unset" - p = subprocess.run(["sudo", "-n", PYSPY, "dump", "--pid", str(pid), "--native", "--locals"], + # No --native: on this image py-spy 0.4.2's unwinder stops with UNW_EBADREG (run1, 2026-10-29). + p = subprocess.run(["sudo", "-n", PYSPY, "dump", "--pid", str(pid)], capture_output=True, text=True, timeout=180) with open(outfile, "w") as f: f.write(f"# rc={p.returncode}\n{p.stdout}\n# stderr\n{p.stderr}") return p.returncode +def running_threads(snapfile): + """(tid, comm) of every engine thread in state R in a snapshot file; [] when it is missing.""" + try: + rec = json.load(open(snapfile)) + except (OSError, ValueError): + return [] + return [(t["tid"], p["comm"]) for p in rec["procs"] if p["comm"].startswith("VLLM::") + for t in p["threads"] if t["state"] == "R"] + + +def perf_thread(tid, outdir): + """5 s of perf samples (call graphs) of one running thread, and its report.""" + data = os.path.join(outdir, f"perf-{tid}.data") + rec = subprocess.run(["sudo", "-n", "perf", "record", "-t", str(tid), "-g", "-F", "999", "-o", data, + "--", "sleep", "5"], capture_output=True, text=True, timeout=60) + rep = subprocess.run(["sudo", "-n", "perf", "report", "-i", data, "--stdio", "--no-children"], + capture_output=True, text=True, timeout=120) + with open(os.path.join(outdir, f"perf-{tid}-report.txt"), "w") as f: + f.write(f"# perf record rc={rec.returncode}: {rec.stderr.strip()}\n{rep.stdout}") + return rec.returncode + + def watch(url, cgroup, outdir, client_pid, root_pid): with open(os.path.join(outdir, "watch.jsonl"), "a") as log: return _watch(log, url, cgroup, outdir, client_pid, root_pid) @@ -206,7 +229,7 @@ def _watch(log, url, cgroup, outdir, client_pid, root_pid): except Exception as e: # the server going away is itself a record m = {"gen": None, "running": None, "error": f"{e.__class__.__name__}: {e}"} cg = cg_usage(cgroup) - cpu = None if (cg is None or last_cg is None) else (cg - last_cg) / 1e6 / max(now - last_t, 1e-6) + cpu = None if (cg is None or last_cg is None or now - last_t < 1) else (cg - last_cg) / 1e6 / (now - last_t) last_cg, last_t = cg, now if m.get("gen") is not None and m["gen"] != last_gen: last_gen, last_change = m["gen"], now @@ -219,6 +242,8 @@ def _watch(log, url, cgroup, outdir, client_pid, root_pid): time.sleep(gap) p = _sudo_self("snap", str(root_pid), os.path.join(outdir, f"threads-{i}.json")) stall[f"snap_{i}_rc"] = p.returncode + for tid, _ in running_threads(os.path.join(outdir, "threads-b.json"))[:4]: + stall[f"perf_{tid}"] = perf_thread(tid, outdir) for pid in tree(root_pid): stall[f"pyspy_{pid}"] = pyspy(pid, os.path.join(outdir, f"pyspy-{pid}.txt")) with open(os.path.join(outdir, "stall.json"), "w") as f: diff --git a/bench/h54/diag/test_b1g_diag.py b/bench/h54/diag/test_b1g_diag.py index 7a4e9f87..d3ae05f0 100644 --- a/bench/h54/diag/test_b1g_diag.py +++ b/bench/h54/diag/test_b1g_diag.py @@ -78,6 +78,19 @@ def test_snapshot_of_a_live_tree(self): child.wait() +class RunningThreads(unittest.TestCase): + def test_only_engine_threads_in_state_r(self): + rec = {"procs": [ + {"comm": "VLLM::Worker", "threads": [{"tid": 1, "state": "R"}, {"tid": 2, "state": "S"}]}, + {"comm": "VLLM::EngineCor", "threads": [{"tid": 3, "state": "S"}]}, + {"comm": "python3", "threads": [{"tid": 4, "state": "R"}]}]} + with tempfile.TemporaryDirectory() as t: + f = os.path.join(t, "threads-b.json") + json.dump(rec, open(f, "w")) + self.assertEqual(b1g_diag.running_threads(f), [(1, "VLLM::Worker")]) + self.assertEqual(b1g_diag.running_threads(os.path.join(t, "missing.json")), []) + + class Stub(http.server.BaseHTTPRequestHandler): gen = [0.0] frozen = [False] From 35f0f027689f38eb83dff12c94aec0bf2d4a6554 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:40:33 -0700 Subject: [PATCH 24/85] docs: H52b note, qualify the deflate-iaa selftest read The host-state block quoted /proc/crypto's "selftest : passed" for deflate-iaa as if a self-test had run. None did. crescent's kernel has CONFIG_CRYPTO_SELFTESTS not set, and in that build the v7.0 crypto API sets CRYPTO_ALG_TESTED at registration without a test (crypto/algapi.c 278-280, 347); crypto/proc.c 49-51 then prints "passed" for any algorithm with that flag. Keep the raw read, mark it, and add a paragraph with the config read and the kernel source lines. --- docs/intel/h52b-iaa.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/intel/h52b-iaa.md b/docs/intel/h52b-iaa.md index 29543b13..afd9fa89 100644 --- a/docs/intel/h52b-iaa.md +++ b/docs/intel/h52b-iaa.md @@ -33,11 +33,23 @@ dsa0 dsa2 dsa4 state=disabled max_work_queues_size=256 pasid_enabled=1 (no iax1 iax3 iax5 state=enabled max_work_queues_size=256 pasid_enabled=1 wq1.0 wq3.0 wq5.0 size=256 state=enabled type=kernel name=iaa_crypto driver=crypto zswap enabled=N compressor=lzo -/proc/crypto deflate-iaa: refcnt 1, selftest passed +/proc/crypto deflate-iaa: refcnt 1, selftest "passed" (no self-test ran, see below) /dev/iax, /dev/dsa: absent accel-config: not on PATH and not in /usr/bin, /usr/local/bin, /usr/sbin, /usr/local/sbin, /bin, /sbin ``` +The `selftest : passed` field in `/proc/crypto` is not evidence that `deflate-iaa` +works. No self-test ran. crescent's kernel config reads +`# CONFIG_CRYPTO_SELFTESTS is not set` (`/boot/config-7.0.0-31-generic`, read-only +`ssh crescent`, 2026-10-29 05:39 UTC; the #198 pre-check records the same). In such a +build, `crypto_alloc_test_larval` returns no test larval, and `__crypto_register_alg` +then sets `CRYPTO_ALG_TESTED` on the algorithm without a test +([crypto/algapi.c, v7.0](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/crypto/algapi.c?h=v7.0), +lines 278-280 and 347). `c_show` prints `passed` for any algorithm that carries that +flag ([crypto/proc.c, v7.0](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/crypto/proc.c?h=v7.0), +lines 49-51). The line shows only that `deflate-iaa` is registered. Its compression +is unverified (item 4 below). + This matches the H52 inventory and the [#198 pre-check](../../bench/eatflow/results/2026-10-21/H52b/roundtrip-iax1/README.md). ## What host-setup does on that state From 0f0e1151d259649784f46020f4a89ba401fe2146 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:44:08 -0700 Subject: [PATCH 25/85] ledger(H57dp): amendment R2, the bench lock, the hybrid vendor, the quality records and the Reproduce header Follows amendment R1 on the H57dp pre-registration branch, before any H57dp hold. Every H57dp step takes LOCK=$HOME/k3dgpu-bench.lock, the lock this host's H55 runner takes, in place of the old scratchpad live.lock, and every hold runs with H57D_ROW=H57dp so H57d's spare-hold logic never reads one. The models are H57d's revisions downloaded again and checked against the committed weights.sha256, with the rebuilt drafter Q4_0 expected at 8eb21d5b7efad6e9 and 321,145,696 bytes. scripts/k3d-gpu now includes PR #180, so the hybrid vendor no longer deploys the intel-gpu-plugin H57d disclosed. score-p now reports the inherited quality records read from the committed H57d quality hold (Ld-mtp's stands for Ld-mtp-u, Od's for Od); neither row is gated on them. reproduce.sh's engine-flags line was a SyntaxError in every Python version, so all four H57d reproduce.txt files lack that block; it now prints one line per rendered arm. New tests cover the records, the bare spare-hold and smoke refusals in hold.sh, and the Reproduce header with stand-in docker, kubectl and k3d. The hold.sh and reproduce tests fail against main's scripts. --- EXPERIMENTS.md | 73 +++++++++++++++++++++++++ bench/h57d/h57d.py | 38 +++++++++++--- bench/h57d/reproduce.sh | 2 +- bench/h57d/test_h57d.py | 114 ++++++++++++++++++++++++++++++++++++++-- 4 files changed, 215 insertions(+), 12 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index ca8b07d2..6d8b215f 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -3966,6 +3966,79 @@ python3 bench/h57d/h57d.py score-p ~/k3dgpu-h57d/results/H57dp > verdict.json Holds as registered: 2, each at most 75 min (`timeout -k 30 4500`), with H57d's start rule, floors, watchdog and cluster deletion. +### H57dp amendment R2: the bench lock, the hybrid vendor, the quality records and the Reproduce header (2026-10-28) + +Recorded 2026-10-28, before any H57dp or H57de measurement: no H57dp hold, smoke or request has +run. It follows +[H57dp amendment R1](#h57dp-amendment-r1-the-ld-mtp-u-render-the-two-hold-scorer-and-an-affinity-check-2026-10-28). +Nothing here changes either row's arms, model files, statistic, thresholds, gates, hold count, +hold orders or prediction. + +**Lock.** Every H57dp step that loads the CPU (`convert.sh`, the smoke, both holds) takes +`LOCK=$HOME/k3dgpu-bench.lock`. It replaces the scratchpad `live.lock` that H57d's commands and +R1's name. That file lived in one session's scratchpad directory. This host's H55 runner +(`bench/admission/run.sh`) takes `~/k3dgpu-bench.lock` by default, as `bench/h54`, +`bench/xhost` and the crescent holds do on their hosts, so a hold on any other lock would not +exclude it. `hold.sh` and `convert.sh` are unchanged: both still require `LOCK` to be set. + +**Row.** Every H57dp command runs with `H57D_ROW=H57dp`. The records go to +`${G}/results/H57dp/hold1` and `hold2`, the two holds left of H57d's 6-hold cap, numbered within +their own row. H57d's `hold_dirs`, and with it the spare-hold rule (`hold5/repeats`), reads only +`results/H57d`, so it never sees an H57dp hold. + +**Spare-hold guard.** H57d's hold 5 is its spare: it repeats a failed hold's arms, which must be +named. Before R1, `hold.sh 5 perf` with no arms read an empty order (H57d registers orders 1-4), +took the lock and ran a hold with no arms, which would use up a counted hold. Since R1 `h57d.py +order` exits non-zero for a hold the row does not register, and `hold.sh` exits 2 before the +lock with nothing written. R2 adds the tests: a bare hold 5 under H57d, H57w and H57dp, and a +bare smoke, are refused; with arms named, hold 5 and the smoke go on to the lock. Run against +main's `hold.sh` the refusal test fails, because the bare hold 5 reached the lock with an empty +arm list. + +**Models.** As R1. H57d's revisions are downloaded again, and every LFS file is checked against +the committed `bench/h57d/results/2026-10-21/weights.sha256` (10 files). The drafter is rebuilt +by `convert.sh` and must equal H57d's Q4_0: sha256 beginning `8eb21d5b7efad6e9` (H57d's records +keep that 16-digit prefix) and 321,145,696 bytes. A mismatch stops the campaign before hold 1 and +is recorded. + +**Hybrid vendor.** H57d ran at `458bca0e`, before PR #180, and its confounds record that +`K3D_GPU_VENDORS=hybrid` still deployed the node image's baked intel-gpu-plugin. The runner calls +this repository's `scripts/k3d-gpu up`, which includes #180 (`06aa321c`) from this commit on. +`hybrid` alone does not make intel active, so `up` creates the cluster with +`--disable=intel-gpu-plugin@server:0` and `--disable=intel-gpu-dra@server:0` (the branch #180's +tests cover with `K3D_GPU_VENDORS=none` and `auto,-intel`), and no intel-gpu-plugin runs on an +H57dp node. No arm requests a `gpu.intel.com` resource either way. The change applies to all +three H57dp arms alike; the run section discloses it beside any comparison with H57d's numbers. + +**Quality records.** `score-p` now reads the inherited records from the committed H57d quality +hold instead of quoting them: `results/2026-10-21/hold4/Ld-mtp/quality.json` for Ld-mtp-u and +Ld-mtp, and `hold4/Od/quality.json` for Od (50/50 each). They are reported under +`quality_records`. As registered and as in R1, neither row has a quality gate, so the records +change no verdict. + +**Reproduce header.** The engine-flags line of `reproduce.sh` was not valid Python (a backslash +inside an f-string expression), so every H57d `reproduce.txt` shows a `SyntaxError` where the +block belongs. R1's statement that `reproduce.sh` prints Ld-mtp-u's flags held only after this +fix. The flags H57d ran are in each arm's `deploy.yaml`. The line now prints one line per +rendered arm (Ld, Ld-mtp, Ld-mtp-u). + +**Files and tests.** `bench/h57d/h57d.py` (`inherited_quality`, `score-p`'s `quality_records`), +`bench/h57d/reproduce.sh` (the flags line) and `bench/h57d/test_h57d.py`, in CI: the records +against the committed hold 4 files, a missing record, verdicts unchanged under a low inherited +score, the spare-hold and smoke guards, and the Reproduce header run with stand-in +`docker`/`kubectl`/`k3d` (it failed before the fix with the same `SyntaxError`). + +**Commands** (`SUDO_ASKPASS` for RAPL): + +```bash +cd ~/k3dgpu-h57d/models && awk '{print $1 " " $2}' /bench/h57d/results/2026-10-21/weights.sha256 | sha256sum -c +LOCK=~/k3dgpu-bench.lock G=~/k3dgpu-h57d bench/h57d/convert.sh # drafter GGUF + Od's graph.pbtxt +sha256sum ~/k3dgpu-h57d/models/k3dgpu/gemma-4-26B-A4B-it-qat-assistant-gguf/gemma-4-26B-A4B-it-qat-assistant-q4_0.gguf # 8eb21d5b7efad6e9... +SMOKE=1 LOCK=~/k3dgpu-bench.lock bench/h57d/hold.sh smoke-p perf Ld-mtp-u # wiring smoke, discarded +for h in 1 2; do LOCK=~/k3dgpu-bench.lock H57D_ROW=H57dp bench/h57d/hold.sh $h perf; done +python3 bench/h57d/h57d.py score-p ~/k3dgpu-h57d/results/H57dp > verdict.json +``` + ### Wildct pre-registration: client Raptor Lake (i7-13700, 2026-10-20) Written 2026-10-20, before any H52w, H18w, H25w, H28w, H34w or H57w measurement on this host. diff --git a/bench/h57d/h57d.py b/bench/h57d/h57d.py index 98e1a08d..712c7acf 100644 --- a/bench/h57d/h57d.py +++ b/bench/h57d/h57d.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """h57d.py: the H57d runner's arm table and renders, P-core load sampler, load gate and -scorers (EXPERIMENTS.md "H57d pre-registration", "H57d amendment R1", "H57dp pre-registration" -and "H57dp amendment R1"). +scorers (EXPERIMENTS.md "H57d pre-registration", "H57d amendment R1", "H57dp pre-registration", +"H57dp amendment R1" and "H57dp amendment R2"). h57d.py arms the arm table as JSON h57d.py field ARM KEY one field of an arm (for arm.sh) @@ -12,7 +12,8 @@ h57d.py sample OUT.jsonl NODE every 5 s until killed: P-core (CPUs 0-15) busy CPU-s/s, the k3d node container's CPU-s/s, load1, package C h57d.py score RESULTS_DIR the H57da and H57dm verdicts from the recorded holds - h57d.py score-p RESULTS_DIR the H57dp and H57de verdicts from the two H57dp holds + h57d.py score-p RESULTS_DIR the H57dp and H57de verdicts from the two H57dp holds, with + the quality records they inherit from H57d hold 4 The GSM8K grader, the bootstrap and the 1,000-token TTFT prompt are H54's (bench/h54). Python 3 standard library only, except render (PyYAML).""" @@ -57,6 +58,10 @@ P_ORDERS = {1: ["Ld-mtp-u", "Od", "Ld-mtp"], 2: ["Ld-mtp", "Ld-mtp-u", "Od"]} P_QUALITY = ("inherited, not re-measured (H57dp pre-registration): H57d's Ld-mtp record (50/50) " "stands for Ld-mtp-u and Od's (50/50) for Od; neither row has a quality gate here") +# Where each H57dp arm's inherited quality record is: H57d's committed quality hold (H57dp +# amendment R2). Ld-mtp-u runs Ld-mtp's binary, model files and greedy settings. +H57D_RESULTS = os.path.join(HERE, "results", "2026-10-21") +P_QUALITY_FROM = {"Ld-mtp-u": "Ld-mtp", "Ld-mtp": "Ld-mtp", "Od": "Od"} def orders(row): @@ -358,12 +363,28 @@ def single_cpu_threads(cpus_txt): return out -def score_p(results): +def inherited_quality(res=H57D_RESULTS): + """{arm: the quality record H57dp inherits}, read from res/hold4// + quality.json (None when that arm was not measured there).""" + out = {} + for arm, src in P_QUALITY_FROM.items(): + ad = os.path.join(res, "hold4", src) + q = os.path.join(ad, "quality.json") + if not (measured(ad) and os.path.exists(q)): + out[arm] = None + continue + qq = jload(q) + out[arm] = {"from": f"H57d hold 4, {src}", "correct": qq["correct"], "n": qq["n"], "score": qq["score"]} + return out + + +def score_p(results, quality_from=H57D_RESULTS): """H57dp (Ld-mtp-u vs Ld-mtp) and H57de (Ld-mtp-u vs Od) from results/hold1 and hold2. As H57d: an arm is delivered when it was measured in every hold, and one load gate covers the - delivered arms. Quality is inherited (P_QUALITY), so neither row is gated on it. Affinity - check, per hold, from cpus.txt: Ld-mtp's single-CPU threads sit exactly on MASK's CPUs and - Ld-mtp-u has none; a row whose arm fails it, or has no table, is INCONCLUSIVE.""" + delivered arms. Quality is inherited (P_QUALITY; the records, from quality_from, are + reported), so neither row is gated on it. Affinity check, per hold, from cpus.txt: Ld-mtp's + single-CPU threads sit exactly on MASK's CPUs and Ld-mtp-u has none; a row whose arm fails + it, or has no table, is INCONCLUSIVE.""" holds = (1, 2) hd = {k: os.path.join(results, f"hold{k}") for k in holds} arms = collect(results, P_ARMS, holds, hd, quality_hold=None) @@ -374,7 +395,8 @@ def score_p(results): got = {k: single_cpu_threads(os.path.join(hd[k], a, "cpus.txt")) for k in holds} aff[a] = {"single_cpu_threads": got, "as_registered": all(g is not None and set(g) == want for g in got.values())} rep = {"arms": {k: {x: v for x, v in a.items() if x not in ("decode", "foreign", "quality")} for k, a in arms.items()}, - "delivered": dl, "quality": P_QUALITY, "affinity": aff, "load_gate": lg} + "delivered": dl, "quality": P_QUALITY, "quality_records": inherited_quality(quality_from), + "affinity": aff, "load_gate": lg} u = arms["Ld-mtp-u"] def precheck(den): diff --git a/bench/h57d/reproduce.sh b/bench/h57d/reproduce.sh index b1734774..88e90d7a 100644 --- a/bench/h57d/reproduce.sh +++ b/bench/h57d/reproduce.sh @@ -31,4 +31,4 @@ echo "file sha256:" sed 's/^/ /' "${G}/weights.sha256" 2>/dev/null echo "data: gsm8k-test-0-199.jsonl $(sha256sum "${REPO}/bench/h54/gsm8k-test-0-199.jsonl" | cut -c1-16); ttft-prompt.txt $(sha256sum "${REPO}/bench/h54/ttft-prompt.txt" | cut -c1-16)" echo "engine flags (Od in each arm's deploy.yaml):" -python3 "${HERE}/h57d.py" arms | python3 -c 'import json,sys; [print(f" {k}: {\" \".join(v)}") for k, v in json.load(sys.stdin)["args"].items()]' +python3 "${HERE}/h57d.py" arms | python3 -c 'import json,sys; [print(" " + k + ": " + " ".join(v)) for k, v in json.load(sys.stdin)["args"].items()]' diff --git a/bench/h57d/test_h57d.py b/bench/h57d/test_h57d.py index 51aa890b..42963006 100644 --- a/bench/h57d/test_h57d.py +++ b/bench/h57d/test_h57d.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 -"""Tests for bench/h57d (EXPERIMENTS.md "H57d amendment R1"): the arm table and renders, Od's -read-only transform, the P-core sampler's arithmetic, the load gate, and every H57da and H57dm -verdict branch on synthetic hold records. No cluster, no network.""" +"""Tests for bench/h57d (EXPERIMENTS.md "H57d amendment R1", "H57dp amendment R1" and "R2"): the +arm table and renders, Od's read-only transform, the P-core sampler's arithmetic, the load gate, +every H57da, H57dm, H57dp and H57de verdict branch on synthetic hold records, the hold.sh guards +and the Reproduce header. No cluster, no network.""" import json import os import random @@ -502,5 +503,112 @@ def test_cli_score_p(self): self.assertEqual(json.loads(out.stdout)["H57dp"]["verdict"], "SUPPORTED") +# ---- H57dp amendment R2: the inherited quality records, the spare-hold guard, the Reproduce +# header's engine flags ------------------------------------------------------------------------- + +H57D_HOLD4 = os.path.join(HERE, "results", "2026-10-21", "hold4") + + +def write_quality(root, correct): + """A stand-in for H57d's quality hold: root/hold4//quality.json, correct of 50.""" + for arm, c in correct.items(): + ad = os.path.join(root, "hold4", arm) + os.makedirs(ad) + json.dump({"status": "measured"}, open(os.path.join(ad, "status.json"), "w")) + json.dump({"correct": c, "n": 50, "score": c / 50}, open(os.path.join(ad, "quality.json"), "w")) + + +class InheritedQuality(unittest.TestCase): + def test_read_from_the_committed_h57d_quality_hold(self): + q = h57d.inherited_quality() + self.assertEqual(sorted(q), sorted(h57d.P_ARMS)) + for arm, src in (("Ld-mtp-u", "Ld-mtp"), ("Ld-mtp", "Ld-mtp"), ("Od", "Od")): + rec = json.load(open(os.path.join(H57D_HOLD4, src, "quality.json"))) + self.assertEqual(q[arm], {"from": f"H57d hold 4, {src}", "correct": rec["correct"], + "n": rec["n"], "score": rec["score"]}) + self.assertEqual((q["Ld-mtp-u"]["correct"], q["Od"]["correct"]), (50, 50)) + + def test_missing_record_reads_none(self): + with tempfile.TemporaryDirectory() as d: + write_quality(d, {"Ld-mtp": 49}) + q = h57d.inherited_quality(d) + self.assertEqual(q["Ld-mtp-u"]["correct"], 49) # Ld-mtp's record stands for Ld-mtp-u + self.assertIsNone(q["Od"]) + + def test_score_p_reports_the_records_with_no_gate(self): + decode = {"Ld-mtp": 5.0, "Ld-mtp-u": 8.0, "Od": 6.0} + with tempfile.TemporaryDirectory() as d: + write_p_holds(d, decode) + r = h57d.score_p(d) + self.assertEqual(r["quality_records"], h57d.inherited_quality()) + # A low inherited score changes no verdict: neither row has a quality gate. + qd = os.path.join(d, "q") + write_quality(qd, {"Ld-mtp": 20, "Od": 20}) + low = h57d.score_p(d, quality_from=qd) + self.assertEqual(low["quality_records"]["Ld-mtp-u"]["correct"], 20) + for row in ("H57dp", "H57de"): + self.assertEqual(low[row]["verdict"], r[row]["verdict"]) + self.assertEqual((r["H57dp"]["verdict"], r["H57de"]["verdict"]), ("SUPPORTED", "REFUTED")) + + +class SpareHoldGuard(unittest.TestCase): + """H57d's hold 5 is the spare: it repeats a failed hold's arms, which must be named. Before + H57dp amendment R1 a bare `hold.sh 5 perf` took the lock and ran a hold with no arms.""" + + def run_hold(self, row, hold, mode, *arms): + with tempfile.TemporaryDirectory() as g: + env = dict(os.environ, G=g, LOCK=os.path.join(g, "missing", "live.lock"), H57D_ROW=row) + r = subprocess.run(["bash", os.path.join(HERE, "hold.sh"), hold, mode, *arms], env=env, + capture_output=True, text=True, timeout=60) + log = os.path.join(g, "results", "campaign.log") + return r, os.listdir(g), open(log).read() if os.path.exists(log) else "" + + def test_bare_spare_and_smoke_holds_refused(self): + for row, hold in (("H57d", "5"), ("H57w", "5"), ("H57dp", "5"), ("H57d", "smoke-p")): + r, made, log = self.run_hold(row, hold, "perf") + self.assertEqual(r.returncode, 2, f"{row} {hold}: {r.stdout}{r.stderr}") + self.assertEqual(made, [], f"{row} {hold}") + self.assertIn(f"registers no hold {hold}", r.stderr) + + def test_named_arms_pass_the_guard(self): + # With arms named, hold.sh goes on to the lock (here a path that cannot be opened). + for row, hold, arms in (("H57d", "5", ("Od", "Ld")), ("H57d", "smoke-p", ("Ld-mtp-u",))): + r, made, log = self.run_hold(row, hold, "perf", *arms) + self.assertNotEqual(r.returncode, 2, f"{row} {hold}: {r.stdout}{r.stderr}") + self.assertIn(f"waiting for the lock (mode perf, arms: {' '.join(arms)})", log) + self.assertNotIn("lock taken", log) + + +def stub_tools(d): + """docker, kubectl and k3d stand-ins, so reproduce.sh runs with no container runtime.""" + for name, out in (("docker", "29.0.0"), ("kubectl", "Client Version: v1.37.1"), ("k3d", "k3d version v5.8.3")): + p = os.path.join(d, name) + with open(p, "w") as f: + f.write(f"#!/bin/sh\necho '{out}'\n") + os.chmod(p, 0o755) + + +class ReproduceHeader(unittest.TestCase): + def test_engine_flags_block(self): + # Every H57d reproduce.txt shows a SyntaxError where this block belongs. + with tempfile.TemporaryDirectory() as d: + b = os.path.join(d, "bin") + os.makedirs(b) + stub_tools(b) + env = dict(os.environ, G=os.path.join(d, "g"), PATH=b + os.pathsep + os.environ["PATH"], + K3D_REAL=os.path.join(b, "k3d")) + r = subprocess.run(["bash", os.path.join(HERE, "reproduce.sh")], env=env, + capture_output=True, text=True, timeout=120) + for bad in ("SyntaxError", "Traceback"): + self.assertNotIn(bad, r.stdout + r.stderr) + lines = r.stdout.splitlines() + i = lines.index("engine flags (Od in each arm's deploy.yaml):") + want = [f" {a}: {' '.join(v)}" for a, v in (("Ld", h57d.llamacpp_args(False)), + ("Ld-mtp", h57d.llamacpp_args(True)), + ("Ld-mtp-u", h57d.llamacpp_args(True, pinned=False)))] + self.assertEqual(lines[i + 1:], want) + self.assertIn(" llamacpp: " + h57d.LLAMACPP, lines) + + if __name__ == "__main__": unittest.main() From e8394e5262f881e44e5c73951d3741e506db121f Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:45:16 -0700 Subject: [PATCH 26/85] ledger(H57dp): R2 names the commit H57d's holds ran from beside PR #180 The hybrid-vendor paragraph now says H57d's holds ran from 458bca0e, which predates PR #180, and that every commit carrying the amendment includes #180, instead of implying this commit added it. --- EXPERIMENTS.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index 6d8b215f..333dfa53 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -4001,10 +4001,10 @@ by `convert.sh` and must equal H57d's Q4_0: sha256 beginning `8eb21d5b7efad6e9` keep that 16-digit prefix) and 321,145,696 bytes. A mismatch stops the campaign before hold 1 and is recorded. -**Hybrid vendor.** H57d ran at `458bca0e`, before PR #180, and its confounds record that -`K3D_GPU_VENDORS=hybrid` still deployed the node image's baked intel-gpu-plugin. The runner calls -this repository's `scripts/k3d-gpu up`, which includes #180 (`06aa321c`) from this commit on. -`hybrid` alone does not make intel active, so `up` creates the cluster with +**Hybrid vendor.** H57d's holds ran from `458bca0e`, which predates PR #180 (`06aa321c`), and its +confounds record that `K3D_GPU_VENDORS=hybrid` still deployed the node image's baked +intel-gpu-plugin. The runner calls this repository's `scripts/k3d-gpu up`, and every commit that +carries this amendment includes #180. `hybrid` alone does not make intel active, so `up` creates the cluster with `--disable=intel-gpu-plugin@server:0` and `--disable=intel-gpu-dra@server:0` (the branch #180's tests cover with `K3D_GPU_VENDORS=none` and `auto,-intel`), and no intel-gpu-plugin runs on an H57dp node. No arm requests a `gpu.intel.com` resource either way. The change applies to all From bb19bf1ffb3182d57e5006e29937de37e1b0ba46 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:51:09 -0700 Subject: [PATCH 27/85] ledger(H54b, H54c): state the crescent comparison by directory (115 results files equal; 19 run files equal, 25 copied) --- EXPERIMENTS.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index ab4bfecf..e5fc6f6e 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -3793,10 +3793,11 @@ raw results: bench/h54gpu/results/2026-10-21/: H54b/ (hold1, hold2, smoke-ho NOTES), H54c/ (hold1 with verdict.json and the same exports; smoke-hold1, smoke-hold1-failed-sa), runs/ (per hold pre.txt, post.txt, hold.log, serving.jsonl; campaign and smoke logs), REPRODUCE-supplement.txt. Logs over 20 kB - are gzipped; kubeconfigs are not kept. On 2026-10-28 every file of - ~/k3dgpu-gemma/results/H54b and H54c on crescent (kubeconfigs aside) was compared - by sha256 with these: all 134 equal; the 25 run and smoke logs missing here were - copied then. + are gzipped; kubeconfigs are not kept. Compared with crescent by sha256 on + 2026-10-28: all 115 files of ~/k3dgpu-gemma/results/H54b and H54c (kubeconfigs + aside) equal these; of ~/k3dgpu-gemma/runs, 19 files were here and equal, the 25 + H54b and H54c run and smoke logs missing here were copied then, and its 3 H54a + files were not. ``` **Wiring smokes (discarded, not holds).** H54c: 00:06:58Z (Cg not created: the pod's service From 9a88e8c5d6fb8d355f8939d06cb246fd9013a129 Mon Sep 17 00:00:00 2001 From: Andrew Mello Date: Wed, 28 Oct 2026 22:58:35 -0700 Subject: [PATCH 28/85] results: why B1g stalled (H54 note N2, unscored diagnostic) Run 1 started B1g's container from the committed H54a render with plain docker and stalled after 5 requests, as both H54a holds did. One worker thread spun at 1.0 CPU-s/s while every other thread slept; perf put 99.7% of its samples in the CPU attention kernel's reduce_splits, waiting on a split-completion flag in a head-dim-512 (Gemma 4 global-attention) layer. That is vllm-project/vllm#45844, a split-KV scratchpad sizing bug fixed in v0.25.0 and absent from v0.24.0, the image EAT 0d3438d ships for this model. Run 2, a labelled control with VLLM_CPU_ATTN_SPLIT_KV=0 and nothing else changed, completed 60 of 60 requests at the same speed. H54 note N2 records the runs, the cause, what EAT's stock config sets and what the H50, H51 and H54d pre-registrations do with a stock engine that dies. No row, prediction or verdict changes; the two docs that said "cause open" now name the cause. --- EXPERIMENTS.md | 94 ++++ .../B1g-stall-diag/run1/container-id | 1 + .../B1g-stall-diag/run1/container.json | 423 +++++++++++++++++ .../2026-10-29/B1g-stall-diag/run1/hello.json | 1 + .../B1g-stall-diag/run1/load.json.gz | Bin 0 -> 1852 bytes .../B1g-stall-diag/run1/models.json | 1 + .../B1g-stall-diag/run1/perf-cmd.txt | 3 + .../B1g-stall-diag/run1/perf-spin-report.txt | 42 ++ .../run1/perf-spin-script.txt.gz | Bin 0 -> 1244 bytes .../B1g-stall-diag/run1/perf-spin.data.gz | Bin 0 -> 73487 bytes .../2026-10-29/B1g-stall-diag/run1/post.txt | 31 ++ .../2026-10-29/B1g-stall-diag/run1/pre.txt | 31 ++ .../B1g-stall-diag/run1/pyspy-1072541.txt | 11 + .../B1g-stall-diag/run1/pyspy-1073660.txt | 11 + .../run1/pyspy-1073661-plain.txt | 48 ++ .../B1g-stall-diag/run1/pyspy-1073661.txt | 11 + .../run1/pyspy-1074031-plain.txt | 57 +++ .../B1g-stall-diag/run1/pyspy-1074031.txt | 11 + .../B1g-stall-diag/run1/render/args.json | 28 ++ .../B1g-stall-diag/run1/render/env.list | 16 + .../B1g-stall-diag/run1/render/render.json | 80 ++++ .../templates/tool_chat_template_gemma4.jinja | 387 ++++++++++++++++ .../templates/tool_chat_template_hermes.jinja | 130 ++++++ .../tool_chat_template_qwen3coder.jinja | 117 +++++ .../B1g-stall-diag/run1/reproduce.txt | 10 + .../B1g-stall-diag/run1/server.log.gz | Bin 0 -> 7807 bytes .../B1g-stall-diag/run1/serving.jsonl.gz | Bin 0 -> 1968 bytes .../2026-10-29/B1g-stall-diag/run1/stall.json | 13 + .../B1g-stall-diag/run1/threads-a.json.gz | Bin 0 -> 14834 bytes .../B1g-stall-diag/run1/threads-b.json.gz | Bin 0 -> 14838 bytes .../B1g-stall-diag/run1/watch.jsonl | 76 +++ .../run2-control-splitkv0/container-id | 1 + .../run2-control-splitkv0/container.json | 431 ++++++++++++++++++ .../run2-control-splitkv0/hello.json | 1 + .../run2-control-splitkv0/load.json.gz | Bin 0 -> 4749 bytes .../run2-control-splitkv0/models.json | 1 + .../run2-control-splitkv0/nostall.json | 1 + .../run2-control-splitkv0/post.txt | 31 ++ .../run2-control-splitkv0/pre.txt | 31 ++ .../run2-control-splitkv0/render/args.json | 28 ++ .../run2-control-splitkv0/render/env.list | 17 + .../run2-control-splitkv0/render/render.json | 80 ++++ .../templates/tool_chat_template_gemma4.jinja | 387 ++++++++++++++++ .../templates/tool_chat_template_hermes.jinja | 130 ++++++ .../tool_chat_template_qwen3coder.jinja | 117 +++++ .../run2-control-splitkv0/reproduce.txt | 11 + .../run2-control-splitkv0/server.log.gz | Bin 0 -> 6715 bytes .../run2-control-splitkv0/serving.jsonl.gz | Bin 0 -> 3412 bytes .../run2-control-splitkv0/watch.jsonl | 168 +++++++ docs/intel.md | 2 +- docs/intel/technical-report.md | 2 +- 51 files changed, 3070 insertions(+), 2 deletions(-) create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/container-id create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/container.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/hello.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/load.json.gz create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/models.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-cmd.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin-report.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin-script.txt.gz create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin.data.gz create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/post.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/pre.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/pyspy-1072541.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/pyspy-1073660.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/pyspy-1073661-plain.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/pyspy-1073661.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/pyspy-1074031-plain.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/pyspy-1074031.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/render/args.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/render/env.list create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/render/render.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/render/templates/tool_chat_template_gemma4.jinja create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/render/templates/tool_chat_template_hermes.jinja create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/render/templates/tool_chat_template_qwen3coder.jinja create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/reproduce.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/server.log.gz create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/serving.jsonl.gz create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/stall.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/threads-a.json.gz create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/threads-b.json.gz create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run1/watch.jsonl create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/container-id create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/container.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/hello.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/load.json.gz create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/models.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/nostall.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/post.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/pre.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/render/args.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/render/env.list create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/render/render.json create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/render/templates/tool_chat_template_gemma4.jinja create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/render/templates/tool_chat_template_hermes.jinja create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/render/templates/tool_chat_template_qwen3coder.jinja create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/reproduce.txt create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/server.log.gz create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/serving.jsonl.gz create mode 100644 bench/h54/results/2026-10-29/B1g-stall-diag/run2-control-splitkv0/watch.jsonl diff --git a/EXPERIMENTS.md b/EXPERIMENTS.md index f983bb1e..7f5ae417 100644 --- a/EXPERIMENTS.md +++ b/EXPERIMENTS.md @@ -3484,6 +3484,100 @@ H54d is recorded INCONCLUSIVE (not run). Running it would need a dated amendment without B1g's score (or a working B1g), a runner amendment (the pairs runner has no llama.cpp arm A), and the tool-call wiring smoke. Record: `bench/h54/results/2026-10-21/H54d/not-run.txt`. +### H54 note N2: why B1g stalled (unscored diagnostic, 2026-10-29) + +Recorded 2026-10-29. A diagnostic, not a hold. No arm, row, statistic, gate, threshold, cap or +prediction changes, and no H54a number is re-scored. It answers the run section's "cause open". + +**What ran.** `bench/h54/diag/b1g-stall.sh` (PR #209), under the bench lock and the hold-start +rule, outside k3d. B1g's container ran under plain `docker run`, rendered from the committed +hold-2 record (`hold2/B1g/deploy.yaml`): the same image digest, args, env ConfigMap and chat +template, user 1001, a read-only root, the same capabilities, and no CPU or memory request or +limit. The QAT weights were mounted read-only. The load was sequential 256-token greedy requests +from `bench/llm_load.py` with the H54a N=1 settings. Run 1 (05:30-05:39Z) used the render as is. +Run 2 (05:40-05:57Z) was a labelled control with one change, `VLLM_CPU_ATTN_SPLIT_KV=0`. Neither run +used a GPU or touched a serving container. Records: +`bench/h54/results/2026-10-29/B1g-stall-diag/`. + +**Run 1: the stall reproduced without k3d.** The server was ready after 162 s. Five requests +completed (median 18.7 tok/s); the sixth stopped at 248 of 256 tokens, at KV length 294. At the +stall the container's CPU fell from 48.0 to 1.006 CPU-s/s and stayed there. Thread snapshots 30 s +and 40 s after the stall agree: of the worker's 101 threads, one was runnable (CPU 53, 0.999 +CPU-s/s over the 10 s between them), and the worker's main thread and 78 others slept on futexes. +perf took 5,003 samples of that thread over 5 s. 99.74% fell in +`cpu_attention::AttentionMainLoop>::reduce_splits(..., +bool volatile* flags, ...)`, inside an OpenMP region, spinning with `_mm_pause` on a +split-completion flag. The worker's Python stack sat in `cpu_attention_with_kv_cache` +(`cpu_attn.py:394`, called from `gemma4.py:536`). EngineCore's stack sat in +`shm_broadcast.acquire_read`, waiting for the `execute_model` reply. 300 s after the stall, +EngineCore raised "RPC call to execute_model timed out" and `EngineDeadError`, as in both H54a +holds. 300 s is vLLM's `VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS` default. EAT's `VLLM_RPC_TIMEOUT` is +not a v0.24.0 variable; the server logs it as unknown. + +**Cause: a vLLM CPU attention bug, fixed upstream after v0.24.0.** vllm-project/vllm#45844 +("Fix CPU split-KV scratchpad sizing", merged 2026-07-04 as `26eb8720`) was opened for a hang +"seen with google/gemma-4-26B-A4B-it". The CPU attention metadata builder sized the split-KV +reduction scratchpad from the model-wide KV-head count and the output element size. The kernel +writes float split outputs, and on Gemma 4's global-attention layers it handles more query heads +per split. Those layers have head dim 512 and 2 KV heads, against the sliding layers' 256 and 8; +5 of the 30 layers are global (`config.json`). Split outputs then overlap the split-completion +flags, and `reduce_splits` can wait forever. The stuck kernel's template arguments (AMX, head dim +512) are those layers'. v0.24.0 (tagged 2026-06-29) carries the old code: `cpu_attn.py` line 140 +takes `model_config.get_num_kv_heads`, and `cpu_attn_impl.hpp` lines 420 and 688 size it the old +way. GitHub's compare puts `26eb8720` in v0.25.0 and in every later tag checked (v0.26.0, v0.28.0, +v0.32.0), and not in v0.24.0. + +**Deterministic?** Not in position, but recurrent. All three B1g engines stalled within their +first 690-1,540 decode steps: H54a hold 1 at KV length 211 (third 256-token request), hold 2 at +299 (sixth), run 1 at 294 (sixth). Earlier requests had passed those lengths without a stall. +Split writers and the flag race, so where it bites varies. + +**H54a's two stalls are this bug: inferred, not observed.** No thread record exists for them. +The image, render and weights are the same, and so is the log signature. Their host readings fit +a single spinning thread. In hold 1, load1 sat at 5.2-5.5 during the stall and 3.8-3.9 after the +engine died. Hold 2's N=1 phase used 52,204 J in 342.8 s; less 3 requests at the warmup phase's +279.4 W, that leaves about 135 W for the ~300 s stall, against the arm's 131.6 W idle window. + +**Control (run 2): split-KV off, no stall.** Ready after 162 s. All 60 requests completed at +256 tokens each: 15,370 tokens with the readiness chat, ten times the most any stalled engine +reached. Median 18.4 tok/s (decode 18.5), against run 1's 18.7 (18.9) over its five. The +container read 47.8-48.0 CPU-s/s whenever a request ran. The server logged no shared-memory wait +and no `EngineDeadError`. At the rate the three stalled engines show (3 stalls in about 3,770 +decode steps), 15,360 steps pass without one with probability about e^-12. So the same image, +render and weights do not stall with split-KV off, and N=1 decode is no slower. The control is a +patch to the stock arm and is not a B1g measurement. + +**Not the cause.** The k3d harness: run 1 had no k3d, kubelet or port-forward. Memory: no OOM +kill, and 40 GiB of KV on a 503 GiB host. Host contention: no aiperf process in any of the three, +and the serving containers read 2.3-3.2 CPU-s/s during the stalls (4.8-5.1 while run 1 decoded, +the rise amendment R4 describes). Prompt length: about 45-token prompts, stalls at different +KV lengths. Thread placement: the OpenMP threads on CPUs 48-94 decoded normally for minutes first. + +**What EAT's stock config sets.** EAT `0d3438d` `xeon-values.yaml`, entry +`google/gemma-4-26B-A4B-it`: image `vllm/vllm-openai-cpu:v0.24.0`. ConfigMap: +`TRITON_CACHE_DIR`, `VLLM_CPU_KVCACHE_SPACE` 40, `VLLM_RPC_TIMEOUT` 100000, +`VLLM_ALLOW_LONG_MAX_MODEL_LEN` 1, `VLLM_ENGINE_ITERATION_TIMEOUT_S` 120, `USER`. Args: +`--block-size 128 --dtype bfloat16 --distributed_executor_backend mp --enable_chunked_prefill +--enforce-eager --enable-prefix-caching --enable-auto-tool-choice --tool-call-parser gemma4 +--chat-template .../tool_chat_template_gemma4.jinja`. Unlike the file's other CPU entries it sets +neither `VLLM_CPU_SGL_KERNEL` nor `VLLM_CPU_NUM_OF_RESERVED_CPU`. No entry sets +`VLLM_CPU_ATTN_SPLIT_KV`, whose v0.24.0 default (1) turns split-KV on. EAT's playbook default +also adds the `vllm-balloon` annotation with `cpu` 8 and `memory` 64Gi unless its sizing step +says otherwise. EAT release-1.1.0 (2026-10-22, `0c726f57`) keeps this entry's args and env (it adds +`HF_HOME` /data, which B1g's render already had) and moves the image to `v0.28.0`, which contains +the fix. + +**What the pre-registrations do with it.** None of them lets the stock arm change: the image, the +flags and the env are EAT's as pinned. `VLLM_CPU_ATTN_SPLIT_KV=0` is not in EAT's config, so it is +a patch, used here only in the labelled control. H54a is closed (amendment R3 carried B1g once; +the cap is spent). H54d's arm A is defined by H54a's chosen arm, so it stays INCONCLUSIVE (not +run). H50 and H51 have not run; their B1 is this arm, and nothing in their rules avoids the bug. +Under H50's P1 rules a stalled turn is `over_turn`, a B1 outcome, not a void. But a stalled B1 +pod spins one core for 300 s and then restarts and reloads. Both collide with the idle-arm check +(the other arm's pod above 0.5 CPU) and the quiesce rule. H51 scores a failed step: errors over 1% +end the arm's bracket. Changing B1 to EAT's current release is a new arm, and needs a dated +amendment before any H50 or H51 hold. + ### H57d pre-registration: Gemma 4 26B-A4B QAT on the AMX-less client CPU (i9-13900T, 2026-10-20) Written 2026-10-20, before any H57da, H57dm or H57db measurement. Nothing here is a measurement diff --git a/bench/h54/results/2026-10-29/B1g-stall-diag/run1/container-id b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/container-id new file mode 100644 index 00000000..b942fa77 --- /dev/null +++ b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/container-id @@ -0,0 +1 @@ +dd11440eb2b6ab360e04108afb5990c404c465e3e90f1620cf3b12e70ee0c199 diff --git a/bench/h54/results/2026-10-29/B1g-stall-diag/run1/container.json b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/container.json new file mode 100644 index 00000000..d6347c3f --- /dev/null +++ b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/container.json @@ -0,0 +1,423 @@ +[ + { + "Id": "dd11440eb2b6ab360e04108afb5990c404c465e3e90f1620cf3b12e70ee0c199", + "Created": "2026-10-29T05:30:18.950333239Z", + "Path": "vllm", + "Args": [ + "serve", + "--block-size", + "128", + "--dtype", + "bfloat16", + "--distributed_executor_backend", + "mp", + "--enable_chunked_prefill", + "--enforce-eager", + "--enable-prefix-caching", + "--enable-auto-tool-choice", + "--tool-call-parser", + "gemma4", + "--chat-template", + "/workspace/vllm/examples/tool_chat_template_gemma4.jinja", + "--tensor-parallel-size", + "1", + "--pipeline-parallel-size", + "1", + "--model", + "/data/google_gemma-4-26B-A4B-it-qat-q4_0-unquantized", + "--served-model-name", + "google/gemma-4-26B-A4B-it", + "--port", + "2080", + "--max-model-len", + "8192" + ], + "State": { + "Status": "exited", + "Running": false, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 0, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-10-29T05:30:19.051643976Z", + "FinishedAt": "2026-10-29T05:39:26.279090392Z" + }, + "Image": "sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1", + "ResolvConfPath": "/var/lib/docker/containers/dd11440eb2b6ab360e04108afb5990c404c465e3e90f1620cf3b12e70ee0c199/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/dd11440eb2b6ab360e04108afb5990c404c465e3e90f1620cf3b12e70ee0c199/hostname", + "HostsPath": "/var/lib/docker/containers/dd11440eb2b6ab360e04108afb5990c404c465e3e90f1620cf3b12e70ee0c199/hosts", + "LogPath": "/var/lib/docker/containers/dd11440eb2b6ab360e04108afb5990c404c465e3e90f1620cf3b12e70ee0c199/dd11440eb2b6ab360e04108afb5990c404c465e3e90f1620cf3b12e70ee0c199-json.log", + "Name": "/k3dgpu-diag-b1g-053018", + "RestartCount": 0, + "Driver": "overlayfs", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/devcloud/k3dgpu-gemma/models/google_gemma-4-26B-A4B-it-qat-q4_0-unquantized:/data/google_gemma-4-26B-A4B-it-qat-q4_0-unquantized:ro", + "/home/devcloud/k3dgpu-gemma/b1g-diag/repo/bench/h54/results/2026-10-29/B1g-stall-diag/run1/render/templates:/workspace/vllm/examples:ro" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": { + "2080/tcp": [ + { + "HostIp": "127.0.0.1", + "HostPort": "18080" + } + ] + }, + "RestartPolicy": { + "Name": "no", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": [ + "CAP_SYS_NICE" + ], + "CapDrop": [ + "ALL" + ], + "CgroupnsMode": "private", + "Dns": null, + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": true, + "SecurityOpt": [ + "no-new-privileges" + ], + "Tmpfs": { + "/root/.cache/vllm": "rw,exec,size=1g", + "/tmp": "rw,exec,size=8g" + }, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 1073741824, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/acpi", + "/proc/asound", + "/proc/interrupts", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/sched_debug", + "/proc/scsi", + "/proc/timer_list", + "/proc/timer_stats", + "/sys/devices/virtual/powercap", + "/sys/firmware", + "/sys/devices/system/cpu/cpu0/thermal_throttle", + "/sys/devices/system/cpu/cpu1/thermal_throttle", + "/sys/devices/system/cpu/cpu2/thermal_throttle", + "/sys/devices/system/cpu/cpu3/thermal_throttle", + "/sys/devices/system/cpu/cpu4/thermal_throttle", + "/sys/devices/system/cpu/cpu5/thermal_throttle", + "/sys/devices/system/cpu/cpu6/thermal_throttle", + "/sys/devices/system/cpu/cpu7/thermal_throttle", + "/sys/devices/system/cpu/cpu8/thermal_throttle", + "/sys/devices/system/cpu/cpu9/thermal_throttle", + "/sys/devices/system/cpu/cpu10/thermal_throttle", + "/sys/devices/system/cpu/cpu11/thermal_throttle", + "/sys/devices/system/cpu/cpu12/thermal_throttle", + "/sys/devices/system/cpu/cpu13/thermal_throttle", + "/sys/devices/system/cpu/cpu14/thermal_throttle", + "/sys/devices/system/cpu/cpu15/thermal_throttle", + "/sys/devices/system/cpu/cpu16/thermal_throttle", + "/sys/devices/system/cpu/cpu17/thermal_throttle", + "/sys/devices/system/cpu/cpu18/thermal_throttle", + "/sys/devices/system/cpu/cpu19/thermal_throttle", + "/sys/devices/system/cpu/cpu20/thermal_throttle", + "/sys/devices/system/cpu/cpu21/thermal_throttle", + "/sys/devices/system/cpu/cpu22/thermal_throttle", + "/sys/devices/system/cpu/cpu23/thermal_throttle", + "/sys/devices/system/cpu/cpu24/thermal_throttle", + "/sys/devices/system/cpu/cpu25/thermal_throttle", + "/sys/devices/system/cpu/cpu26/thermal_throttle", + "/sys/devices/system/cpu/cpu27/thermal_throttle", + "/sys/devices/system/cpu/cpu28/thermal_throttle", + "/sys/devices/system/cpu/cpu29/thermal_throttle", + "/sys/devices/system/cpu/cpu30/thermal_throttle", + "/sys/devices/system/cpu/cpu31/thermal_throttle", + "/sys/devices/system/cpu/cpu32/thermal_throttle", + "/sys/devices/system/cpu/cpu33/thermal_throttle", + "/sys/devices/system/cpu/cpu34/thermal_throttle", + "/sys/devices/system/cpu/cpu35/thermal_throttle", + "/sys/devices/system/cpu/cpu36/thermal_throttle", + "/sys/devices/system/cpu/cpu37/thermal_throttle", + "/sys/devices/system/cpu/cpu38/thermal_throttle", + "/sys/devices/system/cpu/cpu39/thermal_throttle", + "/sys/devices/system/cpu/cpu40/thermal_throttle", + "/sys/devices/system/cpu/cpu41/thermal_throttle", + "/sys/devices/system/cpu/cpu42/thermal_throttle", + "/sys/devices/system/cpu/cpu43/thermal_throttle", + "/sys/devices/system/cpu/cpu44/thermal_throttle", + "/sys/devices/system/cpu/cpu45/thermal_throttle", + "/sys/devices/system/cpu/cpu46/thermal_throttle", + "/sys/devices/system/cpu/cpu47/thermal_throttle", + "/sys/devices/system/cpu/cpu48/thermal_throttle", + "/sys/devices/system/cpu/cpu49/thermal_throttle", + "/sys/devices/system/cpu/cpu50/thermal_throttle", + "/sys/devices/system/cpu/cpu51/thermal_throttle", + "/sys/devices/system/cpu/cpu52/thermal_throttle", + "/sys/devices/system/cpu/cpu53/thermal_throttle", + "/sys/devices/system/cpu/cpu54/thermal_throttle", + "/sys/devices/system/cpu/cpu55/thermal_throttle", + "/sys/devices/system/cpu/cpu56/thermal_throttle", + "/sys/devices/system/cpu/cpu57/thermal_throttle", + "/sys/devices/system/cpu/cpu58/thermal_throttle", + "/sys/devices/system/cpu/cpu59/thermal_throttle", + "/sys/devices/system/cpu/cpu60/thermal_throttle", + "/sys/devices/system/cpu/cpu61/thermal_throttle", + "/sys/devices/system/cpu/cpu62/thermal_throttle", + "/sys/devices/system/cpu/cpu63/thermal_throttle", + "/sys/devices/system/cpu/cpu64/thermal_throttle", + "/sys/devices/system/cpu/cpu65/thermal_throttle", + "/sys/devices/system/cpu/cpu66/thermal_throttle", + "/sys/devices/system/cpu/cpu67/thermal_throttle", + "/sys/devices/system/cpu/cpu68/thermal_throttle", + "/sys/devices/system/cpu/cpu69/thermal_throttle", + "/sys/devices/system/cpu/cpu70/thermal_throttle", + "/sys/devices/system/cpu/cpu71/thermal_throttle", + "/sys/devices/system/cpu/cpu72/thermal_throttle", + "/sys/devices/system/cpu/cpu73/thermal_throttle", + "/sys/devices/system/cpu/cpu74/thermal_throttle", + "/sys/devices/system/cpu/cpu75/thermal_throttle", + "/sys/devices/system/cpu/cpu76/thermal_throttle", + "/sys/devices/system/cpu/cpu77/thermal_throttle", + "/sys/devices/system/cpu/cpu78/thermal_throttle", + "/sys/devices/system/cpu/cpu79/thermal_throttle", + "/sys/devices/system/cpu/cpu80/thermal_throttle", + "/sys/devices/system/cpu/cpu81/thermal_throttle", + "/sys/devices/system/cpu/cpu82/thermal_throttle", + "/sys/devices/system/cpu/cpu83/thermal_throttle", + "/sys/devices/system/cpu/cpu84/thermal_throttle", + "/sys/devices/system/cpu/cpu85/thermal_throttle", + "/sys/devices/system/cpu/cpu86/thermal_throttle", + "/sys/devices/system/cpu/cpu87/thermal_throttle", + "/sys/devices/system/cpu/cpu88/thermal_throttle", + "/sys/devices/system/cpu/cpu89/thermal_throttle", + "/sys/devices/system/cpu/cpu90/thermal_throttle", + "/sys/devices/system/cpu/cpu91/thermal_throttle", + "/sys/devices/system/cpu/cpu92/thermal_throttle", + "/sys/devices/system/cpu/cpu93/thermal_throttle", + "/sys/devices/system/cpu/cpu94/thermal_throttle", + "/sys/devices/system/cpu/cpu95/thermal_throttle" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "Storage": { + "RootFS": { + "Snapshot": { + "Name": "overlayfs" + } + } + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/devcloud/k3dgpu-gemma/models/google_gemma-4-26B-A4B-it-qat-q4_0-unquantized", + "Destination": "/data/google_gemma-4-26B-A4B-it-qat-q4_0-unquantized", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/home/devcloud/k3dgpu-gemma/b1g-diag/repo/bench/h54/results/2026-10-29/B1g-stall-diag/run1/render/templates", + "Destination": "/workspace/vllm/examples", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "dd11440eb2b6", + "Domainname": "", + "User": "1001", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "ExposedPorts": { + "2080/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "http_proxy=", + "https_proxy=", + "no_proxy=", + "TORCHINDUCTOR_CACHE_DIR=/tmp", + "NUMBA_CACHE_DIR=/tmp", + "HF_HOME=/data", + "OUTLINES_CACHE_DIR=/tmp/.cache/outlines", + "VLLM_NO_USAGE_STATS=1", + "DO_NOT_TRACK=1", + "TRITON_CACHE_DIR=/tmp/.triton", + "USER=vllm", + "VLLM_ALLOW_LONG_MAX_MODEL_LEN=1", + "VLLM_CPU_KVCACHE_SPACE=40", + "VLLM_ENGINE_ITERATION_TIMEOUT_S=120", + "VLLM_RPC_TIMEOUT=100000", + "HF_HUB_OFFLINE=1", + "PATH=/opt/venv/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "MAX_JOBS=16", + "CC=/usr/bin/gcc-12", + "CXX=/usr/bin/g++-12", + "CCACHE_DIR=/root/.cache/ccache", + "CMAKE_CXX_COMPILER_LAUNCHER=ccache", + "VIRTUAL_ENV=/opt/venv", + "UV_PYTHON_INSTALL_DIR=/opt/uv/python", + "UV_HTTP_TIMEOUT=500", + "PIP_EXTRA_INDEX_URL=https://download.pytorch.org/whl/cpu", + "UV_EXTRA_INDEX_URL=https://download.pytorch.org/whl/cpu", + "UV_INDEX_STRATEGY=unsafe-best-match", + "UV_LINK_MODE=copy", + "TARGETARCH=amd64", + "LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4:/opt/venv/lib/libiomp5.so" + ], + "Cmd": [ + "--block-size", + "128", + "--dtype", + "bfloat16", + "--distributed_executor_backend", + "mp", + "--enable_chunked_prefill", + "--enforce-eager", + "--enable-prefix-caching", + "--enable-auto-tool-choice", + "--tool-call-parser", + "gemma4", + "--chat-template", + "/workspace/vllm/examples/tool_chat_template_gemma4.jinja", + "--tensor-parallel-size", + "1", + "--pipeline-parallel-size", + "1", + "--model", + "/data/google_gemma-4-26B-A4B-it-qat-q4_0-unquantized", + "--served-model-name", + "google/gemma-4-26B-A4B-it", + "--port", + "2080", + "--max-model-len", + "8192" + ], + "Image": "vllm/vllm-openai-cpu@sha256:b0e6f8604413a8bfcca8836bb4b57b47f1aa653957e07f8903ece531309981a1", + "Volumes": null, + "WorkingDir": "/vllm-workspace", + "Entrypoint": [ + "vllm", + "serve" + ], + "Labels": { + "ai.vllm.build.cpu-arm-bf16": "false", + "ai.vllm.build.cpu-x86": "true", + "ai.vllm.build.python-version": "3.12", + "ai.vllm.build.target-arch": "amd64", + "k3dgpu.diag": "b1g-stall", + "org.opencontainers.image.description": "vLLM inference engine for CPU platforms", + "org.opencontainers.image.source": "https://github.com/vllm-project/vllm", + "org.opencontainers.image.title": "vLLM CPU", + "org.opencontainers.image.vendor": "vLLM Project", + "org.opencontainers.image.version": "22.04" + } + }, + "NetworkSettings": { + "SandboxID": "", + "SandboxKey": "", + "Ports": {}, + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "DriverOpts": null, + "GwPriority": 0, + "NetworkID": "079840671febd9bc1caa55e83e63558724adbe92299b1abb5777fe9fa72b5975", + "EndpointID": "", + "Gateway": "", + "IPAddress": "", + "MacAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DNSNames": null + } + } + }, + "ImageManifestDescriptor": { + "mediaType": "application/vnd.docker.distribution.manifest.v2+json", + "digest": "sha256:00eeb8bfad017e2fd9ca9f18999e8417bebfa146a0eb4276b4c26c8272dc2377", + "size": 2630, + "platform": { + "architecture": "amd64", + "os": "linux" + } + } + } +] diff --git a/bench/h54/results/2026-10-29/B1g-stall-diag/run1/hello.json b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/hello.json new file mode 100644 index 00000000..ec0a0fde --- /dev/null +++ b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/hello.json @@ -0,0 +1 @@ +{"id":"chatcmpl-8b757cd4f4d801fe","object":"chat.completion","created":1793251979,"model":"google/gemma-4-26B-A4B-it","choices":[{"index":0,"message":{"role":"assistant","content":"Hello! How can I help you today?","refusal":null,"annotations":null,"audio":null,"function_call":null,"reasoning":null},"logprobs":null,"finish_reason":"stop","stop_reason":106,"token_ids":null,"routed_experts":null}],"service_tier":null,"system_fingerprint":"vllm-0.24.0-fc81034b","usage":{"prompt_tokens":16,"total_tokens":26,"completion_tokens":10,"prompt_tokens_details":null},"prompt_logprobs":null,"prompt_token_ids":null,"prompt_text":null,"kv_transfer_params":null} \ No newline at end of file diff --git a/bench/h54/results/2026-10-29/B1g-stall-diag/run1/load.json.gz b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/load.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..dc7d36fd3881dc4464545cfe08bd6ba354bb3e8b GIT binary patch literal 1852 zcmaLVdpHvc9|!O-wsO}9y_3rbF~!V1mT@-aeu@|eCylvn6Vq)~$>u>rYHV#nAo!xmbCb)KpDWm(^429Cs9##nF)*z@DucQfVk1sOvG_B=OC zg5Mq#!+=a-TXCB$4Qr$4(o+JHli0Bzc-+zE#@70Xk z*xwX4wUQJ0H+t@ry(}fc6DLh~7)`)is%`If>N7d7zB99$9jU(}=J95G#Ki4{_3L9& zUJm1#P>bU`_g*e0J{VDOWj!`tg+EFr1}6@I^CaodGx4k_+atdn@`&oJJ6BZW(;LcK zjhbTWdr@x(&3H?y3g7?3M*s_}3!e`{-A!rNhgB8V)jEfE4Gp77N3zov8W zly9H)D!!S+K4|cGM(5_$&by3Da-ZmWIOF`n(6q|*R9EFmf^0p!ETDekwz3{}zf&tv ztvugOU!vE-RUa5ZcYET?eIH3C43wl*FI1io`y3E zijzrS35=cT)XNEyRQss`flzoBFn4#MNh3*W*pO$_`HjD4*;9AEt#@QqxwJni6pR5) zc|T+P{6TGOFEP2O7iMu(kd&EpfWCkXw*xSQ2KA%VX@g?}*sFG`wPr}-oUwjA4?dn(H(tW`cy#T1d^T))Vs*b;?v_1HU z{5kC%q%xU&SxH#ak)7MYztu&Qwc1(ccUnotP!vWLP_jI_8nl-km>7{ix=O4?8RhX>PRJ{g&X%M$)+S<_1Kb`|R8h zTOh(upEN0V5Ob5yQbqUge~3+v4+eAq!ix^)t@QT!N|)2%Ktr3CDzXSlK)ZorNGVh@4x8(U-*x}PtErKyU;)U g&kO(k0&#mp6KR*wc5;UxOc9#do%W{AX7AhgJFyOUH~;_u literal 0 HcmV?d00001 diff --git a/bench/h54/results/2026-10-29/B1g-stall-diag/run1/models.json b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/models.json new file mode 100644 index 00000000..bc1d0f2b --- /dev/null +++ b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/models.json @@ -0,0 +1 @@ +{"object":"list","data":[{"id":"google/gemma-4-26B-A4B-it","object":"model","created":1793251979,"owned_by":"vllm","root":"/data/google_gemma-4-26B-A4B-it-qat-q4_0-unquantized","parent":null,"max_model_len":8192,"permission":[{"id":"modelperm-9adbeda5b9e5900f","object":"model_permission","created":1793251979,"allow_create_engine":false,"allow_sampling":true,"allow_logprobs":true,"allow_search_indices":false,"allow_view":true,"allow_fine_tuning":false,"organization":"*","group":null,"is_blocking":false}]}]} \ No newline at end of file diff --git a/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-cmd.txt b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-cmd.txt new file mode 100644 index 00000000..4b8a6bd8 --- /dev/null +++ b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-cmd.txt @@ -0,0 +1,3 @@ +Thu Oct 29 05:35:37 UTC 2026 +sudo perf record -t 1074260 -g -F 999 -o /home/devcloud/k3dgpu-gemma/b1g-diag/repo/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin.data -- sleep 5; sudo perf report -i /home/devcloud/k3dgpu-gemma/b1g-diag/repo/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin.data --stdio --no-children; sudo perf script -i /home/devcloud/k3dgpu-gemma/b1g-diag/repo/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin.data +cmd: sudo -n py-spy dump --pid (no --native: libunwind UNW_EBADREG on this build) diff --git a/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin-report.txt b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin-report.txt new file mode 100644 index 00000000..6fd13368 --- /dev/null +++ b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin-report.txt @@ -0,0 +1,42 @@ +# To display the perf.data header info, please use --header/--header-only options. +# +# +# Total Lost Samples: 0 +# +# Samples: 5K of event 'cpu/cycles/P' +# Event count (approx.): 18973444946 +# +# Overhead Command Shared Object Symbol +# ........ ............ ................. ................................................................................................................................................................................................... +# + 99.74% VLLM::Worker _C.abi3.so [.] cpu_attention::AttentionMainLoop >::operator()(cpu_attention::AttentionInput const*) [clone ._omp_fn.0] + | + |--97.74%--cpu_attention::AttentionMainLoop >::reduce_splits(float*, float*, float*, bool volatile*, int, int, int) (inlined) + | cpu_attention::AttentionMainLoop >::operator()(cpu_attention::AttentionInput const*) [clone ._omp_fn.0] + | __kmp_GOMP_microtask_wrapper(int*, int*, void (*)(void*), void*) + | __kmp_invoke_microtask + | __kmp_invoke_task_func + | + --2.00%--_mm_pause() (inlined) + cpu_attention::AttentionMainLoop >::reduce_splits(float*, float*, float*, bool volatile*, int, int, int) (inlined) + cpu_attention::AttentionMainLoop >::operator()(cpu_attention::AttentionInput const*) [clone ._omp_fn.0] + __kmp_GOMP_microtask_wrapper(int*, int*, void (*)(void*), void*) + __kmp_invoke_microtask + __kmp_invoke_task_func + + 0.04% VLLM::Worker [kernel.kallsyms] [k] sync_regs + 0.04% VLLM::Worker [kernel.kallsyms] [k] __raw_spin_lock_irqsave + 0.02% VLLM::Worker [kernel.kallsyms] [k] timekeeping_adjust + 0.02% VLLM::Worker [kernel.kallsyms] [k] tick_nohz_handler + 0.02% VLLM::Worker [kernel.kallsyms] [k] arch_exit_to_user_mode_prepare.isra.0 + 0.02% VLLM::Worker [kernel.kallsyms] [k] native_irq_return_iret + 0.02% VLLM::Worker [kernel.kallsyms] [k] __update_load_avg_se + 0.02% VLLM::Worker [kernel.kallsyms] [k] _find_first_bit + 0.02% VLLM::Worker [kernel.kallsyms] [k] _find_next_and_bit + 0.02% VLLM::Worker [kernel.kallsyms] [k] update_se + 0.02% VLLM::Worker [kernel.kallsyms] [k] kick_ilb + + +# +# (Cannot load tips.txt file, please install perf!) +# diff --git a/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin-script.txt.gz b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin-script.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..a89e59a2f78371d18bdf9c93174dedd81c48a9f2 GIT binary patch literal 1244 zcmb2|=HM{A{V0oxxgfPDO}DrpGf%fTxhS)sM6aZxgyHSo-0a700_-2I@AY3ey=>O4 z-v-9Jv-_H}7d};3$lm(8JE&)o#@Y@g&gjDG`~RLq^tC=Ly6m)2rvCAbzNc$aTIF{e z&zfo%6C1leZ2z{|zl$bE3ZLjaS@S`&Bih19DRJuC{G2ld=eyn&M%L)OD%xGM|5RM< z=6Df{XNFVe?7sBYe#5!n`*MD*$_-n+{rL3jl~-f7=6?TGEMM{c!qxTZ>E8GMek#k; z+k9x&)mOjeUz@#O8^En#wrb|fcNgt_`)bwwbML-+>*;O&{CxJdwVPw3 zpVx*?Km0!Q@_e~x_h;?jS#Wbr)~i*T`Op7vUVo$PsoMM7XLIa+zloalZsYl`Z8yJ( ze}1!lQQmB$=ry<7^J=f_oOypde@D*lx}Dmy?`~R`H|_56f9JP-j;&H~Dw@{Pp+O`9n8m{;sLs|1W!T z`Qc-H)|>3#Jb74nJ#72UH%WH4_wSe?e{aW)_r*Ic?=N_`Tx#3Q^Vc)?iaa@98g_Qw zUVZ;;*(k5L+mkeJv~Hd@&+PBJjhb!Kaw>MN442>6pf1HG_keL;edBSdNzC(7+Dz3R zFv>l+_~_$ByN4V7n5w{%4eFmd)Lq{1VFvQ#ROOy0*BpA>v;4({&kXz@GCo#3{>#We zkwftrP-Ea@&U3OKI#L&M*c@QC@v?FGIAK+pq2+lV2=~p|h0i};3+MsL9awx+dD@>2 z^_wR=B*4b77$38#+fnGSN~)s4y;pr_$pPmlLYyCfavC3b63;!f=ucPIVXSCiub5I1 zWMcBjv#oFrJ5XtNyYB?UL=j!o zYBtzB+W16gQ!Y?#l#R;E8=o!Q*$$fl{iQ26tSCs_Jb9M6D5Ojym(U*ZceNErHs{O3IAG^-Qjua~X(!D{m-^g-f-pXWa= z@myuKsT*wfVc|0({s$^=8{{y{na=ZUb@aOSfJFi9Z$Ay2$BI6OA+A_{=)x401>1PR zVcBxYSPqmTm*emiecPgNz^?;j<$CDLl7RFBLQeA+fKbd}#8_B@&QujF@=Yl1IZpizfgWQ(iWHDto3F P{9xfs4}ExL2Ll5Dh@)Jb literal 0 HcmV?d00001 diff --git a/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin.data.gz b/bench/h54/results/2026-10-29/B1g-stall-diag/run1/perf-spin.data.gz new file mode 100644 index 0000000000000000000000000000000000000000..b744ed6fc68296568a88f1d03437a396fcdfbbdb GIT binary patch literal 73487 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