Skip to content
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions benchmarks/single_node/fixed_seq_len/minimaxm3_fp4_rtx6000pro.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
#!/usr/bin/env bash

# MiniMax-M3 NVFP4 RTX PRO 6000 Blackwell single-node vLLM recipe.
# This is the PCIe/SM120 counterpart to minimaxm3_fp4_b200.sh. It keeps
# the ModelOpt NVFP4, FP8 KV-cache, and MSA block-size settings while using
# NCCL collectives instead of the B200-tuned FlashInfer/TRT-LLM all-reduce.

source "$(dirname "$0")/../../benchmark_lib.sh"

check_env_vars \
MODEL \
TP \
EP_SIZE \
DP_ATTENTION \
CONC \
ISL \
OSL \
MAX_MODEL_LEN \
RANDOM_RANGE_RATIO \
RESULT_FILENAME

if [[ "$MODEL" != /* ]]; then hf download "$MODEL"; fi

if [[ -n "$SLURM_JOB_ID" ]]; then
echo "JOB $SLURM_JOB_ID running on $SLURMD_NODENAME"
fi

nvidia-smi

SERVER_LOG=/workspace/server.log
GPU_MEM_UTIL="${GPU_MEM_UTIL:-0.90}"

export VLLM_ENGINE_READY_TIMEOUT_S=3600
export VLLM_FLOAT32_MATMUL_PRECISION=high

if [ "${DP_ATTENTION}" = "true" ]; then
PARALLEL_ARGS=(
--tensor-parallel-size 1
--data-parallel-size "$TP"
--enable-expert-parallel
)
elif [ "$EP_SIZE" -gt 1 ]; then
PARALLEL_ARGS=(
--tensor-parallel-size "$TP"
--enable-expert-parallel
)
else
PARALLEL_ARGS=(--tensor-parallel-size "$TP")
fi

if [ "${EVAL_ONLY}" = "true" ]; then
setup_eval_context
MAX_MODEL_LEN="$EVAL_MAX_MODEL_LEN"
fi
start_gpu_monitor

set -x
vllm serve "$MODEL" --port "$PORT" \
"${PARALLEL_ARGS[@]}" \
--disable-custom-all-reduce \
--gpu-memory-utilization "$GPU_MEM_UTIL" \
--max-model-len "$MAX_MODEL_LEN" \
--kv-cache-dtype fp8 \
--block-size 128 \
--language-model-only \
--max-cudagraph-capture-size 2048 \
--max-num-batched-tokens "$((ISL * 2))" \
--stream-interval 20 \
--no-enable-prefix-caching \
--trust-remote-code > "$SERVER_LOG" 2>&1 &

SERVER_PID=$!

wait_for_server_ready --port "$PORT" --server-log "$SERVER_LOG" --server-pid "$SERVER_PID"

run_benchmark_serving \
--model "$MODEL" \
--port "$PORT" \
--backend vllm \
--input-len "$ISL" \
--output-len "$OSL" \
--random-range-ratio "$RANDOM_RANGE_RATIO" \
--num-prompts "$((CONC * 10))" \
--max-concurrency "$CONC" \
--result-filename "$RESULT_FILENAME" \
--result-dir /workspace/ \
--trust-remote-code

if [ "${RUN_EVAL}" = "true" ]; then
run_eval --framework lm-eval --port "$PORT"
append_lm_eval_summary
fi

stop_gpu_monitor
set +x
16 changes: 16 additions & 0 deletions configs/nvidia-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7348,6 +7348,22 @@ minimaxm3-fp8-b300-vllm:
- { tp: 4, ep: 4, dp-attn: true, conc-start: 64, conc-end: 128 }
- { tp: 8, ep: 8, dp-attn: true, conc-start: 128, conc-end: 512 }

# MiniMax-M3 NVFP4 single-node vLLM bring-up on 8x RTX PRO 6000.
minimaxm3-fp4-rtx6000pro-vllm:
image: vllm/vllm-openai:vllm-minimax-m3-perf-x86_64-13.0.1-8b00f41@sha256:6af4be7ae69a5f424de85b3d514ac79778bdcf4a9d05f93ec908a4095e0f1253
model: nvidia/MiniMax-M3-NVFP4
model-prefix: minimaxm3
runner: rtx6000pro-lat
precision: fp4
framework: vllm
multinode: false
scenarios:
fixed-seq-len:
- isl: 8192
osl: 1024
search-space:
- { tp: 8, conc-list: [1] }

# MiniMax-M3 NVFP4 (nvidia/MiniMax-M3-NVFP4) B300 single-node vLLM — FP4 variant
# of minimaxm3-fp8-b300-vllm. MiniMax-M3 modelopt NVFP4 support (vllm-project/vllm
# PR #46380) is baked into the perf container image, so no runtime patch is
Expand Down
9 changes: 9 additions & 0 deletions configs/runners.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,10 @@ labels:
- gb300-nv_0
- gb300-nv_1
- gb300-nv_2
rtx6000pro:
- rtx6000pro-lat_00
rtx6000pro-lat:
- rtx6000pro-lat_00
cluster:h100-cw:
- h100-cw_00
- h100-cw_01
Expand Down Expand Up @@ -251,6 +255,8 @@ labels:
- gb300-nv_0
- gb300-nv_1
- gb300-nv_2
cluster:rtx6000pro-lat:
- rtx6000pro-lat_00
cluster:mi300x-amds:
- mi300x-amds_00
- mi300x-amds_01
Expand Down Expand Up @@ -315,6 +321,9 @@ hardware:
cluster:gb200-nv:
available-cpu-dram-mib: 860_160
gpus-per-node: 4
cluster:rtx6000pro-lat:
available-cpu-dram-mib: 1_500_000
gpus-per-node: 8
cluster:mi300x-amds:
available-cpu-dram-mib: 2_321_924
gpus-per-node: 8
Expand Down
10 changes: 10 additions & 0 deletions perf-changelog.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5060,3 +5060,13 @@
- "Re-pin VLLM_ROUTER_IMAGE to vllm/vllm-router:nightly-20260716-1fbcde7 (previous nightly-20260629-e667ebb was garbage-collected from Docker Hub)"
- "Exclude known-bad nodes mia1-p01-g09,g14 from the disagg node pool"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2301

- config-keys:
- minimaxm3-fp4-rtx6000pro-vllm
scenario-type:
- fixed-seq-len
description:
- "Add MiniMax-M3 NVFP4 single-node vLLM benchmarking on the 8x RTX PRO 6000 Blackwell Latitude runner"
- "Start with a GPU-resident TP8 8k/1k concurrency-1 canary using FP8 KV cache, MSA block size 128, and NCCL collectives for the PCIe-only topology"
- "Pin the CUDA 13.0.1 MiniMax-M3 performance image by digest; it includes MiniMax-M3 ModelOpt NVFP4 support and SM120/121 FlashInfer FP4 kernels"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2306
131 changes: 131 additions & 0 deletions runners/launch_rtx6000pro-lat.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
#!/usr/bin/bash
set -euo pipefail

# This runner executes directly on the single RTX PRO 6000 GPU node. Docker
# therefore owns a separate image cache from the node's RKE2/containerd cache.
HF_HUB_CACHE_MOUNT="${HF_HUB_CACHE_MOUNT:-/var/lib/inferencex/hf-hub-cache}"
export HF_HUB_CACHE="${HF_HUB_CACHE:-/mnt/hf_hub_cache/}"
PORT="${PORT:-8888}"

: "${GITHUB_WORKSPACE:?GITHUB_WORKSPACE must be set}"
: "${IMAGE:?IMAGE must be set}"
: "${EXP_NAME:?EXP_NAME must be set}"
: "${PRECISION:?PRECISION must be set}"

mkdir -p "$HF_HUB_CACHE_MOUNT"

export GPU_COUNT="${GPU_COUNT:-${TP:?TP must be set}}"
if [[ ! "$GPU_COUNT" =~ ^[1-9][0-9]*$ ]]; then
echo "GPU_COUNT must be a positive integer, got: $GPU_COUNT" >&2
exit 1
fi

export CUDA_VISIBLE_DEVICES
CUDA_VISIBLE_DEVICES="$(seq -s, 0 "$((GPU_COUNT - 1))")"

# Some Slurm/enroot configs spell registry paths as nvcr.io#namespace/image.
# Docker requires the normal slash form.
DOCKER_IMAGE="${IMAGE//#//}"

SPEC_SUFFIX=""
if [[ "${SPEC_DECODING:-}" == "mtp" ]]; then
SPEC_SUFFIX="_mtp"
fi

export SCENARIO_SUBDIR="${SCENARIO_SUBDIR:-fixed_seq_len/}"
SCENARIO_SUBDIR="${SCENARIO_SUBDIR#/}"
SCENARIO_SUBDIR="${SCENARIO_SUBDIR%/}/"
BENCH_SCRIPT="benchmarks/single_node/${SCENARIO_SUBDIR}${EXP_NAME%%_*}_${PRECISION}_rtx6000pro${SPEC_SUFFIX}.sh"

if [[ ! -f "$GITHUB_WORKSPACE/$BENCH_SCRIPT" ]]; then
echo "Benchmark script not found: $GITHUB_WORKSPACE/$BENCH_SCRIPT" >&2
exit 1
fi

server_name="bmk-server-${RUNNER_NAME:-rtx6000pro-lat}"
server_name="${server_name//[^a-zA-Z0-9_.-]/-}"

cleanup() {
docker rm -f "$server_name" >/dev/null 2>&1 || true
}
trap cleanup EXIT

# Clear a container left behind by a cancelled or interrupted workflow.
cleanup

docker run \
--rm \
--pull=missing \
--name="$server_name" \
--runtime=nvidia \
--gpus="$GPU_COUNT" \
--network=host \
--ipc=host \
--privileged \
--shm-size=32g \
--ulimit memlock=-1 \
--ulimit stack=67108864 \
--security-opt seccomp=unconfined \
--cap-add=SYS_PTRACE \
--volume "$HF_HUB_CACHE_MOUNT:$HF_HUB_CACHE" \
--volume "$GITHUB_WORKSPACE:/workspace/" \
--workdir=/workspace/ \
--env HF_TOKEN \
--env HF_HUB_CACHE \
--env MODEL \
--env MODEL_PREFIX \
--env MODEL_PATH \
--env TP \
--env PP_SIZE \
--env DCP_SIZE \
--env PCP_SIZE \
--env EP_SIZE \
--env DP_SIZE \
--env DP_ATTENTION \
--env GPU_COUNT \
--env CONC \
--env MAX_MODEL_LEN \
--env ISL \
--env OSL \
--env FRAMEWORK \
--env PRECISION \
--env DISAGG \
--env SPEC_DECODING \
--env NUM_SPEC_TOKENS \
--env RUN_EVAL \
--env EVAL_ONLY \
--env EVAL_LIMIT \
--env EVAL_MAX_MODEL_LEN \
--env RUNNER_TYPE \
--env RUNNER_NAME \
--env RESULT_FILENAME \
--env RESULT_DIR \
--env RANDOM_RANGE_RATIO \
--env GPU_MEM_UTIL \
--env AIPERF_FAILED_REQUEST_THRESHOLD \
--env KV_OFFLOADING \
--env KV_OFFLOAD_BACKEND \
--env KV_OFFLOAD_BACKEND_METADATA \
--env ROUTER_METADATA \
--env KV_P2P_TRANSFER \
--env TOTAL_CPU_DRAM_GB \
--env DURATION \
--env SCENARIO_TYPE \
--env SCENARIO_SUBDIR \
--env IS_AGENTIC \
--env SWEBENCH_GEN_MODE \
--env SWEBENCH_USE_MODAL \
--env MODAL_TOKEN_ID \
--env MODAL_TOKEN_SECRET \
--env PROFILE \
--env SGLANG_TORCH_PROFILER_DIR \
--env VLLM_TORCH_PROFILER_DIR \
--env VLLM_RPC_TIMEOUT \
--env PYTHONDONTWRITEBYTECODE \
--env PYTHONPYCACHEPREFIX=/tmp/pycache/ \
--env PORT="$PORT" \
--env CUDA_DEVICE_ORDER=PCI_BUS_ID \
--env CUDA_VISIBLE_DEVICES \
--entrypoint=/bin/bash \
"$DOCKER_IMAGE" \
"$BENCH_SCRIPT"
Loading