From business requirements to running llm-d deployments — sizing, estimation, and deployment in one workflow.
pip install llm-d-planner
from planner import Planner, DeploymentIntent
p = Planner()
p.load_bundled_benchmarks()
spec = p.generate_specification(DeploymentIntent(
use_case="chatbot_conversational",
user_count=1000,
))
recs = p.generate_recommendations(spec)
See Programmatic API User Guide for complete documentation.
make setup && make start
See Developer Guide for setup instructions.
Deploying LLMs in production means navigating a fragmented landscape of model selection, GPU sizing, performance estimation, and Kubernetes configuration. Platform teams typically piece together separate tools and manual calculations, leading to expensive trial-and-error.
llm-d Planner unifies these concerns into a single platform with three capabilities:
Planner is the main workflow — it makes recommendations based on available benchmarks, and leverages the Capacity Planner and GPU Recommender to fill gaps and expand the search surface beyond what benchmarks alone can cover. The Capacity Planner and GPU Recommender are also useful on their own for deeper analysis in their respective areas, each with its own UI page, CLI command, and API endpoint.
planner CLI or REST API for programmatic access to
all capabilitiesPlanner flow:
Capacity analysis flow:
Performance analysis flow:
Required before running make setup:
brew install python@3.13 (Linux: use your package manager
or pyenv)curl -LsSf https://astral.sh/uv/install.sh | shbrew install ollama (Linux:
ollama.com/download)brew install kubectl (Linux:
kubernetes.io/docs/tasks/tools)brew install kind (Linux:
kind.sigs.k8s.io/docs/user/quick-start)Get up and running in 4 commands:
make setup # Install dependencies, pull Ollama model
make start # Start all services (DB + Ollama + Backend + UI)
make db-load-blis # Load BLIS benchmark data
make cluster-start # Optional: Create local KIND cluster with vLLM simulator for testing deployments
Then open http://localhost:8501 in your browser.
Note: The embedded database (data/planner.db) stores benchmark data. All
db-load-* commands append to existing data. Use make db-reset first for a
clean database. Benchmark data can also be uploaded and managed via the UI's
Configuration tab or the REST API (/api/v1/db/upload-benchmarks).
Stop everything:
make stop # Stop Backend + UI (leaves Ollama and DB running)
make stop-all # Stop all services including Ollama and DB
make cluster-stop # Delete cluster (optional)
Recommendations (main page):
Capacity Planner (sidebar page): Enter a HuggingFace model ID and GPU configuration to see memory breakdown (model weights, KV cache, activation, overhead), maximum context length, and concurrent request capacity.
GPU Recommender (sidebar page): Enter a model ID and workload parameters (input/output token lengths) to get estimated inference performance across GPU types, ranked by cost.
See docs/ARCHITECTURE.md for detailed system design.
/api/v1/model-info,
/api/v1/calculate, /api/v1/estimate)planner plan for capacity planning, planner estimate for GPU
performance estimation| Component | Technology |
|---|---|
| Backend | FastAPI, Pydantic |
| Frontend | Streamlit |
| LLM | Ollama (qwen2.5:7b) |
| Data | Embedded SQLite database |
| Performance Estimation | BentoML llm-optimizer (roofline model) |
| Model Configs | HuggingFace Hub API, transformers |
| YAML Generation | Jinja2 templates |
| Kubernetes | KIND (local), KServe v0.14.0 |
| Deployment | kubectl |
The planner CLI provides direct access to the Capacity Planner and GPU
Recommender without running the web services.
# Capacity planning — memory breakdown for a model
planner plan --model Qwen/Qwen3-32B
# With GPU memory specified — shows allocatable KV cache, max concurrent requests
planner plan --model Qwen/Qwen3-32B --gpu-memory 80 --tp 4
# Auto-calculate maximum context length that fits
planner plan --model Qwen/Qwen3-32B --gpu-memory 80 --max-model-len -1
# GPU performance estimation — estimate TTFT/ITL/throughput across GPUs
planner estimate --model Qwen/Qwen3-32B --input-len 512 --output-len 128
# Estimate with specific GPUs and latency constraints
planner estimate --model Qwen/Qwen3-32B --input-len 512 --output-len 128 \
--gpu-list H100,A100,L40 --max-ttft 100 --max-itl 10
# Human-readable output sorted by cost
planner estimate --model Qwen/Qwen3-32B --input-len 512 --output-len 128 --pretty
Run planner --help, planner plan --help, or planner estimate --help for
all options.
make help # Show all available commands
make start # Start all services (DB + Ollama + Backend + UI)
make stop # Stop Backend + UI (leaves Ollama and DB running)
make stop-all # Stop everything including Ollama and DB
make restart # Restart all services
make logs-backend # Show backend logs
make logs-ui # Show UI logs
# Database
make db-start # Initialize database (creates file and applies schema if needed)
make db-load-blis # Load BLIS benchmark data (appends)
make db-load-estimated # Load estimated performance data (appends)
make db-load-interpolated # Load interpolated benchmark data (appends)
make db-load-guidellm # Load benchmark data created with GuideLLM (not included in repo yet) (appends)
make db-reset # Reset database (remove all data and reinitialize)
make db-shell # Open database shell
make db-query-models # Query available models in database
make db-query-traffic # Query traffic patterns in database
# Kubernetes
make cluster-status # Check Kubernetes cluster status
make clean-deployments # Delete all InferenceServices
# Testing
make test # Run all tests (requires Ollama)
make test-unit # Run unit tests (no external dependencies)
make test-integration # Run integration tests (requires Ollama and database)
make clean # Remove generated files
Planner includes a GPU-free simulator for local development:
/v1/completions and /v1/chat/completionsThe deployment mode defaults to production (real vLLM with GPUs). Switch between production and simulator modes at runtime using the Configuration tab in the UI, or via the REST API:
GET /api/v1/deployment-mode - Check current modePUT /api/v1/deployment-mode - Set mode ({"mode": "simulator"} or {"mode": "production"})See docs/DEVELOPER_GUIDE.md for details.
Some of these enhancements may involve collaboration with other llm-d SIGs.
Contributions are welcome! See CONTRIBUTING.md for guidelines.
See CLAUDE.md for AI assistant guidance when making changes.
Quality data provided by Artificial Analysis and Arena.
This project is licensed under Apache License 2.0. See the LICENSE file for details.
Python
95.5%
Makefile
1.9%
Shell
1.4%
From business requirements to running llm-d deployments — sizing, estimation, and deployment in one workflow.
pip install llm-d-planner
from planner import Planner, DeploymentIntent
p = Planner()
p.load_bundled_benchmarks()
spec = p.generate_specification(DeploymentIntent(
use_case="chatbot_conversational",
user_count=1000,
))
recs = p.generate_recommendations(spec)
See Programmatic API User Guide for complete documentation.
make setup && make start
See Developer Guide for setup instructions.
Deploying LLMs in production means navigating a fragmented landscape of model selection, GPU sizing, performance estimation, and Kubernetes configuration. Platform teams typically piece together separate tools and manual calculations, leading to expensive trial-and-error.
llm-d Planner unifies these concerns into a single platform with three capabilities:
Planner is the main workflow — it makes recommendations based on available benchmarks, and leverages the Capacity Planner and GPU Recommender to fill gaps and expand the search surface beyond what benchmarks alone can cover. The Capacity Planner and GPU Recommender are also useful on their own for deeper analysis in their respective areas, each with its own UI page, CLI command, and API endpoint.
planner CLI or REST API for programmatic access to
all capabilitiesPlanner flow:
Capacity analysis flow:
Performance analysis flow:
Required before running make setup:
brew install python@3.13 (Linux: use your package manager
or pyenv)curl -LsSf https://astral.sh/uv/install.sh | shbrew install ollama (Linux:
ollama.com/download)brew install kubectl (Linux:
kubernetes.io/docs/tasks/tools)brew install kind (Linux:
kind.sigs.k8s.io/docs/user/quick-start)Get up and running in 4 commands:
make setup # Install dependencies, pull Ollama model
make start # Start all services (DB + Ollama + Backend + UI)
make db-load-blis # Load BLIS benchmark data
make cluster-start # Optional: Create local KIND cluster with vLLM simulator for testing deployments
Then open http://localhost:8501 in your browser.
Note: The embedded database (data/planner.db) stores benchmark data. All
db-load-* commands append to existing data. Use make db-reset first for a
clean database. Benchmark data can also be uploaded and managed via the UI's
Configuration tab or the REST API (/api/v1/db/upload-benchmarks).
Stop everything:
make stop # Stop Backend + UI (leaves Ollama and DB running)
make stop-all # Stop all services including Ollama and DB
make cluster-stop # Delete cluster (optional)
Recommendations (main page):
Capacity Planner (sidebar page): Enter a HuggingFace model ID and GPU configuration to see memory breakdown (model weights, KV cache, activation, overhead), maximum context length, and concurrent request capacity.
GPU Recommender (sidebar page): Enter a model ID and workload parameters (input/output token lengths) to get estimated inference performance across GPU types, ranked by cost.
See docs/ARCHITECTURE.md for detailed system design.
/api/v1/model-info,
/api/v1/calculate, /api/v1/estimate)planner plan for capacity planning, planner estimate for GPU
performance estimation| Component | Technology |
|---|---|
| Backend | FastAPI, Pydantic |
| Frontend | Streamlit |
| LLM | Ollama (qwen2.5:7b) |
| Data | Embedded SQLite database |
| Performance Estimation | BentoML llm-optimizer (roofline model) |
| Model Configs | HuggingFace Hub API, transformers |
| YAML Generation | Jinja2 templates |
| Kubernetes | KIND (local), KServe v0.14.0 |
| Deployment | kubectl |
The planner CLI provides direct access to the Capacity Planner and GPU
Recommender without running the web services.
# Capacity planning — memory breakdown for a model
planner plan --model Qwen/Qwen3-32B
# With GPU memory specified — shows allocatable KV cache, max concurrent requests
planner plan --model Qwen/Qwen3-32B --gpu-memory 80 --tp 4
# Auto-calculate maximum context length that fits
planner plan --model Qwen/Qwen3-32B --gpu-memory 80 --max-model-len -1
# GPU performance estimation — estimate TTFT/ITL/throughput across GPUs
planner estimate --model Qwen/Qwen3-32B --input-len 512 --output-len 128
# Estimate with specific GPUs and latency constraints
planner estimate --model Qwen/Qwen3-32B --input-len 512 --output-len 128 \
--gpu-list H100,A100,L40 --max-ttft 100 --max-itl 10
# Human-readable output sorted by cost
planner estimate --model Qwen/Qwen3-32B --input-len 512 --output-len 128 --pretty
Run planner --help, planner plan --help, or planner estimate --help for
all options.
make help # Show all available commands
make start # Start all services (DB + Ollama + Backend + UI)
make stop # Stop Backend + UI (leaves Ollama and DB running)
make stop-all # Stop everything including Ollama and DB
make restart # Restart all services
make logs-backend # Show backend logs
make logs-ui # Show UI logs
# Database
make db-start # Initialize database (creates file and applies schema if needed)
make db-load-blis # Load BLIS benchmark data (appends)
make db-load-estimated # Load estimated performance data (appends)
make db-load-interpolated # Load interpolated benchmark data (appends)
make db-load-guidellm # Load benchmark data created with GuideLLM (not included in repo yet) (appends)
make db-reset # Reset database (remove all data and reinitialize)
make db-shell # Open database shell
make db-query-models # Query available models in database
make db-query-traffic # Query traffic patterns in database
# Kubernetes
make cluster-status # Check Kubernetes cluster status
make clean-deployments # Delete all InferenceServices
# Testing
make test # Run all tests (requires Ollama)
make test-unit # Run unit tests (no external dependencies)
make test-integration # Run integration tests (requires Ollama and database)
make clean # Remove generated files
Planner includes a GPU-free simulator for local development:
/v1/completions and /v1/chat/completionsThe deployment mode defaults to production (real vLLM with GPUs). Switch between production and simulator modes at runtime using the Configuration tab in the UI, or via the REST API:
GET /api/v1/deployment-mode - Check current modePUT /api/v1/deployment-mode - Set mode ({"mode": "simulator"} or {"mode": "production"})See docs/DEVELOPER_GUIDE.md for details.
Some of these enhancements may involve collaboration with other llm-d SIGs.
Contributions are welcome! See CONTRIBUTING.md for guidelines.
See CLAUDE.md for AI assistant guidance when making changes.
Quality data provided by Artificial Analysis and Arena.
This project is licensed under Apache License 2.0. See the LICENSE file for details.
Python
95.5%
Makefile
1.9%
Shell
1.4%