Tag: Context Window

  • Troubleshooting vLLM Startup: Resolving KV Cache Capacity Exceeded Errors

    Troubleshooting vLLM Startup: Resolving KV Cache Capacity Exceeded Errors

    TL;DR

    • vLLM aborts engine initialization with a ValueError when the allocated KV cache capacity cannot accommodate the model’s maximum sequence length for at least one request.

    • The issue is commonly resolved by decreasing max_model_len, increasing gpu_memory_utilization, or applying tensor parallelism and quantization.

    • In tight-margin boundary cases, switching to the FlashInfer attention backend—either explicitly or implicitly via FP8 KV cache—has been observed to leave less available KV cache memory, triggering this error under otherwise identical settings.

    Diagnosing the KV Cache Exceeded ValueError during Engine Initialization

    During engine initialization and cache profiling, vLLM manages key-value activations in fixed-size blocks via PagedAttention. Before processing inference requests, the engine evaluates available memory and performs a sanity check: the total number of tokens that can fit into the allocated KV cache blocks must be at least as large as the configured maximum sequence length. If the KV cache capacity is smaller than that limit, the engine aborts initialization with a traceback:

    ValueError: The model's max seq len (<X>) is larger than the maximum number of tokens that can be stored in KV cache (<Y>). Try increasing gpu_memory_utilization or decreasing max_model_len when initializing the engine.
    

    This error prevents runtime Out-of-Memory (OOM) faults by ensuring the engine has enough memory to process at least a single full-context request. The available space for cache blocks is roughly calculated as:

    KV Cache Memory ≈ (Total GPU Memory * gpu_memory_utilization) - (Weights + Activations + CUDA Graphs)
    

    Two primary factors trigger this error during startup:

    • Unset or high default context window: If max_model_len (CLI flag --max-model-len) is omitted, vLLM falls back to the native context limit in the model’s Hugging Face config.json (such as max_position_embeddings, which can reach 32,768, 65,536, or 131,072+ tokens). On GPU memory-constrained hardware, the engine cannot allocate enough blocks to cover such large sequences.
    • Model weight and runtime overhead: Serving models in unquantized FP16 or BF16 formats or enabling CUDA graph capture consumes the majority of the GPU memory budget, leaving insufficient headroom for the remaining KV cache pool.

    To resolve the error during engine initialization, adjust the memory configuration via the following flags:

    vllm serve <model_name> --max-model-len 4096 --gpu-memory-utilization 0.95
    

    Setting --max-model-len to an integer lower than the reported capacity directly caps the required sequence ceiling. Raising gpu_memory_utilization (CLI flag --gpu-memory-utilization) above its default of 0.9 (for example, to 0.95) expands the engine’s reserved GPU memory quota, provided sufficient headroom remains to avoid runtime OOM spikes.

    Additional memory can be freed by distributing weights and attention heads across multiple GPUs using tensor parallelism via --tensor-parallel-size, applying model weight quantization (such as FP8, AWQ, or GPTQ), or specifying --kv-cache-dtype as fp8 (or fp8_e4m3 / fp8_e5m2 on supported architectures) to cut the per-token KV footprint by approximately 50% compared to 16-bit floats. However, operators should be aware that enabling FP8 KV cache can implicitly select the FlashInfer backend on certain GPUs, which in tight memory margin scenarios may reduce the available KV cache pool and trigger this initialization check.

    Sources: [Usage]: What's the relationship between KV cache and MAX_SEQUENCE_LENGTH. · Issue #10517 · vllm-project/vllm , worker – vLLM, docs.vllm.ai/en/latest/design/hybrid_kv_cache_manager, vLLM KV Cache OOM: The Flags That Actually Fix It, Conserving Memory – vLLM

    Resolving Hidden Memory Overhead from FLASHINFER and FP8 KV Cache Configurations

    Beyond standard sequence length and utilization tuning, a ValueError during KV cache initialization can also arise in tight-margin boundary conditions when switching the attention backend via --attention-backend, even when GPU memory, --max-model-len (max_model_len), and --gpu-memory-utilization (gpu_memory_utilization) settings remain identical. In an issue reported on the vLLM repository, serving RedHatAI/Qwen3.8-27B-INT4 (a hybrid Mamba/GDN architecture) on two 16 GB RTX 5060 Ti GPUs (PyTorch 2.13.0+cu130, flashinfer-python 0.6.18, vLLM 0.28.0 and 0.28.1rc1.dev446+g798544433) succeeded under the default FlashAttention (FLASH_ATTN) backend, creating a pool of 105,594 tokens on the development build (108,589 tokens on 0.28.0).

    However, explicitly passing --attention-backend FLASHINFER caused engine initialization to fail. Note that the reproduction command included specialized flags tailored for this hybrid model setup, such as --mamba-cache-mode align, rather than standard generic parameters:

    vllm serve RedHatAI/Qwen3.8-27B-INT4 --tensor-parallel-size 2 \
      --gpu-memory-utilization 0.90 --max-model-len 100352 --max-num-seqs 32 \
      --mamba-cache-mode align --max-num-batched-tokens 3135 \
      --attention-backend FLASHINFER
    

    This configuration failed during the memory check with the following error:

    ValueError: To serve at least one request with the model's max seq len (100352),
    3.21 GiB KV cache is needed, which is larger than the available KV cache memory
    (3.06 GiB). Try increasing `gpu_memory_utilization` ... or decreasing `max_model_len` ...
    

    On vLLM 0.28.0, the same message reported 3.15 GiB available memory instead of 3.06 GiB. Users can also encounter this issue without explicitly setting --attention-backend FLASHINFER, as setting --kv-cache-dtype fp8 implicitly selects FlashInfer on some GPUs. While the exact root cause was not definitively settled in the issue report, the reporter suggested that the FlashInfer workspace memory might not be reserved prior to calculating the KV cache pool size. Because the original error message only advised adjusting gpu_memory_utilization or max_model_len, it never informed users that the attention backend was the variable that changed.

    To address this ambiguity, a pull request has been proposed (still open) to identify the active attention backend and include that information directly within the existing ValueError.

    Sources: [Bug]: –attention-backend FLASHINFER fails the startup KV-cache check at a max-model-len that FLASH_ATTN serves; the message never names the backend, kv cache Value Erorr msg improvement Attention Backend

    Closing thoughts

    Ultimately, while trimming --max-model-len or nudging gpu_memory_utilization upward provides a quick mechanical fix, this error illustrates that KV cache headroom is governed by far more than just model weights and user-defined sequence caps. As the observed FlashInfer boundary case demonstrates, backend selection—whether configured explicitly or selected implicitly through options like FP8 KV caching—can alter the memory available for cache blocks and break razor-thin initialization budgets. Rather than reflexively sacrificing context length when this check fails, operators on memory-constrained GPUs should consider backend selection as an active variable in their memory budget. In this context, the proposed pull request to expose the active attention backend directly within the ValueError traceback represents a welcome diagnostic improvement, clarifying what variable actually impacted the available memory pool.

    Frequently Asked Questions

    Why does vLLM throw a ValueError regarding KV cache capacity during engine initialization?

    The error occurs during memory profiling if the total number of tokens that can fit into the allocated KV cache blocks is smaller than the model’s configured maximum sequence length. This sanity check aborts startup to prevent runtime Out-of-Memory faults, ensuring the engine has enough memory to handle at least a single full-context request.

    What are the primary ways to fix the KV cache ValueError?

    You can resolve the error by decreasing the maximum sequence ceiling with --max-model-len or increasing --gpu-memory-utilization (for example, to 0.95) to allocate more GPU memory. Additional remedies include enabling tensor parallelism via --tensor-parallel-size, applying model weight quantization, or setting --kv-cache-dtype to fp8 to reduce the per-token KV footprint (bearing in mind that FP8 KV cache may implicitly select FlashInfer).

    How can changing the attention backend trigger this KV cache error?

    In narrow memory margin setups, switching the attention backend to FLASHINFER has been observed to leave less available KV cache memory compared to FLASH_ATTN (suspected to stem from how backend workspace memory is reserved relative to KV cache pool sizing). This difference can cause initialization to fail even when GPU memory, --max-model-len, and --gpu-memory-utilization remain completely unchanged.

    Can the FLASHINFER backend be activated without passing --attention-backend FLASHINFER?

    Yes, setting --kv-cache-dtype fp8 implicitly selects the FlashInfer backend on some GPUs, which can alter available KV cache headroom in tight boundary cases and trigger the initialization error.


    Keep reading: LLM Inference & Serving

    All guides in this series: LLM Inference & Serving Guides: vLLM, Ollama & Hugging Face

  • Debugging Silent Context Truncation in Ollama’s OpenAI-Compatible API

    Debugging Silent Context Truncation in Ollama’s OpenAI-Compatible API

    TL;DR

    • Ollama’s OpenAI-compatible API silently trims prompt inputs that exceed the context window instead of returning an explicit error.
    • This truncation occurs because standard OpenAI API parameters like max_tokens do not configure Ollama’s input context size.
    • Developers can detect truncation using OLLAMA_DEBUG=1 and resolve it by setting PARAMETER num_ctx in a custom Modelfile or using the OLLAMA_CONTEXT_LENGTH environment variable.

    Understanding Silent Context Truncation in Ollama

    In LLM serving frameworks like Ollama, context window size represents the maximum number of tokens (comprising both the input prompt and output response) that a model can retain in memory at a given time. When applications send requests to Ollama’s OpenAI-compatible API endpoint v1/chat/completions, input sequences that exceed the model’s assigned context window trigger silent context truncation. Instead of throwing an explicit error, Ollama trims earlier messages or system prompts to fit within the allocated context window, which can cause subtle response quality degradation or lost instructions.

    This behavior is primarily driven by API schema discrepancies and default runtime boundaries:

    • API Schema Discrepancy: While native Ollama endpoints (/api/generate or /api/chat) accept context window configuration directly via the num_ctx parameter, the standard OpenAI-compatible API schema does not natively support num_ctx. Standard parameters like max_tokens control output generation limits rather than input context allocation. Consequently, requests routed through v1/chat/completions rely on the model’s defined context window or global server settings unless overridden in a custom model.
    • Default Context Limits: To prevent out-of-memory (OOM) errors, Ollama enforces default context window limits—traditionally 2048 or 4096 tokens, or variable limits based on available GPU VRAM. Even if a model natively supports a larger context window (such as 32k or 128k tokens), running it without explicit configuration binds it to a smaller runtime default.

    Several diagnostic tools can be used to inspect active context window bounds and detect truncation events:

    • Server Debug Mode: Launching the server with OLLAMA_DEBUG=1 ollama serve enables verbose logging. The server logs will explicitly flag truncation with messages such as truncating input prompt or truncating input messages which exceed context length.
    • Runtime Verification: Running ollama ps in the CLI shows currently loaded models alongside their actively allocated memory bounds under the CONTEXT column.
    • Modelfile Inspection: Running ollama show --modelfile <model_name> inspects a model’s base configuration to verify whether a default PARAMETER num_ctx has been saved.

    To adjust and expand the active context window for OpenAI-compatible API client integrations, context window size can be configured via a custom model Modelfile or a server-wide environment variable.

    Creating a custom model via a Modelfile is the recommended method for OpenAI-compatible API compatibility:

    FROM llama3.2
    PARAMETER num_ctx 16384
    

    After building the model with ollama create my-custom-model, specify "model": "my-custom-model" in v1/chat/completions API calls.

    Alternatively, setting the OLLAMA_CONTEXT_LENGTH environment variable before starting the server establishes a global context window default for loaded models:

    OLLAMA_CONTEXT_LENGTH=32768 ollama serve
    

    For native Ollama endpoints (/api/generate, /api/chat), runtime context window configurations resolve according to the following priority hierarchy — note this num_ctx request parameter is NOT available on the OpenAI-compatible v1/chat/completions endpoint, which can only be configured via the Modelfile or environment variable below:

    Native API Request Parameters (num_ctx, native endpoints only) > Modelfile (PARAMETER num_ctx) > Environment Variable (OLLAMA_CONTEXT_LENGTH) > Default Allocation

    Sources: Context length – Ollama, Ollama Context Window: How to Set num_ctx – Serverman, stouf.medium.com/fixing-context-limits-in-opencode-ollama-1d820b332b41, reddit.com/r/LocalLLaMA/comments/1nffm7r/psa_for_ollama_users_your_co…, FAQ – Ollama

    Closing thoughts

    Ultimately, while Ollama’s OpenAI-compatible API offers seamless integration, its conservative runtime defaults create a subtle trap where longer prompts are quietly trimmed without raising explicit errors. Relying on out-of-the-box settings is risky because standard OpenAI parameters like max_tokens affect output generation rather than expanding Ollama’s input context window. In my view, explicitly configuring context limits via custom Modelfiles or the OLLAMA_CONTEXT_LENGTH environment variable should be treated as a mandatory setup step for any production v1/chat/completions integration. Actively navigating this configuration hierarchy and validating allocated limits through debug tools is essential to prevent invisible prompt degradation while maintaining system stability.

    Frequently Asked Questions

    What is silent context truncation in Ollama?

    Silent context truncation occurs when input sequences exceed a model’s allocated context window size. Instead of throwing an explicit error, Ollama trims earlier messages or system prompts to fit within the available context window.

    Why does silent context truncation happen with Ollama’s OpenAI-compatible API?

    The standard OpenAI-compatible API schema does not natively support Ollama’s num_ctx configuration parameter, and parameters like max_tokens only restrict output length. Consequently, requests default to conservative server or runtime context limits unless overridden.

    How can I detect if context truncation is occurring in Ollama?

    You can start the server with OLLAMA_DEBUG=1 to view verbose logs that explicitly flag truncation events. Additionally, running ollama ps shows loaded context bounds, and ollama show –modelfile displays default model parameters.

    How do I expand the context window size for OpenAI-compatible API calls in Ollama?

    You can define PARAMETER num_ctx in a custom model’s Modelfile or set the OLLAMA_CONTEXT_LENGTH environment variable before starting the Ollama server.


    Keep reading: LLM Inference & Serving

    All guides in this series: LLM Inference & Serving Guides: vLLM, Ollama & Hugging Face