论文:Idleness is Relative: Exploiting Tool-Call Idle Windows for Offloading in Agentic Systems with MORI 作者:Tian Xia, Hanchen Li, Zhifei Li, Xiaokun Chen, Hao Kang, Yifan Qiao, Yi Xu, Ion Stoica(UC Berkeley 等) 发表:arXiv 2026

TL;DR

问题:LLM serving 系统处理 agentic 工作负载时,KV cache 总量轻易超过 GPU HBM 容量,需要 offload 到 CPU DRAM。但 tool-call 持续时间差异巨大(毫秒到分钟),每次调用都重新放置 KV cache 不切实际。

方案:MORI 提出"idleness 是相对的连续光谱"——按 idleness 排序所有活跃程序,最忙的放 GPU,最闲的放 CPU,动态调整分区边界。

贡献:在 Claude Code 真实编码代理工作负载上,MORI 相比最佳 baseline 实现 20-71% 吞吐量提升18-43% TTFT 降低


核心洞察

1. Agentic 程序呈现两阶段结构

Agentic 程序在 System Prompt 和 User Input 之后,交替出现:

  • 推理 token(Reasoning Tokens)
  • 工具调用结果(Tool Call Results)

这种 推理 → 工具调用 → 推理 → 工具调用 的循环模式意味着 KV cache 需要在多个推理步骤间保持可用。

Agentic 程序结构

2. Tool-call 持续时间差异巨大

Tool-call 可以短至毫秒级(如简单计算),也可以长至分钟级(如等待用户反馈、文件 I/O)。这导致:

  • 无法用固定的 timer 触发 offloading
  • 短的 idle 窗口不值得转移 KV cache
  • 长的 idle 窗口可以充分利用

3. Idleness 是连续的相对光谱

传统方法的问题:

方法问题
LRU只考虑访问时间,无法区分 busy/idle phases
二元 busy/idle 标签不考虑程度——一个"稍微 idle"的程序和"完全 idle"的程序被同等对待

MORI 的核心洞察:idleness 是相对的。一个程序是否"idle"取决于它与其他活跃程序的相对比较,而非绝对阈值。


核心方法

Idleness 指标

MORI 定义程序的 idleness 为:

I(p)=Tidle(p)Ttotal(p)I(p) = \frac{T_{\text{idle}}(p)}{T_{\text{total}}(p)}

其中 TidleT_{\text{idle}} 是程序处于等待 tool-call 完成的累计时间,TtotalT_{\text{total}} 是总时间。

三层队列架构

MORI 将程序按 idleness 分配到三个层级:

MORI 三层队列架构

层级存储位置特征淘汰策略
GPU QueueGPU HBM最忙的程序Promote 最忙的
CPU QueueCPU DRAM较闲的程序Demote 最闲的
SwapDisk/NVM极度空闲的程序淘汰到磁盘

动态分区边界

MORI 动态调整 GPU/CPU 分区容量以匹配硬件容量比:

if GPU_pressure > CPU_pressure:
    # GPU 紧张,缩小 GPU 分区
    demote_top_k(k = f(GPU_pressure))
else:
    # CPU 紧张,缩小 CPU 分区
    promote_top_k(k = f(CPU_pressure))

准入控制

每层实施 admission control

  • GPU 层容量 = GPU HBM / 平均 KV cache size
  • CPU 层容量 = CPU DRAM / 平均 KV cache size
  • 超过容量的程序被 swap out

实验分析

实验设置

  • 工作负载:Claude Code 真实编码代理任务
  • GPU:H200 (80GB)、B200
  • 模型:Qwen-2.5 7B、Qwen-3 30B-A3B、Llama-3.1 70B
  • Baseline
    • SMG(SOTA 通用方法)
    • TA(Token Attention)
    • TA+O(TA + Offloading)

性能对比

H200 + Qwen-2.5 7B (DP=1)

H200 Qwen-2.5 7B 性能对比

指标MORI vs SMGMORI vs TA+O
Throughput+71%+20%
TTFT-43%-18%

H200 + Qwen-3 30B-A3B (DP=3)

H200 Qwen-3 30B 性能对比

在高并发(80 用户)场景下,MORI 的优势更加明显。

消融实验

MORI 的性能提升来自三个核心设计:

  1. 连续 idleness 排序:避免二元标签的粗粒度
  2. 动态分区边界:适应不同 GPU:CPU 容量比
  3. 分层队列架构:减少 promote/demote 开销

深度理解问答

Q1: 为什么 LRU 在 agentic 场景下效果差?

Agentic 程序有明显的 phase 特征——一个程序可能在一个阶段非常活跃(连续推理),在另一个阶段完全空闲(等待工具返回)。LRU 只考虑"最近访问",不考虑"当前是否在 busy phase"。一个刚被访问但正在等待 tool-call 的程序,应该被优先 demote 到 CPU,而不是留在 GPU。

Q2: 二元 busy/idle 标签为什么不充分?

假设系统有 5 个程序:3 个稍微 busy(idleness=0.2),2 个完全 idle(idleness=1.0)。如果 GPU 只能放 4 个程序,二元标签会把 3 个 busy 程序都放 GPU,但实际上可以放 2 个最忙的(idleness=0.2 的)和 2 个次忙的。把完全 idle 的程序 demote 到 CPU,GPU 上腾出的空间可以服务更多正在工作的程序。

Q3: MORI 的调度开销如何?

MORI 的调度开销主要来自:

  • Idleness 计算:基于采样,需要周期性更新
  • 队列维护:需要 O(N log N) 的排序开销
  • 数据迁移:KV cache 在 GPU/CPU 间的拷贝

论文未给出具体数值,但作者强调调度决策的频率远低于 tool-call 的频率,因此 amortized 开销可接受。

Q4: MORI 能扩展到更多 offloading 层吗?

论文 Discussion 部分提到,理论上可以扩展到 GPU → CPU → NVMe → Disk 的四级架构,但需要考虑:

  • 每增加一层,数据迁移延迟增加
  • 分区边界调整的搜索空间增大
  • 需要更精细的 idleness 预测模型

当前 MORI 只在 GPU+CPU 两层上验证。

Q5: MORI 对非 agentic 工作负载有效吗?

论文主要针对 agentic 工作负载(多轮推理+工具调用)。对于纯推理负载(无工具调用),MORI 的 idleness 指标会退化为请求间隔,无法发挥优势。但 MORI 的分层架构本身仍然有效,只是 idleness 的来源不同。


总结

核心贡献

  1. 问题发现:揭示了 agentic 工作负载的两阶段结构和 tool-call 持续时间的巨大差异
  2. 核心洞察:"idleness 是相对的连续光谱"这一新视角
  3. 系统实现:MORI——动态分层队列 + 相对 idleness 排序 + 自适应分区边界

局限性

  • 只在 GPU+CPU 两层验证,多层 offloading 需要进一步研究
  • Idleness 指标基于历史采样,对突发 workload 可能响应不及时
  • 调度开销未在论文中量化分析

适用场景

场景适用性
✅ Agentic AI serving强烈推荐
✅ 多租户 LLM 服务推荐
✅ 纯推理服务不适用(MORI 优势不明显)
❌ 单用户、低并发场景不需要(直接放 GPU 即可)

实践注记:MORI 的思想可以迁移到其他资源调度场景——当资源竞争时,不仅考虑"最近使用",还要考虑"当前是否真正需要"。