frank-medium: serve the whole 262144-token window, and repoint every signal to llama.cpp

Context: 262144 was measured before it was deployed -- 24.72 GB on GPU 0 and
29.14 GB on GPU 1 of 34.21 GB each, ~5 GB of headroom on the busier card, and a
140,069-token prompt prefilled through the single slot in 134 s to prove the
window is real. The 114688 wall was the vLLM predecessor's arithmetic, not this
runtime's.

Throughput, measured through the service: 1.0-1.4k tok/s prefill from 4k to
140k, 43.8 tok/s decode on a 512-token generation, 41-71 % DFlash2 acceptance,
and the prefix cache re-prefilling 4 of 998 tokens on a repeated prompt.

The signals move with the runtime, so the fleet's rules and dashboard are
re-cut rather than renamed: vllm: series do not exist any more, and two of the
old rules watched things llama.cpp does not export at all (KV-pool fill, p95
latency). Those are retired with the reason written down, and LlmSpecDecodeOff
takes one of the slots -- a lost drafter is the failure no client can see. The
observability seam now fails if any rule names a series the endpoint does not
export, which is what would have caught the stale vllm: expressions.

omp models.yml (outside the repo) is updated in the same pass: contextWindow
262144, and the full reasoning-effort map, because Qwen3.8's template answers
500 on 'high' -- verified against the live endpoint, low/medium/xhigh answer
200. Subagents run at high.
This commit is contained in:
Frank committed 2026-09-16 15:29:40 -07:00
1 parent ab51d61198
commit dc76dc5dc4
8 files changed
+220 -140

No files matched your search

@@ -1,7 +1,7 @@
{
"uid": "llm-fleet",
"title": "LLM fleet — capacity and reuse",
"description": "The signals that explain frank-medium under load, from the 2026-09-16 capacity work. The panels read the endpoint's own counters: KV fill, queue depth, prefix-cache reuse, and request latency. frank-small (llama.cpp on Dankclaw's RTX 3090) exports throughput counters and appears in the same endpoint picker; frank-large runs the halogen engine, which publishes /health, /cache and /v1/* and no metrics endpoint at all, so it cannot appear here. See serverAppConfigs-docs/LLM/frank-medium-llamacpp-dflash2.md for the numbers these panels are read against.",
"title": "LLM fleet \u2014 capacity and reuse",
"description": "The signals that explain the LLM endpoints under load, from the 2026-09-16 capacity work. The panels read llama.cpp's own counters: speculative acceptance, queue depth, prefix-cache reuse, decode step rate and throughput. frank-medium (Dankserver, both R9700s, layer split) and frank-small (Dankclaw, RTX 3090) both export them; frank-large runs the halogen engine, which publishes /health, /cache and /v1/* and no metrics endpoint at all, so it cannot appear here. See serverAppConfigs-docs/LLM/frank-medium-llamacpp-dflash2.md for the numbers these panels are read against.",
"tags": [
"llm",
"frank-medium",
@@ -42,7 +42,7 @@
{
"id": 1,
"type": "timeseries",
"title": "KV pool fill (vllm:kv_cache_usage_perc)",
"title": "Speculative decoding (DFlash2 acceptance)",
"description": "How full each card's KV pool is. One card holds ~122,636 tokens; sustained high values with a cold prefix cache is the thrash this fleet measured.",
"gridPos": {
"h": 8,
@@ -69,8 +69,13 @@
"targets": [
{
"refId": "A",
"expr": "vllm:kv_cache_usage_perc{job=~\"$job\"} * 100",
"legendFormat": "{{job}} engine {{engine}}"
"expr": "rate(llamacpp:spec_decode_num_accepted_tokens_total{job=~\"$job\"}[5m]) / clamp_min(rate(llamacpp:spec_decode_num_drafts_total{job=~\"$job\"}[5m]), 0.001)",
"legendFormat": "{{job}} accepted per draft step"
},
{
"refId": "B",
"expr": "rate(llamacpp:spec_decode_num_draft_tokens_total{job=~\"$job\"}[5m])",
"legendFormat": "{{job}} draft tokens/s"
}
]
},
@@ -103,13 +108,13 @@
"targets": [
{
"refId": "A",
"expr": "vllm:num_requests_waiting{job=~\"$job\"}",
"legendFormat": "{{job}} waiting"
"expr": "llamacpp:requests_deferred{job=~\"$job\"}",
"legendFormat": "{{job}} deferred"
},
{
"refId": "B",
"expr": "vllm:num_requests_running{job=~\"$job\"}",
"legendFormat": "{{job}} running"
"expr": "llamacpp:requests_processing{job=~\"$job\"}",
"legendFormat": "{{job}} processing"
}
]
},
@@ -143,7 +148,7 @@
"targets": [
{
"refId": "A",
"expr": "rate(vllm:prefix_cache_hits_total{job=~\"$job\"}[5m]) / clamp_min(rate(vllm:prefix_cache_queries_total{job=~\"$job\"}[5m]), 1)",
"expr": "rate(llamacpp:prompt_tokens_cached_total{job=~\"$job\"}[5m]) / clamp_min(rate(llamacpp:prompt_tokens_total{job=~\"$job\"}[5m]), 1)",
"legendFormat": "{{job}} reuse"
}
]
@@ -151,8 +156,8 @@
{
"id": 4,
"type": "timeseries",
"title": "End-to-end request latency p95",
"description": "Wall-clock per request, prefill included — the number an agent-loop turn feels.",
"title": "Decode steps and batch size",
"description": "Wall-clock per request, prefill included \u2014 the number an agent-loop turn feels.",
"gridPos": {
"h": 8,
"w": 12,
@@ -176,8 +181,13 @@
"targets": [
{
"refId": "A",
"expr": "histogram_quantile(0.95, sum by (le, job) (rate(vllm:e2e_request_latency_seconds_bucket{job=~\"$job\"}[5m])))",
"legendFormat": "{{job}} p95"
"expr": "rate(llamacpp:n_decode_total{job=~\"$job\"}[5m])",
"legendFormat": "{{job}} decode steps/s"
},
{
"refId": "B",
"expr": "llamacpp:n_busy_slots_per_decode{job=~\"$job\"}",
"legendFormat": "{{job}} sequences per decode step"
}
]
},
@@ -207,16 +217,6 @@
"overrides": []
},
"targets": [
{
"refId": "A",
"expr": "rate(vllm:generation_tokens_total{job=~\"$job\"}[5m])",
"legendFormat": "{{job}} generated tok/s"
},
{
"refId": "B",
"expr": "rate(vllm:prompt_tokens_total{job=~\"$job\"}[5m])",
"legendFormat": "{{job}} prompt tok/s"
},
{
"refId": "C",
"expr": "llamacpp:predicted_tokens_seconds{job=~\"$job\"}",
@@ -233,7 +233,7 @@
"id": 6,
"type": "timeseries",
"title": "Alerts firing (ALERTS)",
"description": "Prometheus rules for the LLM fleet (shared/prometheus/rules/llm-fleet.yml): pool saturation, queueing, prefix-cache collapse, endpoint down, p95 latency. A firing alert appears here, on Prometheus' /alerts page, and nowhere else — this stack has no Alertmanager, so nothing is notified.",
"description": "Prometheus rules for the LLM fleet (shared/prometheus/rules/llm-fleet.yml): pool saturation, queueing, prefix-cache collapse, endpoint down, p95 latency. A firing alert appears here, on Prometheus' /alerts page, and nowhere else \u2014 this stack has no Alertmanager, so nothing is notified.",
"gridPos": {
"h": 8,
"w": 12,