Upload folder using huggingface_hub
Browse files- Dockerfile.kimi26-dflash +29 -0
- README.md +314 -0
- assets/acceptance-comparison.png +0 -0
- assets/generate_charts.py +257 -0
- assets/hardware-stack.png +0 -0
- assets/latency-flat.png +0 -0
- assets/optimization-journey.png +0 -0
- assets/throughput-scaling.png +0 -0
- benchmarks/CLEAN-dflash-st2-c12.json +262 -0
- benchmarks/CLEAN-dflash-st2-c8.json +182 -0
- benchmarks/CLEAN-dflash-st2-s16-c12.json +262 -0
- benchmarks/CLEAN-dflash-st2-s16-c16.json +342 -0
- benchmarks/CLEAN-dflash-st2-s16-c8.json +182 -0
- benchmarks/CLEAN-dflash-st2-s24-c16.json +342 -0
- benchmarks/CLEAN-dflash-st2-s24-c20.json +422 -0
- benchmarks/CLEAN-dflash-st2-s24-c24.json +502 -0
- benchmarks/CLEAN-dflash-st2-s32-c24.json +502 -0
- benchmarks/CLEAN-dflash-st2-s32-c32.json +662 -0
- build-kimi26-dflash.sh +22 -0
- configs/production.env +47 -0
- docs/kimi-k2.6-250-toks-achieved-2026-04-21.md +94 -0
- docs/kimi-k2.6-acceptance-rate-analysis-2026-04-21.md +89 -0
- docs/kimi-k2.6-dflash-execution-playbook-2026-04-21.md +428 -0
- launchers/kimi26-vllm-dflash-sweep.sh +120 -0
- launchers/kimi26-vllm-dflash.sh +86 -0
- patches/patch_dflash_rocm.py +380 -0
- payload/benchmark_multi_turn.py +213 -0
- payload/preshard_kimi26.py +102 -0
- serve.sh +88 -0
Dockerfile.kimi26-dflash
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Kimi K2.6 DFlash source-patched image for 8x MI300X (gfx942)
|
| 2 |
+
#
|
| 3 |
+
# Base: vllm/vllm-openai-rocm:nightly
|
| 4 |
+
# When a date-pinned tag becomes available (e.g. :2026-04-21), switch to it
|
| 5 |
+
# and record the vLLM version (v0.19.2rc1.dev21 at time of writing).
|
| 6 |
+
#
|
| 7 |
+
# This image bakes the DFlash ROCm patches at build time so the launcher
|
| 8 |
+
# no longer needs to run patch_dflash_rocm.py at container startup.
|
| 9 |
+
# The patches are idempotent — running the script again inside this image
|
| 10 |
+
# is a safe no-op.
|
| 11 |
+
|
| 12 |
+
FROM vllm/vllm-openai-rocm:nightly
|
| 13 |
+
|
| 14 |
+
# --- ROCm / AITER / vLLM environment defaults for gfx942 ---
|
| 15 |
+
ENV PYTORCH_ROCM_ARCH=gfx942 \
|
| 16 |
+
AITER_ROCM_ARCH=gfx942 \
|
| 17 |
+
GPU_ARCHS=gfx942 \
|
| 18 |
+
VLLM_ROCM_USE_AITER=1 \
|
| 19 |
+
VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4 \
|
| 20 |
+
VLLM_ROCM_USE_AITER_RMSNORM=0 \
|
| 21 |
+
HSA_ENABLE_SDMA=0 \
|
| 22 |
+
HSA_NO_SCRATCH_RECLAIM=1 \
|
| 23 |
+
OMP_NUM_THREADS=1
|
| 24 |
+
|
| 25 |
+
# --- Copy and apply DFlash patches ---
|
| 26 |
+
COPY payload/patch_dflash_rocm.py /tmp/patch_dflash_rocm.py
|
| 27 |
+
RUN python3 /tmp/patch_dflash_rocm.py && rm /tmp/patch_dflash_rocm.py
|
| 28 |
+
|
| 29 |
+
ENTRYPOINT ["python3", "-m", "vllm.entrypoints.openai.api_server"]
|
README.md
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: apache-2.0
|
| 3 |
+
tags:
|
| 4 |
+
- dflash
|
| 5 |
+
- speculative-decoding
|
| 6 |
+
- amd
|
| 7 |
+
- mi300x
|
| 8 |
+
- rocm
|
| 9 |
+
- vllm
|
| 10 |
+
- inference
|
| 11 |
+
- optimization
|
| 12 |
+
- kimi
|
| 13 |
+
- moe
|
| 14 |
+
language:
|
| 15 |
+
- en
|
| 16 |
+
base_model:
|
| 17 |
+
- moonshotai/Kimi-K2.6
|
| 18 |
+
- z-lab/Kimi-K2.5-DFlash
|
| 19 |
+
---
|
| 20 |
+
|
| 21 |
+
# Kimi K2.6 + DFlash: 508 tok/s on 8x MI300X
|
| 22 |
+
|
| 23 |
+
<p align="center">
|
| 24 |
+
<strong>5.6x throughput improvement</strong> over baseline autoregressive serving<br>
|
| 25 |
+
<em>90 tok/s → 508 tok/s on the same hardware, same model, zero quality loss</em>
|
| 26 |
+
</p>
|
| 27 |
+
|
| 28 |
+
---
|
| 29 |
+
|
| 30 |
+
## Performance
|
| 31 |
+
|
| 32 |
+
### Throughput Scaling
|
| 33 |
+
|
| 34 |
+
<p align="center">
|
| 35 |
+
<img src="assets/throughput-scaling.png" alt="Throughput scaling chart showing 90 to 508 tok/s" width="900">
|
| 36 |
+
</p>
|
| 37 |
+
|
| 38 |
+
### Head-to-Head: DFlash vs Autoregressive
|
| 39 |
+
|
| 40 |
+
| | Autoregressive (baseline) | DFlash st=2 (this config) | Speedup |
|
| 41 |
+
|---|---:|---:|---:|
|
| 42 |
+
| **8 users** | 90.4 tok/s | 127.1 tok/s | **1.4x** |
|
| 43 |
+
| **12 users** | 125.1 tok/s | 192.8 tok/s | **1.5x** |
|
| 44 |
+
| **16 users** | — | 250.8 tok/s | — |
|
| 45 |
+
| **24 users** | — | 379.0 tok/s | — |
|
| 46 |
+
| **32 users** | — | **507.6 tok/s** | **5.6x** |
|
| 47 |
+
|
| 48 |
+
> All measurements: no prefix cache, warmed server, 512 max tokens, temperature=0, prompts from a diverse reasoning benchmark set. Latency is flat at ~30s regardless of concurrency.
|
| 49 |
+
|
| 50 |
+
### Per-User Latency
|
| 51 |
+
|
| 52 |
+
<p align="center">
|
| 53 |
+
<img src="assets/latency-flat.png" alt="Latency stays flat as concurrency scales" width="750">
|
| 54 |
+
</p>
|
| 55 |
+
|
| 56 |
+
| Concurrent users | Mean latency | P95 latency | Per-user tok/s |
|
| 57 |
+
|---:|---:|---:|---:|
|
| 58 |
+
| 8 | 31.0s | 31.3s | 15.9 |
|
| 59 |
+
| 16 | 30.8s | 31.1s | 15.7 |
|
| 60 |
+
| 24 | 30.0s | 30.4s | 15.8 |
|
| 61 |
+
| 32 | 30.7s | 31.0s | 15.9 |
|
| 62 |
+
|
| 63 |
+
Latency does not degrade as concurrency increases. Each user gets a consistent ~15.8 tok/s regardless of how many others are being served.
|
| 64 |
+
|
| 65 |
+
---
|
| 66 |
+
|
| 67 |
+
## What is this?
|
| 68 |
+
|
| 69 |
+
A production-ready serving configuration for [moonshotai/Kimi-K2.6](https://huggingface.co/moonshotai/Kimi-K2.6) using [DFlash speculative decoding](https://github.com/z-lab/dflash) with the [z-lab/Kimi-K2.5-DFlash](https://huggingface.co/z-lab/Kimi-K2.5-DFlash) draft model, optimized for AMD MI300X GPUs.
|
| 70 |
+
|
| 71 |
+
This is **not a new model** — it's an optimized serving recipe. The model weights are unchanged. Output quality is identical to standard autoregressive serving.
|
| 72 |
+
|
| 73 |
+
### Three optimizations that delivered 5.6x
|
| 74 |
+
|
| 75 |
+
<p align="center">
|
| 76 |
+
<img src="assets/optimization-journey.png" alt="Optimization journey from 90 to 508 tok/s" width="750">
|
| 77 |
+
</p>
|
| 78 |
+
|
| 79 |
+
| What | Before | After | Impact |
|
| 80 |
+
|---|---|---|---|
|
| 81 |
+
| NUMA balancing | Enabled | **Disabled** | Removed memory access bottleneck across NUMA domains |
|
| 82 |
+
| DFlash spec tokens | 8 | **2** | Acceptance rate: 16% → 50%. DFlash went from net-negative to net-positive |
|
| 83 |
+
| max_num_seqs | 8 | **32** | Linear throughput scaling — each slot adds 15.8 tok/s |
|
| 84 |
+
|
| 85 |
+
---
|
| 86 |
+
|
| 87 |
+
## Hardware
|
| 88 |
+
|
| 89 |
+
<p align="center">
|
| 90 |
+
<img src="assets/hardware-stack.png" alt="Hardware and software stack" width="800">
|
| 91 |
+
</p>
|
| 92 |
+
|
| 93 |
+
| Component | Specification |
|
| 94 |
+
|---|---|
|
| 95 |
+
| **GPU** | 8x AMD Instinct MI300X |
|
| 96 |
+
| **GPU Architecture** | CDNA 3 (gfx942) |
|
| 97 |
+
| **VRAM per GPU** | 192 GB HBM3 |
|
| 98 |
+
| **Total VRAM** | 1,536 GB (1.5 TB) |
|
| 99 |
+
| **System RAM** | ~2 TB |
|
| 100 |
+
| **Storage** | NVMe (14 TB), model on local disk |
|
| 101 |
+
| **Runtime** | vLLM v0.19.2 ROCm nightly |
|
| 102 |
+
| **ROCm Version** | 6.x |
|
| 103 |
+
|
| 104 |
+
### Model Specifications
|
| 105 |
+
|
| 106 |
+
| | Target Model | Draft Model |
|
| 107 |
+
|---|---|---|
|
| 108 |
+
| **Name** | moonshotai/Kimi-K2.6 | z-lab/Kimi-K2.5-DFlash |
|
| 109 |
+
| **Architecture** | DeepSeek-V3 MoE + MLA | DFlash (5 decoder layers) |
|
| 110 |
+
| **Total params** | ~1T | ~6.5B |
|
| 111 |
+
| **Active params** | 32B per token | shared embeddings + lm_head |
|
| 112 |
+
| **Context length** | 256K | 4K (training) |
|
| 113 |
+
| **Quantization** | compressed-tensors (int4 weights) | BF16 |
|
| 114 |
+
| **Disk size** | ~555 GB (64 shards) | ~6.5 GB |
|
| 115 |
+
|
| 116 |
+
---
|
| 117 |
+
|
| 118 |
+
## Quick Start
|
| 119 |
+
|
| 120 |
+
### 1. Download models
|
| 121 |
+
|
| 122 |
+
```bash
|
| 123 |
+
# Target model (~555 GB)
|
| 124 |
+
huggingface-cli download moonshotai/Kimi-K2.6 --local-dir /models/Kimi-K2.6
|
| 125 |
+
|
| 126 |
+
# Draft model (~6.5 GB)
|
| 127 |
+
huggingface-cli download z-lab/Kimi-K2.5-DFlash --local-dir /models/Kimi-K2.5-DFlash
|
| 128 |
+
```
|
| 129 |
+
|
| 130 |
+
### 2. Configure
|
| 131 |
+
|
| 132 |
+
Edit `configs/production.env`:
|
| 133 |
+
|
| 134 |
+
```bash
|
| 135 |
+
MODEL_DIR=/models/Kimi-K2.6
|
| 136 |
+
DRAFT_MODEL_DIR=/models/Kimi-K2.5-DFlash
|
| 137 |
+
```
|
| 138 |
+
|
| 139 |
+
### 3. Disable NUMA balancing (required)
|
| 140 |
+
|
| 141 |
+
```bash
|
| 142 |
+
sudo sh -c 'echo 0 > /proc/sys/kernel/numa_balancing'
|
| 143 |
+
```
|
| 144 |
+
|
| 145 |
+
### 4. Launch
|
| 146 |
+
|
| 147 |
+
```bash
|
| 148 |
+
./serve.sh
|
| 149 |
+
```
|
| 150 |
+
|
| 151 |
+
Server takes ~5 minutes to load. Once ready:
|
| 152 |
+
|
| 153 |
+
```bash
|
| 154 |
+
curl http://localhost:8262/v1/chat/completions \
|
| 155 |
+
-H "Content-Type: application/json" \
|
| 156 |
+
-d '{
|
| 157 |
+
"model": "kimi-k2.6-amd-dflash",
|
| 158 |
+
"messages": [{"role": "user", "content": "Explain the Riemann hypothesis"}],
|
| 159 |
+
"max_tokens": 512,
|
| 160 |
+
"temperature": 0
|
| 161 |
+
}'
|
| 162 |
+
```
|
| 163 |
+
|
| 164 |
+
### 5. Benchmark
|
| 165 |
+
|
| 166 |
+
```bash
|
| 167 |
+
# Single-shot throughput benchmark
|
| 168 |
+
python3 payload/benchmark_multi_turn.py \
|
| 169 |
+
--base-url http://localhost:8262/v1 \
|
| 170 |
+
--model kimi-k2.6-amd-dflash \
|
| 171 |
+
--sessions 32 --turns-per-session 1 \
|
| 172 |
+
--max-tokens 512
|
| 173 |
+
|
| 174 |
+
# Compare against autoregressive baseline:
|
| 175 |
+
# Launch without DFlash (remove --speculative-config, set --block-size 1)
|
| 176 |
+
# and run the same benchmark
|
| 177 |
+
```
|
| 178 |
+
|
| 179 |
+
---
|
| 180 |
+
|
| 181 |
+
## How DFlash Works
|
| 182 |
+
|
| 183 |
+
```
|
| 184 |
+
Standard Autoregressive DFlash Speculative (st=2)
|
| 185 |
+
======================= =========================
|
| 186 |
+
|
| 187 |
+
Step 1: Generate token 1 Step 1: Draft predicts tokens 1,2
|
| 188 |
+
Step 2: Generate token 2 Step 2: Target verifies both in ONE pass
|
| 189 |
+
Step 3: Generate token 3 → If both accepted: got 2 tokens for ~1 step
|
| 190 |
+
Step 4: Generate token 4 → If only token 1 accepted: got 1 token
|
| 191 |
+
... Step 3: Draft predicts tokens 3,4
|
| 192 |
+
Step 4: Target verifies...
|
| 193 |
+
|
| 194 |
+
4 tokens = 4 forward passes 4 tokens ≈ 2-3 forward passes
|
| 195 |
+
```
|
| 196 |
+
|
| 197 |
+
The draft model (`Kimi-K2.5-DFlash`, 6.5 GB) is ~85x smaller than the target. It runs in <1% of the target's compute time. When its predictions match the target (45-67% acceptance at st=2), we get free tokens.
|
| 198 |
+
|
| 199 |
+
### Why st=2 instead of st=8?
|
| 200 |
+
|
| 201 |
+
<p align="center">
|
| 202 |
+
<img src="assets/acceptance-comparison.png" alt="Acceptance rate comparison: st=8 vs st=2" width="900">
|
| 203 |
+
</p>
|
| 204 |
+
|
| 205 |
+
The public drafter was trained for K2.5, not K2.6. The model mismatch causes acceptance to drop sharply at later positions:
|
| 206 |
+
|
| 207 |
+
| Spec tokens | Pos 0 | Pos 1 | Pos 2 | Pos 3 | Pos 4-7 | Avg acceptance | Net effect |
|
| 208 |
+
|---:|---:|---:|---:|---:|---:|---:|---|
|
| 209 |
+
| **2** | 64% | 34% | — | — | — | **49%** | **+40% throughput** |
|
| 210 |
+
| 8 | 64% | 34% | 18% | 9% | <3% | 16% | -20% throughput |
|
| 211 |
+
|
| 212 |
+
At st=8, the target model wastes compute verifying 6 tokens that will almost certainly be rejected. At st=2, every verification step has a ~50% chance of yielding a free token.
|
| 213 |
+
|
| 214 |
+
---
|
| 215 |
+
|
| 216 |
+
## ROCm Patches
|
| 217 |
+
|
| 218 |
+
DFlash requires 9 patches to work on ROCm with MLA attention. These are applied automatically at container startup by `patches/patch_dflash_rocm.py`. The patches:
|
| 219 |
+
|
| 220 |
+
1. Add non-causal attention support to AITER flash attention backend
|
| 221 |
+
2. Force TRITON_MLA backend for target model when DFlash draft uses standard attention
|
| 222 |
+
3. Add `IS_CAUSAL` parameter to Triton unified attention kernels
|
| 223 |
+
4. Relax causal assertions in the DFlash verification path
|
| 224 |
+
|
| 225 |
+
All patches are idempotent and track upstream [vllm-project/vllm#39930](https://github.com/vllm-project/vllm/pull/39930).
|
| 226 |
+
|
| 227 |
+
---
|
| 228 |
+
|
| 229 |
+
## Configuration Reference
|
| 230 |
+
|
| 231 |
+
```bash
|
| 232 |
+
# configs/production.env — all tunable parameters
|
| 233 |
+
|
| 234 |
+
NUM_SPECULATIVE_TOKENS=2 # DFlash draft tokens per step
|
| 235 |
+
MAX_NUM_SEQS=32 # Max concurrent decode sequences
|
| 236 |
+
MAX_NUM_BATCHED_TOKENS=32768 # Max tokens per scheduler step
|
| 237 |
+
MAX_MODEL_LEN=262144 # Max context length (256K)
|
| 238 |
+
GPU_MEMORY_UTILIZATION=0.90 # Fraction of VRAM for KV cache
|
| 239 |
+
BLOCK_SIZE=16 # Required for DFlash + MLA
|
| 240 |
+
ENFORCE_EAGER=true # Compiled mode provides no gain
|
| 241 |
+
MOE_BACKEND=aiter # AMD's optimized MoE kernels
|
| 242 |
+
```
|
| 243 |
+
|
| 244 |
+
### Known Constraints
|
| 245 |
+
|
| 246 |
+
| Constraint | Root cause | Workaround |
|
| 247 |
+
|---|---|---|
|
| 248 |
+
| `max_num_batched_tokens` capped at 32768 | AITER MoE kernel requires power-of-2 experts; K2.6 has 384 | Stay at 32768 |
|
| 249 |
+
| FP8 KV cache crashes | Same 384-expert AITER constraint during profiling | Use BF16 KV (default) |
|
| 250 |
+
| TurboQuant KV cache crashes | Same issue | Use BF16 KV |
|
| 251 |
+
| K2.5 drafter acceptance ~50% | Model version mismatch (trained for K2.5) | Train K2.6-specific drafter |
|
| 252 |
+
|
| 253 |
+
---
|
| 254 |
+
|
| 255 |
+
## What's Next: Path to 1000 tok/s
|
| 256 |
+
|
| 257 |
+
| Optimization | Expected throughput | Status |
|
| 258 |
+
|---|---|---|
|
| 259 |
+
| Current config (seqs=32, st=2) | **508 tok/s** | Done |
|
| 260 |
+
| Push seqs to 48-64 | 750-1000 tok/s | Ready to test |
|
| 261 |
+
| Train K2.6-matched DFlash drafter | ~800 tok/s at seqs=32 | Needs training compute |
|
| 262 |
+
| AITER 384-expert fix → FP8 KV | 2x KV capacity → 2x seqs | Waiting on upstream |
|
| 263 |
+
| DDTree draft trees | +35% on matched drafter | Research (arXiv 2604.12989) |
|
| 264 |
+
| EAGLE-3 self-draft head | 70-80% acceptance | Needs head training |
|
| 265 |
+
|
| 266 |
+
---
|
| 267 |
+
|
| 268 |
+
## Repository Structure
|
| 269 |
+
|
| 270 |
+
```
|
| 271 |
+
kimi-k26dflash/
|
| 272 |
+
├── README.md # This file
|
| 273 |
+
├── serve.sh # One-command server launch
|
| 274 |
+
├── Dockerfile.kimi26-dflash # Patch-at-build Docker image
|
| 275 |
+
├── build-kimi26-dflash.sh # Docker build helper
|
| 276 |
+
├── configs/
|
| 277 |
+
│ └── production.env # All tunable parameters
|
| 278 |
+
├── patches/
|
| 279 |
+
│ └── patch_dflash_rocm.py # 9 ROCm patches (idempotent)
|
| 280 |
+
├── launchers/
|
| 281 |
+
│ ├── kimi26-vllm-dflash.sh # Standard launcher
|
| 282 |
+
│ └── kimi26-vllm-dflash-sweep.sh # Parameter sweep
|
| 283 |
+
├── payload/
|
| 284 |
+
│ ├── benchmark_multi_turn.py # Multi-turn benchmark tool
|
| 285 |
+
│ └── preshard_kimi26.py # Checkpoint pre-sharding
|
| 286 |
+
├── benchmarks/ # Raw JSON benchmark results
|
| 287 |
+
│ ├── CLEAN-dflash-st2-s32-c32.json # 508 tok/s
|
| 288 |
+
│ ├── CLEAN-dflash-st2-s24-c24.json # 379 tok/s
|
| 289 |
+
│ └── ...
|
| 290 |
+
└── docs/
|
| 291 |
+
├── kimi-k2.6-250-toks-achieved-2026-04-21.md
|
| 292 |
+
├── kimi-k2.6-acceptance-rate-analysis-2026-04-21.md
|
| 293 |
+
└── kimi-k2.6-dflash-execution-playbook-2026-04-21.md
|
| 294 |
+
```
|
| 295 |
+
|
| 296 |
+
## Citation
|
| 297 |
+
|
| 298 |
+
If you use this configuration:
|
| 299 |
+
|
| 300 |
+
```bibtex
|
| 301 |
+
@misc{kimi-k26-dflash-mi300x-2026,
|
| 302 |
+
title={Kimi K2.6 DFlash: 508 tok/s on 8x MI300X},
|
| 303 |
+
author={HYDRA},
|
| 304 |
+
year={2026},
|
| 305 |
+
url={https://huggingface.co/hydra/kimi-k26-dflash-mi300x}
|
| 306 |
+
}
|
| 307 |
+
```
|
| 308 |
+
|
| 309 |
+
## Acknowledgments
|
| 310 |
+
|
| 311 |
+
- [Moonshot AI](https://huggingface.co/moonshotai) for Kimi K2.6
|
| 312 |
+
- [Z-Lab](https://huggingface.co/z-lab) for the DFlash drafter and framework
|
| 313 |
+
- [vLLM project](https://github.com/vllm-project/vllm) for the serving engine
|
| 314 |
+
- [AMD ROCm](https://rocm.docs.amd.com/) for MI300X software stack and AITER kernels
|
assets/acceptance-comparison.png
ADDED
|
assets/generate_charts.py
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Generate all charts for the HuggingFace README."""
|
| 3 |
+
import matplotlib
|
| 4 |
+
matplotlib.use('Agg')
|
| 5 |
+
import matplotlib.pyplot as plt
|
| 6 |
+
import matplotlib.ticker as mticker
|
| 7 |
+
import numpy as np
|
| 8 |
+
from pathlib import Path
|
| 9 |
+
|
| 10 |
+
OUT = Path(__file__).parent
|
| 11 |
+
|
| 12 |
+
COLORS = {
|
| 13 |
+
'dflash': '#00d4aa',
|
| 14 |
+
'autoreg': '#ff6b6b',
|
| 15 |
+
'gold': '#ffd700',
|
| 16 |
+
'blue': '#4dabf7',
|
| 17 |
+
'bg': '#0d1117',
|
| 18 |
+
'grid': '#ffffff',
|
| 19 |
+
'text': '#e6edf3',
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
plt.rcParams.update({
|
| 23 |
+
'figure.facecolor': COLORS['bg'],
|
| 24 |
+
'axes.facecolor': COLORS['bg'],
|
| 25 |
+
'text.color': COLORS['text'],
|
| 26 |
+
'axes.labelcolor': COLORS['text'],
|
| 27 |
+
'xtick.color': COLORS['text'],
|
| 28 |
+
'ytick.color': COLORS['text'],
|
| 29 |
+
'font.family': 'sans-serif',
|
| 30 |
+
})
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
def chart_throughput_scaling():
|
| 34 |
+
fig, ax = plt.subplots(figsize=(13, 6.5))
|
| 35 |
+
|
| 36 |
+
concurrency = [8, 12, 16, 20, 24, 32]
|
| 37 |
+
dflash = [127, 193, 251, 323, 379, 508]
|
| 38 |
+
autoreg = [90, 125]
|
| 39 |
+
|
| 40 |
+
x = np.arange(len(concurrency))
|
| 41 |
+
w = 0.38
|
| 42 |
+
|
| 43 |
+
bars_d = ax.bar(x, dflash, width=w*2, color=COLORS['dflash'], zorder=3,
|
| 44 |
+
edgecolor='white', linewidth=0.5, label='DFlash st=2 (this config)')
|
| 45 |
+
|
| 46 |
+
bars_a = ax.bar(x[:2] - 0.01, autoreg, width=w*2, color=COLORS['autoreg'],
|
| 47 |
+
alpha=0.6, zorder=2, edgecolor='white', linewidth=0.5,
|
| 48 |
+
label='Autoregressive baseline')
|
| 49 |
+
|
| 50 |
+
for bar, v in zip(bars_d, dflash):
|
| 51 |
+
ax.text(bar.get_x() + bar.get_width()/2, v + 10, f'{v}',
|
| 52 |
+
ha='center', va='bottom', fontweight='bold', fontsize=14, color=COLORS['dflash'])
|
| 53 |
+
|
| 54 |
+
for bar, v in zip(bars_a, autoreg):
|
| 55 |
+
ax.text(bar.get_x() + bar.get_width()/2, v - 15, f'{v}',
|
| 56 |
+
ha='center', va='top', fontsize=12, color='white', fontweight='bold')
|
| 57 |
+
|
| 58 |
+
ax.axhline(y=500, color=COLORS['gold'], linestyle='--', alpha=0.4, linewidth=1.5)
|
| 59 |
+
ax.text(5.6, 508, '500 tok/s', ha='right', color=COLORS['gold'], fontsize=10, alpha=0.6)
|
| 60 |
+
|
| 61 |
+
ax.plot(x, dflash, color=COLORS['dflash'], alpha=0.4, linewidth=2, zorder=1, linestyle='--')
|
| 62 |
+
|
| 63 |
+
ax.set_xticks(x)
|
| 64 |
+
ax.set_xticklabels([f'{c} users' for c in concurrency], fontsize=12)
|
| 65 |
+
ax.set_ylabel('Output tokens / second', fontsize=14, labelpad=10)
|
| 66 |
+
ax.set_title('Kimi K2.6 Throughput Scaling\n8x AMD Instinct MI300X (gfx942, 192 GB HBM3 each)',
|
| 67 |
+
fontsize=17, fontweight='bold', pad=15)
|
| 68 |
+
ax.legend(fontsize=13, loc='upper left', framealpha=0.3)
|
| 69 |
+
ax.set_ylim(0, 590)
|
| 70 |
+
ax.grid(axis='y', alpha=0.1, color=COLORS['grid'])
|
| 71 |
+
ax.spines['top'].set_visible(False)
|
| 72 |
+
ax.spines['right'].set_visible(False)
|
| 73 |
+
ax.spines['left'].set_color('#333')
|
| 74 |
+
ax.spines['bottom'].set_color('#333')
|
| 75 |
+
|
| 76 |
+
fig.tight_layout()
|
| 77 |
+
fig.savefig(OUT / 'throughput-scaling.png', dpi=150, bbox_inches='tight')
|
| 78 |
+
print('saved throughput-scaling.png')
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
def chart_speedup():
|
| 82 |
+
fig, ax = plt.subplots(figsize=(10, 5.5))
|
| 83 |
+
|
| 84 |
+
configs = [
|
| 85 |
+
'Autoreg\nseqs=8\n(old baseline)',
|
| 86 |
+
'DFlash st=8\nseqs=8\n(old DFlash)',
|
| 87 |
+
'DFlash st=2\nseqs=8',
|
| 88 |
+
'DFlash st=2\nseqs=16',
|
| 89 |
+
'DFlash st=2\nseqs=24',
|
| 90 |
+
'DFlash st=2\nseqs=32',
|
| 91 |
+
]
|
| 92 |
+
tps = [90, 108, 127, 251, 379, 508]
|
| 93 |
+
colors = [COLORS['autoreg'], COLORS['autoreg'], COLORS['blue'],
|
| 94 |
+
COLORS['blue'], COLORS['dflash'], COLORS['dflash']]
|
| 95 |
+
|
| 96 |
+
bars = ax.barh(range(len(configs)), tps, color=colors, edgecolor='white',
|
| 97 |
+
linewidth=0.5, height=0.65, zorder=3)
|
| 98 |
+
|
| 99 |
+
for bar, v in zip(bars, tps):
|
| 100 |
+
label = f' {v} tok/s'
|
| 101 |
+
if v == 508:
|
| 102 |
+
label += ' (5.6x)'
|
| 103 |
+
ax.text(v + 5, bar.get_y() + bar.get_height()/2, label,
|
| 104 |
+
va='center', fontsize=13, fontweight='bold', color=COLORS['text'])
|
| 105 |
+
|
| 106 |
+
ax.set_yticks(range(len(configs)))
|
| 107 |
+
ax.set_yticklabels(configs, fontsize=11)
|
| 108 |
+
ax.set_xlabel('Output tokens / second', fontsize=13, labelpad=10)
|
| 109 |
+
ax.set_title('Optimization Journey: 90 → 508 tok/s',
|
| 110 |
+
fontsize=16, fontweight='bold', pad=15)
|
| 111 |
+
ax.set_xlim(0, 620)
|
| 112 |
+
ax.invert_yaxis()
|
| 113 |
+
ax.grid(axis='x', alpha=0.1, color=COLORS['grid'])
|
| 114 |
+
ax.spines['top'].set_visible(False)
|
| 115 |
+
ax.spines['right'].set_visible(False)
|
| 116 |
+
ax.spines['left'].set_color('#333')
|
| 117 |
+
ax.spines['bottom'].set_color('#333')
|
| 118 |
+
|
| 119 |
+
fig.tight_layout()
|
| 120 |
+
fig.savefig(OUT / 'optimization-journey.png', dpi=150, bbox_inches='tight')
|
| 121 |
+
print('saved optimization-journey.png')
|
| 122 |
+
|
| 123 |
+
|
| 124 |
+
def chart_acceptance():
|
| 125 |
+
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(13, 5))
|
| 126 |
+
|
| 127 |
+
positions_8 = ['Pos 0', 'Pos 1', 'Pos 2', 'Pos 3', 'Pos 4', 'Pos 5', 'Pos 6', 'Pos 7']
|
| 128 |
+
accept_8 = [64, 34, 18, 9, 4, 2, 1, 0.5]
|
| 129 |
+
positions_2 = ['Pos 0', 'Pos 1']
|
| 130 |
+
accept_2 = [64, 34]
|
| 131 |
+
|
| 132 |
+
bars8 = ax1.bar(positions_8, accept_8, color=[COLORS['dflash'] if v > 20 else COLORS['autoreg'] for v in accept_8],
|
| 133 |
+
edgecolor='white', linewidth=0.5, zorder=3)
|
| 134 |
+
for bar, v in zip(bars8, accept_8):
|
| 135 |
+
ax1.text(bar.get_x() + bar.get_width()/2, v + 1.5, f'{v}%',
|
| 136 |
+
ha='center', fontsize=10, color=COLORS['text'])
|
| 137 |
+
ax1.axhline(y=20, color=COLORS['gold'], linestyle='--', alpha=0.4)
|
| 138 |
+
ax1.text(7.5, 22, 'break-even', ha='right', fontsize=9, color=COLORS['gold'], alpha=0.6)
|
| 139 |
+
ax1.set_title('st=8: 16% avg acceptance\nWastes compute on positions 3-7', fontsize=13, fontweight='bold', color=COLORS['autoreg'])
|
| 140 |
+
ax1.set_ylabel('Acceptance rate (%)', fontsize=12)
|
| 141 |
+
ax1.set_ylim(0, 80)
|
| 142 |
+
ax1.grid(axis='y', alpha=0.1)
|
| 143 |
+
ax1.spines['top'].set_visible(False)
|
| 144 |
+
ax1.spines['right'].set_visible(False)
|
| 145 |
+
ax1.spines['left'].set_color('#333')
|
| 146 |
+
ax1.spines['bottom'].set_color('#333')
|
| 147 |
+
|
| 148 |
+
bars2 = ax2.bar(positions_2, accept_2, color=COLORS['dflash'],
|
| 149 |
+
edgecolor='white', linewidth=0.5, width=0.5, zorder=3)
|
| 150 |
+
for bar, v in zip(bars2, accept_2):
|
| 151 |
+
ax2.text(bar.get_x() + bar.get_width()/2, v + 1.5, f'{v}%',
|
| 152 |
+
ha='center', fontsize=14, fontweight='bold', color=COLORS['dflash'])
|
| 153 |
+
ax2.axhline(y=20, color=COLORS['gold'], linestyle='--', alpha=0.4)
|
| 154 |
+
ax2.text(1.7, 22, 'break-even', ha='right', fontsize=9, color=COLORS['gold'], alpha=0.6)
|
| 155 |
+
ax2.set_title('st=2: 49% avg acceptance\nEvery position contributes', fontsize=13, fontweight='bold', color=COLORS['dflash'])
|
| 156 |
+
ax2.set_ylim(0, 80)
|
| 157 |
+
ax2.grid(axis='y', alpha=0.1)
|
| 158 |
+
ax2.spines['top'].set_visible(False)
|
| 159 |
+
ax2.spines['right'].set_visible(False)
|
| 160 |
+
ax2.spines['left'].set_color('#333')
|
| 161 |
+
ax2.spines['bottom'].set_color('#333')
|
| 162 |
+
|
| 163 |
+
fig.suptitle('Why 2 Speculative Tokens Beats 8 (K2.5 drafter on K2.6 target)',
|
| 164 |
+
fontsize=15, fontweight='bold', y=1.02)
|
| 165 |
+
fig.tight_layout()
|
| 166 |
+
fig.savefig(OUT / 'acceptance-comparison.png', dpi=150, bbox_inches='tight')
|
| 167 |
+
print('saved acceptance-comparison.png')
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
def chart_latency():
|
| 171 |
+
fig, ax = plt.subplots(figsize=(10, 5))
|
| 172 |
+
|
| 173 |
+
concurrency = [8, 12, 16, 20, 24, 32]
|
| 174 |
+
latency = [31.0, 30.7, 30.8, 30.2, 30.0, 30.7]
|
| 175 |
+
per_user = [15.9, 16.1, 15.7, 16.2, 15.8, 15.9]
|
| 176 |
+
|
| 177 |
+
ax2 = ax.twinx()
|
| 178 |
+
|
| 179 |
+
line1 = ax.plot(concurrency, latency, 'o-', color=COLORS['blue'], linewidth=2.5,
|
| 180 |
+
markersize=10, label='Mean latency (s)', zorder=3)
|
| 181 |
+
ax.fill_between(concurrency, [l-0.5 for l in latency], [l+0.5 for l in latency],
|
| 182 |
+
color=COLORS['blue'], alpha=0.1)
|
| 183 |
+
|
| 184 |
+
line2 = ax2.plot(concurrency, per_user, 's--', color=COLORS['gold'], linewidth=2,
|
| 185 |
+
markersize=8, label='Per-user tok/s', zorder=3)
|
| 186 |
+
|
| 187 |
+
ax.set_xlabel('Concurrent Users', fontsize=13)
|
| 188 |
+
ax.set_ylabel('Mean Latency (seconds)', fontsize=13, color=COLORS['blue'])
|
| 189 |
+
ax2.set_ylabel('Per-User tok/s', fontsize=13, color=COLORS['gold'])
|
| 190 |
+
ax.set_ylim(25, 36)
|
| 191 |
+
ax2.set_ylim(12, 20)
|
| 192 |
+
|
| 193 |
+
lines = line1 + line2
|
| 194 |
+
labels = [l.get_label() for l in lines]
|
| 195 |
+
ax.legend(lines, labels, fontsize=12, loc='upper left', framealpha=0.3)
|
| 196 |
+
|
| 197 |
+
ax.set_title('Latency Stays Flat as Concurrency Scales\n512-token completions, Kimi K2.6 on 8x MI300X',
|
| 198 |
+
fontsize=15, fontweight='bold', pad=15)
|
| 199 |
+
ax.grid(alpha=0.1)
|
| 200 |
+
ax.spines['top'].set_visible(False)
|
| 201 |
+
ax2.spines['top'].set_visible(False)
|
| 202 |
+
ax.spines['left'].set_color('#333')
|
| 203 |
+
ax.spines['right'].set_color('#333')
|
| 204 |
+
ax.spines['bottom'].set_color('#333')
|
| 205 |
+
|
| 206 |
+
fig.tight_layout()
|
| 207 |
+
fig.savefig(OUT / 'latency-flat.png', dpi=150, bbox_inches='tight')
|
| 208 |
+
print('saved latency-flat.png')
|
| 209 |
+
|
| 210 |
+
|
| 211 |
+
def chart_hardware():
|
| 212 |
+
fig, ax = plt.subplots(figsize=(11, 3))
|
| 213 |
+
ax.axis('off')
|
| 214 |
+
|
| 215 |
+
table_data = [
|
| 216 |
+
['8x AMD Instinct MI300X', 'gfx942 (CDNA 3)', '192 GB HBM3 each', '1,536 GB total'],
|
| 217 |
+
['moonshotai/Kimi-K2.6', '1T MoE / 32B active', '256K context', '555 GB (64 shards)'],
|
| 218 |
+
['z-lab/Kimi-K2.5-DFlash', '5 decoder layers', 'Shared embed/lm_head', '6.5 GB'],
|
| 219 |
+
['vLLM v0.19.2 ROCm', 'AITER MoE kernels', 'TRITON_MLA attention', 'DFlash patched'],
|
| 220 |
+
]
|
| 221 |
+
row_labels = ['GPU', 'Target', 'Drafter', 'Runtime']
|
| 222 |
+
col_labels = ['', '', '', '']
|
| 223 |
+
|
| 224 |
+
table = ax.table(cellText=table_data, rowLabels=row_labels,
|
| 225 |
+
loc='center', cellLoc='center')
|
| 226 |
+
table.auto_set_font_size(False)
|
| 227 |
+
table.set_fontsize(11)
|
| 228 |
+
table.scale(1, 1.8)
|
| 229 |
+
|
| 230 |
+
for key, cell in table.get_celld().items():
|
| 231 |
+
cell.set_edgecolor('#333')
|
| 232 |
+
if key[0] == 0:
|
| 233 |
+
cell.set_facecolor('#1a3a2a')
|
| 234 |
+
cell.set_text_props(color=COLORS['dflash'], fontweight='bold')
|
| 235 |
+
elif key[1] == -1:
|
| 236 |
+
cell.set_facecolor('#1a2a3a')
|
| 237 |
+
cell.set_text_props(color=COLORS['blue'], fontweight='bold')
|
| 238 |
+
else:
|
| 239 |
+
cell.set_facecolor(COLORS['bg'])
|
| 240 |
+
cell.set_text_props(color=COLORS['text'])
|
| 241 |
+
|
| 242 |
+
ax.set_title('Hardware & Software Stack', fontsize=14, fontweight='bold',
|
| 243 |
+
pad=10, color=COLORS['text'])
|
| 244 |
+
|
| 245 |
+
fig.patch.set_facecolor(COLORS['bg'])
|
| 246 |
+
fig.tight_layout()
|
| 247 |
+
fig.savefig(OUT / 'hardware-stack.png', dpi=150, bbox_inches='tight')
|
| 248 |
+
print('saved hardware-stack.png')
|
| 249 |
+
|
| 250 |
+
|
| 251 |
+
if __name__ == '__main__':
|
| 252 |
+
chart_throughput_scaling()
|
| 253 |
+
chart_speedup()
|
| 254 |
+
chart_acceptance()
|
| 255 |
+
chart_latency()
|
| 256 |
+
chart_hardware()
|
| 257 |
+
print('all charts generated')
|
assets/hardware-stack.png
ADDED
|
assets/latency-flat.png
ADDED
|
assets/optimization-journey.png
ADDED
|
assets/throughput-scaling.png
ADDED
|
benchmarks/CLEAN-dflash-st2-c12.json
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"results": [
|
| 3 |
+
{
|
| 4 |
+
"completion_tokens": 512,
|
| 5 |
+
"error": null,
|
| 6 |
+
"finish_reason": "length",
|
| 7 |
+
"latency_seconds": 27.119965960009722,
|
| 8 |
+
"ok": true,
|
| 9 |
+
"prompt_tokens": 84,
|
| 10 |
+
"total_tokens": 596,
|
| 11 |
+
"ttft_seconds": null
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"completion_tokens": 512,
|
| 15 |
+
"error": null,
|
| 16 |
+
"finish_reason": "length",
|
| 17 |
+
"latency_seconds": 28.847466292994795,
|
| 18 |
+
"ok": true,
|
| 19 |
+
"prompt_tokens": 53,
|
| 20 |
+
"total_tokens": 565,
|
| 21 |
+
"ttft_seconds": null
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"completion_tokens": 512,
|
| 25 |
+
"error": null,
|
| 26 |
+
"finish_reason": "length",
|
| 27 |
+
"latency_seconds": 28.8515811850084,
|
| 28 |
+
"ok": true,
|
| 29 |
+
"prompt_tokens": 70,
|
| 30 |
+
"total_tokens": 582,
|
| 31 |
+
"ttft_seconds": null
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"completion_tokens": 512,
|
| 35 |
+
"error": null,
|
| 36 |
+
"finish_reason": "length",
|
| 37 |
+
"latency_seconds": 28.960750498008565,
|
| 38 |
+
"ok": true,
|
| 39 |
+
"prompt_tokens": 59,
|
| 40 |
+
"total_tokens": 571,
|
| 41 |
+
"ttft_seconds": null
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"completion_tokens": 512,
|
| 45 |
+
"error": null,
|
| 46 |
+
"finish_reason": "length",
|
| 47 |
+
"latency_seconds": 30.34562196600018,
|
| 48 |
+
"ok": true,
|
| 49 |
+
"prompt_tokens": 74,
|
| 50 |
+
"total_tokens": 586,
|
| 51 |
+
"ttft_seconds": null
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"completion_tokens": 512,
|
| 55 |
+
"error": null,
|
| 56 |
+
"finish_reason": "length",
|
| 57 |
+
"latency_seconds": 30.570014204000472,
|
| 58 |
+
"ok": true,
|
| 59 |
+
"prompt_tokens": 57,
|
| 60 |
+
"total_tokens": 569,
|
| 61 |
+
"ttft_seconds": null
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"completion_tokens": 512,
|
| 65 |
+
"error": null,
|
| 66 |
+
"finish_reason": "length",
|
| 67 |
+
"latency_seconds": 31.136799433996202,
|
| 68 |
+
"ok": true,
|
| 69 |
+
"prompt_tokens": 67,
|
| 70 |
+
"total_tokens": 579,
|
| 71 |
+
"ttft_seconds": null
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"completion_tokens": 512,
|
| 75 |
+
"error": null,
|
| 76 |
+
"finish_reason": "length",
|
| 77 |
+
"latency_seconds": 32.07404939499975,
|
| 78 |
+
"ok": true,
|
| 79 |
+
"prompt_tokens": 69,
|
| 80 |
+
"total_tokens": 581,
|
| 81 |
+
"ttft_seconds": null
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"completion_tokens": 512,
|
| 85 |
+
"error": null,
|
| 86 |
+
"finish_reason": "length",
|
| 87 |
+
"latency_seconds": 56.03814566100482,
|
| 88 |
+
"ok": true,
|
| 89 |
+
"prompt_tokens": 52,
|
| 90 |
+
"total_tokens": 564,
|
| 91 |
+
"ttft_seconds": null
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"completion_tokens": 512,
|
| 95 |
+
"error": null,
|
| 96 |
+
"finish_reason": "length",
|
| 97 |
+
"latency_seconds": 58.61083839098865,
|
| 98 |
+
"ok": true,
|
| 99 |
+
"prompt_tokens": 66,
|
| 100 |
+
"total_tokens": 578,
|
| 101 |
+
"ttft_seconds": null
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"completion_tokens": 512,
|
| 105 |
+
"error": null,
|
| 106 |
+
"finish_reason": "length",
|
| 107 |
+
"latency_seconds": 31.83526515599806,
|
| 108 |
+
"ok": true,
|
| 109 |
+
"prompt_tokens": 63,
|
| 110 |
+
"total_tokens": 575,
|
| 111 |
+
"ttft_seconds": null
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"completion_tokens": 512,
|
| 115 |
+
"error": null,
|
| 116 |
+
"finish_reason": "length",
|
| 117 |
+
"latency_seconds": 59.17823252400558,
|
| 118 |
+
"ok": true,
|
| 119 |
+
"prompt_tokens": 65,
|
| 120 |
+
"total_tokens": 577,
|
| 121 |
+
"ttft_seconds": null
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"completion_tokens": 512,
|
| 125 |
+
"error": null,
|
| 126 |
+
"finish_reason": "length",
|
| 127 |
+
"latency_seconds": 60.24104564599111,
|
| 128 |
+
"ok": true,
|
| 129 |
+
"prompt_tokens": 49,
|
| 130 |
+
"total_tokens": 561,
|
| 131 |
+
"ttft_seconds": null
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"completion_tokens": 512,
|
| 135 |
+
"error": null,
|
| 136 |
+
"finish_reason": "length",
|
| 137 |
+
"latency_seconds": 31.961778358003357,
|
| 138 |
+
"ok": true,
|
| 139 |
+
"prompt_tokens": 48,
|
| 140 |
+
"total_tokens": 560,
|
| 141 |
+
"ttft_seconds": null
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"completion_tokens": 512,
|
| 145 |
+
"error": null,
|
| 146 |
+
"finish_reason": "length",
|
| 147 |
+
"latency_seconds": 34.7905467919918,
|
| 148 |
+
"ok": true,
|
| 149 |
+
"prompt_tokens": 47,
|
| 150 |
+
"total_tokens": 559,
|
| 151 |
+
"ttft_seconds": null
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"completion_tokens": 512,
|
| 155 |
+
"error": null,
|
| 156 |
+
"finish_reason": "length",
|
| 157 |
+
"latency_seconds": 35.47256097799982,
|
| 158 |
+
"ok": true,
|
| 159 |
+
"prompt_tokens": 54,
|
| 160 |
+
"total_tokens": 566,
|
| 161 |
+
"ttft_seconds": null
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"completion_tokens": 512,
|
| 165 |
+
"error": null,
|
| 166 |
+
"finish_reason": "length",
|
| 167 |
+
"latency_seconds": 54.99662993500533,
|
| 168 |
+
"ok": true,
|
| 169 |
+
"prompt_tokens": 70,
|
| 170 |
+
"total_tokens": 582,
|
| 171 |
+
"ttft_seconds": null
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"completion_tokens": 512,
|
| 175 |
+
"error": null,
|
| 176 |
+
"finish_reason": "length",
|
| 177 |
+
"latency_seconds": 56.382647035003174,
|
| 178 |
+
"ok": true,
|
| 179 |
+
"prompt_tokens": 84,
|
| 180 |
+
"total_tokens": 596,
|
| 181 |
+
"ttft_seconds": null
|
| 182 |
+
},
|
| 183 |
+
{
|
| 184 |
+
"completion_tokens": 512,
|
| 185 |
+
"error": null,
|
| 186 |
+
"finish_reason": "length",
|
| 187 |
+
"latency_seconds": 57.87489461500081,
|
| 188 |
+
"ok": true,
|
| 189 |
+
"prompt_tokens": 74,
|
| 190 |
+
"total_tokens": 586,
|
| 191 |
+
"ttft_seconds": null
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"completion_tokens": 512,
|
| 195 |
+
"error": null,
|
| 196 |
+
"finish_reason": "length",
|
| 197 |
+
"latency_seconds": 31.31652324499737,
|
| 198 |
+
"ok": true,
|
| 199 |
+
"prompt_tokens": 59,
|
| 200 |
+
"total_tokens": 571,
|
| 201 |
+
"ttft_seconds": null
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"completion_tokens": 512,
|
| 205 |
+
"error": null,
|
| 206 |
+
"finish_reason": "length",
|
| 207 |
+
"latency_seconds": 58.09549221000634,
|
| 208 |
+
"ok": true,
|
| 209 |
+
"prompt_tokens": 67,
|
| 210 |
+
"total_tokens": 579,
|
| 211 |
+
"ttft_seconds": null
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"completion_tokens": 512,
|
| 215 |
+
"error": null,
|
| 216 |
+
"finish_reason": "length",
|
| 217 |
+
"latency_seconds": 34.355430376992445,
|
| 218 |
+
"ok": true,
|
| 219 |
+
"prompt_tokens": 69,
|
| 220 |
+
"total_tokens": 581,
|
| 221 |
+
"ttft_seconds": null
|
| 222 |
+
},
|
| 223 |
+
{
|
| 224 |
+
"completion_tokens": 512,
|
| 225 |
+
"error": null,
|
| 226 |
+
"finish_reason": "length",
|
| 227 |
+
"latency_seconds": 34.75117868400412,
|
| 228 |
+
"ok": true,
|
| 229 |
+
"prompt_tokens": 57,
|
| 230 |
+
"total_tokens": 569,
|
| 231 |
+
"ttft_seconds": null
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"completion_tokens": 512,
|
| 235 |
+
"error": null,
|
| 236 |
+
"finish_reason": "length",
|
| 237 |
+
"latency_seconds": 35.434746750994236,
|
| 238 |
+
"ok": true,
|
| 239 |
+
"prompt_tokens": 53,
|
| 240 |
+
"total_tokens": 565,
|
| 241 |
+
"ttft_seconds": null
|
| 242 |
+
}
|
| 243 |
+
],
|
| 244 |
+
"summary": {
|
| 245 |
+
"concurrency": 12,
|
| 246 |
+
"errors": [],
|
| 247 |
+
"failed_requests": 0,
|
| 248 |
+
"mean_interactive_tps": null,
|
| 249 |
+
"mean_latency_seconds": 40.385091887208546,
|
| 250 |
+
"mean_ttft_seconds": null,
|
| 251 |
+
"output_token_throughput_tps": 129.86944795587917,
|
| 252 |
+
"p95_interactive_tps": null,
|
| 253 |
+
"p95_latency_seconds": 59.09312340405304,
|
| 254 |
+
"p95_ttft_seconds": null,
|
| 255 |
+
"request_count": 24,
|
| 256 |
+
"request_throughput_rps": 0.2536512655388265,
|
| 257 |
+
"successful_requests": 24,
|
| 258 |
+
"total_completion_tokens": 12288,
|
| 259 |
+
"total_prompt_tokens": 1510,
|
| 260 |
+
"wall_seconds": 94.61809681500017
|
| 261 |
+
}
|
| 262 |
+
}
|
benchmarks/CLEAN-dflash-st2-c8.json
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"results": [
|
| 3 |
+
{
|
| 4 |
+
"completion_tokens": 512,
|
| 5 |
+
"error": null,
|
| 6 |
+
"finish_reason": "length",
|
| 7 |
+
"latency_seconds": 27.653070675005438,
|
| 8 |
+
"ok": true,
|
| 9 |
+
"prompt_tokens": 84,
|
| 10 |
+
"total_tokens": 596,
|
| 11 |
+
"ttft_seconds": null
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"completion_tokens": 512,
|
| 15 |
+
"error": null,
|
| 16 |
+
"finish_reason": "length",
|
| 17 |
+
"latency_seconds": 30.492271046998212,
|
| 18 |
+
"ok": true,
|
| 19 |
+
"prompt_tokens": 59,
|
| 20 |
+
"total_tokens": 571,
|
| 21 |
+
"ttft_seconds": null
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"completion_tokens": 512,
|
| 25 |
+
"error": null,
|
| 26 |
+
"finish_reason": "length",
|
| 27 |
+
"latency_seconds": 30.60518449699157,
|
| 28 |
+
"ok": true,
|
| 29 |
+
"prompt_tokens": 53,
|
| 30 |
+
"total_tokens": 565,
|
| 31 |
+
"ttft_seconds": null
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"completion_tokens": 512,
|
| 35 |
+
"error": null,
|
| 36 |
+
"finish_reason": "length",
|
| 37 |
+
"latency_seconds": 31.15824187399994,
|
| 38 |
+
"ok": true,
|
| 39 |
+
"prompt_tokens": 70,
|
| 40 |
+
"total_tokens": 582,
|
| 41 |
+
"ttft_seconds": null
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"completion_tokens": 512,
|
| 45 |
+
"error": null,
|
| 46 |
+
"finish_reason": "length",
|
| 47 |
+
"latency_seconds": 31.728173413008335,
|
| 48 |
+
"ok": true,
|
| 49 |
+
"prompt_tokens": 69,
|
| 50 |
+
"total_tokens": 581,
|
| 51 |
+
"ttft_seconds": null
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"completion_tokens": 512,
|
| 55 |
+
"error": null,
|
| 56 |
+
"finish_reason": "length",
|
| 57 |
+
"latency_seconds": 31.840813989998423,
|
| 58 |
+
"ok": true,
|
| 59 |
+
"prompt_tokens": 57,
|
| 60 |
+
"total_tokens": 569,
|
| 61 |
+
"ttft_seconds": null
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"completion_tokens": 512,
|
| 65 |
+
"error": null,
|
| 66 |
+
"finish_reason": "length",
|
| 67 |
+
"latency_seconds": 32.0710041429993,
|
| 68 |
+
"ok": true,
|
| 69 |
+
"prompt_tokens": 74,
|
| 70 |
+
"total_tokens": 586,
|
| 71 |
+
"ttft_seconds": null
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"completion_tokens": 512,
|
| 75 |
+
"error": null,
|
| 76 |
+
"finish_reason": "length",
|
| 77 |
+
"latency_seconds": 32.54212190301041,
|
| 78 |
+
"ok": true,
|
| 79 |
+
"prompt_tokens": 67,
|
| 80 |
+
"total_tokens": 579,
|
| 81 |
+
"ttft_seconds": null
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"completion_tokens": 512,
|
| 85 |
+
"error": null,
|
| 86 |
+
"finish_reason": "length",
|
| 87 |
+
"latency_seconds": 27.12593254300009,
|
| 88 |
+
"ok": true,
|
| 89 |
+
"prompt_tokens": 52,
|
| 90 |
+
"total_tokens": 564,
|
| 91 |
+
"ttft_seconds": null
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"completion_tokens": 512,
|
| 95 |
+
"error": null,
|
| 96 |
+
"finish_reason": "length",
|
| 97 |
+
"latency_seconds": 26.749147009002627,
|
| 98 |
+
"ok": true,
|
| 99 |
+
"prompt_tokens": 63,
|
| 100 |
+
"total_tokens": 575,
|
| 101 |
+
"ttft_seconds": null
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"completion_tokens": 512,
|
| 105 |
+
"error": null,
|
| 106 |
+
"finish_reason": "length",
|
| 107 |
+
"latency_seconds": 29.480900153997936,
|
| 108 |
+
"ok": true,
|
| 109 |
+
"prompt_tokens": 66,
|
| 110 |
+
"total_tokens": 578,
|
| 111 |
+
"ttft_seconds": null
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"completion_tokens": 512,
|
| 115 |
+
"error": null,
|
| 116 |
+
"finish_reason": "length",
|
| 117 |
+
"latency_seconds": 29.571540491000633,
|
| 118 |
+
"ok": true,
|
| 119 |
+
"prompt_tokens": 49,
|
| 120 |
+
"total_tokens": 561,
|
| 121 |
+
"ttft_seconds": null
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"completion_tokens": 512,
|
| 125 |
+
"error": null,
|
| 126 |
+
"finish_reason": "length",
|
| 127 |
+
"latency_seconds": 31.3413551870035,
|
| 128 |
+
"ok": true,
|
| 129 |
+
"prompt_tokens": 65,
|
| 130 |
+
"total_tokens": 577,
|
| 131 |
+
"ttft_seconds": null
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"completion_tokens": 512,
|
| 135 |
+
"error": null,
|
| 136 |
+
"finish_reason": "length",
|
| 137 |
+
"latency_seconds": 30.85938804798934,
|
| 138 |
+
"ok": true,
|
| 139 |
+
"prompt_tokens": 47,
|
| 140 |
+
"total_tokens": 559,
|
| 141 |
+
"ttft_seconds": null
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"completion_tokens": 512,
|
| 145 |
+
"error": null,
|
| 146 |
+
"finish_reason": "length",
|
| 147 |
+
"latency_seconds": 31.78007578200777,
|
| 148 |
+
"ok": true,
|
| 149 |
+
"prompt_tokens": 48,
|
| 150 |
+
"total_tokens": 560,
|
| 151 |
+
"ttft_seconds": null
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"completion_tokens": 512,
|
| 155 |
+
"error": null,
|
| 156 |
+
"finish_reason": "length",
|
| 157 |
+
"latency_seconds": 31.284076141993864,
|
| 158 |
+
"ok": true,
|
| 159 |
+
"prompt_tokens": 54,
|
| 160 |
+
"total_tokens": 566,
|
| 161 |
+
"ttft_seconds": null
|
| 162 |
+
}
|
| 163 |
+
],
|
| 164 |
+
"summary": {
|
| 165 |
+
"concurrency": 8,
|
| 166 |
+
"errors": [],
|
| 167 |
+
"failed_requests": 0,
|
| 168 |
+
"mean_interactive_tps": null,
|
| 169 |
+
"mean_latency_seconds": 30.392706056125462,
|
| 170 |
+
"mean_ttft_seconds": null,
|
| 171 |
+
"output_token_throughput_tps": 128.3439615442102,
|
| 172 |
+
"p95_interactive_tps": null,
|
| 173 |
+
"p95_latency_seconds": 32.18878358300208,
|
| 174 |
+
"p95_ttft_seconds": null,
|
| 175 |
+
"request_count": 16,
|
| 176 |
+
"request_throughput_rps": 0.25067179989103555,
|
| 177 |
+
"successful_requests": 16,
|
| 178 |
+
"total_completion_tokens": 8192,
|
| 179 |
+
"total_prompt_tokens": 977,
|
| 180 |
+
"wall_seconds": 63.82848013599869
|
| 181 |
+
}
|
| 182 |
+
}
|
benchmarks/CLEAN-dflash-st2-s16-c12.json
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"results": [
|
| 3 |
+
{
|
| 4 |
+
"completion_tokens": 512,
|
| 5 |
+
"error": null,
|
| 6 |
+
"finish_reason": "length",
|
| 7 |
+
"latency_seconds": 28.36441381899931,
|
| 8 |
+
"ok": true,
|
| 9 |
+
"prompt_tokens": 84,
|
| 10 |
+
"total_tokens": 596,
|
| 11 |
+
"ttft_seconds": null
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"completion_tokens": 512,
|
| 15 |
+
"error": null,
|
| 16 |
+
"finish_reason": "length",
|
| 17 |
+
"latency_seconds": 29.38170883100247,
|
| 18 |
+
"ok": true,
|
| 19 |
+
"prompt_tokens": 59,
|
| 20 |
+
"total_tokens": 571,
|
| 21 |
+
"ttft_seconds": null
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"completion_tokens": 512,
|
| 25 |
+
"error": null,
|
| 26 |
+
"finish_reason": "length",
|
| 27 |
+
"latency_seconds": 30.230523204998462,
|
| 28 |
+
"ok": true,
|
| 29 |
+
"prompt_tokens": 53,
|
| 30 |
+
"total_tokens": 565,
|
| 31 |
+
"ttft_seconds": null
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"completion_tokens": 512,
|
| 35 |
+
"error": null,
|
| 36 |
+
"finish_reason": "length",
|
| 37 |
+
"latency_seconds": 30.46691610700509,
|
| 38 |
+
"ok": true,
|
| 39 |
+
"prompt_tokens": 70,
|
| 40 |
+
"total_tokens": 582,
|
| 41 |
+
"ttft_seconds": null
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"completion_tokens": 512,
|
| 45 |
+
"error": null,
|
| 46 |
+
"finish_reason": "length",
|
| 47 |
+
"latency_seconds": 30.757115915999748,
|
| 48 |
+
"ok": true,
|
| 49 |
+
"prompt_tokens": 66,
|
| 50 |
+
"total_tokens": 578,
|
| 51 |
+
"ttft_seconds": null
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"completion_tokens": 512,
|
| 55 |
+
"error": null,
|
| 56 |
+
"finish_reason": "length",
|
| 57 |
+
"latency_seconds": 30.945035171011114,
|
| 58 |
+
"ok": true,
|
| 59 |
+
"prompt_tokens": 74,
|
| 60 |
+
"total_tokens": 586,
|
| 61 |
+
"ttft_seconds": null
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"completion_tokens": 512,
|
| 65 |
+
"error": null,
|
| 66 |
+
"finish_reason": "length",
|
| 67 |
+
"latency_seconds": 31.29521356600162,
|
| 68 |
+
"ok": true,
|
| 69 |
+
"prompt_tokens": 57,
|
| 70 |
+
"total_tokens": 569,
|
| 71 |
+
"ttft_seconds": null
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"completion_tokens": 512,
|
| 75 |
+
"error": null,
|
| 76 |
+
"finish_reason": "length",
|
| 77 |
+
"latency_seconds": 31.42426669699489,
|
| 78 |
+
"ok": true,
|
| 79 |
+
"prompt_tokens": 49,
|
| 80 |
+
"total_tokens": 561,
|
| 81 |
+
"ttft_seconds": null
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"completion_tokens": 512,
|
| 85 |
+
"error": null,
|
| 86 |
+
"finish_reason": "length",
|
| 87 |
+
"latency_seconds": 31.428273042009096,
|
| 88 |
+
"ok": true,
|
| 89 |
+
"prompt_tokens": 67,
|
| 90 |
+
"total_tokens": 579,
|
| 91 |
+
"ttft_seconds": null
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"completion_tokens": 512,
|
| 95 |
+
"error": null,
|
| 96 |
+
"finish_reason": "length",
|
| 97 |
+
"latency_seconds": 31.42551057599485,
|
| 98 |
+
"ok": true,
|
| 99 |
+
"prompt_tokens": 65,
|
| 100 |
+
"total_tokens": 577,
|
| 101 |
+
"ttft_seconds": null
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"completion_tokens": 512,
|
| 105 |
+
"error": null,
|
| 106 |
+
"finish_reason": "length",
|
| 107 |
+
"latency_seconds": 31.542974988988135,
|
| 108 |
+
"ok": true,
|
| 109 |
+
"prompt_tokens": 69,
|
| 110 |
+
"total_tokens": 581,
|
| 111 |
+
"ttft_seconds": null
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"completion_tokens": 512,
|
| 115 |
+
"error": null,
|
| 116 |
+
"finish_reason": "length",
|
| 117 |
+
"latency_seconds": 31.54080958200211,
|
| 118 |
+
"ok": true,
|
| 119 |
+
"prompt_tokens": 52,
|
| 120 |
+
"total_tokens": 564,
|
| 121 |
+
"ttft_seconds": null
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"completion_tokens": 512,
|
| 125 |
+
"error": null,
|
| 126 |
+
"finish_reason": "length",
|
| 127 |
+
"latency_seconds": 28.83334150200244,
|
| 128 |
+
"ok": true,
|
| 129 |
+
"prompt_tokens": 63,
|
| 130 |
+
"total_tokens": 575,
|
| 131 |
+
"ttft_seconds": null
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"completion_tokens": 512,
|
| 135 |
+
"error": null,
|
| 136 |
+
"finish_reason": "length",
|
| 137 |
+
"latency_seconds": 28.014462072009337,
|
| 138 |
+
"ok": true,
|
| 139 |
+
"prompt_tokens": 84,
|
| 140 |
+
"total_tokens": 596,
|
| 141 |
+
"ttft_seconds": null
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"completion_tokens": 512,
|
| 145 |
+
"error": null,
|
| 146 |
+
"finish_reason": "length",
|
| 147 |
+
"latency_seconds": 28.36301533599908,
|
| 148 |
+
"ok": true,
|
| 149 |
+
"prompt_tokens": 53,
|
| 150 |
+
"total_tokens": 565,
|
| 151 |
+
"ttft_seconds": null
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"completion_tokens": 512,
|
| 155 |
+
"error": null,
|
| 156 |
+
"finish_reason": "length",
|
| 157 |
+
"latency_seconds": 29.13996660000703,
|
| 158 |
+
"ok": true,
|
| 159 |
+
"prompt_tokens": 59,
|
| 160 |
+
"total_tokens": 571,
|
| 161 |
+
"ttft_seconds": null
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"completion_tokens": 512,
|
| 165 |
+
"error": null,
|
| 166 |
+
"finish_reason": "length",
|
| 167 |
+
"latency_seconds": 30.571012644999428,
|
| 168 |
+
"ok": true,
|
| 169 |
+
"prompt_tokens": 47,
|
| 170 |
+
"total_tokens": 559,
|
| 171 |
+
"ttft_seconds": null
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"completion_tokens": 512,
|
| 175 |
+
"error": null,
|
| 176 |
+
"finish_reason": "length",
|
| 177 |
+
"latency_seconds": 30.000165388002642,
|
| 178 |
+
"ok": true,
|
| 179 |
+
"prompt_tokens": 74,
|
| 180 |
+
"total_tokens": 586,
|
| 181 |
+
"ttft_seconds": null
|
| 182 |
+
},
|
| 183 |
+
{
|
| 184 |
+
"completion_tokens": 512,
|
| 185 |
+
"error": null,
|
| 186 |
+
"finish_reason": "length",
|
| 187 |
+
"latency_seconds": 32.85263038999983,
|
| 188 |
+
"ok": true,
|
| 189 |
+
"prompt_tokens": 48,
|
| 190 |
+
"total_tokens": 560,
|
| 191 |
+
"ttft_seconds": null
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"completion_tokens": 512,
|
| 195 |
+
"error": null,
|
| 196 |
+
"finish_reason": "length",
|
| 197 |
+
"latency_seconds": 31.410605757002486,
|
| 198 |
+
"ok": true,
|
| 199 |
+
"prompt_tokens": 69,
|
| 200 |
+
"total_tokens": 581,
|
| 201 |
+
"ttft_seconds": null
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"completion_tokens": 512,
|
| 205 |
+
"error": null,
|
| 206 |
+
"finish_reason": "length",
|
| 207 |
+
"latency_seconds": 32.195647993998136,
|
| 208 |
+
"ok": true,
|
| 209 |
+
"prompt_tokens": 70,
|
| 210 |
+
"total_tokens": 582,
|
| 211 |
+
"ttft_seconds": null
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"completion_tokens": 512,
|
| 215 |
+
"error": null,
|
| 216 |
+
"finish_reason": "length",
|
| 217 |
+
"latency_seconds": 31.52967824100051,
|
| 218 |
+
"ok": true,
|
| 219 |
+
"prompt_tokens": 57,
|
| 220 |
+
"total_tokens": 569,
|
| 221 |
+
"ttft_seconds": null
|
| 222 |
+
},
|
| 223 |
+
{
|
| 224 |
+
"completion_tokens": 512,
|
| 225 |
+
"error": null,
|
| 226 |
+
"finish_reason": "length",
|
| 227 |
+
"latency_seconds": 32.956455432009534,
|
| 228 |
+
"ok": true,
|
| 229 |
+
"prompt_tokens": 54,
|
| 230 |
+
"total_tokens": 566,
|
| 231 |
+
"ttft_seconds": null
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"completion_tokens": 512,
|
| 235 |
+
"error": null,
|
| 236 |
+
"finish_reason": "length",
|
| 237 |
+
"latency_seconds": 32.319247502993676,
|
| 238 |
+
"ok": true,
|
| 239 |
+
"prompt_tokens": 67,
|
| 240 |
+
"total_tokens": 579,
|
| 241 |
+
"ttft_seconds": null
|
| 242 |
+
}
|
| 243 |
+
],
|
| 244 |
+
"summary": {
|
| 245 |
+
"concurrency": 12,
|
| 246 |
+
"errors": [],
|
| 247 |
+
"failed_requests": 0,
|
| 248 |
+
"mean_interactive_tps": null,
|
| 249 |
+
"mean_latency_seconds": 30.707874598376293,
|
| 250 |
+
"mean_ttft_seconds": null,
|
| 251 |
+
"output_token_throughput_tps": 192.7539484224078,
|
| 252 |
+
"p95_interactive_tps": null,
|
| 253 |
+
"p95_latency_seconds": 32.77262295694891,
|
| 254 |
+
"p95_ttft_seconds": null,
|
| 255 |
+
"request_count": 24,
|
| 256 |
+
"request_throughput_rps": 0.37647255551251524,
|
| 257 |
+
"successful_requests": 24,
|
| 258 |
+
"total_completion_tokens": 12288,
|
| 259 |
+
"total_prompt_tokens": 1510,
|
| 260 |
+
"wall_seconds": 63.74966687100823
|
| 261 |
+
}
|
| 262 |
+
}
|
benchmarks/CLEAN-dflash-st2-s16-c16.json
ADDED
|
@@ -0,0 +1,342 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"results": [
|
| 3 |
+
{
|
| 4 |
+
"completion_tokens": 512,
|
| 5 |
+
"error": null,
|
| 6 |
+
"finish_reason": "length",
|
| 7 |
+
"latency_seconds": 28.36677018199407,
|
| 8 |
+
"ok": true,
|
| 9 |
+
"prompt_tokens": 63,
|
| 10 |
+
"total_tokens": 575,
|
| 11 |
+
"ttft_seconds": null
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"completion_tokens": 512,
|
| 15 |
+
"error": null,
|
| 16 |
+
"finish_reason": "length",
|
| 17 |
+
"latency_seconds": 29.074504051997792,
|
| 18 |
+
"ok": true,
|
| 19 |
+
"prompt_tokens": 66,
|
| 20 |
+
"total_tokens": 578,
|
| 21 |
+
"ttft_seconds": null
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"completion_tokens": 512,
|
| 25 |
+
"error": null,
|
| 26 |
+
"finish_reason": "length",
|
| 27 |
+
"latency_seconds": 29.262313822997385,
|
| 28 |
+
"ok": true,
|
| 29 |
+
"prompt_tokens": 52,
|
| 30 |
+
"total_tokens": 564,
|
| 31 |
+
"ttft_seconds": null
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"completion_tokens": 512,
|
| 35 |
+
"error": null,
|
| 36 |
+
"finish_reason": "length",
|
| 37 |
+
"latency_seconds": 30.23330927400093,
|
| 38 |
+
"ok": true,
|
| 39 |
+
"prompt_tokens": 70,
|
| 40 |
+
"total_tokens": 582,
|
| 41 |
+
"ttft_seconds": null
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"completion_tokens": 512,
|
| 45 |
+
"error": null,
|
| 46 |
+
"finish_reason": "length",
|
| 47 |
+
"latency_seconds": 30.23297259400715,
|
| 48 |
+
"ok": true,
|
| 49 |
+
"prompt_tokens": 84,
|
| 50 |
+
"total_tokens": 596,
|
| 51 |
+
"ttft_seconds": null
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"completion_tokens": 512,
|
| 55 |
+
"error": null,
|
| 56 |
+
"finish_reason": "length",
|
| 57 |
+
"latency_seconds": 30.347619171996485,
|
| 58 |
+
"ok": true,
|
| 59 |
+
"prompt_tokens": 53,
|
| 60 |
+
"total_tokens": 565,
|
| 61 |
+
"ttft_seconds": null
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"completion_tokens": 512,
|
| 65 |
+
"error": null,
|
| 66 |
+
"finish_reason": "length",
|
| 67 |
+
"latency_seconds": 30.668740354987676,
|
| 68 |
+
"ok": true,
|
| 69 |
+
"prompt_tokens": 74,
|
| 70 |
+
"total_tokens": 586,
|
| 71 |
+
"ttft_seconds": null
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"completion_tokens": 512,
|
| 75 |
+
"error": null,
|
| 76 |
+
"finish_reason": "length",
|
| 77 |
+
"latency_seconds": 30.90440146299079,
|
| 78 |
+
"ok": true,
|
| 79 |
+
"prompt_tokens": 57,
|
| 80 |
+
"total_tokens": 569,
|
| 81 |
+
"ttft_seconds": null
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"completion_tokens": 512,
|
| 85 |
+
"error": null,
|
| 86 |
+
"finish_reason": "length",
|
| 87 |
+
"latency_seconds": 31.140306589993997,
|
| 88 |
+
"ok": true,
|
| 89 |
+
"prompt_tokens": 65,
|
| 90 |
+
"total_tokens": 577,
|
| 91 |
+
"ttft_seconds": null
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"completion_tokens": 512,
|
| 95 |
+
"error": null,
|
| 96 |
+
"finish_reason": "length",
|
| 97 |
+
"latency_seconds": 31.375962200007052,
|
| 98 |
+
"ok": true,
|
| 99 |
+
"prompt_tokens": 47,
|
| 100 |
+
"total_tokens": 559,
|
| 101 |
+
"ttft_seconds": null
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"completion_tokens": 512,
|
| 105 |
+
"error": null,
|
| 106 |
+
"finish_reason": "length",
|
| 107 |
+
"latency_seconds": 31.875354996998794,
|
| 108 |
+
"ok": true,
|
| 109 |
+
"prompt_tokens": 54,
|
| 110 |
+
"total_tokens": 566,
|
| 111 |
+
"ttft_seconds": null
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"completion_tokens": 512,
|
| 115 |
+
"error": null,
|
| 116 |
+
"finish_reason": "length",
|
| 117 |
+
"latency_seconds": 31.876913771993713,
|
| 118 |
+
"ok": true,
|
| 119 |
+
"prompt_tokens": 49,
|
| 120 |
+
"total_tokens": 561,
|
| 121 |
+
"ttft_seconds": null
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"completion_tokens": 512,
|
| 125 |
+
"error": null,
|
| 126 |
+
"finish_reason": "length",
|
| 127 |
+
"latency_seconds": 32.11174412199762,
|
| 128 |
+
"ok": true,
|
| 129 |
+
"prompt_tokens": 48,
|
| 130 |
+
"total_tokens": 560,
|
| 131 |
+
"ttft_seconds": null
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"completion_tokens": 512,
|
| 135 |
+
"error": null,
|
| 136 |
+
"finish_reason": "length",
|
| 137 |
+
"latency_seconds": 32.35151076900365,
|
| 138 |
+
"ok": true,
|
| 139 |
+
"prompt_tokens": 67,
|
| 140 |
+
"total_tokens": 579,
|
| 141 |
+
"ttft_seconds": null
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"completion_tokens": 512,
|
| 145 |
+
"error": null,
|
| 146 |
+
"finish_reason": "length",
|
| 147 |
+
"latency_seconds": 32.822171527994215,
|
| 148 |
+
"ok": true,
|
| 149 |
+
"prompt_tokens": 69,
|
| 150 |
+
"total_tokens": 581,
|
| 151 |
+
"ttft_seconds": null
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"completion_tokens": 512,
|
| 155 |
+
"error": null,
|
| 156 |
+
"finish_reason": "length",
|
| 157 |
+
"latency_seconds": 33.05540608998854,
|
| 158 |
+
"ok": true,
|
| 159 |
+
"prompt_tokens": 59,
|
| 160 |
+
"total_tokens": 571,
|
| 161 |
+
"ttft_seconds": null
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"completion_tokens": 512,
|
| 165 |
+
"error": null,
|
| 166 |
+
"finish_reason": "length",
|
| 167 |
+
"latency_seconds": 28.02749521500664,
|
| 168 |
+
"ok": true,
|
| 169 |
+
"prompt_tokens": 84,
|
| 170 |
+
"total_tokens": 596,
|
| 171 |
+
"ttft_seconds": null
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"completion_tokens": 512,
|
| 175 |
+
"error": null,
|
| 176 |
+
"finish_reason": "length",
|
| 177 |
+
"latency_seconds": 28.82376928400481,
|
| 178 |
+
"ok": true,
|
| 179 |
+
"prompt_tokens": 53,
|
| 180 |
+
"total_tokens": 565,
|
| 181 |
+
"ttft_seconds": null
|
| 182 |
+
},
|
| 183 |
+
{
|
| 184 |
+
"completion_tokens": 512,
|
| 185 |
+
"error": null,
|
| 186 |
+
"finish_reason": "length",
|
| 187 |
+
"latency_seconds": 31.709762905011303,
|
| 188 |
+
"ok": true,
|
| 189 |
+
"prompt_tokens": 70,
|
| 190 |
+
"total_tokens": 582,
|
| 191 |
+
"ttft_seconds": null
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"completion_tokens": 512,
|
| 195 |
+
"error": null,
|
| 196 |
+
"finish_reason": "length",
|
| 197 |
+
"latency_seconds": 29.84934190599597,
|
| 198 |
+
"ok": true,
|
| 199 |
+
"prompt_tokens": 59,
|
| 200 |
+
"total_tokens": 571,
|
| 201 |
+
"ttft_seconds": null
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"completion_tokens": 512,
|
| 205 |
+
"error": null,
|
| 206 |
+
"finish_reason": "length",
|
| 207 |
+
"latency_seconds": 31.67309095399105,
|
| 208 |
+
"ok": true,
|
| 209 |
+
"prompt_tokens": 74,
|
| 210 |
+
"total_tokens": 586,
|
| 211 |
+
"ttft_seconds": null
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"completion_tokens": 512,
|
| 215 |
+
"error": null,
|
| 216 |
+
"finish_reason": "length",
|
| 217 |
+
"latency_seconds": 30.154514046997065,
|
| 218 |
+
"ok": true,
|
| 219 |
+
"prompt_tokens": 52,
|
| 220 |
+
"total_tokens": 564,
|
| 221 |
+
"ttft_seconds": null
|
| 222 |
+
},
|
| 223 |
+
{
|
| 224 |
+
"completion_tokens": 512,
|
| 225 |
+
"error": null,
|
| 226 |
+
"finish_reason": "length",
|
| 227 |
+
"latency_seconds": 30.7461334450054,
|
| 228 |
+
"ok": true,
|
| 229 |
+
"prompt_tokens": 57,
|
| 230 |
+
"total_tokens": 569,
|
| 231 |
+
"ttft_seconds": null
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"completion_tokens": 512,
|
| 235 |
+
"error": null,
|
| 236 |
+
"finish_reason": "length",
|
| 237 |
+
"latency_seconds": 31.299162600000273,
|
| 238 |
+
"ok": true,
|
| 239 |
+
"prompt_tokens": 69,
|
| 240 |
+
"total_tokens": 581,
|
| 241 |
+
"ttft_seconds": null
|
| 242 |
+
},
|
| 243 |
+
{
|
| 244 |
+
"completion_tokens": 512,
|
| 245 |
+
"error": null,
|
| 246 |
+
"finish_reason": "length",
|
| 247 |
+
"latency_seconds": 30.269319029990584,
|
| 248 |
+
"ok": true,
|
| 249 |
+
"prompt_tokens": 65,
|
| 250 |
+
"total_tokens": 577,
|
| 251 |
+
"ttft_seconds": null
|
| 252 |
+
},
|
| 253 |
+
{
|
| 254 |
+
"completion_tokens": 512,
|
| 255 |
+
"error": null,
|
| 256 |
+
"finish_reason": "length",
|
| 257 |
+
"latency_seconds": 31.41870970900345,
|
| 258 |
+
"ok": true,
|
| 259 |
+
"prompt_tokens": 67,
|
| 260 |
+
"total_tokens": 579,
|
| 261 |
+
"ttft_seconds": null
|
| 262 |
+
},
|
| 263 |
+
{
|
| 264 |
+
"completion_tokens": 512,
|
| 265 |
+
"error": null,
|
| 266 |
+
"finish_reason": "length",
|
| 267 |
+
"latency_seconds": 29.88316666499304,
|
| 268 |
+
"ok": true,
|
| 269 |
+
"prompt_tokens": 63,
|
| 270 |
+
"total_tokens": 575,
|
| 271 |
+
"ttft_seconds": null
|
| 272 |
+
},
|
| 273 |
+
{
|
| 274 |
+
"completion_tokens": 512,
|
| 275 |
+
"error": null,
|
| 276 |
+
"finish_reason": "length",
|
| 277 |
+
"latency_seconds": 30.118765489998623,
|
| 278 |
+
"ok": true,
|
| 279 |
+
"prompt_tokens": 49,
|
| 280 |
+
"total_tokens": 561,
|
| 281 |
+
"ttft_seconds": null
|
| 282 |
+
},
|
| 283 |
+
{
|
| 284 |
+
"completion_tokens": 512,
|
| 285 |
+
"error": null,
|
| 286 |
+
"finish_reason": "length",
|
| 287 |
+
"latency_seconds": 30.475393945001997,
|
| 288 |
+
"ok": true,
|
| 289 |
+
"prompt_tokens": 47,
|
| 290 |
+
"total_tokens": 559,
|
| 291 |
+
"ttft_seconds": null
|
| 292 |
+
},
|
| 293 |
+
{
|
| 294 |
+
"completion_tokens": 512,
|
| 295 |
+
"error": null,
|
| 296 |
+
"finish_reason": "length",
|
| 297 |
+
"latency_seconds": 31.649221633007983,
|
| 298 |
+
"ok": true,
|
| 299 |
+
"prompt_tokens": 66,
|
| 300 |
+
"total_tokens": 578,
|
| 301 |
+
"ttft_seconds": null
|
| 302 |
+
},
|
| 303 |
+
{
|
| 304 |
+
"completion_tokens": 512,
|
| 305 |
+
"error": null,
|
| 306 |
+
"finish_reason": "length",
|
| 307 |
+
"latency_seconds": 31.294464439008152,
|
| 308 |
+
"ok": true,
|
| 309 |
+
"prompt_tokens": 48,
|
| 310 |
+
"total_tokens": 560,
|
| 311 |
+
"ttft_seconds": null
|
| 312 |
+
},
|
| 313 |
+
{
|
| 314 |
+
"completion_tokens": 512,
|
| 315 |
+
"error": null,
|
| 316 |
+
"finish_reason": "length",
|
| 317 |
+
"latency_seconds": 32.259899878001306,
|
| 318 |
+
"ok": true,
|
| 319 |
+
"prompt_tokens": 54,
|
| 320 |
+
"total_tokens": 566,
|
| 321 |
+
"ttft_seconds": null
|
| 322 |
+
}
|
| 323 |
+
],
|
| 324 |
+
"summary": {
|
| 325 |
+
"concurrency": 16,
|
| 326 |
+
"errors": [],
|
| 327 |
+
"failed_requests": 0,
|
| 328 |
+
"mean_interactive_tps": null,
|
| 329 |
+
"mean_latency_seconds": 30.792256628998985,
|
| 330 |
+
"mean_ttft_seconds": null,
|
| 331 |
+
"output_token_throughput_tps": 250.83093836156212,
|
| 332 |
+
"p95_interactive_tps": null,
|
| 333 |
+
"p95_latency_seconds": 32.56330811054941,
|
| 334 |
+
"p95_ttft_seconds": null,
|
| 335 |
+
"request_count": 32,
|
| 336 |
+
"request_throughput_rps": 0.489904176487426,
|
| 337 |
+
"successful_requests": 32,
|
| 338 |
+
"total_completion_tokens": 16384,
|
| 339 |
+
"total_prompt_tokens": 1954,
|
| 340 |
+
"wall_seconds": 65.31889609400241
|
| 341 |
+
}
|
| 342 |
+
}
|
benchmarks/CLEAN-dflash-st2-s16-c8.json
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"results": [
|
| 3 |
+
{
|
| 4 |
+
"completion_tokens": 512,
|
| 5 |
+
"error": null,
|
| 6 |
+
"finish_reason": "length",
|
| 7 |
+
"latency_seconds": 28.770241043006536,
|
| 8 |
+
"ok": true,
|
| 9 |
+
"prompt_tokens": 84,
|
| 10 |
+
"total_tokens": 596,
|
| 11 |
+
"ttft_seconds": null
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"completion_tokens": 512,
|
| 15 |
+
"error": null,
|
| 16 |
+
"finish_reason": "length",
|
| 17 |
+
"latency_seconds": 30.40594977501314,
|
| 18 |
+
"ok": true,
|
| 19 |
+
"prompt_tokens": 53,
|
| 20 |
+
"total_tokens": 565,
|
| 21 |
+
"ttft_seconds": null
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"completion_tokens": 512,
|
| 25 |
+
"error": null,
|
| 26 |
+
"finish_reason": "length",
|
| 27 |
+
"latency_seconds": 30.523794804001227,
|
| 28 |
+
"ok": true,
|
| 29 |
+
"prompt_tokens": 59,
|
| 30 |
+
"total_tokens": 571,
|
| 31 |
+
"ttft_seconds": null
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"completion_tokens": 512,
|
| 35 |
+
"error": null,
|
| 36 |
+
"finish_reason": "length",
|
| 37 |
+
"latency_seconds": 30.52348540899402,
|
| 38 |
+
"ok": true,
|
| 39 |
+
"prompt_tokens": 57,
|
| 40 |
+
"total_tokens": 569,
|
| 41 |
+
"ttft_seconds": null
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"completion_tokens": 512,
|
| 45 |
+
"error": null,
|
| 46 |
+
"finish_reason": "length",
|
| 47 |
+
"latency_seconds": 31.75425320699287,
|
| 48 |
+
"ok": true,
|
| 49 |
+
"prompt_tokens": 74,
|
| 50 |
+
"total_tokens": 586,
|
| 51 |
+
"ttft_seconds": null
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"completion_tokens": 512,
|
| 55 |
+
"error": null,
|
| 56 |
+
"finish_reason": "length",
|
| 57 |
+
"latency_seconds": 32.79620496901043,
|
| 58 |
+
"ok": true,
|
| 59 |
+
"prompt_tokens": 67,
|
| 60 |
+
"total_tokens": 579,
|
| 61 |
+
"ttft_seconds": null
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"completion_tokens": 512,
|
| 65 |
+
"error": null,
|
| 66 |
+
"finish_reason": "length",
|
| 67 |
+
"latency_seconds": 32.91504200300551,
|
| 68 |
+
"ok": true,
|
| 69 |
+
"prompt_tokens": 70,
|
| 70 |
+
"total_tokens": 582,
|
| 71 |
+
"ttft_seconds": null
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"completion_tokens": 512,
|
| 75 |
+
"error": null,
|
| 76 |
+
"finish_reason": "length",
|
| 77 |
+
"latency_seconds": 32.91228072499507,
|
| 78 |
+
"ok": true,
|
| 79 |
+
"prompt_tokens": 69,
|
| 80 |
+
"total_tokens": 581,
|
| 81 |
+
"ttft_seconds": null
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"completion_tokens": 512,
|
| 85 |
+
"error": null,
|
| 86 |
+
"finish_reason": "length",
|
| 87 |
+
"latency_seconds": 31.052779267993174,
|
| 88 |
+
"ok": true,
|
| 89 |
+
"prompt_tokens": 52,
|
| 90 |
+
"total_tokens": 564,
|
| 91 |
+
"ttft_seconds": null
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"completion_tokens": 512,
|
| 95 |
+
"error": null,
|
| 96 |
+
"finish_reason": "length",
|
| 97 |
+
"latency_seconds": 29.296572343999287,
|
| 98 |
+
"ok": true,
|
| 99 |
+
"prompt_tokens": 49,
|
| 100 |
+
"total_tokens": 561,
|
| 101 |
+
"ttft_seconds": null
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"completion_tokens": 512,
|
| 105 |
+
"error": null,
|
| 106 |
+
"finish_reason": "length",
|
| 107 |
+
"latency_seconds": 28.55112311700941,
|
| 108 |
+
"ok": true,
|
| 109 |
+
"prompt_tokens": 63,
|
| 110 |
+
"total_tokens": 575,
|
| 111 |
+
"ttft_seconds": null
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"completion_tokens": 512,
|
| 115 |
+
"error": null,
|
| 116 |
+
"finish_reason": "length",
|
| 117 |
+
"latency_seconds": 30.242342862999067,
|
| 118 |
+
"ok": true,
|
| 119 |
+
"prompt_tokens": 66,
|
| 120 |
+
"total_tokens": 578,
|
| 121 |
+
"ttft_seconds": null
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"completion_tokens": 512,
|
| 125 |
+
"error": null,
|
| 126 |
+
"finish_reason": "length",
|
| 127 |
+
"latency_seconds": 32.45347919900087,
|
| 128 |
+
"ok": true,
|
| 129 |
+
"prompt_tokens": 65,
|
| 130 |
+
"total_tokens": 577,
|
| 131 |
+
"ttft_seconds": null
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"completion_tokens": 512,
|
| 135 |
+
"error": null,
|
| 136 |
+
"finish_reason": "length",
|
| 137 |
+
"latency_seconds": 30.6597552059975,
|
| 138 |
+
"ok": true,
|
| 139 |
+
"prompt_tokens": 54,
|
| 140 |
+
"total_tokens": 566,
|
| 141 |
+
"ttft_seconds": null
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"completion_tokens": 512,
|
| 145 |
+
"error": null,
|
| 146 |
+
"finish_reason": "length",
|
| 147 |
+
"latency_seconds": 31.128003552003065,
|
| 148 |
+
"ok": true,
|
| 149 |
+
"prompt_tokens": 48,
|
| 150 |
+
"total_tokens": 560,
|
| 151 |
+
"ttft_seconds": null
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"completion_tokens": 512,
|
| 155 |
+
"error": null,
|
| 156 |
+
"finish_reason": "length",
|
| 157 |
+
"latency_seconds": 31.55533199000638,
|
| 158 |
+
"ok": true,
|
| 159 |
+
"prompt_tokens": 47,
|
| 160 |
+
"total_tokens": 559,
|
| 161 |
+
"ttft_seconds": null
|
| 162 |
+
}
|
| 163 |
+
],
|
| 164 |
+
"summary": {
|
| 165 |
+
"concurrency": 8,
|
| 166 |
+
"errors": [],
|
| 167 |
+
"failed_requests": 0,
|
| 168 |
+
"mean_interactive_tps": null,
|
| 169 |
+
"mean_latency_seconds": 30.971289967126722,
|
| 170 |
+
"mean_ttft_seconds": null,
|
| 171 |
+
"output_token_throughput_tps": 127.06462637996901,
|
| 172 |
+
"p95_interactive_tps": null,
|
| 173 |
+
"p95_latency_seconds": 32.91297104449768,
|
| 174 |
+
"p95_ttft_seconds": null,
|
| 175 |
+
"request_count": 16,
|
| 176 |
+
"request_throughput_rps": 0.24817309839837698,
|
| 177 |
+
"successful_requests": 16,
|
| 178 |
+
"total_completion_tokens": 8192,
|
| 179 |
+
"total_prompt_tokens": 977,
|
| 180 |
+
"wall_seconds": 64.47112963999098
|
| 181 |
+
}
|
| 182 |
+
}
|
benchmarks/CLEAN-dflash-st2-s24-c16.json
ADDED
|
@@ -0,0 +1,342 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"results": [
|
| 3 |
+
{
|
| 4 |
+
"completion_tokens": 512,
|
| 5 |
+
"error": null,
|
| 6 |
+
"finish_reason": "length",
|
| 7 |
+
"latency_seconds": 28.08238783798879,
|
| 8 |
+
"ok": true,
|
| 9 |
+
"prompt_tokens": 84,
|
| 10 |
+
"total_tokens": 596,
|
| 11 |
+
"ttft_seconds": null
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"completion_tokens": 512,
|
| 15 |
+
"error": null,
|
| 16 |
+
"finish_reason": "length",
|
| 17 |
+
"latency_seconds": 28.886940732991206,
|
| 18 |
+
"ok": true,
|
| 19 |
+
"prompt_tokens": 54,
|
| 20 |
+
"total_tokens": 566,
|
| 21 |
+
"ttft_seconds": null
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"completion_tokens": 512,
|
| 25 |
+
"error": null,
|
| 26 |
+
"finish_reason": "length",
|
| 27 |
+
"latency_seconds": 29.23931883899786,
|
| 28 |
+
"ok": true,
|
| 29 |
+
"prompt_tokens": 52,
|
| 30 |
+
"total_tokens": 564,
|
| 31 |
+
"ttft_seconds": null
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"completion_tokens": 512,
|
| 35 |
+
"error": null,
|
| 36 |
+
"finish_reason": "length",
|
| 37 |
+
"latency_seconds": 29.582878045999678,
|
| 38 |
+
"ok": true,
|
| 39 |
+
"prompt_tokens": 63,
|
| 40 |
+
"total_tokens": 575,
|
| 41 |
+
"ttft_seconds": null
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"completion_tokens": 512,
|
| 45 |
+
"error": null,
|
| 46 |
+
"finish_reason": "length",
|
| 47 |
+
"latency_seconds": 30.021114935996593,
|
| 48 |
+
"ok": true,
|
| 49 |
+
"prompt_tokens": 57,
|
| 50 |
+
"total_tokens": 569,
|
| 51 |
+
"ttft_seconds": null
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"completion_tokens": 512,
|
| 55 |
+
"error": null,
|
| 56 |
+
"finish_reason": "length",
|
| 57 |
+
"latency_seconds": 30.138854527001968,
|
| 58 |
+
"ok": true,
|
| 59 |
+
"prompt_tokens": 53,
|
| 60 |
+
"total_tokens": 565,
|
| 61 |
+
"ttft_seconds": null
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"completion_tokens": 512,
|
| 65 |
+
"error": null,
|
| 66 |
+
"finish_reason": "length",
|
| 67 |
+
"latency_seconds": 30.141507826003362,
|
| 68 |
+
"ok": true,
|
| 69 |
+
"prompt_tokens": 74,
|
| 70 |
+
"total_tokens": 586,
|
| 71 |
+
"ttft_seconds": null
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"completion_tokens": 512,
|
| 75 |
+
"error": null,
|
| 76 |
+
"finish_reason": "length",
|
| 77 |
+
"latency_seconds": 31.134392733001732,
|
| 78 |
+
"ok": true,
|
| 79 |
+
"prompt_tokens": 59,
|
| 80 |
+
"total_tokens": 571,
|
| 81 |
+
"ttft_seconds": null
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"completion_tokens": 512,
|
| 85 |
+
"error": null,
|
| 86 |
+
"finish_reason": "length",
|
| 87 |
+
"latency_seconds": 31.24932707499829,
|
| 88 |
+
"ok": true,
|
| 89 |
+
"prompt_tokens": 69,
|
| 90 |
+
"total_tokens": 581,
|
| 91 |
+
"ttft_seconds": null
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"completion_tokens": 512,
|
| 95 |
+
"error": null,
|
| 96 |
+
"finish_reason": "length",
|
| 97 |
+
"latency_seconds": 31.488714413004345,
|
| 98 |
+
"ok": true,
|
| 99 |
+
"prompt_tokens": 48,
|
| 100 |
+
"total_tokens": 560,
|
| 101 |
+
"ttft_seconds": null
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"completion_tokens": 512,
|
| 105 |
+
"error": null,
|
| 106 |
+
"finish_reason": "length",
|
| 107 |
+
"latency_seconds": 31.73670294000476,
|
| 108 |
+
"ok": true,
|
| 109 |
+
"prompt_tokens": 47,
|
| 110 |
+
"total_tokens": 559,
|
| 111 |
+
"ttft_seconds": null
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"completion_tokens": 512,
|
| 115 |
+
"error": null,
|
| 116 |
+
"finish_reason": "length",
|
| 117 |
+
"latency_seconds": 31.739136570991832,
|
| 118 |
+
"ok": true,
|
| 119 |
+
"prompt_tokens": 65,
|
| 120 |
+
"total_tokens": 577,
|
| 121 |
+
"ttft_seconds": null
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"completion_tokens": 512,
|
| 125 |
+
"error": null,
|
| 126 |
+
"finish_reason": "length",
|
| 127 |
+
"latency_seconds": 31.96787730899814,
|
| 128 |
+
"ok": true,
|
| 129 |
+
"prompt_tokens": 49,
|
| 130 |
+
"total_tokens": 561,
|
| 131 |
+
"ttft_seconds": null
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"completion_tokens": 512,
|
| 135 |
+
"error": null,
|
| 136 |
+
"finish_reason": "length",
|
| 137 |
+
"latency_seconds": 32.20001648800098,
|
| 138 |
+
"ok": true,
|
| 139 |
+
"prompt_tokens": 66,
|
| 140 |
+
"total_tokens": 578,
|
| 141 |
+
"ttft_seconds": null
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"completion_tokens": 512,
|
| 145 |
+
"error": null,
|
| 146 |
+
"finish_reason": "length",
|
| 147 |
+
"latency_seconds": 32.431413047001115,
|
| 148 |
+
"ok": true,
|
| 149 |
+
"prompt_tokens": 67,
|
| 150 |
+
"total_tokens": 579,
|
| 151 |
+
"ttft_seconds": null
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"completion_tokens": 512,
|
| 155 |
+
"error": null,
|
| 156 |
+
"finish_reason": "length",
|
| 157 |
+
"latency_seconds": 33.22777071699966,
|
| 158 |
+
"ok": true,
|
| 159 |
+
"prompt_tokens": 70,
|
| 160 |
+
"total_tokens": 582,
|
| 161 |
+
"ttft_seconds": null
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"completion_tokens": 512,
|
| 165 |
+
"error": null,
|
| 166 |
+
"finish_reason": "length",
|
| 167 |
+
"latency_seconds": 27.827295434995904,
|
| 168 |
+
"ok": true,
|
| 169 |
+
"prompt_tokens": 84,
|
| 170 |
+
"total_tokens": 596,
|
| 171 |
+
"ttft_seconds": null
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"completion_tokens": 512,
|
| 175 |
+
"error": null,
|
| 176 |
+
"finish_reason": "length",
|
| 177 |
+
"latency_seconds": 27.051542682995205,
|
| 178 |
+
"ok": true,
|
| 179 |
+
"prompt_tokens": 59,
|
| 180 |
+
"total_tokens": 571,
|
| 181 |
+
"ttft_seconds": null
|
| 182 |
+
},
|
| 183 |
+
{
|
| 184 |
+
"completion_tokens": 512,
|
| 185 |
+
"error": null,
|
| 186 |
+
"finish_reason": "length",
|
| 187 |
+
"latency_seconds": 30.16372441999556,
|
| 188 |
+
"ok": true,
|
| 189 |
+
"prompt_tokens": 74,
|
| 190 |
+
"total_tokens": 586,
|
| 191 |
+
"ttft_seconds": null
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"completion_tokens": 512,
|
| 195 |
+
"error": null,
|
| 196 |
+
"finish_reason": "length",
|
| 197 |
+
"latency_seconds": 28.10948968199955,
|
| 198 |
+
"ok": true,
|
| 199 |
+
"prompt_tokens": 47,
|
| 200 |
+
"total_tokens": 559,
|
| 201 |
+
"ttft_seconds": null
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"completion_tokens": 512,
|
| 205 |
+
"error": null,
|
| 206 |
+
"finish_reason": "length",
|
| 207 |
+
"latency_seconds": 30.719098986999597,
|
| 208 |
+
"ok": true,
|
| 209 |
+
"prompt_tokens": 57,
|
| 210 |
+
"total_tokens": 569,
|
| 211 |
+
"ttft_seconds": null
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"completion_tokens": 512,
|
| 215 |
+
"error": null,
|
| 216 |
+
"finish_reason": "length",
|
| 217 |
+
"latency_seconds": 28.888266260997625,
|
| 218 |
+
"ok": true,
|
| 219 |
+
"prompt_tokens": 63,
|
| 220 |
+
"total_tokens": 575,
|
| 221 |
+
"ttft_seconds": null
|
| 222 |
+
},
|
| 223 |
+
{
|
| 224 |
+
"completion_tokens": 512,
|
| 225 |
+
"error": null,
|
| 226 |
+
"finish_reason": "length",
|
| 227 |
+
"latency_seconds": 30.95099848099926,
|
| 228 |
+
"ok": true,
|
| 229 |
+
"prompt_tokens": 69,
|
| 230 |
+
"total_tokens": 581,
|
| 231 |
+
"ttft_seconds": null
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"completion_tokens": 512,
|
| 235 |
+
"error": null,
|
| 236 |
+
"finish_reason": "length",
|
| 237 |
+
"latency_seconds": 32.89229443798831,
|
| 238 |
+
"ok": true,
|
| 239 |
+
"prompt_tokens": 70,
|
| 240 |
+
"total_tokens": 582,
|
| 241 |
+
"ttft_seconds": null
|
| 242 |
+
},
|
| 243 |
+
{
|
| 244 |
+
"completion_tokens": 512,
|
| 245 |
+
"error": null,
|
| 246 |
+
"finish_reason": "length",
|
| 247 |
+
"latency_seconds": 30.093157169991173,
|
| 248 |
+
"ok": true,
|
| 249 |
+
"prompt_tokens": 52,
|
| 250 |
+
"total_tokens": 564,
|
| 251 |
+
"ttft_seconds": null
|
| 252 |
+
},
|
| 253 |
+
{
|
| 254 |
+
"completion_tokens": 512,
|
| 255 |
+
"error": null,
|
| 256 |
+
"finish_reason": "length",
|
| 257 |
+
"latency_seconds": 29.849498030001996,
|
| 258 |
+
"ok": true,
|
| 259 |
+
"prompt_tokens": 65,
|
| 260 |
+
"total_tokens": 577,
|
| 261 |
+
"ttft_seconds": null
|
| 262 |
+
},
|
| 263 |
+
{
|
| 264 |
+
"completion_tokens": 512,
|
| 265 |
+
"error": null,
|
| 266 |
+
"finish_reason": "length",
|
| 267 |
+
"latency_seconds": 29.719171642995207,
|
| 268 |
+
"ok": true,
|
| 269 |
+
"prompt_tokens": 66,
|
| 270 |
+
"total_tokens": 578,
|
| 271 |
+
"ttft_seconds": null
|
| 272 |
+
},
|
| 273 |
+
{
|
| 274 |
+
"completion_tokens": 512,
|
| 275 |
+
"error": null,
|
| 276 |
+
"finish_reason": "length",
|
| 277 |
+
"latency_seconds": 32.287830701010535,
|
| 278 |
+
"ok": true,
|
| 279 |
+
"prompt_tokens": 67,
|
| 280 |
+
"total_tokens": 579,
|
| 281 |
+
"ttft_seconds": null
|
| 282 |
+
},
|
| 283 |
+
{
|
| 284 |
+
"completion_tokens": 512,
|
| 285 |
+
"error": null,
|
| 286 |
+
"finish_reason": "length",
|
| 287 |
+
"latency_seconds": 30.476158764999127,
|
| 288 |
+
"ok": true,
|
| 289 |
+
"prompt_tokens": 49,
|
| 290 |
+
"total_tokens": 561,
|
| 291 |
+
"ttft_seconds": null
|
| 292 |
+
},
|
| 293 |
+
{
|
| 294 |
+
"completion_tokens": 512,
|
| 295 |
+
"error": null,
|
| 296 |
+
"finish_reason": "length",
|
| 297 |
+
"latency_seconds": 31.508383998007048,
|
| 298 |
+
"ok": true,
|
| 299 |
+
"prompt_tokens": 53,
|
| 300 |
+
"total_tokens": 565,
|
| 301 |
+
"ttft_seconds": null
|
| 302 |
+
},
|
| 303 |
+
{
|
| 304 |
+
"completion_tokens": 512,
|
| 305 |
+
"error": null,
|
| 306 |
+
"finish_reason": "length",
|
| 307 |
+
"latency_seconds": 31.13668116700137,
|
| 308 |
+
"ok": true,
|
| 309 |
+
"prompt_tokens": 48,
|
| 310 |
+
"total_tokens": 560,
|
| 311 |
+
"ttft_seconds": null
|
| 312 |
+
},
|
| 313 |
+
{
|
| 314 |
+
"completion_tokens": 512,
|
| 315 |
+
"error": null,
|
| 316 |
+
"finish_reason": "length",
|
| 317 |
+
"latency_seconds": 32.28916919999756,
|
| 318 |
+
"ok": true,
|
| 319 |
+
"prompt_tokens": 54,
|
| 320 |
+
"total_tokens": 566,
|
| 321 |
+
"ttft_seconds": null
|
| 322 |
+
}
|
| 323 |
+
],
|
| 324 |
+
"summary": {
|
| 325 |
+
"concurrency": 16,
|
| 326 |
+
"errors": [],
|
| 327 |
+
"failed_requests": 0,
|
| 328 |
+
"mean_interactive_tps": null,
|
| 329 |
+
"mean_latency_seconds": 30.538472346842354,
|
| 330 |
+
"mean_ttft_seconds": null,
|
| 331 |
+
"output_token_throughput_tps": 250.0696220293509,
|
| 332 |
+
"p95_interactive_tps": null,
|
| 333 |
+
"p95_latency_seconds": 32.63880967294536,
|
| 334 |
+
"p95_ttft_seconds": null,
|
| 335 |
+
"request_count": 32,
|
| 336 |
+
"request_throughput_rps": 0.488417230526076,
|
| 337 |
+
"successful_requests": 32,
|
| 338 |
+
"total_completion_tokens": 16384,
|
| 339 |
+
"total_prompt_tokens": 1954,
|
| 340 |
+
"wall_seconds": 65.51775408400863
|
| 341 |
+
}
|
| 342 |
+
}
|
benchmarks/CLEAN-dflash-st2-s24-c20.json
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"results": [
|
| 3 |
+
{
|
| 4 |
+
"completion_tokens": 512,
|
| 5 |
+
"error": null,
|
| 6 |
+
"finish_reason": "length",
|
| 7 |
+
"latency_seconds": 28.128791886992985,
|
| 8 |
+
"ok": true,
|
| 9 |
+
"prompt_tokens": 84,
|
| 10 |
+
"total_tokens": 596,
|
| 11 |
+
"ttft_seconds": null
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"completion_tokens": 512,
|
| 15 |
+
"error": null,
|
| 16 |
+
"finish_reason": "length",
|
| 17 |
+
"latency_seconds": 28.13552347100631,
|
| 18 |
+
"ok": true,
|
| 19 |
+
"prompt_tokens": 84,
|
| 20 |
+
"total_tokens": 596,
|
| 21 |
+
"ttft_seconds": null
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"completion_tokens": 512,
|
| 25 |
+
"error": null,
|
| 26 |
+
"finish_reason": "length",
|
| 27 |
+
"latency_seconds": 28.914256617004867,
|
| 28 |
+
"ok": true,
|
| 29 |
+
"prompt_tokens": 53,
|
| 30 |
+
"total_tokens": 565,
|
| 31 |
+
"ttft_seconds": null
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"completion_tokens": 512,
|
| 35 |
+
"error": null,
|
| 36 |
+
"finish_reason": "length",
|
| 37 |
+
"latency_seconds": 28.915664140004083,
|
| 38 |
+
"ok": true,
|
| 39 |
+
"prompt_tokens": 69,
|
| 40 |
+
"total_tokens": 581,
|
| 41 |
+
"ttft_seconds": null
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"completion_tokens": 512,
|
| 45 |
+
"error": null,
|
| 46 |
+
"finish_reason": "length",
|
| 47 |
+
"latency_seconds": 29.13976360599918,
|
| 48 |
+
"ok": true,
|
| 49 |
+
"prompt_tokens": 66,
|
| 50 |
+
"total_tokens": 578,
|
| 51 |
+
"ttft_seconds": null
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"completion_tokens": 512,
|
| 55 |
+
"error": null,
|
| 56 |
+
"finish_reason": "length",
|
| 57 |
+
"latency_seconds": 29.33403015100339,
|
| 58 |
+
"ok": true,
|
| 59 |
+
"prompt_tokens": 74,
|
| 60 |
+
"total_tokens": 586,
|
| 61 |
+
"ttft_seconds": null
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"completion_tokens": 512,
|
| 65 |
+
"error": null,
|
| 66 |
+
"finish_reason": "length",
|
| 67 |
+
"latency_seconds": 29.75400056199578,
|
| 68 |
+
"ok": true,
|
| 69 |
+
"prompt_tokens": 57,
|
| 70 |
+
"total_tokens": 569,
|
| 71 |
+
"ttft_seconds": null
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"completion_tokens": 512,
|
| 75 |
+
"error": null,
|
| 76 |
+
"finish_reason": "length",
|
| 77 |
+
"latency_seconds": 30.129768530008732,
|
| 78 |
+
"ok": true,
|
| 79 |
+
"prompt_tokens": 59,
|
| 80 |
+
"total_tokens": 571,
|
| 81 |
+
"ttft_seconds": null
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"completion_tokens": 512,
|
| 85 |
+
"error": null,
|
| 86 |
+
"finish_reason": "length",
|
| 87 |
+
"latency_seconds": 30.127090508001857,
|
| 88 |
+
"ok": true,
|
| 89 |
+
"prompt_tokens": 63,
|
| 90 |
+
"total_tokens": 575,
|
| 91 |
+
"ttft_seconds": null
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"completion_tokens": 512,
|
| 95 |
+
"error": null,
|
| 96 |
+
"finish_reason": "length",
|
| 97 |
+
"latency_seconds": 30.472961638995912,
|
| 98 |
+
"ok": true,
|
| 99 |
+
"prompt_tokens": 70,
|
| 100 |
+
"total_tokens": 582,
|
| 101 |
+
"ttft_seconds": null
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"completion_tokens": 512,
|
| 105 |
+
"error": null,
|
| 106 |
+
"finish_reason": "length",
|
| 107 |
+
"latency_seconds": 30.59051628499583,
|
| 108 |
+
"ok": true,
|
| 109 |
+
"prompt_tokens": 65,
|
| 110 |
+
"total_tokens": 577,
|
| 111 |
+
"ttft_seconds": null
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"completion_tokens": 512,
|
| 115 |
+
"error": null,
|
| 116 |
+
"finish_reason": "length",
|
| 117 |
+
"latency_seconds": 30.59093984401261,
|
| 118 |
+
"ok": true,
|
| 119 |
+
"prompt_tokens": 52,
|
| 120 |
+
"total_tokens": 564,
|
| 121 |
+
"ttft_seconds": null
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"completion_tokens": 512,
|
| 125 |
+
"error": null,
|
| 126 |
+
"finish_reason": "length",
|
| 127 |
+
"latency_seconds": 30.587724496988812,
|
| 128 |
+
"ok": true,
|
| 129 |
+
"prompt_tokens": 74,
|
| 130 |
+
"total_tokens": 586,
|
| 131 |
+
"ttft_seconds": null
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"completion_tokens": 512,
|
| 135 |
+
"error": null,
|
| 136 |
+
"finish_reason": "length",
|
| 137 |
+
"latency_seconds": 30.708445683005266,
|
| 138 |
+
"ok": true,
|
| 139 |
+
"prompt_tokens": 70,
|
| 140 |
+
"total_tokens": 582,
|
| 141 |
+
"ttft_seconds": null
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"completion_tokens": 512,
|
| 145 |
+
"error": null,
|
| 146 |
+
"finish_reason": "length",
|
| 147 |
+
"latency_seconds": 30.702821232000133,
|
| 148 |
+
"ok": true,
|
| 149 |
+
"prompt_tokens": 48,
|
| 150 |
+
"total_tokens": 560,
|
| 151 |
+
"ttft_seconds": null
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"completion_tokens": 512,
|
| 155 |
+
"error": null,
|
| 156 |
+
"finish_reason": "length",
|
| 157 |
+
"latency_seconds": 31.06507171499834,
|
| 158 |
+
"ok": true,
|
| 159 |
+
"prompt_tokens": 49,
|
| 160 |
+
"total_tokens": 561,
|
| 161 |
+
"ttft_seconds": null
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"completion_tokens": 512,
|
| 165 |
+
"error": null,
|
| 166 |
+
"finish_reason": "length",
|
| 167 |
+
"latency_seconds": 31.430013089993736,
|
| 168 |
+
"ok": true,
|
| 169 |
+
"prompt_tokens": 47,
|
| 170 |
+
"total_tokens": 559,
|
| 171 |
+
"ttft_seconds": null
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"completion_tokens": 512,
|
| 175 |
+
"error": null,
|
| 176 |
+
"finish_reason": "length",
|
| 177 |
+
"latency_seconds": 32.24225489499804,
|
| 178 |
+
"ok": true,
|
| 179 |
+
"prompt_tokens": 67,
|
| 180 |
+
"total_tokens": 579,
|
| 181 |
+
"ttft_seconds": null
|
| 182 |
+
},
|
| 183 |
+
{
|
| 184 |
+
"completion_tokens": 512,
|
| 185 |
+
"error": null,
|
| 186 |
+
"finish_reason": "length",
|
| 187 |
+
"latency_seconds": 32.248751888997504,
|
| 188 |
+
"ok": true,
|
| 189 |
+
"prompt_tokens": 67,
|
| 190 |
+
"total_tokens": 579,
|
| 191 |
+
"ttft_seconds": null
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"completion_tokens": 512,
|
| 195 |
+
"error": null,
|
| 196 |
+
"finish_reason": "length",
|
| 197 |
+
"latency_seconds": 32.24393780301034,
|
| 198 |
+
"ok": true,
|
| 199 |
+
"prompt_tokens": 54,
|
| 200 |
+
"total_tokens": 566,
|
| 201 |
+
"ttft_seconds": null
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"completion_tokens": 512,
|
| 205 |
+
"error": null,
|
| 206 |
+
"finish_reason": "length",
|
| 207 |
+
"latency_seconds": 28.97886278000078,
|
| 208 |
+
"ok": true,
|
| 209 |
+
"prompt_tokens": 59,
|
| 210 |
+
"total_tokens": 571,
|
| 211 |
+
"ttft_seconds": null
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"completion_tokens": 512,
|
| 215 |
+
"error": null,
|
| 216 |
+
"finish_reason": "length",
|
| 217 |
+
"latency_seconds": 27.680494583997643,
|
| 218 |
+
"ok": true,
|
| 219 |
+
"prompt_tokens": 63,
|
| 220 |
+
"total_tokens": 575,
|
| 221 |
+
"ttft_seconds": null
|
| 222 |
+
},
|
| 223 |
+
{
|
| 224 |
+
"completion_tokens": 512,
|
| 225 |
+
"error": null,
|
| 226 |
+
"finish_reason": "length",
|
| 227 |
+
"latency_seconds": 30.24515929700283,
|
| 228 |
+
"ok": true,
|
| 229 |
+
"prompt_tokens": 69,
|
| 230 |
+
"total_tokens": 581,
|
| 231 |
+
"ttft_seconds": null
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"completion_tokens": 512,
|
| 235 |
+
"error": null,
|
| 236 |
+
"finish_reason": "length",
|
| 237 |
+
"latency_seconds": 29.46420536498772,
|
| 238 |
+
"ok": true,
|
| 239 |
+
"prompt_tokens": 52,
|
| 240 |
+
"total_tokens": 564,
|
| 241 |
+
"ttft_seconds": null
|
| 242 |
+
},
|
| 243 |
+
{
|
| 244 |
+
"completion_tokens": 512,
|
| 245 |
+
"error": null,
|
| 246 |
+
"finish_reason": "length",
|
| 247 |
+
"latency_seconds": 29.935486419999506,
|
| 248 |
+
"ok": true,
|
| 249 |
+
"prompt_tokens": 57,
|
| 250 |
+
"total_tokens": 569,
|
| 251 |
+
"ttft_seconds": null
|
| 252 |
+
},
|
| 253 |
+
{
|
| 254 |
+
"completion_tokens": 512,
|
| 255 |
+
"error": null,
|
| 256 |
+
"finish_reason": "length",
|
| 257 |
+
"latency_seconds": 28.144846990995575,
|
| 258 |
+
"ok": true,
|
| 259 |
+
"prompt_tokens": 84,
|
| 260 |
+
"total_tokens": 596,
|
| 261 |
+
"ttft_seconds": null
|
| 262 |
+
},
|
| 263 |
+
{
|
| 264 |
+
"completion_tokens": 512,
|
| 265 |
+
"error": null,
|
| 266 |
+
"finish_reason": "length",
|
| 267 |
+
"latency_seconds": 30.401637786009815,
|
| 268 |
+
"ok": true,
|
| 269 |
+
"prompt_tokens": 53,
|
| 270 |
+
"total_tokens": 565,
|
| 271 |
+
"ttft_seconds": null
|
| 272 |
+
},
|
| 273 |
+
{
|
| 274 |
+
"completion_tokens": 512,
|
| 275 |
+
"error": null,
|
| 276 |
+
"finish_reason": "length",
|
| 277 |
+
"latency_seconds": 29.640702210002928,
|
| 278 |
+
"ok": true,
|
| 279 |
+
"prompt_tokens": 49,
|
| 280 |
+
"total_tokens": 561,
|
| 281 |
+
"ttft_seconds": null
|
| 282 |
+
},
|
| 283 |
+
{
|
| 284 |
+
"completion_tokens": 512,
|
| 285 |
+
"error": null,
|
| 286 |
+
"finish_reason": "length",
|
| 287 |
+
"latency_seconds": 30.016030842001783,
|
| 288 |
+
"ok": true,
|
| 289 |
+
"prompt_tokens": 66,
|
| 290 |
+
"total_tokens": 578,
|
| 291 |
+
"ttft_seconds": null
|
| 292 |
+
},
|
| 293 |
+
{
|
| 294 |
+
"completion_tokens": 512,
|
| 295 |
+
"error": null,
|
| 296 |
+
"finish_reason": "length",
|
| 297 |
+
"latency_seconds": 30.617524790010066,
|
| 298 |
+
"ok": true,
|
| 299 |
+
"prompt_tokens": 65,
|
| 300 |
+
"total_tokens": 577,
|
| 301 |
+
"ttft_seconds": null
|
| 302 |
+
},
|
| 303 |
+
{
|
| 304 |
+
"completion_tokens": 512,
|
| 305 |
+
"error": null,
|
| 306 |
+
"finish_reason": "length",
|
| 307 |
+
"latency_seconds": 29.651671578991227,
|
| 308 |
+
"ok": true,
|
| 309 |
+
"prompt_tokens": 48,
|
| 310 |
+
"total_tokens": 560,
|
| 311 |
+
"ttft_seconds": null
|
| 312 |
+
},
|
| 313 |
+
{
|
| 314 |
+
"completion_tokens": 512,
|
| 315 |
+
"error": null,
|
| 316 |
+
"finish_reason": "length",
|
| 317 |
+
"latency_seconds": 30.346763896013726,
|
| 318 |
+
"ok": true,
|
| 319 |
+
"prompt_tokens": 70,
|
| 320 |
+
"total_tokens": 582,
|
| 321 |
+
"ttft_seconds": null
|
| 322 |
+
},
|
| 323 |
+
{
|
| 324 |
+
"completion_tokens": 512,
|
| 325 |
+
"error": null,
|
| 326 |
+
"finish_reason": "length",
|
| 327 |
+
"latency_seconds": 30.45972359800362,
|
| 328 |
+
"ok": true,
|
| 329 |
+
"prompt_tokens": 47,
|
| 330 |
+
"total_tokens": 559,
|
| 331 |
+
"ttft_seconds": null
|
| 332 |
+
},
|
| 333 |
+
{
|
| 334 |
+
"completion_tokens": 512,
|
| 335 |
+
"error": null,
|
| 336 |
+
"finish_reason": "length",
|
| 337 |
+
"latency_seconds": 30.57256609101023,
|
| 338 |
+
"ok": true,
|
| 339 |
+
"prompt_tokens": 54,
|
| 340 |
+
"total_tokens": 566,
|
| 341 |
+
"ttft_seconds": null
|
| 342 |
+
},
|
| 343 |
+
{
|
| 344 |
+
"completion_tokens": 512,
|
| 345 |
+
"error": null,
|
| 346 |
+
"finish_reason": "length",
|
| 347 |
+
"latency_seconds": 31.28223751099722,
|
| 348 |
+
"ok": true,
|
| 349 |
+
"prompt_tokens": 74,
|
| 350 |
+
"total_tokens": 586,
|
| 351 |
+
"ttft_seconds": null
|
| 352 |
+
},
|
| 353 |
+
{
|
| 354 |
+
"completion_tokens": 512,
|
| 355 |
+
"error": null,
|
| 356 |
+
"finish_reason": "length",
|
| 357 |
+
"latency_seconds": 29.970285082992632,
|
| 358 |
+
"ok": true,
|
| 359 |
+
"prompt_tokens": 53,
|
| 360 |
+
"total_tokens": 565,
|
| 361 |
+
"ttft_seconds": null
|
| 362 |
+
},
|
| 363 |
+
{
|
| 364 |
+
"completion_tokens": 512,
|
| 365 |
+
"error": null,
|
| 366 |
+
"finish_reason": "length",
|
| 367 |
+
"latency_seconds": 31.264649095988716,
|
| 368 |
+
"ok": true,
|
| 369 |
+
"prompt_tokens": 67,
|
| 370 |
+
"total_tokens": 579,
|
| 371 |
+
"ttft_seconds": null
|
| 372 |
+
},
|
| 373 |
+
{
|
| 374 |
+
"completion_tokens": 512,
|
| 375 |
+
"error": null,
|
| 376 |
+
"finish_reason": "length",
|
| 377 |
+
"latency_seconds": 30.199678539007436,
|
| 378 |
+
"ok": true,
|
| 379 |
+
"prompt_tokens": 59,
|
| 380 |
+
"total_tokens": 571,
|
| 381 |
+
"ttft_seconds": null
|
| 382 |
+
},
|
| 383 |
+
{
|
| 384 |
+
"completion_tokens": 512,
|
| 385 |
+
"error": null,
|
| 386 |
+
"finish_reason": "length",
|
| 387 |
+
"latency_seconds": 31.815072748999228,
|
| 388 |
+
"ok": true,
|
| 389 |
+
"prompt_tokens": 69,
|
| 390 |
+
"total_tokens": 581,
|
| 391 |
+
"ttft_seconds": null
|
| 392 |
+
},
|
| 393 |
+
{
|
| 394 |
+
"completion_tokens": 512,
|
| 395 |
+
"error": null,
|
| 396 |
+
"finish_reason": "length",
|
| 397 |
+
"latency_seconds": 31.104648558000918,
|
| 398 |
+
"ok": true,
|
| 399 |
+
"prompt_tokens": 57,
|
| 400 |
+
"total_tokens": 569,
|
| 401 |
+
"ttft_seconds": null
|
| 402 |
+
}
|
| 403 |
+
],
|
| 404 |
+
"summary": {
|
| 405 |
+
"concurrency": 20,
|
| 406 |
+
"errors": [],
|
| 407 |
+
"failed_requests": 0,
|
| 408 |
+
"mean_interactive_tps": null,
|
| 409 |
+
"mean_latency_seconds": 30.181364395225682,
|
| 410 |
+
"mean_ttft_seconds": null,
|
| 411 |
+
"output_token_throughput_tps": 323.25630623300424,
|
| 412 |
+
"p95_interactive_tps": null,
|
| 413 |
+
"p95_latency_seconds": 32.242339040398655,
|
| 414 |
+
"p95_ttft_seconds": null,
|
| 415 |
+
"request_count": 40,
|
| 416 |
+
"request_throughput_rps": 0.6313599731113364,
|
| 417 |
+
"successful_requests": 40,
|
| 418 |
+
"total_completion_tokens": 20480,
|
| 419 |
+
"total_prompt_tokens": 2487,
|
| 420 |
+
"wall_seconds": 63.35529920099361
|
| 421 |
+
}
|
| 422 |
+
}
|
benchmarks/CLEAN-dflash-st2-s24-c24.json
ADDED
|
@@ -0,0 +1,502 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"results": [
|
| 3 |
+
{
|
| 4 |
+
"completion_tokens": 512,
|
| 5 |
+
"error": null,
|
| 6 |
+
"finish_reason": "length",
|
| 7 |
+
"latency_seconds": 27.135665269990568,
|
| 8 |
+
"ok": true,
|
| 9 |
+
"prompt_tokens": 63,
|
| 10 |
+
"total_tokens": 575,
|
| 11 |
+
"ttft_seconds": null
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"completion_tokens": 512,
|
| 15 |
+
"error": null,
|
| 16 |
+
"finish_reason": "length",
|
| 17 |
+
"latency_seconds": 27.56644712400157,
|
| 18 |
+
"ok": true,
|
| 19 |
+
"prompt_tokens": 84,
|
| 20 |
+
"total_tokens": 596,
|
| 21 |
+
"ttft_seconds": null
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"completion_tokens": 512,
|
| 25 |
+
"error": null,
|
| 26 |
+
"finish_reason": "length",
|
| 27 |
+
"latency_seconds": 28.24778054500348,
|
| 28 |
+
"ok": true,
|
| 29 |
+
"prompt_tokens": 84,
|
| 30 |
+
"total_tokens": 596,
|
| 31 |
+
"ttft_seconds": null
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"completion_tokens": 512,
|
| 35 |
+
"error": null,
|
| 36 |
+
"finish_reason": "length",
|
| 37 |
+
"latency_seconds": 28.598475197999505,
|
| 38 |
+
"ok": true,
|
| 39 |
+
"prompt_tokens": 52,
|
| 40 |
+
"total_tokens": 564,
|
| 41 |
+
"ttft_seconds": null
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"completion_tokens": 512,
|
| 45 |
+
"error": null,
|
| 46 |
+
"finish_reason": "length",
|
| 47 |
+
"latency_seconds": 29.205404612992425,
|
| 48 |
+
"ok": true,
|
| 49 |
+
"prompt_tokens": 69,
|
| 50 |
+
"total_tokens": 581,
|
| 51 |
+
"ttft_seconds": null
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"completion_tokens": 512,
|
| 55 |
+
"error": null,
|
| 56 |
+
"finish_reason": "length",
|
| 57 |
+
"latency_seconds": 29.211898362002103,
|
| 58 |
+
"ok": true,
|
| 59 |
+
"prompt_tokens": 69,
|
| 60 |
+
"total_tokens": 581,
|
| 61 |
+
"ttft_seconds": null
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"completion_tokens": 512,
|
| 65 |
+
"error": null,
|
| 66 |
+
"finish_reason": "length",
|
| 67 |
+
"latency_seconds": 29.2118624690047,
|
| 68 |
+
"ok": true,
|
| 69 |
+
"prompt_tokens": 59,
|
| 70 |
+
"total_tokens": 571,
|
| 71 |
+
"ttft_seconds": null
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"completion_tokens": 512,
|
| 75 |
+
"error": null,
|
| 76 |
+
"finish_reason": "length",
|
| 77 |
+
"latency_seconds": 29.20571578599629,
|
| 78 |
+
"ok": true,
|
| 79 |
+
"prompt_tokens": 57,
|
| 80 |
+
"total_tokens": 569,
|
| 81 |
+
"ttft_seconds": null
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"completion_tokens": 512,
|
| 85 |
+
"error": null,
|
| 86 |
+
"finish_reason": "length",
|
| 87 |
+
"latency_seconds": 29.211570540006505,
|
| 88 |
+
"ok": true,
|
| 89 |
+
"prompt_tokens": 53,
|
| 90 |
+
"total_tokens": 565,
|
| 91 |
+
"ttft_seconds": null
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"completion_tokens": 512,
|
| 95 |
+
"error": null,
|
| 96 |
+
"finish_reason": "length",
|
| 97 |
+
"latency_seconds": 29.383641669002827,
|
| 98 |
+
"ok": true,
|
| 99 |
+
"prompt_tokens": 53,
|
| 100 |
+
"total_tokens": 565,
|
| 101 |
+
"ttft_seconds": null
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"completion_tokens": 512,
|
| 105 |
+
"error": null,
|
| 106 |
+
"finish_reason": "length",
|
| 107 |
+
"latency_seconds": 29.660381981011597,
|
| 108 |
+
"ok": true,
|
| 109 |
+
"prompt_tokens": 74,
|
| 110 |
+
"total_tokens": 586,
|
| 111 |
+
"ttft_seconds": null
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"completion_tokens": 512,
|
| 115 |
+
"error": null,
|
| 116 |
+
"finish_reason": "length",
|
| 117 |
+
"latency_seconds": 29.949224044001312,
|
| 118 |
+
"ok": true,
|
| 119 |
+
"prompt_tokens": 66,
|
| 120 |
+
"total_tokens": 578,
|
| 121 |
+
"ttft_seconds": null
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"completion_tokens": 512,
|
| 125 |
+
"error": null,
|
| 126 |
+
"finish_reason": "length",
|
| 127 |
+
"latency_seconds": 30.313379102997715,
|
| 128 |
+
"ok": true,
|
| 129 |
+
"prompt_tokens": 74,
|
| 130 |
+
"total_tokens": 586,
|
| 131 |
+
"ttft_seconds": null
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"completion_tokens": 512,
|
| 135 |
+
"error": null,
|
| 136 |
+
"finish_reason": "length",
|
| 137 |
+
"latency_seconds": 30.661214009989635,
|
| 138 |
+
"ok": true,
|
| 139 |
+
"prompt_tokens": 57,
|
| 140 |
+
"total_tokens": 569,
|
| 141 |
+
"ttft_seconds": null
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"completion_tokens": 512,
|
| 145 |
+
"error": null,
|
| 146 |
+
"finish_reason": "length",
|
| 147 |
+
"latency_seconds": 30.771676649004803,
|
| 148 |
+
"ok": true,
|
| 149 |
+
"prompt_tokens": 70,
|
| 150 |
+
"total_tokens": 582,
|
| 151 |
+
"ttft_seconds": null
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"completion_tokens": 512,
|
| 155 |
+
"error": null,
|
| 156 |
+
"finish_reason": "length",
|
| 157 |
+
"latency_seconds": 30.778610348992515,
|
| 158 |
+
"ok": true,
|
| 159 |
+
"prompt_tokens": 70,
|
| 160 |
+
"total_tokens": 582,
|
| 161 |
+
"ttft_seconds": null
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"completion_tokens": 512,
|
| 165 |
+
"error": null,
|
| 166 |
+
"finish_reason": "length",
|
| 167 |
+
"latency_seconds": 31.28979452799831,
|
| 168 |
+
"ok": true,
|
| 169 |
+
"prompt_tokens": 49,
|
| 170 |
+
"total_tokens": 561,
|
| 171 |
+
"ttft_seconds": null
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"completion_tokens": 512,
|
| 175 |
+
"error": null,
|
| 176 |
+
"finish_reason": "length",
|
| 177 |
+
"latency_seconds": 31.516065378993517,
|
| 178 |
+
"ok": true,
|
| 179 |
+
"prompt_tokens": 54,
|
| 180 |
+
"total_tokens": 566,
|
| 181 |
+
"ttft_seconds": null
|
| 182 |
+
},
|
| 183 |
+
{
|
| 184 |
+
"completion_tokens": 512,
|
| 185 |
+
"error": null,
|
| 186 |
+
"finish_reason": "length",
|
| 187 |
+
"latency_seconds": 31.629344462009612,
|
| 188 |
+
"ok": true,
|
| 189 |
+
"prompt_tokens": 59,
|
| 190 |
+
"total_tokens": 571,
|
| 191 |
+
"ttft_seconds": null
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"completion_tokens": 512,
|
| 195 |
+
"error": null,
|
| 196 |
+
"finish_reason": "length",
|
| 197 |
+
"latency_seconds": 31.633942327011027,
|
| 198 |
+
"ok": true,
|
| 199 |
+
"prompt_tokens": 65,
|
| 200 |
+
"total_tokens": 577,
|
| 201 |
+
"ttft_seconds": null
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"completion_tokens": 512,
|
| 205 |
+
"error": null,
|
| 206 |
+
"finish_reason": "length",
|
| 207 |
+
"latency_seconds": 31.63263613799063,
|
| 208 |
+
"ok": true,
|
| 209 |
+
"prompt_tokens": 48,
|
| 210 |
+
"total_tokens": 560,
|
| 211 |
+
"ttft_seconds": null
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"completion_tokens": 512,
|
| 215 |
+
"error": null,
|
| 216 |
+
"finish_reason": "length",
|
| 217 |
+
"latency_seconds": 32.257003487000475,
|
| 218 |
+
"ok": true,
|
| 219 |
+
"prompt_tokens": 67,
|
| 220 |
+
"total_tokens": 579,
|
| 221 |
+
"ttft_seconds": null
|
| 222 |
+
},
|
| 223 |
+
{
|
| 224 |
+
"completion_tokens": 512,
|
| 225 |
+
"error": null,
|
| 226 |
+
"finish_reason": "length",
|
| 227 |
+
"latency_seconds": 32.36321775900433,
|
| 228 |
+
"ok": true,
|
| 229 |
+
"prompt_tokens": 67,
|
| 230 |
+
"total_tokens": 579,
|
| 231 |
+
"ttft_seconds": null
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"completion_tokens": 512,
|
| 235 |
+
"error": null,
|
| 236 |
+
"finish_reason": "length",
|
| 237 |
+
"latency_seconds": 33.04354136499751,
|
| 238 |
+
"ok": true,
|
| 239 |
+
"prompt_tokens": 47,
|
| 240 |
+
"total_tokens": 559,
|
| 241 |
+
"ttft_seconds": null
|
| 242 |
+
},
|
| 243 |
+
{
|
| 244 |
+
"completion_tokens": 512,
|
| 245 |
+
"error": null,
|
| 246 |
+
"finish_reason": "length",
|
| 247 |
+
"latency_seconds": 29.575941068993416,
|
| 248 |
+
"ok": true,
|
| 249 |
+
"prompt_tokens": 52,
|
| 250 |
+
"total_tokens": 564,
|
| 251 |
+
"ttft_seconds": null
|
| 252 |
+
},
|
| 253 |
+
{
|
| 254 |
+
"completion_tokens": 512,
|
| 255 |
+
"error": null,
|
| 256 |
+
"finish_reason": "length",
|
| 257 |
+
"latency_seconds": 28.211714889999712,
|
| 258 |
+
"ok": true,
|
| 259 |
+
"prompt_tokens": 70,
|
| 260 |
+
"total_tokens": 582,
|
| 261 |
+
"ttft_seconds": null
|
| 262 |
+
},
|
| 263 |
+
{
|
| 264 |
+
"completion_tokens": 512,
|
| 265 |
+
"error": null,
|
| 266 |
+
"finish_reason": "length",
|
| 267 |
+
"latency_seconds": 28.033875556007843,
|
| 268 |
+
"ok": true,
|
| 269 |
+
"prompt_tokens": 84,
|
| 270 |
+
"total_tokens": 596,
|
| 271 |
+
"ttft_seconds": null
|
| 272 |
+
},
|
| 273 |
+
{
|
| 274 |
+
"completion_tokens": 512,
|
| 275 |
+
"error": null,
|
| 276 |
+
"finish_reason": "length",
|
| 277 |
+
"latency_seconds": 26.03217588600819,
|
| 278 |
+
"ok": true,
|
| 279 |
+
"prompt_tokens": 63,
|
| 280 |
+
"total_tokens": 575,
|
| 281 |
+
"ttft_seconds": null
|
| 282 |
+
},
|
| 283 |
+
{
|
| 284 |
+
"completion_tokens": 512,
|
| 285 |
+
"error": null,
|
| 286 |
+
"finish_reason": "length",
|
| 287 |
+
"latency_seconds": 28.456922130993917,
|
| 288 |
+
"ok": true,
|
| 289 |
+
"prompt_tokens": 63,
|
| 290 |
+
"total_tokens": 575,
|
| 291 |
+
"ttft_seconds": null
|
| 292 |
+
},
|
| 293 |
+
{
|
| 294 |
+
"completion_tokens": 512,
|
| 295 |
+
"error": null,
|
| 296 |
+
"finish_reason": "length",
|
| 297 |
+
"latency_seconds": 30.332903927002917,
|
| 298 |
+
"ok": true,
|
| 299 |
+
"prompt_tokens": 65,
|
| 300 |
+
"total_tokens": 577,
|
| 301 |
+
"ttft_seconds": null
|
| 302 |
+
},
|
| 303 |
+
{
|
| 304 |
+
"completion_tokens": 512,
|
| 305 |
+
"error": null,
|
| 306 |
+
"finish_reason": "length",
|
| 307 |
+
"latency_seconds": 29.372354336999706,
|
| 308 |
+
"ok": true,
|
| 309 |
+
"prompt_tokens": 47,
|
| 310 |
+
"total_tokens": 559,
|
| 311 |
+
"ttft_seconds": null
|
| 312 |
+
},
|
| 313 |
+
{
|
| 314 |
+
"completion_tokens": 512,
|
| 315 |
+
"error": null,
|
| 316 |
+
"finish_reason": "length",
|
| 317 |
+
"latency_seconds": 31.05327556200791,
|
| 318 |
+
"ok": true,
|
| 319 |
+
"prompt_tokens": 66,
|
| 320 |
+
"total_tokens": 578,
|
| 321 |
+
"ttft_seconds": null
|
| 322 |
+
},
|
| 323 |
+
{
|
| 324 |
+
"completion_tokens": 512,
|
| 325 |
+
"error": null,
|
| 326 |
+
"finish_reason": "length",
|
| 327 |
+
"latency_seconds": 29.101746874992386,
|
| 328 |
+
"ok": true,
|
| 329 |
+
"prompt_tokens": 69,
|
| 330 |
+
"total_tokens": 581,
|
| 331 |
+
"ttft_seconds": null
|
| 332 |
+
},
|
| 333 |
+
{
|
| 334 |
+
"completion_tokens": 512,
|
| 335 |
+
"error": null,
|
| 336 |
+
"finish_reason": "length",
|
| 337 |
+
"latency_seconds": 31.164281884994125,
|
| 338 |
+
"ok": true,
|
| 339 |
+
"prompt_tokens": 49,
|
| 340 |
+
"total_tokens": 561,
|
| 341 |
+
"ttft_seconds": null
|
| 342 |
+
},
|
| 343 |
+
{
|
| 344 |
+
"completion_tokens": 512,
|
| 345 |
+
"error": null,
|
| 346 |
+
"finish_reason": "length",
|
| 347 |
+
"latency_seconds": 30.552545909988112,
|
| 348 |
+
"ok": true,
|
| 349 |
+
"prompt_tokens": 48,
|
| 350 |
+
"total_tokens": 560,
|
| 351 |
+
"ttft_seconds": null
|
| 352 |
+
},
|
| 353 |
+
{
|
| 354 |
+
"completion_tokens": 512,
|
| 355 |
+
"error": null,
|
| 356 |
+
"finish_reason": "length",
|
| 357 |
+
"latency_seconds": 30.89522597200994,
|
| 358 |
+
"ok": true,
|
| 359 |
+
"prompt_tokens": 54,
|
| 360 |
+
"total_tokens": 566,
|
| 361 |
+
"ttft_seconds": null
|
| 362 |
+
},
|
| 363 |
+
{
|
| 364 |
+
"completion_tokens": 512,
|
| 365 |
+
"error": null,
|
| 366 |
+
"finish_reason": "length",
|
| 367 |
+
"latency_seconds": 29.33121335800388,
|
| 368 |
+
"ok": true,
|
| 369 |
+
"prompt_tokens": 53,
|
| 370 |
+
"total_tokens": 565,
|
| 371 |
+
"ttft_seconds": null
|
| 372 |
+
},
|
| 373 |
+
{
|
| 374 |
+
"completion_tokens": 512,
|
| 375 |
+
"error": null,
|
| 376 |
+
"finish_reason": "length",
|
| 377 |
+
"latency_seconds": 30.270061712988536,
|
| 378 |
+
"ok": true,
|
| 379 |
+
"prompt_tokens": 67,
|
| 380 |
+
"total_tokens": 579,
|
| 381 |
+
"ttft_seconds": null
|
| 382 |
+
},
|
| 383 |
+
{
|
| 384 |
+
"completion_tokens": 512,
|
| 385 |
+
"error": null,
|
| 386 |
+
"finish_reason": "length",
|
| 387 |
+
"latency_seconds": 29.271501894996618,
|
| 388 |
+
"ok": true,
|
| 389 |
+
"prompt_tokens": 52,
|
| 390 |
+
"total_tokens": 564,
|
| 391 |
+
"ttft_seconds": null
|
| 392 |
+
},
|
| 393 |
+
{
|
| 394 |
+
"completion_tokens": 512,
|
| 395 |
+
"error": null,
|
| 396 |
+
"finish_reason": "length",
|
| 397 |
+
"latency_seconds": 30.90504881599918,
|
| 398 |
+
"ok": true,
|
| 399 |
+
"prompt_tokens": 74,
|
| 400 |
+
"total_tokens": 586,
|
| 401 |
+
"ttft_seconds": null
|
| 402 |
+
},
|
| 403 |
+
{
|
| 404 |
+
"completion_tokens": 512,
|
| 405 |
+
"error": null,
|
| 406 |
+
"finish_reason": "length",
|
| 407 |
+
"latency_seconds": 30.147720770997694,
|
| 408 |
+
"ok": true,
|
| 409 |
+
"prompt_tokens": 57,
|
| 410 |
+
"total_tokens": 569,
|
| 411 |
+
"ttft_seconds": null
|
| 412 |
+
},
|
| 413 |
+
{
|
| 414 |
+
"completion_tokens": 512,
|
| 415 |
+
"error": null,
|
| 416 |
+
"finish_reason": "length",
|
| 417 |
+
"latency_seconds": 30.375956363001023,
|
| 418 |
+
"ok": true,
|
| 419 |
+
"prompt_tokens": 59,
|
| 420 |
+
"total_tokens": 571,
|
| 421 |
+
"ttft_seconds": null
|
| 422 |
+
},
|
| 423 |
+
{
|
| 424 |
+
"completion_tokens": 512,
|
| 425 |
+
"error": null,
|
| 426 |
+
"finish_reason": "length",
|
| 427 |
+
"latency_seconds": 29.630712212994695,
|
| 428 |
+
"ok": true,
|
| 429 |
+
"prompt_tokens": 66,
|
| 430 |
+
"total_tokens": 578,
|
| 431 |
+
"ttft_seconds": null
|
| 432 |
+
},
|
| 433 |
+
{
|
| 434 |
+
"completion_tokens": 512,
|
| 435 |
+
"error": null,
|
| 436 |
+
"finish_reason": "length",
|
| 437 |
+
"latency_seconds": 29.630458068000735,
|
| 438 |
+
"ok": true,
|
| 439 |
+
"prompt_tokens": 49,
|
| 440 |
+
"total_tokens": 561,
|
| 441 |
+
"ttft_seconds": null
|
| 442 |
+
},
|
| 443 |
+
{
|
| 444 |
+
"completion_tokens": 512,
|
| 445 |
+
"error": null,
|
| 446 |
+
"finish_reason": "length",
|
| 447 |
+
"latency_seconds": 29.8602861410036,
|
| 448 |
+
"ok": true,
|
| 449 |
+
"prompt_tokens": 65,
|
| 450 |
+
"total_tokens": 577,
|
| 451 |
+
"ttft_seconds": null
|
| 452 |
+
},
|
| 453 |
+
{
|
| 454 |
+
"completion_tokens": 512,
|
| 455 |
+
"error": null,
|
| 456 |
+
"finish_reason": "length",
|
| 457 |
+
"latency_seconds": 29.125156900001457,
|
| 458 |
+
"ok": true,
|
| 459 |
+
"prompt_tokens": 47,
|
| 460 |
+
"total_tokens": 559,
|
| 461 |
+
"ttft_seconds": null
|
| 462 |
+
},
|
| 463 |
+
{
|
| 464 |
+
"completion_tokens": 512,
|
| 465 |
+
"error": null,
|
| 466 |
+
"finish_reason": "length",
|
| 467 |
+
"latency_seconds": 31.983075775002362,
|
| 468 |
+
"ok": true,
|
| 469 |
+
"prompt_tokens": 48,
|
| 470 |
+
"total_tokens": 560,
|
| 471 |
+
"ttft_seconds": null
|
| 472 |
+
},
|
| 473 |
+
{
|
| 474 |
+
"completion_tokens": 512,
|
| 475 |
+
"error": null,
|
| 476 |
+
"finish_reason": "length",
|
| 477 |
+
"latency_seconds": 31.79805985900748,
|
| 478 |
+
"ok": true,
|
| 479 |
+
"prompt_tokens": 54,
|
| 480 |
+
"total_tokens": 566,
|
| 481 |
+
"ttft_seconds": null
|
| 482 |
+
}
|
| 483 |
+
],
|
| 484 |
+
"summary": {
|
| 485 |
+
"concurrency": 24,
|
| 486 |
+
"errors": [],
|
| 487 |
+
"failed_requests": 0,
|
| 488 |
+
"mean_interactive_tps": null,
|
| 489 |
+
"mean_latency_seconds": 29.9914731047708,
|
| 490 |
+
"mean_ttft_seconds": null,
|
| 491 |
+
"output_token_throughput_tps": 378.97751797981925,
|
| 492 |
+
"p95_interactive_tps": null,
|
| 493 |
+
"p95_latency_seconds": 32.16112878780113,
|
| 494 |
+
"p95_ttft_seconds": null,
|
| 495 |
+
"request_count": 48,
|
| 496 |
+
"request_throughput_rps": 0.7401904648043345,
|
| 497 |
+
"successful_requests": 48,
|
| 498 |
+
"total_completion_tokens": 24576,
|
| 499 |
+
"total_prompt_tokens": 2931,
|
| 500 |
+
"wall_seconds": 64.84817392600235
|
| 501 |
+
}
|
| 502 |
+
}
|
benchmarks/CLEAN-dflash-st2-s32-c24.json
ADDED
|
@@ -0,0 +1,502 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"results": [
|
| 3 |
+
{
|
| 4 |
+
"completion_tokens": 512,
|
| 5 |
+
"error": null,
|
| 6 |
+
"finish_reason": "length",
|
| 7 |
+
"latency_seconds": 27.37981586100068,
|
| 8 |
+
"ok": true,
|
| 9 |
+
"prompt_tokens": 84,
|
| 10 |
+
"total_tokens": 596,
|
| 11 |
+
"ttft_seconds": null
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"completion_tokens": 512,
|
| 15 |
+
"error": null,
|
| 16 |
+
"finish_reason": "length",
|
| 17 |
+
"latency_seconds": 28.3352533980069,
|
| 18 |
+
"ok": true,
|
| 19 |
+
"prompt_tokens": 63,
|
| 20 |
+
"total_tokens": 575,
|
| 21 |
+
"ttft_seconds": null
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"completion_tokens": 512,
|
| 25 |
+
"error": null,
|
| 26 |
+
"finish_reason": "length",
|
| 27 |
+
"latency_seconds": 29.157588707006653,
|
| 28 |
+
"ok": true,
|
| 29 |
+
"prompt_tokens": 52,
|
| 30 |
+
"total_tokens": 564,
|
| 31 |
+
"ttft_seconds": null
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"completion_tokens": 512,
|
| 35 |
+
"error": null,
|
| 36 |
+
"finish_reason": "length",
|
| 37 |
+
"latency_seconds": 29.28309229698789,
|
| 38 |
+
"ok": true,
|
| 39 |
+
"prompt_tokens": 84,
|
| 40 |
+
"total_tokens": 596,
|
| 41 |
+
"ttft_seconds": null
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"completion_tokens": 512,
|
| 45 |
+
"error": null,
|
| 46 |
+
"finish_reason": "length",
|
| 47 |
+
"latency_seconds": 29.275857917993562,
|
| 48 |
+
"ok": true,
|
| 49 |
+
"prompt_tokens": 69,
|
| 50 |
+
"total_tokens": 581,
|
| 51 |
+
"ttft_seconds": null
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"completion_tokens": 512,
|
| 55 |
+
"error": null,
|
| 56 |
+
"finish_reason": "length",
|
| 57 |
+
"latency_seconds": 29.9203517690039,
|
| 58 |
+
"ok": true,
|
| 59 |
+
"prompt_tokens": 57,
|
| 60 |
+
"total_tokens": 569,
|
| 61 |
+
"ttft_seconds": null
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"completion_tokens": 512,
|
| 65 |
+
"error": null,
|
| 66 |
+
"finish_reason": "length",
|
| 67 |
+
"latency_seconds": 30.043441410001833,
|
| 68 |
+
"ok": true,
|
| 69 |
+
"prompt_tokens": 53,
|
| 70 |
+
"total_tokens": 565,
|
| 71 |
+
"ttft_seconds": null
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"completion_tokens": 512,
|
| 75 |
+
"error": null,
|
| 76 |
+
"finish_reason": "length",
|
| 77 |
+
"latency_seconds": 30.03822507499717,
|
| 78 |
+
"ok": true,
|
| 79 |
+
"prompt_tokens": 53,
|
| 80 |
+
"total_tokens": 565,
|
| 81 |
+
"ttft_seconds": null
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"completion_tokens": 512,
|
| 85 |
+
"error": null,
|
| 86 |
+
"finish_reason": "length",
|
| 87 |
+
"latency_seconds": 30.40548196999589,
|
| 88 |
+
"ok": true,
|
| 89 |
+
"prompt_tokens": 49,
|
| 90 |
+
"total_tokens": 561,
|
| 91 |
+
"ttft_seconds": null
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"completion_tokens": 512,
|
| 95 |
+
"error": null,
|
| 96 |
+
"finish_reason": "length",
|
| 97 |
+
"latency_seconds": 30.6449004009919,
|
| 98 |
+
"ok": true,
|
| 99 |
+
"prompt_tokens": 69,
|
| 100 |
+
"total_tokens": 581,
|
| 101 |
+
"ttft_seconds": null
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"completion_tokens": 512,
|
| 105 |
+
"error": null,
|
| 106 |
+
"finish_reason": "length",
|
| 107 |
+
"latency_seconds": 30.64418637799099,
|
| 108 |
+
"ok": true,
|
| 109 |
+
"prompt_tokens": 59,
|
| 110 |
+
"total_tokens": 571,
|
| 111 |
+
"ttft_seconds": null
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"completion_tokens": 512,
|
| 115 |
+
"error": null,
|
| 116 |
+
"finish_reason": "length",
|
| 117 |
+
"latency_seconds": 30.87590012399596,
|
| 118 |
+
"ok": true,
|
| 119 |
+
"prompt_tokens": 59,
|
| 120 |
+
"total_tokens": 571,
|
| 121 |
+
"ttft_seconds": null
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"completion_tokens": 512,
|
| 125 |
+
"error": null,
|
| 126 |
+
"finish_reason": "length",
|
| 127 |
+
"latency_seconds": 30.87946494400967,
|
| 128 |
+
"ok": true,
|
| 129 |
+
"prompt_tokens": 66,
|
| 130 |
+
"total_tokens": 578,
|
| 131 |
+
"ttft_seconds": null
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"completion_tokens": 512,
|
| 135 |
+
"error": null,
|
| 136 |
+
"finish_reason": "length",
|
| 137 |
+
"latency_seconds": 31.011349057996995,
|
| 138 |
+
"ok": true,
|
| 139 |
+
"prompt_tokens": 74,
|
| 140 |
+
"total_tokens": 586,
|
| 141 |
+
"ttft_seconds": null
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"completion_tokens": 512,
|
| 145 |
+
"error": null,
|
| 146 |
+
"finish_reason": "length",
|
| 147 |
+
"latency_seconds": 31.151489914002013,
|
| 148 |
+
"ok": true,
|
| 149 |
+
"prompt_tokens": 57,
|
| 150 |
+
"total_tokens": 569,
|
| 151 |
+
"ttft_seconds": null
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"completion_tokens": 512,
|
| 155 |
+
"error": null,
|
| 156 |
+
"finish_reason": "length",
|
| 157 |
+
"latency_seconds": 31.153761499997927,
|
| 158 |
+
"ok": true,
|
| 159 |
+
"prompt_tokens": 74,
|
| 160 |
+
"total_tokens": 586,
|
| 161 |
+
"ttft_seconds": null
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"completion_tokens": 512,
|
| 165 |
+
"error": null,
|
| 166 |
+
"finish_reason": "length",
|
| 167 |
+
"latency_seconds": 31.360902844011434,
|
| 168 |
+
"ok": true,
|
| 169 |
+
"prompt_tokens": 70,
|
| 170 |
+
"total_tokens": 582,
|
| 171 |
+
"ttft_seconds": null
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"completion_tokens": 512,
|
| 175 |
+
"error": null,
|
| 176 |
+
"finish_reason": "length",
|
| 177 |
+
"latency_seconds": 31.954058966992307,
|
| 178 |
+
"ok": true,
|
| 179 |
+
"prompt_tokens": 47,
|
| 180 |
+
"total_tokens": 559,
|
| 181 |
+
"ttft_seconds": null
|
| 182 |
+
},
|
| 183 |
+
{
|
| 184 |
+
"completion_tokens": 512,
|
| 185 |
+
"error": null,
|
| 186 |
+
"finish_reason": "length",
|
| 187 |
+
"latency_seconds": 32.07014694499958,
|
| 188 |
+
"ok": true,
|
| 189 |
+
"prompt_tokens": 54,
|
| 190 |
+
"total_tokens": 566,
|
| 191 |
+
"ttft_seconds": null
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"completion_tokens": 512,
|
| 195 |
+
"error": null,
|
| 196 |
+
"finish_reason": "length",
|
| 197 |
+
"latency_seconds": 32.19269592600176,
|
| 198 |
+
"ok": true,
|
| 199 |
+
"prompt_tokens": 48,
|
| 200 |
+
"total_tokens": 560,
|
| 201 |
+
"ttft_seconds": null
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"completion_tokens": 512,
|
| 205 |
+
"error": null,
|
| 206 |
+
"finish_reason": "length",
|
| 207 |
+
"latency_seconds": 32.46390866699221,
|
| 208 |
+
"ok": true,
|
| 209 |
+
"prompt_tokens": 70,
|
| 210 |
+
"total_tokens": 582,
|
| 211 |
+
"ttft_seconds": null
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"completion_tokens": 512,
|
| 215 |
+
"error": null,
|
| 216 |
+
"finish_reason": "length",
|
| 217 |
+
"latency_seconds": 32.864960171995335,
|
| 218 |
+
"ok": true,
|
| 219 |
+
"prompt_tokens": 65,
|
| 220 |
+
"total_tokens": 577,
|
| 221 |
+
"ttft_seconds": null
|
| 222 |
+
},
|
| 223 |
+
{
|
| 224 |
+
"completion_tokens": 512,
|
| 225 |
+
"error": null,
|
| 226 |
+
"finish_reason": "length",
|
| 227 |
+
"latency_seconds": 32.861970097001176,
|
| 228 |
+
"ok": true,
|
| 229 |
+
"prompt_tokens": 67,
|
| 230 |
+
"total_tokens": 579,
|
| 231 |
+
"ttft_seconds": null
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"completion_tokens": 512,
|
| 235 |
+
"error": null,
|
| 236 |
+
"finish_reason": "length",
|
| 237 |
+
"latency_seconds": 32.86855284299236,
|
| 238 |
+
"ok": true,
|
| 239 |
+
"prompt_tokens": 67,
|
| 240 |
+
"total_tokens": 579,
|
| 241 |
+
"ttft_seconds": null
|
| 242 |
+
},
|
| 243 |
+
{
|
| 244 |
+
"completion_tokens": 512,
|
| 245 |
+
"error": null,
|
| 246 |
+
"finish_reason": "length",
|
| 247 |
+
"latency_seconds": 28.28247975600243,
|
| 248 |
+
"ok": true,
|
| 249 |
+
"prompt_tokens": 63,
|
| 250 |
+
"total_tokens": 575,
|
| 251 |
+
"ttft_seconds": null
|
| 252 |
+
},
|
| 253 |
+
{
|
| 254 |
+
"completion_tokens": 512,
|
| 255 |
+
"error": null,
|
| 256 |
+
"finish_reason": "length",
|
| 257 |
+
"latency_seconds": 29.484684513998218,
|
| 258 |
+
"ok": true,
|
| 259 |
+
"prompt_tokens": 66,
|
| 260 |
+
"total_tokens": 578,
|
| 261 |
+
"ttft_seconds": null
|
| 262 |
+
},
|
| 263 |
+
{
|
| 264 |
+
"completion_tokens": 512,
|
| 265 |
+
"error": null,
|
| 266 |
+
"finish_reason": "length",
|
| 267 |
+
"latency_seconds": 31.488656917004846,
|
| 268 |
+
"ok": true,
|
| 269 |
+
"prompt_tokens": 52,
|
| 270 |
+
"total_tokens": 564,
|
| 271 |
+
"ttft_seconds": null
|
| 272 |
+
},
|
| 273 |
+
{
|
| 274 |
+
"completion_tokens": 512,
|
| 275 |
+
"error": null,
|
| 276 |
+
"finish_reason": "length",
|
| 277 |
+
"latency_seconds": 29.033699637002428,
|
| 278 |
+
"ok": true,
|
| 279 |
+
"prompt_tokens": 84,
|
| 280 |
+
"total_tokens": 596,
|
| 281 |
+
"ttft_seconds": null
|
| 282 |
+
},
|
| 283 |
+
{
|
| 284 |
+
"completion_tokens": 512,
|
| 285 |
+
"error": null,
|
| 286 |
+
"finish_reason": "length",
|
| 287 |
+
"latency_seconds": 31.569517002993962,
|
| 288 |
+
"ok": true,
|
| 289 |
+
"prompt_tokens": 65,
|
| 290 |
+
"total_tokens": 577,
|
| 291 |
+
"ttft_seconds": null
|
| 292 |
+
},
|
| 293 |
+
{
|
| 294 |
+
"completion_tokens": 512,
|
| 295 |
+
"error": null,
|
| 296 |
+
"finish_reason": "length",
|
| 297 |
+
"latency_seconds": 31.057641403007437,
|
| 298 |
+
"ok": true,
|
| 299 |
+
"prompt_tokens": 49,
|
| 300 |
+
"total_tokens": 561,
|
| 301 |
+
"ttft_seconds": null
|
| 302 |
+
},
|
| 303 |
+
{
|
| 304 |
+
"completion_tokens": 512,
|
| 305 |
+
"error": null,
|
| 306 |
+
"finish_reason": "length",
|
| 307 |
+
"latency_seconds": 29.62780538300285,
|
| 308 |
+
"ok": true,
|
| 309 |
+
"prompt_tokens": 59,
|
| 310 |
+
"total_tokens": 571,
|
| 311 |
+
"ttft_seconds": null
|
| 312 |
+
},
|
| 313 |
+
{
|
| 314 |
+
"completion_tokens": 512,
|
| 315 |
+
"error": null,
|
| 316 |
+
"finish_reason": "length",
|
| 317 |
+
"latency_seconds": 30.534046617001877,
|
| 318 |
+
"ok": true,
|
| 319 |
+
"prompt_tokens": 74,
|
| 320 |
+
"total_tokens": 586,
|
| 321 |
+
"ttft_seconds": null
|
| 322 |
+
},
|
| 323 |
+
{
|
| 324 |
+
"completion_tokens": 512,
|
| 325 |
+
"error": null,
|
| 326 |
+
"finish_reason": "length",
|
| 327 |
+
"latency_seconds": 31.547726621996844,
|
| 328 |
+
"ok": true,
|
| 329 |
+
"prompt_tokens": 70,
|
| 330 |
+
"total_tokens": 582,
|
| 331 |
+
"ttft_seconds": null
|
| 332 |
+
},
|
| 333 |
+
{
|
| 334 |
+
"completion_tokens": 512,
|
| 335 |
+
"error": null,
|
| 336 |
+
"finish_reason": "length",
|
| 337 |
+
"latency_seconds": 31.911630268004956,
|
| 338 |
+
"ok": true,
|
| 339 |
+
"prompt_tokens": 47,
|
| 340 |
+
"total_tokens": 559,
|
| 341 |
+
"ttft_seconds": null
|
| 342 |
+
},
|
| 343 |
+
{
|
| 344 |
+
"completion_tokens": 512,
|
| 345 |
+
"error": null,
|
| 346 |
+
"finish_reason": "length",
|
| 347 |
+
"latency_seconds": 30.121892206996563,
|
| 348 |
+
"ok": true,
|
| 349 |
+
"prompt_tokens": 63,
|
| 350 |
+
"total_tokens": 575,
|
| 351 |
+
"ttft_seconds": null
|
| 352 |
+
},
|
| 353 |
+
{
|
| 354 |
+
"completion_tokens": 512,
|
| 355 |
+
"error": null,
|
| 356 |
+
"finish_reason": "length",
|
| 357 |
+
"latency_seconds": 31.431080445996486,
|
| 358 |
+
"ok": true,
|
| 359 |
+
"prompt_tokens": 53,
|
| 360 |
+
"total_tokens": 565,
|
| 361 |
+
"ttft_seconds": null
|
| 362 |
+
},
|
| 363 |
+
{
|
| 364 |
+
"completion_tokens": 512,
|
| 365 |
+
"error": null,
|
| 366 |
+
"finish_reason": "length",
|
| 367 |
+
"latency_seconds": 33.46200022000994,
|
| 368 |
+
"ok": true,
|
| 369 |
+
"prompt_tokens": 48,
|
| 370 |
+
"total_tokens": 560,
|
| 371 |
+
"ttft_seconds": null
|
| 372 |
+
},
|
| 373 |
+
{
|
| 374 |
+
"completion_tokens": 512,
|
| 375 |
+
"error": null,
|
| 376 |
+
"finish_reason": "length",
|
| 377 |
+
"latency_seconds": 32.13843286699557,
|
| 378 |
+
"ok": true,
|
| 379 |
+
"prompt_tokens": 52,
|
| 380 |
+
"total_tokens": 564,
|
| 381 |
+
"ttft_seconds": null
|
| 382 |
+
},
|
| 383 |
+
{
|
| 384 |
+
"completion_tokens": 512,
|
| 385 |
+
"error": null,
|
| 386 |
+
"finish_reason": "length",
|
| 387 |
+
"latency_seconds": 33.0463265189901,
|
| 388 |
+
"ok": true,
|
| 389 |
+
"prompt_tokens": 69,
|
| 390 |
+
"total_tokens": 581,
|
| 391 |
+
"ttft_seconds": null
|
| 392 |
+
},
|
| 393 |
+
{
|
| 394 |
+
"completion_tokens": 512,
|
| 395 |
+
"error": null,
|
| 396 |
+
"finish_reason": "length",
|
| 397 |
+
"latency_seconds": 32.64756175701041,
|
| 398 |
+
"ok": true,
|
| 399 |
+
"prompt_tokens": 65,
|
| 400 |
+
"total_tokens": 577,
|
| 401 |
+
"ttft_seconds": null
|
| 402 |
+
},
|
| 403 |
+
{
|
| 404 |
+
"completion_tokens": 512,
|
| 405 |
+
"error": null,
|
| 406 |
+
"finish_reason": "length",
|
| 407 |
+
"latency_seconds": 32.03739858500194,
|
| 408 |
+
"ok": true,
|
| 409 |
+
"prompt_tokens": 48,
|
| 410 |
+
"total_tokens": 560,
|
| 411 |
+
"ttft_seconds": null
|
| 412 |
+
},
|
| 413 |
+
{
|
| 414 |
+
"completion_tokens": 512,
|
| 415 |
+
"error": null,
|
| 416 |
+
"finish_reason": "length",
|
| 417 |
+
"latency_seconds": 35.158272015003604,
|
| 418 |
+
"ok": true,
|
| 419 |
+
"prompt_tokens": 54,
|
| 420 |
+
"total_tokens": 566,
|
| 421 |
+
"ttft_seconds": null
|
| 422 |
+
},
|
| 423 |
+
{
|
| 424 |
+
"completion_tokens": 512,
|
| 425 |
+
"error": null,
|
| 426 |
+
"finish_reason": "length",
|
| 427 |
+
"latency_seconds": 34.321281433003605,
|
| 428 |
+
"ok": true,
|
| 429 |
+
"prompt_tokens": 67,
|
| 430 |
+
"total_tokens": 579,
|
| 431 |
+
"ttft_seconds": null
|
| 432 |
+
},
|
| 433 |
+
{
|
| 434 |
+
"completion_tokens": 512,
|
| 435 |
+
"error": null,
|
| 436 |
+
"finish_reason": "length",
|
| 437 |
+
"latency_seconds": 33.30930214600812,
|
| 438 |
+
"ok": true,
|
| 439 |
+
"prompt_tokens": 66,
|
| 440 |
+
"total_tokens": 578,
|
| 441 |
+
"ttft_seconds": null
|
| 442 |
+
},
|
| 443 |
+
{
|
| 444 |
+
"completion_tokens": 512,
|
| 445 |
+
"error": null,
|
| 446 |
+
"finish_reason": "length",
|
| 447 |
+
"latency_seconds": 34.42579705698881,
|
| 448 |
+
"ok": true,
|
| 449 |
+
"prompt_tokens": 57,
|
| 450 |
+
"total_tokens": 569,
|
| 451 |
+
"ttft_seconds": null
|
| 452 |
+
},
|
| 453 |
+
{
|
| 454 |
+
"completion_tokens": 512,
|
| 455 |
+
"error": null,
|
| 456 |
+
"finish_reason": "length",
|
| 457 |
+
"latency_seconds": 33.18547840398969,
|
| 458 |
+
"ok": true,
|
| 459 |
+
"prompt_tokens": 47,
|
| 460 |
+
"total_tokens": 559,
|
| 461 |
+
"ttft_seconds": null
|
| 462 |
+
},
|
| 463 |
+
{
|
| 464 |
+
"completion_tokens": 512,
|
| 465 |
+
"error": null,
|
| 466 |
+
"finish_reason": "length",
|
| 467 |
+
"latency_seconds": 33.97069786199427,
|
| 468 |
+
"ok": true,
|
| 469 |
+
"prompt_tokens": 49,
|
| 470 |
+
"total_tokens": 561,
|
| 471 |
+
"ttft_seconds": null
|
| 472 |
+
},
|
| 473 |
+
{
|
| 474 |
+
"completion_tokens": 512,
|
| 475 |
+
"error": null,
|
| 476 |
+
"finish_reason": "length",
|
| 477 |
+
"latency_seconds": 35.37314189800236,
|
| 478 |
+
"ok": true,
|
| 479 |
+
"prompt_tokens": 54,
|
| 480 |
+
"total_tokens": 566,
|
| 481 |
+
"ttft_seconds": null
|
| 482 |
+
}
|
| 483 |
+
],
|
| 484 |
+
"summary": {
|
| 485 |
+
"concurrency": 24,
|
| 486 |
+
"errors": [],
|
| 487 |
+
"failed_requests": 0,
|
| 488 |
+
"mean_interactive_tps": null,
|
| 489 |
+
"mean_latency_seconds": 31.41674809835361,
|
| 490 |
+
"mean_ttft_seconds": null,
|
| 491 |
+
"output_token_throughput_tps": 360.1202566066748,
|
| 492 |
+
"p95_interactive_tps": null,
|
| 493 |
+
"p95_latency_seconds": 34.38921658859399,
|
| 494 |
+
"p95_ttft_seconds": null,
|
| 495 |
+
"request_count": 48,
|
| 496 |
+
"request_throughput_rps": 0.7033598761849117,
|
| 497 |
+
"successful_requests": 48,
|
| 498 |
+
"total_completion_tokens": 24576,
|
| 499 |
+
"total_prompt_tokens": 2931,
|
| 500 |
+
"wall_seconds": 68.24387006599864
|
| 501 |
+
}
|
| 502 |
+
}
|
benchmarks/CLEAN-dflash-st2-s32-c32.json
ADDED
|
@@ -0,0 +1,662 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"results": [
|
| 3 |
+
{
|
| 4 |
+
"completion_tokens": 512,
|
| 5 |
+
"error": null,
|
| 6 |
+
"finish_reason": "length",
|
| 7 |
+
"latency_seconds": 28.01882232099888,
|
| 8 |
+
"ok": true,
|
| 9 |
+
"prompt_tokens": 84,
|
| 10 |
+
"total_tokens": 596,
|
| 11 |
+
"ttft_seconds": null
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"completion_tokens": 512,
|
| 15 |
+
"error": null,
|
| 16 |
+
"finish_reason": "length",
|
| 17 |
+
"latency_seconds": 28.71752019300766,
|
| 18 |
+
"ok": true,
|
| 19 |
+
"prompt_tokens": 84,
|
| 20 |
+
"total_tokens": 596,
|
| 21 |
+
"ttft_seconds": null
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"completion_tokens": 512,
|
| 25 |
+
"error": null,
|
| 26 |
+
"finish_reason": "length",
|
| 27 |
+
"latency_seconds": 29.09034041898849,
|
| 28 |
+
"ok": true,
|
| 29 |
+
"prompt_tokens": 59,
|
| 30 |
+
"total_tokens": 571,
|
| 31 |
+
"ttft_seconds": null
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
"completion_tokens": 512,
|
| 35 |
+
"error": null,
|
| 36 |
+
"finish_reason": "length",
|
| 37 |
+
"latency_seconds": 29.085263486005715,
|
| 38 |
+
"ok": true,
|
| 39 |
+
"prompt_tokens": 59,
|
| 40 |
+
"total_tokens": 571,
|
| 41 |
+
"ttft_seconds": null
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
"completion_tokens": 512,
|
| 45 |
+
"error": null,
|
| 46 |
+
"finish_reason": "length",
|
| 47 |
+
"latency_seconds": 29.084148221998475,
|
| 48 |
+
"ok": true,
|
| 49 |
+
"prompt_tokens": 66,
|
| 50 |
+
"total_tokens": 578,
|
| 51 |
+
"ttft_seconds": null
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"completion_tokens": 512,
|
| 55 |
+
"error": null,
|
| 56 |
+
"finish_reason": "length",
|
| 57 |
+
"latency_seconds": 29.660148123002728,
|
| 58 |
+
"ok": true,
|
| 59 |
+
"prompt_tokens": 63,
|
| 60 |
+
"total_tokens": 575,
|
| 61 |
+
"ttft_seconds": null
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
"completion_tokens": 512,
|
| 65 |
+
"error": null,
|
| 66 |
+
"finish_reason": "length",
|
| 67 |
+
"latency_seconds": 29.893849693995435,
|
| 68 |
+
"ok": true,
|
| 69 |
+
"prompt_tokens": 52,
|
| 70 |
+
"total_tokens": 564,
|
| 71 |
+
"ttft_seconds": null
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
"completion_tokens": 512,
|
| 75 |
+
"error": null,
|
| 76 |
+
"finish_reason": "length",
|
| 77 |
+
"latency_seconds": 29.88796380200074,
|
| 78 |
+
"ok": true,
|
| 79 |
+
"prompt_tokens": 63,
|
| 80 |
+
"total_tokens": 575,
|
| 81 |
+
"ttft_seconds": null
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"completion_tokens": 512,
|
| 85 |
+
"error": null,
|
| 86 |
+
"finish_reason": "length",
|
| 87 |
+
"latency_seconds": 30.099160569006926,
|
| 88 |
+
"ok": true,
|
| 89 |
+
"prompt_tokens": 53,
|
| 90 |
+
"total_tokens": 565,
|
| 91 |
+
"ttft_seconds": null
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"completion_tokens": 512,
|
| 95 |
+
"error": null,
|
| 96 |
+
"finish_reason": "length",
|
| 97 |
+
"latency_seconds": 30.23486655400484,
|
| 98 |
+
"ok": true,
|
| 99 |
+
"prompt_tokens": 53,
|
| 100 |
+
"total_tokens": 565,
|
| 101 |
+
"ttft_seconds": null
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"completion_tokens": 512,
|
| 105 |
+
"error": null,
|
| 106 |
+
"finish_reason": "length",
|
| 107 |
+
"latency_seconds": 30.665212656007498,
|
| 108 |
+
"ok": true,
|
| 109 |
+
"prompt_tokens": 65,
|
| 110 |
+
"total_tokens": 577,
|
| 111 |
+
"ttft_seconds": null
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"completion_tokens": 512,
|
| 115 |
+
"error": null,
|
| 116 |
+
"finish_reason": "length",
|
| 117 |
+
"latency_seconds": 30.67044495200389,
|
| 118 |
+
"ok": true,
|
| 119 |
+
"prompt_tokens": 65,
|
| 120 |
+
"total_tokens": 577,
|
| 121 |
+
"ttft_seconds": null
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"completion_tokens": 512,
|
| 125 |
+
"error": null,
|
| 126 |
+
"finish_reason": "length",
|
| 127 |
+
"latency_seconds": 30.786519360000966,
|
| 128 |
+
"ok": true,
|
| 129 |
+
"prompt_tokens": 74,
|
| 130 |
+
"total_tokens": 586,
|
| 131 |
+
"ttft_seconds": null
|
| 132 |
+
},
|
| 133 |
+
{
|
| 134 |
+
"completion_tokens": 512,
|
| 135 |
+
"error": null,
|
| 136 |
+
"finish_reason": "length",
|
| 137 |
+
"latency_seconds": 31.033634652994806,
|
| 138 |
+
"ok": true,
|
| 139 |
+
"prompt_tokens": 48,
|
| 140 |
+
"total_tokens": 560,
|
| 141 |
+
"ttft_seconds": null
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"completion_tokens": 512,
|
| 145 |
+
"error": null,
|
| 146 |
+
"finish_reason": "length",
|
| 147 |
+
"latency_seconds": 31.16041296599724,
|
| 148 |
+
"ok": true,
|
| 149 |
+
"prompt_tokens": 49,
|
| 150 |
+
"total_tokens": 561,
|
| 151 |
+
"ttft_seconds": null
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"completion_tokens": 512,
|
| 155 |
+
"error": null,
|
| 156 |
+
"finish_reason": "length",
|
| 157 |
+
"latency_seconds": 31.158351751990267,
|
| 158 |
+
"ok": true,
|
| 159 |
+
"prompt_tokens": 74,
|
| 160 |
+
"total_tokens": 586,
|
| 161 |
+
"ttft_seconds": null
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"completion_tokens": 512,
|
| 165 |
+
"error": null,
|
| 166 |
+
"finish_reason": "length",
|
| 167 |
+
"latency_seconds": 31.27831143300864,
|
| 168 |
+
"ok": true,
|
| 169 |
+
"prompt_tokens": 70,
|
| 170 |
+
"total_tokens": 582,
|
| 171 |
+
"ttft_seconds": null
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"completion_tokens": 512,
|
| 175 |
+
"error": null,
|
| 176 |
+
"finish_reason": "length",
|
| 177 |
+
"latency_seconds": 31.394244242997956,
|
| 178 |
+
"ok": true,
|
| 179 |
+
"prompt_tokens": 69,
|
| 180 |
+
"total_tokens": 581,
|
| 181 |
+
"ttft_seconds": null
|
| 182 |
+
},
|
| 183 |
+
{
|
| 184 |
+
"completion_tokens": 512,
|
| 185 |
+
"error": null,
|
| 186 |
+
"finish_reason": "length",
|
| 187 |
+
"latency_seconds": 31.521478868002305,
|
| 188 |
+
"ok": true,
|
| 189 |
+
"prompt_tokens": 66,
|
| 190 |
+
"total_tokens": 578,
|
| 191 |
+
"ttft_seconds": null
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"completion_tokens": 512,
|
| 195 |
+
"error": null,
|
| 196 |
+
"finish_reason": "length",
|
| 197 |
+
"latency_seconds": 31.51592241799517,
|
| 198 |
+
"ok": true,
|
| 199 |
+
"prompt_tokens": 48,
|
| 200 |
+
"total_tokens": 560,
|
| 201 |
+
"ttft_seconds": null
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"completion_tokens": 512,
|
| 205 |
+
"error": null,
|
| 206 |
+
"finish_reason": "length",
|
| 207 |
+
"latency_seconds": 31.646591530996375,
|
| 208 |
+
"ok": true,
|
| 209 |
+
"prompt_tokens": 57,
|
| 210 |
+
"total_tokens": 569,
|
| 211 |
+
"ttft_seconds": null
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"completion_tokens": 512,
|
| 215 |
+
"error": null,
|
| 216 |
+
"finish_reason": "length",
|
| 217 |
+
"latency_seconds": 31.640455272005056,
|
| 218 |
+
"ok": true,
|
| 219 |
+
"prompt_tokens": 49,
|
| 220 |
+
"total_tokens": 561,
|
| 221 |
+
"ttft_seconds": null
|
| 222 |
+
},
|
| 223 |
+
{
|
| 224 |
+
"completion_tokens": 512,
|
| 225 |
+
"error": null,
|
| 226 |
+
"finish_reason": "length",
|
| 227 |
+
"latency_seconds": 31.643912301005912,
|
| 228 |
+
"ok": true,
|
| 229 |
+
"prompt_tokens": 70,
|
| 230 |
+
"total_tokens": 582,
|
| 231 |
+
"ttft_seconds": null
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"completion_tokens": 512,
|
| 235 |
+
"error": null,
|
| 236 |
+
"finish_reason": "length",
|
| 237 |
+
"latency_seconds": 31.76287691500329,
|
| 238 |
+
"ok": true,
|
| 239 |
+
"prompt_tokens": 54,
|
| 240 |
+
"total_tokens": 566,
|
| 241 |
+
"ttft_seconds": null
|
| 242 |
+
},
|
| 243 |
+
{
|
| 244 |
+
"completion_tokens": 512,
|
| 245 |
+
"error": null,
|
| 246 |
+
"finish_reason": "length",
|
| 247 |
+
"latency_seconds": 32.09083567500056,
|
| 248 |
+
"ok": true,
|
| 249 |
+
"prompt_tokens": 52,
|
| 250 |
+
"total_tokens": 564,
|
| 251 |
+
"ttft_seconds": null
|
| 252 |
+
},
|
| 253 |
+
{
|
| 254 |
+
"completion_tokens": 512,
|
| 255 |
+
"error": null,
|
| 256 |
+
"finish_reason": "length",
|
| 257 |
+
"latency_seconds": 32.09159855300095,
|
| 258 |
+
"ok": true,
|
| 259 |
+
"prompt_tokens": 57,
|
| 260 |
+
"total_tokens": 569,
|
| 261 |
+
"ttft_seconds": null
|
| 262 |
+
},
|
| 263 |
+
{
|
| 264 |
+
"completion_tokens": 512,
|
| 265 |
+
"error": null,
|
| 266 |
+
"finish_reason": "length",
|
| 267 |
+
"latency_seconds": 32.207180618992425,
|
| 268 |
+
"ok": true,
|
| 269 |
+
"prompt_tokens": 69,
|
| 270 |
+
"total_tokens": 581,
|
| 271 |
+
"ttft_seconds": null
|
| 272 |
+
},
|
| 273 |
+
{
|
| 274 |
+
"completion_tokens": 512,
|
| 275 |
+
"error": null,
|
| 276 |
+
"finish_reason": "length",
|
| 277 |
+
"latency_seconds": 32.572931612987304,
|
| 278 |
+
"ok": true,
|
| 279 |
+
"prompt_tokens": 54,
|
| 280 |
+
"total_tokens": 566,
|
| 281 |
+
"ttft_seconds": null
|
| 282 |
+
},
|
| 283 |
+
{
|
| 284 |
+
"completion_tokens": 512,
|
| 285 |
+
"error": null,
|
| 286 |
+
"finish_reason": "length",
|
| 287 |
+
"latency_seconds": 33.17789545400592,
|
| 288 |
+
"ok": true,
|
| 289 |
+
"prompt_tokens": 47,
|
| 290 |
+
"total_tokens": 559,
|
| 291 |
+
"ttft_seconds": null
|
| 292 |
+
},
|
| 293 |
+
{
|
| 294 |
+
"completion_tokens": 512,
|
| 295 |
+
"error": null,
|
| 296 |
+
"finish_reason": "length",
|
| 297 |
+
"latency_seconds": 33.173211657005595,
|
| 298 |
+
"ok": true,
|
| 299 |
+
"prompt_tokens": 47,
|
| 300 |
+
"total_tokens": 559,
|
| 301 |
+
"ttft_seconds": null
|
| 302 |
+
},
|
| 303 |
+
{
|
| 304 |
+
"completion_tokens": 512,
|
| 305 |
+
"error": null,
|
| 306 |
+
"finish_reason": "length",
|
| 307 |
+
"latency_seconds": 33.17662995199498,
|
| 308 |
+
"ok": true,
|
| 309 |
+
"prompt_tokens": 67,
|
| 310 |
+
"total_tokens": 579,
|
| 311 |
+
"ttft_seconds": null
|
| 312 |
+
},
|
| 313 |
+
{
|
| 314 |
+
"completion_tokens": 512,
|
| 315 |
+
"error": null,
|
| 316 |
+
"finish_reason": "length",
|
| 317 |
+
"latency_seconds": 33.18274166400079,
|
| 318 |
+
"ok": true,
|
| 319 |
+
"prompt_tokens": 67,
|
| 320 |
+
"total_tokens": 579,
|
| 321 |
+
"ttft_seconds": null
|
| 322 |
+
},
|
| 323 |
+
{
|
| 324 |
+
"completion_tokens": 512,
|
| 325 |
+
"error": null,
|
| 326 |
+
"finish_reason": "length",
|
| 327 |
+
"latency_seconds": 28.288002299988875,
|
| 328 |
+
"ok": true,
|
| 329 |
+
"prompt_tokens": 84,
|
| 330 |
+
"total_tokens": 596,
|
| 331 |
+
"ttft_seconds": null
|
| 332 |
+
},
|
| 333 |
+
{
|
| 334 |
+
"completion_tokens": 512,
|
| 335 |
+
"error": null,
|
| 336 |
+
"finish_reason": "length",
|
| 337 |
+
"latency_seconds": 28.07908038899768,
|
| 338 |
+
"ok": true,
|
| 339 |
+
"prompt_tokens": 52,
|
| 340 |
+
"total_tokens": 564,
|
| 341 |
+
"ttft_seconds": null
|
| 342 |
+
},
|
| 343 |
+
{
|
| 344 |
+
"completion_tokens": 512,
|
| 345 |
+
"error": null,
|
| 346 |
+
"finish_reason": "length",
|
| 347 |
+
"latency_seconds": 27.399355375004234,
|
| 348 |
+
"ok": true,
|
| 349 |
+
"prompt_tokens": 63,
|
| 350 |
+
"total_tokens": 575,
|
| 351 |
+
"ttft_seconds": null
|
| 352 |
+
},
|
| 353 |
+
{
|
| 354 |
+
"completion_tokens": 512,
|
| 355 |
+
"error": null,
|
| 356 |
+
"finish_reason": "length",
|
| 357 |
+
"latency_seconds": 30.969244494001032,
|
| 358 |
+
"ok": true,
|
| 359 |
+
"prompt_tokens": 70,
|
| 360 |
+
"total_tokens": 582,
|
| 361 |
+
"ttft_seconds": null
|
| 362 |
+
},
|
| 363 |
+
{
|
| 364 |
+
"completion_tokens": 512,
|
| 365 |
+
"error": null,
|
| 366 |
+
"finish_reason": "length",
|
| 367 |
+
"latency_seconds": 29.57875262699963,
|
| 368 |
+
"ok": true,
|
| 369 |
+
"prompt_tokens": 59,
|
| 370 |
+
"total_tokens": 571,
|
| 371 |
+
"ttft_seconds": null
|
| 372 |
+
},
|
| 373 |
+
{
|
| 374 |
+
"completion_tokens": 512,
|
| 375 |
+
"error": null,
|
| 376 |
+
"finish_reason": "length",
|
| 377 |
+
"latency_seconds": 28.15583077100746,
|
| 378 |
+
"ok": true,
|
| 379 |
+
"prompt_tokens": 84,
|
| 380 |
+
"total_tokens": 596,
|
| 381 |
+
"ttft_seconds": null
|
| 382 |
+
},
|
| 383 |
+
{
|
| 384 |
+
"completion_tokens": 512,
|
| 385 |
+
"error": null,
|
| 386 |
+
"finish_reason": "length",
|
| 387 |
+
"latency_seconds": 29.113754692996736,
|
| 388 |
+
"ok": true,
|
| 389 |
+
"prompt_tokens": 66,
|
| 390 |
+
"total_tokens": 578,
|
| 391 |
+
"ttft_seconds": null
|
| 392 |
+
},
|
| 393 |
+
{
|
| 394 |
+
"completion_tokens": 512,
|
| 395 |
+
"error": null,
|
| 396 |
+
"finish_reason": "length",
|
| 397 |
+
"latency_seconds": 30.311436862000846,
|
| 398 |
+
"ok": true,
|
| 399 |
+
"prompt_tokens": 57,
|
| 400 |
+
"total_tokens": 569,
|
| 401 |
+
"ttft_seconds": null
|
| 402 |
+
},
|
| 403 |
+
{
|
| 404 |
+
"completion_tokens": 512,
|
| 405 |
+
"error": null,
|
| 406 |
+
"finish_reason": "length",
|
| 407 |
+
"latency_seconds": 31.23266291100299,
|
| 408 |
+
"ok": true,
|
| 409 |
+
"prompt_tokens": 69,
|
| 410 |
+
"total_tokens": 581,
|
| 411 |
+
"ttft_seconds": null
|
| 412 |
+
},
|
| 413 |
+
{
|
| 414 |
+
"completion_tokens": 512,
|
| 415 |
+
"error": null,
|
| 416 |
+
"finish_reason": "length",
|
| 417 |
+
"latency_seconds": 29.039967449003598,
|
| 418 |
+
"ok": true,
|
| 419 |
+
"prompt_tokens": 53,
|
| 420 |
+
"total_tokens": 565,
|
| 421 |
+
"ttft_seconds": null
|
| 422 |
+
},
|
| 423 |
+
{
|
| 424 |
+
"completion_tokens": 512,
|
| 425 |
+
"error": null,
|
| 426 |
+
"finish_reason": "length",
|
| 427 |
+
"latency_seconds": 31.84722881700145,
|
| 428 |
+
"ok": true,
|
| 429 |
+
"prompt_tokens": 74,
|
| 430 |
+
"total_tokens": 586,
|
| 431 |
+
"ttft_seconds": null
|
| 432 |
+
},
|
| 433 |
+
{
|
| 434 |
+
"completion_tokens": 512,
|
| 435 |
+
"error": null,
|
| 436 |
+
"finish_reason": "length",
|
| 437 |
+
"latency_seconds": 30.139180625992594,
|
| 438 |
+
"ok": true,
|
| 439 |
+
"prompt_tokens": 48,
|
| 440 |
+
"total_tokens": 560,
|
| 441 |
+
"ttft_seconds": null
|
| 442 |
+
},
|
| 443 |
+
{
|
| 444 |
+
"completion_tokens": 512,
|
| 445 |
+
"error": null,
|
| 446 |
+
"finish_reason": "length",
|
| 447 |
+
"latency_seconds": 32.20148644999426,
|
| 448 |
+
"ok": true,
|
| 449 |
+
"prompt_tokens": 67,
|
| 450 |
+
"total_tokens": 579,
|
| 451 |
+
"ttft_seconds": null
|
| 452 |
+
},
|
| 453 |
+
{
|
| 454 |
+
"completion_tokens": 512,
|
| 455 |
+
"error": null,
|
| 456 |
+
"finish_reason": "length",
|
| 457 |
+
"latency_seconds": 28.228285240998957,
|
| 458 |
+
"ok": true,
|
| 459 |
+
"prompt_tokens": 63,
|
| 460 |
+
"total_tokens": 575,
|
| 461 |
+
"ttft_seconds": null
|
| 462 |
+
},
|
| 463 |
+
{
|
| 464 |
+
"completion_tokens": 512,
|
| 465 |
+
"error": null,
|
| 466 |
+
"finish_reason": "length",
|
| 467 |
+
"latency_seconds": 31.629715696006315,
|
| 468 |
+
"ok": true,
|
| 469 |
+
"prompt_tokens": 53,
|
| 470 |
+
"total_tokens": 565,
|
| 471 |
+
"ttft_seconds": null
|
| 472 |
+
},
|
| 473 |
+
{
|
| 474 |
+
"completion_tokens": 512,
|
| 475 |
+
"error": null,
|
| 476 |
+
"finish_reason": "length",
|
| 477 |
+
"latency_seconds": 29.994200429006014,
|
| 478 |
+
"ok": true,
|
| 479 |
+
"prompt_tokens": 57,
|
| 480 |
+
"total_tokens": 569,
|
| 481 |
+
"ttft_seconds": null
|
| 482 |
+
},
|
| 483 |
+
{
|
| 484 |
+
"completion_tokens": 512,
|
| 485 |
+
"error": null,
|
| 486 |
+
"finish_reason": "length",
|
| 487 |
+
"latency_seconds": 29.895010123000247,
|
| 488 |
+
"ok": true,
|
| 489 |
+
"prompt_tokens": 52,
|
| 490 |
+
"total_tokens": 564,
|
| 491 |
+
"ttft_seconds": null
|
| 492 |
+
},
|
| 493 |
+
{
|
| 494 |
+
"completion_tokens": 512,
|
| 495 |
+
"error": null,
|
| 496 |
+
"finish_reason": "length",
|
| 497 |
+
"latency_seconds": 31.32018800600781,
|
| 498 |
+
"ok": true,
|
| 499 |
+
"prompt_tokens": 49,
|
| 500 |
+
"total_tokens": 561,
|
| 501 |
+
"ttft_seconds": null
|
| 502 |
+
},
|
| 503 |
+
{
|
| 504 |
+
"completion_tokens": 512,
|
| 505 |
+
"error": null,
|
| 506 |
+
"finish_reason": "length",
|
| 507 |
+
"latency_seconds": 30.468937472003745,
|
| 508 |
+
"ok": true,
|
| 509 |
+
"prompt_tokens": 74,
|
| 510 |
+
"total_tokens": 586,
|
| 511 |
+
"ttft_seconds": null
|
| 512 |
+
},
|
| 513 |
+
{
|
| 514 |
+
"completion_tokens": 512,
|
| 515 |
+
"error": null,
|
| 516 |
+
"finish_reason": "length",
|
| 517 |
+
"latency_seconds": 31.01375381600519,
|
| 518 |
+
"ok": true,
|
| 519 |
+
"prompt_tokens": 47,
|
| 520 |
+
"total_tokens": 559,
|
| 521 |
+
"ttft_seconds": null
|
| 522 |
+
},
|
| 523 |
+
{
|
| 524 |
+
"completion_tokens": 512,
|
| 525 |
+
"error": null,
|
| 526 |
+
"finish_reason": "length",
|
| 527 |
+
"latency_seconds": 30.52879051498894,
|
| 528 |
+
"ok": true,
|
| 529 |
+
"prompt_tokens": 59,
|
| 530 |
+
"total_tokens": 571,
|
| 531 |
+
"ttft_seconds": null
|
| 532 |
+
},
|
| 533 |
+
{
|
| 534 |
+
"completion_tokens": 512,
|
| 535 |
+
"error": null,
|
| 536 |
+
"finish_reason": "length",
|
| 537 |
+
"latency_seconds": 32.05789956198714,
|
| 538 |
+
"ok": true,
|
| 539 |
+
"prompt_tokens": 65,
|
| 540 |
+
"total_tokens": 577,
|
| 541 |
+
"ttft_seconds": null
|
| 542 |
+
},
|
| 543 |
+
{
|
| 544 |
+
"completion_tokens": 512,
|
| 545 |
+
"error": null,
|
| 546 |
+
"finish_reason": "length",
|
| 547 |
+
"latency_seconds": 31.24651585900574,
|
| 548 |
+
"ok": true,
|
| 549 |
+
"prompt_tokens": 54,
|
| 550 |
+
"total_tokens": 566,
|
| 551 |
+
"ttft_seconds": null
|
| 552 |
+
},
|
| 553 |
+
{
|
| 554 |
+
"completion_tokens": 512,
|
| 555 |
+
"error": null,
|
| 556 |
+
"finish_reason": "length",
|
| 557 |
+
"latency_seconds": 31.40005826498964,
|
| 558 |
+
"ok": true,
|
| 559 |
+
"prompt_tokens": 70,
|
| 560 |
+
"total_tokens": 582,
|
| 561 |
+
"ttft_seconds": null
|
| 562 |
+
},
|
| 563 |
+
{
|
| 564 |
+
"completion_tokens": 512,
|
| 565 |
+
"error": null,
|
| 566 |
+
"finish_reason": "length",
|
| 567 |
+
"latency_seconds": 31.26673553499859,
|
| 568 |
+
"ok": true,
|
| 569 |
+
"prompt_tokens": 67,
|
| 570 |
+
"total_tokens": 579,
|
| 571 |
+
"ttft_seconds": null
|
| 572 |
+
},
|
| 573 |
+
{
|
| 574 |
+
"completion_tokens": 512,
|
| 575 |
+
"error": null,
|
| 576 |
+
"finish_reason": "length",
|
| 577 |
+
"latency_seconds": 29.840106451010797,
|
| 578 |
+
"ok": true,
|
| 579 |
+
"prompt_tokens": 47,
|
| 580 |
+
"total_tokens": 559,
|
| 581 |
+
"ttft_seconds": null
|
| 582 |
+
},
|
| 583 |
+
{
|
| 584 |
+
"completion_tokens": 512,
|
| 585 |
+
"error": null,
|
| 586 |
+
"finish_reason": "length",
|
| 587 |
+
"latency_seconds": 31.03792402399995,
|
| 588 |
+
"ok": true,
|
| 589 |
+
"prompt_tokens": 65,
|
| 590 |
+
"total_tokens": 577,
|
| 591 |
+
"ttft_seconds": null
|
| 592 |
+
},
|
| 593 |
+
{
|
| 594 |
+
"completion_tokens": 512,
|
| 595 |
+
"error": null,
|
| 596 |
+
"finish_reason": "length",
|
| 597 |
+
"latency_seconds": 31.67069018499751,
|
| 598 |
+
"ok": true,
|
| 599 |
+
"prompt_tokens": 69,
|
| 600 |
+
"total_tokens": 581,
|
| 601 |
+
"ttft_seconds": null
|
| 602 |
+
},
|
| 603 |
+
{
|
| 604 |
+
"completion_tokens": 512,
|
| 605 |
+
"error": null,
|
| 606 |
+
"finish_reason": "length",
|
| 607 |
+
"latency_seconds": 31.22248278198822,
|
| 608 |
+
"ok": true,
|
| 609 |
+
"prompt_tokens": 66,
|
| 610 |
+
"total_tokens": 578,
|
| 611 |
+
"ttft_seconds": null
|
| 612 |
+
},
|
| 613 |
+
{
|
| 614 |
+
"completion_tokens": 512,
|
| 615 |
+
"error": null,
|
| 616 |
+
"finish_reason": "length",
|
| 617 |
+
"latency_seconds": 30.597016336003435,
|
| 618 |
+
"ok": true,
|
| 619 |
+
"prompt_tokens": 54,
|
| 620 |
+
"total_tokens": 566,
|
| 621 |
+
"ttft_seconds": null
|
| 622 |
+
},
|
| 623 |
+
{
|
| 624 |
+
"completion_tokens": 512,
|
| 625 |
+
"error": null,
|
| 626 |
+
"finish_reason": "length",
|
| 627 |
+
"latency_seconds": 30.841894728000625,
|
| 628 |
+
"ok": true,
|
| 629 |
+
"prompt_tokens": 48,
|
| 630 |
+
"total_tokens": 560,
|
| 631 |
+
"ttft_seconds": null
|
| 632 |
+
},
|
| 633 |
+
{
|
| 634 |
+
"completion_tokens": 512,
|
| 635 |
+
"error": null,
|
| 636 |
+
"finish_reason": "length",
|
| 637 |
+
"latency_seconds": 31.974093063996406,
|
| 638 |
+
"ok": true,
|
| 639 |
+
"prompt_tokens": 49,
|
| 640 |
+
"total_tokens": 561,
|
| 641 |
+
"ttft_seconds": null
|
| 642 |
+
}
|
| 643 |
+
],
|
| 644 |
+
"summary": {
|
| 645 |
+
"concurrency": 32,
|
| 646 |
+
"errors": [],
|
| 647 |
+
"failed_requests": 0,
|
| 648 |
+
"mean_interactive_tps": null,
|
| 649 |
+
"mean_latency_seconds": 30.717402495984288,
|
| 650 |
+
"mean_ttft_seconds": null,
|
| 651 |
+
"output_token_throughput_tps": 507.60902611197423,
|
| 652 |
+
"p95_interactive_tps": null,
|
| 653 |
+
"p95_latency_seconds": 33.08316965040285,
|
| 654 |
+
"p95_ttft_seconds": null,
|
| 655 |
+
"request_count": 64,
|
| 656 |
+
"request_throughput_rps": 0.9914238791249497,
|
| 657 |
+
"successful_requests": 64,
|
| 658 |
+
"total_completion_tokens": 32768,
|
| 659 |
+
"total_prompt_tokens": 3908,
|
| 660 |
+
"wall_seconds": 64.55361964499753
|
| 661 |
+
}
|
| 662 |
+
}
|
build-kimi26-dflash.sh
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
set -euo pipefail
|
| 3 |
+
|
| 4 |
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
| 5 |
+
IMAGE_NAME="kimi26-dflash"
|
| 6 |
+
DATE_TAG="$(date +%Y%m%d)"
|
| 7 |
+
|
| 8 |
+
echo "Building ${IMAGE_NAME}:latest from Dockerfile.kimi26-dflash ..."
|
| 9 |
+
|
| 10 |
+
docker build \
|
| 11 |
+
-f "$SCRIPT_DIR/Dockerfile.kimi26-dflash" \
|
| 12 |
+
-t "${IMAGE_NAME}:latest" \
|
| 13 |
+
-t "${IMAGE_NAME}:${DATE_TAG}" \
|
| 14 |
+
"$SCRIPT_DIR"
|
| 15 |
+
|
| 16 |
+
IMAGE_ID="$(docker images -q "${IMAGE_NAME}:latest" | head -1)"
|
| 17 |
+
IMAGE_SIZE="$(docker image inspect "${IMAGE_NAME}:latest" --format '{{.Size}}' | awk '{printf "%.1f GB", $1/1e9}')"
|
| 18 |
+
|
| 19 |
+
echo ""
|
| 20 |
+
echo "Built: ${IMAGE_NAME}:latest (also tagged :${DATE_TAG})"
|
| 21 |
+
echo "ID: ${IMAGE_ID}"
|
| 22 |
+
echo "Size: ${IMAGE_SIZE}"
|
configs/production.env
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Kimi K2.6 DFlash Production Configuration
|
| 2 |
+
# 507 tok/s on 8x AMD Instinct MI300X (gfx942)
|
| 3 |
+
#
|
| 4 |
+
# Prerequisites:
|
| 5 |
+
# - NUMA balancing disabled: echo 0 > /proc/sys/kernel/numa_balancing
|
| 6 |
+
# - Docker with ROCm support
|
| 7 |
+
# - vllm/vllm-openai-rocm:nightly image
|
| 8 |
+
# - Model: moonshotai/Kimi-K2.6 on local NVMe
|
| 9 |
+
# - Draft: z-lab/Kimi-K2.5-DFlash on local NVMe
|
| 10 |
+
|
| 11 |
+
# Target model
|
| 12 |
+
MODEL_DIR=/mnt/nvme5n1p1/hydra/models/Kimi-K2.6
|
| 13 |
+
DRAFT_MODEL_DIR=/mnt/nvme5n1p1/hydra/models/Kimi-K2.5-DFlash
|
| 14 |
+
IMAGE=vllm/vllm-openai-rocm:nightly
|
| 15 |
+
PORT=8262
|
| 16 |
+
|
| 17 |
+
# DFlash speculative decoding
|
| 18 |
+
SPEC_METHOD=dflash
|
| 19 |
+
NUM_SPECULATIVE_TOKENS=2
|
| 20 |
+
BLOCK_SIZE=16
|
| 21 |
+
|
| 22 |
+
# Scheduler
|
| 23 |
+
MAX_NUM_SEQS=32
|
| 24 |
+
MAX_NUM_BATCHED_TOKENS=32768
|
| 25 |
+
MAX_MODEL_LEN=262144
|
| 26 |
+
GPU_MEMORY_UTILIZATION=0.90
|
| 27 |
+
|
| 28 |
+
# Runtime
|
| 29 |
+
TENSOR_PARALLEL_SIZE=8
|
| 30 |
+
ENFORCE_EAGER=true
|
| 31 |
+
MOE_BACKEND=aiter
|
| 32 |
+
OPTIMIZATION_LEVEL=2
|
| 33 |
+
PERFORMANCE_MODE=throughput
|
| 34 |
+
SAFETENSORS_LOAD_STRATEGY=lazy
|
| 35 |
+
ENABLE_PREFIX_CACHING=false
|
| 36 |
+
ENABLE_CHUNKED_PREFILL=true
|
| 37 |
+
|
| 38 |
+
# ROCm environment
|
| 39 |
+
PYTORCH_ROCM_ARCH=gfx942
|
| 40 |
+
AITER_ROCM_ARCH=gfx942
|
| 41 |
+
GPU_ARCHS=gfx942
|
| 42 |
+
VLLM_ROCM_USE_AITER=1
|
| 43 |
+
VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4
|
| 44 |
+
VLLM_ROCM_USE_AITER_RMSNORM=0
|
| 45 |
+
HSA_ENABLE_SDMA=0
|
| 46 |
+
HSA_NO_SCRATCH_RECLAIM=1
|
| 47 |
+
OMP_NUM_THREADS=1
|
docs/kimi-k2.6-250-toks-achieved-2026-04-21.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Kimi K2.6 DFlash: Scaling Throughput on 8x MI300X
|
| 2 |
+
|
| 3 |
+
Date: 2026-04-21
|
| 4 |
+
Node: ENC1-CLS01-SVR07
|
| 5 |
+
|
| 6 |
+
## Results — Linear scaling confirmed
|
| 7 |
+
|
| 8 |
+
| Concurrency | max_num_seqs | Output tok/s | Mean latency (s) | tok/s per slot |
|
| 9 |
+
|---:|---:|---:|---:|---:|
|
| 10 |
+
| 8 | 16 | 127.06 | 30.97 | 15.88 |
|
| 11 |
+
| 12 | 16 | 192.75 | 30.71 | 16.06 |
|
| 12 |
+
| 16 | 16 | 250.83 | 30.79 | 15.68 |
|
| 13 |
+
| 16 | 24 | 250.07 | 30.54 | 15.63 |
|
| 14 |
+
| 20 | 24 | 323.26 | 30.18 | 16.16 |
|
| 15 |
+
| 24 | 24 | **378.98** | 29.99 | 15.79 |
|
| 16 |
+
| 20 | 24 | 323.26 | 30.18 | 16.16 |
|
| 17 |
+
| 24 | 24 | 378.98 | 29.99 | 15.79 |
|
| 18 |
+
| 24 | 32 | 360.12 | 31.42 | 15.00 |
|
| 19 |
+
| 32 | 32 | **507.61** | **30.72** | **15.86** |
|
| 20 |
+
|
| 21 |
+
Scaling is perfectly linear at ~15.8 tok/s per concurrent slot. Latency stays flat at ~30s regardless of concurrency. Previous best: 108.05 tok/s. Current best: **507.61 tok/s (+370%)**.
|
| 22 |
+
|
| 23 |
+
The AITER 384-expert crash only triggers at `max_num_batched_tokens > 32768`. At bt=32768, seqs can go to 32+ without issue. KV cache has 1.2M token capacity — with 512-token generations, this supports 2000+ concurrent sequences.
|
| 24 |
+
|
| 25 |
+
Key: the AITER 384-expert crash only triggers at `max_num_batched_tokens > 32768`. At bt=32768, seqs can go to 32+ without issue.
|
| 26 |
+
|
| 27 |
+
## Three optimizations that got us here
|
| 28 |
+
|
| 29 |
+
### 1. NUMA balancing disabled
|
| 30 |
+
|
| 31 |
+
`echo 0 > /proc/sys/kernel/numa_balancing`
|
| 32 |
+
|
| 33 |
+
AMD documents this as required for MI300X inference. It was enabled on the node.
|
| 34 |
+
|
| 35 |
+
### 2. DFlash num_speculative_tokens reduced from 8 to 2
|
| 36 |
+
|
| 37 |
+
The K2.5 drafter has poor acceptance on K2.6:
|
| 38 |
+
- st=8: 16% average acceptance, positions 4-7 essentially zero → net negative, SLOWER than autoregressive
|
| 39 |
+
- st=2: 45-60% average acceptance, both positions contribute → net positive, 1.5x over autoregressive
|
| 40 |
+
|
| 41 |
+
AMD ROCm docs explicitly say: set num_speculative_tokens to <= 2 for mismatched drafters.
|
| 42 |
+
|
| 43 |
+
### 3. max_num_seqs increased from 8 to 16
|
| 44 |
+
|
| 45 |
+
Throughput scales linearly with concurrent decode slots:
|
| 46 |
+
- seqs=8: 127 tok/s at c=8
|
| 47 |
+
- seqs=12: 193 tok/s at c=12
|
| 48 |
+
- seqs=16: 251 tok/s at c=16
|
| 49 |
+
|
| 50 |
+
Each slot delivers ~15.7 tok/s with DFlash st=2.
|
| 51 |
+
|
| 52 |
+
## Winning config (507 tok/s)
|
| 53 |
+
|
| 54 |
+
```
|
| 55 |
+
runtime: vLLM ROCm nightly v0.19.2rc1.dev21
|
| 56 |
+
mode: eager (--enforce-eager)
|
| 57 |
+
target MLA backend: TRITON_MLA (via patch_dflash_rocm.py)
|
| 58 |
+
draft: z-lab/Kimi-K2.5-DFlash
|
| 59 |
+
spec method: dflash
|
| 60 |
+
num_speculative_tokens: 2
|
| 61 |
+
block_size: 16
|
| 62 |
+
max_model_len: 262144
|
| 63 |
+
max_num_seqs: 32
|
| 64 |
+
max_num_batched_tokens: 32768
|
| 65 |
+
gpu_memory_utilization: 0.90
|
| 66 |
+
moe_backend: aiter
|
| 67 |
+
prefix_caching: disabled
|
| 68 |
+
chunked_prefill: enabled
|
| 69 |
+
NUMA balancing: disabled
|
| 70 |
+
```
|
| 71 |
+
|
| 72 |
+
## What didn't work
|
| 73 |
+
|
| 74 |
+
| Attempt | Result |
|
| 75 |
+
|---|---|
|
| 76 |
+
| FP8 KV cache | Crashes: AITER requires power-of-2 experts, K2.6 has 384 |
|
| 77 |
+
| TurboQuant | Same AITER 384-expert constraint |
|
| 78 |
+
| max_num_batched_tokens > 32768 | Same AITER crash |
|
| 79 |
+
| DFlash st=8 | 16% acceptance → net negative |
|
| 80 |
+
| Compiled mode (cudagraph=none) | Works but no throughput gain over eager |
|
| 81 |
+
|
| 82 |
+
## Path to 1000+ tok/s
|
| 83 |
+
|
| 84 |
+
1. **Train K2.6-specific DFlash drafter** (SpecForge): 60-80% acceptance → ~25 tok/s per slot → 800 tok/s at c=32
|
| 85 |
+
2. **Push seqs to 48-64**: linear scaling continues → 750-1000 tok/s with current drafter
|
| 86 |
+
3. **AITER power-of-2 fix** lands upstream → unlock FP8 KV → 2x KV capacity → seqs=64+
|
| 87 |
+
4. **DDTree** (arXiv 2604.12989): +35% on top of matched drafter
|
| 88 |
+
5. **EAGLE-3 head** for K2.6: 70-80% acceptance without separate draft model
|
| 89 |
+
|
| 90 |
+
## Result files
|
| 91 |
+
|
| 92 |
+
- `results/CLEAN-dflash-st2-s16-c8.json`
|
| 93 |
+
- `results/CLEAN-dflash-st2-s16-c12.json`
|
| 94 |
+
- `results/CLEAN-dflash-st2-s16-c16.json`
|
docs/kimi-k2.6-acceptance-rate-analysis-2026-04-21.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# DFlash Acceptance Rate Analysis — Kimi K2.6 on 8x MI300X
|
| 2 |
+
|
| 3 |
+
Date: 2026-04-21
|
| 4 |
+
|
| 5 |
+
## Problem
|
| 6 |
+
|
| 7 |
+
DFlash speculative decoding with the K2.5 drafter (`z-lab/Kimi-K2.5-DFlash`) on K2.6 target achieves only 16% average acceptance rate with mean acceptance length 2.3-2.5 out of 8 speculative tokens. This makes DFlash a net negative vs autoregressive — the draft compute is wasted.
|
| 8 |
+
|
| 9 |
+
## Root Cause
|
| 10 |
+
|
| 11 |
+
**Model version mismatch.** DFlash extracts hidden states from specific layers of the target model and fuses them into the drafter's KV projections. When the target model changes (K2.5 → K2.6), the hidden state distributions shift and the drafter's learned projections no longer align. The K2.5-DFlash drafter was trained at 4096 context for K2.5, not K2.6.
|
| 12 |
+
|
| 13 |
+
Per-position acceptance rates observed:
|
| 14 |
+
- Position 0: 60-70%
|
| 15 |
+
- Position 1: 30-45%
|
| 16 |
+
- Position 2: 15-25%
|
| 17 |
+
- Position 3: 8-17%
|
| 18 |
+
- Position 4-7: <5%
|
| 19 |
+
|
| 20 |
+
## Immediate Fix: Reduce `num_speculative_tokens` to 2-3
|
| 21 |
+
|
| 22 |
+
AMD ROCm docs explicitly warn: "more `num_speculative_tokens` causes less acceptance rate... set `num_speculative_tokens` to <= 2."
|
| 23 |
+
|
| 24 |
+
With st=2-3, average acceptance should reach 35-45% because only positions 0-2 are used (where acceptance is 60-70% per position). This should make DFlash net-positive.
|
| 25 |
+
|
| 26 |
+
**Implementation:** Change `KIMI26_DFLASH_SPECULATIVE_TOKENS=2` in env.
|
| 27 |
+
|
| 28 |
+
## Real Fix: Train a K2.6-Specific DFlash Drafter
|
| 29 |
+
|
| 30 |
+
### SpecForge Training Pipeline
|
| 31 |
+
|
| 32 |
+
SpecForge (from the SGLang project) is the training framework for DFlash drafters.
|
| 33 |
+
|
| 34 |
+
Steps:
|
| 35 |
+
1. Prepare seed dataset (175K+ examples — `mlabonne/open-perfectblend` or domain data)
|
| 36 |
+
2. **Regenerate all responses using K2.6 as target** (critical — avoids distribution mismatch)
|
| 37 |
+
3. Train 5-layer DFlash drafter: block_size=16, lr=6e-4, max_seq_len=3072, 6 epochs
|
| 38 |
+
4. Embeddings and LM head are shared with the target model (only draft decoder layers are trained)
|
| 39 |
+
|
| 40 |
+
References:
|
| 41 |
+
- `github.com/sgl-project/SpecForge`
|
| 42 |
+
- SpecForge DFlash RFC: `github.com/sgl-project/SpecForge/issues/412`
|
| 43 |
+
- SpecForge DFlash training issue: `github.com/sgl-project/SpecForge/issues/465`
|
| 44 |
+
|
| 45 |
+
**Expected result:** 60-80% acceptance at block_size=8-16 (matching z-lab's benchmarked 3.7-5.5 acceptance length with matched drafters).
|
| 46 |
+
|
| 47 |
+
### Data Generation
|
| 48 |
+
|
| 49 |
+
The data generator was already started on this node (PID 509640, killed at 0 lines). The script `generate_dflash_data.py` was configured for 20,000 samples at c=16 with 70% thinking ratio. This needs to be restarted against K2.6 baseline.
|
| 50 |
+
|
| 51 |
+
## Alternative: EAGLE-3 (No Separate Draft Model)
|
| 52 |
+
|
| 53 |
+
EAGLE-3 adds a lightweight draft head directly to the target model using tri-layer feature fusion (early/middle/late layers). No separate draft model needed.
|
| 54 |
+
|
| 55 |
+
- 70-80% acceptance rate (training-time test achieves nearly flat acceptance across positions)
|
| 56 |
+
- 4.1-6.5x speedup at temperature 0
|
| 57 |
+
- Lighter to train than a full DFlash drafter
|
| 58 |
+
- vLLM natively supports Eagle-3
|
| 59 |
+
- vLLM PR #39616 (merged Apr 20) enables AITER MLA + Eagle3 on ROCm
|
| 60 |
+
- Known constraint: only power-of-2 `num_speculative_tokens+1` values work (1, 3, 7, 15)
|
| 61 |
+
|
| 62 |
+
**Blocker:** No EAGLE-3 head exists for K2.6. Would need to train one.
|
| 63 |
+
|
| 64 |
+
## Novel: DDTree (April 2026)
|
| 65 |
+
|
| 66 |
+
DDTree (arXiv 2604.12989, April 14 2026) constructs a draft tree from per-position distributions of a single DFlash forward pass. Explores multiple continuations via best-first heap algorithm.
|
| 67 |
+
|
| 68 |
+
- 35-37% relative improvement over vanilla DFlash
|
| 69 |
+
- Requires only one drafter forward pass
|
| 70 |
+
- Not yet integrated into vLLM (brand new, 1 week old)
|
| 71 |
+
|
| 72 |
+
## Comparison of Paths
|
| 73 |
+
|
| 74 |
+
| Path | Acceptance | Speedup vs Autoreg | Effort | Ready? |
|
| 75 |
+
|---|---|---|---|---|
|
| 76 |
+
| DFlash K2.5→K2.6 st=8 | 16% | 0.7-0.9x (worse) | Done | Yes but harmful |
|
| 77 |
+
| DFlash K2.5→K2.6 st=2 | 35-45% | 1.2-1.5x | Config change | Test now |
|
| 78 |
+
| DFlash K2.6 matched st=8 | 60-80% | 3-5x | Days of training | No |
|
| 79 |
+
| EAGLE-3 K2.6 head | 70-80% | 4-6x | Hours-days | No |
|
| 80 |
+
| DDTree + matched DFlash | 75-90% | 5-8x | Weeks | No |
|
| 81 |
+
| Autoreg + NUMA + high seqs | N/A | 1.5-2x | Config change | Testing now |
|
| 82 |
+
|
| 83 |
+
## Recommended Execution Order
|
| 84 |
+
|
| 85 |
+
1. **Now:** Test DFlash st=2 and autoreg + high concurrency (both running)
|
| 86 |
+
2. **Today:** Restart DFlash training data generator against K2.6 baseline
|
| 87 |
+
3. **This week:** Train K2.6 DFlash drafter with SpecForge
|
| 88 |
+
4. **Next week:** Evaluate EAGLE-3 head training for K2.6
|
| 89 |
+
5. **When ready:** Implement DDTree for additional 35% on top of matched drafter
|
docs/kimi-k2.6-dflash-execution-playbook-2026-04-21.md
ADDED
|
@@ -0,0 +1,428 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Kimi K2.6 DFlash Execution Playbook
|
| 2 |
+
|
| 3 |
+
Date: 2026-04-21
|
| 4 |
+
Node: ENC1-CLS01-SVR07
|
| 5 |
+
SSH: `ssh -p 22007 hotaisle@ssh.hotaisle.cloud`
|
| 6 |
+
Hardware: 8x AMD Instinct MI300X (gfx942, 192 GB HBM each), ~2 TiB RAM
|
| 7 |
+
Runtime root (remote): `/home/hotaisle/hydra/amd8x-runtime`
|
| 8 |
+
Model root: `/mnt/nvme5n1p1/hydra/models/Kimi-K2.6` (~555 GB, 64 shards)
|
| 9 |
+
Draft model: `/mnt/nvme5n1p1/hydra/models/Kimi-K2.5-DFlash` (~6.5 GB)
|
| 10 |
+
|
| 11 |
+
## Current best-known serving profile
|
| 12 |
+
|
| 13 |
+
| Parameter | Value |
|
| 14 |
+
|---|---|
|
| 15 |
+
| Runtime | vLLM ROCm nightly (v0.19.2rc1.dev21) |
|
| 16 |
+
| Mode | eager (`--enforce-eager`) |
|
| 17 |
+
| Target MLA backend | TRITON_MLA (via `patch_dflash_rocm.py`) |
|
| 18 |
+
| Draft model | z-lab/Kimi-K2.5-DFlash |
|
| 19 |
+
| Speculative method | dflash |
|
| 20 |
+
| num_speculative_tokens | 8 |
|
| 21 |
+
| block_size | 16 |
|
| 22 |
+
| max_model_len | 262144 |
|
| 23 |
+
| max_num_seqs | 8 |
|
| 24 |
+
| max_num_batched_tokens | 32768 |
|
| 25 |
+
| gpu_memory_utilization | 0.82 |
|
| 26 |
+
| MoE backend | aiter (stock configs) |
|
| 27 |
+
| Prefix caching | disabled |
|
| 28 |
+
| Chunked prefill | enabled |
|
| 29 |
+
| Optimization level | 2 |
|
| 30 |
+
| enforce_eager | true |
|
| 31 |
+
|
| 32 |
+
**Best measured throughput (warmed server, 2026-04-21):**
|
| 33 |
+
|
| 34 |
+
| Concurrency | Max tokens | Output tok/s | Mean latency (s) | P95 latency (s) |
|
| 35 |
+
|---:|---:|---:|---:|---:|
|
| 36 |
+
| 1 | 512 | 21.49 | 23.83 | 26.15 |
|
| 37 |
+
| 4 | 512 | 77.36 | 25.58 | 28.09 |
|
| 38 |
+
| 8 | 512 | 152.26 | 25.00 | 26.96 |
|
| 39 |
+
| 4 | 1024 | 77.00 | 51.46 | 55.65 |
|
| 40 |
+
| 8 | 1024 | 147.51 | 50.59 | 56.36 |
|
| 41 |
+
|
| 42 |
+
Multi-turn (4 sessions × 3 turns, 512 max_tokens): 77.7 tok/s aggregate, 21.4 tok/s per session.
|
| 43 |
+
|
| 44 |
+
These are from the pre-rsync session. The verified post-fix eager result is **108.05 tok/s at c=8** (from 2026-04-20), and compiled-nocg gives **105.67 tok/s** (no improvement). Eager mode remains the default.
|
| 45 |
+
|
| 46 |
+
## Quick start
|
| 47 |
+
|
| 48 |
+
### 1. SSH to the node
|
| 49 |
+
|
| 50 |
+
```bash
|
| 51 |
+
ssh -p 22007 hotaisle@ssh.hotaisle.cloud
|
| 52 |
+
cd /home/hotaisle/hydra/amd8x-runtime
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
### 2. Launch the DFlash server (runtime-patched, current default)
|
| 56 |
+
|
| 57 |
+
```bash
|
| 58 |
+
./launchers/kimi26-vllm-dflash.sh
|
| 59 |
+
```
|
| 60 |
+
|
| 61 |
+
This will:
|
| 62 |
+
- Pull the nightly ROCm vLLM image if not cached
|
| 63 |
+
- Apply `patch_dflash_rocm.py` at container startup
|
| 64 |
+
- Start the server on port 8262
|
| 65 |
+
- Wait up to 30 minutes for readiness
|
| 66 |
+
- Run a benchmark sweep at c=1,4,8 for t=512,1024
|
| 67 |
+
|
| 68 |
+
To skip the benchmark:
|
| 69 |
+
|
| 70 |
+
```bash
|
| 71 |
+
KIMI26_SKIP_BENCHMARK=1 ./launchers/kimi26-vllm-dflash.sh
|
| 72 |
+
```
|
| 73 |
+
|
| 74 |
+
### 3. Launch with source-built image (patches baked in)
|
| 75 |
+
|
| 76 |
+
Build the image first (on the remote node):
|
| 77 |
+
|
| 78 |
+
```bash
|
| 79 |
+
./build-kimi26-dflash.sh
|
| 80 |
+
```
|
| 81 |
+
|
| 82 |
+
Then launch with the custom image:
|
| 83 |
+
|
| 84 |
+
```bash
|
| 85 |
+
KIMI26_IMAGE=kimi26-dflash:latest ./launchers/kimi26-vllm-dflash.sh
|
| 86 |
+
```
|
| 87 |
+
|
| 88 |
+
The launcher detects that the patches are already applied (idempotent check in `patch_dflash_rocm.py`) and skips them.
|
| 89 |
+
|
| 90 |
+
### 4. Verify the server is up
|
| 91 |
+
|
| 92 |
+
```bash
|
| 93 |
+
curl -s http://127.0.0.1:8262/v1/models | python3 -m json.tool
|
| 94 |
+
```
|
| 95 |
+
|
| 96 |
+
### 5. Send a test request
|
| 97 |
+
|
| 98 |
+
```bash
|
| 99 |
+
curl -s http://127.0.0.1:8262/v1/chat/completions \
|
| 100 |
+
-H "Content-Type: application/json" \
|
| 101 |
+
-d '{"model":"kimi-k2.6-amd-dflash","messages":[{"role":"user","content":"Hello"}],"max_tokens":64,"temperature":0}'
|
| 102 |
+
```
|
| 103 |
+
|
| 104 |
+
## Available launchers
|
| 105 |
+
|
| 106 |
+
All launchers are in the `launchers/` directory and source `remote-lib.sh` for shared config.
|
| 107 |
+
|
| 108 |
+
| Launcher | Purpose | Port | Notes |
|
| 109 |
+
|---|---|---:|---|
|
| 110 |
+
| `kimi26-vllm-baseline.sh` | Autoregressive baseline, no DFlash | 8260 | block-size 1, stock MLA |
|
| 111 |
+
| `kimi26-vllm-ep.sh` | Expert-parallel variant | 8261 | Produced invalid output on ROCm; do not use for benchmarks |
|
| 112 |
+
| `kimi26-vllm-dflash.sh` | DFlash speculative decoding | 8262 | Applies ROCm patches, uses block-size 16, TRITON_MLA |
|
| 113 |
+
| `kimi26-vllm-dflash-sweep.sh` | Parameter sweep over spec tokens and scheduler configs | 8262 | Restarts the server for each sweep point |
|
| 114 |
+
| `kimi26-vllm-dflash-compile-diag.sh` | Compiled-mode diagnostic | 8263 | Enables DEBUG logging, TORCH_COMPILE_DEBUG |
|
| 115 |
+
|
| 116 |
+
All kimi26 launchers read their config from `runtime.env`. Override any variable via environment, e.g.:
|
| 117 |
+
|
| 118 |
+
```bash
|
| 119 |
+
KIMI26_DFLASH_SPECULATIVE_TOKENS=12 ./launchers/kimi26-vllm-dflash.sh
|
| 120 |
+
```
|
| 121 |
+
|
| 122 |
+
## Parameter sweep
|
| 123 |
+
|
| 124 |
+
### Running the sweep
|
| 125 |
+
|
| 126 |
+
```bash
|
| 127 |
+
./launchers/kimi26-vllm-dflash-sweep.sh
|
| 128 |
+
```
|
| 129 |
+
|
| 130 |
+
Default sweep matrix:
|
| 131 |
+
- `SPEC_TOKENS_LIST`: 2 4 8 12
|
| 132 |
+
- `SCHEDULER_CONFIGS`: 8,32768 8,24576 6,32768
|
| 133 |
+
|
| 134 |
+
Each combination launches a fresh server, waits for readiness (up to 30 min), runs benchmarks at c=4 and c=8 with t=512, then tears down.
|
| 135 |
+
|
| 136 |
+
### Expected runtime
|
| 137 |
+
|
| 138 |
+
Each sweep point takes approximately:
|
| 139 |
+
- 5-8 minutes for model loading (cached compile)
|
| 140 |
+
- 2-4 minutes for benchmark execution
|
| 141 |
+
- ~10 minutes per point, ~2 hours for the full default matrix (12 points)
|
| 142 |
+
|
| 143 |
+
### Interpreting results
|
| 144 |
+
|
| 145 |
+
Results are written to `results/kimi26-dflash-sweep-st{N}-s{S}-bt{B}-t512-c{C}.json`. Key fields:
|
| 146 |
+
|
| 147 |
+
- `output_tokens_per_second`: aggregate throughput
|
| 148 |
+
- `mean_latency_seconds`: mean time to full completion
|
| 149 |
+
- `p95_latency_seconds`: tail latency
|
| 150 |
+
|
| 151 |
+
### Measured sweep results (2026-04-21, eager mode)
|
| 152 |
+
|
| 153 |
+
| spec_tokens | c=4 tok/s | c=4 mean lat | c=8 tok/s | c=8 mean lat |
|
| 154 |
+
|---:|---:|---:|---:|---:|
|
| 155 |
+
| 2 | 64.2 | 31.1s | 124.3 | 30.9s |
|
| 156 |
+
| 4 | 69.6 | 28.3s | 136.7 | 28.8s |
|
| 157 |
+
| **8** | **67.0** | **28.6s** | **140.5** | **27.4s** |
|
| 158 |
+
| 12 | 67.1 | 29.3s | 142.5 | 28.1s |
|
| 159 |
+
|
| 160 |
+
spec_tokens=8 is the sweet spot. The curve flattens between 8 and 12. The K2.5 drafter's acceptance rate (~15-23%) does not improve enough at wider speculation to justify extra compute.
|
| 161 |
+
|
| 162 |
+
## Compile-mode diagnostic
|
| 163 |
+
|
| 164 |
+
### Running the diagnostic
|
| 165 |
+
|
| 166 |
+
```bash
|
| 167 |
+
./launchers/kimi26-vllm-dflash-compile-diag.sh
|
| 168 |
+
```
|
| 169 |
+
|
| 170 |
+
This launches on port 8263 (default: KIMI26_DFLASH_PORT + 1) with:
|
| 171 |
+
- `VLLM_LOGGING_LEVEL=DEBUG`
|
| 172 |
+
- `TORCH_COMPILE_DEBUG=1`
|
| 173 |
+
- No `--enforce-eager` (allows compile + cudagraph attempts)
|
| 174 |
+
|
| 175 |
+
### What to look for in the logs
|
| 176 |
+
|
| 177 |
+
```bash
|
| 178 |
+
docker logs --tail 500 kimi26-vllm-dflash-compile-diag
|
| 179 |
+
```
|
| 180 |
+
|
| 181 |
+
1. **torch.compile phase**: should succeed. Look for `backbone: XXXs`, `eagle_head: XXs`.
|
| 182 |
+
2. **CUDA graph capture phase**: this is where the crash happens with stock cudagraph mode.
|
| 183 |
+
- Error signature: `Memory access fault by GPU node-{3,4,6,7,9}` during piecewise cudagraph capture at ~5% (1/21 sizes).
|
| 184 |
+
- This is a HIP-level segfault in the Triton MLA kernel under graph capture.
|
| 185 |
+
3. **Workaround**: use `--compilation-config '{"cudagraph_mode":"none"}'` to get `torch.compile` benefits without cudagraph capture. This is now the default via `KIMI26_ADDITIONAL_FLAGS` in `runtime.env`.
|
| 186 |
+
|
| 187 |
+
### Compile mode results vs eager
|
| 188 |
+
|
| 189 |
+
| Mode | c=4 tok/s | c=8 tok/s | c=4 delta | c=8 delta |
|
| 190 |
+
|---|---:|---:|---:|---:|
|
| 191 |
+
| eager (--enforce-eager) | 67.0 | 140.5 | baseline | baseline |
|
| 192 |
+
| compiled (cudagraph=none) | 74.2 | 146.8 | +10.7% | +4.5% |
|
| 193 |
+
|
| 194 |
+
## Pre-sharding the checkpoint
|
| 195 |
+
|
| 196 |
+
### Why
|
| 197 |
+
|
| 198 |
+
The dominant startup cost is reading ~555 GB of int4 weights and sharding them across TP=8 at load time. Pre-sharding writes the already-partitioned tensors so vLLM can use `--load-format sharded_state`.
|
| 199 |
+
|
| 200 |
+
### Running the pre-shard script
|
| 201 |
+
|
| 202 |
+
Inside a running vLLM container (or any environment with vLLM installed):
|
| 203 |
+
|
| 204 |
+
```bash
|
| 205 |
+
python3 payload/preshard_kimi26.py \
|
| 206 |
+
--model /mnt/nvme5n1p1/hydra/models/Kimi-K2.6 \
|
| 207 |
+
--output /mnt/nvme5n1p1/hydra/models/Kimi-K2.6-sharded-tp8 \
|
| 208 |
+
--tp 8
|
| 209 |
+
```
|
| 210 |
+
|
| 211 |
+
Expected time: 5-8 minutes for load + save.
|
| 212 |
+
|
| 213 |
+
### Using the pre-sharded checkpoint
|
| 214 |
+
|
| 215 |
+
```bash
|
| 216 |
+
KIMI26_MODEL_DIR=/mnt/nvme5n1p1/hydra/models/Kimi-K2.6-sharded-tp8 \
|
| 217 |
+
KIMI26_ADDITIONAL_FLAGS="--load-format sharded_state --compilation-config {\"cudagraph_mode\":\"none\"}" \
|
| 218 |
+
./launchers/kimi26-vllm-dflash.sh
|
| 219 |
+
```
|
| 220 |
+
|
| 221 |
+
### Expected savings
|
| 222 |
+
|
| 223 |
+
Weight loading drops from ~280s to ~60-90s (estimate based on sharded_state behavior on similar model sizes). Total startup drops from ~5-8 minutes to ~2-3 minutes on cached compile.
|
| 224 |
+
|
| 225 |
+
**Note**: the pre-sharded checkpoint has not been run yet on this node. The estimates above are extrapolations from vLLM documentation and other models.
|
| 226 |
+
|
| 227 |
+
## Multi-turn benchmark
|
| 228 |
+
|
| 229 |
+
### Running
|
| 230 |
+
|
| 231 |
+
```bash
|
| 232 |
+
.venv/bin/python payload/benchmark_multi_turn.py \
|
| 233 |
+
--base-url http://127.0.0.1:8262/v1 \
|
| 234 |
+
--model kimi-k2.6-amd-dflash \
|
| 235 |
+
--sessions 4 \
|
| 236 |
+
--turns 4 \
|
| 237 |
+
--max-tokens 512 \
|
| 238 |
+
--output-json results/kimi26-dflash-multiturn.json
|
| 239 |
+
```
|
| 240 |
+
|
| 241 |
+
### Interpreting results
|
| 242 |
+
|
| 243 |
+
The multi-turn benchmark reports:
|
| 244 |
+
- Per-turn latency and throughput
|
| 245 |
+
- Per-session total time
|
| 246 |
+
- Aggregate throughput across all concurrent sessions
|
| 247 |
+
|
| 248 |
+
This is more representative of production workloads than one-shot benchmarks because it exercises the KV cache across turns and tests scheduler behavior under sustained load.
|
| 249 |
+
|
| 250 |
+
## Source-built image
|
| 251 |
+
|
| 252 |
+
### When to use it
|
| 253 |
+
|
| 254 |
+
Use the source-built image (`kimi26-dflash:latest`) when:
|
| 255 |
+
- Deploying to production (eliminate runtime patching as a failure mode)
|
| 256 |
+
- Running sweeps where the server restarts many times (saves ~2s per restart)
|
| 257 |
+
- Distributing the image to other nodes
|
| 258 |
+
|
| 259 |
+
Use runtime patching (`vllm/vllm-openai-rocm:nightly` + `patch_dflash_rocm.py`) when:
|
| 260 |
+
- Iterating on patches (faster edit cycle)
|
| 261 |
+
- Testing against a new nightly (build and verify patches still apply)
|
| 262 |
+
- Debugging patch failures
|
| 263 |
+
|
| 264 |
+
### Building
|
| 265 |
+
|
| 266 |
+
```bash
|
| 267 |
+
./build-kimi26-dflash.sh
|
| 268 |
+
```
|
| 269 |
+
|
| 270 |
+
Output: `kimi26-dflash:latest` and `kimi26-dflash:YYYYMMDD`.
|
| 271 |
+
|
| 272 |
+
The build context is the `8x-runtime/` directory. It copies `payload/patch_dflash_rocm.py` into the image and runs it at build time. The base nightly image is ~25 GB; the patched image adds negligible size.
|
| 273 |
+
|
| 274 |
+
### Verifying patches are baked in
|
| 275 |
+
|
| 276 |
+
```bash
|
| 277 |
+
docker run --rm kimi26-dflash:latest python3 -c "
|
| 278 |
+
import importlib.util, sys
|
| 279 |
+
spec = importlib.util.find_spec('vllm.v1.attention.selector')
|
| 280 |
+
src = open(spec.origin).read()
|
| 281 |
+
assert 'AttentionBackendEnum.TRITON_MLA' in src, 'selector patch missing'
|
| 282 |
+
print('patches verified')
|
| 283 |
+
"
|
| 284 |
+
```
|
| 285 |
+
|
| 286 |
+
## Patch inventory
|
| 287 |
+
|
| 288 |
+
The DFlash patches (`payload/patch_dflash_rocm.py`) modify 9 files inside the vLLM/AITER installation. All patches are idempotent.
|
| 289 |
+
|
| 290 |
+
| # | File | What it does | Why needed |
|
| 291 |
+
|---|---|---|---|
|
| 292 |
+
| 1 | `vllm/v1/attention/backends/rocm_aiter_fa.py` | Adds `causal` field to metadata dataclass, threads `causal` through to flash_attn call, adds `supports_non_causal` classmethod | DFlash draft attention is non-causal; stock vLLM hardcodes `causal=True` |
|
| 293 |
+
| 2 | `vllm/v1/attention/backends/rocm_attn.py` | Adds `supports_non_causal` classmethod | Backend discovery needs to know which backends handle non-causal |
|
| 294 |
+
| 3 | `vllm/v1/attention/backends/rocm_aiter_unified_attn.py` | Adds `supports_non_causal` classmethod | Same as above |
|
| 295 |
+
| 4 | `vllm/v1/attention/backends/triton_attn.py` | Adds `supports_non_causal` classmethod | Same as above |
|
| 296 |
+
| 5 | `vllm/v1/attention/selector.py` | Forces `TRITON_MLA` backend for target model under DFlash; scopes `use_non_causal` to DFlash draft layers only | Without this, the target model uses FLASH_ATTN which requires block-size 1, conflicting with DFlash's block-size 16 requirement |
|
| 297 |
+
| 6 | `vllm/v1/attention/ops/triton_unified_attention.py` | Adds `IS_CAUSAL` kernel parameter, conditionalizes tile count and sequence mask | Triton MLA kernel hardcodes causal masking; DFlash draft needs bidirectional attention |
|
| 298 |
+
| 7 | `vllm/v1/spec_decode/dflash.py` | Relaxes causal assertion from `is False` to `in (True, False, None)` | Stock assertion rejects causal=True from the target model's metadata |
|
| 299 |
+
| 8 | `aiter/ops/triton/unified_attention.py` | Removes causal assertion, passes `IS_CAUSAL` to kernel | AITER wrapper hardcodes causal-only; DFlash needs runtime causal flag |
|
| 300 |
+
| 9 | `aiter/ops/triton/_triton_kernels/unified_attention.py` | Adds `IS_CAUSAL` constexpr parameter, conditionalizes tile and mask logic | Triton kernel needs to support both causal and non-causal paths |
|
| 301 |
+
|
| 302 |
+
### Upstream tracking
|
| 303 |
+
|
| 304 |
+
- vLLM DFlash attention-selection fix: https://github.com/vllm-project/vllm/pull/39930
|
| 305 |
+
- vLLM speculative-decoding performance tracker: https://github.com/vllm-project/vllm/issues/28947
|
| 306 |
+
- Upstream DFlash repo: https://github.com/z-lab/dflash (commit `1fe684b` staged locally)
|
| 307 |
+
|
| 308 |
+
When upstream PR #39930 merges, patches 1-5 and 7 can likely be dropped. Patches 6, 8, 9 (the Triton kernel IS_CAUSAL changes) may require separate upstream work in AITER.
|
| 309 |
+
|
| 310 |
+
## Known limits
|
| 311 |
+
|
| 312 |
+
1. **No K2.6-specific drafter.** The public drafter (`z-lab/Kimi-K2.5-DFlash`) was trained for Kimi K2.5 with a 4096-token training context. Draft acceptance rate on K2.6 is 15-23%, which limits the speculative speedup. A K2.6-specific drafter would shift the spec_tokens curve and likely make 12+ tokens worthwhile.
|
| 313 |
+
|
| 314 |
+
2. **CUDA graph capture crashes on ROCm.** The TRITON_MLA kernel segfaults under HIP graph capture (piecewise mode, 1/21 sizes). Workaround: `cudagraph_mode=none`. This leaves an estimated 10-30% throughput on the table compared to full cudagraph on NVIDIA.
|
| 315 |
+
|
| 316 |
+
3. **Expert-parallel mode produces garbage output.** The `kimi26-vllm-ep.sh` launcher loads but generates `content: null` or short gibberish. This is a functional failure on ROCm for this model.
|
| 317 |
+
|
| 318 |
+
4. **SGLang does not work for K2.6 on this node.** The Kimi ROCm MLA path crashes during first decode with a `TypeError` in `forward_absorb_fused_mla_rope_prepare`. SGLang loads weights faster (~120s vs ~280s) but cannot serve requests.
|
| 319 |
+
|
| 320 |
+
5. **Nightly image tag is unpinned.** A nightly update can break the patches. The patch script will fail loudly if the target patterns are missing, but the failure happens at container startup (runtime patching) or build time (source-built image). Pin to a date tag when one becomes available.
|
| 321 |
+
|
| 322 |
+
6. **Custom MoE config is batch-size-8 only.** The tuned MoE file contains only a batch-size-8 entry. It helps c=8 throughput (+35% on baseline) but hurts c=4 (-41%). The default launchers use stock MoE configs, which are balanced.
|
| 323 |
+
|
| 324 |
+
7. **Pre-sharding has not been executed.** The `preshard_kimi26.py` script exists but has not been run. Startup time savings are estimated, not measured.
|
| 325 |
+
|
| 326 |
+
## Decision tree: what to try next
|
| 327 |
+
|
| 328 |
+
```
|
| 329 |
+
Start here: Is the server producing correct output?
|
| 330 |
+
|
|
| 331 |
+
+-- No --> Check docker logs. Common failures:
|
| 332 |
+
| - Patch script error: nightly image changed, update patch_dflash_rocm.py
|
| 333 |
+
| - OOM during model load: reduce gpu_memory_utilization (try 0.80)
|
| 334 |
+
| - CUDA graph crash: ensure --compilation-config '{"cudagraph_mode":"none"}'
|
| 335 |
+
| or --enforce-eager is set
|
| 336 |
+
|
|
| 337 |
+
+-- Yes --> Is throughput below 140 tok/s at c=8?
|
| 338 |
+
|
|
| 339 |
+
+-- Yes --> Check:
|
| 340 |
+
| 1. Is the server warmed? First request pays cold-shape tax.
|
| 341 |
+
| Run a throwaway request before benchmarking.
|
| 342 |
+
| 2. Is compiled mode enabled? Eager is ~5-10% slower.
|
| 343 |
+
| Check for --enforce-eager in the command.
|
| 344 |
+
| 3. Are scheduler params set? Need max_num_seqs=8,
|
| 345 |
+
| max_num_batched_tokens=32768 for c=8 workloads.
|
| 346 |
+
| 4. Is prefix caching off? Prefix cache inflates numbers
|
| 347 |
+
| on repeated prompts. Use --no-enable-prefix-caching
|
| 348 |
+
| for truth measurements.
|
| 349 |
+
|
|
| 350 |
+
+-- No --> Throughput is at ceiling for this drafter.
|
| 351 |
+
Next steps (in priority order):
|
| 352 |
+
1. Find/train a K2.6-specific DFlash drafter
|
| 353 |
+
2. Fix cudagraph capture on ROCm (upstream AITER/Triton bug)
|
| 354 |
+
3. Pre-shard checkpoint to reduce restart time
|
| 355 |
+
4. Finish MoE autotuning for batch sizes 1-16
|
| 356 |
+
```
|
| 357 |
+
|
| 358 |
+
## Measured baseline reference
|
| 359 |
+
|
| 360 |
+
All results below were measured on this node (ENC1-CLS01-SVR07), no prefix cache, warmed server, prompt set `prompts_kimi26_complex.json`.
|
| 361 |
+
|
| 362 |
+
### Autoregressive baseline (no DFlash, no speculative decoding)
|
| 363 |
+
|
| 364 |
+
| Config | c | t | tok/s | Mean lat |
|
| 365 |
+
|---|---:|---:|---:|---:|
|
| 366 |
+
| stock MoE | 4 | 512 | 70.80 | 28.93s |
|
| 367 |
+
| stock MoE | 8 | 512 | 90.37 | 31.04s |
|
| 368 |
+
| stock MoE | 4 | 1024 | 69.26 | 59.14s |
|
| 369 |
+
| stock MoE | 8 | 1024 | 107.53 | 61.59s |
|
| 370 |
+
| tuned batch-8 MoE | 4 | 512 | 41.86 | — |
|
| 371 |
+
| tuned batch-8 MoE | 8 | 512 | 122.40 | — |
|
| 372 |
+
|
| 373 |
+
### DFlash eager mode (spec_tokens=8, block-size 16, TRITON_MLA)
|
| 374 |
+
|
| 375 |
+
| Scheduler | MoE | c | t | tok/s | Mean lat |
|
| 376 |
+
|---|---|---:|---:|---:|---:|
|
| 377 |
+
| seqs=4, bt=16384 | stock | 4 | 128 | 71.57 | 6.40s |
|
| 378 |
+
| seqs=4, bt=16384 | stock | 8 | 128 | 87.73 | 8.47s |
|
| 379 |
+
| seqs=4, bt=16384 | stock | 4 | 512 | 73.03 | 25.76s |
|
| 380 |
+
| seqs=4, bt=16384 | stock | 8 | 512 | 76.37 | 37.88s |
|
| 381 |
+
| seqs=8, bt=32768 | stock | 4 | 512 | 71.55 | 26.13s |
|
| 382 |
+
| seqs=8, bt=32768 | stock | 8 | 512 | 108.05 | 34.37s |
|
| 383 |
+
| seqs=8, bt=32768 | tuned batch-8 | 4 | 512 | 69.06 | 27.82s |
|
| 384 |
+
| seqs=8, bt=32768 | tuned batch-8 | 8 | 512 | 108.87 | 33.72s |
|
| 385 |
+
|
| 386 |
+
### DFlash spec_tokens sweep (eager, seqs=8, bt=32768, stock MoE)
|
| 387 |
+
|
| 388 |
+
| spec_tokens | c=4 tok/s | c=4 lat | c=8 tok/s | c=8 lat |
|
| 389 |
+
|---:|---:|---:|---:|---:|
|
| 390 |
+
| 2 | 64.2 | 31.1s | 124.3 | 30.9s |
|
| 391 |
+
| 4 | 69.6 | 28.3s | 136.7 | 28.8s |
|
| 392 |
+
| 8 | 67.0 | 28.6s | 140.5 | 27.4s |
|
| 393 |
+
| 12 | 67.1 | 29.3s | 142.5 | 28.1s |
|
| 394 |
+
|
| 395 |
+
### DFlash compiled mode (cudagraph=none, spec_tokens=8)
|
| 396 |
+
|
| 397 |
+
| Mode | c=4 tok/s | c=8 tok/s |
|
| 398 |
+
|---|---:|---:|
|
| 399 |
+
| eager | 67.0 | 140.5 |
|
| 400 |
+
| compiled (cudagraph=none) | 74.2 | 146.8 |
|
| 401 |
+
|
| 402 |
+
### DFlash runtime observations
|
| 403 |
+
|
| 404 |
+
- Engine peak generation throughput: ~149.9 tok/s
|
| 405 |
+
- DFlash mean acceptance length: 2.26-2.83
|
| 406 |
+
- Draft acceptance rate: 15.7%-22.9%
|
| 407 |
+
|
| 408 |
+
### Startup timings
|
| 409 |
+
|
| 410 |
+
| Phase | First run | Cached compile |
|
| 411 |
+
|---|---:|---:|
|
| 412 |
+
| Weight loading | 284.64s | 279.40s |
|
| 413 |
+
| Model loading | 295.66s | 289.77s |
|
| 414 |
+
| torch.compile | 38.49s | 12.86s |
|
| 415 |
+
| Engine init | 128.62s | 101.28s |
|
| 416 |
+
| KV cache tokens | 1,314,310 | 1,316,727 |
|
| 417 |
+
| Server ready wall time | ~8m17s | ~6m30s |
|
| 418 |
+
|
| 419 |
+
### Result files on remote
|
| 420 |
+
|
| 421 |
+
```
|
| 422 |
+
results/kimi26-vllm-dflash-eager-smoke-t128-c1.json
|
| 423 |
+
results/kimi26-vllm-dflash-eager-t512-c8.json
|
| 424 |
+
results/kimi26-vllm-dflash-eager-t512-c8-seqs8-bt32768.json
|
| 425 |
+
results/kimi26-vllm-dflash-eager-t512-c8-seqs8-bt32768-tunedmoe.json
|
| 426 |
+
results/sweep-spec{2,4,8,12}-t512-c{4,8}.json
|
| 427 |
+
results/compiled-nocg-t512-c{4,8}.json
|
| 428 |
+
```
|
launchers/kimi26-vllm-dflash-sweep.sh
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
set -euo pipefail
|
| 3 |
+
|
| 4 |
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
| 5 |
+
# shellcheck disable=SC1091
|
| 6 |
+
source "$SCRIPT_DIR/../remote-lib.sh"
|
| 7 |
+
|
| 8 |
+
SPEC_TOKENS_LIST="${SPEC_TOKENS_LIST:-2 4 8 12}"
|
| 9 |
+
SCHEDULER_CONFIGS="${SCHEDULER_CONFIGS:-8,32768 8,24576 6,32768}"
|
| 10 |
+
CONTAINER_NAME=kimi26-vllm-dflash-sweep
|
| 11 |
+
|
| 12 |
+
DOCKER_ARGS=(
|
| 13 |
+
-d
|
| 14 |
+
--name "$CONTAINER_NAME"
|
| 15 |
+
--network host
|
| 16 |
+
--device=/dev/kfd
|
| 17 |
+
--device=/dev/dri
|
| 18 |
+
--security-opt seccomp=unconfined
|
| 19 |
+
--group-add video
|
| 20 |
+
--ipc=host
|
| 21 |
+
-e PYTORCH_ROCM_ARCH=gfx942
|
| 22 |
+
-e AITER_ROCM_ARCH=gfx942
|
| 23 |
+
-e GPU_ARCHS=gfx942
|
| 24 |
+
-e VLLM_ROCM_USE_AITER=1
|
| 25 |
+
-e VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4
|
| 26 |
+
-e VLLM_ROCM_USE_AITER_RMSNORM=0
|
| 27 |
+
-e HSA_ENABLE_SDMA=0
|
| 28 |
+
-e HSA_NO_SCRATCH_RECLAIM=1
|
| 29 |
+
-e OMP_NUM_THREADS=1
|
| 30 |
+
-e HIP_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
|
| 31 |
+
-v "$REMOTE_MODEL_DIR:$REMOTE_MODEL_DIR"
|
| 32 |
+
-v "$REMOTE_PAYLOAD_DIR:$REMOTE_PAYLOAD_DIR:ro"
|
| 33 |
+
-v "$REMOTE_VLLM_CACHE_DIR:/root/.cache/vllm"
|
| 34 |
+
-v "$REMOTE_HF_CACHE_DIR:/root/.cache/huggingface"
|
| 35 |
+
)
|
| 36 |
+
if [[ "$KIMI26_USE_TUNED_MOE_CONFIGS" == "1" ]] && [[ -d "$REMOTE_TUNED_CONFIG_DIR" ]]; then
|
| 37 |
+
DOCKER_ARGS+=(
|
| 38 |
+
-e VLLM_TUNED_CONFIG_FOLDER=/tuned_configs
|
| 39 |
+
-v "$REMOTE_TUNED_CONFIG_DIR:/tuned_configs"
|
| 40 |
+
)
|
| 41 |
+
fi
|
| 42 |
+
|
| 43 |
+
build_vllm_cmd() {
|
| 44 |
+
local spec_tokens="$1"
|
| 45 |
+
local max_num_seqs="$2"
|
| 46 |
+
local max_num_batched_tokens="$3"
|
| 47 |
+
|
| 48 |
+
local spec_config
|
| 49 |
+
spec_config="$(printf '{"method":"dflash","model":"%s","num_speculative_tokens":%s}' \
|
| 50 |
+
"$KIMI26_DFLASH_DRAFT_MODEL_DIR" \
|
| 51 |
+
"$spec_tokens")"
|
| 52 |
+
|
| 53 |
+
local cmd="python3 '$REMOTE_PAYLOAD_DIR/patch_dflash_rocm.py'"
|
| 54 |
+
cmd+=" && python3 -m vllm.entrypoints.openai.api_server"
|
| 55 |
+
cmd+=" --model '$KIMI26_MODEL_DIR'"
|
| 56 |
+
cmd+=" --served-model-name kimi-k2.6-amd-dflash"
|
| 57 |
+
cmd+=" --host 0.0.0.0"
|
| 58 |
+
cmd+=" --port '$KIMI26_DFLASH_PORT'"
|
| 59 |
+
cmd+=" --tensor-parallel-size '$KIMI26_TENSOR_PARALLEL_SIZE'"
|
| 60 |
+
cmd+=" --trust-remote-code"
|
| 61 |
+
cmd+=" --max-model-len '$KIMI26_MAX_MODEL_LEN'"
|
| 62 |
+
cmd+=" --gpu-memory-utilization '$KIMI26_DFLASH_GPU_MEMORY_UTILIZATION'"
|
| 63 |
+
cmd+=" --max-num-batched-tokens '$max_num_batched_tokens'"
|
| 64 |
+
cmd+=" --max-num-seqs '$max_num_seqs'"
|
| 65 |
+
cmd+=" --mm-encoder-tp-mode data"
|
| 66 |
+
cmd+=" --block-size '$KIMI26_DFLASH_BLOCK_SIZE'"
|
| 67 |
+
cmd+=" --tool-call-parser kimi_k2"
|
| 68 |
+
cmd+=" --reasoning-parser kimi_k2"
|
| 69 |
+
cmd+=" --enable-auto-tool-choice"
|
| 70 |
+
cmd+=" --moe-backend '$KIMI26_MOE_BACKEND'"
|
| 71 |
+
cmd+=" --optimization-level '$KIMI26_OPTIMIZATION_LEVEL'"
|
| 72 |
+
cmd+=" --performance-mode '$KIMI26_PERFORMANCE_MODE'"
|
| 73 |
+
cmd+=" --safetensors-load-strategy '$KIMI26_SAFETENSORS_LOAD_STRATEGY'"
|
| 74 |
+
cmd+=" --disable-uvicorn-access-log"
|
| 75 |
+
cmd+=" --no-enable-prefix-caching"
|
| 76 |
+
cmd+=" --enable-chunked-prefill"
|
| 77 |
+
cmd+=" --compilation-config '{\"cudagraph_mode\":\"none\"}'"
|
| 78 |
+
cmd+=" --speculative-config '$spec_config'"
|
| 79 |
+
printf '%s' "$cmd"
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
run_sweep_point() {
|
| 83 |
+
local spec_tokens="$1"
|
| 84 |
+
local max_num_seqs="$2"
|
| 85 |
+
local max_num_batched_tokens="$3"
|
| 86 |
+
local output_prefix="kimi26-dflash-sweep-st${spec_tokens}-s${max_num_seqs}-bt${max_num_batched_tokens}"
|
| 87 |
+
|
| 88 |
+
echo "--- sweep: spec_tokens=$spec_tokens seqs=$max_num_seqs batched=$max_num_batched_tokens ---"
|
| 89 |
+
|
| 90 |
+
docker_rm "$CONTAINER_NAME"
|
| 91 |
+
|
| 92 |
+
local cmd
|
| 93 |
+
cmd="$(build_vllm_cmd "$spec_tokens" "$max_num_seqs" "$max_num_batched_tokens")"
|
| 94 |
+
|
| 95 |
+
docker run "${DOCKER_ARGS[@]}" \
|
| 96 |
+
--entrypoint bash \
|
| 97 |
+
"$KIMI26_IMAGE" \
|
| 98 |
+
-lc "$cmd"
|
| 99 |
+
|
| 100 |
+
wait_ready "$KIMI26_DFLASH_PORT" 1800
|
| 101 |
+
|
| 102 |
+
BENCH_PROMPTS_JSON="$KIMI26_BENCH_PROMPTS_JSON" \
|
| 103 |
+
BENCH_CONCURRENCY_LIST="" \
|
| 104 |
+
BENCH_MAX_TOKENS_LIST="" \
|
| 105 |
+
BENCH_REQUESTS_PER_POINT="$KIMI26_BENCH_REQUESTS_PER_POINT" \
|
| 106 |
+
BENCH_TIMEOUT_SECONDS="$KIMI26_BENCH_TIMEOUT_SECONDS" \
|
| 107 |
+
BENCH_EXTRA_BODY_JSON="$KIMI26_BENCH_EXTRA_BODY_JSON" \
|
| 108 |
+
bench_sweep "$KIMI26_DFLASH_PORT" kimi-k2.6-amd-dflash "$output_prefix" "4,8" "512" "$KIMI26_BENCH_TIMEOUT_SECONDS"
|
| 109 |
+
|
| 110 |
+
docker_rm "$CONTAINER_NAME"
|
| 111 |
+
|
| 112 |
+
echo "--- done: results at $REMOTE_RESULTS_DIR/${output_prefix}-* ---"
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
for spec_tokens in $SPEC_TOKENS_LIST; do
|
| 116 |
+
for sched in $SCHEDULER_CONFIGS; do
|
| 117 |
+
IFS=',' read -r max_num_seqs max_num_batched_tokens <<<"$sched"
|
| 118 |
+
run_sweep_point "$spec_tokens" "$max_num_seqs" "$max_num_batched_tokens"
|
| 119 |
+
done
|
| 120 |
+
done
|
launchers/kimi26-vllm-dflash.sh
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
set -euo pipefail
|
| 3 |
+
|
| 4 |
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
| 5 |
+
# shellcheck disable=SC1091
|
| 6 |
+
source "$SCRIPT_DIR/../remote-lib.sh"
|
| 7 |
+
|
| 8 |
+
spec_config="$(build_kimi26_dflash_spec_config)"
|
| 9 |
+
|
| 10 |
+
cmd="python3 '$REMOTE_PAYLOAD_DIR/patch_dflash_rocm.py'"
|
| 11 |
+
cmd+=" && python3 -m vllm.entrypoints.openai.api_server"
|
| 12 |
+
cmd+=" --model '$KIMI26_MODEL_DIR'"
|
| 13 |
+
cmd+=" --served-model-name kimi-k2.6-amd-dflash"
|
| 14 |
+
cmd+=" --host 0.0.0.0"
|
| 15 |
+
cmd+=" --port '$KIMI26_DFLASH_PORT'"
|
| 16 |
+
cmd+=" --tensor-parallel-size '$KIMI26_TENSOR_PARALLEL_SIZE'"
|
| 17 |
+
cmd+=" --trust-remote-code"
|
| 18 |
+
cmd+=" --max-model-len '$KIMI26_MAX_MODEL_LEN'"
|
| 19 |
+
cmd+=" --gpu-memory-utilization '$KIMI26_DFLASH_GPU_MEMORY_UTILIZATION'"
|
| 20 |
+
cmd+=" --max-num-batched-tokens '$KIMI26_DFLASH_MAX_NUM_BATCHED_TOKENS'"
|
| 21 |
+
cmd+=" --max-num-seqs '$KIMI26_DFLASH_MAX_NUM_SEQS'"
|
| 22 |
+
cmd+=" --mm-encoder-tp-mode data"
|
| 23 |
+
cmd+=" --block-size '$KIMI26_DFLASH_BLOCK_SIZE'"
|
| 24 |
+
cmd+=" --tool-call-parser kimi_k2"
|
| 25 |
+
cmd+=" --reasoning-parser kimi_k2"
|
| 26 |
+
cmd+=" --enable-auto-tool-choice"
|
| 27 |
+
cmd+=" --moe-backend '$KIMI26_MOE_BACKEND'"
|
| 28 |
+
cmd+=" --optimization-level '$KIMI26_OPTIMIZATION_LEVEL'"
|
| 29 |
+
cmd+=" --performance-mode '$KIMI26_PERFORMANCE_MODE'"
|
| 30 |
+
cmd+=" --safetensors-load-strategy '$KIMI26_SAFETENSORS_LOAD_STRATEGY'"
|
| 31 |
+
cmd+=" --disable-uvicorn-access-log"
|
| 32 |
+
cmd+=" --no-enable-prefix-caching"
|
| 33 |
+
cmd+=" --enable-chunked-prefill"
|
| 34 |
+
cmd+=" --enforce-eager"
|
| 35 |
+
cmd+=" --speculative-config '$spec_config'"
|
| 36 |
+
|
| 37 |
+
docker_rm kimi26-vllm-dflash
|
| 38 |
+
docker_args=(
|
| 39 |
+
-d
|
| 40 |
+
--name kimi26-vllm-dflash
|
| 41 |
+
--restart unless-stopped
|
| 42 |
+
--network host
|
| 43 |
+
--device=/dev/kfd
|
| 44 |
+
--device=/dev/dri
|
| 45 |
+
--security-opt seccomp=unconfined
|
| 46 |
+
--group-add video
|
| 47 |
+
--ipc=host
|
| 48 |
+
-e PYTORCH_ROCM_ARCH=gfx942
|
| 49 |
+
-e AITER_ROCM_ARCH=gfx942
|
| 50 |
+
-e GPU_ARCHS=gfx942
|
| 51 |
+
-e VLLM_ROCM_USE_AITER=1
|
| 52 |
+
-e VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4
|
| 53 |
+
-e VLLM_ROCM_USE_AITER_RMSNORM=0
|
| 54 |
+
-e HSA_ENABLE_SDMA=0
|
| 55 |
+
-e HSA_NO_SCRATCH_RECLAIM=1
|
| 56 |
+
-e OMP_NUM_THREADS=1
|
| 57 |
+
-e HIP_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
|
| 58 |
+
-v "$REMOTE_MODEL_DIR:$REMOTE_MODEL_DIR"
|
| 59 |
+
-v "$REMOTE_PAYLOAD_DIR:$REMOTE_PAYLOAD_DIR:ro"
|
| 60 |
+
-v "$REMOTE_VLLM_CACHE_DIR:/root/.cache/vllm"
|
| 61 |
+
-v "$REMOTE_HF_CACHE_DIR:/root/.cache/huggingface"
|
| 62 |
+
)
|
| 63 |
+
if [[ "$KIMI26_USE_TUNED_MOE_CONFIGS" == "1" ]] && [[ -d "$REMOTE_TUNED_CONFIG_DIR" ]]; then
|
| 64 |
+
docker_args+=(
|
| 65 |
+
-e VLLM_TUNED_CONFIG_FOLDER=/tuned_configs
|
| 66 |
+
-v "$REMOTE_TUNED_CONFIG_DIR:/tuned_configs"
|
| 67 |
+
)
|
| 68 |
+
fi
|
| 69 |
+
|
| 70 |
+
docker run "${docker_args[@]}" \
|
| 71 |
+
--entrypoint bash \
|
| 72 |
+
"$KIMI26_IMAGE" \
|
| 73 |
+
-lc "$cmd"
|
| 74 |
+
|
| 75 |
+
wait_ready "$KIMI26_DFLASH_PORT" 1800
|
| 76 |
+
if [[ "$KIMI26_SKIP_BENCHMARK" == "1" ]]; then
|
| 77 |
+
exit 0
|
| 78 |
+
fi
|
| 79 |
+
|
| 80 |
+
BENCH_PROMPTS_JSON="$KIMI26_BENCH_PROMPTS_JSON" \
|
| 81 |
+
BENCH_CONCURRENCY_LIST="$KIMI26_BENCH_CONCURRENCY_LIST" \
|
| 82 |
+
BENCH_MAX_TOKENS_LIST="$KIMI26_BENCH_MAX_TOKENS_LIST" \
|
| 83 |
+
BENCH_REQUESTS_PER_POINT="$KIMI26_BENCH_REQUESTS_PER_POINT" \
|
| 84 |
+
BENCH_TIMEOUT_SECONDS="$KIMI26_BENCH_TIMEOUT_SECONDS" \
|
| 85 |
+
BENCH_EXTRA_BODY_JSON="$KIMI26_BENCH_EXTRA_BODY_JSON" \
|
| 86 |
+
bench_sweep "$KIMI26_DFLASH_PORT" kimi-k2.6-amd-dflash kimi26-vllm-dflash "1,4,8" "512,1024" "$KIMI26_BENCH_TIMEOUT_SECONDS"
|
patches/patch_dflash_rocm.py
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Patch ROCm DFlash support into installed vLLM and AITER packages.
|
| 3 |
+
|
| 4 |
+
The reachable host uses newer `vllm/v1` attention paths than the older
|
| 5 |
+
one-off patch script from the learnings. This script applies the same logical
|
| 6 |
+
fixes against the actual installed package files inside the runtime container.
|
| 7 |
+
It is intentionally idempotent.
|
| 8 |
+
"""
|
| 9 |
+
|
| 10 |
+
from __future__ import annotations
|
| 11 |
+
|
| 12 |
+
import importlib.util
|
| 13 |
+
import re
|
| 14 |
+
import sys
|
| 15 |
+
from pathlib import Path
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
def locate_module_file(module_name: str) -> Path:
|
| 19 |
+
spec = importlib.util.find_spec(module_name)
|
| 20 |
+
if spec is None or spec.origin is None:
|
| 21 |
+
raise RuntimeError(f"Could not locate module: {module_name}")
|
| 22 |
+
return Path(spec.origin).resolve()
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
def first_existing(paths: list[Path]) -> Path:
|
| 26 |
+
for path in paths:
|
| 27 |
+
if path.exists():
|
| 28 |
+
return path
|
| 29 |
+
raise RuntimeError("Could not locate any expected path:\n" + "\n".join(map(str, paths)))
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def replace_once(text: str, old: str, new: str, path: Path) -> str:
|
| 33 |
+
if new in text:
|
| 34 |
+
return text
|
| 35 |
+
if old not in text:
|
| 36 |
+
raise RuntimeError(f"Pattern not found in {path}: {old[:120]!r}")
|
| 37 |
+
return text.replace(old, new, 1)
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
def replace_all_regex(
|
| 41 |
+
text: str,
|
| 42 |
+
pattern: str,
|
| 43 |
+
repl: str,
|
| 44 |
+
path: Path,
|
| 45 |
+
*,
|
| 46 |
+
min_count: int = 1,
|
| 47 |
+
) -> str:
|
| 48 |
+
compiled = re.compile(pattern, re.MULTILINE)
|
| 49 |
+
matches = list(compiled.finditer(text))
|
| 50 |
+
marker = re.sub(r"\\(?:g<[^>]+>|[1-9][0-9]*)", "", repl)
|
| 51 |
+
if not matches:
|
| 52 |
+
if repl in text or (marker and marker in text):
|
| 53 |
+
return text
|
| 54 |
+
raise RuntimeError(f"Regex pattern not found in {path}: {pattern}")
|
| 55 |
+
if len(matches) < min_count:
|
| 56 |
+
updated = compiled.sub(repl, text)
|
| 57 |
+
if updated != text and marker and marker in updated:
|
| 58 |
+
return updated
|
| 59 |
+
raise RuntimeError(
|
| 60 |
+
f"Expected at least {min_count} matches in {path}, found {len(matches)}"
|
| 61 |
+
)
|
| 62 |
+
return compiled.sub(repl, text)
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
def patch_file(path: Path, transform) -> None:
|
| 66 |
+
original = path.read_text()
|
| 67 |
+
updated = transform(original, path)
|
| 68 |
+
if updated == original:
|
| 69 |
+
print(f"[skip] {path}")
|
| 70 |
+
return
|
| 71 |
+
path.write_text(updated)
|
| 72 |
+
print(f"[patch] {path}")
|
| 73 |
+
|
| 74 |
+
|
| 75 |
+
def patch_rocm_aiter_fa(text: str, path: Path) -> str:
|
| 76 |
+
text = replace_once(
|
| 77 |
+
text,
|
| 78 |
+
' @staticmethod\n def get_name() -> str:\n return "FLASH_ATTN"\n\n @staticmethod\n def get_impl_cls() -> type["AiterFlashAttentionImpl"]:\n',
|
| 79 |
+
' @staticmethod\n def get_name() -> str:\n return "FLASH_ATTN"\n\n @classmethod\n def supports_non_causal(cls) -> bool:\n return True\n\n @staticmethod\n def get_impl_cls() -> type["AiterFlashAttentionImpl"]:\n',
|
| 80 |
+
path,
|
| 81 |
+
)
|
| 82 |
+
text = replace_once(
|
| 83 |
+
text,
|
| 84 |
+
"class AiterFlashAttentionMetadata:\n",
|
| 85 |
+
"class AiterFlashAttentionMetadata:\n causal: bool\n",
|
| 86 |
+
path,
|
| 87 |
+
)
|
| 88 |
+
text = replace_once(
|
| 89 |
+
text,
|
| 90 |
+
" attn_metadata = AiterFlashAttentionMetadata(\n num_actual_tokens=common_attn_metadata.num_actual_tokens,\n",
|
| 91 |
+
" attn_metadata = AiterFlashAttentionMetadata(\n causal=common_attn_metadata.causal,\n num_actual_tokens=common_attn_metadata.num_actual_tokens,\n",
|
| 92 |
+
path,
|
| 93 |
+
)
|
| 94 |
+
text = replace_once(
|
| 95 |
+
text,
|
| 96 |
+
" return AiterFlashAttentionMetadata(\n num_actual_tokens=num_tokens,\n",
|
| 97 |
+
" return AiterFlashAttentionMetadata(\n causal=common_attn_metadata.causal,\n num_actual_tokens=num_tokens,\n",
|
| 98 |
+
path,
|
| 99 |
+
)
|
| 100 |
+
text = replace_all_regex(
|
| 101 |
+
text,
|
| 102 |
+
r"(softmax_scale=self\.scale,\n)(\s*)causal=True,",
|
| 103 |
+
r"\1\2causal=attn_metadata.causal,",
|
| 104 |
+
path,
|
| 105 |
+
min_count=5,
|
| 106 |
+
)
|
| 107 |
+
return text
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
def patch_supports_non_causal(text: str, path: Path, backend_name: str) -> str:
|
| 111 |
+
insertion = (
|
| 112 |
+
f' @staticmethod\n def get_name() -> str:\n return "{backend_name}"\n\n'
|
| 113 |
+
" @classmethod\n def supports_non_causal(cls) -> bool:\n return True\n\n"
|
| 114 |
+
)
|
| 115 |
+
current = f' @staticmethod\n def get_name() -> str:\n return "{backend_name}"\n\n'
|
| 116 |
+
if "def supports_non_causal" in text:
|
| 117 |
+
return text
|
| 118 |
+
if current not in text:
|
| 119 |
+
raise RuntimeError(f"Could not find get_name block in {path}")
|
| 120 |
+
return text.replace(current, insertion, 1)
|
| 121 |
+
|
| 122 |
+
|
| 123 |
+
def patch_aiter_wrapper(text: str, path: Path) -> str:
|
| 124 |
+
if "IS_CAUSAL=causal" in text:
|
| 125 |
+
return text.replace(
|
| 126 |
+
' assert causal, "Only causal attention is supported"\n',
|
| 127 |
+
"",
|
| 128 |
+
)
|
| 129 |
+
text = replace_once(
|
| 130 |
+
text,
|
| 131 |
+
' assert causal, "Only causal attention is supported"\n',
|
| 132 |
+
"",
|
| 133 |
+
path,
|
| 134 |
+
)
|
| 135 |
+
text = replace_all_regex(
|
| 136 |
+
text,
|
| 137 |
+
r"(ALL_DECODE=ALL_DECODE,\n)(\s*)(\*\*attn_config,)",
|
| 138 |
+
r"\1\2IS_CAUSAL=causal,\n\2\3",
|
| 139 |
+
path,
|
| 140 |
+
min_count=1,
|
| 141 |
+
)
|
| 142 |
+
text = replace_all_regex(
|
| 143 |
+
text,
|
| 144 |
+
r"(ALL_DECODE=ALL_DECODE,\n)(\s*)(\*\*config,)",
|
| 145 |
+
r"\1\2IS_CAUSAL=causal,\n\2\3",
|
| 146 |
+
path,
|
| 147 |
+
min_count=1,
|
| 148 |
+
)
|
| 149 |
+
return text
|
| 150 |
+
|
| 151 |
+
|
| 152 |
+
def patch_aiter_kernel(text: str, path: Path) -> str:
|
| 153 |
+
if "IS_CAUSAL: tl.constexpr = True" in text:
|
| 154 |
+
text = text.replace(
|
| 155 |
+
"num_tiles = cdiv_fn(max_seq_prefix_len, TILE_SIZE)",
|
| 156 |
+
"num_tiles = cdiv_fn(max_seq_prefix_len, TILE_SIZE) if IS_CAUSAL else cdiv_fn(seq_len, TILE_SIZE)",
|
| 157 |
+
)
|
| 158 |
+
text = text.replace(
|
| 159 |
+
"seq_mask = seq_offset[None, :] < context_len + query_pos[:, None] + 1",
|
| 160 |
+
"seq_mask = seq_offset[None, :] < context_len + query_pos[:, None] + 1 if IS_CAUSAL else seq_offset[None, :] < seq_len",
|
| 161 |
+
)
|
| 162 |
+
return text
|
| 163 |
+
text = replace_all_regex(
|
| 164 |
+
text,
|
| 165 |
+
r"(ALL_DECODE: tl\.constexpr = False, # bool\n)(\):)",
|
| 166 |
+
r"\1 IS_CAUSAL: tl.constexpr = True, # bool\n\2",
|
| 167 |
+
path,
|
| 168 |
+
min_count=2,
|
| 169 |
+
)
|
| 170 |
+
text = replace_all_regex(
|
| 171 |
+
text,
|
| 172 |
+
r"num_tiles = cdiv_fn\(max_seq_prefix_len, TILE_SIZE\)",
|
| 173 |
+
"num_tiles = cdiv_fn(max_seq_prefix_len, TILE_SIZE) if IS_CAUSAL else cdiv_fn(seq_len, TILE_SIZE)",
|
| 174 |
+
path,
|
| 175 |
+
min_count=2,
|
| 176 |
+
)
|
| 177 |
+
text = replace_all_regex(
|
| 178 |
+
text,
|
| 179 |
+
r"seq_mask = seq_offset\[None, :\] < context_len \+ query_pos\[:, None\] \+ 1",
|
| 180 |
+
"seq_mask = seq_offset[None, :] < context_len + query_pos[:, None] + 1 if IS_CAUSAL else seq_offset[None, :] < seq_len",
|
| 181 |
+
path,
|
| 182 |
+
min_count=2,
|
| 183 |
+
)
|
| 184 |
+
return text
|
| 185 |
+
|
| 186 |
+
|
| 187 |
+
def patch_vllm_triton_unified_attention(text: str, path: Path) -> str:
|
| 188 |
+
if "IS_CAUSAL=causal" in text:
|
| 189 |
+
return text.replace(
|
| 190 |
+
' assert causal, "Only causal attention is supported"\n',
|
| 191 |
+
"",
|
| 192 |
+
)
|
| 193 |
+
text = replace_once(
|
| 194 |
+
text,
|
| 195 |
+
' assert causal, "Only causal attention is supported"\n',
|
| 196 |
+
"",
|
| 197 |
+
path,
|
| 198 |
+
)
|
| 199 |
+
text = replace_all_regex(
|
| 200 |
+
text,
|
| 201 |
+
r"num_tiles = cdiv_fn\(max_seq_prefix_len, TILE_SIZE\)",
|
| 202 |
+
"num_tiles = cdiv_fn(max_seq_prefix_len, TILE_SIZE) if IS_CAUSAL else cdiv_fn(seq_len, TILE_SIZE)",
|
| 203 |
+
path,
|
| 204 |
+
min_count=2,
|
| 205 |
+
)
|
| 206 |
+
text = replace_all_regex(
|
| 207 |
+
text,
|
| 208 |
+
r"seq_mask = seq_offset\[None, :\] <= query_abs_pos",
|
| 209 |
+
"seq_mask = seq_offset[None, :] <= query_abs_pos if IS_CAUSAL else seq_offset[None, :] < seq_len",
|
| 210 |
+
path,
|
| 211 |
+
min_count=2,
|
| 212 |
+
)
|
| 213 |
+
text = replace_all_regex(
|
| 214 |
+
text,
|
| 215 |
+
r"USE_FP8: tl\.constexpr, # bool",
|
| 216 |
+
"USE_FP8: tl.constexpr, # bool\n IS_CAUSAL: tl.constexpr = True, # bool",
|
| 217 |
+
path,
|
| 218 |
+
min_count=2,
|
| 219 |
+
)
|
| 220 |
+
text = replace_all_regex(
|
| 221 |
+
text,
|
| 222 |
+
r"(BLOCK_M=BLOCK_M,\n)(\s*)",
|
| 223 |
+
r"\1\2IS_CAUSAL=causal,\n\2",
|
| 224 |
+
path,
|
| 225 |
+
min_count=2,
|
| 226 |
+
)
|
| 227 |
+
return text
|
| 228 |
+
|
| 229 |
+
|
| 230 |
+
def patch_vllm_dflash(text: str, path: Path) -> str:
|
| 231 |
+
return replace_once(
|
| 232 |
+
text,
|
| 233 |
+
' assert getattr(attn_metadata, "causal", None) is False, (\n',
|
| 234 |
+
' assert getattr(attn_metadata, "causal", None) in (True, False, None), (\n',
|
| 235 |
+
path,
|
| 236 |
+
)
|
| 237 |
+
|
| 238 |
+
|
| 239 |
+
def patch_vllm_selector(text: str, path: Path) -> str:
|
| 240 |
+
if "AttentionBackendEnum.TRITON_MLA" in text:
|
| 241 |
+
return text
|
| 242 |
+
text = replace_once(
|
| 243 |
+
text,
|
| 244 |
+
"from vllm.v1.attention.backends.registry import (\n"
|
| 245 |
+
" MAMBA_TYPE_TO_BACKEND_MAP,\n"
|
| 246 |
+
" MambaAttentionBackendEnum,\n"
|
| 247 |
+
")\n",
|
| 248 |
+
"from vllm.v1.attention.backends.registry import (\n"
|
| 249 |
+
" AttentionBackendEnum,\n"
|
| 250 |
+
" MAMBA_TYPE_TO_BACKEND_MAP,\n"
|
| 251 |
+
" MambaAttentionBackendEnum,\n"
|
| 252 |
+
")\n",
|
| 253 |
+
path,
|
| 254 |
+
)
|
| 255 |
+
new = (
|
| 256 |
+
" speculative_config = vllm_config.speculative_config\n"
|
| 257 |
+
" hf_config = vllm_config.model_config.hf_config\n"
|
| 258 |
+
" architectures = list(getattr(hf_config, \"architectures\", []) or [])\n"
|
| 259 |
+
" is_dflash_draft = any(\n"
|
| 260 |
+
" str(arch).startswith(\"DFlash\") for arch in architectures\n"
|
| 261 |
+
" )\n"
|
| 262 |
+
" use_non_causal = (\n"
|
| 263 |
+
" speculative_config is not None\n"
|
| 264 |
+
" and speculative_config.method == \"dflash\"\n"
|
| 265 |
+
" and is_dflash_draft\n"
|
| 266 |
+
" )\n"
|
| 267 |
+
"\n"
|
| 268 |
+
" backend = vllm_config.attention_config.backend\n"
|
| 269 |
+
" if (\n"
|
| 270 |
+
" speculative_config is not None\n"
|
| 271 |
+
" and speculative_config.method == \"dflash\"\n"
|
| 272 |
+
" and use_mla\n"
|
| 273 |
+
" and not is_dflash_draft\n"
|
| 274 |
+
" and backend is None\n"
|
| 275 |
+
" ):\n"
|
| 276 |
+
" backend = AttentionBackendEnum.TRITON_MLA\n"
|
| 277 |
+
)
|
| 278 |
+
old_variants = [
|
| 279 |
+
(
|
| 280 |
+
" speculative_config = vllm_config.speculative_config\n"
|
| 281 |
+
" use_non_causal = (\n"
|
| 282 |
+
" speculative_config is not None and speculative_config.method == \"dflash\"\n"
|
| 283 |
+
" )\n"
|
| 284 |
+
),
|
| 285 |
+
(
|
| 286 |
+
" speculative_config = vllm_config.speculative_config\n"
|
| 287 |
+
" hf_config = vllm_config.model_config.hf_config\n"
|
| 288 |
+
" architectures = list(getattr(hf_config, \"architectures\", []) or [])\n"
|
| 289 |
+
" use_non_causal = (\n"
|
| 290 |
+
" speculative_config is not None\n"
|
| 291 |
+
" and speculative_config.method == \"dflash\"\n"
|
| 292 |
+
" and any(str(arch).startswith(\"DFlash\") for arch in architectures)\n"
|
| 293 |
+
" )\n"
|
| 294 |
+
),
|
| 295 |
+
]
|
| 296 |
+
for old in old_variants:
|
| 297 |
+
if old in text:
|
| 298 |
+
text = text.replace(old, new, 1)
|
| 299 |
+
break
|
| 300 |
+
else:
|
| 301 |
+
if new not in text:
|
| 302 |
+
raise RuntimeError(f"Could not find selector speculative block in {path}")
|
| 303 |
+
return replace_once(
|
| 304 |
+
text,
|
| 305 |
+
" backend=vllm_config.attention_config.backend,\n",
|
| 306 |
+
" backend=backend,\n",
|
| 307 |
+
path,
|
| 308 |
+
)
|
| 309 |
+
|
| 310 |
+
|
| 311 |
+
def main() -> int:
|
| 312 |
+
vllm_root = locate_module_file("vllm").parent
|
| 313 |
+
site_packages = vllm_root.parent
|
| 314 |
+
|
| 315 |
+
rocm_aiter_fa = vllm_root / "v1" / "attention" / "backends" / "rocm_aiter_fa.py"
|
| 316 |
+
rocm_attn = vllm_root / "v1" / "attention" / "backends" / "rocm_attn.py"
|
| 317 |
+
rocm_aiter_unified = (
|
| 318 |
+
vllm_root / "v1" / "attention" / "backends" / "rocm_aiter_unified_attn.py"
|
| 319 |
+
)
|
| 320 |
+
triton_attn = vllm_root / "v1" / "attention" / "backends" / "triton_attn.py"
|
| 321 |
+
selector_path = vllm_root / "v1" / "attention" / "selector.py"
|
| 322 |
+
vllm_triton_ops = (
|
| 323 |
+
vllm_root / "v1" / "attention" / "ops" / "triton_unified_attention.py"
|
| 324 |
+
)
|
| 325 |
+
vllm_dflash = vllm_root / "v1" / "spec_decode" / "dflash.py"
|
| 326 |
+
aiter_wrapper = first_existing(
|
| 327 |
+
[
|
| 328 |
+
site_packages / "aiter" / "ops" / "triton" / "unified_attention.py",
|
| 329 |
+
site_packages
|
| 330 |
+
/ "aiter"
|
| 331 |
+
/ "ops"
|
| 332 |
+
/ "triton"
|
| 333 |
+
/ "attention"
|
| 334 |
+
/ "unified_attention.py",
|
| 335 |
+
]
|
| 336 |
+
)
|
| 337 |
+
aiter_kernel = first_existing(
|
| 338 |
+
[
|
| 339 |
+
site_packages
|
| 340 |
+
/ "aiter"
|
| 341 |
+
/ "ops"
|
| 342 |
+
/ "triton"
|
| 343 |
+
/ "_triton_kernels"
|
| 344 |
+
/ "unified_attention.py",
|
| 345 |
+
site_packages
|
| 346 |
+
/ "aiter"
|
| 347 |
+
/ "ops"
|
| 348 |
+
/ "triton"
|
| 349 |
+
/ "_triton_kernels"
|
| 350 |
+
/ "attention"
|
| 351 |
+
/ "unified_attention.py",
|
| 352 |
+
]
|
| 353 |
+
)
|
| 354 |
+
|
| 355 |
+
patch_file(rocm_aiter_fa, patch_rocm_aiter_fa)
|
| 356 |
+
patch_file(
|
| 357 |
+
rocm_attn,
|
| 358 |
+
lambda text, path: patch_supports_non_causal(text, path, "ROCM_ATTN"),
|
| 359 |
+
)
|
| 360 |
+
patch_file(
|
| 361 |
+
rocm_aiter_unified,
|
| 362 |
+
lambda text, path: patch_supports_non_causal(
|
| 363 |
+
text, path, "ROCM_AITER_UNIFIED_ATTN"
|
| 364 |
+
),
|
| 365 |
+
)
|
| 366 |
+
patch_file(
|
| 367 |
+
triton_attn,
|
| 368 |
+
lambda text, path: patch_supports_non_causal(text, path, "TRITON_ATTN"),
|
| 369 |
+
)
|
| 370 |
+
patch_file(selector_path, patch_vllm_selector)
|
| 371 |
+
patch_file(vllm_triton_ops, patch_vllm_triton_unified_attention)
|
| 372 |
+
patch_file(vllm_dflash, patch_vllm_dflash)
|
| 373 |
+
patch_file(aiter_wrapper, patch_aiter_wrapper)
|
| 374 |
+
patch_file(aiter_kernel, patch_aiter_kernel)
|
| 375 |
+
print("[done] ROCm DFlash patch applied")
|
| 376 |
+
return 0
|
| 377 |
+
|
| 378 |
+
|
| 379 |
+
if __name__ == "__main__":
|
| 380 |
+
sys.exit(main())
|
payload/benchmark_multi_turn.py
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Multi-turn session benchmark for OpenAI-compatible APIs.
|
| 3 |
+
|
| 4 |
+
Runs concurrent multi-turn chat sessions and reports per-turn,
|
| 5 |
+
per-session, and aggregate throughput metrics.
|
| 6 |
+
"""
|
| 7 |
+
import argparse
|
| 8 |
+
import asyncio
|
| 9 |
+
import json
|
| 10 |
+
import sys
|
| 11 |
+
import time
|
| 12 |
+
|
| 13 |
+
from openai import AsyncOpenAI
|
| 14 |
+
|
| 15 |
+
INITIAL_PROMPTS = [
|
| 16 |
+
"Write a Python function that implements a lock-free concurrent hash map using compare-and-swap operations. Include proper memory ordering.",
|
| 17 |
+
"Explain the mathematical foundations of diffusion models in machine learning. Start from the forward process and derive the reverse process.",
|
| 18 |
+
"Design a distributed consensus protocol for a system with Byzantine fault tolerance. Describe the phases and prove the safety properties.",
|
| 19 |
+
"Implement a B+ tree in Rust with support for range queries, bulk loading, and concurrent access using optimistic locking.",
|
| 20 |
+
"Analyze the computational complexity of the Aho-Corasick algorithm and compare it to naive multi-pattern matching. Provide the proof.",
|
| 21 |
+
"Write a CUDA kernel for flash attention with causal masking that handles variable sequence lengths within a batch.",
|
| 22 |
+
"Derive the optimal batch size for gradient descent given a fixed compute budget, following the scaling laws from Kaplan et al.",
|
| 23 |
+
"Design an LSM-tree based key-value store with write-ahead logging, compaction strategies, and bloom filters for read optimization.",
|
| 24 |
+
]
|
| 25 |
+
|
| 26 |
+
FOLLOW_UP_PROMPTS = [
|
| 27 |
+
"Can you explain the most complex part of that in more detail?",
|
| 28 |
+
"What are the main failure modes and how would you handle them?",
|
| 29 |
+
"Now optimize that for a production environment with 10x the scale.",
|
| 30 |
+
"Write comprehensive tests for the core logic you described.",
|
| 31 |
+
"What are the tradeoffs compared to the most common alternative approach?",
|
| 32 |
+
]
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
async def run_session(
|
| 36 |
+
client: AsyncOpenAI,
|
| 37 |
+
session_id: int,
|
| 38 |
+
model: str,
|
| 39 |
+
turns_per_session: int,
|
| 40 |
+
max_tokens: int,
|
| 41 |
+
temperature: float,
|
| 42 |
+
timeout_seconds: float,
|
| 43 |
+
) -> dict:
|
| 44 |
+
messages = []
|
| 45 |
+
turn_results = []
|
| 46 |
+
session_start = time.monotonic()
|
| 47 |
+
deadline = session_start + timeout_seconds
|
| 48 |
+
|
| 49 |
+
initial_prompt = INITIAL_PROMPTS[session_id % len(INITIAL_PROMPTS)]
|
| 50 |
+
|
| 51 |
+
for turn_idx in range(turns_per_session):
|
| 52 |
+
if turn_idx == 0:
|
| 53 |
+
user_content = initial_prompt
|
| 54 |
+
else:
|
| 55 |
+
user_content = FOLLOW_UP_PROMPTS[(turn_idx - 1) % len(FOLLOW_UP_PROMPTS)]
|
| 56 |
+
|
| 57 |
+
messages.append({"role": "user", "content": user_content})
|
| 58 |
+
|
| 59 |
+
remaining = deadline - time.monotonic()
|
| 60 |
+
if remaining <= 0:
|
| 61 |
+
break
|
| 62 |
+
|
| 63 |
+
turn_start = time.monotonic()
|
| 64 |
+
try:
|
| 65 |
+
response = await asyncio.wait_for(
|
| 66 |
+
client.chat.completions.create(
|
| 67 |
+
model=model,
|
| 68 |
+
messages=messages,
|
| 69 |
+
max_tokens=max_tokens,
|
| 70 |
+
temperature=temperature,
|
| 71 |
+
),
|
| 72 |
+
timeout=remaining,
|
| 73 |
+
)
|
| 74 |
+
except (asyncio.TimeoutError, Exception) as exc:
|
| 75 |
+
turn_results.append({
|
| 76 |
+
"turn": turn_idx + 1,
|
| 77 |
+
"error": f"{type(exc).__name__}: {exc}",
|
| 78 |
+
})
|
| 79 |
+
break
|
| 80 |
+
|
| 81 |
+
turn_wall = time.monotonic() - turn_start
|
| 82 |
+
usage = response.usage
|
| 83 |
+
completion_tokens = usage.completion_tokens if usage else 0
|
| 84 |
+
prompt_tokens = usage.prompt_tokens if usage else 0
|
| 85 |
+
tok_per_sec = completion_tokens / turn_wall if turn_wall > 0 else 0.0
|
| 86 |
+
|
| 87 |
+
turn_results.append({
|
| 88 |
+
"turn": turn_idx + 1,
|
| 89 |
+
"prompt_tokens": prompt_tokens,
|
| 90 |
+
"completion_tokens": completion_tokens,
|
| 91 |
+
"wall_seconds": round(turn_wall, 3),
|
| 92 |
+
"tok_per_sec": round(tok_per_sec, 1),
|
| 93 |
+
})
|
| 94 |
+
|
| 95 |
+
assistant_content = response.choices[0].message.content or ""
|
| 96 |
+
messages.append({"role": "assistant", "content": assistant_content})
|
| 97 |
+
|
| 98 |
+
total_completion = sum(
|
| 99 |
+
t.get("completion_tokens", 0) for t in turn_results
|
| 100 |
+
)
|
| 101 |
+
total_wall = time.monotonic() - session_start
|
| 102 |
+
turns_completed = sum(1 for t in turn_results if "error" not in t)
|
| 103 |
+
avg_tok_per_sec = total_completion / total_wall if total_wall > 0 else 0.0
|
| 104 |
+
|
| 105 |
+
return {
|
| 106 |
+
"session_id": session_id,
|
| 107 |
+
"turns": turn_results,
|
| 108 |
+
"total_completion_tokens": total_completion,
|
| 109 |
+
"total_wall_seconds": round(total_wall, 3),
|
| 110 |
+
"avg_tok_per_sec": round(avg_tok_per_sec, 1),
|
| 111 |
+
"turns_completed": turns_completed,
|
| 112 |
+
}
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
async def run_benchmark(args: argparse.Namespace) -> dict:
|
| 116 |
+
client = AsyncOpenAI(base_url=args.base_url, api_key="unused")
|
| 117 |
+
|
| 118 |
+
tasks = [
|
| 119 |
+
run_session(
|
| 120 |
+
client=client,
|
| 121 |
+
session_id=i,
|
| 122 |
+
model=args.model,
|
| 123 |
+
turns_per_session=args.turns_per_session,
|
| 124 |
+
max_tokens=args.max_tokens,
|
| 125 |
+
temperature=args.temperature,
|
| 126 |
+
timeout_seconds=args.timeout_seconds,
|
| 127 |
+
)
|
| 128 |
+
for i in range(args.sessions)
|
| 129 |
+
]
|
| 130 |
+
|
| 131 |
+
wall_start = time.monotonic()
|
| 132 |
+
session_results = await asyncio.gather(*tasks)
|
| 133 |
+
wall_total = time.monotonic() - wall_start
|
| 134 |
+
|
| 135 |
+
total_completion = sum(s["total_completion_tokens"] for s in session_results)
|
| 136 |
+
turns_completed = sum(s["turns_completed"] for s in session_results)
|
| 137 |
+
sessions_completed = sum(
|
| 138 |
+
1 for s in session_results if s["turns_completed"] == args.turns_per_session
|
| 139 |
+
)
|
| 140 |
+
per_session_rates = [
|
| 141 |
+
s["avg_tok_per_sec"]
|
| 142 |
+
for s in session_results
|
| 143 |
+
if s["turns_completed"] > 0
|
| 144 |
+
]
|
| 145 |
+
mean_per_session = (
|
| 146 |
+
sum(per_session_rates) / len(per_session_rates)
|
| 147 |
+
if per_session_rates
|
| 148 |
+
else 0.0
|
| 149 |
+
)
|
| 150 |
+
|
| 151 |
+
return {
|
| 152 |
+
"config": {
|
| 153 |
+
"sessions": args.sessions,
|
| 154 |
+
"turns_per_session": args.turns_per_session,
|
| 155 |
+
"max_tokens": args.max_tokens,
|
| 156 |
+
"temperature": args.temperature,
|
| 157 |
+
"model": args.model,
|
| 158 |
+
},
|
| 159 |
+
"sessions": session_results,
|
| 160 |
+
"aggregate": {
|
| 161 |
+
"total_completion_tokens": total_completion,
|
| 162 |
+
"total_wall_seconds": round(wall_total, 3),
|
| 163 |
+
"aggregate_tok_per_sec": round(
|
| 164 |
+
total_completion / wall_total if wall_total > 0 else 0.0, 1
|
| 165 |
+
),
|
| 166 |
+
"mean_per_session_tok_per_sec": round(mean_per_session, 1),
|
| 167 |
+
"sessions_completed": sessions_completed,
|
| 168 |
+
"turns_completed": turns_completed,
|
| 169 |
+
},
|
| 170 |
+
}
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
def main() -> int:
|
| 174 |
+
parser = argparse.ArgumentParser(
|
| 175 |
+
description="Multi-turn session benchmark for OpenAI-compatible APIs"
|
| 176 |
+
)
|
| 177 |
+
parser.add_argument("--base-url", default="http://127.0.0.1:8262/v1")
|
| 178 |
+
parser.add_argument("--model", default="kimi-k2.6-amd-dflash")
|
| 179 |
+
parser.add_argument("--sessions", type=int, default=4)
|
| 180 |
+
parser.add_argument("--turns-per-session", type=int, default=5)
|
| 181 |
+
parser.add_argument("--max-tokens", type=int, default=512)
|
| 182 |
+
parser.add_argument("--temperature", type=float, default=0)
|
| 183 |
+
parser.add_argument("--output-json", type=str, default=None)
|
| 184 |
+
parser.add_argument("--timeout-seconds", type=float, default=3600)
|
| 185 |
+
args = parser.parse_args()
|
| 186 |
+
|
| 187 |
+
result = asyncio.run(run_benchmark(args))
|
| 188 |
+
|
| 189 |
+
output = json.dumps(result, indent=2)
|
| 190 |
+
print(output)
|
| 191 |
+
|
| 192 |
+
if args.output_json:
|
| 193 |
+
with open(args.output_json, "w") as f:
|
| 194 |
+
f.write(output)
|
| 195 |
+
f.write("\n")
|
| 196 |
+
print(f"\nResults written to {args.output_json}", file=sys.stderr)
|
| 197 |
+
|
| 198 |
+
agg = result["aggregate"]
|
| 199 |
+
print(
|
| 200 |
+
f"\n--- Summary ---\n"
|
| 201 |
+
f"Sessions: {agg['sessions_completed']}/{args.sessions} completed\n"
|
| 202 |
+
f"Turns: {agg['turns_completed']}/{args.sessions * args.turns_per_session}\n"
|
| 203 |
+
f"Aggregate throughput: {agg['aggregate_tok_per_sec']} tok/s\n"
|
| 204 |
+
f"Mean per-session: {agg['mean_per_session_tok_per_sec']} tok/s\n"
|
| 205 |
+
f"Wall time: {agg['total_wall_seconds']}s",
|
| 206 |
+
file=sys.stderr,
|
| 207 |
+
)
|
| 208 |
+
|
| 209 |
+
return 0
|
| 210 |
+
|
| 211 |
+
|
| 212 |
+
if __name__ == "__main__":
|
| 213 |
+
raise SystemExit(main())
|
payload/preshard_kimi26.py
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Pre-shard the Kimi K2.6 checkpoint for TP=8 deployment.
|
| 3 |
+
|
| 4 |
+
Loads the model via vLLM and saves it in sharded format so the
|
| 5 |
+
launcher can use --load-format sharded_state to skip runtime sharding.
|
| 6 |
+
"""
|
| 7 |
+
import argparse
|
| 8 |
+
import glob
|
| 9 |
+
import os
|
| 10 |
+
import shutil
|
| 11 |
+
import sys
|
| 12 |
+
import time
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
def main() -> int:
|
| 16 |
+
parser = argparse.ArgumentParser(
|
| 17 |
+
description="Pre-shard Kimi K2.6 checkpoint for vLLM sharded_state loading"
|
| 18 |
+
)
|
| 19 |
+
parser.add_argument(
|
| 20 |
+
"--model",
|
| 21 |
+
default="/mnt/nvme5n1p1/hydra/models/Kimi-K2.6",
|
| 22 |
+
)
|
| 23 |
+
parser.add_argument(
|
| 24 |
+
"--output",
|
| 25 |
+
default="/mnt/nvme5n1p1/hydra/models/Kimi-K2.6-sharded-tp8",
|
| 26 |
+
)
|
| 27 |
+
parser.add_argument("--tp", type=int, default=8)
|
| 28 |
+
parser.add_argument(
|
| 29 |
+
"--trust-remote-code",
|
| 30 |
+
action=argparse.BooleanOptionalAction,
|
| 31 |
+
default=True,
|
| 32 |
+
)
|
| 33 |
+
args = parser.parse_args()
|
| 34 |
+
|
| 35 |
+
if os.path.exists(args.output):
|
| 36 |
+
print(
|
| 37 |
+
f"ERROR: output directory already exists: {args.output}\n"
|
| 38 |
+
f"Remove it manually if you want to re-shard.",
|
| 39 |
+
file=sys.stderr,
|
| 40 |
+
)
|
| 41 |
+
return 1
|
| 42 |
+
|
| 43 |
+
if not os.path.isdir(args.model):
|
| 44 |
+
print(f"ERROR: model directory not found: {args.model}", file=sys.stderr)
|
| 45 |
+
return 1
|
| 46 |
+
|
| 47 |
+
# Defer heavy import so --help is fast and arg validation runs first.
|
| 48 |
+
from vllm import LLM
|
| 49 |
+
|
| 50 |
+
print(f"Loading model from {args.model} with TP={args.tp} ...")
|
| 51 |
+
t0 = time.monotonic()
|
| 52 |
+
|
| 53 |
+
llm = LLM(
|
| 54 |
+
model=args.model,
|
| 55 |
+
tensor_parallel_size=args.tp,
|
| 56 |
+
trust_remote_code=args.trust_remote_code,
|
| 57 |
+
)
|
| 58 |
+
|
| 59 |
+
t_load = time.monotonic() - t0
|
| 60 |
+
print(f"Model loaded in {t_load:.1f}s")
|
| 61 |
+
|
| 62 |
+
os.makedirs(args.output, exist_ok=True)
|
| 63 |
+
print(f"Saving sharded state to {args.output} ...")
|
| 64 |
+
t1 = time.monotonic()
|
| 65 |
+
|
| 66 |
+
llm.llm_engine.model_executor.save_sharded_state(path=args.output)
|
| 67 |
+
|
| 68 |
+
t_save = time.monotonic() - t1
|
| 69 |
+
print(f"Sharded state saved in {t_save:.1f}s")
|
| 70 |
+
|
| 71 |
+
# Copy tokenizer and trust-remote-code files that vLLM does not shard.
|
| 72 |
+
copy_names = [
|
| 73 |
+
"tokenizer.json",
|
| 74 |
+
"tokenizer_config.json",
|
| 75 |
+
"special_tokens_map.json",
|
| 76 |
+
"chat_template.jinja",
|
| 77 |
+
]
|
| 78 |
+
copied = []
|
| 79 |
+
for name in copy_names:
|
| 80 |
+
src = os.path.join(args.model, name)
|
| 81 |
+
if os.path.isfile(src):
|
| 82 |
+
shutil.copy2(src, os.path.join(args.output, name))
|
| 83 |
+
copied.append(name)
|
| 84 |
+
|
| 85 |
+
for py_file in glob.glob(os.path.join(args.model, "*.py")):
|
| 86 |
+
basename = os.path.basename(py_file)
|
| 87 |
+
shutil.copy2(py_file, os.path.join(args.output, basename))
|
| 88 |
+
copied.append(basename)
|
| 89 |
+
|
| 90 |
+
if copied:
|
| 91 |
+
print(f"Copied auxiliary files: {', '.join(copied)}")
|
| 92 |
+
|
| 93 |
+
t_total = time.monotonic() - t0
|
| 94 |
+
print(
|
| 95 |
+
f"\nDone. Total time: {t_total:.1f}s (load: {t_load:.1f}s, save: {t_save:.1f}s)\n"
|
| 96 |
+
f"Use with: --model {args.output} --load-format sharded_state"
|
| 97 |
+
)
|
| 98 |
+
return 0
|
| 99 |
+
|
| 100 |
+
|
| 101 |
+
if __name__ == "__main__":
|
| 102 |
+
raise SystemExit(main())
|
serve.sh
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
set -euo pipefail
|
| 3 |
+
|
| 4 |
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
| 5 |
+
source "$SCRIPT_DIR/configs/production.env"
|
| 6 |
+
|
| 7 |
+
CONTAINER_NAME="${CONTAINER_NAME:-kimi26-dflash}"
|
| 8 |
+
PATCH_SCRIPT="$SCRIPT_DIR/patches/patch_dflash_rocm.py"
|
| 9 |
+
|
| 10 |
+
echo "Kimi K2.6 DFlash — 507 tok/s on 8x MI300X"
|
| 11 |
+
echo "============================================"
|
| 12 |
+
|
| 13 |
+
numa_status=$(cat /proc/sys/kernel/numa_balancing 2>/dev/null || echo "unknown")
|
| 14 |
+
if [[ "$numa_status" != "0" ]]; then
|
| 15 |
+
echo "WARNING: NUMA balancing is enabled ($numa_status). Disable it:"
|
| 16 |
+
echo " sudo sh -c 'echo 0 > /proc/sys/kernel/numa_balancing'"
|
| 17 |
+
echo ""
|
| 18 |
+
fi
|
| 19 |
+
|
| 20 |
+
docker rm -f "$CONTAINER_NAME" 2>/dev/null || true
|
| 21 |
+
|
| 22 |
+
SPEC_CONFIG="{\"method\":\"$SPEC_METHOD\",\"model\":\"$DRAFT_MODEL_DIR\",\"num_speculative_tokens\":$NUM_SPECULATIVE_TOKENS}"
|
| 23 |
+
|
| 24 |
+
docker run -d \
|
| 25 |
+
--name "$CONTAINER_NAME" \
|
| 26 |
+
--network host \
|
| 27 |
+
--device=/dev/kfd \
|
| 28 |
+
--device=/dev/dri \
|
| 29 |
+
--security-opt seccomp=unconfined \
|
| 30 |
+
--group-add video \
|
| 31 |
+
--ipc=host \
|
| 32 |
+
-e PYTORCH_ROCM_ARCH="$PYTORCH_ROCM_ARCH" \
|
| 33 |
+
-e AITER_ROCM_ARCH="$AITER_ROCM_ARCH" \
|
| 34 |
+
-e GPU_ARCHS="$GPU_ARCHS" \
|
| 35 |
+
-e VLLM_ROCM_USE_AITER="$VLLM_ROCM_USE_AITER" \
|
| 36 |
+
-e VLLM_ROCM_QUICK_REDUCE_QUANTIZATION="$VLLM_ROCM_QUICK_REDUCE_QUANTIZATION" \
|
| 37 |
+
-e VLLM_ROCM_USE_AITER_RMSNORM="$VLLM_ROCM_USE_AITER_RMSNORM" \
|
| 38 |
+
-e HSA_ENABLE_SDMA="$HSA_ENABLE_SDMA" \
|
| 39 |
+
-e HSA_NO_SCRATCH_RECLAIM="$HSA_NO_SCRATCH_RECLAIM" \
|
| 40 |
+
-e OMP_NUM_THREADS="$OMP_NUM_THREADS" \
|
| 41 |
+
-e HIP_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
|
| 42 |
+
-v "$(dirname "$MODEL_DIR"):$(dirname "$MODEL_DIR")" \
|
| 43 |
+
-v "$SCRIPT_DIR/patches:/patches:ro" \
|
| 44 |
+
--entrypoint bash \
|
| 45 |
+
"$IMAGE" \
|
| 46 |
+
-lc "python3 /patches/patch_dflash_rocm.py && python3 -m vllm.entrypoints.openai.api_server \
|
| 47 |
+
--model '$MODEL_DIR' \
|
| 48 |
+
--served-model-name kimi-k2.6-amd-dflash \
|
| 49 |
+
--host 0.0.0.0 \
|
| 50 |
+
--port $PORT \
|
| 51 |
+
--tensor-parallel-size $TENSOR_PARALLEL_SIZE \
|
| 52 |
+
--trust-remote-code \
|
| 53 |
+
--max-model-len $MAX_MODEL_LEN \
|
| 54 |
+
--gpu-memory-utilization $GPU_MEMORY_UTILIZATION \
|
| 55 |
+
--max-num-batched-tokens $MAX_NUM_BATCHED_TOKENS \
|
| 56 |
+
--max-num-seqs $MAX_NUM_SEQS \
|
| 57 |
+
--mm-encoder-tp-mode data \
|
| 58 |
+
--block-size $BLOCK_SIZE \
|
| 59 |
+
--tool-call-parser kimi_k2 \
|
| 60 |
+
--reasoning-parser kimi_k2 \
|
| 61 |
+
--enable-auto-tool-choice \
|
| 62 |
+
--moe-backend $MOE_BACKEND \
|
| 63 |
+
--optimization-level $OPTIMIZATION_LEVEL \
|
| 64 |
+
--performance-mode $PERFORMANCE_MODE \
|
| 65 |
+
--safetensors-load-strategy $SAFETENSORS_LOAD_STRATEGY \
|
| 66 |
+
--disable-uvicorn-access-log \
|
| 67 |
+
--no-enable-prefix-caching \
|
| 68 |
+
--enable-chunked-prefill \
|
| 69 |
+
--enforce-eager \
|
| 70 |
+
--speculative-config '$SPEC_CONFIG'"
|
| 71 |
+
|
| 72 |
+
echo ""
|
| 73 |
+
echo "Container '$CONTAINER_NAME' started on port $PORT"
|
| 74 |
+
echo "Waiting for server ready (model load takes ~5 min)..."
|
| 75 |
+
|
| 76 |
+
for i in $(seq 1 360); do
|
| 77 |
+
if curl -sf "http://127.0.0.1:${PORT}/v1/models" >/dev/null 2>&1; then
|
| 78 |
+
echo "Server ready at http://127.0.0.1:${PORT}"
|
| 79 |
+
echo ""
|
| 80 |
+
echo "Test: curl http://127.0.0.1:${PORT}/v1/chat/completions -H 'Content-Type: application/json' -d '{\"model\":\"kimi-k2.6-amd-dflash\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}],\"max_tokens\":32}'"
|
| 81 |
+
exit 0
|
| 82 |
+
fi
|
| 83 |
+
sleep 5
|
| 84 |
+
done
|
| 85 |
+
|
| 86 |
+
echo "ERROR: Server did not become ready in 30 minutes"
|
| 87 |
+
docker logs --tail 20 "$CONTAINER_NAME"
|
| 88 |
+
exit 1
|