← 返回题目列表

分布式推理服务如何路由和共享 Prompt 前缀缓存?

困难 第 21 / 25 题 更新于 2026/09/25
Prefix CachingCache Affinity分布式缓存请求路由
学习 AI 实战项目

简化版

单机知道“前缀相同可复用 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、传输成本与零错误命中,而不是只追求请求命中率。