Skip to navigation

MiniMax M3.1

Serve MiniMax M3.1 with Dynamo and vLLM, SGLang, or TensorRT-LLM on B200 or GB300.

View as Markdown

Each target below is a Dynamo deployment of the MiniMax-M3.1-Flash checkpoint, a multimodal MoE model with sparse attention. Every target runs one aggregated worker with tensor parallelism (TP) 4 and expert parallelism on four GPUs of a single B200 or GB300 node. Choose your framework and GPU; the summary and commands update to match. Every target serves the model’s full 1,048,576-token context with prefix caching; the vLLM and SGLang targets also use an FP8 KV cache and KV-aware routing. These are day-0 profiles, not performance-tuned deployments.

Choose your deployment target

Framework
GPU
Checkpoint MiniMax-M3.1-Flash (Hugging Face)Precision NVFP4 MoE expertsGPUs 4x B200, one workerParallelism TP4 + EP, CUDA graphsModalities Text + image input, text outputLimits 1,048,576-token context, 256 concurrent requests
Checkpoint MiniMax-M3.1-Flash (Hugging Face)Precision NVFP4 MoE expertsGPUs 4x GB300, one workerParallelism TP4 + EP, CUDA graphsModalities Text + image input, text outputLimits 1,048,576-token context, 256 concurrent requests
Checkpoint MiniMax-M3.1-Flash (Hugging Face)Precision NVFP4 MoE expertsGPUs 4x B200, one workerParallelism TP4 + EP4, MegaMoE expertsModalities Text + image input, text outputLimits 1,048,576-token context, 256 concurrent requests
Checkpoint MiniMax-M3.1-Flash (Hugging Face)Precision NVFP4 MoE expertsGPUs 4x GB300, one workerParallelism TP4 + EP4, MegaMoE expertsModalities Text + image input, text outputLimits 1,048,576-token context, 256 concurrent requests
Checkpoint MiniMax-M3.1-Flash (Hugging Face)Precision NVFP4 MoE expertsGPUs 4x B200, one workerParallelism TP4 + EP4, MSA sparse attentionModalities Text + image input, text outputLimits 1,048,576-token context, 256 concurrent requests
Checkpoint MiniMax-M3.1-Flash (Hugging Face)Precision NVFP4 MoE expertsGPUs 4x GB300, one workerParallelism TP4 + EP4, MSA sparse attentionModalities Text + image input, text outputLimits 1,048,576-token context, 256 concurrent requests

Prerequisites

Every target requires:

  • A Kubernetes cluster with the Dynamo platform installed and nvidia.com/v1beta1 DynamoGraphDeployment support. See the Kubernetes Deployment Guide.
  • Four free GPUs on one node of the selected type. Each worker also requests 16 CPUs and 128 GiB of host memory, and runs as UID 0.
  • A Hugging Face token that can read MiniMaxAI/MiniMax-M3.1-Flash.
  • The recipe’s Dynamo runtime image from NGC: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.6.0-minimax-m3.1-flash-dev.1, nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.6.0-minimax-m3.1-flash-dev.1, nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.6.0-minimax-m3.1-flash-dev.1, for vLLM, SGLang, and TensorRT-LLM.
  • Standalone Kustomize v5.8.1, Python 3.9 or later with PyYAML, and a private cluster Kustomization with node placement for your cluster.

Set the namespace, then create a Secret for the model download:

export NAMESPACE=your-namespace
kubectl create namespace "${NAMESPACE}"
kubectl create secret generic hf-token-secret \
--from-literal=HF_TOKEN="your-token" \
-n "${NAMESPACE}"

If the namespace and Secret already exist, use them instead. Run the following commands from the Dynamo repository root.

Every target loads the checkpoint from a populated shared-model-cache PVC in the selected namespace. Set storageClassName in model-cache/model-cache.yaml to a ReadWriteMany storage class on your cluster (kubectl get storageclass) before applying it.

Deploy

Create the cache and download the checkpoint (72 files, about 252 GB):

kubectl apply -f recipes/minimax-m3.1/model-cache/model-cache.yaml -n "${NAMESPACE}"
kubectl apply -f recipes/minimax-m3.1/model-cache/model-download.yaml -n "${NAMESPACE}"
kubectl wait --for=condition=complete job/minimax-m3-1-model-download \
-n "${NAMESPACE}" --timeout=14400s

The Job writes the checkpoint to /shared-model-cache/MiniMax-M3.1-Flash and fails if any shard listed in model.safetensors.index.json is missing.

Select the recipe for your target:

export RECIPE_DIR="$(pwd)/recipes/minimax-m3.1/vllm/agg-b200"
export DGD=minimax-m3-1-vllm-agg-b200
export RECIPE_DIR="$(pwd)/recipes/minimax-m3.1/vllm/agg-gb300"
export DGD=minimax-m3-1-vllm-agg-gb300
export RECIPE_DIR="$(pwd)/recipes/minimax-m3.1/sglang/agg-b200"
export DGD=minimax-m3-1-sglang-agg-b200
export RECIPE_DIR="$(pwd)/recipes/minimax-m3.1/sglang/agg-gb300"
export DGD=minimax-m3-1-sglang-agg-gb300
export RECIPE_DIR="$(pwd)/recipes/minimax-m3.1/trtllm/agg-b200"
export DGD=minimax-m3-1-trtllm-agg-b200
export RECIPE_DIR="$(pwd)/recipes/minimax-m3.1/trtllm/agg-gb300"
export DGD=minimax-m3-1-trtllm-agg-gb300

The recipe’s deploy.yaml contains no pull Secret, scheduling, or storage bindings. Copy the beta cluster Kustomization starter outside the repository, point its resources at the absolute path of $RECIPE_DIR/deploy.yaml, and select the /agg Components. At minimum, fill scheduling with your node placement. Select registry-credentials only when you pull the image from a private mirror, and cache-binding only when your populated claim is not named shared-model-cache. Keep filled cluster values outside the repository.

Set CLUSTER_KUSTOMIZATION to that directory, then validate, render, and apply it:

export CLUSTER_KUSTOMIZATION=/absolute/path/to/private/minimax-m3.1-cluster
python3 scripts/validate-recipe-kustomization.py \
"$RECIPE_DIR/deploy.yaml" \
"$CLUSTER_KUSTOMIZATION/kustomization.yaml"
kustomize build --load-restrictor LoadRestrictionsNone \
"$CLUSTER_KUSTOMIZATION" > "$CLUSTER_KUSTOMIZATION/rendered.yaml"
kubectl apply --dry-run=server -f "$CLUSTER_KUSTOMIZATION/rendered.yaml" -n "${NAMESPACE}"
kubectl apply -f "$CLUSTER_KUSTOMIZATION/rendered.yaml" -n "${NAMESPACE}"

Use LoadRestrictionsNone only with reviewed paths. It allows the private composition to reference the portable recipe.

Smoke Test

Wait for the deployment, then forward its frontend port. The worker spends several minutes in engine initialization after the weights load:

kubectl wait --for=condition=Ready "dynamographdeployment/${DGD}" \
-n "${NAMESPACE}" --timeout=3600s
kubectl port-forward "service/${DGD}-frontend" 8000:8000 -n "${NAMESPACE}"

In another terminal, check model discovery and send a reasoning request. Every target serves the model as minimax-m3.1:

curl --fail-with-body http://localhost:8000/v1/models
curl --fail-with-body http://localhost:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"minimax-m3.1","messages":[{"role":"user","content":"What is 2 + 2?"}],"max_tokens":1024,"temperature":1.0,"top_p":0.95,"chat_template_kwargs":{"reasoning_effort":"high"}}'

Expect HTTP 200 and the answer in choices[0].message.content. The model decides per request whether to reason, and any reasoning arrives in a separate reasoning_content field; reasoning_effort (low, medium, high, xhigh, or max) sets how much it reasons. temperature 1.0 and top_p 0.95 are the model’s recommended sampling settings.

Supported Features

FeaturevLLMSGLangTensorRT-LLMNotes
Text input✅✅✅
Image input✅✅✅image_url content parts

Compare All Targets

Every target runs one aggregated worker on four GPUs, serves a 1,048,576-token context, and admits up to 256 concurrent requests.

FrameworkGPUParallelismModalities
vLLMGB300TP4 + EP, CUDA graphsText, image
vLLMB200TP4 + EP, CUDA graphsText, image
SGLangGB300TP4 + EP4, MegaMoEText, image
SGLangB200TP4 + EP4, MegaMoEText, image
TensorRT-LLMGB300TP4 + EP4, MSA sparse attentionText, image
TensorRT-LLMB200TP4 + EP4, MSA sparse attentionText, image

Notes

  • On the TensorRT-LLM targets, a request that needs an attention kernel the engine did not compile at startup compiles it on the spot, which stalls the worker and its GPUs for one to two minutes. Dynamo’s health check can time out during the stall and restart the worker, which discards the compiled kernel; set DYN_HEALTH_CHECK_ENABLED=false on the Worker to let the compilation finish.
  • The checkpoint ships a DSpark draft model, which these profiles do not enable.

Source