Embedding Cache Benchmark

Throughput and TTFT gains from caching vision-encoder embeddings on a multimodal workload

View as Markdown

Overview

This page reports the performance impact of Dynamo’s multimodal frontend-decoding and embedding cache on a repeated-image workload, measured against a vanilla vllm serve baseline.

For the feature itself — what the embedding cache is, support across backends (vLLM / TRT-LLM / SGLang), aggregated vs disaggregated workflows, and how to enable it — see Embedding Cache.

Recipe

The numbers below come from the qwen3.6-35b recipe, which runs three configurations on the same single-GPU node so the only thing that varies is the Dynamo feature set:

ConfigStackFrontend-decodingEmbedding cache
vllm-servevanilla vLLMn/an/a
dynamo-fdDynamo + vLLMonoff
dynamo-fd-ecDynamo + vLLMon8 GiB

Workload: Qwen/Qwen3.6-35B-A3B-FP8, sliding-window dataset (30 users × 8 turns, window = 5, 2400×1080 base64 images, 8000 input text tokens, max_tokens=1024, concurrency = 30). Each turn shares 4-of-5 images with the previous turn of the same user, so repeated images dominate — the exact shape the embedding cache is designed for.

See the recipe README for the full deploy, dataset generation, and aiperf invocation.

Results — H100

ConfigRPSITL (ms)TTFT avg (ms)TTFT p50TTFT p90TTFT p99
vllm-serve0.71921.2818173.0718829.9926991.8248589.22
dynamo-fd0.81128.427193.373567.1310991.2634900.51
dynamo-fd-ec0.93324.566100.922369.0122868.7734582.94

Δ vs vllm-serve:

ConfigRPSITLTTFT avgTTFT p50TTFT p90TTFT p99
dynamo-fd+12.8%+33.5%−60.4%−81.1%−59.3%−28.2%
dynamo-fd-ec+29.8%+15.4%−66.4%−87.4%−15.3%−28.8%

Results — GB200

ConfigRPSITL (ms)TTFT avg (ms)TTFT p50TTFT p90TTFT p99
vllm-serve0.94015.3714953.9715391.4921660.2524221.30
dynamo-fd1.11716.829478.469060.6215399.0917325.61
dynamo-fd-ec1.23615.228478.298323.5313992.2516075.06

Δ vs vllm-serve:

ConfigRPSITLTTFT avgTTFT p50TTFT p90TTFT p99
dynamo-fd+18.8%+9.4%−36.6%−41.1%−28.9%−28.5%
dynamo-fd-ec+31.5%−1.0%−43.3%−45.9%−35.4%−33.6%

Takeaways

  • Throughput: dynamo-fd-ec delivers ~30% higher RPS than vanilla vllm serve on both H100 (+29.8%) and GB200 (+31.5%).
  • TTFT: The embedding cache cuts median TTFT by −87.4% on H100 and −45.9% on GB200 — once the encoder is off the critical path for repeated images, first-token latency collapses.
  • Frontend-decoding alone (dynamo-fd) already captures most of the TTFT win; the embedding cache then layers on additional throughput and tighter median TTFT.
  • ITL stays roughly flat because the cache shortens the prefill path (skipping ViT for repeated images), not the decode path. Throughput still rises because, by Little’s Law at fixed concurrency = 30, RPS ≈ concurrency / (TTFT + ITL × out_tokens) — a multi-second drop in TTFT alone is enough to explain the ~30% RPS gain. The small per-token ITL deltas reflect concurrency changes from the higher RPS, not extra decode cost.

Reproduce

$cd recipes/qwen3.6-35b
$HW=h100 # or gb200
$./run-all-benchmarks.sh -n <namespace> --hw "${HW}"

Each config’s profile_export_aiperf.json lands under ~/workspace/dynamo-tmp/logs/$(date +%m-%d)/qwen36-fp8-${HW}/{vllm-serve,dynamo-fd,dynamo-fd-ec}/ and holds the headline metrics.

Full instructions and prerequisites live in recipes/qwen3.6-35b/README.md.