# KV-cache Working-Set Sizing — GLM-5.1-FP8 · TP=8 · 1× B300 node 工具:`scripts/working_set_analysis.py`(可配置 GPU 型号 / 并行度 TP·PP·EP / 模型 config.json / KV dtype / 权重大小)。图:`figs/working_set/glm5_fp8_tp8_b300.png`。 ## 复现 ```bash .venv/bin/python scripts/working_set_analysis.py \ /home/gahow/phd/kvcache-simulator/bailian-traces/glm_coder_blksz_512_040915-040917.jsonl \ --model-config /home/gahow/phd/kvcache-simulator/models/GLM-5/config.json \ --gpu B300 --tp 8 --ep 8 --kv-dtype-bytes 1 --weight-gb 744 --min-ts 0 \ --out figs/working_set/glm5_fp8_tp8_b300.png ``` ## 方法 `hash_ids` 是全局内容寻址 block id(同内容=同 id,复用=同 id 再现)。vLLM prefix cache 是 block 级,所以**集群级 KV footprint = 任一时刻必须常驻的 distinct block 数**,与 placement 无关 (affinity 只搬运 block,不改总量)。三种 working set: - `W_all` 永不淘汰(真上界) - `W_oracle` 每 block 只在 `[首次, 末次复用]` 常驻(Belady 完美预知 → 满 APC 上界的最小 HBM) - `W_denning(T)` 滑窗 T 内被访问的 distinct block(现实 TTL-LRU) KV/token:MLA → `L·(kv_lora_rank+qk_rope_head_dim)·dtype`;GQA → `2·L·kv_heads·head_dim·dtype` (与 `kvcache-simulator/src/config.rs::kv_block_bytes` 一致)。 ## 配置 | 项 | 值 | |---|---| | 模型 | GLM-5.1-FP8(MLA, L=78, kv_lora=512+rope=64) | | KV/token · KV/block(512) | **43.9 KiB** · **23.0 MB**(≈ Qwen3 GQA 96 KiB 的一半) | | 硬件 | 8× B300 (288 GB) = 2304 GB HBM/replica | | 预算 | FP8 权重 744 GB + act 32 GB → **KV pool = 1528 GB/node** | | trace | dash0 glm_coder,475k req,**1.25h active @ 106 QPS**,~40k tok/req(剔除 77 条负 ts 暖机) | | APC 上界 | **80.4%** | ## 结果 | 保留窗口 T | peak footprint | = 节点 (GPU) | APC@T | |---:|---:|---:|---:| | 2s(在飞下限)| 533 GB | 0.3 (3) | 1.7% | | 10s | 2,068 GB | 1.4 (11) | 15% | | 30s | 4,906 GB | 3.2 (26) | 42% | | 60s | 7,698 GB | 5.0 (40) | 56% | | 300s | 21,960 GB | 14.4 (115) | 74% | | **oracle(满 80.4%)** | **21,399 GB** | **14.0 (112)** | 80.4% | | retain-forever | 167,018 GB | 109 (874) | — | ## 结论 1. **Serving:1 节点绰绰有余。** 在飞 KV(τ≈2-5s)仅 533–1157 GB ≪ 单节点 1528 GB。 MLA + B300 大 HBM 让 live footprint 微不足道——跑起来根本不缺显存。 2. **缓存全部复用(80.4%):1 节点差 ~14×。** oracle 下限 21.4 TB = 14 节点(112 GPU), 真实 LRU ~2× → ~28 节点。单节点(1528 GB)只能 hold ~10s 窗口 → cache 侧 APC 仅 ~10-15%。 要 ~56% 需 5 节点,~74% 需 ~14 节点。 3. **瓶颈在长尾,不在 live。** 把 APC 50%→80% 装进 GPU HBM 要 5→14 节点,极不经济 → offload/migration 到 CPU DRAM(每节点 ~1.5 TB)是定量动机。与 Qwen 结论方向一致。 ## 注意 - footprint 是 TTL-LRU(最浪费)+ shared-cache 下限:真实 capacity-LRU 同容量下 APC 更高, 但分区/affinity 不均衡又抬高需求;oracle / retain-forever 给出下/上界。 - GLM trace mean ~40k tok/req,是 Qwen trace(11k)的 ~3.5×(tokenizer + 抽取不同), **绝对 GB 不可跨模型横比**,方法与定性结论可比。 - EP 不改变 KV 总量(只影响 expert 权重分布),`--ep` 仅作标注。