MiniMax-M2.5#
简介#
MiniMax‑M2.5 是 MiniMax 的旗舰大语言模型,针对代码生成、智能体工具调用/搜索以及复杂办公工作流等高价值场景进行了强化,重点优化了推理效率和具有挑战性任务上的端到端速度。
本文档提供了在 vLLM Ascend 上部署 MiniMax-M2.5 的统一指南,涵盖以下两种场景:
A3 单节点部署(Atlas 800 A3)
A2 单节点部署(Atlas 800I A2)
支持的特性#
请参考支持的特性获取模型支持的特性矩阵。
请参考特性指南获取特性的配置方法。
环境准备#
模型权重#
MiniMax-M2.5(fp8 检查点):建议使用 1× Atlas 800 A3 或 1× Atlas 800I A2 节点。从 MiniMax/MiniMax-M2.5 下载模型权重。MiniMax-M2.5-w8a8-QuaRot:从 Eco-Tech/MiniMax-M2.5-w8a8-QuaRot 下载模型权重。Eagle3:从 vllm-ascend/MiniMax-M2.5-eagel-model 下载模型权重。
建议将模型权重下载到共享目录,例如 /mnt/sfs_turbo/.cache/。当前版本会自动检测 MiniMax-M2 fp8 检查点,禁用 NPU 上的 fp8 量化内核,并通过反量化至 bf16 来加载权重。一旦公开的 bf16 权重可用,此行为可能会被移除。
安装#
您可以直接使用官方 Docker 镜像来运行 MiniMax-M2.5。
根据您的机器类型选择镜像,并在节点上启动容器。请参阅使用 Docker。
使用 Docker 运行#
A3(单节点)#
# Update the vllm-ascend image
export IMAGE=m.daocloud.io/quay.io/ascend/vllm-ascend:v0.20.2rc1
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 /mnt/sfs_turbo/.cache:/home/cache \
-it $IMAGE bash
A2(单节点)#
创建并运行 minimax25-docker-run.sh。
注意:
默认配置假设使用 Atlas 800I A2 8-NPU 节点,并设置
ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7。请根据您的硬件进行更新。将您的模型权重目录映射到容器中(示例中映射到
/opt/data/verification/)。
#!/bin/sh
NAME=minimax2_5
DEVICES="0,1,2,3,4,5,6,7"
IMAGE=m.daocloud.io/quay.io/ascend/vllm-ascend:|vllm_ascend_version|
docker run -itd -u 0 --ipc=host --privileged \
-e VLLM_USE_MODELSCOPE=True \
-e PYTORCH_NPU_ALLOC_CONF=max_split_size_mb:256 \
-e ASCEND_RT_VISIBLE_DEVICES=$DEVICES \
--name $NAME \
--net=host \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
--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 /home/:/home/ \
-v /opt/data/verification/:/opt/data/verification/ \ # Map the model weights here
-v /root/.cache:/root/.cache \
-v /mnt/performance/:/mnt/performance/ \
-it $IMAGE bash
# Start and enter the container
# bash minimax25-docker-run.sh
# docker exec -it minimax2_5 bash
多 NPU 在线推理#
A3(单节点)#
以下是针对 3.5k/1.5k 等短上下文场景推荐的启动配置,以获得良好性能。
注意:
如果您只关心短上下文低延迟,可以显式设置
--max-model-len 32768。您也可以将tensor-parallel-size设置为 16,并将data-parallel-size设置为 1。export VLLM_ASCEND_BALANCE_SCHEDULING=1用于增强 prefill 和 decode 之间的调度能力。这在data-parallel-size较大时效果显著。当并发数接近data-parallel-size乘以max-num-seqs的值时,可以提升性能。
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_ENABLE_FUSED_MC2=1
export VLLM_ASCEND_ENABLE_FLASHCOMM1=1
export VLLM_ASCEND_BALANCE_SCHEDULING=1
vllm serve /path/to/weight/MiniMax-M2.5-w8a8-QuaRot \
--served-model-name "MiniMax-M2.5" \
--host 0.0.0.0 \
--port 8000 \
--trust-remote-code \
--quantization ascend \
--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
--additional-config '{"enable_cpu_binding":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 等长上下文场景中获得更好的性能,我们建议进行如下更改,并且可以移除
export VLLM_ASCEND_BALANCE_SCHEDULING=1。
--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}' \
如果您想使用
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 VLLM_ASCEND_ENABLE_FLASHCOMM1=1
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.5-w8a8-QuaRot \
--served-model-name MiniMax-M2.5 \
--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","cudagraph_capture_sizes":[4,16,20,32,80,96,128,200,256,320]}' \
--gpu-memory-utilization 0.9 \
--enable-auto-tool-choice \
--tool-call-parser minimax_m2 \
--reasoning-parser minimax_m2_append_think \
--enable-force-include-usage \
--additional-config '{"enable_cpu_binding":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-num-seqs参数可根据实际请求情况调整。--max-num-batched-tokens 32768适用于 32k 或更长的输入序列长度。--max-num-batched-tokens 16384适用于 16k 的输入序列长度。--max-num-batched-tokens 6144适用于 2k 和 3.5k 等短序列输入场景。
验证服务#
A3(单节点)#
使用兼容 OpenAI 的客户端进行测试:
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.5",
messages=[{"role": "user", "content": "你好,请介绍一下你自己,并展示一次工具调用的参数格式。"}],
max_tokens=256,
)
print(resp.choices[0].message.content)
或者使用 curl 发送请求:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-M2.5",
"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
}'
A2(单节点)#
在任意能访问服务节点的机器上运行以下命令(将 {NodeIP} 替换为实际 IP):
curl http://{NodeIP}:8000/v1/chat/completions \
-H "Content-type: application/json" \
-d '{
"model": "MiniMax-M2.5",
"messages": [{"role": "user", "content": "Hello, who are you?"}],
"stream": false,
"ignore_eos": true,
"temperature": 0.8,
"top_p": 0.8,
"max_tokens": 200
}'
常见问题#
问:在 EP 模式下输出乱码怎么办?
答:建议保持
--enable-expert-parallel和VLLM_ASCEND_ENABLE_FLASHCOMM1=1。问:使用
minimax_m2_append_think后,reasoning字段为什么经常为空?答:这是预期行为。解析器将
<think>...</think>保留在content中。如果您主要依赖/v1/responses的推理语义,请改用--reasoning-parser minimax_m2。问:启动失败,提示 HCCL 端口冲突(地址已绑定)。该怎么办?
答:清理旧进程并重启:
pkill -f "vllm serve /models/MiniMax-M2.5"。问:如何处理 OOM 或不稳定的启动?
答:首先减少
--max-num-seqs和--max-num-batched-tokens。如有必要,降低并发和负载测试压力(例如max-concurrency/num-prompts)。问:如何选择
--reasoning-parser?答:本指南使用
minimax_m2_append_think以便将<think>...</think>保留在content中。如果您主要依赖/v1/responses的推理语义,请考虑使用--reasoning-parser minimax_m2。问:哪些端口必须可访问?
答:至少需要暴露服务端口(例如
8000)