Sign inSign up

orthozany/k26-0424-clean

By orthozany

•Updated 5 months ago

Reproducible K2.6 0424 baseline image (vLLM 0.16.1). 8x RTX PRO 6000.

Image
0

154

orthozany/k26-0424-clean repository overview

⁠orthozany/k26-0424-clean:v12

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.

⁠Hardware assumption

  • 8x NVIDIA RTX PRO 6000 Blackwell 96 GB (sm_120a)
  • Driver 595.45.04 verified working
  • 1T-param K2.6 weights (~960 GB) on local NVMe

⁠Quickstart

⁠1. Download model
huggingface-cli download moonshotai/Kimi-K2.6 \
  --local-dir /path/to/Kimi-K2.6 --local-dir-use-symlinks=False
⁠2. Save the compose file below as compose.0424-mtp3.yml
⁠3. Run
export 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"
⁠4. Sanity check
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
}'

⁠compose.0424-mtp3.yml

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"

⁠Switching MTP variants

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.

⁠Dockerfile (full build from public sources)

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"]

⁠/opt/run-k26.sh (baked launcher)

#!/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\"}}" \
  "$@"

⁠Performance — this image vs the newer v4 (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.

⁠8-run variance on this image, MTP=3 fp8draft + probabilistic

c=1, contexts 0 and 128k, 8 sequential runs on orthozany/k26-0424-clean:v12:

cornernmeanminmaxstdevCV
c=1 ctx=0895.5991.3899.002.933.1%
c=1 ctx=128k864.3962.6666.671.241.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%).

⁠Headline (corners)
variantimageMTPc=1 ctx=0c=1 ctx=128kc=128 ctx=0
0424 fp8draft + probabilisticthis image396.166.71191.6
0424 fp8draft + probabilisticthis image187.666.91516.7
0424 noMTPthis image073.359.91363.2
v4 fp8draftk26-v4-clean378.453.91163.6
v4 fp8draftk26-v4-clean179.962.31516.2
v4 lightseekorg bf16k26-v4-clean383.459.41174.5
⁠Pct diff (v4 vs 0424)
MTPcornerv40424v4 vs 0424
3c=1 ctx=078.496.1−18.4%
3c=1 ctx=128k53.966.7−19.2%
3c=128 ctx=01163.61191.6−2.3%
1c=1 ctx=079.987.6−8.8%
1c=128 ctx=01516.21516.7−0.0%
0c=1 ctx=078.573.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.

Tag summary

Content type

Image

Digest

sha256:80d597623…

Size

13 GB

Last updated

5 months ago

docker pull orthozany/k26-0424-clean:v12