Llm Serving Capacity Planner logo

Llm Serving Capacity Planner

Community
BBuf
llm-serving-capacity-planner

Parse SGLang/vLLM startup logs to explain GPU memory use and request capacity. Use for KV cache budget, mem-fraction-static comparisons, OOM triage, and max-concurrency estimates.

Overview

PublisherBBuf
RepositoryAI-Infra-Auto-Driven-SKILLS
Skill namellm-serving-capacity-planner
Stars
946
Forks
83
Bundled files
3
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 3 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by BBuf on GitHub. Read the source before you install it.

Installation

Install the Llm Serving Capacity Planner AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/BBuf/AI-Infra-Auto-Driven-SKILLS/tree/main/skills/llm-serving-capacity-planner
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/BBuf/AI-Infra-Auto-Driven-SKILLS.git /tmp/AI-Infra-Auto-Driven-SKILLS
mkdir -p .claude/skills
cp -r /tmp/AI-Infra-Auto-Driven-SKILLS/skills/llm-serving-capacity-planner .claude/skills/llm-serving-capacity-planner
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Llm Serving Capacity Planner in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Llm Serving Capacity Planner on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Llm Serving Capacity Planner is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

LLM Serving Capacity Planner

Overview

Use this when a serving log has enough memory lines to explain where GPU HBM went. The analyzer reads SGLang/vLLM startup logs, extracts weight load, KV pool, CUDA graph, framework overhead, and token-capacity lines, then estimates concurrent requests for common token lengths.

For DeepSeek-V4.1, read the KV layout and page-allocation contract before using 528 B/288 B in an estimate. These are per-stored-token payload and scale sizes, not allocation after page padding or total model KV bytes. Verify actual pool layout, compression ratios and sharing from the pinned source and logs.

Inputs

Before running analysis, collect or verify these inputs:

ItemWhy it mattersHow to obtainDefault if user skips
Log file pathPrimary input; all memory data comes from hereAsk user for the serving startup log— (required)
GPU typeDetermines total HBM for decomposition validationAsk user or infer from logAuto-detected from log if possible
nvidia-smi outputProvides per-rank actual memory for cross-validationCapture with nvidia-smi --query-gpu=index,memory.used,memory.free --format=csv,noheader > smi.txt— (optional, but recommended)
Model config.jsonEnables theoretical KV cache byte calculation and replication factor analysisAsk user for the model's config.json path— (optional, log data used instead)
Request token lengthDetermines concurrency estimate denominatorAsk user4096, 6144, 8192

Workflow

Step 1: Collect the serving log

The user should provide the startup log from an SGLang or vLLM serving instance. Key log lines that the analyzer needs:

  • Load weight begin. avail mem=XX GB
  • server_args={'model_path': '...', 'tp_size': 8, ...} (resolved parameters)
  • Load weight end. ... avail mem=X GB, mem usage=X GB. (weight footprint)
  • DSV4 memory calculation: ... bytes_per_full_token=X, available_bytes=X GB, ... full_token=N
  • [label] KV Cache is allocated. dtype: ..., #tokens: N, K size: X GB, V size: Y GB (or KV size)
  • Mamba Cache is allocated. ... conv_state size: X GB, ssm_state size: Y GB
  • Memory pool end. avail mem=XX GB
  • Capture target|draft decode|verify|prefill CUDA graph end. elapsed=X s, mem usage=X GB, avail mem=X GB.
  • Post-capture KV sizing: KV cache allocated. ... KV size: X GB, avail mem=X GB (opt-in)
  • max_total_num_tokens=XX, ... chunked_prefill_size=-1|N, ... available_gpu_mem=XX GB

Legacy ServerArgs(...), Memory profiling: and Capture cuda graph end. remain accepted for older/private branch logs; they are not current main emitters.

Current vLLM V1 logs instead expose:

  • Initial free memory: ...; Requested memory: ... (DEBUG only)
  • Model loading took ... GiB
  • Available KV cache memory: ... GiB
  • Graph capturing finished ... took ... GiB
  • <device> KV cache size: ... tokens, Maximum concurrency for ... tokens per request: ...x
  • Free memory on device (F/T GiB) ... Current kv cache memory in use is K GiB (INFO)
  • CUDA graph pool memory: A GiB (actual), E GiB (estimated), ...
  • Initial free memory X GiB, reserved Y GiB memory for KV Cache ... (explicit KV bytes)
  • Maximum concurrency for ... tokens per request: ...x

If the log is from a running instance, capture it by redirecting stdout/stderr to a file at launch time.

Step 2: Optionally capture nvidia-smi data

For per-rank memory comparison:

bash
docker exec <container> nvidia-smi --query-gpu=index,memory.used,memory.free --format=csv,noheader > smi.txt

Step 3: Run the analyzer

bash
python3 skills/llm-serving-capacity-planner/scripts/capacity_analyzer.py \
  --log-file /path/to/sglang.log \
  --nvidia-smi-file /path/to/smi.txt \
  --gpu h200 \
  --config-json /path/to/config.json

For JSON output (automation):

bash
python3 skills/llm-serving-capacity-planner/scripts/capacity_analyzer.py \
  --log-file /path/to/sglang.log \
  --format json

Step 4: Review and interpret results

The analyzer prints:

  1. Memory breakdown table: each category (weights, KV pool, CUDA graph, framework, other) with GiB, MiB, percentage, and derivation
  2. Per-rank comparison: nvidia-smi data across all TP ranks
  3. KV pool detail: pool configuration, KV dtype, replication factor, per-token byte calculation
  4. Concurrency estimate: max concurrent requests for different token lengths
  5. Tuning notes: configuration changes that may increase capacity

For vLLM, the report also includes a vLLM Startup Evidence section. Values that are not present in the log stay unknown; do not translate them into SGLang-only fields.

When To Use It

  • After launching an LLM serving instance, to understand how GPU memory is distributed
  • When comparing different --mem-fraction-static values and their impact on KV pool capacity
  • When planning deployment capacity: how many concurrent requests can a given GPU configuration support
  • When investigating OOM issues: identifying which memory category is consuming the most
  • When evaluating whether fp8 KV cache or EP can improve concurrency

Key Concepts

mem-fraction-static

The inspected SGLang source reserves runtime headroom from pre-model-load free memory: headroom = pre_model_load_memory * (1 - mem_fraction_static). The KV budget starts from currently free memory minus this headroom and other model-specific reservations. It is not post_weight_free * fraction. Post-capture sizing may update the pool again. Use final logged capacity and rank-local evidence; see source contracts.

The default is auto-resolved from the hardware and configuration. Read the resolved value from server_args={...}. A lower value increases runtime headroom at the cost of KV capacity. Do not infer 0.88 when it is absent.

KV Head Replication

For standard GQA/MHA, each rank stores max(1, num_key_value_heads // tp_size) KV heads. When TP exceeds the head count, each head is replicated across a subgroup of ranks, not the whole head set on every rank. For kv_heads=4, tp=8, each rank stores one head; for kv_heads=1, tp=8, all eight ranks store that single head. MLA stores a replicated latent plus RoPE key instead. The theoretical calculation assumes all configured layers reside on the rank; use rank-local layer counts for pipeline parallelism.

SWA (Sliding Window Attention) Compression

Models like DeepSeek-V4 use CSA (Compressed Sliding Attention) and HCA (Hierarchical Context Attention) with sliding windows. This reduces per-token KV cache bytes compared to the theoretical full-attention calculation. The bytes_per_full_token reported in the log already accounts for this compression.

Reporting Checklist

Include:

  1. Serving configuration: model, GPU, TP/PP/EP, mem-fraction-static, kv-cache-dtype
  2. Memory breakdown table: category / GiB / MiB / percentage / derivation source
  3. Per-rank nvidia-smi comparison: used and free memory per TP rank
  4. KV pool detail: pool size, bytes_per_full_token, KV dtype, replication factor, theoretical per-token KV calculation (when config.json provided)
  5. Concurrency estimate table: request token length / token-limit / request-limit / max concurrent
  6. Tuning notes based on free memory and configuration

2026-08-23 Runtime Notes

SGLang v0.5.18 consolidates compiled-kernel caches under SGLANG_CACHE_DIR. The first launch after an upgrade can look like extra "other" memory and a longer startup because Triton / FlashInfer / DeepGEMM / Inductor recompile once. Overlapped checkpoint staging (--startup-weight-load-mode overlap) also changes the startup memory curve: weight pages and CUDA-graph capture can overlap, so do not treat a shorter load-weight interval as a smaller weight footprint.

Known Limitations

LimitationDetailWorkaround
Framework-specific checkpointsSGLang and vLLM expose different memory checkpoints, so some fields are not comparable one-to-oneReport unknown fields and compare only shared, explicit evidence
SWA compression modelsPer-token KV bytes cannot be independently calculated from model config for CSA/HCA attention — the framework's internal SWA window parameters are neededUse bytes_per_full_token from the log directly
DeepGEMM JIT memoryThe analyzer categorizes DeepGEMM JIT compilation memory as "other" because it is not explicitly reported in the logCompare with nvidia-smi total for accurate accounting
PP (Pipeline Parallelism)Memory decomposition is per-rank; PP configurations may have uneven memory across stagesSpecify --target-rank for each PP stage
MoE expert bufferSome frameworks allocate additional buffers for expert routing that are not separately reportedIncluded in "model weights" or "other" depending on when allocated

References

  • references/log-patterns.md: log line patterns and their semantics for memory analysis.
  • references/gpu-specs.json: GPU HBM specifications for h20, h100, h200, and b200 aliases.
  • scripts/capacity_analyzer.py: the core analysis script.

Memory capacity sources

The bundled hardware table records vendor GB maxima, not usable GiB. Prefer nvidia-smi used+free or vLLM's logged total. B200 retains the DGX 180GB SKU; other Blackwell SKUs may differ. DGX Spark's 128GB is unified system memory, not dedicated HBM. L20 is the official 48GB SKU; do not infer a capacity for l20n from the name. GB200 records the physical 192GB package maximum; its deployed SKU and custom SKUs require measured totals. Official source URLs are stored with each newly added hardware entry.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Llm Serving Capacity Planner AI skill do?

Parse SGLang/vLLM startup logs to explain GPU memory use and request capacity. Use for KV cache budget, mem-fraction-static comparisons, OOM triage, and max-concurrency estimates.

Why use Llm Serving Capacity Planner on TypingMind?

Because you install it once and use it with any model. Llm Serving Capacity Planner is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Llm Serving Capacity Planner in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/BBuf/AI-Infra-Auto-Driven-SKILLS/tree/main/skills/llm-serving-capacity-planner. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Llm Serving Capacity Planner?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Llm Serving Capacity Planner?

As many as you like. As long as a model supports skills, you can use Llm Serving Capacity Planner with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Llm Serving Capacity Planner AI skill free?

It is published on GitHub by BBuf. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇