Skip to navigation

Kimi-K3.1-Pro

Serve Kimi-K3.1-Pro with Dynamo using vLLM or SGLang.

View as Markdown

Serve moonshotai/Kimi-K3.1-Pro with NVIDIA Dynamo using vLLM or SGLang. Pick your framework, GPU, and serving topology; deployment commands update to match. SGLang targets are experimental, text-only, and functional-only; no performance claims are made.

Choose your deployment target

Framework
GPU
Topology
GPUs 8x GB300 (1 worker)Parallelism TP8 across 2 nodes per workerSpeculative decoding Disabled
GPUs 24x GB300 (2P1D)Parallelism TP8 across 2 nodes per workerSpeculative decoding Disabled
GPUs 8x GB300 (1 worker)Parallelism TP8 across 2 nodes per workerSpeculative decoding Disabled
GPUs 16x GB300 (1P1D)Parallelism TP8 across 2 nodes per workerSpeculative decoding Disabled
GPUs 16x B200 (1 worker)Parallelism TP8 × PP2 across 2 nodesSpeculative decoding DSpark (7 draft tokens)
GPUs 16x VR200 (2 workers)Parallelism TP8 across 2 nodes per workerSpeculative decoding DSpark (7 draft tokens)
GPUs 24x VR200 (2P1D)Parallelism TP8 across 2 nodes per workerSpeculative decoding DSpark (7 draft tokens)
No B200 disaggregated recipe is published. Select aggregated serving or another GPU.
SGLang recipes on this page cover GB300 only. Select GB300 or switch to vLLM.

Prerequisites

  • A Hugging Face token with access to moonshotai/Kimi-K3.1-Pro.
  • Access to the runtime images referenced by the selected manifest.
  • The NVIDIA DRA driver with ComputeDomain support for multi-node NVLink serving. Every GB300 and VR200 manifest includes a ComputeDomain and worker channel claims.

Create the namespace and token secret:

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

Review storage paths, node placement, registry credentials, and resource claims before applying the selected manifest.

Deploy

Create the shared model cache and download the main and draft checkpoints:

Edit storageClassName in recipes/kimi-k3.1-pro/model-cache/model-cache.yaml to a ReadWriteMany class on your cluster before you apply it.

kubectl apply -f recipes/kimi-k3.1-pro/model-cache/model-cache.yaml -n ${NAMESPACE}
kubectl apply -f recipes/kimi-k3.1-pro/model-cache/model-download.yaml -n ${NAMESPACE}
kubectl wait --for=condition=Complete job/model-download -n ${NAMESPACE} --timeout=7200s

The download Job populates the Hugging Face cache with moonshotai/Kimi-K3.1-Pro and Inferact/Kimi-K3-DSpark, using HF_HOME=/shared-model-cache. Workers resolve these Hugging Face IDs offline from the same PVC. To change the checkpoints, update MODEL_NAME and DRAFT_MODEL_NAME in the Job and the corresponding worker settings.

The B200 worker uses the draft checkpoint downloaded by the Job.

Both VR200 topologies use the draft checkpoint downloaded by the Job and mount shared-model-cache only in the workers; frontends do not mount the PVC.

Deploy the selected DynamoGraphDeployment (DGD):

export DGD=kimi-k3-1-pro-vllm-gb300-agg-agentic
kubectl apply -f recipes/kimi-k3.1-pro/vllm/agg-gb300-agentic/deploy-gb300.yaml -n ${NAMESPACE}

For image and video input, apply the multimodal overlay instead:

kubectl apply -f recipes/kimi-k3.1-pro/vllm/agg-gb300-agentic/deploy-gb300-multimodal.yaml -n ${NAMESPACE}
export DGD=kimi-k3-1-pro-vllm-gb300-disagg-agentic
kubectl apply -f recipes/kimi-k3.1-pro/vllm/disagg-gb300-agentic/deploy-gb300.yaml -n ${NAMESPACE}

For image and video input, apply the multimodal overlay instead:

kubectl apply -f recipes/kimi-k3.1-pro/vllm/disagg-gb300-agentic/deploy-gb300-multimodal.yaml -n ${NAMESPACE}
export DGD=kimi-k3-1-pro-sglang-gb300-agg-agentic
kubectl apply -f recipes/kimi-k3.1-pro/sglang/agg-gb300-agentic/deploy-gb300.yaml -n ${NAMESPACE}
export DGD=kimi-k3-1-pro-sglang-gb300-disagg-agentic
kubectl apply -f recipes/kimi-k3.1-pro/sglang/disagg-gb300-agentic/deploy-gb300.yaml -n ${NAMESPACE}
export DGD=kimi-k3-1-pro-vllm-b200-agg-agentic
kubectl apply -f recipes/kimi-k3.1-pro/vllm/agg-b200-agentx/deploy-b200.yaml -n ${NAMESPACE}
export DGD=kimi-k3-1-pro-vllm-vr200-agg-agentic
kubectl apply -f recipes/kimi-k3.1-pro/vllm/agg-vr200-agentx/deploy-vr200.yaml -n ${NAMESPACE}
export DGD=kimi-k3-1-pro-vllm-vr200-disagg-agentic
kubectl apply -f recipes/kimi-k3.1-pro/vllm/disagg-vr200-agentx/deploy-vr200.yaml -n ${NAMESPACE}

Each target’s Kustomize overlay produces the corresponding manifest above. Customize node placement and registry credentials for your cluster before deployment; the published manifests do not include node selectors, tolerations, or image pull secrets.

B200 and VR200 targets enable DSpark with natural acceptance. Their manifests include a commented synthetic-acceptance alternative for benchmarking.

Smoke Test

The deploy command sets DGD to the selected resource name. Wait for readiness and forward the frontend port:

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

Send a chat completion with the served model name moonshotai/Kimi-K3.1-Pro:

curl http://localhost:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"moonshotai/Kimi-K3.1-Pro","messages":[{"role":"user","content":"Reply with exactly: READY"}],"temperature":0,"max_tokens":256}'

Benchmark

Use perf.yaml to run AIPerf 0.13.0 against the deployment. It runs aiperf profile with the chat endpoint type and streaming on the AgentX agentic trace (semianalysis_cc_traces_weka_062126), scenario inferencex-agentx-mvp, with an agentic warmup and a 1200 s profiling phase. The tokenizer is resolved by Hugging Face ID with HF_HOME=/shared-model-cache.

The performance results use text-only AgentX traffic. For B200 and VR200 benchmarking, edit the selected target’s kustomize/base/deploy.yaml: uncomment both lines of the synthetic SPECULATIVE_CONFIG alternative and comment out both lines of the active natural-acceptance entry. Keep exactly one active entry per worker; update both prefill and decode for disaggregated VR200. Regenerate and apply the selected manifest before running AIPerf:

python3 scripts/kustomize-matrix.py render recipes/kimi-k3.1-pro/vllm/agg-b200-agentx/.kustomize-matrix.yaml
kubectl apply -f recipes/kimi-k3.1-pro/vllm/agg-b200-agentx/deploy-b200.yaml -n ${NAMESPACE}
python3 scripts/kustomize-matrix.py render recipes/kimi-k3.1-pro/vllm/agg-vr200-agentx/.kustomize-matrix.yaml
kubectl apply -f recipes/kimi-k3.1-pro/vllm/agg-vr200-agentx/deploy-vr200.yaml -n ${NAMESPACE}
python3 scripts/kustomize-matrix.py render recipes/kimi-k3.1-pro/vllm/disagg-vr200-agentx/.kustomize-matrix.yaml
kubectl apply -f recipes/kimi-k3.1-pro/vllm/disagg-vr200-agentx/deploy-vr200.yaml -n ${NAMESPACE}

Wait for the replacement workers to become Ready before measuring. Restore natural acceptance, regenerate, and reapply the manifest before returning to normal serving.

The synthetic acceptance length of 3.84 was measured offline on the SpeedBench (qualitative) coding subset using the same DSpark draft length as this recipe: 7 draft tokens. The AgentX dataset and scenario above describe the throughput benchmark, not the offline acceptance-length measurement.

Set these values in the Job env section for your target:

  • ENDPOINT: the frontend Service of the DynamoGraphDeployment, ${DGD}-frontend:8000 (substitute the selected deployment name).
  • CONCURRENCY: GB300 uses 32 for vLLM aggregated and 48 for disaggregated. Reported VR200 points use 180 for aggregated and 174 for disaggregated; B200 uses 48.

The benchmark Job uses the same shared-model-cache PVC and tokenizer files as the deployment.

kubectl apply -f recipes/kimi-k3.1-pro/perf/perf.yaml -n ${NAMESPACE}
kubectl logs -f job/kimi-k3-1-aiperf -n ${NAMESPACE}

Results are written to /shared-model-cache/perf/<epoch>_<job-name>/. Restart the workers between independent runs to reset KV-cache and routing state.

Optimization Targets

The AgentX benchmark targets use the following interactivity goals:

WorkloadUser output tok/s (P50)TTFT P50
AgentX (inferencex-agentx-mvp)≥ 50< 2 s

Performance Results

All results below measure text-only traffic; the selected target is highlighted. B200 and VR200 use synthetic draft acceptance (AL 3.84); GB300 has speculative decoding disabled.

WorkloadRecipeFrameworkSKUConcurrencySystem Output tok/s/GPUUser output tok/s (P50)TTFT P50 (ms)
AgentX (inferencex-agentx-mvp)aggregated, 2 replicasvLLMVR200180153.0157.711,534
AgentX (inferencex-agentx-mvp)disaggregated 2P1DvLLMVR200174122.1973.931,761
AgentX (inferencex-agentx-mvp)aggregated, 1 replicavLLMB20048≈26.4164.02550.45
AgentX (inferencex-agentx-mvp)aggregated TP8, 1 replicavLLMGB3003239.8976.7428
AgentX (inferencex-agentx-mvp)disaggregated 2P1DvLLMGB3004823.0887.1656
AgentX (inferencex-agentx-mvp)aggregated multimodal overlay, 1 replica (pre-release)vLLMGB3003239.5670.9440
AgentX (inferencex-agentx-mvp)disaggregated multimodal overlay (pre-release)vLLMGB3004823.3885.7693

Compare All Targets

TargetGPUsParallelismValidation
GB300 vLLM aggregated8TP8 per workerText-only benchmark
GB300 vLLM aggregated multimodal8TP8 per workerText-only benchmark with pre-release weights; image input validated
GB300 vLLM disaggregated24TP8 per workerText-only benchmark
GB300 vLLM disaggregated multimodal24TP8 per workerText-only benchmark with pre-release weights; image input validated
GB300 SGLang aggregated8TP8 per workerFunctional only; no performance claim
GB300 SGLang disaggregated16TP8 per workerFunctional only; no performance claim
B200 vLLM aggregated16TP8 × PP2Text-only benchmark
VR200 vLLM aggregated16TP8 per workerText-only benchmark
VR200 vLLM disaggregated24TP8 per workerText-only benchmark

GPU counts below describe the checked-in manifests. P counts prefill workers; D counts decode workers.

FrameworkGPUTopologyTotal GPUsParallelismSpeculative DecodingStorage
vLLMGB3001 worker8TP8 across 2 nodes per workerDisabledShared PVC
vLLMGB3002P1D24TP8 across 2 nodes per workerDisabledShared PVC
SGLangGB3001 worker8TP8 across 2 nodes per workerDisabledShared PVC
SGLangGB3001P1D16TP8 across 2 nodes per workerDisabledShared PVC
vLLMB2001 worker16TP8 × PP2 across 2 nodesDSpark (7 draft tokens)Shared PVC
vLLMVR2002 workers16TP8 across 2 nodes per workerDSpark (7 draft tokens)Shared PVC
vLLMVR2002P1D24TP8 across 2 nodes per workerDSpark (7 draft tokens)Shared PVC

Notes

  • SGLang targets are experimental, text-only, and functional-only. No SGLang performance claims are made. Use the vLLM multimodal overlays for image and video input.
  • Synthetic draft acceptance is for benchmarking. Keep the natural-acceptance configuration active for normal serving.
  • Disaggregated performance depends on your fabric; RDMA tuning is cluster-specific.

Source