Unverified Commit 07db5895 authored by dagil-nvidia's avatar dagil-nvidia Committed by GitHub
Browse files

docs: clean up toctree navigation and add disaggregated serving guide (#6024)


Signed-off-by: default avatarDan Gil <dagil@nvidia.com>
Co-authored-by: default avatarCursor <cursoragent@cursor.com>
parent 219e5c45
Fault Tolerance
===============
.. toctree::
:maxdepth: 1
Overview <../fault_tolerance/README.md>
Request Migration <../fault_tolerance/request_migration.md>
Request Cancellation <../fault_tolerance/request_cancellation.md>
Graceful Shutdown <../fault_tolerance/graceful_shutdown.md>
Request Rejection <../fault_tolerance/request_rejection.md>
Testing <../fault_tolerance/testing.md>
Deployment Guide
================
.. toctree::
:hidden:
Kubernetes Quickstart <../kubernetes/README>
Detailed Installation Guide <../kubernetes/installation_guide>
Dynamo Operator <../kubernetes/dynamo_operator>
Service Discovery <../kubernetes/service_discovery>
Webhooks <../kubernetes/webhooks>
Minikube Setup <../kubernetes/deployment/minikube>
Managing Models with DynamoModel <../kubernetes/deployment/dynamomodel-guide>
Autoscaling <../kubernetes/autoscaling>
Checkpointing <../kubernetes/chrek/README>
Multinode
=========
.. toctree::
:hidden:
Multinode Deployments <../kubernetes/deployment/multinode-deployment>
Grove <../kubernetes/grove>
Observability
=============
.. toctree::
:hidden:
Metrics <../kubernetes/observability/metrics>
Logging <../kubernetes/observability/logging>
Operator Metrics <../kubernetes/observability/operator-metrics>
Observability
=============
.. toctree::
:hidden:
Overview <../observability/README>
Prometheus + Grafana Setup <../observability/prometheus-grafana>
Metrics <../observability/metrics>
Metrics Developer Guide <../observability/metrics-developer-guide>
Health Checks <../observability/health-checks>
Tracing <../observability/tracing>
Logging <../observability/logging>
......@@ -79,3 +79,9 @@ See the [Frontend Guide](frontend_guide.md) for full configuration options.
|----------|-------------|
| [Frontend Guide](frontend_guide.md) | KServe gRPC configuration and integration |
| [Router Documentation](../router/README.md) | KV-aware routing configuration |
```{toctree}
:hidden:
frontend_guide
```
......@@ -74,3 +74,9 @@ KVBM has three primary logical layers:
- **[FlexKV Integration](../../integrations/flexkv_integration.md)** — Use FlexKV for KV cache management
- **[SGLang HiCache](../../integrations/sglang_hicache.md)** — Enable SGLang's hierarchical cache with NIXL
- **[NIXL Documentation](https://github.com/ai-dynamo/nixl/blob/main/docs/nixl.md)** — NIXL communication library details
```{toctree}
:hidden:
kvbm_guide
```
......@@ -134,3 +134,10 @@ The planner queries the frontend's `/metrics` endpoint via Prometheus. Required
- Request count and duration
- TTFT and ITL distributions
- Input/output sequence lengths
```{toctree}
:hidden:
planner_guide
planner_examples
```
......@@ -101,3 +101,10 @@ For basic model registration without KV routing, use `--router-mode round-robin`
- **[Router Guide](router_guide.md)**: Deep dive into KV cache routing, configuration, disaggregated serving, and tuning
- **[Router Examples](router_examples.md)**: Python API usage, K8s examples, and custom routing patterns
- **[Router Design](../../design_docs/router_design.md)**: Architecture details, algorithms, and event transport modes
```{toctree}
:hidden:
router_guide
router_examples
```
direction: right
aggregated: Aggregated {
width: 600
height: 450
frontend: Frontend {
width: 180
height: 60
style.font-size: 20
}
router: Router {
width: 180
height: 60
style.font-size: 20
}
w1: "W1 (TP2)" {
width: 180
height: 60
style.font-size: 20
}
w2: "W2 (TP2)" {
width: 180
height: 60
style.font-size: 20
}
w3: "W3 (TP2)" {
width: 180
height: 60
style.font-size: 20
}
w4: "W4 (TP2)" {
width: 180
height: 60
style.font-size: 20
}
frontend -> router
router -> w1
router -> w2
router -> w3
router -> w4
note: |md
Each worker handles both prefill and decode.
|
note.style.font-size: 18
}
disaggregated: Disaggregated {
width: 600
height: 450
frontend: Frontend {
width: 180
height: 60
style.font-size: 20
}
router: Router {
width: 180
height: 60
style.font-size: 20
}
p1: "Prefill 1 (TP2)" {
width: 220
height: 60
style.font-size: 20
}
p2: "Prefill 2 (TP2)" {
width: 220
height: 60
style.font-size: 20
}
decode: "Decode (TP4)" {
width: 220
height: 60
style.font-size: 20
}
frontend -> router
router -> p1
router -> p2
p1 -> decode: "KV Cache via RDMA"
p2 -> decode: "KV Cache via RDMA"
note: |md
Prefill and decode on separate workers.
|
note.style.font-size: 18
}
aggregated.style.font-size: 24
disaggregated.style.font-size: 24
direction: down
q1: "AIC shows disagg > agg\nthroughput?" {
shape: diamond
}
q2: "RDMA available\nin cluster?" {
shape: diamond
}
q3: "ISL/OSL ratio > 8:1?" {
shape: diamond
}
q4: "Disagg > 20%\nfaster?" {
shape: diamond
}
agg: "AGGREGATED\nSimpler, no RDMA needed" {
shape: rectangle
width: 380
height: 80
}
disagg: "DISAGGREGATED\nHigher throughput, needs RDMA" {
shape: rectangle
width: 380
height: 80
}
q1 -> q2: Yes
q1 -> agg: No
q2 -> q3: Yes
q2 -> agg: No
q3 -> disagg: Yes
q3 -> q4: No
q4 -> disagg: Yes
q4 -> agg: No
direction: right
install: {
label: "Install"
shape: rectangle
install_detail: |md
pip3 install
aiconfigurator
|
}
configure: {
label: "Configure"
shape: rectangle
configure_detail: |md
Model, GPUs,
SLA targets
|
}
compare: {
label: "Compare"
shape: rectangle
compare_detail: |md
Agg vs disagg
rankings
|
}
deploy: {
label: "Deploy"
shape: rectangle
deploy_detail: |md
Apply DGD
manifest
|
}
validate: {
label: "Validate"
shape: rectangle
validate_detail: |md
Benchmark
with AIPerf
|
}
install -> configure
configure -> compare
compare -> deploy
deploy -> validate
direction: right
aic: "AIC Output" {
shape: rectangle
c1: "concurrency: 56 (=14x4)" {
width: 280
}
c2: "ISL: 4000, OSL: 500" {
width: 280
}
c3: "Model: Qwen3-32B-FP8" {
width: 280
}
c4: "concurrency x ~14" {
width: 280
}
c5: "(best practice)" {
width: 280
}
}
aiperf: "AIPerf Argument" {
shape: rectangle
a1: "--concurrency 56" {
width: 320
}
a2: "--isl 4000 --osl 500" {
width: 320
}
a3: "-m Qwen/Qwen3-32B-FP8" {
width: 320
}
a4: "--num-requests 800" {
width: 320
}
a5: "--extra-inputs \"ignore_eos:true\"" {
width: 320
}
}
aic.c1 -> aiperf.a1
aic.c2 -> aiperf.a2
aic.c3 -> aiperf.a3
aic.c4 -> aiperf.a4
aic.c5 -> aiperf.a5
......@@ -140,3 +140,13 @@ See [Fault Tolerance Testing](testing.md) for details.
- [Observability](../observability/README.md) - Metrics and monitoring
- [Distributed Runtime](../design_docs/distributed_runtime.md) - Service discovery architecture
- [Event Plane](../design_docs/event_plane.md) - etcd and NATS coordination
```{toctree}
:hidden:
Request Migration <request_migration>
Request Cancellation <request_cancellation>
Graceful Shutdown <graceful_shutdown>
Request Rejection <request_rejection>
Testing <testing>
```
<!--
SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0
-->
# Disaggregated Serving Guide
[AIConfigurator](https://github.com/ai-dynamo/aiconfigurator/tree/main) is a performance optimization tool that helps you find the optimal configuration for deploying LLMs with Dynamo. It automatically determines the best number of prefill and decode workers, parallelism settings, and deployment parameters to meet your SLA targets while maximizing throughput.
## Why Use AIConfigurator?
When deploying LLMs with Dynamo, you need to make several critical decisions:
- **Aggregated vs Disaggregated**: Which architecture gives better performance for your workload?
- **Worker Configuration**: How many prefill and decode workers to deploy?
- **Parallelism Settings**: What tensor/pipeline parallel configuration to use?
- **SLA Compliance**: How to meet your TTFT and TPOT targets?
AIConfigurator answers these questions in seconds, providing:
- Recommended configurations that meet your SLA requirements
- Ready-to-deploy Dynamo configuration files (including Kubernetes manifests)
- Performance comparisons between different deployment strategies
- Up to 1.7x better throughput compared to manual configuration
### End-to-End Workflow
![AIConfigurator end-to-end workflow](../../images/e2e_workflow.svg)
### Aggregated vs Disaggregated Architecture
AIConfigurator evaluates two deployment architectures and recommends the best one for your workload:
![Aggregated vs Disaggregated architecture comparison](../../images/arch_comparison.svg)
### When to Use Each Architecture
![Decision flowchart for choosing aggregated vs disaggregated](../../images/decision_flowchart.svg)
## Quick Start
```bash
# Install
pip3 install aiconfigurator
# Find optimal configuration for vLLM backend
aiconfigurator cli default \
--model_path Qwen/Qwen3-32B-FP8 \
--total_gpus 8 \
--system h200_sxm \
--backend vllm \
--backend_version 0.12.0 \
--isl 4000 \
--osl 500 \
--ttft 600 \
--tpot 16.67 \
--save_dir ./results_vllm
# Deploy on Kubernetes
kubectl apply -f ./results_vllm/agg/top1/agg/k8s_deploy.yaml
```
## Complete Walkthrough: vLLM on H200
This section walks through a validated example deploying Qwen3-32B-FP8 on 8× H200 GPUs using vLLM.
### Step 1: Run AIConfigurator
```bash
aiconfigurator cli default \
--model_path Qwen/Qwen3-32B-FP8 \
--system h200_sxm \
--total_gpus 8 \
--isl 4000 \
--osl 500 \
--ttft 600 \
--tpot 16.67 \
--backend vllm \
--backend_version 0.12.0 \
--save_dir ./results_vllm
```
**Parameters explained:**
- `--model_path`: HuggingFace model ID or local path (e.g., `Qwen/Qwen3-32B-FP8`)
- `--system`: GPU system type (`h200_sxm`, `h100_sxm`, `a100_sxm`)
- `--total_gpus`: Number of GPUs available for deployment
- `--isl` / `--osl`: Input/Output sequence lengths in tokens
- `--ttft` / `--tpot`: SLA targets - Time To First Token (ms) and Time Per Output Token (ms)
- `--backend`: Inference backend (`vllm`, `trtllm`, or `sglang`)
- `--backend_version`: Backend version (e.g., `0.12.0` for vLLM)
- `--save_dir`: Directory to save generated deployment configs
### Step 2: Review the Results
AIConfigurator outputs a comparison of aggregated vs disaggregated deployment strategies:
```text
********************************************************************************
* Dynamo aiconfigurator Final Results *
********************************************************************************
----------------------------------------------------------------------------
Input Configuration & SLA Target:
Model: Qwen/Qwen3-32B-FP8 (is_moe: False)
Total GPUs: 8
Best Experiment Chosen: disagg at 521.77 tokens/s/gpu
----------------------------------------------------------------------------
Overall Best Configuration:
- Best Throughput: 4,174.16 tokens/s
- Per-GPU Throughput: 521.77 tokens/s/gpu
- Per-User Throughput: 76.96 tokens/s/user
- TTFT: 388.11ms
- TPOT: 12.99ms
----------------------------------------------------------------------------
```
AIC evaluates both aggregated and disaggregated architectures and outputs ranked configurations for each:
```text
agg Top Configurations: (Sorted by tokens/s/gpu)
+------+--------------+---------------+--------+-----------------+-------------+-------------------+----------+----------+----+
| Rank | tokens/s/gpu | tokens/s/user | TTFT | request_latency | concurrency | total_gpus (used) | replicas | parallel | bs |
+------+--------------+---------------+--------+-----------------+-------------+-------------------+----------+----------+----+
| 1 | 397.31 | 60.66 | 509.14 | 8734.68 | 56 (=14x4) | 8 (8=4x2) | 4 | tp2pp1 | 14 |
| 2 | 349.90 | 60.98 | 412.58 | 8596.28 | 48 (=24x2) | 8 (8=2x4) | 2 | tp4pp1 | 24 |
| 3 | 235.62 | 62.71 | 482.57 | 8439.41 | 32 (=32x1) | 8 (8=1x8) | 1 | tp8pp1 | 32 |
+------+--------------+---------------+--------+-----------------+-------------+-------------------+----------+----------+----+
disagg Top Configurations: (Sorted by tokens/s/gpu)
+------+--------------+---------------+--------+-----------------+-------------+-------------------+----------+-------------+----------+
| Rank | tokens/s/gpu | tokens/s/user | TTFT | request_latency | concurrency | total_gpus (used) | replicas | (p)parallel | (d)parallel |
+------+--------------+---------------+--------+-----------------+-------------+-------------------+----------+-------------+----------+
| 1 | 521.77 | 76.96 | 388.11 | 6871.61 | 60 (=60x1) | 8 (8=1x8) | 1 | tp2pp1 | tp4pp1 |
| 2 | 521.77 | 63.29 | 388.11 | 8272.31 | 80 (=40x2) | 8 (8=2x4) | 2 | tp2pp1 | tp2pp1 |
| 3 | 260.89 | 62.81 | 388.11 | 8332.18 | 42 (=42x1) | 8 (8=1x8) | 1 | tp2pp1 | tp1pp1 |
+------+--------------+---------------+--------+-----------------+-------------+-------------------+----------+-------------+----------+
```
**Reading the output:**
- **tokens/s/gpu**: Overall throughput efficiency — higher is better
- **tokens/s/user**: Per-request generation speed (inverse of TPOT)
- **TTFT**: Predicted time to first token
- **concurrency**: Total concurrent requests across all replicas (e.g., `56 (=14x4)` means batch size 14 × 4 replicas)
- **agg Rank 1** recommends TP2 with 4 replicas — simpler to deploy
- **disagg Rank 1** recommends 2 prefill workers (TP2) + 1 decode worker (TP4) — higher throughput but requires RDMA
### Step 3: Deploy on Kubernetes
The `--save_dir` generates ready-to-use Kubernetes manifests:
```
results_vllm/
├── agg/
│ └── top1/
│ └── agg/
│ ├── k8s_deploy.yaml # Kubernetes DynamoGraphDeployment
│ └── agg_config.yaml # Engine configuration
├── disagg/
│ └── top1/
│ └── disagg/
│ ├── k8s_deploy.yaml
│ ├── prefill_config.yaml
│ └── decode_config.yaml
└── pareto_frontier.png
```
#### Prerequisites
Before deploying, ensure you have:
1. **HuggingFace Token Secret** (for gated models):
```bash
kubectl create secret generic hf-token-secret \
-n your-namespace \
--from-literal=HF_TOKEN="your-huggingface-token"
```
2. **Model Cache PVC** (recommended for faster restarts):
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: model-cache
namespace: your-namespace
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
```
#### Deploy the Configuration
The generated `k8s_deploy.yaml` provides a starting point. You'll typically need to customize it for your environment:
```bash
kubectl apply -f ./results_vllm/agg/top1/agg/k8s_deploy.yaml
```
**Complete deployment example** with model cache and production settings:
```yaml
apiVersion: nvidia.com/v1alpha1
kind: DynamoGraphDeployment
metadata:
name: dynamo-agg
namespace: your-namespace
spec:
backendFramework: vllm
pvcs:
- name: model-cache
create: false # Use existing PVC
services:
Frontend:
componentType: frontend
replicas: 1
volumeMounts:
- name: model-cache
mountPoint: /opt/models
envs:
- name: HF_HOME
value: /opt/models
extraPodSpec:
mainContainer:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:0.8.0
imagePullPolicy: IfNotPresent
VLLMWorker:
envFromSecret: hf-token-secret
componentType: worker
replicas: 4
resources:
limits:
gpu: "2"
sharedMemory:
size: 16Gi # Required for vLLM
volumeMounts:
- name: model-cache
mountPoint: /opt/models
envs:
- name: HF_HOME
value: /opt/models
extraPodSpec:
mainContainer:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:0.8.0
workingDir: /workspace
imagePullPolicy: IfNotPresent
command:
- python3
- -m
- dynamo.vllm
args:
- --model
- "Qwen/Qwen3-32B-FP8"
- "--no-enable-prefix-caching"
- "--tensor-parallel-size"
- "2"
- "--pipeline-parallel-size"
- "1"
- "--data-parallel-size"
- "1"
- "--kv-cache-dtype"
- "fp8"
- "--max-model-len"
- "6000"
- "--max-num-seqs"
- "1024"
```
**Key deployment settings:**
| Setting | Purpose | Notes |
|---------|---------|-------|
| `backendFramework: vllm` | Tells Dynamo which runtime to use | Required at spec level |
| `pvcs` + `volumeMounts` | Caches model weights across restarts | Mount at `/opt/models` (not `/root/`) |
| `HF_HOME` env var | Points HuggingFace to cache location | Must match `mountPoint` |
| `sharedMemory.size: 16Gi` | IPC memory for vLLM | 16Gi for vLLM, 80Gi for TRT-LLM |
| `envFromSecret` | Injects HF_TOKEN | Required for gated models |
### Step 4: Validate with AIPerf
After deployment, validate the predictions against actual performance using [AIPerf](https://github.com/ai-dynamo/aiperf).
> **Tip**: Run AIPerf **inside the cluster** to avoid network latency affecting measurements. Use a Kubernetes Job:
#### Deriving AIPerf Parameters from AIC Output
To use AIPerf to benchmark an AIC-recommended configuration, you'll need to translate AIC parameters into AIPerf profiling arguments (we are working to automate this):
![AIC-to-AIPerf parameter mapping](../../images/param_mapping.svg)
| AIC Output | AIPerf Parameter | Notes |
|------------|-----------------|-------|
| `concurrency: 56 (=14x4)` | `--concurrency 56` | Use total concurrency when benchmarking via the frontend |
| ISL/OSL targets | `--isl 4000 --osl 500` | Match your AIC inputs |
| - | `--num-requests 800` | Use `concurrency × 40` minimum for statistical stability |
| - | `--extra-inputs "ignore_eos:true"` | Ensures exact OSL tokens generated |
> **Note on concurrency**: AIC reports concurrency as `total (=bs × replicas)`. When benchmarking through the frontend (which routes to all replicas), use the total value. If benchmarking a single replica directly, use the per-replica `bs` value instead.
```yaml
apiVersion: batch/v1
kind: Job
metadata:
name: aiperf-benchmark
namespace: your-namespace
spec:
template:
spec:
restartPolicy: Never
containers:
- name: aiperf
image: python:3.10
command:
- /bin/bash
- -c
- |
pip install aiperf
aiperf profile \
-m Qwen/Qwen3-32B-FP8 \
--endpoint-type chat \
-u http://dynamo-agg-frontend:8000 \
--isl 4000 --isl-stddev 0 \
--osl 500 --osl-stddev 0 \
--num-requests 800 \
--concurrency 56 \
--streaming \
--extra-inputs "ignore_eos:true" \
--num-warmup-requests 40 \
--ui-type simple
```
```bash
kubectl apply -f aiperf-job.yaml
kubectl logs -f -l job-name=aiperf-benchmark
```
**Validated results** (Qwen3-32B-FP8, 8× H200, TP2×4 replicas, aggregated):
| Metric | AIC Prediction | Actual (avg) | Status |
|--------|---------------|--------------|--------|
| TTFT (ms) | 509 | 209 | Better than target |
| ITL/TPOT (ms) | 16.49 | 15.06 | Within 10% |
| Throughput (req/s) | ~6.3 | 6.9 | Within 10% |
| Total Output TPS | ~3,178 | 3,462 | Within 10% |
> **Note**: Actual throughput typically reaches ~85-90% of AIC predictions, with ITL/TPOT being the most accurate metric. Expect some variance between benchmark runs; running multiple times is recommended. Enable prefix caching (`--enable-prefix-caching`) for additional TTFT improvements with repeated prompts.
## Fine-Tuning Your Deployment
AIConfigurator provides a strong starting point. Here's how to iterate for production:
### Adjusting for Actual Workload
If your real workload differs from the benchmark parameters:
```bash
# For longer outputs (chat/code generation):
# increase OSL, relax TTFT target
aiconfigurator cli default \
--model_path Qwen/Qwen3-32B-FP8 \
--total_gpus 8 \
--system h200_sxm \
--backend vllm \
--backend_version 0.12.0 \
--isl 2000 \
--osl 2000 \
--ttft 1000 \
--tpot 10 \
--save_dir ./results_long_output
```
### Exploring Alternative Configurations
Use `exp` mode to compare custom configurations:
```yaml
# custom_exp.yaml
exps:
- exp_tp2
- exp_tp4
exp_tp2:
mode: "patch"
serving_mode: "agg"
model_path: "Qwen/Qwen3-32B-FP8"
total_gpus: 8
system_name: "h200_sxm"
backend_name: "vllm"
backend_version: "0.12.0"
isl: 4000
osl: 500
ttft: 600
tpot: 16.67
config:
agg_worker_config:
tp_list: [2]
exp_tp4:
mode: "patch"
serving_mode: "agg"
model_path: "Qwen/Qwen3-32B-FP8"
total_gpus: 8
system_name: "h200_sxm"
backend_name: "vllm"
backend_version: "0.12.0"
isl: 4000
osl: 500
ttft: 600
tpot: 16.67
config:
agg_worker_config:
tp_list: [4]
```
```bash
aiconfigurator cli exp --yaml_path custom_exp.yaml --save_dir ./results_custom
```
> **Critical**: Disaggregated deployments **require RDMA** for KV cache transfer. Without RDMA, performance degrades by **40x** (TTFT increases from 355ms to 10+ seconds). See the Disaggregated Deployment section below.
### Deploying Disaggregated (RDMA Required)
Disaggregated deployments transfer KV cache between prefill and decode workers. **Without RDMA, this transfer becomes a severe bottleneck**, causing 40x performance degradation.
#### Prerequisites for Disaggregated
1. **RDMA-capable network** (InfiniBand or RoCE)
2. **RDMA device plugin** installed on the cluster (provides `rdma/ib` resources)
3. **ETCD and NATS** deployed (for coordination)
#### Disaggregated DGD with RDMA
```yaml
apiVersion: nvidia.com/v1alpha1
kind: DynamoGraphDeployment
metadata:
name: dynamo-disagg
namespace: your-namespace
spec:
backendFramework: vllm
pvcs:
- name: model-cache
create: false
services:
Frontend:
componentType: frontend
replicas: 1
volumeMounts:
- name: model-cache
mountPoint: /opt/models
envs:
- name: HF_HOME
value: /opt/models
extraPodSpec:
mainContainer:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:0.8.0
imagePullPolicy: IfNotPresent
VLLMPrefillWorker:
envFromSecret: hf-token-secret
componentType: worker
subComponentType: prefill
replicas: 2
resources:
limits:
gpu: "2"
sharedMemory:
size: 16Gi
volumeMounts:
- name: model-cache
mountPoint: /opt/models
envs:
- name: HF_HOME
value: /opt/models
- name: UCX_TLS
value: "rc_x,rc,dc_x,dc,cuda_copy,cuda_ipc" # Enable RDMA transports
- name: UCX_RNDV_SCHEME
value: "get_zcopy"
- name: UCX_RNDV_THRESH
value: "0"
extraPodSpec:
mainContainer:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:0.8.0
workingDir: /workspace
imagePullPolicy: IfNotPresent
securityContext:
capabilities:
add: ["IPC_LOCK"] # Required for RDMA memory registration
resources:
limits:
rdma/ib: "2" # Request RDMA resources
requests:
rdma/ib: "2"
command: ["python3", "-m", "dynamo.vllm"]
args:
- --model
- "Qwen/Qwen3-32B-FP8"
- "--tensor-parallel-size"
- "2"
- "--kv-cache-dtype"
- "fp8"
- "--max-num-seqs"
- "1" # Prefill workers use batch size 1
- --is-prefill-worker
VLLMDecodeWorker:
envFromSecret: hf-token-secret
componentType: worker
subComponentType: decode
replicas: 1
resources:
limits:
gpu: "4"
sharedMemory:
size: 16Gi
volumeMounts:
- name: model-cache
mountPoint: /opt/models
envs:
- name: HF_HOME
value: /opt/models
- name: UCX_TLS
value: "rc_x,rc,dc_x,dc,cuda_copy,cuda_ipc"
- name: UCX_RNDV_SCHEME
value: "get_zcopy"
- name: UCX_RNDV_THRESH
value: "0"
extraPodSpec:
mainContainer:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:0.8.0
workingDir: /workspace
imagePullPolicy: IfNotPresent
securityContext:
capabilities:
add: ["IPC_LOCK"]
resources:
limits:
rdma/ib: "4"
requests:
rdma/ib: "4"
command: ["python3", "-m", "dynamo.vllm"]
args:
- --model
- "Qwen/Qwen3-32B-FP8"
- "--tensor-parallel-size"
- "4"
- "--kv-cache-dtype"
- "fp8"
- "--max-num-seqs"
- "1024" # Decode workers handle high concurrency
- --is-decode-worker
```
**Critical RDMA settings:**
| Setting | Purpose |
|---------|---------|
| `rdma/ib: "N"` | Request N RDMA resources (match TP size) |
| `IPC_LOCK` capability | Required for RDMA memory registration |
| `UCX_TLS` env var | Enables RDMA transports (rc_x, dc_x) |
| `UCX_RNDV_SCHEME=get_zcopy` | Zero-copy RDMA transfers |
#### Verifying RDMA is Active
After deployment, check the worker logs for UCX initialization:
```bash
kubectl logs <prefill-worker-pod> | grep -i "UCX\|NIXL"
```
You should see:
```
NIXL INFO Backend UCX was instantiated
```
If you see only TCP transports, RDMA is not active - check your RDMA device plugin and resource requests.
### Tuning vLLM-Specific Parameters
Override vLLM engine parameters with `--generator-set`:
```bash
aiconfigurator cli default \
--model_path Qwen/Qwen3-32B-FP8 \
--total_gpus 8 \
--system h200_sxm \
--backend vllm \
--backend_version 0.12.0 \
--isl 4000 --osl 500 \
--ttft 600 --tpot 16.67 \
--save_dir ./results_tuned \
--generator-set Workers.agg.kv_cache_free_gpu_memory_fraction=0.85 \
--generator-set Workers.agg.max_num_seqs=2048
```
Run `aiconfigurator cli default --generator-help` to see all available parameters.
### Prefix Caching Considerations
For workloads with repeated prefixes (e.g., system prompts):
- **Enable prefix caching** when you have high prefix hit rates
- **Disable prefix caching** (`--no-enable-prefix-caching`) for diverse prompts
AIConfigurator's default predictions assume no prefix caching. Enable it post-deployment if your workload benefits.
## Supported Configurations
### Backends and Versions
| Backend | Versions | Status |
|---------|----------|--------|
| TensorRT-LLM | 1.0.0rc3, 1.2.0rc5 | Production |
| vLLM | 0.12.0 | Production |
| SGLang | 0.5.6.post2 | Production |
### Systems
| GPU System | TensorRT-LLM | vLLM | SGLang |
|------------|--------------|------|--------|
| H200 SXM | Yes | Yes | Yes |
| H100 SXM | Yes | Yes | Yes |
| A100 SXM | Yes | Yes | -- |
| B200 SXM | Yes | -- | Yes |
| GB200 SXM | Yes | -- | -- |
### Models
- **Dense**: GPT, LLAMA2/3, QWEN2.5/3
- **MoE**: Mixtral, DEEPSEEK_V3
## Common Use Cases
```bash
# Strict latency SLAs (real-time chat)
aiconfigurator cli default \
--model_path meta-llama/Llama-3.1-70B \
--total_gpus 16 \
--system h200_sxm \
--backend vllm \
--backend_version 0.12.0 \
--ttft 200 --tpot 8
# High throughput (batch processing)
aiconfigurator cli default \
--model_path Qwen/Qwen3-32B-FP8 \
--total_gpus 32 \
--system h200_sxm \
--backend trtllm \
--ttft 2000 --tpot 50
# Request latency constraint (end-to-end SLA)
aiconfigurator cli default \
--model_path Qwen/Qwen3-32B-FP8 \
--total_gpus 16 \
--system h200_sxm \
--backend vllm \
--backend_version 0.12.0 \
--request_latency 12000 \
--isl 4000 --osl 500
```
## Additional Options
```bash
# Web interface for interactive exploration
pip3 install aiconfigurator[webapp]
aiconfigurator webapp # Visit http://127.0.0.1:7860
# Quick config generation (no parameter sweep)
aiconfigurator cli generate \
--model_path Qwen/Qwen3-32B-FP8 \
--total_gpus 8 \
--system h200_sxm \
--backend vllm
# Check model/system support
aiconfigurator cli support \
--model_path Qwen/Qwen3-32B-FP8 \
--system h200_sxm \
--backend vllm
```
## Troubleshooting
### AIConfigurator Issues
**Model not found**: Use the full HuggingFace path (e.g., `Qwen/Qwen3-32B-FP8` not `QWEN3_32B`)
**Backend version mismatch**: Check supported versions with `aiconfigurator cli support --model_path <model> --system <system> --backend <backend>`
### Deployment Issues
**Pods crash with "Permission denied" on cache directory**:
- Mount the PVC at `/opt/models` instead of `/root/.cache/huggingface`
- Set `HF_HOME=/opt/models` environment variable
- Ensure the PVC has `ReadWriteMany` access mode
**Workers stuck in CrashLoopBackOff**:
- Check logs: `kubectl logs <pod-name> --previous`
- Verify `sharedMemory.size` is set (16Gi for vLLM, 80Gi for TRT-LLM)
- Ensure HuggingFace token secret exists and is named correctly
**Model download slow on every restart**:
- Add PVC for model caching (see deployment example above)
- Verify `volumeMounts` and `HF_HOME` are configured on workers
**"Context stopped or killed" errors (disaggregated only)**:
- Deploy ETCD and NATS infrastructure (required for KV cache transfer)
- See [Dynamo Kubernetes Guide](/docs/kubernetes/README.md) for platform setup
### Performance Issues
**OOM errors**: Reduce `--max-num-seqs` or increase tensor parallelism
**Performance below predictions**:
- Verify warmup requests are sufficient (40+ recommended)
- Check for competing workloads on the cluster
- Ensure KV cache memory fraction is optimized
- Run benchmarks from inside the cluster to eliminate network latency
**Disaggregated TTFT extremely high (10+ seconds)**:
This is almost always caused by **missing RDMA configuration**. Without RDMA, KV cache transfer falls back to TCP and becomes a severe bottleneck.
To diagnose:
```bash
# Check if RDMA resources are allocated
kubectl get pod <worker-pod> -o yaml | grep -A5 "resources:"
# Check UCX transport in logs
kubectl logs <worker-pod> | grep -i "UCX\|transport"
```
To fix:
1. Ensure your cluster has RDMA device plugin installed
2. Add `rdma/ib` resource requests to worker pods
3. Add `IPC_LOCK` capability to security context
4. Add UCX environment variables (see Disaggregated Deployment section)
**Disaggregated working but throughput lower than aggregated**:
For balanced workloads (ISL/OSL ratio between 2:1 and 10:1), aggregated is often better. Disaggregated shines for:
- Very long inputs (ISL > 8000) with short outputs
- Workloads needing independent prefill/decode scaling
## Learn More
- [AIConfigurator CLI Guide](https://github.com/ai-dynamo/aiconfigurator/blob/main/docs/cli_user_guide.md)
- [Dynamo Deployment Guide](https://github.com/ai-dynamo/aiconfigurator/blob/main/docs/dynamo_deployment_guide.md)
- [Dynamo Installation Guide](/docs/kubernetes/installation_guide.md)
- [Benchmarking Guide](/docs/benchmarks/benchmarking.md)
......@@ -12,6 +12,8 @@
:hidden:
development/runtime-guide.md
development/jail_stream.md
api/nixl_connect/connector.md
api/nixl_connect/descriptor.md
api/nixl_connect/device.md
......@@ -26,48 +28,20 @@
kubernetes/api_reference.md
kubernetes/deployment/create_deployment.md
kubernetes/deployment/dynamomodel-guide.md
kubernetes/chrek/README.md
kubernetes/chrek/dynamo.md
kubernetes/chrek/standalone.md
kubernetes/fluxcd.md
kubernetes/grove.md
kubernetes/model_caching_with_fluid.md
kubernetes/README.md
reference/cli.md
observability/metrics.md
integrations/kv_events_custom_engines.md
agents/tool-calling.md
development/jail_stream.md
components/planner/README.md
components/planner/planner_guide.md
components/planner/planner_examples.md
components/kvbm/README.md
components/kvbm/kvbm_guide.md
components/router/README.md
components/router/router_guide.md
components/router/router_examples.md
components/frontend/frontend_guide.md
design_docs/kvbm_design.md
integrations/flexkv_integration.md
integrations/sglang_hicache.md
fault_tolerance/README.md
fault_tolerance/request_migration.md
fault_tolerance/request_cancellation.md
fault_tolerance/graceful_shutdown.md
fault_tolerance/request_rejection.md
fault_tolerance/testing.md
design_docs/request_plane.md
design_docs/event_plane.md
reference/cli.md
reference/glossary.md
performance/tuning.md
backends/trtllm/multinode/multinode-examples.md
backends/trtllm/llama4_plus_eagle.md
backends/trtllm/kv-cache-transfer.md
backends/trtllm/gemma3_sliding_window_attention.md
backends/trtllm/gpt-oss.md
backends/trtllm/prometheus.md
backends/vllm/deepseek-r1.md
backends/vllm/gpt-oss.md
backends/vllm/multi-node.md
backends/vllm/prometheus.md
backends/vllm/prompt-embeddings.md
backends/sglang/expert-distribution-eplb.md
backends/sglang/gpt-oss.md
......@@ -76,25 +50,19 @@
backends/sglang/sglang-disaggregation.md
backends/sglang/prometheus.md
examples/README.md
examples/runtime/hello_world/README.md
design_docs/distributed_runtime.md
design_docs/dynamo_flow.md
backends/vllm/deepseek-r1.md
backends/vllm/gpt-oss.md
integrations/lmcache_integration.md
backends/vllm/multi-node.md
backends/vllm/prometheus.md
backends/vllm/prompt-embeddings.md
backends/trtllm/multinode/multinode-examples.md
backends/trtllm/llama4_plus_eagle.md
backends/trtllm/kv-cache-transfer.md
backends/trtllm/gemma3_sliding_window_attention.md
backends/trtllm/gpt-oss.md
backends/trtllm/prometheus.md
features/speculative_decoding/README.md
features/speculative_decoding/speculative_decoding_vllm.md
examples/README.md
examples/runtime/hello_world/README.md
benchmarks/kv-router-ab-testing.md
mocker/mocker.md
.. TODO: architecture/distributed_runtime.md and architecture/dynamo_flow.md
have some outdated names/references and need a refresh.
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 1667 982"><svg class="d2-3076236447 d2-svg" width="1667" height="982" viewBox="-19 -19 1667 982"><rect x="-19.000000" y="-19.000000" width="1667.000000" height="982.000000" rx="0.000000" fill="transparent" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-3076236447 .text {
font-family: "d2-3076236447-font-regular";
}
@font-face {
font-family: d2-3076236447-font-regular;
src: url("data:application/font-woff;base64,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");
}
@font-face {
font-family: d2-3076236447-font-semibold;
src: url("data:application/font-woff;base64,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");
}
.d2-3076236447 .text-mono {
font-family: "d2-3076236447-font-mono";
}
@font-face {
font-family: d2-3076236447-font-mono;
src: url("data:application/font-woff;base64,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");
}
.d2-3076236447 .text-mono-bold {
font-family: "d2-3076236447-font-mono-bold";
}
@font-face {
font-family: d2-3076236447-font-mono-bold;
src: url("data:application/font-woff;base64,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");
}
.d2-3076236447 .text-mono-italic {
font-family: "d2-3076236447-font-mono-italic";
}
@font-face {
font-family: d2-3076236447-font-mono-italic;
src: url("data:application/font-woff;base64,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");
}
@media (prefers-color-scheme: dark) {
.d2-3076236447 .fill-N1 { fill: #E8E8E8; }
.d2-3076236447 .fill-N2 { fill: #CCCCCC; }
.d2-3076236447 .fill-N3 { fill: #999999; }
.d2-3076236447 .fill-B1 { fill: #E8E8E8; }
.d2-3076236447 .fill-B2 { fill: #7BACFF; }
.d2-3076236447 .fill-B3 { fill: #6AAFDC; }
.d2-3076236447 .fill-N4 { fill: #3A3A44; }
.d2-3076236447 .fill-N5 { fill: #2E2E38; }
.d2-3076236447 .fill-N6 { fill: #252530; }
.d2-3076236447 .fill-N7 { fill: transparent; }
.d2-3076236447 .fill-B4 { fill: #2A2A34; }
.d2-3076236447 .fill-B5 { fill: #1E1E28; }
.d2-3076236447 .fill-B6 { fill: #16161E; }
.d2-3076236447 .stroke-N1 { stroke: #E8E8E8; }
.d2-3076236447 .stroke-N2 { stroke: #CCCCCC; }
.d2-3076236447 .stroke-N3 { stroke: #999999; }
.d2-3076236447 .stroke-N4 { stroke: #555555; }
.d2-3076236447 .stroke-N5 { stroke: #444444; }
.d2-3076236447 .stroke-N6 { stroke: #333333; }
.d2-3076236447 .stroke-N7 { stroke: transparent; }
.d2-3076236447 .stroke-B1 { stroke: #E8E8E8; }
.d2-3076236447 .stroke-B2 { stroke: #7BACFF; }
.d2-3076236447 .stroke-B3 { stroke: #6AAFDC; }
.d2-3076236447 .stroke-B4 { stroke: #3A3A44; }
.d2-3076236447 .stroke-B5 { stroke: #2E2E38; }
.d2-3076236447 .stroke-B6 { stroke: #252530; }
.d2-3076236447 .color-N1 { color: #E8E8E8; }
.d2-3076236447 .color-N2 { color: #CCCCCC; }
.d2-3076236447 .color-N3 { color: #999999; }
.d2-3076236447 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-3076236447 .fill-N1{fill:#000410;}
.d2-3076236447 .fill-N2{fill:#0000B8;}
.d2-3076236447 .fill-N3{fill:#9499AB;}
.d2-3076236447 .fill-N4{fill:#CFD2DD;}
.d2-3076236447 .fill-N5{fill:#C3DEF3;}
.d2-3076236447 .fill-N6{fill:#EEF1F8;}
.d2-3076236447 .fill-N7{fill:#FFFFFF;}
.d2-3076236447 .fill-B1{fill:#000410;}
.d2-3076236447 .fill-B2{fill:#0000E4;}
.d2-3076236447 .fill-B3{fill:#5AA4DC;}
.d2-3076236447 .fill-B4{fill:#E7E9EE;}
.d2-3076236447 .fill-B5{fill:#F5F6F9;}
.d2-3076236447 .fill-B6{fill:#FFFFFF;}
.d2-3076236447 .fill-AA2{fill:#008566;}
.d2-3076236447 .fill-AA4{fill:#45BBA5;}
.d2-3076236447 .fill-AA5{fill:#7ACCBD;}
.d2-3076236447 .fill-AB4{fill:#F1C759;}
.d2-3076236447 .fill-AB5{fill:#F9E088;}
.d2-3076236447 .stroke-N1{stroke:#000410;}
.d2-3076236447 .stroke-N2{stroke:#0000B8;}
.d2-3076236447 .stroke-N3{stroke:#9499AB;}
.d2-3076236447 .stroke-N4{stroke:#CFD2DD;}
.d2-3076236447 .stroke-N5{stroke:#C3DEF3;}
.d2-3076236447 .stroke-N6{stroke:#EEF1F8;}
.d2-3076236447 .stroke-N7{stroke:#FFFFFF;}
.d2-3076236447 .stroke-B1{stroke:#000410;}
.d2-3076236447 .stroke-B2{stroke:#0000E4;}
.d2-3076236447 .stroke-B3{stroke:#5AA4DC;}
.d2-3076236447 .stroke-B4{stroke:#E7E9EE;}
.d2-3076236447 .stroke-B5{stroke:#F5F6F9;}
.d2-3076236447 .stroke-B6{stroke:#FFFFFF;}
.d2-3076236447 .stroke-AA2{stroke:#008566;}
.d2-3076236447 .stroke-AA4{stroke:#45BBA5;}
.d2-3076236447 .stroke-AA5{stroke:#7ACCBD;}
.d2-3076236447 .stroke-AB4{stroke:#F1C759;}
.d2-3076236447 .stroke-AB5{stroke:#F9E088;}
.d2-3076236447 .background-color-N1{background-color:#000410;}
.d2-3076236447 .background-color-N2{background-color:#0000B8;}
.d2-3076236447 .background-color-N3{background-color:#9499AB;}
.d2-3076236447 .background-color-N4{background-color:#CFD2DD;}
.d2-3076236447 .background-color-N5{background-color:#C3DEF3;}
.d2-3076236447 .background-color-N6{background-color:#EEF1F8;}
.d2-3076236447 .background-color-N7{background-color:#FFFFFF;}
.d2-3076236447 .background-color-B1{background-color:#000410;}
.d2-3076236447 .background-color-B2{background-color:#0000E4;}
.d2-3076236447 .background-color-B3{background-color:#5AA4DC;}
.d2-3076236447 .background-color-B4{background-color:#E7E9EE;}
.d2-3076236447 .background-color-B5{background-color:#F5F6F9;}
.d2-3076236447 .background-color-B6{background-color:#FFFFFF;}
.d2-3076236447 .background-color-AA2{background-color:#008566;}
.d2-3076236447 .background-color-AA4{background-color:#45BBA5;}
.d2-3076236447 .background-color-AA5{background-color:#7ACCBD;}
.d2-3076236447 .background-color-AB4{background-color:#F1C759;}
.d2-3076236447 .background-color-AB5{background-color:#F9E088;}
.d2-3076236447 .color-N1{color:#000410;}
.d2-3076236447 .color-N2{color:#0000B8;}
.d2-3076236447 .color-N3{color:#9499AB;}
.d2-3076236447 .color-N4{color:#CFD2DD;}
.d2-3076236447 .color-N5{color:#C3DEF3;}
.d2-3076236447 .color-N6{color:#EEF1F8;}
.d2-3076236447 .color-N7{color:#FFFFFF;}
.d2-3076236447 .color-B1{color:#000410;}
.d2-3076236447 .color-B2{color:#0000E4;}
.d2-3076236447 .color-B3{color:#5AA4DC;}
.d2-3076236447 .color-B4{color:#E7E9EE;}
.d2-3076236447 .color-B5{color:#F5F6F9;}
.d2-3076236447 .color-B6{color:#FFFFFF;}
.d2-3076236447 .color-AA2{color:#008566;}
.d2-3076236447 .color-AA4{color:#45BBA5;}
.d2-3076236447 .color-AA5{color:#7ACCBD;}
.d2-3076236447 .color-AB4{color:#F1C759;}
.d2-3076236447 .color-AB5{color:#F9E088;}.appendix text.text{fill:#000410}.md{--color-fg-default:#000410;--color-fg-muted:#0000B8;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#000410;--color-border-muted:#0000E4;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0000E4;--color-accent-emphasis:#0000E4;--color-attention-subtle:#0000B8;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-3076236447);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-3076236447);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-normal-d2-3076236447);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-bright-d2-3076236447);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-3076236447);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-3076236447);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-3076236447);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-3076236447);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-normal-d2-3076236447);mix-blend-mode:color-burn}.sketch-overlay-AB4{fill:url(#streaks-normal-d2-3076236447);mix-blend-mode:color-burn}.sketch-overlay-AB5{fill:url(#streaks-normal-d2-3076236447);mix-blend-mode:color-burn}.sketch-overlay-N1{fill:url(#streaks-darker-d2-3076236447);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-darker-d2-3076236447);mix-blend-mode:lighten}.sketch-overlay-N3{fill:url(#streaks-normal-d2-3076236447);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-3076236447);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-normal-d2-3076236447);mix-blend-mode:color-burn}.sketch-overlay-N6{fill:url(#streaks-bright-d2-3076236447);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-3076236447);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}
@media (prefers-color-scheme: dark) {
.d2-3076236447 .fill-N1 { fill: #E8E8E8; }
.d2-3076236447 .fill-N2 { fill: #CCCCCC; }
.d2-3076236447 .fill-N3 { fill: #999999; }
.d2-3076236447 .fill-B1 { fill: #E8E8E8; }
.d2-3076236447 .fill-B2 { fill: #7BACFF; }
.d2-3076236447 .fill-B3 { fill: #6AAFDC; }
.d2-3076236447 .fill-N4 { fill: #3A3A44; }
.d2-3076236447 .fill-N5 { fill: #2E2E38; }
.d2-3076236447 .fill-N6 { fill: #252530; }
.d2-3076236447 .fill-N7 { fill: transparent; }
.d2-3076236447 .fill-B4 { fill: #2A2A34; }
.d2-3076236447 .fill-B5 { fill: #1E1E28; }
.d2-3076236447 .fill-B6 { fill: #16161E; }
.d2-3076236447 .stroke-N1 { stroke: #E8E8E8; }
.d2-3076236447 .stroke-N2 { stroke: #CCCCCC; }
.d2-3076236447 .stroke-N3 { stroke: #999999; }
.d2-3076236447 .stroke-N4 { stroke: #555555; }
.d2-3076236447 .stroke-N5 { stroke: #444444; }
.d2-3076236447 .stroke-N6 { stroke: #333333; }
.d2-3076236447 .stroke-N7 { stroke: transparent; }
.d2-3076236447 .stroke-B1 { stroke: #E8E8E8; }
.d2-3076236447 .stroke-B2 { stroke: #7BACFF; }
.d2-3076236447 .stroke-B3 { stroke: #6AAFDC; }
.d2-3076236447 .stroke-B4 { stroke: #3A3A44; }
.d2-3076236447 .stroke-B5 { stroke: #2E2E38; }
.d2-3076236447 .stroke-B6 { stroke: #252530; }
.d2-3076236447 .color-N1 { color: #E8E8E8; }
.d2-3076236447 .color-N2 { color: #CCCCCC; }
.d2-3076236447 .color-N3 { color: #999999; }
.d2-3076236447 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><style type="text/css">.d2-3076236447 .md em,
.d2-3076236447 .md dfn {
font-family: "d2-3076236447-font-italic";
}
.d2-3076236447 .md b,
.d2-3076236447 .md strong {
font-family: "d2-3076236447-font-bold";
}
.d2-3076236447 .md code,
.d2-3076236447 .md kbd,
.d2-3076236447 .md pre,
.d2-3076236447 .md samp {
font-family: "d2-3076236447-font-mono";
font-size: 1em;
}
.d2-3076236447 .md {
tab-size: 4;
}
/* variables are provided in d2renderers/d2svg/d2svg.go */
.d2-3076236447 .md {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
margin: 0;
background-color: transparent; /* we don't want to define the background color */
font-family: "d2-3076236447-font-regular";
font-size: 16px;
line-height: 1.5;
word-wrap: break-word;
}
.d2-3076236447 .md details,
.d2-3076236447 .md figcaption,
.d2-3076236447 .md figure {
display: block;
}
.d2-3076236447 .md summary {
display: list-item;
}
.d2-3076236447 .md [hidden] {
display: none !important;
}
.d2-3076236447 .md a {
background-color: transparent;
color: var(--color-accent-fg);
text-decoration: none;
}
.d2-3076236447 .md a:active,
.d2-3076236447 .md a:hover {
outline-width: 0;
}
.d2-3076236447 .md abbr[title] {
border-bottom: none;
text-decoration: underline dotted;
}
.d2-3076236447 .md dfn {
font-style: italic;
}
.d2-3076236447 .md h1 {
margin: 0.67em 0;
padding-bottom: 0.3em;
font-size: 2em;
border-bottom: 1px solid var(--color-border-muted);
}
.d2-3076236447 .md mark {
background-color: var(--color-attention-subtle);
color: var(--color-text-primary);
}
.d2-3076236447 .md small {
font-size: 90%;
}
.d2-3076236447 .md sub,
.d2-3076236447 .md sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
.d2-3076236447 .md sub {
bottom: -0.25em;
}
.d2-3076236447 .md sup {
top: -0.5em;
}
.d2-3076236447 .md img {
border-style: none;
max-width: 100%;
box-sizing: content-box;
background-color: var(--color-canvas-default);
}
.d2-3076236447 .md figure {
margin: 1em 40px;
}
.d2-3076236447 .md hr {
box-sizing: content-box;
overflow: hidden;
background: transparent;
border-bottom: 1px solid var(--color-border-muted);
height: 0.25em;
padding: 0;
margin: 24px 0;
background-color: var(--color-border-default);
border: 0;
}
.d2-3076236447 .md input {
font: inherit;
margin: 0;
overflow: visible;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
.d2-3076236447 .md [type="button"],
.d2-3076236447 .md [type="reset"],
.d2-3076236447 .md [type="submit"] {
-webkit-appearance: button;
}
.d2-3076236447 .md [type="button"]::-moz-focus-inner,
.d2-3076236447 .md [type="reset"]::-moz-focus-inner,
.d2-3076236447 .md [type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
.d2-3076236447 .md [type="button"]:-moz-focusring,
.d2-3076236447 .md [type="reset"]:-moz-focusring,
.d2-3076236447 .md [type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
.d2-3076236447 .md [type="checkbox"],
.d2-3076236447 .md [type="radio"] {
box-sizing: border-box;
padding: 0;
}
.d2-3076236447 .md [type="number"]::-webkit-inner-spin-button,
.d2-3076236447 .md [type="number"]::-webkit-outer-spin-button {
height: auto;
}
.d2-3076236447 .md [type="search"] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
.d2-3076236447 .md [type="search"]::-webkit-search-cancel-button,
.d2-3076236447 .md [type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
.d2-3076236447 .md ::-webkit-input-placeholder {
color: inherit;
opacity: 0.54;
}
.d2-3076236447 .md ::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
.d2-3076236447 .md a:hover {
text-decoration: underline;
}
.d2-3076236447 .md hr::before {
display: table;
content: "";
}
.d2-3076236447 .md hr::after {
display: table;
clear: both;
content: "";
}
.d2-3076236447 .md table {
border-spacing: 0;
border-collapse: collapse;
display: block;
width: max-content;
max-width: 100%;
overflow: auto;
}
.d2-3076236447 .md td,
.d2-3076236447 .md th {
padding: 0;
}
.d2-3076236447 .md details summary {
cursor: pointer;
}
.d2-3076236447 .md details:not([open]) > *:not(summary) {
display: none !important;
}
.d2-3076236447 .md kbd {
display: inline-block;
padding: 3px 5px;
color: var(--color-fg-default);
vertical-align: middle;
background-color: var(--color-canvas-subtle);
border: solid 1px var(--color-neutral-muted);
border-bottom-color: var(--color-neutral-muted);
border-radius: 6px;
box-shadow: inset 0 -1px 0 var(--color-neutral-muted);
}
.d2-3076236447 .md h1,
.d2-3076236447 .md h2,
.d2-3076236447 .md h3,
.d2-3076236447 .md h4,
.d2-3076236447 .md h5,
.d2-3076236447 .md h6 {
margin-top: 24px;
margin-bottom: 16px;
font-weight: 400;
line-height: 1.25;
font-family: "d2-3076236447-font-semibold";
}
.d2-3076236447 .md h2 {
padding-bottom: 0.3em;
font-size: 1.5em;
border-bottom: 1px solid var(--color-border-muted);
}
.d2-3076236447 .md h3 {
font-size: 1.25em;
}
.d2-3076236447 .md h4 {
font-size: 1em;
}
.d2-3076236447 .md h5 {
font-size: 0.875em;
}
.d2-3076236447 .md h6 {
font-size: 0.85em;
color: var(--color-fg-muted);
}
.d2-3076236447 .md p {
margin-top: 0;
margin-bottom: 10px;
}
.d2-3076236447 .md blockquote {
margin: 0;
padding: 0 1em;
color: var(--color-fg-muted);
border-left: 0.25em solid var(--color-border-default);
}
.d2-3076236447 .md ul,
.d2-3076236447 .md ol {
margin-top: 0;
margin-bottom: 0;
padding-left: 2em;
}
.d2-3076236447 .md ol ol,
.d2-3076236447 .md ul ol {
list-style-type: lower-roman;
}
.d2-3076236447 .md ul ul ol,
.d2-3076236447 .md ul ol ol,
.d2-3076236447 .md ol ul ol,
.d2-3076236447 .md ol ol ol {
list-style-type: lower-alpha;
}
.d2-3076236447 .md dd {
margin-left: 0;
}
.d2-3076236447 .md pre {
margin-top: 0;
margin-bottom: 0;
word-wrap: normal;
}
.d2-3076236447 .md ::placeholder {
color: var(--color-fg-subtle);
opacity: 1;
}
.d2-3076236447 .md input::-webkit-outer-spin-button,
.d2-3076236447 .md input::-webkit-inner-spin-button {
margin: 0;
-webkit-appearance: none;
appearance: none;
}
.d2-3076236447 .md::before {
display: table;
content: "";
}
.d2-3076236447 .md::after {
display: table;
clear: both;
content: "";
}
.d2-3076236447 .md > *:first-child {
margin-top: 0 !important;
}
.d2-3076236447 .md > *:last-child {
margin-bottom: 0 !important;
}
.d2-3076236447 .md a:not([href]) {
color: inherit;
text-decoration: none;
}
.d2-3076236447 .md .absent {
color: var(--color-danger-fg);
}
.d2-3076236447 .md .anchor {
float: left;
padding-right: 4px;
margin-left: -20px;
line-height: 1;
}
.d2-3076236447 .md .anchor:focus {
outline: none;
}
.d2-3076236447 .md p,
.d2-3076236447 .md blockquote,
.d2-3076236447 .md ul,
.d2-3076236447 .md ol,
.d2-3076236447 .md dl,
.d2-3076236447 .md table,
.d2-3076236447 .md pre,
.d2-3076236447 .md details {
margin-top: 0;
margin-bottom: 16px;
}
.d2-3076236447 .md blockquote > :first-child {
margin-top: 0;
}
.d2-3076236447 .md blockquote > :last-child {
margin-bottom: 0;
}
.d2-3076236447 .md sup > a::before {
content: "[";
}
.d2-3076236447 .md sup > a::after {
content: "]";
}
.d2-3076236447 .md h1:hover .anchor,
.d2-3076236447 .md h2:hover .anchor,
.d2-3076236447 .md h3:hover .anchor,
.d2-3076236447 .md h4:hover .anchor,
.d2-3076236447 .md h5:hover .anchor,
.d2-3076236447 .md h6:hover .anchor {
text-decoration: none;
}
.d2-3076236447 .md h1 tt,
.d2-3076236447 .md h1 code,
.d2-3076236447 .md h2 tt,
.d2-3076236447 .md h2 code,
.d2-3076236447 .md h3 tt,
.d2-3076236447 .md h3 code,
.d2-3076236447 .md h4 tt,
.d2-3076236447 .md h4 code,
.d2-3076236447 .md h5 tt,
.d2-3076236447 .md h5 code,
.d2-3076236447 .md h6 tt,
.d2-3076236447 .md h6 code {
padding: 0 0.2em;
font-size: inherit;
}
.d2-3076236447 .md ul.no-list,
.d2-3076236447 .md ol.no-list {
padding: 0;
list-style-type: none;
}
.d2-3076236447 .md ol[type="1"] {
list-style-type: decimal;
}
.d2-3076236447 .md ol[type="a"] {
list-style-type: lower-alpha;
}
.d2-3076236447 .md ol[type="i"] {
list-style-type: lower-roman;
}
.d2-3076236447 .md div > ol:not([type]) {
list-style-type: decimal;
}
.d2-3076236447 .md ul ul,
.d2-3076236447 .md ul ol,
.d2-3076236447 .md ol ol,
.d2-3076236447 .md ol ul {
margin-top: 0;
margin-bottom: 0;
}
.d2-3076236447 .md li > p {
margin-top: 16px;
}
.d2-3076236447 .md li + li {
margin-top: 0.25em;
}
.d2-3076236447 .md dl {
padding: 0;
}
.d2-3076236447 .md dl dt {
padding: 0;
margin-top: 16px;
font-size: 1em;
font-style: italic;
font-family: "d2-3076236447-font-semibold";
}
.d2-3076236447 .md dl dd {
padding: 0 16px;
margin-bottom: 16px;
}
.d2-3076236447 .md table th {
font-family: "d2-3076236447-font-semibold";
}
.d2-3076236447 .md table th,
.d2-3076236447 .md table td {
padding: 6px 13px;
border: 1px solid var(--color-border-default);
}
.d2-3076236447 .md table tr {
background-color: var(--color-canvas-default);
border-top: 1px solid var(--color-border-muted);
}
.d2-3076236447 .md table tr:nth-child(2n) {
background-color: var(--color-canvas-subtle);
}
.d2-3076236447 .md table img {
background-color: transparent;
}
.d2-3076236447 .md img[align="right"] {
padding-left: 20px;
}
.d2-3076236447 .md img[align="left"] {
padding-right: 20px;
}
.d2-3076236447 .md span.frame {
display: block;
overflow: hidden;
}
.d2-3076236447 .md span.frame > span {
display: block;
float: left;
width: auto;
padding: 7px;
margin: 13px 0 0;
overflow: hidden;
border: 1px solid var(--color-border-default);
}
.d2-3076236447 .md span.frame span img {
display: block;
float: left;
}
.d2-3076236447 .md span.frame span span {
display: block;
padding: 5px 0 0;
clear: both;
color: var(--color-fg-default);
}
.d2-3076236447 .md span.align-center {
display: block;
overflow: hidden;
clear: both;
}
.d2-3076236447 .md span.align-center > span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: center;
}
.d2-3076236447 .md span.align-center span img {
margin: 0 auto;
text-align: center;
}
.d2-3076236447 .md span.align-right {
display: block;
overflow: hidden;
clear: both;
}
.d2-3076236447 .md span.align-right > span {
display: block;
margin: 13px 0 0;
overflow: hidden;
text-align: right;
}
.d2-3076236447 .md span.align-right span img {
margin: 0;
text-align: right;
}
.d2-3076236447 .md span.float-left {
display: block;
float: left;
margin-right: 13px;
overflow: hidden;
}
.d2-3076236447 .md span.float-left span {
margin: 13px 0 0;
}
.d2-3076236447 .md span.float-right {
display: block;
float: right;
margin-left: 13px;
overflow: hidden;
}
.d2-3076236447 .md span.float-right > span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: right;
}
.d2-3076236447 .md code,
.d2-3076236447 .md tt {
padding: 0.2em 0.4em;
margin: 0;
font-size: 85%;
background-color: var(--color-neutral-muted);
border-radius: 6px;
}
.d2-3076236447 .md code br,
.d2-3076236447 .md tt br {
display: none;
}
.d2-3076236447 .md del code {
text-decoration: inherit;
}
.d2-3076236447 .md pre code {
font-size: 100%;
}
.d2-3076236447 .md pre > code {
padding: 0;
margin: 0;
word-break: normal;
white-space: pre;
background: transparent;
border: 0;
}
.d2-3076236447 .md .highlight {
margin-bottom: 16px;
}
.d2-3076236447 .md .highlight pre {
margin-bottom: 0;
word-break: normal;
}
.d2-3076236447 .md .highlight pre,
.d2-3076236447 .md pre {
padding: 16px;
overflow: auto;
font-size: 85%;
line-height: 1.45;
background-color: var(--color-canvas-subtle);
border-radius: 6px;
}
.d2-3076236447 .md pre code,
.d2-3076236447 .md pre tt {
display: inline;
max-width: auto;
padding: 0;
margin: 0;
overflow: visible;
line-height: inherit;
word-wrap: normal;
background-color: transparent;
border: 0;
}
.d2-3076236447 .md .csv-data td,
.d2-3076236447 .md .csv-data th {
padding: 5px;
overflow: hidden;
font-size: 12px;
line-height: 1;
text-align: left;
white-space: nowrap;
}
.d2-3076236447 .md .csv-data .blob-num {
padding: 10px 8px 9px;
text-align: right;
background: var(--color-canvas-default);
border: 0;
}
.d2-3076236447 .md .csv-data tr {
border-top: 0;
}
.d2-3076236447 .md .csv-data th {
font-family: "d2-3076236447-font-semibold";
background: var(--color-canvas-subtle);
border-top: 0;
}
.d2-3076236447 .md .footnotes {
font-size: 12px;
color: var(--color-fg-muted);
border-top: 1px solid var(--color-border-default);
}
.d2-3076236447 .md .footnotes ol {
padding-left: 16px;
}
.d2-3076236447 .md .footnotes li {
position: relative;
}
.d2-3076236447 .md .footnotes li:target::before {
position: absolute;
top: -8px;
right: -8px;
bottom: -8px;
left: -24px;
pointer-events: none;
content: "";
border: 2px solid var(--color-accent-emphasis);
border-radius: 6px;
}
.d2-3076236447 .md .footnotes li:target {
color: var(--color-fg-default);
}
.d2-3076236447 .md .task-list-item {
list-style-type: none;
}
.d2-3076236447 .md .task-list-item label {
font-weight: 400;
}
.d2-3076236447 .md .task-list-item.enabled label {
cursor: pointer;
}
.d2-3076236447 .md .task-list-item + .task-list-item {
margin-top: 3px;
}
.d2-3076236447 .md .task-list-item .handle {
display: none;
}
.d2-3076236447 .md .task-list-item-checkbox {
margin: 0 0.2em 0.25em -1.6em;
vertical-align: middle;
}
.d2-3076236447 .md .contains-task-list:dir(rtl) .task-list-item-checkbox {
margin: 0 -1.6em 0.25em 0.2em;
}
</style><style type="text/css"><![CDATA[
.dots-overlay {
fill: url(#dots-d2-3076236447);
mix-blend-mode: multiply;
}
@media (prefers-color-scheme: dark) {
.d2-3076236447 .fill-N1 { fill: #E8E8E8; }
.d2-3076236447 .fill-N2 { fill: #CCCCCC; }
.d2-3076236447 .fill-N3 { fill: #999999; }
.d2-3076236447 .fill-B1 { fill: #E8E8E8; }
.d2-3076236447 .fill-B2 { fill: #7BACFF; }
.d2-3076236447 .fill-B3 { fill: #6AAFDC; }
.d2-3076236447 .fill-N4 { fill: #3A3A44; }
.d2-3076236447 .fill-N5 { fill: #2E2E38; }
.d2-3076236447 .fill-N6 { fill: #252530; }
.d2-3076236447 .fill-N7 { fill: transparent; }
.d2-3076236447 .fill-B4 { fill: #2A2A34; }
.d2-3076236447 .fill-B5 { fill: #1E1E28; }
.d2-3076236447 .fill-B6 { fill: #16161E; }
.d2-3076236447 .stroke-N1 { stroke: #E8E8E8; }
.d2-3076236447 .stroke-N2 { stroke: #CCCCCC; }
.d2-3076236447 .stroke-N3 { stroke: #999999; }
.d2-3076236447 .stroke-N4 { stroke: #555555; }
.d2-3076236447 .stroke-N5 { stroke: #444444; }
.d2-3076236447 .stroke-N6 { stroke: #333333; }
.d2-3076236447 .stroke-N7 { stroke: transparent; }
.d2-3076236447 .stroke-B1 { stroke: #E8E8E8; }
.d2-3076236447 .stroke-B2 { stroke: #7BACFF; }
.d2-3076236447 .stroke-B3 { stroke: #6AAFDC; }
.d2-3076236447 .stroke-B4 { stroke: #3A3A44; }
.d2-3076236447 .stroke-B5 { stroke: #2E2E38; }
.d2-3076236447 .stroke-B6 { stroke: #252530; }
.d2-3076236447 .color-N1 { color: #E8E8E8; }
.d2-3076236447 .color-N2 { color: #CCCCCC; }
.d2-3076236447 .color-N3 { color: #999999; }
.d2-3076236447 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><defs><pattern id="dots-d2-3076236447" x="0" y="0" width="15" height="15" patternUnits="userSpaceOnUse">
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="2" y="2" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="12" y="2" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="12" y="12" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="2" y="12" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="2" y="7" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="12" y="7" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="7" y="2" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="7" y="12" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="7" y="7" width="1" height="1" fill="#0A0F25"/>
</g>
</pattern>
</defs><g class="YWdncmVnYXRlZA=="><g class="shape" ><rect x="246.000000" y="12.000000" width="1136.000000" height="450.000000" stroke="#000410" fill="#E7E9EE" class=" stroke-B1 fill-B4" style="stroke-width:2;" /><rect x="246.000000" y="12.000000" width="1136.000000" height="450.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="251.000000" y="17.000000" width="1126.000000" height="440.000000" stroke="#000410" fill="transparent" class=" stroke-B1" style="stroke-width:2;" /></g><text x="814.000000" y="41.000000" fill="#000410" class="text-mono fill-N1" style="text-anchor:middle;font-size:24px">AGGREGATED</text></g><g class="ZGlzYWdncmVnYXRlZA=="><g class="shape" ><rect x="12.000000" y="482.000000" width="1605.000000" height="450.000000" stroke="#000410" fill="#E7E9EE" class=" stroke-B1 fill-B4" style="stroke-width:2;" /><rect x="12.000000" y="482.000000" width="1605.000000" height="450.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="17.000000" y="487.000000" width="1595.000000" height="440.000000" stroke="#000410" fill="transparent" class=" stroke-B1" style="stroke-width:2;" /></g><text x="814.500000" y="511.000000" fill="#000410" class="text-mono fill-N1" style="text-anchor:middle;font-size:24px">DISAGGREGATED</text></g><g class="YWdncmVnYXRlZC5mcm9udGVuZA=="><g class="shape" ><rect x="592.000000" y="207.000000" width="180.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="682.000000" y="244.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">FRONTEND</text></g><g class="YWdncmVnYXRlZC5yb3V0ZXI="><g class="shape" ><rect x="842.000000" y="207.000000" width="180.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="932.000000" y="244.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">ROUTER</text></g><g class="YWdncmVnYXRlZC53MQ=="><g class="shape" ><rect x="1152.000000" y="87.000000" width="180.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1242.000000" y="124.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">W1 (TP2)</text></g><g class="YWdncmVnYXRlZC53Mg=="><g class="shape" ><rect x="1152.000000" y="167.000000" width="180.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1242.000000" y="204.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">W2 (TP2)</text></g><g class="YWdncmVnYXRlZC53Mw=="><g class="shape" ><rect x="1152.000000" y="247.000000" width="180.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1242.000000" y="284.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">W3 (TP2)</text></g><g class="YWdncmVnYXRlZC53NA=="><g class="shape" ><rect x="1152.000000" y="327.000000" width="180.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1242.000000" y="364.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">W4 (TP2)</text></g><g class="YWdncmVnYXRlZC5ub3Rl"><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="296.000000" y="287.000000" width="476" height="27"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:18px"><p>EACH WORKER HANDLES BOTH PREFILL AND DECODE.</p>
</div></foreignObject></g></g><g class="ZGlzYWdncmVnYXRlZC5mcm9udGVuZA=="><g class="shape" ><rect x="304.000000" y="673.000000" width="180.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="394.000000" y="710.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">FRONTEND</text></g><g class="ZGlzYWdncmVnYXRlZC5yb3V0ZXI="><g class="shape" ><rect x="554.000000" y="673.000000" width="180.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="644.000000" y="710.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">ROUTER</text></g><g class="ZGlzYWdncmVnYXRlZC5wMQ=="><g class="shape" ><rect x="814.000000" y="633.000000" width="220.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="924.000000" y="670.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">PREFILL 1 (TP2)</text></g><g class="ZGlzYWdncmVnYXRlZC5wMg=="><g class="shape" ><rect x="814.000000" y="713.000000" width="220.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="924.000000" y="750.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">PREFILL 2 (TP2)</text></g><g class="ZGlzYWdncmVnYXRlZC5kZWNvZGU="><g class="shape" ><rect x="1347.000000" y="673.000000" width="220.000000" height="60.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="1457.000000" y="710.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:20px">DECODE (TP4)</text></g><g class="ZGlzYWdncmVnYXRlZC5ub3Rl"><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="62.000000" y="753.000000" width="422" height="27"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:18px"><p>PREFILL AND DECODE ON SEPARATE WORKERS.</p>
</div></foreignObject></g></g><g class="YWdncmVnYXRlZC4oZnJvbnRlbmQgLSZndDsgcm91dGVyKVswXQ=="><marker id="mk-d2-3076236447-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#000410" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 774.500000 237.000000 L 838.500000 237.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3076236447-3488378134)" mask="url(#d2-3076236447)" /></g><g class="YWdncmVnYXRlZC4ocm91dGVyIC0mZ3Q7IHcxKVswXQ=="><path d="M 1024.500000 219.000000 L 1062.500000 219.000000 S 1062.500000 219.000000 1062.500000 219.000000 L 1062.500000 117.000000 S 1062.500000 117.000000 1062.500000 117.000000 L 1148.500000 117.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3076236447-3488378134)" mask="url(#d2-3076236447)" /></g><g class="YWdncmVnYXRlZC4ocm91dGVyIC0mZ3Q7IHcyKVswXQ=="><path d="M 1024.500000 231.000000 L 1112.500000 231.000000 S 1112.500000 231.000000 1112.500000 231.000000 L 1112.500000 197.000000 S 1112.500000 197.000000 1112.500000 197.000000 L 1148.500000 197.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3076236447-3488378134)" mask="url(#d2-3076236447)" /></g><g class="YWdncmVnYXRlZC4ocm91dGVyIC0mZ3Q7IHczKVswXQ=="><path d="M 1024.500000 243.000000 L 1112.500000 243.000000 S 1112.500000 243.000000 1112.500000 243.000000 L 1112.500000 277.000000 S 1112.500000 277.000000 1112.500000 277.000000 L 1148.500000 277.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3076236447-3488378134)" mask="url(#d2-3076236447)" /></g><g class="YWdncmVnYXRlZC4ocm91dGVyIC0mZ3Q7IHc0KVswXQ=="><path d="M 1024.500000 255.000000 L 1062.500000 255.000000 S 1062.500000 255.000000 1062.500000 255.000000 L 1062.500000 357.000000 S 1062.500000 357.000000 1062.500000 357.000000 L 1148.500000 357.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3076236447-3488378134)" mask="url(#d2-3076236447)" /></g><g class="ZGlzYWdncmVnYXRlZC4oZnJvbnRlbmQgLSZndDsgcm91dGVyKVswXQ=="><path d="M 486.000000 703.500000 L 550.000000 703.500000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3076236447-3488378134)" mask="url(#d2-3076236447)" /></g><g class="ZGlzYWdncmVnYXRlZC4ocm91dGVyIC0mZ3Q7IHAxKVswXQ=="><path d="M 736.000000 693.500000 L 774.000000 693.500000 S 774.000000 693.500000 774.000000 693.500000 L 774.000000 663.500000 S 774.000000 663.500000 774.000000 663.500000 L 810.000000 663.500000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3076236447-3488378134)" mask="url(#d2-3076236447)" /></g><g class="ZGlzYWdncmVnYXRlZC4ocm91dGVyIC0mZ3Q7IHAyKVswXQ=="><path d="M 736.000000 713.500000 L 774.000000 713.500000 S 774.000000 713.500000 774.000000 713.500000 L 774.000000 743.500000 S 774.000000 743.500000 774.000000 743.500000 L 810.000000 743.500000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3076236447-3488378134)" mask="url(#d2-3076236447)" /></g><g class="ZGlzYWdncmVnYXRlZC4ocDEgLSZndDsgZGVjb2RlKVswXQ=="><path d="M 1036.000000 663.500000 L 1307.000000 663.500000 S 1307.000000 663.500000 1307.000000 663.500000 L 1307.000000 693.500000 S 1307.000000 693.500000 1307.000000 693.500000 L 1343.000000 693.500000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3076236447-3488378134)" mask="url(#d2-3076236447)" /><text x="1205.500000" y="669.000000" fill="#0000B8" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">KV CACHE VIA RDMA</text></g><g class="ZGlzYWdncmVnYXRlZC4ocDIgLSZndDsgZGVjb2RlKVswXQ=="><path d="M 1036.000000 743.500000 L 1307.000000 743.500000 S 1307.000000 743.500000 1307.000000 743.500000 L 1307.000000 713.500000 S 1307.000000 713.500000 1307.000000 713.500000 L 1343.000000 713.500000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3076236447-3488378134)" mask="url(#d2-3076236447)" /><text x="1205.500000" y="749.000000" fill="#0000B8" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">KV CACHE VIA RDMA</text></g><mask id="d2-3076236447" maskUnits="userSpaceOnUse" x="-19" y="-19" width="1667" height="982">
<rect x="-19" y="-19" width="1667" height="982" fill="white"></rect>
<rect x="1122.000000" y="653.000000" width="167" height="21" fill="black"></rect>
<rect x="1122.000000" y="733.000000" width="167" height="21" fill="black"></rect>
</mask></svg></svg>
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 821 1160"><svg class="d2-1215148716 d2-svg" width="821" height="1160" viewBox="-9 -9 821 1160"><rect x="-9.000000" y="-9.000000" width="821.000000" height="1160.000000" rx="0.000000" fill="transparent" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-1215148716 .text-mono {
font-family: "d2-1215148716-font-mono";
}
@font-face {
font-family: d2-1215148716-font-mono;
src: url("data:application/font-woff;base64,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");
}
.d2-1215148716 .text-mono-bold {
font-family: "d2-1215148716-font-mono-bold";
}
@font-face {
font-family: d2-1215148716-font-mono-bold;
src: url("data:application/font-woff;base64,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");
}
.d2-1215148716 .text-mono-italic {
font-family: "d2-1215148716-font-mono-italic";
}
@font-face {
font-family: d2-1215148716-font-mono-italic;
src: url("data:application/font-woff;base64,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");
}
@media (prefers-color-scheme: dark) {
.d2-1215148716 .fill-N1 { fill: #E8E8E8; }
.d2-1215148716 .fill-N2 { fill: #CCCCCC; }
.d2-1215148716 .fill-N3 { fill: #999999; }
.d2-1215148716 .fill-B1 { fill: #E8E8E8; }
.d2-1215148716 .fill-N4 { fill: #3A3A44; }
.d2-1215148716 .fill-N5 { fill: #2E2E38; }
.d2-1215148716 .fill-N6 { fill: #252530; }
.d2-1215148716 .fill-N7 { fill: transparent; }
.d2-1215148716 .fill-B4 { fill: #2A2A34; }
.d2-1215148716 .fill-B5 { fill: #1E1E28; }
.d2-1215148716 .fill-B6 { fill: #16161E; }
.d2-1215148716 .stroke-N1 { stroke: #E8E8E8; }
.d2-1215148716 .stroke-N2 { stroke: #CCCCCC; }
.d2-1215148716 .stroke-N3 { stroke: #999999; }
.d2-1215148716 .stroke-N4 { stroke: #555555; }
.d2-1215148716 .stroke-N5 { stroke: #444444; }
.d2-1215148716 .stroke-N6 { stroke: #333333; }
.d2-1215148716 .stroke-N7 { stroke: transparent; }
.d2-1215148716 .stroke-B1 { stroke: #E8E8E8; }
.d2-1215148716 .stroke-B4 { stroke: #3A3A44; }
.d2-1215148716 .stroke-B5 { stroke: #2E2E38; }
.d2-1215148716 .stroke-B6 { stroke: #252530; }
.d2-1215148716 .color-N1 { color: #E8E8E8; }
.d2-1215148716 .color-N2 { color: #CCCCCC; }
.d2-1215148716 .color-N3 { color: #999999; }
.d2-1215148716 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-1215148716 .fill-N1{fill:#000410;}
.d2-1215148716 .fill-N2{fill:#0000B8;}
.d2-1215148716 .fill-N3{fill:#9499AB;}
.d2-1215148716 .fill-N4{fill:#CFD2DD;}
.d2-1215148716 .fill-N5{fill:#C3DEF3;}
.d2-1215148716 .fill-N6{fill:#EEF1F8;}
.d2-1215148716 .fill-N7{fill:#FFFFFF;}
.d2-1215148716 .fill-B1{fill:#000410;}
.d2-1215148716 .fill-B2{fill:#0000E4;}
.d2-1215148716 .fill-B3{fill:#5AA4DC;}
.d2-1215148716 .fill-B4{fill:#E7E9EE;}
.d2-1215148716 .fill-B5{fill:#F5F6F9;}
.d2-1215148716 .fill-B6{fill:#FFFFFF;}
.d2-1215148716 .fill-AA2{fill:#008566;}
.d2-1215148716 .fill-AA4{fill:#45BBA5;}
.d2-1215148716 .fill-AA5{fill:#7ACCBD;}
.d2-1215148716 .fill-AB4{fill:#F1C759;}
.d2-1215148716 .fill-AB5{fill:#F9E088;}
.d2-1215148716 .stroke-N1{stroke:#000410;}
.d2-1215148716 .stroke-N2{stroke:#0000B8;}
.d2-1215148716 .stroke-N3{stroke:#9499AB;}
.d2-1215148716 .stroke-N4{stroke:#CFD2DD;}
.d2-1215148716 .stroke-N5{stroke:#C3DEF3;}
.d2-1215148716 .stroke-N6{stroke:#EEF1F8;}
.d2-1215148716 .stroke-N7{stroke:#FFFFFF;}
.d2-1215148716 .stroke-B1{stroke:#000410;}
.d2-1215148716 .stroke-B2{stroke:#0000E4;}
.d2-1215148716 .stroke-B3{stroke:#5AA4DC;}
.d2-1215148716 .stroke-B4{stroke:#E7E9EE;}
.d2-1215148716 .stroke-B5{stroke:#F5F6F9;}
.d2-1215148716 .stroke-B6{stroke:#FFFFFF;}
.d2-1215148716 .stroke-AA2{stroke:#008566;}
.d2-1215148716 .stroke-AA4{stroke:#45BBA5;}
.d2-1215148716 .stroke-AA5{stroke:#7ACCBD;}
.d2-1215148716 .stroke-AB4{stroke:#F1C759;}
.d2-1215148716 .stroke-AB5{stroke:#F9E088;}
.d2-1215148716 .background-color-N1{background-color:#000410;}
.d2-1215148716 .background-color-N2{background-color:#0000B8;}
.d2-1215148716 .background-color-N3{background-color:#9499AB;}
.d2-1215148716 .background-color-N4{background-color:#CFD2DD;}
.d2-1215148716 .background-color-N5{background-color:#C3DEF3;}
.d2-1215148716 .background-color-N6{background-color:#EEF1F8;}
.d2-1215148716 .background-color-N7{background-color:#FFFFFF;}
.d2-1215148716 .background-color-B1{background-color:#000410;}
.d2-1215148716 .background-color-B2{background-color:#0000E4;}
.d2-1215148716 .background-color-B3{background-color:#5AA4DC;}
.d2-1215148716 .background-color-B4{background-color:#E7E9EE;}
.d2-1215148716 .background-color-B5{background-color:#F5F6F9;}
.d2-1215148716 .background-color-B6{background-color:#FFFFFF;}
.d2-1215148716 .background-color-AA2{background-color:#008566;}
.d2-1215148716 .background-color-AA4{background-color:#45BBA5;}
.d2-1215148716 .background-color-AA5{background-color:#7ACCBD;}
.d2-1215148716 .background-color-AB4{background-color:#F1C759;}
.d2-1215148716 .background-color-AB5{background-color:#F9E088;}
.d2-1215148716 .color-N1{color:#000410;}
.d2-1215148716 .color-N2{color:#0000B8;}
.d2-1215148716 .color-N3{color:#9499AB;}
.d2-1215148716 .color-N4{color:#CFD2DD;}
.d2-1215148716 .color-N5{color:#C3DEF3;}
.d2-1215148716 .color-N6{color:#EEF1F8;}
.d2-1215148716 .color-N7{color:#FFFFFF;}
.d2-1215148716 .color-B1{color:#000410;}
.d2-1215148716 .color-B2{color:#0000E4;}
.d2-1215148716 .color-B3{color:#5AA4DC;}
.d2-1215148716 .color-B4{color:#E7E9EE;}
.d2-1215148716 .color-B5{color:#F5F6F9;}
.d2-1215148716 .color-B6{color:#FFFFFF;}
.d2-1215148716 .color-AA2{color:#008566;}
.d2-1215148716 .color-AA4{color:#45BBA5;}
.d2-1215148716 .color-AA5{color:#7ACCBD;}
.d2-1215148716 .color-AB4{color:#F1C759;}
.d2-1215148716 .color-AB5{color:#F9E088;}.appendix text.text{fill:#000410}.md{--color-fg-default:#000410;--color-fg-muted:#0000B8;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#000410;--color-border-muted:#0000E4;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0000E4;--color-accent-emphasis:#0000E4;--color-attention-subtle:#0000B8;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-1215148716);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-1215148716);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-normal-d2-1215148716);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-bright-d2-1215148716);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-1215148716);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-1215148716);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-1215148716);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-1215148716);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-normal-d2-1215148716);mix-blend-mode:color-burn}.sketch-overlay-AB4{fill:url(#streaks-normal-d2-1215148716);mix-blend-mode:color-burn}.sketch-overlay-AB5{fill:url(#streaks-normal-d2-1215148716);mix-blend-mode:color-burn}.sketch-overlay-N1{fill:url(#streaks-darker-d2-1215148716);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-darker-d2-1215148716);mix-blend-mode:lighten}.sketch-overlay-N3{fill:url(#streaks-normal-d2-1215148716);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-1215148716);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-normal-d2-1215148716);mix-blend-mode:color-burn}.sketch-overlay-N6{fill:url(#streaks-bright-d2-1215148716);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-1215148716);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}
@media (prefers-color-scheme: dark) {
.d2-1215148716 .fill-N1 { fill: #E8E8E8; }
.d2-1215148716 .fill-N2 { fill: #CCCCCC; }
.d2-1215148716 .fill-N3 { fill: #999999; }
.d2-1215148716 .fill-B1 { fill: #E8E8E8; }
.d2-1215148716 .fill-N4 { fill: #3A3A44; }
.d2-1215148716 .fill-N5 { fill: #2E2E38; }
.d2-1215148716 .fill-N6 { fill: #252530; }
.d2-1215148716 .fill-N7 { fill: transparent; }
.d2-1215148716 .fill-B4 { fill: #2A2A34; }
.d2-1215148716 .fill-B5 { fill: #1E1E28; }
.d2-1215148716 .fill-B6 { fill: #16161E; }
.d2-1215148716 .stroke-N1 { stroke: #E8E8E8; }
.d2-1215148716 .stroke-N2 { stroke: #CCCCCC; }
.d2-1215148716 .stroke-N3 { stroke: #999999; }
.d2-1215148716 .stroke-N4 { stroke: #555555; }
.d2-1215148716 .stroke-N5 { stroke: #444444; }
.d2-1215148716 .stroke-N6 { stroke: #333333; }
.d2-1215148716 .stroke-N7 { stroke: transparent; }
.d2-1215148716 .stroke-B1 { stroke: #E8E8E8; }
.d2-1215148716 .stroke-B4 { stroke: #3A3A44; }
.d2-1215148716 .stroke-B5 { stroke: #2E2E38; }
.d2-1215148716 .stroke-B6 { stroke: #252530; }
.d2-1215148716 .color-N1 { color: #E8E8E8; }
.d2-1215148716 .color-N2 { color: #CCCCCC; }
.d2-1215148716 .color-N3 { color: #999999; }
.d2-1215148716 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><g class="cTE="><g class="shape" ><path d="M 476 136 C 474 136 473 136 472 136 L 252 75 C 250 74 250 73 252 73 L 472 12 C 474 11 478 11 480 12 L 700 72 C 702 73 702 74 700 74 L 480 136 C 479 136 478 136 476 136 Z" stroke="#000410" fill="#CFD2DD" class=" stroke-B1 fill-N4" style="stroke-width:2;" /></g><text x="476.000000" y="71.500000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="476.000000" dy="0.000000">AIC SHOWS DISAGG &gt; AGG</tspan><tspan x="476.000000" dy="18.500000">THROUGHPUT?</tspan></text></g><g class="cTI="><g class="shape" ><path d="M 382 391 C 381 391 380 391 379 391 L 235 330 C 233 329 233 328 235 328 L 379 267 C 381 266 383 266 384 267 L 528 327 C 530 328 530 329 528 329 L 385 391 C 384 391 383 391 382 391 Z" stroke="#000410" fill="#CFD2DD" class=" stroke-B1 fill-N4" style="stroke-width:2;" /></g><text x="382.000000" y="326.500000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="382.000000" dy="0.000000">RDMA AVAILABLE</tspan><tspan x="382.000000" dy="18.500000">IN CLUSTER?</tspan></text></g><g class="cTM="><g class="shape" ><path d="M 260 614 C 258 614 257 614 256 614 L 57 569 C 55 569 55 568 57 567 L 256 522 C 258 522 261 522 263 522 L 463 567 C 465 567 465 568 463 569 L 264 614 C 263 614 262 614 260 614 Z" stroke="#000410" fill="#CFD2DD" class=" stroke-B1 fill-N4" style="stroke-width:2;" /></g><text x="260.000000" y="573.500000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">ISL/OSL RATIO &gt; 8:1?</text></g><g class="cTQ="><g class="shape" ><path d="M 345 869 C 344 869 343 869 343 869 L 216 808 C 215 807 215 806 216 806 L 343 745 C 344 744 346 744 348 745 L 475 805 C 476 806 476 807 475 807 L 347 869 C 347 869 346 869 345 869 Z" stroke="#000410" fill="#CFD2DD" class=" stroke-B1 fill-N4" style="stroke-width:2;" /></g><text x="345.000000" y="804.500000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="345.000000" dy="0.000000">DISAGG &gt; 20%</tspan><tspan x="345.000000" dy="18.500000">FASTER?</tspan></text></g><g class="YWdn"><g class="shape" ><rect x="411.000000" y="1050.000000" width="380.000000" height="80.000000" stroke="#000410" fill="#FFFFFF" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="601.000000" y="1087.500000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="601.000000" dy="0.000000">AGGREGATED</tspan><tspan x="601.000000" dy="18.500000">SIMPLER, NO RDMA NEEDED</tspan></text></g><g class="ZGlzYWdn"><g class="shape" ><rect x="12.000000" y="1050.000000" width="380.000000" height="80.000000" stroke="#000410" fill="#FFFFFF" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="202.000000" y="1087.500000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="202.000000" dy="0.000000">DISAGGREGATED</tspan><tspan x="202.000000" dy="18.500000">HIGHER THROUGHPUT, NEEDS RDMA</tspan></text></g><g class="KHExIC0mZ3Q7IHEyKVswXQ=="><marker id="mk-d2-1215148716-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#000410" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 383.000000 113.000000 L 383.000000 262.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1215148716-3488378134)" mask="url(#d2-1215148716)" /><text x="383.000000" y="194.000000" fill="#0000B8" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">YES</text></g><g class="KHExIC0mZ3Q7IGFnZylbMF0="><path d="M 675.000000 83.000000 L 675.000000 1046.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1215148716-3488378134)" mask="url(#d2-1215148716)" /><text x="675.000000" y="571.000000" fill="#0000B8" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">NO</text></g><g class="KHEyIC0mZ3Q7IHEzKVswXQ=="><path d="M 260.000000 342.000000 L 260.000000 518.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1215148716-3488378134)" mask="url(#d2-1215148716)" /><text x="260.000000" y="437.000000" fill="#0000B8" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">YES</text></g><g class="KHEyIC0mZ3Q7IGFnZylbMF0="><path d="M 431.999966 373.000000 L 431.998993 431.000000 S 431.998993 431.000000 431.998993 431.000000 L 580.166016 431.000000 S 580.166016 431.000000 580.166016 431.000000 L 580.166016 1046.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1215148716-3488378134)" mask="url(#d2-1215148716)" /><text x="580.000000" y="642.000000" fill="#0000B8" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">NO</text></g><g class="KHEzIC0mZ3Q7IGRpc2FnZylbMF0="><path d="M 152.998545 592.999999 L 152.668911 1046.000001" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1215148716-3488378134)" mask="url(#d2-1215148716)" /><text x="153.000000" y="826.000000" fill="#0000B8" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">YES</text></g><g class="KHEzIC0mZ3Q7IHE0KVswXQ=="><path d="M 345.000000 598.000000 L 345.000000 740.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1215148716-3488378134)" mask="url(#d2-1215148716)" /><text x="345.000000" y="676.000000" fill="#0000B8" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">NO</text></g><g class="KHE0IC0mZ3Q7IGRpc2FnZylbMF0="><path d="M 262.998482 831.999999 L 262.836044 1046.000001" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1215148716-3488378134)" mask="url(#d2-1215148716)" /><text x="263.000000" y="946.000000" fill="#0000B8" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">YES</text></g><g class="KHE0IC0mZ3Q7IGFnZylbMF0="><path d="M 397.002012 846.999999 L 397.165985 1010.000000 S 397.165985 1010.000000 397.165985 1010.000000 L 506.998993 1010.000000 S 506.998993 1010.000000 506.998993 1010.000000 L 506.998993 1046.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-1215148716-3488378134)" mask="url(#d2-1215148716)" /><text x="397.000000" y="1008.000000" fill="#0000B8" class="text-mono-italic fill-N2" style="text-anchor:middle;font-size:16px">NO</text></g><mask id="d2-1215148716" maskUnits="userSpaceOnUse" x="-9" y="-9" width="821" height="1160">
<rect x="-9" y="-9" width="821" height="1160" fill="white"></rect>
<rect x="367.000000" y="178.000000" width="32" height="21" fill="black"></rect>
<rect x="663.000000" y="555.000000" width="24" height="21" fill="black"></rect>
<rect x="244.000000" y="421.000000" width="32" height="21" fill="black"></rect>
<rect x="568.000000" y="626.000000" width="24" height="21" fill="black"></rect>
<rect x="137.000000" y="810.000000" width="32" height="21" fill="black"></rect>
<rect x="333.000000" y="660.000000" width="24" height="21" fill="black"></rect>
<rect x="247.000000" y="930.000000" width="32" height="21" fill="black"></rect>
<rect x="385.000000" y="992.000000" width="24" height="21" fill="black"></rect>
</mask></svg></svg>
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 1940 206"><svg class="d2-2903904730 d2-svg" width="1940" height="206" viewBox="-29 -29 1940 206"><rect x="-29.000000" y="-29.000000" width="1940.000000" height="206.000000" rx="0.000000" fill="transparent" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-2903904730 .text {
font-family: "d2-2903904730-font-regular";
}
@font-face {
font-family: d2-2903904730-font-regular;
src: url("data:application/font-woff;base64,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");
}
@font-face {
font-family: d2-2903904730-font-semibold;
src: url("data:application/font-woff;base64,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");
}
.d2-2903904730 .text-mono {
font-family: "d2-2903904730-font-mono";
}
@font-face {
font-family: d2-2903904730-font-mono;
src: url("data:application/font-woff;base64,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");
}
@media (prefers-color-scheme: dark) {
/* Text and connection colors: near-black -> near-white */
.d2-2903904730 .fill-N1 { fill: #E8E8E8; }
.d2-2903904730 .fill-N2 { fill: #CCCCCC; }
.d2-2903904730 .fill-N3 { fill: #999999; }
.d2-2903904730 .fill-B1 { fill: #E8E8E8; }
.d2-2903904730 .fill-B2 { fill: #7BACFF; }
.d2-2903904730 .fill-B3 { fill: #6AAFDC; }
/* Container and node fills: light -> dark */
.d2-2903904730 .fill-N4 { fill: #3A3A44; }
.d2-2903904730 .fill-N5 { fill: #2E2E38; }
.d2-2903904730 .fill-N6 { fill: #252530; }
.d2-2903904730 .fill-N7 { fill: transparent; }
.d2-2903904730 .fill-B4 { fill: #2A2A34; }
.d2-2903904730 .fill-B5 { fill: #1E1E28; }
.d2-2903904730 .fill-B6 { fill: #16161E; }
/* Strokes: near-black -> near-white */
.d2-2903904730 .stroke-N1 { stroke: #E8E8E8; }
.d2-2903904730 .stroke-N2 { stroke: #CCCCCC; }
.d2-2903904730 .stroke-N3 { stroke: #999999; }
.d2-2903904730 .stroke-N4 { stroke: #555555; }
.d2-2903904730 .stroke-N5 { stroke: #444444; }
.d2-2903904730 .stroke-N6 { stroke: #333333; }
.d2-2903904730 .stroke-N7 { stroke: transparent; }
.d2-2903904730 .stroke-B1 { stroke: #E8E8E8; }
.d2-2903904730 .stroke-B2 { stroke: #7BACFF; }
.d2-2903904730 .stroke-B3 { stroke: #6AAFDC; }
.d2-2903904730 .stroke-B4 { stroke: #3A3A44; }
.d2-2903904730 .stroke-B5 { stroke: #2E2E38; }
.d2-2903904730 .stroke-B6 { stroke: #252530; }
/* Text colors */
.d2-2903904730 .color-N1 { color: #E8E8E8; }
.d2-2903904730 .color-N2 { color: #CCCCCC; }
.d2-2903904730 .color-N3 { color: #999999; }
/* Connection marker fills (arrowheads) */
.d2-2903904730 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-2903904730 .fill-N1{fill:#000410;}
.d2-2903904730 .fill-N2{fill:#0000B8;}
.d2-2903904730 .fill-N3{fill:#9499AB;}
.d2-2903904730 .fill-N4{fill:#CFD2DD;}
.d2-2903904730 .fill-N5{fill:#C3DEF3;}
.d2-2903904730 .fill-N6{fill:#EEF1F8;}
.d2-2903904730 .fill-N7{fill:#FFFFFF;}
.d2-2903904730 .fill-B1{fill:#000410;}
.d2-2903904730 .fill-B2{fill:#0000E4;}
.d2-2903904730 .fill-B3{fill:#5AA4DC;}
.d2-2903904730 .fill-B4{fill:#E7E9EE;}
.d2-2903904730 .fill-B5{fill:#F5F6F9;}
.d2-2903904730 .fill-B6{fill:#FFFFFF;}
.d2-2903904730 .fill-AA2{fill:#008566;}
.d2-2903904730 .fill-AA4{fill:#45BBA5;}
.d2-2903904730 .fill-AA5{fill:#7ACCBD;}
.d2-2903904730 .fill-AB4{fill:#F1C759;}
.d2-2903904730 .fill-AB5{fill:#F9E088;}
.d2-2903904730 .stroke-N1{stroke:#000410;}
.d2-2903904730 .stroke-N2{stroke:#0000B8;}
.d2-2903904730 .stroke-N3{stroke:#9499AB;}
.d2-2903904730 .stroke-N4{stroke:#CFD2DD;}
.d2-2903904730 .stroke-N5{stroke:#C3DEF3;}
.d2-2903904730 .stroke-N6{stroke:#EEF1F8;}
.d2-2903904730 .stroke-N7{stroke:#FFFFFF;}
.d2-2903904730 .stroke-B1{stroke:#000410;}
.d2-2903904730 .stroke-B2{stroke:#0000E4;}
.d2-2903904730 .stroke-B3{stroke:#5AA4DC;}
.d2-2903904730 .stroke-B4{stroke:#E7E9EE;}
.d2-2903904730 .stroke-B5{stroke:#F5F6F9;}
.d2-2903904730 .stroke-B6{stroke:#FFFFFF;}
.d2-2903904730 .stroke-AA2{stroke:#008566;}
.d2-2903904730 .stroke-AA4{stroke:#45BBA5;}
.d2-2903904730 .stroke-AA5{stroke:#7ACCBD;}
.d2-2903904730 .stroke-AB4{stroke:#F1C759;}
.d2-2903904730 .stroke-AB5{stroke:#F9E088;}
.d2-2903904730 .background-color-N1{background-color:#000410;}
.d2-2903904730 .background-color-N2{background-color:#0000B8;}
.d2-2903904730 .background-color-N3{background-color:#9499AB;}
.d2-2903904730 .background-color-N4{background-color:#CFD2DD;}
.d2-2903904730 .background-color-N5{background-color:#C3DEF3;}
.d2-2903904730 .background-color-N6{background-color:#EEF1F8;}
.d2-2903904730 .background-color-N7{background-color:#FFFFFF;}
.d2-2903904730 .background-color-B1{background-color:#000410;}
.d2-2903904730 .background-color-B2{background-color:#0000E4;}
.d2-2903904730 .background-color-B3{background-color:#5AA4DC;}
.d2-2903904730 .background-color-B4{background-color:#E7E9EE;}
.d2-2903904730 .background-color-B5{background-color:#F5F6F9;}
.d2-2903904730 .background-color-B6{background-color:#FFFFFF;}
.d2-2903904730 .background-color-AA2{background-color:#008566;}
.d2-2903904730 .background-color-AA4{background-color:#45BBA5;}
.d2-2903904730 .background-color-AA5{background-color:#7ACCBD;}
.d2-2903904730 .background-color-AB4{background-color:#F1C759;}
.d2-2903904730 .background-color-AB5{background-color:#F9E088;}
.d2-2903904730 .color-N1{color:#000410;}
.d2-2903904730 .color-N2{color:#0000B8;}
.d2-2903904730 .color-N3{color:#9499AB;}
.d2-2903904730 .color-N4{color:#CFD2DD;}
.d2-2903904730 .color-N5{color:#C3DEF3;}
.d2-2903904730 .color-N6{color:#EEF1F8;}
.d2-2903904730 .color-N7{color:#FFFFFF;}
.d2-2903904730 .color-B1{color:#000410;}
.d2-2903904730 .color-B2{color:#0000E4;}
.d2-2903904730 .color-B3{color:#5AA4DC;}
.d2-2903904730 .color-B4{color:#E7E9EE;}
.d2-2903904730 .color-B5{color:#F5F6F9;}
.d2-2903904730 .color-B6{color:#FFFFFF;}
.d2-2903904730 .color-AA2{color:#008566;}
.d2-2903904730 .color-AA4{color:#45BBA5;}
.d2-2903904730 .color-AA5{color:#7ACCBD;}
.d2-2903904730 .color-AB4{color:#F1C759;}
.d2-2903904730 .color-AB5{color:#F9E088;}.appendix text.text{fill:#000410}.md{--color-fg-default:#000410;--color-fg-muted:#0000B8;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#000410;--color-border-muted:#0000E4;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0000E4;--color-accent-emphasis:#0000E4;--color-attention-subtle:#0000B8;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-2903904730);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-2903904730);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-normal-d2-2903904730);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-bright-d2-2903904730);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-2903904730);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-2903904730);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-2903904730);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-2903904730);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-normal-d2-2903904730);mix-blend-mode:color-burn}.sketch-overlay-AB4{fill:url(#streaks-normal-d2-2903904730);mix-blend-mode:color-burn}.sketch-overlay-AB5{fill:url(#streaks-normal-d2-2903904730);mix-blend-mode:color-burn}.sketch-overlay-N1{fill:url(#streaks-darker-d2-2903904730);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-darker-d2-2903904730);mix-blend-mode:lighten}.sketch-overlay-N3{fill:url(#streaks-normal-d2-2903904730);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-2903904730);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-normal-d2-2903904730);mix-blend-mode:color-burn}.sketch-overlay-N6{fill:url(#streaks-bright-d2-2903904730);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-2903904730);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}
@media (prefers-color-scheme: dark) {
/* Text and connection colors: near-black -> near-white */
.d2-2903904730 .fill-N1 { fill: #E8E8E8; }
.d2-2903904730 .fill-N2 { fill: #CCCCCC; }
.d2-2903904730 .fill-N3 { fill: #999999; }
.d2-2903904730 .fill-B1 { fill: #E8E8E8; }
.d2-2903904730 .fill-B2 { fill: #7BACFF; }
.d2-2903904730 .fill-B3 { fill: #6AAFDC; }
/* Container and node fills: light -> dark */
.d2-2903904730 .fill-N4 { fill: #3A3A44; }
.d2-2903904730 .fill-N5 { fill: #2E2E38; }
.d2-2903904730 .fill-N6 { fill: #252530; }
.d2-2903904730 .fill-N7 { fill: transparent; }
.d2-2903904730 .fill-B4 { fill: #2A2A34; }
.d2-2903904730 .fill-B5 { fill: #1E1E28; }
.d2-2903904730 .fill-B6 { fill: #16161E; }
/* Strokes: near-black -> near-white */
.d2-2903904730 .stroke-N1 { stroke: #E8E8E8; }
.d2-2903904730 .stroke-N2 { stroke: #CCCCCC; }
.d2-2903904730 .stroke-N3 { stroke: #999999; }
.d2-2903904730 .stroke-N4 { stroke: #555555; }
.d2-2903904730 .stroke-N5 { stroke: #444444; }
.d2-2903904730 .stroke-N6 { stroke: #333333; }
.d2-2903904730 .stroke-N7 { stroke: transparent; }
.d2-2903904730 .stroke-B1 { stroke: #E8E8E8; }
.d2-2903904730 .stroke-B2 { stroke: #7BACFF; }
.d2-2903904730 .stroke-B3 { stroke: #6AAFDC; }
.d2-2903904730 .stroke-B4 { stroke: #3A3A44; }
.d2-2903904730 .stroke-B5 { stroke: #2E2E38; }
.d2-2903904730 .stroke-B6 { stroke: #252530; }
/* Text colors */
.d2-2903904730 .color-N1 { color: #E8E8E8; }
.d2-2903904730 .color-N2 { color: #CCCCCC; }
.d2-2903904730 .color-N3 { color: #999999; }
/* Connection marker fills (arrowheads) */
.d2-2903904730 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><style type="text/css">.d2-2903904730 .md em,
.d2-2903904730 .md dfn {
font-family: "d2-2903904730-font-italic";
}
.d2-2903904730 .md b,
.d2-2903904730 .md strong {
font-family: "d2-2903904730-font-bold";
}
.d2-2903904730 .md code,
.d2-2903904730 .md kbd,
.d2-2903904730 .md pre,
.d2-2903904730 .md samp {
font-family: "d2-2903904730-font-mono";
font-size: 1em;
}
.d2-2903904730 .md {
tab-size: 4;
}
/* variables are provided in d2renderers/d2svg/d2svg.go */
.d2-2903904730 .md {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
margin: 0;
background-color: transparent; /* we don't want to define the background color */
font-family: "d2-2903904730-font-regular";
font-size: 16px;
line-height: 1.5;
word-wrap: break-word;
}
.d2-2903904730 .md details,
.d2-2903904730 .md figcaption,
.d2-2903904730 .md figure {
display: block;
}
.d2-2903904730 .md summary {
display: list-item;
}
.d2-2903904730 .md [hidden] {
display: none !important;
}
.d2-2903904730 .md a {
background-color: transparent;
color: var(--color-accent-fg);
text-decoration: none;
}
.d2-2903904730 .md a:active,
.d2-2903904730 .md a:hover {
outline-width: 0;
}
.d2-2903904730 .md abbr[title] {
border-bottom: none;
text-decoration: underline dotted;
}
.d2-2903904730 .md dfn {
font-style: italic;
}
.d2-2903904730 .md h1 {
margin: 0.67em 0;
padding-bottom: 0.3em;
font-size: 2em;
border-bottom: 1px solid var(--color-border-muted);
}
.d2-2903904730 .md mark {
background-color: var(--color-attention-subtle);
color: var(--color-text-primary);
}
.d2-2903904730 .md small {
font-size: 90%;
}
.d2-2903904730 .md sub,
.d2-2903904730 .md sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
.d2-2903904730 .md sub {
bottom: -0.25em;
}
.d2-2903904730 .md sup {
top: -0.5em;
}
.d2-2903904730 .md img {
border-style: none;
max-width: 100%;
box-sizing: content-box;
background-color: var(--color-canvas-default);
}
.d2-2903904730 .md figure {
margin: 1em 40px;
}
.d2-2903904730 .md hr {
box-sizing: content-box;
overflow: hidden;
background: transparent;
border-bottom: 1px solid var(--color-border-muted);
height: 0.25em;
padding: 0;
margin: 24px 0;
background-color: var(--color-border-default);
border: 0;
}
.d2-2903904730 .md input {
font: inherit;
margin: 0;
overflow: visible;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
.d2-2903904730 .md [type="button"],
.d2-2903904730 .md [type="reset"],
.d2-2903904730 .md [type="submit"] {
-webkit-appearance: button;
}
.d2-2903904730 .md [type="button"]::-moz-focus-inner,
.d2-2903904730 .md [type="reset"]::-moz-focus-inner,
.d2-2903904730 .md [type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
.d2-2903904730 .md [type="button"]:-moz-focusring,
.d2-2903904730 .md [type="reset"]:-moz-focusring,
.d2-2903904730 .md [type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
.d2-2903904730 .md [type="checkbox"],
.d2-2903904730 .md [type="radio"] {
box-sizing: border-box;
padding: 0;
}
.d2-2903904730 .md [type="number"]::-webkit-inner-spin-button,
.d2-2903904730 .md [type="number"]::-webkit-outer-spin-button {
height: auto;
}
.d2-2903904730 .md [type="search"] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
.d2-2903904730 .md [type="search"]::-webkit-search-cancel-button,
.d2-2903904730 .md [type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
.d2-2903904730 .md ::-webkit-input-placeholder {
color: inherit;
opacity: 0.54;
}
.d2-2903904730 .md ::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
.d2-2903904730 .md a:hover {
text-decoration: underline;
}
.d2-2903904730 .md hr::before {
display: table;
content: "";
}
.d2-2903904730 .md hr::after {
display: table;
clear: both;
content: "";
}
.d2-2903904730 .md table {
border-spacing: 0;
border-collapse: collapse;
display: block;
width: max-content;
max-width: 100%;
overflow: auto;
}
.d2-2903904730 .md td,
.d2-2903904730 .md th {
padding: 0;
}
.d2-2903904730 .md details summary {
cursor: pointer;
}
.d2-2903904730 .md details:not([open]) > *:not(summary) {
display: none !important;
}
.d2-2903904730 .md kbd {
display: inline-block;
padding: 3px 5px;
color: var(--color-fg-default);
vertical-align: middle;
background-color: var(--color-canvas-subtle);
border: solid 1px var(--color-neutral-muted);
border-bottom-color: var(--color-neutral-muted);
border-radius: 6px;
box-shadow: inset 0 -1px 0 var(--color-neutral-muted);
}
.d2-2903904730 .md h1,
.d2-2903904730 .md h2,
.d2-2903904730 .md h3,
.d2-2903904730 .md h4,
.d2-2903904730 .md h5,
.d2-2903904730 .md h6 {
margin-top: 24px;
margin-bottom: 16px;
font-weight: 400;
line-height: 1.25;
font-family: "d2-2903904730-font-semibold";
}
.d2-2903904730 .md h2 {
padding-bottom: 0.3em;
font-size: 1.5em;
border-bottom: 1px solid var(--color-border-muted);
}
.d2-2903904730 .md h3 {
font-size: 1.25em;
}
.d2-2903904730 .md h4 {
font-size: 1em;
}
.d2-2903904730 .md h5 {
font-size: 0.875em;
}
.d2-2903904730 .md h6 {
font-size: 0.85em;
color: var(--color-fg-muted);
}
.d2-2903904730 .md p {
margin-top: 0;
margin-bottom: 10px;
}
.d2-2903904730 .md blockquote {
margin: 0;
padding: 0 1em;
color: var(--color-fg-muted);
border-left: 0.25em solid var(--color-border-default);
}
.d2-2903904730 .md ul,
.d2-2903904730 .md ol {
margin-top: 0;
margin-bottom: 0;
padding-left: 2em;
}
.d2-2903904730 .md ol ol,
.d2-2903904730 .md ul ol {
list-style-type: lower-roman;
}
.d2-2903904730 .md ul ul ol,
.d2-2903904730 .md ul ol ol,
.d2-2903904730 .md ol ul ol,
.d2-2903904730 .md ol ol ol {
list-style-type: lower-alpha;
}
.d2-2903904730 .md dd {
margin-left: 0;
}
.d2-2903904730 .md pre {
margin-top: 0;
margin-bottom: 0;
word-wrap: normal;
}
.d2-2903904730 .md ::placeholder {
color: var(--color-fg-subtle);
opacity: 1;
}
.d2-2903904730 .md input::-webkit-outer-spin-button,
.d2-2903904730 .md input::-webkit-inner-spin-button {
margin: 0;
-webkit-appearance: none;
appearance: none;
}
.d2-2903904730 .md::before {
display: table;
content: "";
}
.d2-2903904730 .md::after {
display: table;
clear: both;
content: "";
}
.d2-2903904730 .md > *:first-child {
margin-top: 0 !important;
}
.d2-2903904730 .md > *:last-child {
margin-bottom: 0 !important;
}
.d2-2903904730 .md a:not([href]) {
color: inherit;
text-decoration: none;
}
.d2-2903904730 .md .absent {
color: var(--color-danger-fg);
}
.d2-2903904730 .md .anchor {
float: left;
padding-right: 4px;
margin-left: -20px;
line-height: 1;
}
.d2-2903904730 .md .anchor:focus {
outline: none;
}
.d2-2903904730 .md p,
.d2-2903904730 .md blockquote,
.d2-2903904730 .md ul,
.d2-2903904730 .md ol,
.d2-2903904730 .md dl,
.d2-2903904730 .md table,
.d2-2903904730 .md pre,
.d2-2903904730 .md details {
margin-top: 0;
margin-bottom: 16px;
}
.d2-2903904730 .md blockquote > :first-child {
margin-top: 0;
}
.d2-2903904730 .md blockquote > :last-child {
margin-bottom: 0;
}
.d2-2903904730 .md sup > a::before {
content: "[";
}
.d2-2903904730 .md sup > a::after {
content: "]";
}
.d2-2903904730 .md h1:hover .anchor,
.d2-2903904730 .md h2:hover .anchor,
.d2-2903904730 .md h3:hover .anchor,
.d2-2903904730 .md h4:hover .anchor,
.d2-2903904730 .md h5:hover .anchor,
.d2-2903904730 .md h6:hover .anchor {
text-decoration: none;
}
.d2-2903904730 .md h1 tt,
.d2-2903904730 .md h1 code,
.d2-2903904730 .md h2 tt,
.d2-2903904730 .md h2 code,
.d2-2903904730 .md h3 tt,
.d2-2903904730 .md h3 code,
.d2-2903904730 .md h4 tt,
.d2-2903904730 .md h4 code,
.d2-2903904730 .md h5 tt,
.d2-2903904730 .md h5 code,
.d2-2903904730 .md h6 tt,
.d2-2903904730 .md h6 code {
padding: 0 0.2em;
font-size: inherit;
}
.d2-2903904730 .md ul.no-list,
.d2-2903904730 .md ol.no-list {
padding: 0;
list-style-type: none;
}
.d2-2903904730 .md ol[type="1"] {
list-style-type: decimal;
}
.d2-2903904730 .md ol[type="a"] {
list-style-type: lower-alpha;
}
.d2-2903904730 .md ol[type="i"] {
list-style-type: lower-roman;
}
.d2-2903904730 .md div > ol:not([type]) {
list-style-type: decimal;
}
.d2-2903904730 .md ul ul,
.d2-2903904730 .md ul ol,
.d2-2903904730 .md ol ol,
.d2-2903904730 .md ol ul {
margin-top: 0;
margin-bottom: 0;
}
.d2-2903904730 .md li > p {
margin-top: 16px;
}
.d2-2903904730 .md li + li {
margin-top: 0.25em;
}
.d2-2903904730 .md dl {
padding: 0;
}
.d2-2903904730 .md dl dt {
padding: 0;
margin-top: 16px;
font-size: 1em;
font-style: italic;
font-family: "d2-2903904730-font-semibold";
}
.d2-2903904730 .md dl dd {
padding: 0 16px;
margin-bottom: 16px;
}
.d2-2903904730 .md table th {
font-family: "d2-2903904730-font-semibold";
}
.d2-2903904730 .md table th,
.d2-2903904730 .md table td {
padding: 6px 13px;
border: 1px solid var(--color-border-default);
}
.d2-2903904730 .md table tr {
background-color: var(--color-canvas-default);
border-top: 1px solid var(--color-border-muted);
}
.d2-2903904730 .md table tr:nth-child(2n) {
background-color: var(--color-canvas-subtle);
}
.d2-2903904730 .md table img {
background-color: transparent;
}
.d2-2903904730 .md img[align="right"] {
padding-left: 20px;
}
.d2-2903904730 .md img[align="left"] {
padding-right: 20px;
}
.d2-2903904730 .md span.frame {
display: block;
overflow: hidden;
}
.d2-2903904730 .md span.frame > span {
display: block;
float: left;
width: auto;
padding: 7px;
margin: 13px 0 0;
overflow: hidden;
border: 1px solid var(--color-border-default);
}
.d2-2903904730 .md span.frame span img {
display: block;
float: left;
}
.d2-2903904730 .md span.frame span span {
display: block;
padding: 5px 0 0;
clear: both;
color: var(--color-fg-default);
}
.d2-2903904730 .md span.align-center {
display: block;
overflow: hidden;
clear: both;
}
.d2-2903904730 .md span.align-center > span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: center;
}
.d2-2903904730 .md span.align-center span img {
margin: 0 auto;
text-align: center;
}
.d2-2903904730 .md span.align-right {
display: block;
overflow: hidden;
clear: both;
}
.d2-2903904730 .md span.align-right > span {
display: block;
margin: 13px 0 0;
overflow: hidden;
text-align: right;
}
.d2-2903904730 .md span.align-right span img {
margin: 0;
text-align: right;
}
.d2-2903904730 .md span.float-left {
display: block;
float: left;
margin-right: 13px;
overflow: hidden;
}
.d2-2903904730 .md span.float-left span {
margin: 13px 0 0;
}
.d2-2903904730 .md span.float-right {
display: block;
float: right;
margin-left: 13px;
overflow: hidden;
}
.d2-2903904730 .md span.float-right > span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: right;
}
.d2-2903904730 .md code,
.d2-2903904730 .md tt {
padding: 0.2em 0.4em;
margin: 0;
font-size: 85%;
background-color: var(--color-neutral-muted);
border-radius: 6px;
}
.d2-2903904730 .md code br,
.d2-2903904730 .md tt br {
display: none;
}
.d2-2903904730 .md del code {
text-decoration: inherit;
}
.d2-2903904730 .md pre code {
font-size: 100%;
}
.d2-2903904730 .md pre > code {
padding: 0;
margin: 0;
word-break: normal;
white-space: pre;
background: transparent;
border: 0;
}
.d2-2903904730 .md .highlight {
margin-bottom: 16px;
}
.d2-2903904730 .md .highlight pre {
margin-bottom: 0;
word-break: normal;
}
.d2-2903904730 .md .highlight pre,
.d2-2903904730 .md pre {
padding: 16px;
overflow: auto;
font-size: 85%;
line-height: 1.45;
background-color: var(--color-canvas-subtle);
border-radius: 6px;
}
.d2-2903904730 .md pre code,
.d2-2903904730 .md pre tt {
display: inline;
max-width: auto;
padding: 0;
margin: 0;
overflow: visible;
line-height: inherit;
word-wrap: normal;
background-color: transparent;
border: 0;
}
.d2-2903904730 .md .csv-data td,
.d2-2903904730 .md .csv-data th {
padding: 5px;
overflow: hidden;
font-size: 12px;
line-height: 1;
text-align: left;
white-space: nowrap;
}
.d2-2903904730 .md .csv-data .blob-num {
padding: 10px 8px 9px;
text-align: right;
background: var(--color-canvas-default);
border: 0;
}
.d2-2903904730 .md .csv-data tr {
border-top: 0;
}
.d2-2903904730 .md .csv-data th {
font-family: "d2-2903904730-font-semibold";
background: var(--color-canvas-subtle);
border-top: 0;
}
.d2-2903904730 .md .footnotes {
font-size: 12px;
color: var(--color-fg-muted);
border-top: 1px solid var(--color-border-default);
}
.d2-2903904730 .md .footnotes ol {
padding-left: 16px;
}
.d2-2903904730 .md .footnotes li {
position: relative;
}
.d2-2903904730 .md .footnotes li:target::before {
position: absolute;
top: -8px;
right: -8px;
bottom: -8px;
left: -24px;
pointer-events: none;
content: "";
border: 2px solid var(--color-accent-emphasis);
border-radius: 6px;
}
.d2-2903904730 .md .footnotes li:target {
color: var(--color-fg-default);
}
.d2-2903904730 .md .task-list-item {
list-style-type: none;
}
.d2-2903904730 .md .task-list-item label {
font-weight: 400;
}
.d2-2903904730 .md .task-list-item.enabled label {
cursor: pointer;
}
.d2-2903904730 .md .task-list-item + .task-list-item {
margin-top: 3px;
}
.d2-2903904730 .md .task-list-item .handle {
display: none;
}
.d2-2903904730 .md .task-list-item-checkbox {
margin: 0 0.2em 0.25em -1.6em;
vertical-align: middle;
}
.d2-2903904730 .md .contains-task-list:dir(rtl) .task-list-item-checkbox {
margin: 0 -1.6em 0.25em 0.2em;
}
</style><style type="text/css"><![CDATA[
.dots-overlay {
fill: url(#dots-d2-2903904730);
mix-blend-mode: multiply;
}
@media (prefers-color-scheme: dark) {
/* Text and connection colors: near-black -> near-white */
.d2-2903904730 .fill-N1 { fill: #E8E8E8; }
.d2-2903904730 .fill-N2 { fill: #CCCCCC; }
.d2-2903904730 .fill-N3 { fill: #999999; }
.d2-2903904730 .fill-B1 { fill: #E8E8E8; }
.d2-2903904730 .fill-B2 { fill: #7BACFF; }
.d2-2903904730 .fill-B3 { fill: #6AAFDC; }
/* Container and node fills: light -> dark */
.d2-2903904730 .fill-N4 { fill: #3A3A44; }
.d2-2903904730 .fill-N5 { fill: #2E2E38; }
.d2-2903904730 .fill-N6 { fill: #252530; }
.d2-2903904730 .fill-N7 { fill: transparent; }
.d2-2903904730 .fill-B4 { fill: #2A2A34; }
.d2-2903904730 .fill-B5 { fill: #1E1E28; }
.d2-2903904730 .fill-B6 { fill: #16161E; }
/* Strokes: near-black -> near-white */
.d2-2903904730 .stroke-N1 { stroke: #E8E8E8; }
.d2-2903904730 .stroke-N2 { stroke: #CCCCCC; }
.d2-2903904730 .stroke-N3 { stroke: #999999; }
.d2-2903904730 .stroke-N4 { stroke: #555555; }
.d2-2903904730 .stroke-N5 { stroke: #444444; }
.d2-2903904730 .stroke-N6 { stroke: #333333; }
.d2-2903904730 .stroke-N7 { stroke: transparent; }
.d2-2903904730 .stroke-B1 { stroke: #E8E8E8; }
.d2-2903904730 .stroke-B2 { stroke: #7BACFF; }
.d2-2903904730 .stroke-B3 { stroke: #6AAFDC; }
.d2-2903904730 .stroke-B4 { stroke: #3A3A44; }
.d2-2903904730 .stroke-B5 { stroke: #2E2E38; }
.d2-2903904730 .stroke-B6 { stroke: #252530; }
/* Text colors */
.d2-2903904730 .color-N1 { color: #E8E8E8; }
.d2-2903904730 .color-N2 { color: #CCCCCC; }
.d2-2903904730 .color-N3 { color: #999999; }
/* Connection marker fills (arrowheads) */
.d2-2903904730 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><defs><pattern id="dots-d2-2903904730" x="0" y="0" width="15" height="15" patternUnits="userSpaceOnUse">
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="2" y="2" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="12" y="2" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="12" y="12" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="2" y="12" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="2" y="7" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="12" y="7" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="7" y="2" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="7" y="12" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="7" y="7" width="1" height="1" fill="#0A0F25"/>
</g>
</pattern>
</defs><g class="aW5zdGFsbA=="><g class="shape" ><rect x="12.000000" y="12.000000" width="360.000000" height="124.000000" stroke="#000410" fill="#E7E9EE" class=" stroke-B1 fill-B4" style="stroke-width:2;" /><rect x="12.000000" y="12.000000" width="360.000000" height="124.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="17.000000" y="17.000000" width="350.000000" height="114.000000" stroke="#000410" fill="transparent" class=" stroke-B1" style="stroke-width:2;" /></g><text x="192.000000" y="45.000000" fill="#000410" class="text-mono fill-N1" style="text-anchor:middle;font-size:28px">INSTALL</text></g><g class="Y29uZmlndXJl"><g class="shape" ><rect x="442.000000" y="12.000000" width="331.000000" height="124.000000" stroke="#000410" fill="#E7E9EE" class=" stroke-B1 fill-B4" style="stroke-width:2;" /><rect x="442.000000" y="12.000000" width="331.000000" height="124.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="447.000000" y="17.000000" width="321.000000" height="114.000000" stroke="#000410" fill="transparent" class=" stroke-B1" style="stroke-width:2;" /></g><text x="607.500000" y="45.000000" fill="#000410" class="text-mono fill-N1" style="text-anchor:middle;font-size:28px">CONFIGURE</text></g><g class="Y29tcGFyZQ=="><g class="shape" ><rect x="843.000000" y="12.000000" width="312.000000" height="124.000000" stroke="#000410" fill="#E7E9EE" class=" stroke-B1 fill-B4" style="stroke-width:2;" /><rect x="843.000000" y="12.000000" width="312.000000" height="124.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="848.000000" y="17.000000" width="302.000000" height="114.000000" stroke="#000410" fill="transparent" class=" stroke-B1" style="stroke-width:2;" /></g><text x="999.000000" y="45.000000" fill="#000410" class="text-mono fill-N1" style="text-anchor:middle;font-size:28px">COMPARE</text></g><g class="ZGVwbG95"><g class="shape" ><rect x="1225.000000" y="12.000000" width="273.000000" height="124.000000" stroke="#000410" fill="#E7E9EE" class=" stroke-B1 fill-B4" style="stroke-width:2;" /><rect x="1225.000000" y="12.000000" width="273.000000" height="124.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="1230.000000" y="17.000000" width="263.000000" height="114.000000" stroke="#000410" fill="transparent" class=" stroke-B1" style="stroke-width:2;" /></g><text x="1361.500000" y="45.000000" fill="#000410" class="text-mono fill-N1" style="text-anchor:middle;font-size:28px">DEPLOY</text></g><g class="dmFsaWRhdGU="><g class="shape" ><rect x="1568.000000" y="12.000000" width="302.000000" height="124.000000" stroke="#000410" fill="#E7E9EE" class=" stroke-B1 fill-B4" style="stroke-width:2;" /><rect x="1568.000000" y="12.000000" width="302.000000" height="124.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="1573.000000" y="17.000000" width="292.000000" height="114.000000" stroke="#000410" fill="transparent" class=" stroke-B1" style="stroke-width:2;" /></g><text x="1719.000000" y="45.000000" fill="#000410" class="text-mono fill-N1" style="text-anchor:middle;font-size:28px">VALIDATE</text></g><g class="aW5zdGFsbC5pbnN0YWxsX2RldGFpbA=="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="62.000000" y="62.000000" width="260" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1"><p>PIP3 INSTALL
AICONFIGURATOR</p>
</div></foreignObject></g></g><g class="Y29uZmlndXJlLmNvbmZpZ3VyZV9kZXRhaWw="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="492.000000" y="62.000000" width="231" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1"><p>MODEL, GPUS,
SLA TARGETS</p>
</div></foreignObject></g></g><g class="Y29tcGFyZS5jb21wYXJlX2RldGFpbA=="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="893.000000" y="62.000000" width="212" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1"><p>AGG VS DISAGG
RANKINGS</p>
</div></foreignObject></g></g><g class="ZGVwbG95LmRlcGxveV9kZXRhaWw="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="1275.000000" y="62.000000" width="173" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1"><p>APPLY DGD
MANIFEST</p>
</div></foreignObject></g></g><g class="dmFsaWRhdGUudmFsaWRhdGVfZGV0YWls"><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="1618.000000" y="62.000000" width="202" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1"><p>BENCHMARK
WITH AIPERF</p>
</div></foreignObject></g></g><g class="KGluc3RhbGwgLSZndDsgY29uZmlndXJlKVswXQ=="><marker id="mk-d2-2903904730-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#000410" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 374.000000 74.000000 L 438.000000 74.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2903904730-3488378134)" mask="url(#d2-2903904730)" /></g><g class="KGNvbmZpZ3VyZSAtJmd0OyBjb21wYXJlKVswXQ=="><path d="M 775.000000 74.000000 L 839.000000 74.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2903904730-3488378134)" mask="url(#d2-2903904730)" /></g><g class="KGNvbXBhcmUgLSZndDsgZGVwbG95KVswXQ=="><path d="M 1157.000000 74.000000 L 1221.000000 74.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2903904730-3488378134)" mask="url(#d2-2903904730)" /></g><g class="KGRlcGxveSAtJmd0OyB2YWxpZGF0ZSlbMF0="><path d="M 1500.000000 74.000000 L 1564.000000 74.000000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2903904730-3488378134)" mask="url(#d2-2903904730)" /></g><mask id="d2-2903904730" maskUnits="userSpaceOnUse" x="-29" y="-29" width="1940" height="206">
<rect x="-29" y="-29" width="1940" height="206" fill="white"></rect>
</mask></svg></svg>
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 962 567"><svg class="d2-2851460652 d2-svg" width="962" height="567" viewBox="-29 -29 962 567"><rect x="-29.000000" y="-29.000000" width="962.000000" height="567.000000" rx="0.000000" fill="transparent" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-2851460652 .text-mono {
font-family: "d2-2851460652-font-mono";
}
@font-face {
font-family: d2-2851460652-font-mono;
src: url("data:application/font-woff;base64,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");
}
.d2-2851460652 .text-mono-bold {
font-family: "d2-2851460652-font-mono-bold";
}
@font-face {
font-family: d2-2851460652-font-mono-bold;
src: url("data:application/font-woff;base64,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");
}
@media (prefers-color-scheme: dark) {
.d2-2851460652 .fill-N1 { fill: #E8E8E8; }
.d2-2851460652 .fill-N2 { fill: #CCCCCC; }
.d2-2851460652 .fill-N3 { fill: #999999; }
.d2-2851460652 .fill-B1 { fill: #E8E8E8; }
.d2-2851460652 .fill-B2 { fill: #7BACFF; }
.d2-2851460652 .fill-B3 { fill: #6AAFDC; }
.d2-2851460652 .fill-N4 { fill: #3A3A44; }
.d2-2851460652 .fill-N5 { fill: #2E2E38; }
.d2-2851460652 .fill-N6 { fill: #252530; }
.d2-2851460652 .fill-N7 { fill: transparent; }
.d2-2851460652 .fill-B4 { fill: #2A2A34; }
.d2-2851460652 .fill-B5 { fill: #1E1E28; }
.d2-2851460652 .fill-B6 { fill: #16161E; }
.d2-2851460652 .stroke-N1 { stroke: #E8E8E8; }
.d2-2851460652 .stroke-N2 { stroke: #CCCCCC; }
.d2-2851460652 .stroke-N3 { stroke: #999999; }
.d2-2851460652 .stroke-N4 { stroke: #555555; }
.d2-2851460652 .stroke-N5 { stroke: #444444; }
.d2-2851460652 .stroke-N6 { stroke: #333333; }
.d2-2851460652 .stroke-N7 { stroke: transparent; }
.d2-2851460652 .stroke-B1 { stroke: #E8E8E8; }
.d2-2851460652 .stroke-B2 { stroke: #7BACFF; }
.d2-2851460652 .stroke-B3 { stroke: #6AAFDC; }
.d2-2851460652 .stroke-B4 { stroke: #3A3A44; }
.d2-2851460652 .stroke-B5 { stroke: #2E2E38; }
.d2-2851460652 .stroke-B6 { stroke: #252530; }
.d2-2851460652 .color-N1 { color: #E8E8E8; }
.d2-2851460652 .color-N2 { color: #CCCCCC; }
.d2-2851460652 .color-N3 { color: #999999; }
.d2-2851460652 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-2851460652 .fill-N1{fill:#000410;}
.d2-2851460652 .fill-N2{fill:#0000B8;}
.d2-2851460652 .fill-N3{fill:#9499AB;}
.d2-2851460652 .fill-N4{fill:#CFD2DD;}
.d2-2851460652 .fill-N5{fill:#C3DEF3;}
.d2-2851460652 .fill-N6{fill:#EEF1F8;}
.d2-2851460652 .fill-N7{fill:#FFFFFF;}
.d2-2851460652 .fill-B1{fill:#000410;}
.d2-2851460652 .fill-B2{fill:#0000E4;}
.d2-2851460652 .fill-B3{fill:#5AA4DC;}
.d2-2851460652 .fill-B4{fill:#E7E9EE;}
.d2-2851460652 .fill-B5{fill:#F5F6F9;}
.d2-2851460652 .fill-B6{fill:#FFFFFF;}
.d2-2851460652 .fill-AA2{fill:#008566;}
.d2-2851460652 .fill-AA4{fill:#45BBA5;}
.d2-2851460652 .fill-AA5{fill:#7ACCBD;}
.d2-2851460652 .fill-AB4{fill:#F1C759;}
.d2-2851460652 .fill-AB5{fill:#F9E088;}
.d2-2851460652 .stroke-N1{stroke:#000410;}
.d2-2851460652 .stroke-N2{stroke:#0000B8;}
.d2-2851460652 .stroke-N3{stroke:#9499AB;}
.d2-2851460652 .stroke-N4{stroke:#CFD2DD;}
.d2-2851460652 .stroke-N5{stroke:#C3DEF3;}
.d2-2851460652 .stroke-N6{stroke:#EEF1F8;}
.d2-2851460652 .stroke-N7{stroke:#FFFFFF;}
.d2-2851460652 .stroke-B1{stroke:#000410;}
.d2-2851460652 .stroke-B2{stroke:#0000E4;}
.d2-2851460652 .stroke-B3{stroke:#5AA4DC;}
.d2-2851460652 .stroke-B4{stroke:#E7E9EE;}
.d2-2851460652 .stroke-B5{stroke:#F5F6F9;}
.d2-2851460652 .stroke-B6{stroke:#FFFFFF;}
.d2-2851460652 .stroke-AA2{stroke:#008566;}
.d2-2851460652 .stroke-AA4{stroke:#45BBA5;}
.d2-2851460652 .stroke-AA5{stroke:#7ACCBD;}
.d2-2851460652 .stroke-AB4{stroke:#F1C759;}
.d2-2851460652 .stroke-AB5{stroke:#F9E088;}
.d2-2851460652 .background-color-N1{background-color:#000410;}
.d2-2851460652 .background-color-N2{background-color:#0000B8;}
.d2-2851460652 .background-color-N3{background-color:#9499AB;}
.d2-2851460652 .background-color-N4{background-color:#CFD2DD;}
.d2-2851460652 .background-color-N5{background-color:#C3DEF3;}
.d2-2851460652 .background-color-N6{background-color:#EEF1F8;}
.d2-2851460652 .background-color-N7{background-color:#FFFFFF;}
.d2-2851460652 .background-color-B1{background-color:#000410;}
.d2-2851460652 .background-color-B2{background-color:#0000E4;}
.d2-2851460652 .background-color-B3{background-color:#5AA4DC;}
.d2-2851460652 .background-color-B4{background-color:#E7E9EE;}
.d2-2851460652 .background-color-B5{background-color:#F5F6F9;}
.d2-2851460652 .background-color-B6{background-color:#FFFFFF;}
.d2-2851460652 .background-color-AA2{background-color:#008566;}
.d2-2851460652 .background-color-AA4{background-color:#45BBA5;}
.d2-2851460652 .background-color-AA5{background-color:#7ACCBD;}
.d2-2851460652 .background-color-AB4{background-color:#F1C759;}
.d2-2851460652 .background-color-AB5{background-color:#F9E088;}
.d2-2851460652 .color-N1{color:#000410;}
.d2-2851460652 .color-N2{color:#0000B8;}
.d2-2851460652 .color-N3{color:#9499AB;}
.d2-2851460652 .color-N4{color:#CFD2DD;}
.d2-2851460652 .color-N5{color:#C3DEF3;}
.d2-2851460652 .color-N6{color:#EEF1F8;}
.d2-2851460652 .color-N7{color:#FFFFFF;}
.d2-2851460652 .color-B1{color:#000410;}
.d2-2851460652 .color-B2{color:#0000E4;}
.d2-2851460652 .color-B3{color:#5AA4DC;}
.d2-2851460652 .color-B4{color:#E7E9EE;}
.d2-2851460652 .color-B5{color:#F5F6F9;}
.d2-2851460652 .color-B6{color:#FFFFFF;}
.d2-2851460652 .color-AA2{color:#008566;}
.d2-2851460652 .color-AA4{color:#45BBA5;}
.d2-2851460652 .color-AA5{color:#7ACCBD;}
.d2-2851460652 .color-AB4{color:#F1C759;}
.d2-2851460652 .color-AB5{color:#F9E088;}.appendix text.text{fill:#000410}.md{--color-fg-default:#000410;--color-fg-muted:#0000B8;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#000410;--color-border-muted:#0000E4;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0000E4;--color-accent-emphasis:#0000E4;--color-attention-subtle:#0000B8;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-2851460652);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-2851460652);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-normal-d2-2851460652);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-bright-d2-2851460652);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-2851460652);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-2851460652);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-2851460652);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-2851460652);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-normal-d2-2851460652);mix-blend-mode:color-burn}.sketch-overlay-AB4{fill:url(#streaks-normal-d2-2851460652);mix-blend-mode:color-burn}.sketch-overlay-AB5{fill:url(#streaks-normal-d2-2851460652);mix-blend-mode:color-burn}.sketch-overlay-N1{fill:url(#streaks-darker-d2-2851460652);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-darker-d2-2851460652);mix-blend-mode:lighten}.sketch-overlay-N3{fill:url(#streaks-normal-d2-2851460652);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-2851460652);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-normal-d2-2851460652);mix-blend-mode:color-burn}.sketch-overlay-N6{fill:url(#streaks-bright-d2-2851460652);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-2851460652);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}
@media (prefers-color-scheme: dark) {
.d2-2851460652 .fill-N1 { fill: #E8E8E8; }
.d2-2851460652 .fill-N2 { fill: #CCCCCC; }
.d2-2851460652 .fill-N3 { fill: #999999; }
.d2-2851460652 .fill-B1 { fill: #E8E8E8; }
.d2-2851460652 .fill-B2 { fill: #7BACFF; }
.d2-2851460652 .fill-B3 { fill: #6AAFDC; }
.d2-2851460652 .fill-N4 { fill: #3A3A44; }
.d2-2851460652 .fill-N5 { fill: #2E2E38; }
.d2-2851460652 .fill-N6 { fill: #252530; }
.d2-2851460652 .fill-N7 { fill: transparent; }
.d2-2851460652 .fill-B4 { fill: #2A2A34; }
.d2-2851460652 .fill-B5 { fill: #1E1E28; }
.d2-2851460652 .fill-B6 { fill: #16161E; }
.d2-2851460652 .stroke-N1 { stroke: #E8E8E8; }
.d2-2851460652 .stroke-N2 { stroke: #CCCCCC; }
.d2-2851460652 .stroke-N3 { stroke: #999999; }
.d2-2851460652 .stroke-N4 { stroke: #555555; }
.d2-2851460652 .stroke-N5 { stroke: #444444; }
.d2-2851460652 .stroke-N6 { stroke: #333333; }
.d2-2851460652 .stroke-N7 { stroke: transparent; }
.d2-2851460652 .stroke-B1 { stroke: #E8E8E8; }
.d2-2851460652 .stroke-B2 { stroke: #7BACFF; }
.d2-2851460652 .stroke-B3 { stroke: #6AAFDC; }
.d2-2851460652 .stroke-B4 { stroke: #3A3A44; }
.d2-2851460652 .stroke-B5 { stroke: #2E2E38; }
.d2-2851460652 .stroke-B6 { stroke: #252530; }
.d2-2851460652 .color-N1 { color: #E8E8E8; }
.d2-2851460652 .color-N2 { color: #CCCCCC; }
.d2-2851460652 .color-N3 { color: #999999; }
.d2-2851460652 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><style type="text/css"><![CDATA[
.dots-overlay {
fill: url(#dots-d2-2851460652);
mix-blend-mode: multiply;
}
@media (prefers-color-scheme: dark) {
.d2-2851460652 .fill-N1 { fill: #E8E8E8; }
.d2-2851460652 .fill-N2 { fill: #CCCCCC; }
.d2-2851460652 .fill-N3 { fill: #999999; }
.d2-2851460652 .fill-B1 { fill: #E8E8E8; }
.d2-2851460652 .fill-B2 { fill: #7BACFF; }
.d2-2851460652 .fill-B3 { fill: #6AAFDC; }
.d2-2851460652 .fill-N4 { fill: #3A3A44; }
.d2-2851460652 .fill-N5 { fill: #2E2E38; }
.d2-2851460652 .fill-N6 { fill: #252530; }
.d2-2851460652 .fill-N7 { fill: transparent; }
.d2-2851460652 .fill-B4 { fill: #2A2A34; }
.d2-2851460652 .fill-B5 { fill: #1E1E28; }
.d2-2851460652 .fill-B6 { fill: #16161E; }
.d2-2851460652 .stroke-N1 { stroke: #E8E8E8; }
.d2-2851460652 .stroke-N2 { stroke: #CCCCCC; }
.d2-2851460652 .stroke-N3 { stroke: #999999; }
.d2-2851460652 .stroke-N4 { stroke: #555555; }
.d2-2851460652 .stroke-N5 { stroke: #444444; }
.d2-2851460652 .stroke-N6 { stroke: #333333; }
.d2-2851460652 .stroke-N7 { stroke: transparent; }
.d2-2851460652 .stroke-B1 { stroke: #E8E8E8; }
.d2-2851460652 .stroke-B2 { stroke: #7BACFF; }
.d2-2851460652 .stroke-B3 { stroke: #6AAFDC; }
.d2-2851460652 .stroke-B4 { stroke: #3A3A44; }
.d2-2851460652 .stroke-B5 { stroke: #2E2E38; }
.d2-2851460652 .stroke-B6 { stroke: #252530; }
.d2-2851460652 .color-N1 { color: #E8E8E8; }
.d2-2851460652 .color-N2 { color: #CCCCCC; }
.d2-2851460652 .color-N3 { color: #999999; }
.d2-2851460652 .connection.fill-B1 { fill: #E8E8E8; }
}
]]></style><defs><pattern id="dots-d2-2851460652" x="0" y="0" width="15" height="15" patternUnits="userSpaceOnUse">
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="2" y="2" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="12" y="2" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="12" y="12" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="2" y="12" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="2" y="7" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="12" y="7" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="7" y="2" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="7" y="12" width="1" height="1" fill="#0A0F25"/>
</g>
<g style="mix-blend-mode:multiply" opacity="0.1">
<rect x="7" y="7" width="1" height="1" fill="#0A0F25"/>
</g>
</pattern>
</defs><g class="YWlj"><g class="shape" ><rect x="12.000000" y="12.000000" width="380.000000" height="485.000000" stroke="#000410" fill="#E7E9EE" class=" stroke-B1 fill-B4" style="stroke-width:2;" /><rect x="12.000000" y="12.000000" width="380.000000" height="485.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="17.000000" y="17.000000" width="370.000000" height="475.000000" stroke="#000410" fill="transparent" class=" stroke-B1" style="stroke-width:2;" /></g><text x="202.000000" y="45.000000" fill="#000410" class="text-mono fill-N1" style="text-anchor:middle;font-size:28px">AIC OUTPUT</text></g><g class="YWlwZXJm"><g class="shape" ><rect x="472.000000" y="12.000000" width="420.000000" height="485.000000" stroke="#000410" fill="#E7E9EE" class=" stroke-B1 fill-B4" style="stroke-width:2;" /><rect x="472.000000" y="12.000000" width="420.000000" height="485.000000" class="dots-overlay" style="stroke-width:2;" /><rect x="477.000000" y="17.000000" width="410.000000" height="475.000000" stroke="#000410" fill="transparent" class=" stroke-B1" style="stroke-width:2;" /></g><text x="682.000000" y="45.000000" fill="#000410" class="text-mono fill-N1" style="text-anchor:middle;font-size:28px">AIPERF ARGUMENT</text></g><g class="YWljLmMx"><g class="shape" ><rect x="62.000000" y="62.000000" width="280.000000" height="61.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="202.000000" y="98.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">CONCURRENCY: 56 (=14X4)</text></g><g class="YWljLmMy"><g class="shape" ><rect x="62.000000" y="143.000000" width="280.000000" height="61.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="202.000000" y="179.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">ISL: 4000, OSL: 500</text></g><g class="YWljLmMz"><g class="shape" ><rect x="62.000000" y="224.000000" width="280.000000" height="61.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="202.000000" y="260.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">MODEL: QWEN3-32B-FP8</text></g><g class="YWljLmM0"><g class="shape" ><rect x="62.000000" y="305.000000" width="280.000000" height="61.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="202.000000" y="341.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">CONCURRENCY X ~14</text></g><g class="YWljLmM1"><g class="shape" ><rect x="62.000000" y="386.000000" width="280.000000" height="61.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="202.000000" y="422.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">(BEST PRACTICE)</text></g><g class="YWlwZXJmLmEx"><g class="shape" ><rect x="522.000000" y="62.000000" width="320.000000" height="61.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="682.000000" y="98.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">--CONCURRENCY 56</text></g><g class="YWlwZXJmLmEy"><g class="shape" ><rect x="522.000000" y="143.000000" width="320.000000" height="61.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="682.000000" y="179.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">--ISL 4000 --OSL 500</text></g><g class="YWlwZXJmLmEz"><g class="shape" ><rect x="522.000000" y="224.000000" width="320.000000" height="61.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="682.000000" y="260.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">-M QWEN/QWEN3-32B-FP8</text></g><g class="YWlwZXJmLmE0"><g class="shape" ><rect x="522.000000" y="305.000000" width="320.000000" height="61.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="682.000000" y="341.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">--NUM-REQUESTS 800</text></g><g class="YWlwZXJmLmE1"><g class="shape" ><rect x="522.000000" y="386.000000" width="320.000000" height="61.000000" stroke="#000410" fill="#F5F6F9" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="682.000000" y="422.000000" fill="#000410" class="text-mono-bold fill-N1" style="text-anchor:middle;font-size:16px">--EXTRA-INPUTS &#34;IGNORE_EOS:TRUE&#34;</text></g><g class="KGFpYy5jMSAtJmd0OyBhaXBlcmYuYTEpWzBd"><marker id="mk-d2-2851460652-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#000410" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 344.000000 92.500000 L 518.000000 92.500000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2851460652-3488378134)" mask="url(#d2-2851460652)" /></g><g class="KGFpYy5jMiAtJmd0OyBhaXBlcmYuYTIpWzBd"><path d="M 344.000000 173.500000 L 518.000000 173.500000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2851460652-3488378134)" mask="url(#d2-2851460652)" /></g><g class="KGFpYy5jMyAtJmd0OyBhaXBlcmYuYTMpWzBd"><path d="M 344.000000 254.500000 L 518.000000 254.500000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2851460652-3488378134)" mask="url(#d2-2851460652)" /></g><g class="KGFpYy5jNCAtJmd0OyBhaXBlcmYuYTQpWzBd"><path d="M 344.000000 335.500000 L 518.000000 335.500000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2851460652-3488378134)" mask="url(#d2-2851460652)" /></g><g class="KGFpYy5jNSAtJmd0OyBhaXBlcmYuYTUpWzBd"><path d="M 344.000000 416.500000 L 518.000000 416.500000" stroke="#000410" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2851460652-3488378134)" mask="url(#d2-2851460652)" /></g><mask id="d2-2851460652" maskUnits="userSpaceOnUse" x="-29" y="-29" width="962" height="567">
<rect x="-29" y="-29" width="962" height="567" fill="white"></rect>
</mask></svg></svg>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment