-
Notifications
You must be signed in to change notification settings - Fork 227
[LMCache] Add LMCache configs for dsv4 vllm b200/b300 agentix setups #2153
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
ApostaC
wants to merge
19
commits into
main
Choose a base branch
from
lmcache/agentix
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+273
−11
Open
Changes from all commits
Commits
Show all changes
19 commits
Select commit
Hold shift + click to select a range
10e6639
Add LMCache configs for dsv4 vllm b200/b300
ApostaC 73137f1
update perf changelog
ApostaC 951f2c8
Merge origin/main into lmcache/agentix, re-append lmcache changelog e…
ApostaC 4244f91
lmcache: derate L1 pool to 75%, move to vLLM v0.24.0, defer B300 section
ApostaC 380ee5a
fixing the comments and picking optimizations from #2138
ApostaC 6623385
merging upstream updates
ApostaC d9209dd
revert to 0.24.0
ApostaC b935b80
Merge remote-tracking branch 'origin/main' into lmcache/agentix
ApostaC fa1a16c
update vllm commands
ApostaC ef9db5e
update configs
ApostaC 7439500
update gpu memory util
ApostaC b750702
add gpu memory util for EP
ApostaC 0b8646f
move to 0.88 gpu mem util
ApostaC e550e72
Merge remote-tracking branch 'origin/main' into lmcache/agentix
ApostaC fc97185
update configure and allow vllm to log
ApostaC 09e8bce
Merge remote-tracking branch 'origin/main' into agent/batch-agentx-2153
cquil11 5f847dc
fix(config): structure LMCache backend metadata
cquil11 fb04705
Merge remote-tracking branch 'origin/main' into lmcache/agentix
ApostaC 381f4c2
tune lmcache config to disable object groups
ApostaC File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -21,7 +21,7 @@ set -x | |
| # Required env vars: | ||
| # MODEL, TP, CONC, KV_OFFLOADING, TOTAL_CPU_DRAM_GB, RESULT_DIR | ||
| # | ||
| # KV_OFFLOADING=dram requires KV_OFFLOAD_BACKEND=mooncake. | ||
| # KV_OFFLOADING=dram requires KV_OFFLOAD_BACKEND=mooncake or lmcache. | ||
|
|
||
| source "$(dirname "$0")/../../benchmark_lib.sh" | ||
|
|
||
|
|
@@ -99,15 +99,31 @@ export VLLM_PREFIX_CACHE_RETENTION_INTERVAL=32768 | |
| 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="" | ||
|
|
||
| # 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)) | ||
|
|
||
| # Serving-flag overlays: the lmcache arm replaces these with its tuned | ||
| # recipe; Mooncake and GPU-cache baselines keep the stock flags. | ||
| VLLM_COMPILATION_CONFIG='{"cudagraph_mode":"FULL_AND_PIECEWISE","custom_ops":["all"]}' | ||
| VLLM_TUNING_ARGS=() | ||
| EP_TUNING_ARGS=() | ||
|
|
||
| OFFLOAD_ARGS=() | ||
|
|
||
| if require_agentic_kv_offload_backend mooncake; then | ||
| if agentic_kv_offload_enabled; then | ||
| case "$KV_OFFLOAD_BACKEND" in | ||
| mooncake) | ||
| require_agentic_kv_offload_backend mooncake | ||
| # Embedded mode contributes one segment per GPU rank to a shared | ||
| # distributed store, so pre-divide the aggregate host-memory budget. | ||
| PER_RANK_GB=$((TOTAL_CPU_DRAM_GB / GPU_COUNT)) | ||
|
|
@@ -167,6 +183,133 @@ EOF | |
| --kv-transfer-config | ||
| '{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_both","kv_connector_extra_config":{"load_async":true}}' | ||
| ) | ||
| ;; | ||
| lmcache) | ||
| require_agentic_kv_offload_backend lmcache | ||
| # The LMCache MP server owns the host-DRAM KV pool as one shared | ||
| # tier; vLLM ranks attach via LMCacheMPConnector, so the aggregate | ||
| # host budget is passed through undivided (unlike Mooncake's | ||
| # per-rank segments). Follows the LMCache DeepSeek-V4 recipe | ||
| # (docs.lmcache.ai/recipes/deepseek_v4_flash.html); LMCache handles | ||
| # DSV4's Sparse-MLA hybrid KV geometries automatically. | ||
| LMCACHE_VERSION=0.5.1 | ||
| agentic_pip_install --quiet --no-cache-dir "lmcache==$LMCACHE_VERSION" | ||
| python3 -c "import lmcache.integration.vllm.lmcache_mp_connector" >/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 | ||
|
|
||
| # Tuned DeepSeek-V4 serving recipe for this section's image: | ||
| # decode-only CUDA graphs, sparse MLA with prefill query | ||
| # quantization, AMXF4 Mega-MoE, and NUMA binding. | ||
| # --enable-cumem-allocator is deliberately absent: LMCacheMPConnector | ||
| # exports the KV cache to the LMCache server through legacy CUDA IPC | ||
| # handles, and cuMem/VMM allocations cannot be exported that way | ||
| # (register_kv_caches fails with cudaErrorInvalidValue). | ||
| VLLM_COMPILATION_CONFIG='{"cudagraph_mode":"FULL_DECODE_ONLY","mode":0}' | ||
| VLLM_TUNING_ARGS=( | ||
| --numa-bind | ||
| --prefill-schedule-interval 8 | ||
| --max-cudagraph-capture-size "$MAX_NUM_SEQS" | ||
| --no-enable-flashinfer-autotune | ||
| --attention-config '{"backend":"FLASHINFER_MLA_SPARSE_DSV4","use_prefill_query_quantization":true}' | ||
| --disable-uvicorn-access-log | ||
| ) | ||
| # fastsafetensors stages checkpoint shards on-GPU while loading. | ||
| # Without --enable-ep-weight-filter every rank stages the full | ||
| # expert weights and OOMs during load, so it is EP-only here. | ||
| # GPU memory utilization stays at the vLLM default: the Mega-MoE | ||
| # path JIT-loads DeepGEMM/TileLang kernels at runtime and those | ||
| # driver allocations live outside the vLLM pool, so | ||
| # VLLM_DEEP_GEMM_WARMUP=skip (exported below) keeps DeepGEMM from | ||
| # front-loading them all during startup. | ||
| EP_TUNING_ARGS=( | ||
| --moe-backend deep_gemm_amxf4_mega_moe | ||
| --enable-ep-weight-filter | ||
| --load-format fastsafetensors | ||
| ) | ||
| export VLLM_USE_V2_MODEL_RUNNER=1 | ||
| export VLLM_USE_RUST_FRONTEND=1 | ||
| export VLLM_DEEPSEEK_V4_USE_MEGA_MOE=1 | ||
| export VLLM_USE_FLASHINFER_MOE_FP8=0 | ||
| export VLLM_DEEP_GEMM_WARMUP=skip | ||
| export VLLM_DSV4_MEGA_FP8_COMBINE=1 | ||
| export VLLM_RPC_TIMEOUT=600000 | ||
| export TILELANG_CLEANUP_TEMP_FILES=1 | ||
| # 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\":\"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}}" | ||
| ) | ||
| ;; | ||
| *) | ||
| echo "Error: unsupported KV_OFFLOAD_BACKEND '$KV_OFFLOAD_BACKEND' (expected one of: mooncake, lmcache)" >&2 | ||
| exit 1 | ||
| ;; | ||
| esac | ||
| fi | ||
|
|
||
| PARALLEL_ARGS=(--tensor-parallel-size "$TP" --data-parallel-size 1) | ||
|
|
@@ -176,14 +319,9 @@ fi | |
|
|
||
| EP_ARGS=() | ||
| if [ "$EP_SIZE" -gt 1 ]; then | ||
| EP_ARGS=(--enable-expert-parallel) | ||
| EP_ARGS=(--enable-expert-parallel "${EP_TUNING_ARGS[@]}") | ||
| 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)) | ||
|
|
||
|
Comment on lines
-182
to
-186
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is being moved to the top of the script |
||
| echo "Starting vllm server..." | ||
| export TORCH_CUDA_ARCH_LIST="10.0" | ||
| export PYTHONNOUSERSITE=1 | ||
|
|
@@ -200,7 +338,8 @@ VLLM_CMD=( | |
| "${PARALLEL_ARGS[@]}" | ||
| "${VLLM_CP_ARGS[@]}" | ||
| "${EP_ARGS[@]}" | ||
| --compilation-config '{"cudagraph_mode":"FULL_AND_PIECEWISE","custom_ops":["all"]}' | ||
| --compilation-config "$VLLM_COMPILATION_CONFIG" | ||
| "${VLLM_TUNING_ARGS[@]}" | ||
| --attention_config.use_fp4_indexer_cache=True | ||
| --tokenizer-mode deepseek_v4 | ||
| --tool-call-parser deepseek_v4 | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.