推荐系统的大模型推理加速:从双塔召回到多路融合的延迟压缩与特征缓存工程

📅 2026/7/19 1:19:02
推荐系统的大模型推理加速:从双塔召回到多路融合的延迟压缩与特征缓存工程
推荐系统的大模型推理加速从双塔召回到多路融合的延迟压缩与特征缓存工程一、推荐系统的推理压力当 100 毫秒需要完成 1000 次模型推理推荐系统的推理场景与对话式 AI 有本质区别。对话式 AI 是单次推理——一个 Prompt 对应一个 Completion一个请求调用一次 LLM。推荐系统是批量推理密集型——首页推荐通常需要从百万级候选集中筛选出 20 条内容展示给用户。这个过程涉及召回粗排→ 精排 → 重排多样性打散三个阶段每个阶段的模型推理次数不同召回阶段用户向量与百万候选向量的相似度计算ANN 近似最近邻搜索精排阶段Top-500 候选的 CTR/CVR 预估500 × 10ms 5000ms 串行重排阶段Top-50 候选的序列优化MMR 多样性、时长、间隔精排阶段的串行推理是延迟的最大瓶颈。即使是轻量级的 WideDeep 模型参数量 10M单次推理 2ms串行推理 500 个候选也需要 1000ms——远超推荐系统的延迟预算通常在 100-200ms。解决这个问题的核心手段是批量推理Batching——将 500 个候选的特征打包成一个 Tensorshape[500, feature_dim]在 GPU 上一次 Forward 推理延迟从 500×2ms1000ms 降至约 15ms包含 I/O 传输和 CUDA Kernel Launch 开销。批量推理要求所有候选的特征维度一致且整批数据能一次装入 GPU 显存。对于参数量 10M 的小模型来说500 个候选的特征 Tensor 约 20MB500 × 128 × 4 字节 float32在 A10 的 24GB 显存中微不足道。二、特征缓存的多级工程Embedding Table 的 GPU 驻留与增量更新graph LR subgraph 离线训练 A[用户行为日志] -- B[Embedding 训练br/日级更新] B -- C[(Embedding Tablebr/1 亿 User 500万 Item)] end subgraph 在线推理 D[用户请求] -- E{Embedding Lookup} C -- E E --|用户向量| F[GPU 显存缓存br/热点 User Embedding] E --|Item 向量| G[GPU 显存缓存br/全量 Item Embedding] F -- H[精排模型推理] G -- H H -- I[推荐结果] end style F fill:#40c057,stroke:#2f9e44 style G fill:#40c057,stroke:#2f9e44Embedding Table 是推荐系统推理性能的核心——一个典型的推荐模型有数百个特征用户年龄、性别、兴趣标签、历史行为序列Item 类目、价格、CTR 历史。每个稀疏特征对应一个 Embedding 向量通常 16-128 维。全量的 Embedding Table 可以非常大——1 亿用户 × 128 维 × 4 字节 51GB超出了一般 GPU 的显存容量。将 Embedding Table 全部放在 GPU 显存中不现实。分层缓存策略是热点用户 Embedding 缓存最近 7 天活跃用户的 Embedding 在 GPU 显存中约占用 5-10GB和全量 Item Embedding 缓存Item 基数远小于用户——500 万 Item × 128 × 4 2.5GB可全部放在 GPU 显存中。非热点用户的 Embedding 从 CPU 内存或远程 Parameter Server 按需加载——第一次访问慢PCIe 传输或网络 RPC但后续命中 GPU 缓存后加速。缓存替换使用 LRU 策略7 天未活跃用户的 Embedding 被驱逐。Embedding 的增量更新是特征缓存的又一个工程挑战。用户的最新行为如 5 分钟前刚点了一个广告需要反映到 Embedding 向量中——但每天离线训练的 Embedding 需要数小时才能更新。解决方案是在线学习Online Learning——在推理服务中实现轻量级 Embedding 的实时梯度更新。当用户点击广告后推理服务不是立即更新全局 Embedding Table而是在本地的 Embedding 缓存中做快速微调如梯度 × 学习率 0.001同时将梯度异步发送给 Parameter Server 做全局聚合。这保证了 Embedding 的实时性同时避免了推理延迟的增加。三、GPU 多模型混部精排、粗排、重排在同一张卡上的资源隔离推荐系统的多个模型召回模型、精排模型、重排模型在 GPU 上的混部是一个资源管理挑战。小模型10M-100M 参数单个只占用 1-2GB 显存和 10-20% 的 SM 利用率但 5 个小模型在同一张 GPU 上需要完整的资源隔离。NVIDIA MPS多进程服务是主要的混部工具。它允许多个 CUDA 进程并发执行 Kernel通过时间片轮转Round-Robin调度 SM 资源。在推荐场景中MPS 的优势是允许精排和重排模型共享 GPU——当精排模型在等待特征 I/O 时可能有数毫秒的 CPU→GPU 传输时间MPS 可以切换到重排模型执行一个轻量 Kernel。GPU 的 SM 利用率从 35% 提升至 65%。MPS 的风险是没有显存的硬件隔离——多个进程共享一块 GPU 显存如果一个进程的显存越界如通过cudaMalloc分配超过限额会影响同一个 GPU 上的其他进程。需要通过 cgroup 的 GPU 显存限制cgroup.memory.max或 NVIDIA 的显存限制功能nvidia-container-runtime --gpu-memory-limit来防范。在 Kubernetes 中通过 GPU Operator 的 Time-Slicing 配置将一张 GPU 拆分为多个逻辑 GPU如nvidia.com/gpu.shared: 4每个模型获得一个虚拟 GPU。Time-Slicing 不是 MPS——它在不同的 CUDA Context 间做进程级切换开销更大100-200μs 的切换延迟但提供了更好的进程隔离。四、多路召回融合的延迟优化并行调度与超时熔断推荐系统的召回通常融合 5-10 个不同策略的召回通道协同过滤、向量召回、热度召回、新品召回、位置召回。每个召回通道是一个独立的服务或计算单元在精排之前必须全部返回。最简单但最差的实现是串行调用——等召回 A 返回后再调召回 B总延迟 Σ 所有召回延迟。正确做法是并行调度——所有召回通道同时发起使用sync.WaitGroupGo或asyncio.gatherPython等待全部返回。总延迟 max(每个召回延迟)。但这带来了「最慢通道拖累全体」的问题——如果召回 A热度召回Redis 查询3ms和召回 B复杂向量检索Faiss 索引扫描50ms一起等待总延迟被 B 的 50ms 卡死。超时熔断是应对慢召回的策略。为每个召回通道设置独立超时如召回 B 超时 30ms。如果 30ms 内未返回该通道的结果被丢弃——宁可少一个召回通道的候选也不让最慢的通道拖累全局延迟。熔断发生时监控记录该通道的超时比例——如果某个通道的超时率持续 10%说明通道需要扩容或降级如用更轻量的模型替代。五、总结推荐系统的大模型推理加速是一个多层次工程Embedding 缓存显存/CPU/Parameter Server 三级存储解决海量特征 I/O 瓶颈批量推理GPU batching解决精排的串行延迟多模型混部MPS提升 GPU 利用率多路召回的并行调度 超时熔断保证全局延迟上界。Embedding 的实时性通过在线学习本地快速微调 异步全局聚合保证——用户的最近行为在 5 秒内反映到推荐结果中。这个链路中的关键风险是异步全局聚合的延迟——如果 Parameter Server 的网络延迟过高最新的 Embedding 更新可能延迟 10 秒以上才全局生效导致用户在刷新时看到与之前相同或相似的推荐。多路召回的超时熔断将「完整性」交换为「延迟确定性」。对于绝大多数推荐场景缺失 1-2 个召回通道的候选对整体推荐质量的影响 5%召回通道间有候选重叠丢失的可以被其他通道补充。在延迟确定性和召回完整性之间推荐系统应坚定地选择前者——用户等待 100ms 的耐心远低于少看一条相关内容的损失。这是推荐系统工程中最重要的取舍之一。