Running it: what an operator needs to know

CuteAFD is ready in 89 s and the vLLM fork in 382 s once its JIT caches are kept between starts (697 s without). On K4 the vLLM fork's KV cache holds 1,377,179 tokens and CuteAFD v3.0.1's 447,488 (v4.0.0: 1,931,264), and CuteAFD needs MAX_CONTEXT_TOKENS=262144 to start there. CuteAFD reuses repeated prompts and honours "thinking off"; its launcher defaults to a 4,096-token output limit and listens on every interface unless told otherwise.

Launch configurations

The configurations measured are on the home page as copyable blocks (Settings measured); the exact files used are in repro/cuteafd/configs (K3.25), repro/k4 (K4) and described in Reproduce. Scoring launches for precision add CuteAFD's bench endpoint (ENABLE_BENCH=on, an API key file, FULL_PREFILL_LOGITS=on) or, on the vLLM fork, a prompt-logprob capture plugin; serving does not need them.

Each item is the behaviour as measured or as read in source, with how it is known. None is a claim about output quality.

Capacity

vLLM forkCuteAFD
K3.25, KV cache at startup4,707,515 tokens4,726,784 tokens
K4, KV cache at startup1,377,179 tokens447,488 tokens (scoring launch 451,584)
Requests at once16 (max-num-seqs)16 (CONCURRENCY default)

K3.25 leaves room for about 4.7 million tokens of KV cache on both engines; K4 for far fewer (1.38 million on the vLLM fork, 447,488 on CuteAFD). K3.25's weights take about 69 GiB per GPU on the vLLM fork (its startup log); K4's weight size is not in the published files. The smaller K4 pools are consistent with its 4-bit experts taking more memory than K3.25's 3.25-bit ones, but that was not measured, and why CuteAFD's K4 pool is smaller than the vLLM fork's was not examined beyond the planner's lines below. These are v3.0.1 pools. On CuteAFD v4.0.0 the serving pools are 5,799,424 (K3.25), 1,931,264 (K4) and 2,240,512 (K4-Core-K6) tokens, against the vLLM fork's 4,762,898 and 1,377,179 in the same run (results/2026-10-30-cuteafd-v4).

CuteAFD on K4 needs one local setting on two RTX GPUs: at its defaults the planner refuses K4 (pool 260,608 tokens, below its 1,048,576-token context floor); MAX_CONTEXT_TOKENS=262144 gives a 447,488-token pool beside the desktop's context on GPU 1 (the dry run predicted 605,696). Its BF16 KDA and BF16 head options do not fit a K4 serving launch. With that setting CuteAFD serves K4 with prompts up to 262,144 tokens; the needle checks at 256K-1M tokens ran on K3.25.

Startup

Startup time is the cost of switching models. "Ready" here is the engine's ready line in its server log: for K3.25 counted from container start (measured from the server logs: results/2026-10-27-vllm-startup-cache). CuteAFD v3.0.1 is ready in 89 s: its kernels are compiled ahead of time and shipped in the image (PROGRAMS.json), so there is no startup JIT; its CPU planner computes the memory layout up front, so there is no profiling pass; and the experts load through a parallel shared read in 30.6 s. On this setup, the container keeps ~/.cache between starts but not the TileLang, Triton, TorchInductor and CUDA kernel caches, so the vLLM fork v0.9.2 compiled 49 TileLang kernels at every start and was ready in 697 s (11.6 min). Persisting those caches (pointing TILELANG_CACHE_DIR, TRITON_CACHE_DIR, TORCHINDUCTOR_CACHE_DIR and CUDA_CACHE_PATH into the cache directory the container already keeps) brings it to 382 s (6.4 min, −45%):

PhaseCaches not persistedCaches persisted, warm
Process start and weight loading242 s (weights 135.7 s)254 s (weights 139.3 s)
TileLang JIT222 s (49 compiles)0 compiles
CUDA graph capture153 s58 s (43 s of it capturing graphs)
Warm-up (4 passes)about 73 sabout 64 s
Ready697 s382 s

The first start after the change fills the caches and takes 714 s; later starts are warm. What remains is mostly weight loading (about 4 minutes including loader overhead). Other projects keep these caches between starts the same way (blackwell-llm-docker#73, which reports about 3.2 min of TileLang compiling per restart; sglang#39364; vLLM's Docker guide mounts the Hugging Face cache and ~/.cache/vllm).

On K4, counted from the start command (Stage 1 of the K4 run; one cold and one warm start per engine, descriptive). The vLLM fork's 257 s warm start is not directly comparable with K3.25's 382 s: a different checkpoint, measured in a different session (K3.25: the JIT-cache measurement of 2026-10-27 morning; K4: that evening, with the same cache overlay); what differs between the two starts was not broken down. CuteAFD's K4 cold and warm starts (76 s and 86 s) are one start each, so their 10 s difference is not read as an effect.

LaunchTo /v1/modelsTo readyCapacity at startup
vLLM cold249 s307 s1,377,179 tokens, 16 requests
vLLM warm200 s257 s1,377,179 tokens, 16 requests
CuteAFD cold74 s76 s447,488 tokens, 16 requests
CuteAFD warm79 s86 s447,488 tokens, 16 requests
CuteAFD scoring launch88 s90 s451,584 tokens, 16 requests
Startup to ready, per launch (K3.25; shorter is better)

What this shows. Seconds from container start to ready for each launch, split into phases (one shade per phase, strongest first).

vLLM forkCuteAFD
0 min2 min4 min6 min8 min10 minvLLM v0.9.2, JIT caches not persistedvLLM v0.9.2, JIT caches not persisted: process start + weight loading 242 sweight loadingvLLM v0.9.2, JIT caches not persisted: TileLang JIT (49 compiles) 222 sTileLang JITvLLM v0.9.2, JIT caches not persisted: CUDA graph capture 153 svLLM v0.9.2, JIT caches not persisted: warm-up 73 svLLM v0.9.2, JIT caches not persisted: other 7 s697 svLLM v0.9.2, JIT caches persisted (warm)vLLM v0.9.2, JIT caches persisted (warm): process start + weight loading 254 sweight loadingvLLM v0.9.2, JIT caches persisted (warm): memory profiling 6 svLLM v0.9.2, JIT caches persisted (warm): CUDA graph capture 58 svLLM v0.9.2, JIT caches persisted (warm): warm-up 64 s382 sCuteAFD v3.0.1CuteAFD v3.0.1: start to ready (AOT kernels; experts loaded in 30.6 s) 89 s89 s

How to use it. The total at the right is the wait each time the model is switched.

Table view: the exact numbers
LaunchPhaseTime
vLLM v0.9.2, JIT caches not persistedprocess start + weight loading242 s
vLLM v0.9.2, JIT caches not persistedTileLang JIT (49 compiles)222 s
vLLM v0.9.2, JIT caches not persistedCUDA graph capture153 s
vLLM v0.9.2, JIT caches not persistedwarm-up73 s
vLLM v0.9.2, JIT caches not persistedother7 s
vLLM v0.9.2, JIT caches persisted (warm)process start + weight loading254 s
vLLM v0.9.2, JIT caches persisted (warm)memory profiling6 s
vLLM v0.9.2, JIT caches persisted (warm)CUDA graph capture58 s
vLLM v0.9.2, JIT caches persisted (warm)warm-up64 s
CuteAFD v3.0.1start to ready (AOT kernels; experts loaded in 30.6 s)89 s

The first start after persisting the caches fills them and is no faster (714 s); every later start is warm.

Prefix cache

Thinking off and control tokens

Launcher defaults that matter

Determinism and drafting

Other engine observations