Skip to content

Commit 8d044b1

Browse files
committed
MI300X vLLM PD: persistent JIT cache + root-safe stale-lock cleanup, M4 Docker/runtime parity
- job.slurm: per-image persistent JIT cache (AITER/Triton/TorchInductor/MoRI/vLLM) with sudo stale-lock cleanup (cache is root-owned by the container, so the unprivileged srun user needs sudo to remove dead-owner locks; mirrors AMDSOW Milestone4 cleanup_persistent_jit_locks_node). Fixes cross-run AITER baton deadlock. Adds SYS_ADMIN/IPC_LOCK caps, nofile=1048576, shm-size 192G, /dev/shm mount, and AITER_JIT_DIR/TRITON/TORCHINDUCTOR/MORI/VLLM_CACHE envs. - server_vllm.sh: M4-sized startup timeout (7200s) for cold AITER compile + FULL cudagraph capture; MoRIIO kv-transfer-config (read_mode, allow_full_cudagraph). - amd-master.yaml/models_vllm.yaml: DSR1-0528 FP8 MI300X disagg matrix + M4 flags. - launch_mi300x-amds.sh: MI300X multinode branch + cluster-specific injection. Validated end-to-end: 1k1k TP8 1P1D MTP3 conc=9 -> 90/90 completed, output_throughput 725 tok/s, mean TPOT 11.6ms, MoRIIO KV transfer over Thor RDMA.
1 parent 38773bb commit 8d044b1

7 files changed

Lines changed: 130 additions & 53 deletions

File tree

.github/configs/amd-master.yaml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ dsr1-fp8-mi300x-vllm-disagg:
191191
dp-attn: false
192192
additional-settings:
193193
- "PREFILL_NODES=1"
194-
- "VLLM_MORIIO_CONNECTOR_READ_MODE=1"
195194
decode:
196195
num-worker: 1
197196
tp: 8
@@ -210,7 +209,6 @@ dsr1-fp8-mi300x-vllm-disagg:
210209
dp-attn: false
211210
additional-settings:
212211
- "PREFILL_NODES=1"
213-
- "VLLM_MORIIO_CONNECTOR_READ_MODE=1"
214212
decode:
215213
num-worker: 1
216214
tp: 8
@@ -230,7 +228,6 @@ dsr1-fp8-mi300x-vllm-disagg:
230228
additional-settings:
231229
- "PREFILL_NODES=1"
232230
- "PREFILL_DP8EP=true"
233-
- "VLLM_MORIIO_CONNECTOR_READ_MODE=1"
234231
decode:
235232
num-worker: 1
236233
tp: 8
@@ -254,7 +251,6 @@ dsr1-fp8-mi300x-vllm-disagg:
254251
dp-attn: false
255252
additional-settings:
256253
- "PREFILL_NODES=1"
257-
- "VLLM_MORIIO_CONNECTOR_READ_MODE=1"
258254
decode:
259255
num-worker: 3
260256
tp: 8
@@ -273,7 +269,6 @@ dsr1-fp8-mi300x-vllm-disagg:
273269
dp-attn: false
274270
additional-settings:
275271
- "PREFILL_NODES=1"
276-
- "VLLM_MORIIO_CONNECTOR_READ_MODE=1"
277272
decode:
278273
num-worker: 2
279274
tp: 8
@@ -292,7 +287,6 @@ dsr1-fp8-mi300x-vllm-disagg:
292287
dp-attn: false
293288
additional-settings:
294289
- "PREFILL_NODES=2"
295-
- "VLLM_MORIIO_CONNECTOR_READ_MODE=1"
296290
decode:
297291
num-worker: 1
298292
tp: 8
@@ -311,7 +305,6 @@ dsr1-fp8-mi300x-vllm-disagg:
311305
dp-attn: false
312306
additional-settings:
313307
- "PREFILL_NODES=2"
314-
- "VLLM_MORIIO_CONNECTOR_READ_MODE=1"
315308
decode:
316309
num-worker: 2
317310
tp: 8
@@ -330,7 +323,6 @@ dsr1-fp8-mi300x-vllm-disagg:
330323
dp-attn: false
331324
additional-settings:
332325
- "PREFILL_NODES=2"
333-
- "VLLM_MORIIO_CONNECTOR_READ_MODE=1"
334326
decode:
335327
num-worker: 1
336328
tp: 8
@@ -350,7 +342,6 @@ dsr1-fp8-mi300x-vllm-disagg:
350342
dp-attn: false
351343
additional-settings:
352344
- "PREFILL_NODES=2"
353-
- "VLLM_MORIIO_CONNECTOR_READ_MODE=1"
354345
decode:
355346
num-worker: 1
356347
tp: 8

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,9 @@
33
experimental/multiturn/vllm_benchmark/results/
44
.venv/
55
AMDSOW_CLUSTER_NOTES.md
6+
7+
# AMDSOW local regression run artifacts (not for upstream)
8+
.regression_env.sh
9+
/benchmark_logs/
10+
/validation_*.json
11+
/collect_latest_results.py

benchmarks/multi_node/amd_utils/job.slurm

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,26 @@ export RESULT_FILENAME="${RESULT_FILENAME:-}"
314314
export SPEC_DECODING="${SPEC_DECODING:-}"
315315
export IS_MULTINODE="${IS_MULTINODE:-false}"
316316

317+
# AMDSOW Milestone4 vLLM runs use persistent per-image JIT/cache dirs. This is
318+
# required for AITER/Triton/TorchInductor ABI-consistent runtime artifacts; using
319+
# image-baked aiter/jit/*.so directly can hit torch/c10 undefined-symbol errors.
320+
_cache_tag() { echo "$1" | sed 's|[/:]|-|g' | grep -oP '.{0,40}$'; }
321+
export PERSIST_JIT_CACHE="${PERSIST_JIT_CACHE:-1}"
322+
export JIT_CLEAN_STALE_LOCKS="${JIT_CLEAN_STALE_LOCKS:-1}"
323+
export JIT_CACHE_HOST_ROOT="${JIT_CACHE_HOST_ROOT:-/tmp/amdsow-jit-cache}"
324+
export JIT_CACHE_KEY="${JIT_CACHE_KEY:-$(_cache_tag "${DOCKER_IMAGE_NAME}")}"
325+
if [[ "$ENGINE" == "vllm-disagg" && "$PERSIST_JIT_CACHE" == "1" ]]; then
326+
export AITER_JIT_DIR="${AITER_JIT_DIR:-/jit-cache/aiter}"
327+
export TRITON_CACHE_DIR="${TRITON_CACHE_DIR:-/jit-cache/triton}"
328+
export TORCHINDUCTOR_CACHE_DIR="${TORCHINDUCTOR_CACHE_DIR:-/jit-cache/torchinductor}"
329+
export MORI_JIT_CACHE_DIR="${MORI_JIT_CACHE_DIR:-/jit-cache/mori}"
330+
export VLLM_CACHE_ROOT="${VLLM_CACHE_ROOT:-/jit-cache/vllm}"
331+
JIT_CACHE_DOCKER_MOUNTS="-v ${JIT_CACHE_HOST_ROOT}/${JIT_CACHE_KEY}/aiter:/jit-cache/aiter -v ${JIT_CACHE_HOST_ROOT}/${JIT_CACHE_KEY}/triton:/jit-cache/triton -v ${JIT_CACHE_HOST_ROOT}/${JIT_CACHE_KEY}/torchinductor:/jit-cache/torchinductor -v ${JIT_CACHE_HOST_ROOT}/${JIT_CACHE_KEY}/mori:/jit-cache/mori -v ${JIT_CACHE_HOST_ROOT}/${JIT_CACHE_KEY}/vllm:/jit-cache/vllm"
332+
else
333+
JIT_CACHE_DOCKER_MOUNTS=""
334+
fi
335+
export JIT_CACHE_DOCKER_MOUNTS
336+
317337
SANITIZED_USER=$(echo "$USER_NAME" | tr -c 'a-zA-Z0-9_.-' '_')
318338
export DOCKER_CONT_NAME="container_${ENGINE}_${SANITIZED_USER}_${MODEL_NAME}_${SLURM_JOB_ID}"
319339

@@ -343,6 +363,25 @@ srun --nodelist="$SELECTED_NODELIST_SRUN" bash -c '
343363
echo "NFS cache refreshed on $(hostname)"
344364
'
345365

366+
if [[ "$ENGINE" == "vllm-disagg" && "$PERSIST_JIT_CACHE" == "1" ]]; then
367+
echo "Preparing persistent JIT caches on selected nodes: ${JIT_CACHE_HOST_ROOT}/${JIT_CACHE_KEY}"
368+
srun --nodelist="$SELECTED_NODELIST_SRUN" bash -c '
369+
set -euo pipefail
370+
JIT_CACHE_DIR="${JIT_CACHE_HOST_ROOT}/${JIT_CACHE_KEY}"
371+
mkdir -p "${JIT_CACHE_DIR}/aiter" "${JIT_CACHE_DIR}/triton" "${JIT_CACHE_DIR}/torchinductor" "${JIT_CACHE_DIR}/mori" "${JIT_CACHE_DIR}/vllm"
372+
if [[ "${JIT_CLEAN_STALE_LOCKS:-1}" == "1" ]]; then
373+
# JIT cache files are created by the root-running container, so the
374+
# unprivileged srun user cannot delete stale locks without sudo.
375+
# Mirrors AMDSOW Milestone4 cleanup_persistent_jit_locks_node().
376+
removed=$(sudo find "${JIT_CACHE_DIR}" -type f \( -name "lock" -o -name ".lock" -o -name "lock_*" -o -name "*.lock" \) -print -delete 2>/dev/null | wc -l || true)
377+
if [[ "${removed//[[:space:]]/}" != "0" ]]; then
378+
echo "[jit-cache] removed ${removed//[[:space:]]/} stale lock file(s) under ${JIT_CACHE_DIR} on $(hostname)"
379+
fi
380+
fi
381+
echo "[jit-cache] ready ${JIT_CACHE_DIR} on $(hostname)"
382+
'
383+
fi
384+
346385
# =============================================================================
347386
# Build engine-specific Docker environment variables
348387
# =============================================================================
@@ -411,6 +450,11 @@ if [[ "$ENGINE" == "vllm-disagg" ]]; then
411450
-e HSA_ENABLE_SDMA=1
412451
-e PROXY_STREAM_IDLE_TIMEOUT=\${PROXY_STREAM_IDLE_TIMEOUT:-300}
413452
-e VLLM_MORIIO_CONNECTOR_READ_MODE=\${VLLM_MORIIO_CONNECTOR_READ_MODE:-1}
453+
-e AITER_JIT_DIR=${AITER_JIT_DIR:-}
454+
-e TRITON_CACHE_DIR=${TRITON_CACHE_DIR:-}
455+
-e TORCHINDUCTOR_CACHE_DIR=${TORCHINDUCTOR_CACHE_DIR:-}
456+
-e MORI_JIT_CACHE_DIR=${MORI_JIT_CACHE_DIR:-}
457+
-e VLLM_CACHE_ROOT=${VLLM_CACHE_ROOT:-}
414458
-e PYTHONPYCACHEPREFIX=/tmp/pycache
415459
)
416460
elif [[ "$ENGINE" == "atom-disagg" ]]; then
@@ -534,6 +578,7 @@ fi # end: if ENGINE == atom-disagg
534578
\$DOCKER_CMD ps -aq --filter \"$CONT_FILTER\" | xargs -r \$DOCKER_CMD rm -f || true
535579
\$DOCKER_CMD ps -aq | xargs -r \$DOCKER_CMD stop || true
536580
581+
537582
# Start vLLM external router container on node 0
538583
if [[ \"$ENGINE\" == \"vllm-disagg\" && \"$ROUTER_TYPE\" == \"vllm-router\" && \"\$SLURM_PROCID\" == \"0\" ]]; then
539584
\$DOCKER_CMD rm -f \"$ROUTER_CONT_NAME\" 2>/dev/null || true
@@ -580,21 +625,26 @@ fi
580625
--device=/dev/infiniband/uverbs7 \
581626
--ulimit memlock=-1 \
582627
--ulimit stack=67108864 \
628+
--ulimit nofile=1048576:1048576 \
583629
--network host \
584630
--ipc host \
585631
--group-add video \
632+
--cap-add SYS_ADMIN \
633+
--cap-add IPC_LOCK \
586634
--cap-add SYS_PTRACE \
587635
--security-opt seccomp=unconfined \
588636
--privileged \
637+
--shm-size 192G \
589638
-v /sys:/sys \
639+
-v /dev/shm:/dev/shm \
590640
$(command -v nicctl >/dev/null 2>&1 && echo "-v $(which nicctl):/usr/sbin/nicctl") \
591641
-v ${MODEL_DIR}:/models \
592642
-v \$HOME/.ssh:/root/.ssh \
593-
--shm-size 128G \
594643
-v /tmp:/run_logs \
595644
-v ${BENCHMARK_LOGS_DIR}:/benchmark_logs \
596645
-v ${DI_REPO_DIR}:${DOCKER_MOUNT_PATH} \
597646
${EXTRA_DOCKER_MOUNTS:-} \
647+
${JIT_CACHE_DOCKER_MOUNTS:-} \
598648
\${RDMA_MOUNTS[@]+"\${RDMA_MOUNTS[@]}"} \
599649
${DOCKER_ENV_COMMON[*]} \
600650
${DOCKER_ENV_ENGINE[*]} \

benchmarks/multi_node/amd_utils/models_vllm.yaml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,23 @@ gpt-oss-120b:
4646
DeepSeek-R1-0528:
4747
# DSR1-0528 FP8 MI300X vLLM PD-disaggregation (AMDSOW Milestone4).
4848
# Tensor-parallel size is appended by server_vllm.sh from PREFILL_TP_SIZE / DECODE_TP_SIZE.
49-
# MTP speculative-config is injected by server_vllm.sh from DECODE_MTP_SIZE (decode only);
49+
# MTP speculative-config is injected by server_vllm.sh from DECODE_MTP_SIZE onto BOTH
50+
# producer+consumer (deepseek_mtp needs matching MTP layers across the PD pair);
5051
# do NOT hardcode --speculative-config here or the per-row MTP sizes won't take effect.
52+
#
53+
# The flags/env below are the TP8 profile (AMDSOW exp_common.sh non-DP8EP family):
54+
# block-size 64, FULL_AND_PIECEWISE + pass_config (SP/fuse_rope), Quick Reduce, and
55+
# fusion-shared-experts=1. DP8EP wide-EP rows use the separate dp8ep_* profile below.
5156
prefill_flags: "--dtype auto --trust-remote-code --distributed-executor-backend mp --kv-cache-dtype fp8_e4m3 --block-size 64 --performance-mode throughput --no-enable-chunked-prefill --compilation-config '{\"cudagraph_mode\":\"FULL_AND_PIECEWISE\",\"pass_config\":{\"fuse_rope_kvcache\":true,\"fuse_rope_kvcache_cat_mla\":true,\"enable_sp\":true,\"fuse_gemm_comms\":true,\"fuse_act_padding\":true}}' --no-enable-prefix-caching --max-model-len 32768 --max-num-batched-tokens 32768 --gpu-memory-utilization 0.80"
5257
decode_flags: "--dtype auto --trust-remote-code --distributed-executor-backend mp --kv-cache-dtype fp8_e4m3 --block-size 64 --performance-mode throughput --no-enable-chunked-prefill --compilation-config '{\"cudagraph_mode\":\"FULL_AND_PIECEWISE\",\"pass_config\":{\"fuse_rope_kvcache\":true,\"fuse_rope_kvcache_cat_mla\":true,\"enable_sp\":true,\"fuse_gemm_comms\":true,\"fuse_act_padding\":true}}' --no-enable-prefix-caching --max-model-len 32768 --max-num-batched-tokens 32768 --gpu-memory-utilization 0.80"
53-
env: "VLLM_USE_V1=1 VLLM_ROCM_USE_AITER=1 VLLM_ROCM_USE_AITER_LINEAR=True VLLM_ROCM_USE_AITER_MLA=True VLLM_ROCM_USE_AITER_MOE=True VLLM_ROCM_USE_AITER_FUSION_SHARED_EXPERTS=1 VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4 VLLM_ROCM_QUICK_REDUCE_CAST_BF16_TO_FP16=1 VLLM_ROCM_QUICK_REDUCE_MAX_SIZE_BYTES_MB=2048 VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=3600 VLLM_MORIIO_CONNECTOR_READ_MODE=true VLLM_MOE_DP_CHUNK_SIZE=1024 AITER_ENABLE_VSKIP=0 AITER_ONLINE_TUNE=0 AITER_BYPASS_TUNE_CONFIG=1 MORI_EP_LAUNCH_CONFIG_MODE=AUTO MORI_SHMEM_HEAP_SIZE=24G MORI_SHMEM_MODE=ISOLATION MORI_APP_LOG_LEVEL=INFO MORI_IO_QP_MAX_SEND_WR=8192 MORI_IO_QP_MAX_CQE=16384 MORI_IO_QP_MAX_SGE=4 MORI_RDMA_TC=104 MORI_IB_PATH_MTU=1024 NCCL_IB_DISABLE=0 MORI_ALLOW_FULL_CUDAGRAPH=1"
58+
env: "VLLM_USE_V1=1 VLLM_ROCM_USE_AITER=1 VLLM_ROCM_USE_AITER_LINEAR=True VLLM_ROCM_USE_AITER_MLA=True VLLM_ROCM_USE_AITER_MOE=True VLLM_ROCM_USE_AITER_FUSION_SHARED_EXPERTS=1 VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4 VLLM_ROCM_QUICK_REDUCE_CAST_BF16_TO_FP16=1 VLLM_ROCM_QUICK_REDUCE_MAX_SIZE_BYTES_MB=2048 VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=3600 VLLM_MORIIO_CONNECTOR_READ_MODE=true VLLM_MOE_DP_CHUNK_SIZE=1024 AITER_ENABLE_VSKIP=0 AITER_ONLINE_TUNE=0 AITER_BYPASS_TUNE_CONFIG=1 MORI_EP_LAUNCH_CONFIG_MODE=AUTO MORI_SHMEM_HEAP_SIZE=24G MORI_SHMEM_MODE=ISOLATION MORI_APP_LOG_LEVEL=INFO MORI_IO_QP_MAX_SEND_WR=16384 MORI_IO_QP_MAX_CQE=32768 MORI_IO_QP_MAX_SGE=4 MORI_RDMA_TC=104 MORI_IB_PATH_MTU=1024 NCCL_IB_DISABLE=0 MORI_ALLOW_FULL_CUDAGRAPH=1"
59+
# DP8EP (wide-EP) profile — selected per-role by server_vllm.sh when PREFILL_DP8EP /
60+
# DECODE_DP8EP is true. Mirrors AMDSOW exp_common.sh dp8ep family: block-size 1,
61+
# cudagraph_mode-only compilation (NO pass_config), no --no-enable-chunked-prefill,
62+
# max-model-len 10240, max-num-batched-tokens 8192, --num-gpu-blocks-override 1372000,
63+
# fusion-shared-experts=0, and Quick Reduce OFF. The parallelism flags
64+
# (--tensor-parallel-size 1 --data-parallel-size <gpus> --enable-expert-parallel
65+
# --all2all-backend mori) are appended by server_vllm.sh from GPUS_PER_NODE.
66+
dp8ep_prefill_flags: "--dtype auto --trust-remote-code --distributed-executor-backend mp --kv-cache-dtype fp8_e4m3 --block-size 1 --performance-mode throughput --compilation-config '{\"cudagraph_mode\":\"FULL_AND_PIECEWISE\"}' --no-enable-prefix-caching --max-model-len 10240 --max-num-batched-tokens 8192 --gpu-memory-utilization 0.80 --num-gpu-blocks-override 1372000"
67+
dp8ep_decode_flags: "--dtype auto --trust-remote-code --distributed-executor-backend mp --kv-cache-dtype fp8_e4m3 --block-size 1 --performance-mode throughput --compilation-config '{\"cudagraph_mode\":\"FULL_AND_PIECEWISE\"}' --no-enable-prefix-caching --max-model-len 10240 --max-num-batched-tokens 8192 --gpu-memory-utilization 0.80 --num-gpu-blocks-override 1372000"
68+
dp8ep_env: "VLLM_USE_V1=1 VLLM_ROCM_USE_AITER=1 VLLM_ROCM_USE_AITER_LINEAR=True VLLM_ROCM_USE_AITER_MLA=True VLLM_ROCM_USE_AITER_MOE=True VLLM_ROCM_USE_AITER_FUSION_SHARED_EXPERTS=0 VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=3600 VLLM_MORIIO_CONNECTOR_READ_MODE=true VLLM_MOE_DP_CHUNK_SIZE=1024 AITER_ENABLE_VSKIP=0 AITER_ONLINE_TUNE=0 AITER_BYPASS_TUNE_CONFIG=1 MORI_EP_LAUNCH_CONFIG_MODE=AUTO MORI_SHMEM_HEAP_SIZE=24G MORI_SHMEM_MODE=ISOLATION MORI_APP_LOG_LEVEL=INFO MORI_IO_QP_MAX_SEND_WR=16384 MORI_IO_QP_MAX_CQE=32768 MORI_IO_QP_MAX_SGE=4 MORI_RDMA_TC=104 MORI_IB_PATH_MTU=1024 NCCL_IB_DISABLE=0 MORI_ALLOW_FULL_CUDAGRAPH=1"

0 commit comments

Comments
 (0)