Reproducible K2.6 0424 baseline image (vLLM 0.16.1). 8x RTX PRO 6000.
154
Reproducible build of K2.6 baseline image
voipmonitor/vllm:kimi-k26-mtp-upstream-stack-pcie-env-test-20260424
from public sources only (voipmonitor/vllm @ 79369d6 pr-kimi-k26-mtp-triton-mla-stack branch).
vLLM 0.16.1 + flashinfer 0.6.10rc1 + cute-dsl 4.4.2 + triton 3.6.0 + festr2 eagle3 fp8-tensor draft. Built on CUDA 13.0 / Ubuntu 24.04.
Winner for c=1-4 (Claude Code-style) workloads vs the newer canonical-rebase image (orthozany/k26-v4-clean:v1) — the v4 image has a c=1 spec-decode regression. See perf table below.
huggingface-cli download moonshotai/Kimi-K2.6 \
--local-dir /path/to/Kimi-K2.6 --local-dir-use-symlinks=False
compose.0424-mtp3.ymlexport KIMI_K26_MODEL_PATH=/path/to/Kimi-K2.6
export CACHE_ROOT=$PWD/cache-0424 && mkdir -p $CACHE_ROOT
docker compose -f compose.0424-mtp3.yml up -d
# Wait ~5-8 min for model load + CUDA graph capture
until curl -fsS http://localhost:8402/v1/models >/dev/null; do sleep 10; done
echo "ready"
curl -sS http://localhost:8402/v1/chat/completions -H 'Content-Type: application/json' -d '{
"model": "Kimi-K2.6", "messages": [{"role": "user", "content": "hi"}], "max_tokens": 20
}'
services:
vllm-k26-0424:
image: orthozany/k26-0424-clean:v12
container_name: vllm-k26-0424
ipc: host
network_mode: host
runtime: nvidia
shm_size: "32g"
environment:
- NVIDIA_VISIBLE_DEVICES=${NVIDIA_VISIBLE_DEVICES:-all}
- CUDA_DEVICE_ORDER=PCI_BUS_ID
- OMP_NUM_THREADS=16
- HF_HOME=/root/.cache/huggingface
# Server flags (read by baked /opt/run-k26.sh)
- PORT=8402
- MODEL=/model
- SERVED_MODEL_NAME=Kimi-K2.6
- TP_SIZE=8
- DCP_SIZE=8
- GPU_MEMORY_UTILIZATION=0.97
- MAX_MODEL_LEN=262144
- MAX_NUM_BATCHED_TOKENS=8192
- MAX_NUM_SEQS=128
- KV_CACHE_DTYPE=fp8
- ATTENTION_BACKEND=TRITON_MLA
# default SPEC_CONFIG (baked into /opt/run-k26.sh) =
# MTP=3 fp8 draft + probabilistic rejection (vLLM 0.16.1 syntax)
volumes:
- ${KIMI_K26_MODEL_PATH:?Set KIMI_K26_MODEL_PATH to absolute path of Kimi-K2.6 weights}:/model:ro
- ${CACHE_ROOT:-./cache-0424}/vllm:/root/.cache/vllm
- ${CACHE_ROOT:-./cache-0424}/torch:/root/.cache/torch
- ${CACHE_ROOT:-./cache-0424}/triton:/root/.cache/triton
- ${CACHE_ROOT:-./cache-0424}/torchinductor:/root/.cache/torchinductor
- ${CACHE_ROOT:-./cache-0424}/flashinfer:/root/.cache/flashinfer
- ${CACHE_ROOT:-./cache-0424}/huggingface:/root/.cache/huggingface
ulimits:
memlock: -1
stack: 67108864
restart: "no"
Override SPEC_CONFIG env to change spec config:
- SPEC_CONFIG={"model":"festr2/kimi-k2.6-eagle3-mla-fp8","method":"eagle3","num_speculative_tokens":1,"draft_attention_backend":"TRITON_MLA","draft_kv_cache_dtype":"fp8","rejection_sample_method":"probabilistic"}
Set SPEC_CONFIG="" to disable spec decode.
vLLM 0.16.1 accepts rejection_sample_method:"probabilistic" — this is what gives the best c=1 acceptance rate with the festr2 fp8-tensor draft. The newer v4 image (vLLM 0.20.2) dropped this string value.
FROM nvidia/cuda:13.0.0-devel-ubuntu24.04
ARG CUTLASS_DSL_VERSION=4.4.2
ARG NCCL_VERSION=2.29.7
ARG TRITON_VERSION=3.6.0
ARG FLASHINFER_VERSION=0.6.10rc1
ARG TORCH_VERSION=2.11.0+cu130
ARG TORCHVISION_VERSION=0.26.0+cu130
ARG VLLM_FORK_COMMIT=79369d6baa20bf676e8a4e85e805b488e43fc078
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
python3.12 python3.12-dev python3.12-venv python3-pip \
git build-essential ninja-build cmake ca-certificates curl wget \
&& rm -rf /var/lib/apt/lists/* \
&& ln -sf /usr/bin/python3.12 /usr/bin/python3 \
&& ln -sf /usr/bin/python3.12 /usr/bin/python
RUN python3 -m venv /opt/venv
ENV PATH=/opt/venv/bin:$PATH
RUN pip install --no-cache-dir --upgrade pip "setuptools>=77.0.3,<81.0.0" setuptools-scm wheel ninja
RUN pip install --no-cache-dir \
torch==${TORCH_VERSION} torchvision==${TORCHVISION_VERSION} \
--index-url https://download.pytorch.org/whl/cu130
RUN pip install --no-cache-dir --no-deps \
nvidia-cutlass-dsl==${CUTLASS_DSL_VERSION} \
nvidia-cutlass-dsl-libs-base==${CUTLASS_DSL_VERSION} \
nvidia-cutlass-dsl-libs-cu13==${CUTLASS_DSL_VERSION} \
nvidia-nccl-cu13==${NCCL_VERSION} \
triton==${TRITON_VERSION}
RUN git clone https://github.com/voipmonitor/vllm /opt/vllm \
&& cd /opt/vllm \
&& git checkout ${VLLM_FORK_COMMIT}
WORKDIR /opt/vllm
RUN pip install -e . --no-build-isolation
RUN pip install --no-cache-dir --no-deps \
"flashinfer-python==${FLASHINFER_VERSION}" \
"flashinfer-cubin==${FLASHINFER_VERSION}" \
&& pip install --no-cache-dir --no-deps --index-url https://flashinfer.ai/whl/cu130 \
"flashinfer-jit-cache==${FLASHINFER_VERSION}+cu130"
ENV NCCL_PROTO=LL,LL128,Simple \
NCCL_P2P_LEVEL=SYS \
NCCL_IB_DISABLE=1 \
VLLM_DISABLED_KERNELS=MarlinFP8ScaledMMLinearKernel \
VLLM_LOG_STATS_INTERVAL=1 \
VLLM_MEMORY_PROFILER_ESTIMATE_CUDAGRAPHS=1 \
VLLM_ENABLE_PCIE_ALLREDUCE=0 \
CUDA_DEVICE_ORDER=PCI_BUS_ID
COPY run-k26.sh /opt/run-k26.sh
RUN chmod +x /opt/run-k26.sh
ENTRYPOINT ["/opt/run-k26.sh"]
#!/usr/bin/env bash
set -euo pipefail
exec vllm serve "${MODEL:-/model}" \
--served-model-name="${SERVED_MODEL_NAME:-Kimi-K2.6}" \
--trust-remote-code \
--host="${HOST:-0.0.0.0}" \
--port="${PORT:-8402}" \
--tensor-parallel-size="${TP_SIZE:-8}" \
--pipeline-parallel-size=1 \
--decode-context-parallel-size="${DCP_SIZE:-8}" \
--enable-chunked-prefill \
--enable-prefix-caching \
--load-format=fastsafetensors \
--async-scheduling \
--gpu-memory-utilization="${GPU_MEMORY_UTILIZATION:-0.97}" \
--max-num-batched-tokens="${MAX_NUM_BATCHED_TOKENS:-8192}" \
--max-num-seqs="${MAX_NUM_SEQS:-128}" \
--max-model-len="${MAX_MODEL_LEN:-262144}" \
--mm-processor-cache-gb=0 \
--mm-encoder-tp-mode=weights \
--attention-backend="${ATTENTION_BACKEND:-TRITON_MLA}" \
--kv-cache-dtype="${KV_CACHE_DTYPE:-fp8}" \
--tool-call-parser=kimi_k2 \
--enable-auto-tool-choice \
--reasoning-parser=kimi_k2 \
--speculative-config="${SPEC_CONFIG:-{\"model\":\"festr2/kimi-k2.6-eagle3-mla-fp8\",\"method\":\"eagle3\",\"num_speculative_tokens\":3,\"draft_attention_backend\":\"TRITON_MLA\",\"draft_kv_cache_dtype\":\"fp8\",\"rejection_sample_method\":\"probabilistic\"}}" \
"$@"
orthozany/k26-v4-clean:v1)All measured on 8x RTX PRO 6000 Blackwell, DCP=8, fp8 KV, TRITON_MLA, --skip-prefill --duration 30 --kv-budget 2464640, server-side generation throughput.
c=1, contexts 0 and 128k, 8 sequential runs on orthozany/k26-0424-clean:v12:
| corner | n | mean | min | max | stdev | CV |
|---|---|---|---|---|---|---|
| c=1 ctx=0 | 8 | 95.59 | 91.38 | 99.00 | 2.93 | 3.1% |
| c=1 ctx=128k | 8 | 64.39 | 62.66 | 66.67 | 1.24 | 1.9% |
For reference, 8-run variance of orthozany/k26-v4-clean:v1 (companion image, MTP=3 fp8draft): 75.26 / 57.19 mean — this image leads by +27.0% (ctx=0) / +12.6% (ctx=128k). v4-clean's ctx=128k variance is 3.6× higher (CV 6.8% vs 1.9%).
| variant | image | MTP | c=1 ctx=0 | c=1 ctx=128k | c=128 ctx=0 |
|---|---|---|---|---|---|
| 0424 fp8draft + probabilistic | this image | 3 | 96.1 | 66.7 | 1191.6 |
| 0424 fp8draft + probabilistic | this image | 1 | 87.6 | 66.9 | 1516.7 |
| 0424 noMTP | this image | 0 | 73.3 | 59.9 | 1363.2 |
| v4 fp8draft | k26-v4-clean | 3 | 78.4 | 53.9 | 1163.6 |
| v4 fp8draft | k26-v4-clean | 1 | 79.9 | 62.3 | 1516.2 |
| v4 lightseekorg bf16 | k26-v4-clean | 3 | 83.4 | 59.4 | 1174.5 |
| MTP | corner | v4 | 0424 | v4 vs 0424 |
|---|---|---|---|---|
| 3 | c=1 ctx=0 | 78.4 | 96.1 | −18.4% |
| 3 | c=1 ctx=128k | 53.9 | 66.7 | −19.2% |
| 3 | c=128 ctx=0 | 1163.6 | 1191.6 | −2.3% |
| 1 | c=1 ctx=0 | 79.9 | 87.6 | −8.8% |
| 1 | c=128 ctx=0 | 1516.2 | 1516.7 | −0.0% |
| 0 | c=1 ctx=0 | 78.5 | 73.3 | +7.1% |
Takeaway: v4 has a c=1 spec-decode regression (-18-19% at MTP=3, halves at MTP=1, inverts at noMTP). Kernel matches at c=128. For Claude Code-style workloads, stay on this image.
Content type
Image
Digest
sha256:80d597623…
Size
13 GB
Last updated
5 months ago
docker pull orthozany/k26-0424-clean:v12