分布式推理服务如何路由和共享 Prompt 前缀缓存?
简化版
单机知道“前缀相同可复用 KV”还不够;多副本服务的难点是,请求必须找到持有该前缀的 Worker。常见方案是在网关计算前缀块哈希,用 Cache-Aware Routing 优先路由到命中最多且队列不过载的副本;若跨机传 KV,则还要比较传输成本与重新 Prefill 成本。
设计时同时处理模型版本、Adapter、租户权限、容量淘汰和故障恢复。缓存亲和性只能是带阈值的软目标:命中副本已经排队过长时,应转到空闲副本重新计算。最终用命中 Token 比例、净节省 Prefill 时间、路由排队、传输字节、TTFT 和错误命中数验收。
详细版
可以把系统拆成控制面与数据面:控制面维护“缓存键前缀 → Worker/块位置”的近似目录,数据面在本机引用 KV、跨机拉取 KV,或直接重算。缓存键至少绑定模型 revision、Tokenizer/模板、Adapter、位置配置和权限域;目录允许短暂陈旧,但 Worker 必须在使用前再次校验元数据。
request -> tokenize/hash -> directory lookup -> candidate workers
|-> local hit
|-> remote KV transfer
`-> miss and recompute
路由分数不能只看命中率,可综合 saved_prefill_ms - queue_ms - transfer_ms。例如命中副本要排队 120 ms,而空闲副本重算前缀只需 45 ms,就应放弃亲和性。对于私有数据,目录和块都必须按租户或权限域隔离,不能为命中率跨越授权边界。
完整版教学
这道题的重点不是再次解释 Prefix Caching,而是回答缓存分散在多个 Worker 后,请求如何找到它、是否值得搬运,以及怎样避免错用旧缓存。
一、先区分单机复用与分布式复用
单机前缀缓存只需在本地块表里做最长前缀匹配。多副本场景中,同一个前缀可能只存在于 Worker A,新请求却被普通负载均衡分到 Worker B,于是逻辑上可命中、物理上却重新 Prefill。
因此分布式方案多了三个问题:缓存位置发现、亲和路由和跨节点传输。它们的开销可能超过复用收益,不能用单机命中率直接推导集群收益。
二、缓存键和权限域怎样定义
键应从 Tokenize 后的连续前缀块计算,并绑定所有会改变 KV 的执行条件。典型命名空间可以写成:
namespace = tenant_or_acl_scope + model_revision + adapter_revision
key_i = hash(namespace, tokenizer_version, rope_config, key_(i-1), token_block_i)
采样温度通常不改变给定前缀的 KV,但模型权重、Adapter、位置偏移和多模态编码会改变。即使内容哈希相同,权限域不一致也不得共享;内容寻址不是授权机制。
三、目录服务记录什么
目录记录块哈希或前缀根、持有 Worker、可用长度、模型版本、权限域和租约到期时间。它不必保存 KV 内容,只用于生成候选位置。
目录可以是中心索引、分片哈希表或由路由器维护的近似摘要。强一致目录代价往往过高,实际可接受短暂假阳性:路由到 Worker 后发现块已淘汰,再安全回退 Prefill;但绝不能接受跨版本或跨权限误命中。
四、Cache-Aware Routing 如何决策
路由器应比较命中收益和等待代价,而不是始终追随缓存。一个可解释的简化分数是:
net_gain(worker) = estimated_saved_prefill_ms
- predicted_queue_ms
- remote_transfer_ms
- imbalance_penalty
若 Worker A 可命中 4K Token、预计省 80 ms,但排队 120 ms;Worker B 无命中、立即执行并在 45 ms 内完成 Prefill,则选择 B 更快。为防热点,通常设置最大等待阈值,并在多个命中副本之间按队列 Token 做负载均衡。
五、本地命中、远程拉取还是重算
本地引用只修改块表和引用计数,通常成本最低。远程复用要传输 KV,成本近似为:
transfer_ms ≈ kv_bytes / effective_bandwidth + serialization_and_setup_ms
假设前缀 KV 为 2 GiB、有效网络带宽 20 GiB/s,仅数据传输下界约 100 ms;若本地重新 Prefill 只需 60 ms,搬运并不划算。长前缀、慢 Prefill、高速 RDMA 或预先复制时,远程复用才更可能获得净收益。
六、缓存应该复制还是分片
高频公共模板可主动复制到多个副本,降低热点和故障影响,但会重复占用显存。长尾私有前缀适合只保留一个或少量副本,依赖亲和路由;纯分片节省容量,却会提高错过位置和单点失效的概率。
| 放置方式 | 优点 | 代价 | 适合对象 |
|---|---|---|---|
| 多副本复制 | 路由灵活、抗故障 | 重复占用显存 | 高频公共前缀 |
| 一致性哈希归属 | 位置稳定 | 热点与迁移 | 大量私有会话 |
| 按收益动态放置 | 资源效率高 | 控制面复杂 | 混合长尾流量 |
七、淘汰和目录一致性如何配合
Worker 淘汰块后应异步撤销目录记录;目录仍返回旧位置时,Worker 必须以本地块元数据为准并回报 Miss。模型发布、权限撤销或租户删除则不能等待普通 TTL,应使整个命名空间立即不可命中。
淘汰价值可综合预计复用、节省的 Prefill 时间、占用字节和复制数。只用 LRU 容易保留最近访问但体积巨大、收益很低的条目,也无法表达公共热点需要多副本的事实。
八、怎样处理故障与重试
Worker 故障时,目录要让其租约过期,路由器转向其他副本或重新 Prefill。请求重试不能假设原 Worker 的会话 KV 仍存在;必须携带可重建的 Token 历史或由上层明确返回不可恢复状态。
远程传输途中失败时,不得暴露半写入块。可先写入不可见暂存区,完成校验后原子发布块表引用,并用模型版本、长度和摘要校验完整性。
九、多租户安全为什么是硬边界
目录查询本身可能泄露“某个前缀是否出现过”,命中延迟也可能形成时序侧信道。私有前缀应使用独立权限命名空间,目录 API 不向非授权主体暴露存在性。
共享公共系统模板可以白名单化,但用户文档、会话历史和工具结果不应仅凭相同哈希跨租户复用。删除与权限变更要覆盖 GPU 块、CPU/远程层和目录副本,并留下审计记录。
十、如何压测和验收
回放真实的前缀长度、重复率、到达率和副本数,分别测本地命中、远程命中、目录陈旧、热点 Worker、模型升级与节点故障。基线必须是无分布式共享但负载均衡正常的系统。
至少报告请求命中率、命中 Token 比例、避免计算的 Prefill Token、目录查询时延、远程传输字节、路由排队、TTFT P95/P99、显存占用和错误命中数。错误命中必须为零;命中率升高但 TTFT 因热点恶化,也不算成功。
十一、常见误区与追问
- 误区:发现缓存就一定要路由过去。 应比较节省的 Prefill 与排队、传输和负载倾斜成本。
- 误区:集群请求命中率等于节省比例。 命中长度、远程成本和缓存占用共同决定净收益。
- 误区:内容哈希相同即可跨租户共享。 权限域必须先一致,哈希只证明内容标识相同。
- 误区:目录必须强一致才能正确。 位置记录可短暂陈旧并安全回退,但版本与授权校验必须在使用点强制执行。
- 误区:把所有缓存都复制到所有 Worker 最快。 复制会挤占活跃 KV,并可能制造发布和失效风暴。
- 追问:何时值得远程传 KV? 当传输与排队成本明显低于重算 Prefill,且网络和权限边界满足要求时。
- 追问:如何避免缓存热点? 对公共热点做有限复制,并给亲和路由设置队列阈值和负载惩罚。
十二、加强记忆
先定键与权限域,再用目录找候选 Worker;路由比较“省下的 Prefill”与排队、传输、倾斜成本。本地引用最便宜,远程 KV 只有在搬运快于重算时才值得;热点前缀有限复制,长尾前缀稳定归属。目录可以陈旧并回退 Miss,但模型版本、块完整性和授权必须在使用点重新校验。最终看净 TTFT、命中 Token、传输成本与零错误命中,而不是只追求请求命中率。