From 36515f7d008a8d692b13411969ae74da860f658d Mon Sep 17 00:00:00 2001 From: ApostaC Date: Wed, 15 Jul 2026 17:39:52 -0700 Subject: [PATCH 1/9] feat(agentic): add LMCache arm to tuned DSV4 FP4 B300 vLLM AgentX recipe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Combine the tuned B300 recipe from PR #2225 (nightly image, sparse DSV4 FlashInfer attention, FULL_DECODE_ONLY CUDA graphs, AMXF4 mega-MoE) with the LMCache 0.5.1 KV-offload backend from PR #2153, mirroring the B200 arm in PR #2231. The lmcache arm keeps the stock PyTorch caching allocator instead of PYTORCH_ALLOC_CONF=expandable_segments:True (expandable-segment cuMem/VMM allocations cannot be CUDA-IPC-exported to the LMCache MP server, the same failure mode as --enable-cumem-allocator on B200) and runs otherwise identical serving flags, so backends are directly comparable. Adds a standalone dsv4-fp4-b300-vllm-agentic-lmcache config section mirroring the vllm-simple DEP4/DEP8 concurrency ladders and a perf-changelog entry triggering it. 中文:将 PR #2225 的 B300 调优配方(nightly 镜像、稀疏 DSV4 FlashInfer 注意力、FULL_DECODE_ONLY CUDA graph、AMXF4 mega-MoE)与 PR #2153 的 LMCache 0.5.1 KV 卸载后端合并,对应 B200 的 PR #2231。lmcache 分支仅以 默认 PyTorch 缓存分配器替代 PYTORCH_ALLOC_CONF=expandable_segments:True (expandable segments 的 cuMem/VMM 分配无法通过 CUDA IPC 导出给 LMCache MP server,与 B200 上 --enable-cumem-allocator 的失败模式相同),其余 serving 参数与其他分支保持一致,便于卸载后端间直接对比。新增独立的 dsv4-fp4-b300-vllm-agentic-lmcache 配置(测试点与 vllm-simple 的 DEP4/DEP8 阶梯对齐)及触发它的 perf-changelog 条目。 Co-Authored-By: Claude Fable 5 --- .../single_node/agentic/dsv4_fp4_b300_vllm.sh | 306 +++++++++++++----- configs/nvidia-master.yaml | 40 ++- perf-changelog.yaml | 11 + 3 files changed, 260 insertions(+), 97 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh b/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh index 3a5be7b578..30c6a76836 100755 --- a/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh +++ b/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh @@ -1,60 +1,47 @@ #!/usr/bin/env bash -set -euo pipefail +set -eo pipefail set -x # Agentic trace replay benchmark for DeepSeek-V4-Pro FP4 on B300 using vLLM. -# Mirrors the fixed-seq-len parallelism options (pure TP and DEP) so the -# agentic sweep can probe both interactivity and throughput regimes: -# pure TP (DP_ATTENTION=false, EP_SIZE=1): attention TP-sharded across -# all $TP GPUs in a single engine. Lower TPOT, lower batch. -# TP+EP (DP_ATTENTION=false, EP_SIZE>1): attention TP-sharded, MoE -# experts EP-sharded within the TP group. -# DEP (DP_ATTENTION=true, EP_SIZE>1): per-DP-rank attention with -# experts EP-sharded across DP ranks (per the vLLM blog recipe). -# Highest aggregate throughput at large CONC. +# v4pro-b300.yaml TP4 and DEP4 recipe. SimpleCPUOffload / MooncakeStore / +# LMCache # -# Image is vllm/vllm-openai:v0.20.0-cu130. block_size=256, kv-cache-dtype=fp8, -# FP4 indexer cache enabled, FULL_AND_PIECEWISE cudagraph capture with -# custom_ops=all (per the vLLM blog recipe at https://vllm.ai/blog/deepseek-v4). +# Image is configured in nvidia-master.yaml. The recipe uses FP8 KV cache, +# sparse DeepSeek-V4 FlashInfer attention with an FP4 indexer cache, mega-MoE, +# and FULL_DECODE_ONLY CUDA graphs with every batch size captured explicitly. # # Required env vars: # MODEL, TP, CONC, KV_OFFLOADING, TOTAL_CPU_DRAM_GB, RESULT_DIR # -# KV_OFFLOADING=dram requires KV_OFFLOAD_BACKEND=mooncake. +# KV_OFFLOADING=none is used by TP4. DEP4 uses KV_OFFLOADING=dram with +# KV_OFFLOAD_BACKEND=vllm-simple, mooncake, or lmcache. source "$(dirname "$0")/../../benchmark_lib.sh" check_env_vars MODEL TP CONC KV_OFFLOADING TOTAL_CPU_DRAM_GB RESULT_DIR DURATION EP_SIZE DP_ATTENTION -DCP_SIZE="${DCP_SIZE:-1}" -PCP_SIZE="${PCP_SIZE:-1}" -VLLM_CP_ARGS=() -if [ "$DCP_SIZE" -gt 1 ]; then - VLLM_CP_ARGS+=(--decode-context-parallel-size "$DCP_SIZE") -fi -if [ "$PCP_SIZE" -gt 1 ]; then - VLLM_CP_ARGS+=(--prefill-context-parallel-size "$PCP_SIZE") -fi - -GPU_COUNT="${GPU_COUNT:-$((TP * PCP_SIZE))}" +GPU_COUNT=$TP if [[ ! "$GPU_COUNT" =~ ^[1-9][0-9]*$ ]]; then echo "Error: GPU_COUNT must be a positive integer, got '$GPU_COUNT'" >&2 exit 1 fi export GPU_COUNT -if declare -p SLURM_JOB_ID >/dev/null 2>&1 && [ -n "$SLURM_JOB_ID" ]; then - SLURM_NODE=unknown - if declare -p SLURMD_NODENAME >/dev/null 2>&1 && [ -n "$SLURMD_NODENAME" ]; then - SLURM_NODE="$SLURMD_NODENAME" - fi - echo "JOB $SLURM_JOB_ID running on $SLURM_NODE" +# Under DP-attention the DP world size equals TP, and the DEP recipe sizes +# per-rank batch as MAX_NUM_SEQS = 2*CONC/TP, which must be an integer. +if [ "$DP_ATTENTION" = "true" ] && [ $((2 * CONC % TP)) -ne 0 ]; then + echo "Error: DEP requires 2*CONC divisible by TP, got CONC='$CONC' and TP='$TP'" >&2 + exit 1 +fi + +if [[ -n "$SLURM_JOB_ID" ]]; then + echo "JOB $SLURM_JOB_ID running on $SLURMD_NODENAME" fi # `hf download` creates the target dir if missing and is itself idempotent. -# When MODEL_PATH is unset (stand-alone runs), fall back to the HF_HUB_CACHE +# When MODEL_PATH is unset (stand-alone runs), fall back to the HF_HUB_CACHE. # Either way, MODEL_PATH is what the server is launched with. -if declare -p MODEL_PATH >/dev/null 2>&1 && [ -n "$MODEL_PATH" ]; then +if [[ -n "$MODEL_PATH" ]]; then if [[ ! -d "$MODEL_PATH" || -z "$(ls -A "$MODEL_PATH" 2>/dev/null)" ]]; then hf download "$MODEL" --local-dir "$MODEL_PATH" fi @@ -68,17 +55,9 @@ nvidia-smi resolve_trace_source install_agentic_deps -# vLLM v0.22.1 can ship CUTLASS DSL 4.5.2 with stale native MLIR bindings, -# which fails DSV4 indexer compilation with mlir_global_dtors(..., data). -# Reinstall the matching native wheel until NVIDIA/cutlass#3259 is resolved. -agentic_pip_install --quiet --force-reinstall --no-deps \ - 'nvidia-cutlass-dsl-libs-cu13==4.5.2' - # vllm-project/router expands the one HTTP backend into one logical worker per -# DP rank and sends X-data-parallel-rank on forwarded requests. aiperf's -# X-Correlation-ID is stable for every turn of a conversation; alias it to the -# router's preferred X-Session-ID header. This also keeps affinity correct when -# testing older wheels that prioritize per-request X-Request-ID. +# DP rank. Bind every turn of a conversation to the same rank by mapping +# AIPerf's stable correlation ID to the router's X-Session-ID header. USE_VLLM_ROUTER=false VLLM_BACKEND_PORT="$PORT" if [ "$DP_ATTENTION" = "true" ]; then @@ -91,31 +70,60 @@ if [ "$DP_ATTENTION" = "true" ]; then agentic_pip_install --quiet "vllm-router==$VLLM_ROUTER_VERSION" fi -# DeepSeek-V4-Pro weights are large; engine startup can exceed default 600s. +# Match the environment used by v4pro-b300.yaml. +export VLLM_USE_V2_MODEL_RUNNER=1 export VLLM_ENGINE_READY_TIMEOUT_S=3600 - -# vllm-project/vllm#43447 keeps local SWA prefix-cache tails sparsely, while -# vllm-project/vllm#44774 applies the same reachability policy to Mooncake's -# store mask. 32k matches the trace-replay tuning validated for this workload. export VLLM_PREFIX_CACHE_RETENTION_INTERVAL=32768 +export VLLM_DSV4_MEGA_FP8_COMBINE=1 +export NCCL_NVLS_ENABLE=1 +export VLLM_USE_RUST_FRONTEND=1 # ---- Server config ---------------------------------------------------------- SERVER_LOG="$RESULT_DIR/server.log" ROUTER_LOG="$RESULT_DIR/router.log" MOONCAKE_MASTER_LOG="$RESULT_DIR/mooncake_master.log" +LMCACHE_SERVER_LOG="$RESULT_DIR/lmcache_server.log" mkdir -p "$RESULT_DIR" SERVER_PID="" ROUTER_PID="" MOONCAKE_MASTER_PID="" +LMCACHE_SERVER_PID="" +# The generated TOTAL_CPU_DRAM_GB budget is proportional to allocated GPUs. +# On cluster:b300-nv, dram-utilization=0.80 and DEP4 resolve to roughly the +# source recipe's 280 GiB per DP rank. TP4 remains GPU-resident. OFFLOAD_ARGS=() -if require_agentic_kv_offload_backend mooncake; then - # Mooncake embedded mode contributes one global segment per GPU rank to - # a shared distributed store. Pre-divide the aggregate host budget - # across those rank-contributed segments. +case "$KV_OFFLOAD_BACKEND" in + "") + require_agentic_kv_offload_none + ;; + vllm-simple) + require_agentic_kv_offload_backend vllm-simple + CPU_BYTES_PER_RANK=$(( TOTAL_CPU_DRAM_GB * 1000 * 1000 * 1000 / GPU_COUNT )) + # Identical prefixes must hash to identical block keys across DP ranks. + export PYTHONHASHSEED=42 + OFFLOAD_CONFIG=$(cat </dev/null + + LMCACHE_HOST=127.0.0.1 + LMCACHE_PORT=$((PORT + 12000)) + LMCACHE_HTTP_PORT=$((PORT + 13000)) + # LMCacheMPConnector concatenates lmcache.mp.host and port into the + # ZMQ endpoint. Bind the server to a raw host, but pass the connector + # a ZMQ-style host string. + LMCACHE_CONNECT_HOST="tcp://$LMCACHE_HOST" + # Pool target derated to 75% of the aggregate budget: pinned host + # memory is unswappable and also consumes GPU-side mapping + # resources, so leave headroom for vLLM host buffers and the OS. + # Full-budget targets OOM-killed the node (host OOM-killer or + # cudaErrorMemoryAllocation) as the cache filled past ~2 TB during + # PR #2153 bring-up. + LMCACHE_L1_SIZE_GB=$((TOTAL_CPU_DRAM_GB * 3 / 4)) + # The pool grows lazily from the initial allocation, so the full + # --l1-size-gb target is not pinned at startup. + LMCACHE_L1_INIT_SIZE_GB=20 + LMCACHE_MQ_TIMEOUT=300 + # Identical prefixes must hash to identical cache keys across DP ranks. + export PYTHONHASHSEED=0 + # Per-engine scheduler stats every 5s, to diagnose per-DP-rank KV + # cache imbalance under the session-sticky router. + export VLLM_LOG_STATS_INTERVAL=5 + + echo "Starting LMCache MP server on port $LMCACHE_PORT..." + # One GPU-side transfer worker avoids concurrent-GPU-transfer stalls + # under heavy async-load pressure; CPU-side workers stay at 8. + lmcache server \ + --host "$LMCACHE_HOST" \ + --port "$LMCACHE_PORT" \ + --http-host "$LMCACHE_HOST" \ + --http-port "$LMCACHE_HTTP_PORT" \ + --l1-size-gb "$LMCACHE_L1_SIZE_GB" \ + --l1-init-size-gb "$LMCACHE_L1_INIT_SIZE_GB" \ + --max-gpu-workers 1 \ + --max-cpu-workers 8 \ + --chunk-size 1024 \ + --l1-align-bytes 16384 \ + --eviction-trigger-watermark 0.85 \ + --eviction-ratio 0.10 \ + --eviction-policy LRU \ + --supported-transfer-mode lmcache_driven \ + --no-separate-object-groups \ + > "$LMCACHE_SERVER_LOG" 2>&1 & + LMCACHE_SERVER_PID=$! + LMCACHE_READY=0 + for _ in $(seq 1 60); do + if ! kill -0 "$LMCACHE_SERVER_PID" 2>/dev/null; then + echo "LMCache server died during startup." >&2 + cat "$LMCACHE_SERVER_LOG" >&2 + exit 1 + fi + if curl --output /dev/null --silent --fail \ + "http://127.0.0.1:$LMCACHE_HTTP_PORT/healthcheck"; then + LMCACHE_READY=1 + break + fi + sleep 2 + done + if [ "$LMCACHE_READY" -ne 1 ]; then + echo "LMCache server did not become healthy in time." >&2 + cat "$LMCACHE_SERVER_LOG" >&2 + exit 1 + fi + unset VLLM_USE_SIMPLE_KV_OFFLOAD OFFLOAD_ARGS=( --kv-transfer-config - '{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_both","kv_connector_extra_config":{"load_async":true}}' + "{\"kv_connector\":\"LMCacheMPConnector\",\"kv_role\":\"kv_both\",\"kv_connector_extra_config\":{\"lmcache.mp.host\":\"$LMCACHE_CONNECT_HOST\",\"lmcache.mp.port\":$LMCACHE_PORT,\"lmcache.mp.mq_timeout\":$LMCACHE_MQ_TIMEOUT}}" ) -fi + ;; + *) + echo "Error: unsupported B300 KV_OFFLOAD_BACKEND='$KV_OFFLOAD_BACKEND'" >&2 + exit 1 + ;; +esac PARALLEL_ARGS=(--tensor-parallel-size "$TP" --data-parallel-size 1) if [ "$DP_ATTENTION" = "true" ]; then PARALLEL_ARGS=(--tensor-parallel-size 1 --data-parallel-size "$TP") fi -EP_ARGS=() +TP_ARGS=() +if [ "$DP_ATTENTION" = "true" ]; then + # LMCacheMPConnector exports the KV cache to the LMCache server through + # legacy CUDA IPC handles, and expandable-segment (cuMem/VMM) allocations + # cannot be exported that way (register_kv_caches fails with + # cudaErrorInvalidValue, same failure mode as --enable-cumem-allocator on + # the B200 lmcache arm in PR #2231), so the lmcache arm keeps the stock + # caching allocator. + if [ "$KV_OFFLOAD_BACKEND" != "lmcache" ]; then + export PYTORCH_ALLOC_CONF=expandable_segments:True + fi +else + export VLLM_ALLREDUCE_USE_FLASHINFER=1 + export VLLM_FLASHINFER_ALLREDUCE_BACKEND=auto + TP_ARGS+=(--disable-custom-all-reduce) +fi + +MODE_ARGS=() if [ "$EP_SIZE" -gt 1 ]; then - EP_ARGS=(--enable-expert-parallel) + MODE_ARGS+=( + --enable-expert-parallel + --enable-ep-weight-filter + --moe-backend deep_gemm_amxf4_mega_moe + ) +fi +if [ "$DP_ATTENTION" = "true" ]; then + MODE_ARGS+=( + --prefill-schedule-interval 8 + --max-num-batched-tokens 8192 + ) fi -# AgentX concurrency counts live session trees, not individual requests. -# Subagent fan-out can push instantaneous request concurrency above CONC, so -# leave 2x headroom rather than clipping those bursts at the scheduler. -MAX_NUM_SEQS=$((2 * CONC)) -if [ "$MAX_NUM_SEQS" -eq 128 ]; then - MAX_NUM_SEQS=136 +if [ "$DP_ATTENTION" = "true" ]; then + # The DEP source recipe enforces 2*CONC = DP_WORLD_SIZE*MAX_NUM_SEQS. + MAX_NUM_SEQS=$((2 * CONC / TP)) +else + # Preserve the previous TP4 scheduler headroom for agentic fan-out. + MAX_NUM_SEQS=$((2 * CONC)) fi +CUDA_GRAPH_CAPTURE_SIZES="" +for ((capture_size = 1; capture_size <= MAX_NUM_SEQS; capture_size++)); do + if [ -n "$CUDA_GRAPH_CAPTURE_SIZES" ]; then + CUDA_GRAPH_CAPTURE_SIZES+="," + fi + CUDA_GRAPH_CAPTURE_SIZES+="$capture_size" +done +COMPILATION_CONFIG="{\"cudagraph_mode\":\"FULL_DECODE_ONLY\",\"cudagraph_capture_sizes\":[${CUDA_GRAPH_CAPTURE_SIZES}],\"mode\":0}" echo "Starting vllm server..." export TORCH_CUDA_ARCH_LIST="10.0" export PYTHONNOUSERSITE=1 export VLLM_FLOAT32_MATMUL_PRECISION=high -vllm serve "$MODEL_PATH" --served-model-name "$MODEL" \ ---host 0.0.0.0 \ ---port "$VLLM_BACKEND_PORT" \ ---trust-remote-code \ ---kv-cache-dtype fp8 \ ---block-size 256 \ -"${PARALLEL_ARGS[@]}" \ -"${VLLM_CP_ARGS[@]}" \ -"${EP_ARGS[@]}" \ ---compilation-config '{"cudagraph_mode":"FULL_AND_PIECEWISE","custom_ops":["all"]}' \ ---attention_config.use_fp4_indexer_cache=True \ ---tokenizer-mode deepseek_v4 \ ---tool-call-parser deepseek_v4 \ ---enable-auto-tool-choice \ ---reasoning-parser deepseek_v4 \ ---enable-prefix-caching \ ---no-disable-hybrid-kv-cache-manager \ ---max-num-seqs "$MAX_NUM_SEQS" \ -"${OFFLOAD_ARGS[@]}" > "$SERVER_LOG" 2>&1 & +{ set +x; } 2>/dev/null +VLLM_CMD=( + vllm serve "$MODEL_PATH" --served-model-name "$MODEL" + --host 0.0.0.0 + --port "$VLLM_BACKEND_PORT" + --gpu-memory-utilization 0.96 + --trust-remote-code + --no-enable-flashinfer-autotune + --no-disable-hybrid-kv-cache-manager + --max-num-seqs "$MAX_NUM_SEQS" + --kv-cache-dtype fp8 + --block-size 256 + --max-model-len 1048576 + --attention-config '{"use_fp4_indexer_cache":true,"backend":"FLASHINFER_MLA_SPARSE_DSV4","use_prefill_query_quantization":true}' + --disable-uvicorn-access-log + --tokenizer-mode deepseek_v4 + --tool-call-parser deepseek_v4 + --enable-auto-tool-choice + --reasoning-parser deepseek_v4 + --compilation-config "$COMPILATION_CONFIG" + "${PARALLEL_ARGS[@]}" + "${TP_ARGS[@]}" + "${MODE_ARGS[@]}" + "${OFFLOAD_ARGS[@]}" +) +printf '%q ' "${VLLM_CMD[@]}" | tee "$RESULT_DIR/vllm_command.txt" +printf '\n' | tee -a "$RESULT_DIR/vllm_command.txt" +"${VLLM_CMD[@]}" > "$SERVER_LOG" 2>&1 & SERVER_PID=$! echo "Server PID: $SERVER_PID" diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index e4e0a7a75f..569adc78d1 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -3346,7 +3346,7 @@ dsr1-fp8-b200-trt: osl: 1024 search-space: - { tp: 8, ep: 1, conc-start: 64, conc-end: 128 } - - { tp: 4, ep: 1, conc-start: 8, conc-end: 16 } + - { tp: 4, ep: 1, conc-start: 8, conc-end: 16 } - { tp: 8, ep: 1, conc-start: 4, conc-end: 8 } - isl: 8192 osl: 1024 @@ -3560,7 +3560,31 @@ dsv4-fp4-b300-vllm: - { tp: 8, ep: 8, dp-attn: true, conc-start: 2048, conc-end: 2048 } dsv4-fp4-b300-vllm-agentic: - image: vllm/vllm-openai:v0.23.0 + image: vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec + model: deepseek-ai/DeepSeek-V4-Pro + model-prefix: dsv4 + runner: cluster:b300-nv + precision: fp4 + framework: vllm + multinode: false + scenarios: + agentic-coding: + - dram-utilization: 0.80 + search-space: + # Preserve the previous GPU-resident TP4 search space on the new image. + - { tp: 8, kv-offloading: none, conc-list: [1, 2, 4, 6, 8, 16] } + - { tp: 4, kv-offloading: none, conc-list: [1, 2, 4, 6, 8, 16] } + - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: vllm-simple, version: "904e4ec" }, conc-list: [8, 16, 24, 32, 40, 48, 56, 64, 72], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [12, 20, 28, 36, 44, 52, 60, 68, 76], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: vllm-simple, version: "904e4ec" }, conc-list: [32, 64, 96, 128, 160, 192, 224, 228], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [40, 72, 104, 136, 168, 200], router: { name: vllm-router, version: "0.1.14" } } + +# LMCache CPU-offload arm of dsv4-fp4-b300-vllm-agentic, split into its own +# config so it can be triggered/tested independently of the vllm-simple and +# Mooncake curves. Points mirror the vllm-simple offload ladders above on the +# same tuned image, so the backends are directly comparable. +dsv4-fp4-b300-vllm-agentic-lmcache: + image: vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec model: deepseek-ai/DeepSeek-V4-Pro model-prefix: dsv4 runner: cluster:b300-nv @@ -3571,16 +3595,8 @@ dsv4-fp4-b300-vllm-agentic: agentic-coding: - dram-utilization: 0.80 search-space: - # Compare native GPU-cache and MooncakeStore CPU-offload cliffs. - - { tp: 4, kv-offloading: none, conc-list: [1, 2, 4, 6, 8, 16] } - - { tp: 4, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [16, 18, 20, 24] } - # TP8 remains cache-resident through conc 52. - - { tp: 8, kv-offloading: none, conc-list: [1, 2, 4, 6, 8, 16, 32, 40, 48, 52] } - - { tp: 8, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [52] } - - { tp: 4, ep: 4, dp-attn: true, kv-offloading: none, conc-list: [8, 16], router: { name: vllm-router, version: "0.1.14" } } - - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: mooncake, version: "0.3.11.post1" }, conc-list: [32], router: { name: vllm-router, version: "0.1.14" } } - # TP8 DEP retains representative low, peak, and transition points. - - { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, conc-list: [52, 72, 100, 128, 144], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [8, 16, 24, 32, 40, 48, 56, 64, 72], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [32, 64, 96, 128, 160, 192, 224, 228], router: { name: vllm-router, version: "0.1.14" } } dsv4-fp4-b300-trt: image: ghcr.io#semianalysisai/trtllm-deepseek-v4:feat-deepseek_v4-c185066 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 44b403ae9f..3cd43afd48 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -4815,3 +4815,14 @@ - "Image: lmsysorg/sglang:v0.5.13.post1-cu130" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2123 +- config-keys: + - dsv4-fp4-b300-vllm-agentic-lmcache + scenario-type: + - agentic-coding + description: + - "Add LMCache 0.5.1 DRAM KV-offload arm on the tuned B300 AgentX recipe from PR #2225 (sparse DSV4 FlashInfer attention, AMXF4 mega-MoE, FULL_DECODE_ONLY CUDA graphs) with image vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec" + - "LMCache MP server (lmcache_driven transfer mode) + LMCacheMPConnector per PR #2153/#2231; L1 pool derated to 75% of TOTAL_CPU_DRAM_GB; PYTORCH_ALLOC_CONF=expandable_segments:True dropped on the lmcache arm only (VMM allocations cannot be CUDA-IPC-exported to the LMCache server, same failure mode as cuMem on B200)" + - "Points mirror the vllm-simple ladders: TP4-DEP4 conc [8, 16, 24, 32, 40, 48, 56, 64, 72]; TP8-DEP8 conc [32, 64, 96, 128, 160, 192, 224, 228]" + - "Parent dsv4-fp4-b300-vllm-agentic updated in the same change to the PR #2225 recipe and search space (image bump, vllm-simple + Mooncake arms) so the shared script stays consistent; the parent points are benchmarked by PR #2225 and not re-triggered here" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXXX + From 8dec80cedfe8e7e08e6df4109903dc5530fce80a Mon Sep 17 00:00:00 2001 From: ApostaC Date: Wed, 15 Jul 2026 17:40:53 -0700 Subject: [PATCH 2/9] chore: fill in perf-changelog pr-link with PR #2232 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:将 perf-changelog 条目的 pr-link 填写为 PR #2232。 Co-Authored-By: Claude Fable 5 --- perf-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 3cd43afd48..732a4feccd 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -4824,5 +4824,5 @@ - "LMCache MP server (lmcache_driven transfer mode) + LMCacheMPConnector per PR #2153/#2231; L1 pool derated to 75% of TOTAL_CPU_DRAM_GB; PYTORCH_ALLOC_CONF=expandable_segments:True dropped on the lmcache arm only (VMM allocations cannot be CUDA-IPC-exported to the LMCache server, same failure mode as cuMem on B200)" - "Points mirror the vllm-simple ladders: TP4-DEP4 conc [8, 16, 24, 32, 40, 48, 56, 64, 72]; TP8-DEP8 conc [32, 64, 96, 128, 160, 192, 224, 228]" - "Parent dsv4-fp4-b300-vllm-agentic updated in the same change to the PR #2225 recipe and search space (image bump, vllm-simple + Mooncake arms) so the shared script stays consistent; the parent points are benchmarked by PR #2225 and not re-triggered here" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXXX + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2232 From 54c612d571b7d701a4e570dcf04692251797acf0 Mon Sep 17 00:00:00 2001 From: ApostaC Date: Thu, 16 Jul 2026 14:12:34 -0700 Subject: [PATCH 3/9] feat(agentic): tier lmcache GPU mem util and add pure-TP lmcache arms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bring-up sweep on PR #2232 (run 29463061871) showed the lmcache arm has <1 GiB GPU headroom at the recipe's gpu-memory-utilization 0.96 (LMCache MP server GPU worker + DeepGEMM/TileLang JIT driver allocations + no expandable segments): every DEP8 point OOMed deterministically growing the torch pool, and 2/9 DEP4 points failed at the margin (JIT module load driver OOM at startup; cuBLAS workspace failure mid-run). Derate DEP8 to the B200-proven 0.92 and DEP4/pure-TP to 0.94. Also add pure-TP LMCache arms (TP8 and TP4, conc [8, 12, 16]) mirroring the upper end of the parent's GPU-resident TP ladders and the B200 lmcache TP8 ladder, for a direct GPU-cache vs LMCache-offload comparison. 中文:PR #2232 的调试扫描(run 29463061871)显示 lmcache 分支在配方的 gpu-memory-utilization 0.96 下 GPU 余量不足 1 GiB(LMCache MP server 的 GPU worker + DeepGEMM/TileLang JIT 驱动层分配 + 无 expandable segments):所有 DEP8 测试点在扩展 torch 内存池时必然 OOM,DEP4 有 2/9 测试点在边缘失败(启动时 JIT 模块加载驱动 OOM;运行中 cuBLAS workspace 失败)。将 DEP8 降额至 B200 验证过的 0.92,DEP4 与纯 TP 降额至 0.94。 另新增纯 TP 的 LMCache 分支(TP8 与 TP4,并发 [8, 12, 16]),与父配置 GPU 驻留 TP 阶梯的高段及 B200 lmcache TP8 阶梯对齐,便于 GPU 缓存与 LMCache 卸载的直接对比。 Co-Authored-By: Claude Fable 5 --- .../single_node/agentic/dsv4_fp4_b300_vllm.sh | 24 +++++++++++++++++-- configs/nvidia-master.yaml | 5 ++++ perf-changelog.yaml | 4 ++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh b/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh index 30c6a76836..5dc8419fe9 100755 --- a/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh +++ b/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh @@ -13,7 +13,8 @@ set -x # Required env vars: # MODEL, TP, CONC, KV_OFFLOADING, TOTAL_CPU_DRAM_GB, RESULT_DIR # -# KV_OFFLOADING=none is used by TP4. DEP4 uses KV_OFFLOADING=dram with +# KV_OFFLOADING=none is used by the GPU-resident TP arms. DRAM offload arms +# (DEP, and pure-TP on the lmcache config) use KV_OFFLOADING=dram with # KV_OFFLOAD_BACKEND=vllm-simple, mooncake, or lmcache. source "$(dirname "$0")/../../benchmark_lib.sh" @@ -94,6 +95,8 @@ LMCACHE_SERVER_PID="" # On cluster:b300-nv, dram-utilization=0.80 and DEP4 resolve to roughly the # source recipe's 280 GiB per DP rank. TP4 remains GPU-resident. OFFLOAD_ARGS=() +# Recipe default; the lmcache arm derates it (see the lmcache case below). +GPU_MEM_UTIL=0.96 case "$KV_OFFLOAD_BACKEND" in "") require_agentic_kv_offload_none @@ -209,6 +212,23 @@ EOF # Per-engine scheduler stats every 5s, to diagnose per-DP-rank KV # cache imbalance under the session-sticky router. export VLLM_LOG_STATS_INTERVAL=5 + # The LMCache MP server keeps a GPU worker (~0.8 GiB CUDA context + + # staging buffers) on every GPU, and this arm cannot run expandable + # segments (the KV cache must be legacy-CUDA-IPC-exportable), so the + # recipe's 0.96 leaves <1 GiB free after vLLM sizes its pool. In the + # PR #2232 bring-up sweep every DEP8 point OOMed deterministically + # growing the torch pool for a 1 GiB DeepGEMM workspace, so DEP8 + # gets the B200 lmcache arm's proven 0.92. DEP4 was only marginal + # (7/9 passed; the failures were a DeepGEMM JIT module load hitting + # driver CUDA_ERROR_OUT_OF_MEMORY at startup and a cuBLAS workspace + # failure mid-run), so DEP4 and the pure-TP arms take a lighter 0.94 + # to keep more GPU KV capacity. KV overflows to the DRAM pool by + # design, so the derate costs little. + if [ "$DP_ATTENTION" = "true" ] && [ "$TP" -eq 8 ]; then + GPU_MEM_UTIL=0.92 + else + GPU_MEM_UTIL=0.94 + fi echo "Starting LMCache MP server on port $LMCACHE_PORT..." # One GPU-side transfer worker avoids concurrent-GPU-transfer stalls @@ -326,7 +346,7 @@ VLLM_CMD=( vllm serve "$MODEL_PATH" --served-model-name "$MODEL" --host 0.0.0.0 --port "$VLLM_BACKEND_PORT" - --gpu-memory-utilization 0.96 + --gpu-memory-utilization "$GPU_MEM_UTIL" --trust-remote-code --no-enable-flashinfer-autotune --no-disable-hybrid-kv-cache-manager diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 569adc78d1..6ae7f426c7 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -3595,6 +3595,11 @@ dsv4-fp4-b300-vllm-agentic-lmcache: agentic-coding: - dram-utilization: 0.80 search-space: + # Pure-TP LMCache arms: upper end of the parent's GPU-resident TP + # ladders, matching the B200 lmcache TP8 conc ladder, for a direct + # GPU-cache vs LMCache-offload comparison at the same points. + - { tp: 8, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [8, 12, 16] } + - { tp: 4, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [8, 12, 16] } - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [8, 16, 24, 32, 40, 48, 56, 64, 72], router: { name: vllm-router, version: "0.1.14" } } - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [32, 64, 96, 128, 160, 192, 224, 228], router: { name: vllm-router, version: "0.1.14" } } diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 732a4feccd..0b49c5583b 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -4821,8 +4821,8 @@ - agentic-coding description: - "Add LMCache 0.5.1 DRAM KV-offload arm on the tuned B300 AgentX recipe from PR #2225 (sparse DSV4 FlashInfer attention, AMXF4 mega-MoE, FULL_DECODE_ONLY CUDA graphs) with image vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec" - - "LMCache MP server (lmcache_driven transfer mode) + LMCacheMPConnector per PR #2153/#2231; L1 pool derated to 75% of TOTAL_CPU_DRAM_GB; PYTORCH_ALLOC_CONF=expandable_segments:True dropped on the lmcache arm only (VMM allocations cannot be CUDA-IPC-exported to the LMCache server, same failure mode as cuMem on B200)" - - "Points mirror the vllm-simple ladders: TP4-DEP4 conc [8, 16, 24, 32, 40, 48, 56, 64, 72]; TP8-DEP8 conc [32, 64, 96, 128, 160, 192, 224, 228]" + - "LMCache MP server (lmcache_driven transfer mode) + LMCacheMPConnector per PR #2153/#2231; L1 pool derated to 75% of TOTAL_CPU_DRAM_GB; PYTORCH_ALLOC_CONF=expandable_segments:True dropped on the lmcache arm only (VMM allocations cannot be CUDA-IPC-exported to the LMCache server, same failure mode as cuMem on B200); gpu-memory-utilization derated 0.96 -> 0.92 on DEP8 and 0.94 on DEP4/pure-TP lmcache points (LMCache's per-GPU server worker + no expandable segments left <1 GiB headroom at 0.96: every DEP8 point OOMed growing the torch pool, DEP4 marginally failed via DeepGEMM JIT driver OOM and a cuBLAS workspace failure in the PR #2232 bring-up sweep)" + - "Points mirror the vllm-simple ladders plus pure-TP arms matching the B200 lmcache TP8 ladder: TP8 and TP4 conc [8, 12, 16]; TP4-DEP4 conc [8, 16, 24, 32, 40, 48, 56, 64, 72]; TP8-DEP8 conc [32, 64, 96, 128, 160, 192, 224, 228]" - "Parent dsv4-fp4-b300-vllm-agentic updated in the same change to the PR #2225 recipe and search space (image bump, vllm-simple + Mooncake arms) so the shared script stays consistent; the parent points are benchmarked by PR #2225 and not re-triggered here" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2232 From bdc33baba9b8c4008aba6e6e60d7bad4724f258d Mon Sep 17 00:00:00 2001 From: ApostaC Date: Fri, 17 Jul 2026 12:55:49 -0700 Subject: [PATCH 4/9] fix(matrix): accept agentic SWE-bench eval rows in the changelog matrix schema MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #1947 made process_changelog's eval pass select single-node agentic (SWE-bench) eval rows via mark_eval_entries --evals-only, but ChangelogMatrixEntry.evals still only accepted SingleNodeMatrixEntry, so any changelog entry touching an agentic-coding config now fails validation (missing isl/osl, extra kv-offloading/scenario-type/duration). Accept Union[SingleNodeMatrixEntry, SingleNodeAgenticMatrixEntry] in evals and add run-eval/eval-only (default false) to the agentic entry model, with a regression test. 中文:PR #1947 使 process_changelog 的评估生成步骤通过 mark_eval_entries --evals-only 选择单节点 agentic(SWE-bench)评估行,但 ChangelogMatrixEntry.evals 仍只接受 SingleNodeMatrixEntry,导致任何涉及 agentic-coding 配置的变更日志条目都无法通过校验(缺少 isl/osl,多出 kv-offloading/scenario-type/duration 字段)。将 evals 改为接受 Union[SingleNodeMatrixEntry, SingleNodeAgenticMatrixEntry],并为 agentic 条目模型添加 run-eval/eval-only(默认 false)字段,附回归测试。 Co-Authored-By: Claude Fable 5 --- utils/matrix_logic/test_validation.py | 48 +++++++++++++++++++++++++++ utils/matrix_logic/validation.py | 9 ++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/utils/matrix_logic/test_validation.py b/utils/matrix_logic/test_validation.py index 9925adb626..6a23c68f21 100644 --- a/utils/matrix_logic/test_validation.py +++ b/utils/matrix_logic/test_validation.py @@ -18,6 +18,7 @@ SingleNodeMasterConfigEntry, MultiNodeMasterConfigEntry, ChangelogEntry, + ChangelogMatrixEntry, validate_matrix_entry, validate_master_config, validate_runner_config, @@ -405,6 +406,53 @@ def test_arbitrary_backend_is_valid_for_single_node_agentic_entry(self): assert entry.kv_offload_backend.name == "future-backend" assert entry.kv_offload_backend.version is None + def test_agentic_eval_row_is_valid_in_changelog_matrix_evals(self): + """Agentic SWE-bench eval rows (mark_eval_entries with --evals-only) + carry run-eval/eval-only plus agentic-only fields and must validate + inside ChangelogMatrixEntry.evals (regression test for the schema gap + left by the PR #1947 SWE-bench eval selection).""" + agentic_eval_row = { + "image": "vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec", + "model": "deepseek-ai/DeepSeek-V4-Pro", + "model-prefix": "dsv4", + "precision": "fp4", + "framework": "vllm", + "runner": "cluster:b300-nv", + "tp": 8, + "pp": 1, + "dcp-size": 1, + "pcp-size": 1, + "ep": 8, + "dp-attn": True, + "spec-decoding": "none", + "conc": 224, + "kv-offloading": "none", + "total-cpu-dram-gb": 0, + "duration": 3600, + "exp-name": "dsv4_tp8_conc224_kvnone", + "scenario-type": "agentic-coding", + "router": {"name": "vllm-router", "version": "0.1.14"}, + "run-eval": True, + "eval-only": True, + } + validated = ChangelogMatrixEntry.model_validate({ + "single_node": {}, + "multi_node": {}, + "evals": [agentic_eval_row], + "multinode_evals": [], + "changelog_metadata": { + "base_ref": "origin/main", + "head_ref": "abc123", + "entries": [{ + "config-keys": ["dsv4-fp4-b300-vllm-agentic"], + "description": ["test"], + "pr-link": "https://github.com/SemiAnalysisAI/InferenceX/pull/2232", + }], + }, + }) + assert isinstance(validated.evals[0], SingleNodeAgenticMatrixEntry) + assert validated.evals[0].eval_only is True + def test_arbitrary_backend_is_valid_for_agentic_search_space(self): entry = AgenticCodingSearchSpaceEntry(**{ "tp": 8, diff --git a/utils/matrix_logic/validation.py b/utils/matrix_logic/validation.py index 6b7c671289..60e26e58f8 100644 --- a/utils/matrix_logic/validation.py +++ b/utils/matrix_logic/validation.py @@ -291,6 +291,10 @@ class SingleNodeAgenticMatrixEntry(BaseModel): duration: int = Field(alias=Fields.DURATION.value) exp_name: str = Field(alias=Fields.EXP_NAME.value) scenario_type: str = Field(alias=Fields.SCENARIO_TYPE.value) + # Present on agentic eval rows (SWE-bench selection via mark_eval_entries); + # benchmark rows are generated with --no-evals and omit both fields. + run_eval: bool = Field(alias=Fields.RUN_EVAL.value, default=False) + eval_only: bool = Field(alias=Fields.EVAL_ONLY.value, default=False) @model_validator(mode='after') def validate_kv_offload_fields(self): @@ -889,7 +893,10 @@ class ChangelogMatrixEntry(BaseModel): ] = Field(default_factory=dict) multi_node: dict[str, list[Union[MultiNodeMatrixEntry, MultiNodeAgenticMatrixEntry]] ] = Field(default_factory=dict) - evals: list[SingleNodeMatrixEntry] = Field(default_factory=list) + # Fixed-seq-len evals plus single-node agentic (SWE-bench) eval rows, + # selected by mark_eval_entries since the SWE-bench Lite eval (PR #1947). + evals: list[Union[SingleNodeMatrixEntry, SingleNodeAgenticMatrixEntry]] = Field( + default_factory=list) multinode_evals: list[MultiNodeMatrixEntry] = Field(default_factory=list) changelog_metadata: ChangelogMetadata From 189aed4882da6ada675deb8edfeac5477613b884 Mon Sep 17 00:00:00 2001 From: ApostaC Date: Fri, 17 Jul 2026 12:59:45 -0700 Subject: [PATCH 5/9] Revert "fix(matrix): accept agentic SWE-bench eval rows in the changelog matrix schema" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit bdc33bab6a72a0847c26be0dbe4e10bd8fe4a2eb to keep this PR scoped to the B300 LMCache recipe. The PR #1947 schema regression (agentic changelog entries fail matrix validation) needs a standalone fix PR; until that merges, check-changelog on this PR is expected to fail. 中文:回退 bdc33bab,使本 PR 仅保留 B300 LMCache 配方相关改动。PR #1947 造成的 schema 回归(agentic 变更日志条目无法通过矩阵校验)需通过独立 PR 修复;在该修复合并前,本 PR 的 check-changelog 预期会失败。 Co-Authored-By: Claude Fable 5 --- utils/matrix_logic/test_validation.py | 48 --------------------------- utils/matrix_logic/validation.py | 9 +---- 2 files changed, 1 insertion(+), 56 deletions(-) diff --git a/utils/matrix_logic/test_validation.py b/utils/matrix_logic/test_validation.py index 6a23c68f21..9925adb626 100644 --- a/utils/matrix_logic/test_validation.py +++ b/utils/matrix_logic/test_validation.py @@ -18,7 +18,6 @@ SingleNodeMasterConfigEntry, MultiNodeMasterConfigEntry, ChangelogEntry, - ChangelogMatrixEntry, validate_matrix_entry, validate_master_config, validate_runner_config, @@ -406,53 +405,6 @@ def test_arbitrary_backend_is_valid_for_single_node_agentic_entry(self): assert entry.kv_offload_backend.name == "future-backend" assert entry.kv_offload_backend.version is None - def test_agentic_eval_row_is_valid_in_changelog_matrix_evals(self): - """Agentic SWE-bench eval rows (mark_eval_entries with --evals-only) - carry run-eval/eval-only plus agentic-only fields and must validate - inside ChangelogMatrixEntry.evals (regression test for the schema gap - left by the PR #1947 SWE-bench eval selection).""" - agentic_eval_row = { - "image": "vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec", - "model": "deepseek-ai/DeepSeek-V4-Pro", - "model-prefix": "dsv4", - "precision": "fp4", - "framework": "vllm", - "runner": "cluster:b300-nv", - "tp": 8, - "pp": 1, - "dcp-size": 1, - "pcp-size": 1, - "ep": 8, - "dp-attn": True, - "spec-decoding": "none", - "conc": 224, - "kv-offloading": "none", - "total-cpu-dram-gb": 0, - "duration": 3600, - "exp-name": "dsv4_tp8_conc224_kvnone", - "scenario-type": "agentic-coding", - "router": {"name": "vllm-router", "version": "0.1.14"}, - "run-eval": True, - "eval-only": True, - } - validated = ChangelogMatrixEntry.model_validate({ - "single_node": {}, - "multi_node": {}, - "evals": [agentic_eval_row], - "multinode_evals": [], - "changelog_metadata": { - "base_ref": "origin/main", - "head_ref": "abc123", - "entries": [{ - "config-keys": ["dsv4-fp4-b300-vllm-agentic"], - "description": ["test"], - "pr-link": "https://github.com/SemiAnalysisAI/InferenceX/pull/2232", - }], - }, - }) - assert isinstance(validated.evals[0], SingleNodeAgenticMatrixEntry) - assert validated.evals[0].eval_only is True - def test_arbitrary_backend_is_valid_for_agentic_search_space(self): entry = AgenticCodingSearchSpaceEntry(**{ "tp": 8, diff --git a/utils/matrix_logic/validation.py b/utils/matrix_logic/validation.py index 60e26e58f8..6b7c671289 100644 --- a/utils/matrix_logic/validation.py +++ b/utils/matrix_logic/validation.py @@ -291,10 +291,6 @@ class SingleNodeAgenticMatrixEntry(BaseModel): duration: int = Field(alias=Fields.DURATION.value) exp_name: str = Field(alias=Fields.EXP_NAME.value) scenario_type: str = Field(alias=Fields.SCENARIO_TYPE.value) - # Present on agentic eval rows (SWE-bench selection via mark_eval_entries); - # benchmark rows are generated with --no-evals and omit both fields. - run_eval: bool = Field(alias=Fields.RUN_EVAL.value, default=False) - eval_only: bool = Field(alias=Fields.EVAL_ONLY.value, default=False) @model_validator(mode='after') def validate_kv_offload_fields(self): @@ -893,10 +889,7 @@ class ChangelogMatrixEntry(BaseModel): ] = Field(default_factory=dict) multi_node: dict[str, list[Union[MultiNodeMatrixEntry, MultiNodeAgenticMatrixEntry]] ] = Field(default_factory=dict) - # Fixed-seq-len evals plus single-node agentic (SWE-bench) eval rows, - # selected by mark_eval_entries since the SWE-bench Lite eval (PR #1947). - evals: list[Union[SingleNodeMatrixEntry, SingleNodeAgenticMatrixEntry]] = Field( - default_factory=list) + evals: list[SingleNodeMatrixEntry] = Field(default_factory=list) multinode_evals: list[MultiNodeMatrixEntry] = Field(default_factory=list) changelog_metadata: ChangelogMetadata From 7c8bd63716143a3887ff2a7929dc9cca7c776d75 Mon Sep 17 00:00:00 2001 From: ApostaC Date: Fri, 17 Jul 2026 13:05:10 -0700 Subject: [PATCH 6/9] refactor(agentic): fold B300 lmcache arms into the official agentic config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per review: run the LMCache sweep together with the official dsv4-fp4-b300-vllm-agentic config instead of a separate section. The standalone dsv4-fp4-b300-vllm-agentic-lmcache config is removed; the parent now carries one lmcache arm per official arm at a +4 conc offset (TP4 [32, 36, 40, 44]; DEP4 [36, 44, 52, 60, 68, 76]; DEP8 [68, 100, 116, 132, 148, 164, 180, 196, 228]), all inside the ranges validated in the PR #2232 bring-up sweeps. The changelog entry now triggers only the parent config. 中文:按评审意见,LMCache 与官方 dsv4-fp4-b300-vllm-agentic 配置在同一 扫描中运行,不再单列配置段。移除独立的 dsv4-fp4-b300-vllm-agentic-lmcache 配置;父配置为每个官方分支各增加一个 +4 并发偏移的 lmcache 分支(TP4 [32, 36, 40, 44];DEP4 [36, 44, 52, 60, 68, 76];DEP8 [68, 100, 116, 132, 148, 164, 180, 196, 228]),全部处于 PR #2232 调试扫描验证过的范围内。变更日志条目现仅触发 父配置。 Co-Authored-By: Claude Fable 5 --- .../single_node/agentic/dsv4_fp4_b300_vllm.sh | 6 ++-- configs/nvidia-master.yaml | 34 +++++-------------- perf-changelog.yaml | 8 ++--- 3 files changed, 14 insertions(+), 34 deletions(-) diff --git a/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh b/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh index 7ca0fd4410..5f0048e8ce 100755 --- a/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh +++ b/benchmarks/single_node/agentic/dsv4_fp4_b300_vllm.sh @@ -13,9 +13,9 @@ set -x # Required env vars: # MODEL, TP, CONC, KV_OFFLOADING, TOTAL_CPU_DRAM_GB, RESULT_DIR # -# GPU-resident arms (TP4 and DEP8 in the parent config) use -# KV_OFFLOADING=none. DRAM offload arms (TP and DEP) use KV_OFFLOADING=dram -# with KV_OFFLOAD_BACKEND=vllm-simple, mooncake, or lmcache. +# GPU-resident arms (TP4 and DEP8) use KV_OFFLOADING=none. DRAM offload +# arms (TP and DEP) use KV_OFFLOADING=dram with +# KV_OFFLOAD_BACKEND=vllm-simple, mooncake, or lmcache. source "$(dirname "$0")/../../benchmark_lib.sh" diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 33750cf874..12a9486be7 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -3962,34 +3962,16 @@ dsv4-fp4-b300-vllm-agentic: - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: vllm-simple, version: "904e4ec" }, conc-list: [32, 40, 48, 56, 64, 72], router: { name: vllm-router, version: "0.1.14" } } # DEP8 SimpleCPU - { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, conc-list: [64, 96, 112, 128, 144, 160, 176, 192, 224], router: { name: vllm-router, version: "0.1.14" } } - # TP4 and DEP4 LMCache: interleave the SimpleCPU ladders above at a - # +4 conc offset, so the curves sample distinct points and the conc - # values stay disjoint from dsv4-fp4-b300-vllm-agentic-lmcache below - # (identical exp-names across configs would collide). + # LMCache arms: interleave each official ladder above at a +4 conc + # offset so the backends sample distinct points on the same recipe. + # Bring-up validated in the PR #2232 sweeps (runs 29463061871 and + # 29535333851): TP/DEP4 at gpu-memory-utilization 0.94, DEP8 at 0.92. + # TP4 LMCache (vs TP4 SimpleCPU) - { tp: 4, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [32, 36, 40, 44] } + # DEP4 LMCache (vs DEP4 SimpleCPU) - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [36, 44, 52, 60, 68, 76], router: { name: vllm-router, version: "0.1.14" } } - -# LMCache CPU-offload arms of dsv4-fp4-b300-vllm-agentic, split into their -# own config so they can be triggered/tested independently. Conc ladders were -# validated in the PR #2232 bring-up sweeps (all 23 points green) and stay -# disjoint from the parent's lmcache arms above. -dsv4-fp4-b300-vllm-agentic-lmcache: - image: vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec - model: deepseek-ai/DeepSeek-V4-Pro - model-prefix: dsv4 - runner: cluster:b300-nv - precision: fp4 - framework: vllm - multinode: false - scenarios: - agentic-coding: - - dram-utilization: 0.80 - search-space: - # Pure-TP LMCache arms matching the B200 lmcache TP8 conc ladder. - - { tp: 8, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [8, 12, 16] } - - { tp: 4, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [8, 12, 16] } - - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [8, 16, 24, 32, 40, 48, 56, 64, 72], router: { name: vllm-router, version: "0.1.14" } } - - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [32, 64, 96, 128, 160, 192, 224, 228], router: { name: vllm-router, version: "0.1.14" } } + # DEP8 LMCache (vs GPU-resident DEP8) + - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [68, 100, 116, 132, 148, 164, 180, 196, 228], router: { name: vllm-router, version: "0.1.14" } } dsv4-fp4-b300-trt: image: ghcr.io#semianalysisai/trtllm-deepseek-v4:feat-deepseek_v4-c185066 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index ea3c1ce69e..82ab4b6cf7 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -4929,14 +4929,12 @@ pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2094 - config-keys: - - dsv4-fp4-b300-vllm-agentic-lmcache - dsv4-fp4-b300-vllm-agentic scenario-type: - agentic-coding description: - - "Add LMCache 0.5.1 DRAM KV-offload arms on the official B300 AgentX recipe from PR #2241 (sparse DSV4 FlashInfer attention, AMXF4 mega-MoE, FULL_DECODE_ONLY CUDA graphs, DEP8 large prefill budget + long-prefill chunking) with image vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec" - - "LMCache MP server (lmcache_driven transfer mode) + LMCacheMPConnector per PR #2153/#2231; L1 pool derated to 75% of TOTAL_CPU_DRAM_GB; PYTORCH_ALLOC_CONF=expandable_segments:True dropped on the lmcache arms only (VMM allocations cannot be CUDA-IPC-exported to the LMCache server, same failure mode as cuMem on B200); gpu-memory-utilization 0.92 on lmcache DEP8 (matches the official DEP8 derate) and 0.94 on lmcache TP/DEP4 (at 0.96 the PR #2232 bring-up sweep hit torch-pool, DeepGEMM-JIT, and cuBLAS-workspace OOMs; all 23 lmcache points green after the derate)" - - "Standalone dsv4-fp4-b300-vllm-agentic-lmcache points (validated in the PR #2232 bring-up sweeps): TP8 and TP4 conc [8, 12, 16]; TP4-DEP4 conc [8, 16, 24, 32, 40, 48, 56, 64, 72]; TP8-DEP8 conc [32, 64, 96, 128, 160, 192, 224, 228]" - - "Parent dsv4-fp4-b300-vllm-agentic gains lmcache arms interleaving the SimpleCPU ladders at a +4 conc offset (TP4 conc [32, 36, 40, 44]; DEP4 conc [36, 44, 52, 60, 68, 76]), so the lmcache backend is tracked in the main B300 AgentX sweep on distinct points" + - "Add LMCache 0.5.1 DRAM KV-offload arms to the official B300 AgentX config from PR #2241 (sparse DSV4 FlashInfer attention, AMXF4 mega-MoE, FULL_DECODE_ONLY CUDA graphs, image vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec), so LMCache is benchmarked in the same sweep as the SimpleCPU and GPU-resident arms" + - "LMCache MP server (lmcache_driven transfer mode) + LMCacheMPConnector per PR #2153/#2231; L1 pool derated to 75% of TOTAL_CPU_DRAM_GB; PYTORCH_ALLOC_CONF=expandable_segments:True dropped on the lmcache arms only (VMM allocations cannot be CUDA-IPC-exported to the LMCache server, same failure mode as cuMem on B200); gpu-memory-utilization 0.92 on lmcache DEP8 (matches the official DEP8 derate) and 0.94 on lmcache TP4/DEP4 (at 0.96 the PR #2232 bring-up sweeps hit torch-pool, DeepGEMM-JIT, and cuBLAS-workspace OOMs; 23 lmcache points validated green in runs 29463061871/29535333851 after the derate)" + - "LMCache ladders interleave the official arms at a +4 conc offset: TP4 [32, 36, 40, 44] vs SimpleCPU [28, 32, 36, 40]; DEP4 [36, 44, 52, 60, 68, 76] vs SimpleCPU [32, 40, 48, 56, 64, 72]; DEP8 [68, 100, 116, 132, 148, 164, 180, 196, 228] vs GPU-resident [64, 96, 112, 128, 144, 160, 176, 192, 224]" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2232 From 690b4f102f1e5872f367c4a7d55202343c0d7d9a Mon Sep 17 00:00:00 2001 From: ApostaC Date: Fri, 17 Jul 2026 13:08:13 -0700 Subject: [PATCH 7/9] chore(agentic): DEP8 lmcache ladder at +16 conc offset capped at 208 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per review: offset the DEP8 lmcache arm by +16 conc from the official GPU-resident DEP8 ladder and cap the maximum at 208, giving [80, 112, 128, 144, 160, 176, 192, 208]. TP4/DEP4 keep the +4 offset. 中文:按评审意见,DEP8 lmcache 分支相对官方 GPU 驻留 DEP8 阶梯偏移 +16 并发,最大并发限制为 208,即 [80, 112, 128, 144, 160, 176, 192, 208]。 TP4/DEP4 保持 +4 偏移。 Co-Authored-By: Claude Fable 5 --- configs/nvidia-master.yaml | 11 ++++++----- perf-changelog.yaml | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 12a9486be7..24dc102b98 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -3962,16 +3962,17 @@ dsv4-fp4-b300-vllm-agentic: - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: vllm-simple, version: "904e4ec" }, conc-list: [32, 40, 48, 56, 64, 72], router: { name: vllm-router, version: "0.1.14" } } # DEP8 SimpleCPU - { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, conc-list: [64, 96, 112, 128, 144, 160, 176, 192, 224], router: { name: vllm-router, version: "0.1.14" } } - # LMCache arms: interleave each official ladder above at a +4 conc - # offset so the backends sample distinct points on the same recipe. - # Bring-up validated in the PR #2232 sweeps (runs 29463061871 and - # 29535333851): TP/DEP4 at gpu-memory-utilization 0.94, DEP8 at 0.92. + # LMCache arms: offset each official ladder above so the backends + # sample distinct points on the same recipe — TP4/DEP4 at +4 conc, + # DEP8 at +16 conc capped at 208. Bring-up validated in the PR #2232 + # sweeps (runs 29463061871 and 29535333851): TP/DEP4 at + # gpu-memory-utilization 0.94, DEP8 at 0.92. # TP4 LMCache (vs TP4 SimpleCPU) - { tp: 4, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [32, 36, 40, 44] } # DEP4 LMCache (vs DEP4 SimpleCPU) - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [36, 44, 52, 60, 68, 76], router: { name: vllm-router, version: "0.1.14" } } # DEP8 LMCache (vs GPU-resident DEP8) - - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [68, 100, 116, 132, 148, 164, 180, 196, 228], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [80, 112, 128, 144, 160, 176, 192, 208], router: { name: vllm-router, version: "0.1.14" } } dsv4-fp4-b300-trt: image: ghcr.io#semianalysisai/trtllm-deepseek-v4:feat-deepseek_v4-c185066 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 82ab4b6cf7..bfee94c7fd 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -4935,6 +4935,6 @@ description: - "Add LMCache 0.5.1 DRAM KV-offload arms to the official B300 AgentX config from PR #2241 (sparse DSV4 FlashInfer attention, AMXF4 mega-MoE, FULL_DECODE_ONLY CUDA graphs, image vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec), so LMCache is benchmarked in the same sweep as the SimpleCPU and GPU-resident arms" - "LMCache MP server (lmcache_driven transfer mode) + LMCacheMPConnector per PR #2153/#2231; L1 pool derated to 75% of TOTAL_CPU_DRAM_GB; PYTORCH_ALLOC_CONF=expandable_segments:True dropped on the lmcache arms only (VMM allocations cannot be CUDA-IPC-exported to the LMCache server, same failure mode as cuMem on B200); gpu-memory-utilization 0.92 on lmcache DEP8 (matches the official DEP8 derate) and 0.94 on lmcache TP4/DEP4 (at 0.96 the PR #2232 bring-up sweeps hit torch-pool, DeepGEMM-JIT, and cuBLAS-workspace OOMs; 23 lmcache points validated green in runs 29463061871/29535333851 after the derate)" - - "LMCache ladders interleave the official arms at a +4 conc offset: TP4 [32, 36, 40, 44] vs SimpleCPU [28, 32, 36, 40]; DEP4 [36, 44, 52, 60, 68, 76] vs SimpleCPU [32, 40, 48, 56, 64, 72]; DEP8 [68, 100, 116, 132, 148, 164, 180, 196, 228] vs GPU-resident [64, 96, 112, 128, 144, 160, 176, 192, 224]" + - "LMCache ladders offset the official arms: TP4 +4 conc [32, 36, 40, 44] vs SimpleCPU [28, 32, 36, 40]; DEP4 +4 conc [36, 44, 52, 60, 68, 76] vs SimpleCPU [32, 40, 48, 56, 64, 72]; DEP8 +16 conc capped at 208 [80, 112, 128, 144, 160, 176, 192, 208] vs GPU-resident [64, 96, 112, 128, 144, 160, 176, 192, 224]" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2232 From 8a88a78627b2310bb4c6ad1dd1c426aa1269a30c Mon Sep 17 00:00:00 2001 From: ApostaC Date: Fri, 17 Jul 2026 13:09:54 -0700 Subject: [PATCH 8/9] chore(agentic): DEP8 lmcache ladder at +8 conc offset capped at 208 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Correct the DEP8 lmcache offset from +16 to +8 (still capped at 208), giving [72, 104, 120, 136, 152, 168, 184, 200]. 中文:将 DEP8 lmcache 分支的并发偏移从 +16 更正为 +8(最大并发仍限制为 208),即 [72, 104, 120, 136, 152, 168, 184, 200]。 Co-Authored-By: Claude Fable 5 --- configs/nvidia-master.yaml | 4 ++-- perf-changelog.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 24dc102b98..34c0809aa4 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -3964,7 +3964,7 @@ dsv4-fp4-b300-vllm-agentic: - { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, conc-list: [64, 96, 112, 128, 144, 160, 176, 192, 224], router: { name: vllm-router, version: "0.1.14" } } # LMCache arms: offset each official ladder above so the backends # sample distinct points on the same recipe — TP4/DEP4 at +4 conc, - # DEP8 at +16 conc capped at 208. Bring-up validated in the PR #2232 + # DEP8 at +8 conc capped at 208. Bring-up validated in the PR #2232 # sweeps (runs 29463061871 and 29535333851): TP/DEP4 at # gpu-memory-utilization 0.94, DEP8 at 0.92. # TP4 LMCache (vs TP4 SimpleCPU) @@ -3972,7 +3972,7 @@ dsv4-fp4-b300-vllm-agentic: # DEP4 LMCache (vs DEP4 SimpleCPU) - { tp: 4, ep: 4, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [36, 44, 52, 60, 68, 76], router: { name: vllm-router, version: "0.1.14" } } # DEP8 LMCache (vs GPU-resident DEP8) - - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [80, 112, 128, 144, 160, 176, 192, 208], router: { name: vllm-router, version: "0.1.14" } } + - { tp: 8, ep: 8, dp-attn: true, kv-offloading: dram, kv-offload-backend: { name: lmcache, version: "0.5.1" }, conc-list: [72, 104, 120, 136, 152, 168, 184, 200], router: { name: vllm-router, version: "0.1.14" } } dsv4-fp4-b300-trt: image: ghcr.io#semianalysisai/trtllm-deepseek-v4:feat-deepseek_v4-c185066 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index bfee94c7fd..97ba12ef34 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -4935,6 +4935,6 @@ description: - "Add LMCache 0.5.1 DRAM KV-offload arms to the official B300 AgentX config from PR #2241 (sparse DSV4 FlashInfer attention, AMXF4 mega-MoE, FULL_DECODE_ONLY CUDA graphs, image vllm/vllm-openai:nightly-dev-x86_64-cu13.0.1-904e4ec), so LMCache is benchmarked in the same sweep as the SimpleCPU and GPU-resident arms" - "LMCache MP server (lmcache_driven transfer mode) + LMCacheMPConnector per PR #2153/#2231; L1 pool derated to 75% of TOTAL_CPU_DRAM_GB; PYTORCH_ALLOC_CONF=expandable_segments:True dropped on the lmcache arms only (VMM allocations cannot be CUDA-IPC-exported to the LMCache server, same failure mode as cuMem on B200); gpu-memory-utilization 0.92 on lmcache DEP8 (matches the official DEP8 derate) and 0.94 on lmcache TP4/DEP4 (at 0.96 the PR #2232 bring-up sweeps hit torch-pool, DeepGEMM-JIT, and cuBLAS-workspace OOMs; 23 lmcache points validated green in runs 29463061871/29535333851 after the derate)" - - "LMCache ladders offset the official arms: TP4 +4 conc [32, 36, 40, 44] vs SimpleCPU [28, 32, 36, 40]; DEP4 +4 conc [36, 44, 52, 60, 68, 76] vs SimpleCPU [32, 40, 48, 56, 64, 72]; DEP8 +16 conc capped at 208 [80, 112, 128, 144, 160, 176, 192, 208] vs GPU-resident [64, 96, 112, 128, 144, 160, 176, 192, 224]" + - "LMCache ladders offset the official arms: TP4 +4 conc [32, 36, 40, 44] vs SimpleCPU [28, 32, 36, 40]; DEP4 +4 conc [36, 44, 52, 60, 68, 76] vs SimpleCPU [32, 40, 48, 56, 64, 72]; DEP8 +8 conc capped at 208 [72, 104, 120, 136, 152, 168, 184, 200] vs GPU-resident [64, 96, 112, 128, 144, 160, 176, 192, 224]" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2232 From 26bf7c79a61ba6b647056a0e5a118be0cb863a39 Mon Sep 17 00:00:00 2001 From: Cameron Quilici Date: Tue, 21 Jul 2026 10:18:34 -0500 Subject: [PATCH 9/9] Update perf-changelog.yaml --- perf-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 7cc4b998e8..8162941c39 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -4992,4 +4992,4 @@ - "LMCache MP server (lmcache_driven transfer mode) + LMCacheMPConnector per PR #2153/#2231; L1 pool derated to 75% of TOTAL_CPU_DRAM_GB; PYTORCH_ALLOC_CONF=expandable_segments:True dropped on the lmcache arms only (VMM allocations cannot be CUDA-IPC-exported to the LMCache server, same failure mode as cuMem on B200); gpu-memory-utilization 0.92 on lmcache DEP8 (matches the official DEP8 derate) and 0.94 on lmcache TP4/DEP4 (at 0.96 the PR #2232 bring-up sweeps hit torch-pool, DeepGEMM-JIT, and cuBLAS-workspace OOMs; 23 lmcache points validated green in runs 29463061871/29535333851 after the derate)" - "LMCache ladders offset the official arms: TP4 +4 conc [32, 36, 40, 44] vs SimpleCPU [28, 32, 36, 40]; DEP4 +4 conc [36, 44, 52, 60, 68, 76] vs SimpleCPU [32, 40, 48, 56, 64, 72]; DEP8 +8 conc capped at 208 [72, 104, 120, 136, 152, 168, 184, 200] vs GPU-resident [64, 96, 112, 128, 144, 160, 176, 192, 224]" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2232 - \ No newline at end of file +