InferScale-Sim / README.md
ArchitSharma's picture
Commiting v0.3
44745f2
|
Raw
History Blame Contribute Delete
11.8 kB
---
title: InferScale-Sim
emoji: 📈
colorFrom: indigo
colorTo: blue
sdk: static
app_file: index.html
pinned: false
license: mit
short_description: Interactive LLM serving simulator and SLO planner
---
# InferScale-Sim v0.3.0
**Interactive LLM serving simulator and SLO-aware design laboratory - written in Python and executed entirely in the browser.**
InferScale-Sim explores a systems question:
> How do workload shape, batching, scheduling, KV-cache pressure, reusable prefixes, and prefill/decode disaggregation change tail latency and sustainable LLM-serving capacity?
The public Hugging Face Space uses **no server CPU, no GPU, no API key, and no paid inference provider**. Hugging Face serves static files; Pyodide executes the same Python package used by the local test suite inside a Web Worker on the visitor's ordinary CPU.
> [!IMPORTANT]
> v0.3 ships with **analytical reference latency profiles**, not measured GPU calibration data. It is designed for systems behavior, what-if studies, and comparative exploration. Absolute milliseconds must not be presented as empirical L4/A10G/A100 benchmark results.
## Why simulation?
Exhaustively testing serving configurations on real GPU clusters is expensive. **Vidur** reported finding a LLaMA2-70B deployment configuration in roughly one CPU-hour while estimating that deployment-based exploration would require about **42,000 GPU-hours (~$218K)**. Its evaluated latency predictions were within 9% error.
That research direction has continued. **Revati (2026)** explores GPU-free time-warp emulation of real serving control paths; **LLMServingSim 2.0 (2026)** models heterogeneous and disaggregated serving; **Frontier (May 2026)** models P/D disaggregation, communication, runtime optimizations, stateful workloads, and SLA-dependent Pareto exploration; and **HeteroPanacea (Aug 2026)** studies heterogeneous specialization across prefill/decode/attention/FFN serving stages.
InferScale-Sim is deliberately smaller: a dependency-light, inspectable Python implementation intended to make the core serving trade-offs interactive and understandable.
## v0.3 capabilities
### Workload and serving loop
- deterministic constant, Poisson, and bursty arrival processes
- log-normal prompt/output-length distributions
- static batching baseline
- continuous batching with FCFS
- shortest-job-first scheduling
- least-slack/SLO-aware scheduling
- chunked prefill
- paged KV-cache accounting and VRAM admission control
- analytical roofline-style prefill/decode latency proxy
- FP16 / INT8 / INT4 weight-footprint scenarios
### Metrics and SLOs
- TTFT, TPOT, E2E and queue-latency percentiles
- request and output-token throughput
- **goodput**: completed requests that satisfy both configured SLOs per simulated second
- component TTFT/E2E SLO attainment
- virtual resource utilization
- peak KV usage
- heuristic bottleneck diagnosis with explicit simulator provenance
### Prefix reuse - new in v0.3
v0.3 adds a controlled shared-prefix scenario:
- configurable shared-prefix length
- configurable request reuse fraction
- deterministic cache-hit assignment independent of the generated workload trace
- cached prefill tokens skipped on a hit
- one persistent shared KV allocation instead of per-request duplication
- cache-hit rate and saved-prefill-token telemetry
This is intentionally **not** a complete RadixAttention implementation. It isolates the compute/memory effect of exact reusable prefixes while keeping the simulator small enough to inspect.
### Prefill/decode disaggregation - new in v0.3
The simulator now supports a separate P/D topology with:
- independent prefill/decode accelerator profiles
- configurable prefill and decode worker counts
- independent role utilization
- continuous decode admission between iterations
- explicit KV transfer after prefill
- serialized analytical interconnect model
- configurable interconnect GB/s and base transfer latency
- p95 KV-transfer latency, total transfer volume, and link utilization
- P/D-specific bottleneck diagnoses such as prefill-pool, decode-pool, and transfer pressure
### Interactive tools
**Serving Lab** - run one colocated or P/D scenario and inspect live metrics, timelines, cache behavior, and diagnostics.
**Scheduler Arena** - run every colocated scheduler against the identical deterministic workload.
**Capacity Planner** - robust binary search for the highest request rate where **every repetition** satisfies the target and drains. The trace exposes mean SLO attainment, worst repetition, target, and min/max range.
**Modern Serving Lab** - compare four controlled variants on one workload:
1. colocated
2. colocated + prefix reuse
3. P/D disaggregated
4. P/D disaggregated + prefix reuse
**Design Explorer** - runs a bounded live sweep over scheduler, batch size, prefix caching, and P/D worker splits, then reports two non-dominated frontiers: **raw goodput vs p95 TTFT** and **goodput per accelerator vs p95 TTFT**. The second view makes the resource cost of multi-worker P/D layouts explicit.
All charts can be expanded and exported as meaningfully named PNG files. Result tables support clipboard copy and CSV export.
## Architecture
```text
Hugging Face Static Space
|
| serves files only
v
+----------------------------------------------------------------+
| Browser |
| |
| UI / Chart.js Pyodide Web Worker |
| | | |
| +------------------------------->| |
| v |
| Python inferscale package |
| | |
| +--------------------------------+-------------------+ |
| | | | | |
| workload schedulers KV cache profiles |
| | | | | |
| +--------------------+-----------------+-------------+ |
| | |
| +--------------------+------------------+ |
| | | |
| colocated simulator P/D simulator |
| | |
| prefill -> transfer -> decode|
| | | |
| +--------------------+------------------+ |
| v |
| metrics / SLO / search |
+----------------------------------------------------------------+
```
The discrete-event engine never sleeps for simulated compute time. A predicted 40 ms decode step advances virtual time by 0.040 seconds immediately.
## Run locally
The Python simulator has **zero runtime dependencies** beyond Python 3.10+.
```bash
python -m venv .venv
source .venv/bin/activate
pip install -e '.[dev]'
pytest -q
ruff check src tests scripts
python scripts/release_check.py
```
Run one simulation:
```bash
python scripts/run_simulation.py
```
Serve the browser app:
```bash
python -m http.server 8000
```
Open `http://localhost:8000`. The first page load downloads Pyodide and Chart.js from the CDN; simulation runs then execute locally in the worker.
## Deploy to Hugging Face
Create or reuse a **Static Space** and push this repository. Root metadata already contains:
```yaml
sdk: static
app_file: index.html
```
No Hugging Face secret is required.
Before deployment:
```bash
python scripts/sync_web_python.py
pytest -q
python scripts/release_check.py
```
`sync_web_python.py` mirrors the canonical `src/inferscale/` package into `py/inferscale/`, which the Pyodide worker imports. CI fails if the mirror is stale.
## Core modeling choices
### Goodput
```text
goodput = requests satisfying TTFT and E2E SLOs / simulated makespan
```
Raw throughput can reward overload. Goodput penalizes requests that finish too late to be useful.
### KV-cache model
Per-token KV bytes are approximated as:
```text
2 x layers x KV heads x head dimension x 2 bytes
```
for K and V with FP16 KV state. Paged allocation rounds live per-request state to configurable token blocks.
With prefix reuse enabled, the shared prefix is represented once as persistent KV state and request allocations contain only the uncached suffix plus generated tokens.
### P/D transfer model
After prefill, newly computed prompt KV is moved to the decode pool through a serialized reference link:
```text
transfer_time = base_latency + KV_bytes / interconnect_bandwidth
```
The link is intentionally simple and explicit. It does not claim to reproduce NCCL, NIXL, RDMA, PCIe, or NVLink behavior.
### Latency-profile honesty
`AnalyticalLatencyModel` estimates operation duration from model architecture, accelerator peak FP16 compute, memory bandwidth, quantization footprint, context length, and conservative efficiency factors. It is an analytical proxy.
A future empirical interpolator can replace that backend without rewriting workload generation, scheduling, KV logic, P/D orchestration, or metrics.
## Research lineage
- **Vidur: A Large-Scale Simulation Framework for LLM Inference** (MLSys 2024) - profiling + simulation + deployment search. https://arxiv.org/abs/2405.05465
- **SGLang: Efficient Execution of Structured Language Model Programs** (NeurIPS 2024) - RadixAttention motivates exact shared-prefix reuse. https://arxiv.org/abs/2312.07104
- **TokenSim** (2025) - extensible scheduling and memory-management simulation. https://arxiv.org/abs/2503.08415
- **Revati: Transparent GPU-Free Time-Warp Emulation for LLM Serving** (2026) - real control logic with virtualized GPU time. https://arxiv.org/abs/2601.00397
- **LLMServingSim 2.0** (2026) - heterogeneous/disaggregated infrastructure and runtime interactions. https://arxiv.org/abs/2602.23036
- **Frontier: Towards Comprehensive and Accurate LLM Inference Simulation** (2026) - P/D and Attention-FFN disaggregation, runtime optimizations, stateful workloads, and Pareto exploration. https://arxiv.org/abs/2605.21312
- **When Does Disaggregation Pay? / HeteroPanacea** (Aug 2026) - heterogeneous P/D/attention/FFN specialization and cross-stack design exploration. https://arxiv.org/abs/2608.03741
See `docs/research.md`, `docs/methodology.md`, and `docs/validation.md` for scope and limitations.
## Repository
```text
.
|-- src/inferscale/ canonical Python simulator
|-- py/inferscale/ generated browser mirror
|-- tests/ deterministic unit tests
|-- scripts/ local runner + release tooling
|-- docs/ architecture / methodology / research notes
|-- index.html HF Static Space entry point
|-- app.js UI + charts + export tooling
|-- worker.mjs Pyodide Web Worker bridge
`-- styles.css
```
## Roadmap
v0.3 deliberately stops short of pretending to be a production-runtime emulator. Strong next steps would be:
- empirical latency-profile import and held-out calibration report
- multi-turn / agentic session traces
- speculative decoding
- multi-replica routing and tenant fairness
- richer prefix-tree eviction/scheduling
- attention/FFN disaggregation
## License
MIT.