跳转至

MiniMax-M2

1 引言

MiniMax-M2是MiniMax的旗舰大语言模型系列,包括**MiniMax-M2.5**和**MiniMax-M2.7**。该系列针对代码生成、智能体工具调用/搜索以及复杂办公工作流等高价值场景进行了强化,重点强调推理效率和在挑战性任务上的端到端速度。

本文档将展示MiniMax-M2.5和MiniMax-M2.7的主要验证步骤,包括支持特性、特性配置、环境准备、单节点和多节点部署、精度及性能评估。

本文档基于最新的vLLM-Ascend版本编写。MiniMax-M2.5和MiniMax-M2.7均得到完全支持。如需使用最新特性(如PD分离、EAGLE3推测解码),建议使用最新版本。

2 支持特性

请参考支持特性获取模型的支持特性矩阵。

请参考特性指南获取特性的配置方法。

3 前提条件

3.1 模型权重

以下模型权重和EAGLE3权重可在模型Scope上获取。在模型Scope上搜索对应的模型名称以获取最新的权重文件。

模型 描述 推荐硬件 来源
MiniMax-M2.7-w8a8-QuaRot M2.7 W8A8量化版本 1× Atlas 800 A3 (64G × 16) 或 1× Atlas 800I A2 (64G × 8) MiniMax-M2.7-w8a8-QuaRot
MiniMax-M2.5-w8a8-QuaRot M2.5 W8A8量化版本 1× Atlas 800 A3 (64G × 16) 或 1× Atlas 800I A2 (64G × 8) MiniMax-M2.5-w8a8-QuaRot
MiniMax-M2.7-w8a8c8-QuaRot M2.7 W8A8C8量化版本 1× Atlas 800 A3 (64G × 16) 或 1× Atlas 800I A2 (64G × 8) MiniMax-M2.7-w8a8c8-QuaRot
Eagle3 (M2.7) M2.7推测解码头模型 与基础模型节点数匹配 MiniMax-M2.7-eagle-model
Eagle3 (M2.5) M2.5推测解码头模型 与基础模型节点数匹配 MiniMax-M2.5-eagle-model

建议将模型权重下载到共享目录中,例如/root/.cache/

3.2 验证多节点通信(可选)

如果需要部署多节点环境,请按照验证多节点通信环境验证多节点通信。

4 安装

4.1 Docker镜像安装

根据机器类型选择镜像并在节点上启动容器。可用的镜像标签和发布版本请参考使用Docker

A3系列

# Update the vllm-ascend image
export IMAGE=m.daocloud.io/quay.io/ascend/vllm-ascend:v0.22.1rc1
export NAME=vllm-ascend

# Run the container using the defined variables
# Note: If you are running bridge network with docker, please expose available ports for multiple nodes communication in advance
docker run --rm \
--name $NAME \
--net=host \
--shm-size=1g \
--device /dev/davinci0 \
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci4 \
--device /dev/davinci5 \
--device /dev/davinci6 \
--device /dev/davinci7 \
--device /dev/davinci8 \
--device /dev/davinci9 \
--device /dev/davinci10 \
--device /dev/davinci11 \
--device /dev/davinci12 \
--device /dev/davinci13 \
--device /dev/davinci14 \
--device /dev/davinci15 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /root/.cache:/root/.cache \
-it $IMAGE bash

A2系列

将模型权重目录映射到容器中(示例映射到/root/.cache/)。

#!/bin/sh
NAME=minimax
IMAGE=m.daocloud.io/quay.io/ascend/vllm-ascend:v0.22.1rc1

docker run -itd -u 0 --ipc=host \
  -e VLLM_USE_MODELSCOPE=True \
  -e PYTORCH_NPU_ALLOC_CONF=max_split_size_mb:256 \
  --name $NAME \
  --net=host \
  --device /dev/davinci_manager \
  --device /dev/devmm_svm \
  --device /dev/hisi_hdc \
  --device /dev/davinci0 \
  --device /dev/davinci1 \
  --device /dev/davinci2 \
  --device /dev/davinci3 \
  --device /dev/davinci4 \
  --device /dev/davinci5 \
  --device /dev/davinci6 \
  --device /dev/davinci7 \
  --shm-size=1200g \
  -v /usr/local/dcmi:/usr/local/dcmi \
  -v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
  -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
  -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
  -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
  -v /etc/ascend_install.info:/etc/ascend_install.info \
  -v /root/.cache:/root/.cache \
  -it $IMAGE bash

将脚本保存为minimax-docker-run.sh,然后启动并进入容器:

bash minimax-docker-run.sh
docker exec -it minimax bash

验证:

启动容器后,使用以下命令验证安装:

# Check that the container is running
docker ps | grep $NAME

# Verify that NPU devices are visible inside the container
docker exec $NAME npu-smi info

预期结果:docker ps显示容器状态为"Up",npu-smi info列出预期的NPU设备数量。

4.2 源码安装

如果希望从源码构建而非使用Docker镜像,请按照安装指南安装vLLM-Ascend。

验证源码安装:

python -c "import vllm_ascend; print(vllm_ascend.__version__)"

5 在线服务部署

Note

在本教程中,我们假设您已下载模型权重。请将/path/to/weight/替换为实际的模型权重路径。

5.1 单节点在线部署

单节点部署在同一节点内完成Prefill和Decode阶段,适用于开发、测试以及中低吞吐量的生产场景。

Common Issues Tip: If you encounter OOM, HCCL port conflicts, or other startup issues, please refer to the Public FAQ for troubleshooting. For MiniMax-specific issues, refer to Chapter 10 常见问题.

A3(单节点)

以下是短上下文场景(如3.5k输入/1.5k输出)的推荐启动配置,以获得良好性能。

注意:

  • 如果只关注短上下文低延迟,可以设置--max-model-len 32768--tensor-parallel-size 4--data-parallel-size 4
export HCCL_OP_EXPANSION_MODE="AIV"
export HCCL_BUFFSIZE=1024
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export OMP_NUM_THREADS=1
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
sysctl -w vm.swappiness=0
sysctl -w kernel.numa_balancing=0
sysctl kernel.sched_migration_cost_ns=50000
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD
export TASK_QUEUE_ENABLE=1

export VLLM_ASCEND_BALANCE_SCHEDULING=0

vllm serve /path/to/weight/MiniMax-M2.7-w8a8-QuaRot \
    --served-model-name "MiniMax-M2.7" \
    --host 0.0.0.0 \
    --port 8000 \
    --trust-remote-code \
    --quantization ascend \
    --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
    --async-scheduling \
    --additional-config '{"enable_cpu_binding":true,
                          "enable_fused_mc2":true,
                          "enable_flashcomm1":true,
                          "weight_nz_mode":true}' \
    --enable-expert-parallel \
    --tensor-parallel-size 4 \
    --data-parallel-size 4 \
    --max-num-seqs 48 \
    --max-model-len 40690 \
    --max-num-batched-tokens 16384 \
    --gpu-memory-utilization 0.85 \
    --speculative_config '{"enforce_eager": true, "method": "eagle3", "model": "/path/to/weight/Eagle3/", "num_speculative_tokens": 3}'

说明:

  • minimax_m2_append_think<think>...</think>保留在content内部。
  • 如果主要依赖/v1/responses的推理语义,建议改用--reasoning-parser minimax_m2
  • 为在长上下文场景(如128k或64k)中获得更好性能,建议进行以下调整:
    --tensor-parallel-size 8 \
    --data-parallel-size 1 \
    --decode-context-parallel-size 1 \
    --prefill-context-parallel-size 2 \
    --cp-kv-cache-interleave-size 128 \
    --max-num-seqs 16 \
    --max-model-len 138000 \
    --max-num-batched-tokens 65536 \
    --gpu-memory-utilization 0.85 \
    --speculative_config '{"enforce_eager": true, "method": "eagle3", "model": "/path/to/weight/Eagle3/", "num_speculative_tokens": 1}'

注意:上述参数在特定测试环境中验证,仅供参考。请根据实际输入/输出长度、并发数和硬件配置调整--max-model-len--max-num-seqs--max-num-batched-tokens--gpu-memory-utilization

  • 如果需要使用curl和工具调用进行测试,请在启动命令中添加以下内容:
    --enable-auto-tool-choice \
    --tool-call-parser minimax_m2 \
    --reasoning-parser minimax_m2_append_think \

A2(单节点)

export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD
export HCCL_OP_EXPANSION_MODE="AIV"
export HCCL_BUFFSIZE=512
sysctl -w vm.swappiness=0
sysctl -w kernel.numa_balancing=0
sysctl kernel.sched_migration_cost_ns=50000
export TASK_QUEUE_ENABLE=1
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export HCCL_INTRA_PCIE_ENABLE=1
export HCCL_INTRA_ROCE_ENABLE=0
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=1

vllm serve /path/to/weight/MiniMax-M2.7-w8a8-QuaRot \
    --served-model-name MiniMax-M2.7 \
    --host 0.0.0.0 \
    --port 8000 \
    --trust-remote-code \
    --tensor-parallel-size 8 \
    --quantization ascend \
    --enable-expert-parallel \
    --max-num-seqs 32 \
    --seed 1024 \
    --max-num-batched-tokens 32768 \
    --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
    --gpu-memory-utilization 0.85 \
    --additional-config '{"enable_cpu_binding":true,
                          "enable_flashcomm1":true}' \
    --model-loader-extra-config '{"enable_multithread_load":true,"num_threads":16}' \
    --speculative_config '{"method": "eagle3", "model": "/path/to/weight/Eagle3/",  "num_speculative_tokens":3}'

注意:上述参数在特定测试环境中验证,仅供参考。请根据实际输入/输出长度、并发数和硬件配置调整--max-model-len--max-num-seqs--max-num-batched-tokens--gpu-memory-utilization

  • 如果需要使用curl和工具调用进行测试,请在启动命令中添加以下内容:
    --enable-auto-tool-choice \
    --tool-call-parser minimax_m2 \
    --reasoning-parser minimax_m2_append_think \

5.2 多节点PD分离部署

PD(Prefill-Decode)分离将Prefill和Decode阶段分散到不同节点上,以获得更好的吞吐量。以下1P1D配置已在MiniMax-M2.7-W8A8的128k输入/输出场景中验证。

硬件: 2× Atlas 800 A3 (64G × 16),一台用于Prefill,一台用于Decode。

Common Issues Tip: For PD separation specific issues such as KV transfer timeouts or Mooncake connection errors, please refer to the Public FAQ. For MiniMax-specific PD separation issues, refer to Chapter 10 常见问题.

首先,在每个节点上准备launch_online_dp.py

import argparse
import multiprocessing
import os
import subprocess
import sys

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("--dp-size", type=int, required=True)
    parser.add_argument("--tp-size", type=int, default=1)
    parser.add_argument("--dp-size-local", type=int, default=-1)
    parser.add_argument("--dp-rank-start", type=int, default=0)
    parser.add_argument("--dp-address", type=str, required=True)
    parser.add_argument("--dp-rpc-port", type=str, default=12345)
    parser.add_argument("--vllm-start-port", type=int, default=9000)
    return parser.parse_args()

args = parse_args()
dp_size, tp_size = args.dp_size, args.tp_size
dp_size_local = args.dp_size_local if args.dp_size_local != -1 else dp_size

def run_command(visible_devices, dp_rank, vllm_engine_port):
    subprocess.run([
        "bash", "./run_dp_template.sh",
        visible_devices, str(vllm_engine_port),
        str(dp_size), str(dp_rank), args.dp_address,
        args.dp_rpc_port, str(tp_size),
    ], check=True)

if __name__ == "__main__":
    for i in range(dp_size_local):
        dp_rank = args.dp_rank_start + i
        vllm_port = args.vllm_start_port + i
        visible_devices = ",".join(str(x) for x in range(i * tp_size, (i + 1) * tp_size))
        p = multiprocessing.Process(target=run_command, args=(visible_devices, dp_rank, vllm_port))
        p.start()
        p.join()

然后在每个节点上准备run_dp_template.sh

Prefill节点(将nic_namelocal_ip设置为自己的):

unset http_proxy https_proxy ftp_proxy

nic_name="<your_nic_name>"
local_ip="<your_ip>"

export HCCL_IF_IP=$local_ip
export GLOO_SOCKET_IFNAME=$nic_name
export TP_SOCKET_IFNAME=$nic_name
export HCCL_SOCKET_IFNAME=$nic_name

export HCCL_BUFFSIZE=1024
export HCCL_OP_EXPANSION_MODE="AIV"
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export OMP_NUM_THREADS=1
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
sysctl -w vm.swappiness=0
sysctl -w kernel.numa_balancing=0
sysctl kernel.sched_migration_cost_ns=50000
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD
export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/python/site-packages/mooncake:$LD_LIBRARY_PATH

export TASK_QUEUE_ENABLE=1
export VLLM_ASCEND_ENABLE_FLASHCOMM1=1
export VLLM_ASCEND_ENABLE_FUSED_MC2=1
export PYTHONHASHSEED=0

export ASCEND_RT_VISIBLE_DEVICES=$1

vllm serve /path/to/weight/MiniMax-M2.7-w8a8-QuaRot \
    --host 0.0.0.0 \
    --port $2 \
    --data-parallel-size $3 \
    --data-parallel-rank $4 \
    --data-parallel-address $5 \
    --data-parallel-rpc-port $6 \
    --tensor-parallel-size $7 \
    --enable-expert-parallel \
    --served-model-name minimax \
    --max-model-len 200000 \
    --max-num-batched-tokens 16384 \
    --max-num-seqs 64 \
    --trust-remote-code \
    --gpu-memory-utilization 0.85 \
    --quantization ascend \
    --enforce-eager \
    --speculative_config '{"method": "eagle3", "model": "/path/to/weight/Eagle3/", "num_speculative_tokens": 3}' \
    --additional-config '{"enable_cpu_binding":true}' \
    --kv-transfer-config \
        '{"kv_connector": "MooncakeConnectorV1",
        "kv_role": "kv_producer",
        "kv_port": "35880",
        "engine_id": "0",
        "kv_connector_extra_config": {
             "use_ascend_direct": true,
             "prefill": {"dp_size": 2, "tp_size": 8},
             "decode":  {"dp_size": 2, "tp_size": 8}
        }}'

Decode节点(将nic_namelocal_ip设置为自己的):

unset http_proxy https_proxy ftp_proxy

nic_name="<your_nic_name>"
local_ip="<your_ip>"

export HCCL_IF_IP=$local_ip
export GLOO_SOCKET_IFNAME=$nic_name
export TP_SOCKET_IFNAME=$nic_name
export HCCL_SOCKET_IFNAME=$nic_name

export HCCL_BUFFSIZE=2048
export HCCL_OP_EXPANSION_MODE="AIV"
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export OMP_NUM_THREADS=1
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
sysctl -w vm.swappiness=0
sysctl -w kernel.numa_balancing=0
sysctl kernel.sched_migration_cost_ns=50000
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD
export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/python/site-packages/mooncake:$LD_LIBRARY_PATH

export TASK_QUEUE_ENABLE=1
export VLLM_ASCEND_ENABLE_FLASHCOMM1=0
export VLLM_ASCEND_ENABLE_FUSED_MC2=1
export PYTHONHASHSEED=0

export ASCEND_RT_VISIBLE_DEVICES=$1

vllm serve /path/to/weight/MiniMax-M2.7-w8a8-QuaRot \
    --host 0.0.0.0 \
    --port $2 \
    --data-parallel-size $3 \
    --data-parallel-rank $4 \
    --data-parallel-address $5 \
    --data-parallel-rpc-port $6 \
    --tensor-parallel-size $7 \
    --enable-expert-parallel \
    --served-model-name minimax \
    --max-model-len 200000 \
    --max-num-batched-tokens 16384 \
    --max-num-seqs 16 \
    --trust-remote-code \
    --no-enable-prefix-caching \
    --gpu-memory-utilization 0.85 \
    --quantization ascend \
    --async-scheduling \
    --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}' \
    --speculative_config '{"method": "eagle3", "model": "/path/to/weight/Eagle3/", "num_speculative_tokens": 3}' \
    --additional-config '{"enable_cpu_binding":true}' \
    --kv-transfer-config \
        '{"kv_connector": "MooncakeConnectorV1",
        "kv_role": "kv_consumer",
        "kv_port": "56900",
        "engine_id": "1",
        "kv_connector_extra_config": {
             "use_ascend_direct": true,
             "prefill": {"dp_size": 2, "tp_size": 8},
             "decode":  {"dp_size": 2, "tp_size": 8}
        }}'

脚本准备好后,在每个节点上启动服务器。

Prefill节点:

python launch_online_dp.py \
    --dp-size 2 --tp-size 8 \
    --dp-size-local 2 --dp-rank-start 0 \
    --dp-address <prefill_ip> --dp-rpc-port 12321 \
    --vllm-start-port 7000

Decode节点:

python launch_online_dp.py \
    --dp-size 2 --tp-size 8 \
    --dp-size-local 2 --dp-rank-start 0 \
    --dp-address <decode_ip> --dp-rpc-port 12321 \
    --vllm-start-port 7100

请求转发

在任意一台能访问两个节点的机器上运行代理。你可以从仓库获取代理脚本:load_balance_proxy_server_example.py

unset http_proxy https_proxy

python load_balance_proxy_server_example.py \
    --port 8009 \
    --host <prefill_ip> \
    --prefiller-hosts \
       <prefill_ip> <prefill_ip> \
    --prefiller-ports \
       7000 7001 \
    --decoder-hosts \
       <decode_ip> <decode_ip> \
    --decoder-ports \
       7100 7101

然后服务可通过http://<proxy_ip>:8009访问。

6 功能验证

服务器启动后,你可以使用输入提示查询模型。

注意:

  • <node_ip>: 运行服务器的节点IP地址(例如,单节点时为localhost)。
  • <port>: 服务器启动命令中指定的端口号(例如8000)。

使用curl

curl http://<node_ip>:<port>/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "MiniMax-M2.7",
    "messages": [{"role": "user", "content": "Hello, who are you?"}],
    "stream": false,
    "temperature": 0.8,
    "max_tokens": 200
  }'

预期结果:HTTP 200,返回JSON响应,包含choices字段,其中包含模型的回复文本。

使用OpenAI Python客户端

from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="na")

resp = client.chat.completions.create(
    model="MiniMax-M2.7",
    messages=[{"role": "user", "content": "你好,请介绍一下你自己,并展示一次工具调用的参数格式。"}],
    max_tokens=256,
)
print(resp.choices[0].message.content)

预期结果:响应应在content字段中包含连贯的自我介绍和工具调用参数格式。

工具调用验证

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "MiniMax-M2.7",
    "messages": [{"role": "user", "content": "请查询上海的天气。"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_current_weather",
        "description": "Get weather by city",
        "parameters": {
          "type": "object",
          "properties": {
            "city": {"type": "string"},
            "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
          },
          "required": ["city"]
        }
      }
    }],
    "tool_choice": "auto",
    "temperature": 0,
    "max_tokens": 512
  }'

预期结果:HTTP 200,返回JSON响应,包含tool_calls字段,其中包含函数名和参数。

7 精度评估

注意: 后处理参数(例如max_tokenstemperaturestop tokens)应与模型权重的generation_config.json中定义的参数匹配。GPQA-diamond和AIME2025的推荐最大输出长度为64k(65536 tokens)。

以下是两种精度评估方法。

7.1 使用AISBench

详情请参考使用AISBench

7.2 使用Language 模型 Evaluation Harness

gsm8k数据集为例,在在线模式下运行MiniMax-M2.7-W8A8的精度评估。

  1. 关于lm_eval的安装,请参考使用lm_eval
  2. 运行lm_eval执行精度评估:
lm_eval \
  --model local-completions \
  --model_args model=/path/to/weight/MiniMax-M2.7-w8a8-QuaRot,base_url=http://127.0.0.1:8000/v1/completions,tokenized_requests=False,trust_remote_code=True \
  --tasks gsm8k \
  --output_path ./

8 性能评估

8.1 使用AISBench

详情请参考使用AISBench进行性能评估

8.2 使用vLLM Benchmark

MiniMax-M2.7-W8A8为例运行性能评估。

更多详情请参考vllm benchmark

serve子命令为例:

export VLLM_USE_MODELSCOPE=True
vllm bench serve \
  --model /path/to/weight/MiniMax-M2.7-w8a8-QuaRot \
  --dataset-name random \
  --random-input 200 \
  --num-prompts 200 \
  --request-rate 1 \
  --save-result \
  --result-dir ./

9 性能调优

注意: 以下配置在特定测试环境中验证,仅供参考。最佳配置取决于最大输入/输出长度、前缀缓存命中率、精度要求和部署机器比例等因素。建议根据实际情况参考第9.2节进行调优。

9.1 推荐配置

以下配置在自测报告(AR20260326132822)上验证,并按使用场景分类。

场景 输入/输出 部署 NPUs P配置 D配置 最大批处理Tokens 最大序列数 (P/D) 最大模型长度 EAGLE3 FUSED_MC2 FlashComm1 异步调度
短序列高吞吐 3.5K → 1.5K 1P2D PD分离 24 (A3) DP8TP2EP16 DP32TP1EP32 16384 128 / 128 32k 3 开启 开启 开启
短序列低延迟 3.5K → 1.5K 1P2D PD分离 24 (A3) DP4TP4EP16 DP8TP4EP32 16384 128 / 128 32k 3 开启 开启 开启
长序列高吞吐 128K → 1K
(90%缓存命中)
1P1D PD分离 16 (A3) DP2TP8EP16 DP2TP8EP16 16384 64 / 16 200k 3 开启 开启 开启
长序列低延迟 128K → 1K
(90%缓存命中)
1P2D PD分离 24 (A3) DP2TP8EP16 DP4TP8EP32 16384 64 / 16 200k 3 开启 开启 开启

注意: 短序列测试的前缀缓存命中率为0%;长序列测试为90%。根据实际工作负载调整max-num-seqsmax-model-lenmax-num-batched-tokens

9.2 调优指南

9.2.1 通用调优参考

通用调优方法请参考公共性能调优文档

详细功能描述请参考功能指南

9.2.2 模型特定优化

默认启用的优化

以下优化默认启用,无需额外配置:

优化技术 技术原理 性能收益
全图优化 通过compilation_config={"cudagraph_mode":"FULL_DECODE_ONLY"}一次性捕获并重放整个解码图 显著降低调度延迟,稳定多设备性能
CPU绑定 使用--additional-config '{"enable_cpu_binding":true}'绑定CPU核心 减少跨核心调度开销,提升解码延迟稳定性
多线程权重加载 使用--model-loader-extra-config '{"enable_multithread_load":true}'进行并行权重加载 减少模型加载时间
需要显式启用的优化
优化技术 适用场景 启用方法 技术原理 注意事项
FlashComm v1 高并发、TP场景 --additional-config '{"enable_flashcomm1": true}' 将传统Allreduce分解为Reduce-Scatter和All-Gather 阈值保护:仅在实际token数超过阈值时生效
融合MC2 TP ≥ 4场景 --additional-config '{"enable_fused_mc2": true}' 融合多个通信和计算操作 推荐用于A3;不适用于A2
均衡调度 高DP场景 export VLLM_ASCEND_BALANCE_SCHEDULING=1 增强prefill和decode之间的调度能力 当前默认禁用(0)。仅在并发数≈DP×max-num-seqs时设为1。长上下文场景禁用
EAGLE3推测解码 所有场景 --speculative_config '{"method": "eagle3", "model": "/path/to/Eagle3/", "num_speculative_tokens": 3}' 使用草稿模型预测未来token 长上下文1-3个token;短上下文3个token
jemalloc预加载 所有场景 export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2 替换默认内存分配器以减少碎片化 确保容器中已安装jemalloc

10 常见问题

For common environment, installation, and general parameter issues, please refer to the Public FAQ. This chapter only covers MiniMax-M2 (M2.5/M2.7) model-specific issues.

  • 问:C8量化是否支持EAGLE3推测解码?

答:暂不支持。C8量化与EAGLE3目前不兼容。

  • 问:工具调用任务推荐使用哪个--reasoning-parser

答:对于工具调用任务,建议使用--reasoning-parser minimax_m2_append_think

  • 问:使用reasoning后,为什么minimax_m2_append_think字段经常为空?

答:这是预期行为。解析器将<think>...</think>保留在content中。如果主要依赖/v1/responses的推理语义,请改用--reasoning-parser minimax_m2

  • 问:启动时出现HCCL端口冲突(address already bound),该怎么办?

答:检查是否有其他进程已占用该端口(例如lsof -i :<port>ss -tlnp | grep <port>)。如果发现端口冲突,使用--port切换到其他端口,或终止占用该端口的特定进程。

  • 问:如何处理OOM或不稳定的启动?

答:请参考上游vLLM的内存不足故障排除指南。简而言之:首先减少--max-num-seqs--max-num-batched-tokens,降低--gpu-memory-utilization(例如从0.9降至0.85),或减少并发请求数。

  • 问:如何选择--reasoning-parser

答:本指南使用minimax_m2_append_think以便将<think>...</think>保留在content中。如果主要依赖/v1/responses的推理语义,请考虑使用--reasoning-parser minimax_m2

  • 问:哪些端口必须可访问?

答:至少需要暴露服务端口(例如8000)。对于多节点部署,还需确保HCCL通信端口和DP RPC端口可访问。