|
5 | 5 | # Agentic trace replay benchmark for Kimi-K2.7 FP4 on MI355X using vLLM. |
6 | 6 | # KV_OFFLOADING=none -> GPU KV only |
7 | 7 | # KV_OFFLOADING=dram KV_OFFLOAD_BACKEND=lmcache -> LMCache MP server + connector |
| 8 | +# KV_OFFLOADING=dram KV_OFFLOAD_BACKEND=mooncake -> Mooncake embedded store + connector |
8 | 9 | # |
9 | 10 | # Required env vars: |
10 | 11 | # MODEL, TP, CONC, KV_OFFLOADING, TOTAL_CPU_DRAM_GB, RESULT_DIR, DURATION, EP_SIZE |
@@ -60,21 +61,27 @@ export VLLM_ALLREDUCE_USE_SYMM_MEM="${VLLM_ALLREDUCE_USE_SYMM_MEM:-0}" |
60 | 61 | # ---- Server config ---------------------------------------------------------- |
61 | 62 | SERVER_LOG="$RESULT_DIR/server.log" |
62 | 63 | LMCACHE_LOG="$RESULT_DIR/lmcache_server.log" |
| 64 | +MOONCAKE_MASTER_LOG="$RESULT_DIR/mooncake_master.log" |
63 | 65 | mkdir -p "$RESULT_DIR" |
64 | 66 |
|
65 | 67 | OFFLOAD_ARGS=() |
66 | 68 | PREFIX_CACHE_ARGS=() |
67 | 69 |
|
68 | | -# ---- LMCache config --------------------------------------------------------- |
| 70 | +# ---- Offload service cleanup ------------------------------------------------ |
69 | 71 | LMCACHE_PID="" |
| 72 | +MOONCAKE_MASTER_PID="" |
70 | 73 |
|
71 | | -cleanup_lmcache_server() { |
| 74 | +cleanup_offload_services() { |
72 | 75 | if [[ -n "$LMCACHE_PID" ]] && kill -0 "$LMCACHE_PID" 2>/dev/null; then |
73 | 76 | kill "$LMCACHE_PID" 2>/dev/null || true |
74 | 77 | wait "$LMCACHE_PID" 2>/dev/null || true |
75 | 78 | fi |
| 79 | + if [[ -n "$MOONCAKE_MASTER_PID" ]] && kill -0 "$MOONCAKE_MASTER_PID" 2>/dev/null; then |
| 80 | + kill "$MOONCAKE_MASTER_PID" 2>/dev/null || true |
| 81 | + wait "$MOONCAKE_MASTER_PID" 2>/dev/null || true |
| 82 | + fi |
76 | 83 | } |
77 | | -trap cleanup_lmcache_server EXIT |
| 84 | +trap cleanup_offload_services EXIT |
78 | 85 |
|
79 | 86 | wait_for_lmcache_ready() { |
80 | 87 | { set +x; } 2>/dev/null |
@@ -192,8 +199,76 @@ case "$OFFLOAD_MODE" in |
192 | 199 | "{\"kv_connector\":\"LMCacheMPConnector\",\"kv_connector_module_path\":\"lmcache.integration.vllm.lmcache_mp_connector\",\"kv_role\":\"kv_both\",\"kv_connector_extra_config\":{\"lmcache.mp.host\":\"$LMCACHE_CONNECT_HOST\",\"lmcache.mp.port\":$LMCACHE_PORT}}" |
193 | 200 | ) |
194 | 201 | ;; |
| 202 | + mooncake) |
| 203 | + unset VLLM_USE_SIMPLE_KV_OFFLOAD |
| 204 | + |
| 205 | + # Mooncake embedded mode contributes one global segment per GPU rank to |
| 206 | + # a shared distributed store, so pre-divide the aggregate host-memory |
| 207 | + # budget across TP ranks. Mirrors the MI355X DSv4 vLLM recipe. |
| 208 | + MOONCAKE_PER_RANK_GB=$((TOTAL_CPU_DRAM_GB / TP)) |
| 209 | + |
| 210 | + # No prebuilt ROCm wheel: build the Mooncake transfer engine from source |
| 211 | + # if the store module isn't importable. Clone to a container-local dir |
| 212 | + # (NOT bind-mounted /workspace) so the next job's checkout `clean: true` |
| 213 | + # won't trip over root-owned build artifacts. |
| 214 | + if ! python3 -c "from mooncake.store import MooncakeDistributedStore" >/dev/null 2>&1; then |
| 215 | + MOONCAKE_SRC_DIR="${MOONCAKE_SRC_DIR:-/opt/mooncake-src}" |
| 216 | + MOONCAKE_GIT_REF="${MOONCAKE_GIT_REF:-main}" |
| 217 | + rm -rf "$MOONCAKE_SRC_DIR" |
| 218 | + git clone https://github.com/kvcache-ai/Mooncake.git "$MOONCAKE_SRC_DIR" |
| 219 | + ( cd "$MOONCAKE_SRC_DIR" |
| 220 | + git checkout "$MOONCAKE_GIT_REF" |
| 221 | + bash dependencies.sh |
| 222 | + mkdir -p build && cd build |
| 223 | + cmake .. |
| 224 | + make -j |
| 225 | + make install ) |
| 226 | + python3 -c "from mooncake.store import MooncakeDistributedStore" >/dev/null |
| 227 | + fi |
| 228 | + |
| 229 | + MOONCAKE_MASTER_PORT=$((PORT + 12000)) |
| 230 | + MOONCAKE_CONFIG_PATH="$RESULT_DIR/mooncake_config.json" |
| 231 | + cat > "$MOONCAKE_CONFIG_PATH" <<EOF |
| 232 | +{ |
| 233 | + "mode": "embedded", |
| 234 | + "metadata_server": "P2PHANDSHAKE", |
| 235 | + "master_server_address": "127.0.0.1:$MOONCAKE_MASTER_PORT", |
| 236 | + "global_segment_size": "${MOONCAKE_PER_RANK_GB}GB", |
| 237 | + "local_buffer_size": "2GB", |
| 238 | + "protocol": "tcp", |
| 239 | + "device_name": "", |
| 240 | + "enable_offload": false |
| 241 | +} |
| 242 | +EOF |
| 243 | + export MOONCAKE_CONFIG_PATH |
| 244 | + export MC_ENABLE_DEST_DEVICE_AFFINITY=1 |
| 245 | + export PYTHONHASHSEED="${PYTHONHASHSEED:-0}" |
| 246 | + export MC_SLICE_SIZE=1048576 |
| 247 | + export MC_WORKERS_PER_CTX=8 |
| 248 | + |
| 249 | + echo "Starting Mooncake master on port $MOONCAKE_MASTER_PORT..." |
| 250 | + mooncake_master --port "$MOONCAKE_MASTER_PORT" \ |
| 251 | + --eviction_high_watermark_ratio=0.80 \ |
| 252 | + --eviction_ratio=0.10 \ |
| 253 | + --default_kv_lease_ttl=60s \ |
| 254 | + > "$MOONCAKE_MASTER_LOG" 2>&1 & |
| 255 | + MOONCAKE_MASTER_PID=$! |
| 256 | + echo "Mooncake master PID: $MOONCAKE_MASTER_PID" |
| 257 | + sleep 10 |
| 258 | + if ! kill -0 "$MOONCAKE_MASTER_PID" 2>/dev/null; then |
| 259 | + echo "Mooncake master died during startup. Log follows:" >&2 |
| 260 | + cat "$MOONCAKE_MASTER_LOG" >&2 || true |
| 261 | + exit 1 |
| 262 | + fi |
| 263 | + |
| 264 | + PREFIX_CACHE_ARGS=(--enable-prefix-caching) |
| 265 | + OFFLOAD_ARGS=( |
| 266 | + --kv-transfer-config |
| 267 | + '{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_both","kv_connector_extra_config":{"load_async":true}}' |
| 268 | + ) |
| 269 | + ;; |
195 | 270 | *) |
196 | | - echo "Error: unsupported KV_OFFLOAD_BACKEND '$OFFLOAD_MODE' (expected: lmcache)" >&2 |
| 271 | + echo "Error: unsupported KV_OFFLOAD_BACKEND '$OFFLOAD_MODE' (expected: lmcache, mooncake)" >&2 |
197 | 272 | exit 1 |
198 | 273 | ;; |
199 | 274 | esac |
|
0 commit comments