Skip to content

Commit b9e84bc

Browse files
authored
refactor(agentic): consume producer KV capacity (#547)
1 parent 54d5e09 commit b9e84bc

8 files changed

Lines changed: 21 additions & 131 deletions

File tree

packages/app/src/components/inference/agentic-point/server-metric-cards.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ export function InflightUniqueTokensCard({
416416
}: {
417417
phaseTimeline: RequestTimeline | null;
418418
timelineLoading: boolean;
419-
/** KV-cache pool size in tokens (vLLM only) — drawn as a constant ceiling. */
419+
/** KV-cache pool size in tokens (vLLM/SGLang) — drawn as a constant ceiling. */
420420
kvCachePoolTokens: number | null;
421421
}) {
422422
return (
@@ -437,7 +437,7 @@ export function InflightUniqueTokensCard({
437437
// so brief turn-handoff dips don't dominate the chart.
438438
const raw = inflightUniqueTokens(phaseTimeline.requests);
439439
const smoothed = timeRollingAverage(raw, 30);
440-
// KV-cache pool size (vLLM only) drawn as a constant ceiling so
440+
// KV-cache pool size (vLLM/SGLang) drawn as a constant ceiling so
441441
// you can see how close the working set gets to eviction
442442
// pressure. Phase-independent — it's a static config value.
443443
const pool = kvCachePoolTokens;

packages/app/src/hooks/api/use-trace-server-metrics.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ export interface TraceServerMetrics {
7878
*/
7979
kvCacheUsageByEngine: { engineLabel: string; points: TimeSeriesPoint[] }[];
8080
/**
81-
* Total KV-cache pool size in tokens (num_gpu_blocks × block_size, summed
82-
* across engines). vLLM only — null for SGLang/TRT or older rows.
81+
* Deployment-wide KV-cache pool size in tokens emitted by InferenceX.
82+
* Available for vLLM/SGLang agentic rows; null for unsupported or older rows.
8383
*/
8484
kvCachePoolTokens: number | null;
8585
/** Orchestrator-normalized metrics grouped by endpoint/worker. */

packages/constants/src/metric-keys.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ export const METRIC_KEYS = new Set([
112112
// profiling window (agentic aiperf; flat in v2 artifacts, mapped from
113113
// server_metrics.kv_cache.gpu_usage_pct in v3)
114114
'gpu_kv_cache_usage_pct',
115+
// Deployment-wide KV-cache capacity emitted by InferenceX agentic processing.
116+
'kv_cache_pool_tokens',
115117
// measured power / energy (emitted by runner's aggregate_power.py)
116118
// avg_power_w: mean per-GPU draw (W) during the load window
117119
// joules_per_output_token: energy / total_output_tokens. CLUSTER-WIDE on

packages/db/src/etl/benchmark-ingest.ts

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import type postgres from 'postgres';
66
import type { BenchmarkParams } from './benchmark-mapper';
7-
import { kvCachePoolTokensFromServerLog } from './server-log-metrics';
87

98
type Sql = ReturnType<typeof postgres>;
109

@@ -74,12 +73,16 @@ export async function bulkIngestBenchmarkRows(
7473
unnest(${sql.array(workersJsons)}::jsonb[])
7574
on conflict (workflow_run_id, config_id, benchmark_type, isl, osl, conc, offload_mode)
7675
do update set
77-
-- Replace metrics with the fresh artifact values, but carry over
78-
-- kv_cache_pool_tokens: it is derived from the server log at
79-
-- insertServerLog time (not present in any artifact JSON), so a later
80-
-- upsert from the aggregated results_bmk artifact would silently wipe it.
76+
-- Producer artifacts now carry kv_cache_pool_tokens. Preserve an existing
77+
-- backfill only when replaying a legacy artifact that predates the field.
8178
metrics = excluded.metrics || jsonb_strip_nulls(
82-
jsonb_build_object('kv_cache_pool_tokens', benchmark_results.metrics->'kv_cache_pool_tokens')
79+
jsonb_build_object(
80+
'kv_cache_pool_tokens',
81+
coalesce(
82+
excluded.metrics->'kv_cache_pool_tokens',
83+
benchmark_results.metrics->'kv_cache_pool_tokens'
84+
)
85+
)
8386
),
8487
image = excluded.image,
8588
workers = excluded.workers
@@ -113,18 +116,9 @@ export async function insertServerLog(
113116
insert into server_logs (server_log) values (${serverLog})
114117
returning id
115118
`;
116-
// Derive the KV-cache pool size (tokens) from the log's authoritative
117-
// "GPU KV cache size: N tokens" line(s) and stash it on the result's metrics
118-
// JSON, mirroring how trace-replay-ingest derives cache-hit rates. The
119-
// scraped vllm:cache_config_info metric can't reconstruct this for MLA models.
120-
const kvCachePoolTokens = kvCachePoolTokensFromServerLog(serverLog);
121119
await sql`
122120
update benchmark_results
123-
set server_log_id = ${logId}${
124-
kvCachePoolTokens === null
125-
? sql``
126-
: sql`, metrics = jsonb_set(metrics, '{kv_cache_pool_tokens}', to_jsonb(${kvCachePoolTokens}::bigint))`
127-
}
121+
set server_log_id = ${logId}
128122
where id = any(${sql.array(unlinked.map((r) => r.id))}::bigint[])
129123
`;
130124
}

packages/db/src/etl/benchmark-mapper.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,7 @@ function makeV3AgenticRow(overrides: Record<string, any> = {}): Record<string, a
655655
kv_offload_backend: '',
656656
num_requests_total: 1648,
657657
num_requests_successful: 1648,
658+
kv_cache_pool_tokens: 11_500_000,
658659
dataset: {
659660
source_type: 'public_dataset',
660661
hf_dataset_name: 'semianalysisai/cc-traces-weka-062126',
@@ -817,6 +818,7 @@ describe('mapBenchmarkRow — v3 agentic nested agg schema', () => {
817818
expect(m.server_gpu_cache_hit_rate).toBeCloseTo(0.78539, 6);
818819
expect(m.server_external_cache_hit_rate).toBe(0);
819820
expect(m.gpu_kv_cache_usage_pct).toBeCloseTo(0.82134, 6);
821+
expect(m.kv_cache_pool_tokens).toBe(11_500_000);
820822
expect(m.total_prompt_tokens).toBe(261750519);
821823
expect(m.total_generation_tokens).toBe(1422696);
822824
expect(m.total_requests_completed).toBe(1648);

packages/db/src/etl/server-log-metrics.test.ts

Lines changed: 0 additions & 43 deletions
This file was deleted.

packages/db/src/etl/server-log-metrics.ts

Lines changed: 0 additions & 65 deletions
This file was deleted.

packages/db/src/queries/trace-server-metrics.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ export interface TraceServerMetrics {
8383
*/
8484
kvCacheUsageByEngine: { engineLabel: string; points: TimeSeriesPoint[] }[];
8585
/**
86-
* Total KV-cache pool size in tokens (num_gpu_blocks × block_size, summed
87-
* across engines). vLLM only — null for SGLang/TRT or older rows.
86+
* Deployment-wide KV-cache pool size in tokens emitted by InferenceX.
87+
* Available for vLLM/SGLang agentic rows; null for unsupported or older rows.
8888
*/
8989
kvCachePoolTokens: number | null;
9090
/** Orchestrator-normalized metrics grouped by endpoint/worker. */
@@ -95,7 +95,7 @@ interface RawMetaRow extends PointMeta {
9595
trace_replay_id: number | null;
9696
has_blob: boolean;
9797
chart_series: ChartSeries | null;
98-
/** Derived at server-log ingest from "GPU KV cache size: N tokens" lines. */
98+
/** Producer-emitted deployment-wide KV-cache capacity. */
9999
kv_cache_pool_tokens: string | null;
100100
}
101101

0 commit comments

Comments
 (0)