-
Notifications
You must be signed in to change notification settings - Fork 237
feat: add MiniMax-M3 RTX 6000 Pro vLLM recipe / 新增 MiniMax-M3 RTX 6000 Pro vLLM 基准配置 #2306
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
base: main
Are you sure you want to change the base?
Changes from all commits
26e81c7
53dd009
3de17dd
63be10c
8ba857b
9630a91
c57e7de
702dfcc
58a9728
1fcd2e1
e817b25
6ba91f8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| --- a/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py | ||
| +++ b/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py | ||
| @@ -176,2 +176,3 @@ | ||
| NvFp4MoeBackend.FLASHINFER_TRTLLM, | ||
| + NvFp4MoeBackend.MARLIN, | ||
| } | ||
| --- a/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py | ||
| +++ b/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py | ||
| @@ -583,9 +583,12 @@ | ||
| - # Gated-activation params (used by SWIGLUOAI_UNINTERLEAVE on packed w13). | ||
| - # silu == swigluoai with alpha=1, beta=0; configs that don't set these | ||
| - # (plain silu) fall back to the silu identity. | ||
| - self.gemm1_alpha = ( | ||
| - quant_config.gemm1_alpha if quant_config.gemm1_alpha is not None else 1.0 | ||
| - ) | ||
| - self.gemm1_beta = ( | ||
| - quant_config.gemm1_beta if quant_config.gemm1_beta is not None else 0.0 | ||
| - ) | ||
| + if self.gemm1_clamp_limit is None: | ||
| + self.gemm1_clamp_limit = moe_config.swiglu_limit | ||
| + | ||
| + gemm1_alpha = quant_config.gemm1_alpha | ||
| + if gemm1_alpha is None: | ||
| + gemm1_alpha = moe_config.swiglu_alpha | ||
| + self.gemm1_alpha = 1.0 if gemm1_alpha is None else gemm1_alpha | ||
| + | ||
| + gemm1_beta = quant_config.gemm1_beta | ||
| + if gemm1_beta is None: | ||
| + gemm1_beta = moe_config.swiglu_beta | ||
| + self.gemm1_beta = 0.0 if gemm1_beta is None else gemm1_beta | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,112 @@ | ||
| #!/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. | ||
| # | ||
| # The pinned vLLM image does not contain the MiniMax-M3 Marlin fixes tracked | ||
| # by vLLM PRs #45836 and #48929. Apply the narrow compatibility patch covered | ||
| # by docs/waiver/2306.md before importing vLLM. | ||
|
|
||
| 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 | ||
|
|
||
| VLLM_SITE_PACKAGES="$( | ||
| python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])' | ||
| )" | ||
| VLLM_MARLIN_PATCH=/workspace/benchmarks/patches/vllm/minimax_m3_nvfp4_marlin.patch | ||
| if ! patch --batch --forward --fuzz=0 -p1 -d "$VLLM_SITE_PACKAGES" \ | ||
| < "$VLLM_MARLIN_PATCH"; then | ||
| echo "Failed to apply the pinned MiniMax-M3 Marlin compatibility patch" >&2 | ||
| exit 1 | ||
| fi | ||
|
Comment on lines
+61
to
+69
Contributor
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. 🟡 The Marlin compatibility patch step (lines 61-69) hard-aborts if Extended reasoning...The bug: if ! patch --batch --forward --fuzz=0 -p1 -d "$VLLM_SITE_PACKAGES" < "$VLLM_MARLIN_PATCH"; then
echo "Failed to apply the pinned MiniMax-M3 Marlin compatibility patch" >&2
exit 1
fiThe intent of Reachability: normal CI is unaffected, since Step-by-step proof:
Why nothing else prevents this: Suggested fix: mirror the b200 recipe's approach (an idempotent Python-based patch application, or a pre-check such as Severity: all three independent verifiers empirically confirmed the behavior with GNU patch and agreed on |
||
|
|
||
| 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 \ | ||
| --attention-backend TRITON_ATTN \ | ||
| --moe-backend marlin \ | ||
| --max-cudagraph-capture-size 2048 \ | ||
| --max-num-seqs "$CONC" \ | ||
| --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 | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,140 @@ | ||
| #!/usr/bin/env bash | ||
|
|
||
| # MiniMax-M3 NVFP4 RTX PRO 6000 Blackwell single-node vLLM recipe with | ||
| # EAGLE3 speculative decoding. The SM120 target and draft both use Triton | ||
| # attention; the target's NVFP4 experts use Marlin. | ||
| # | ||
| # The pinned vLLM image does not contain the MiniMax-M3 Marlin fixes tracked | ||
| # by vLLM PRs #45836 and #48929. Apply the narrow compatibility patch covered | ||
| # by docs/waiver/2306.md before importing vLLM. | ||
|
|
||
| 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 | ||
|
|
||
| SERVED_MODEL_NAME="$MODEL" | ||
| TARGET_MODEL_PATH="${MODEL_PATH:-$MODEL}" | ||
| if [[ "$TARGET_MODEL_PATH" != /* ]]; then | ||
| hf download "$TARGET_MODEL_PATH" | ||
| fi | ||
|
|
||
| DRAFT_MODEL="Inferact/MiniMax-M3-EAGLE3" | ||
| hf download "$DRAFT_MODEL" | ||
|
|
||
| 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}" | ||
| NUM_SPEC_TOKENS="${NUM_SPEC_TOKENS:-3}" | ||
|
|
||
| if [[ ! "$NUM_SPEC_TOKENS" =~ ^[1-9][0-9]*$ ]]; then | ||
| echo "NUM_SPEC_TOKENS must be a positive integer, got: $NUM_SPEC_TOKENS" >&2 | ||
| exit 1 | ||
| fi | ||
|
|
||
| # vLLM's speculative decode capture size is measured in tokens. Each active | ||
| # sequence can contribute one accepted token plus NUM_SPEC_TOKENS draft tokens. | ||
| CUDAGRAPH_CAPTURE_SIZE="$((CONC * (NUM_SPEC_TOKENS + 1)))" | ||
|
|
||
| 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 | ||
| ) | ||
| DRAFT_TP=1 | ||
| elif [ "$EP_SIZE" -gt 1 ]; then | ||
| PARALLEL_ARGS=( | ||
| --tensor-parallel-size "$TP" | ||
| --enable-expert-parallel | ||
| ) | ||
| DRAFT_TP="$TP" | ||
| else | ||
| PARALLEL_ARGS=(--tensor-parallel-size "$TP") | ||
| DRAFT_TP="$TP" | ||
| fi | ||
|
|
||
| if [ "${EVAL_ONLY}" = "true" ]; then | ||
| setup_eval_context | ||
| MAX_MODEL_LEN="$EVAL_MAX_MODEL_LEN" | ||
| fi | ||
| start_gpu_monitor | ||
|
|
||
| VLLM_SITE_PACKAGES="$( | ||
| python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])' | ||
| )" | ||
| VLLM_MARLIN_PATCH=/workspace/benchmarks/patches/vllm/minimax_m3_nvfp4_marlin.patch | ||
| if ! patch --batch --forward --fuzz=0 -p1 -d "$VLLM_SITE_PACKAGES" \ | ||
| < "$VLLM_MARLIN_PATCH"; then | ||
| echo "Failed to apply the pinned MiniMax-M3 Marlin compatibility patch" >&2 | ||
| exit 1 | ||
| fi | ||
|
|
||
| SPECULATIVE_CONFIG="$( | ||
| printf '{"method":"eagle3","model":"%s","num_speculative_tokens":%d,"draft_tensor_parallel_size":%d,"attention_backend":"TRITON_ATTN"}' \ | ||
| "$DRAFT_MODEL" "$NUM_SPEC_TOKENS" "$DRAFT_TP" | ||
| )" | ||
|
|
||
| set -x | ||
| vllm serve "$TARGET_MODEL_PATH" \ | ||
| --served-model-name "$SERVED_MODEL_NAME" \ | ||
| --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 \ | ||
| --attention-backend TRITON_ATTN \ | ||
| --moe-backend marlin \ | ||
| --max-cudagraph-capture-size "$CUDAGRAPH_CAPTURE_SIZE" \ | ||
| --max-num-seqs "$CONC" \ | ||
| --max-num-batched-tokens "$((ISL * 2))" \ | ||
| --speculative-config "$SPECULATIVE_CONFIG" \ | ||
| --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 "$SERVED_MODEL_NAME" \ | ||
| --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 \ | ||
| --use-chat-template | ||
|
|
||
| if [ "${RUN_EVAL}" = "true" ]; then | ||
| run_eval --framework lm-eval --port "$PORT" | ||
| append_lm_eval_summary | ||
| fi | ||
|
|
||
| stop_gpu_monitor | ||
| set +x |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe upstream if sm120 then marlin else flashinfer?