Kimi K3 百万token的agentic RL怎么做?

第一步 · SFT 冷启动:给 RL 打一个高质量地基

K3 在前代 Kimi 的 SFT pipeline 基础上扩大数据集,大幅拓宽了对复杂 agentic 任务的覆盖。

  1. 合成数据轨迹。用前代 Kimi 系列的 domain-specialized 模型(各领域专门模型)批量合成 agentic 交互轨迹——让"已经很强的老模型"当数据生产者,快速铺出覆盖广、难度够的训练轨迹。
  2. 多阶段验证 + human-in-the-loop 标注。合成的轨迹不是直接用,而是过多阶段自动验证筛掉低质量样本,再叠人在环的人工标注把关,保证轨迹的正确性与可用性。
  3. XTML 统一序列化。复杂 agentic 轨迹(多轮 reasoning + 工具调用 + 观测回灌)结构杂、难对齐,K3 用自研 XTML chat template(eXtensible Token Markup Language,可扩展 token 标记语言,详见论文 §F)把所有数据统一序列化成一致格式,让训练能稳定地喂进这些异构轨迹。
  4. 从 SFT 起就上 QAT。从 SFT 阶段开始就做量化感知训练(QAT):MXFP4 权重 / MXFP8 激活——训练时看到的就是上线时的低精度数值分布,从根上消除"训练用高精度、推理用低精度"的 train-inference mismatch。
四步合起来,产出一个大规模 instruction dataset,赋予 K3 三样冷启动能力:自适应推理(adaptive reasoning)、精准工具调用(precise tool calling)、长程 agentic 场景的稳健执行

第二步 · 百万 Token RL

核心决策:不为每个单独任务各训一个专门 RL 模型(❌ per-task specialized RL),而是把 RL 跨三大广域 domain 一起 scale,每个 domain × 每档 reasoning effort 只训 1 个 expert —— 3 domain × 3 effort = 9 个 expert
3 大 domain(含全部子任务模块) low effort high effort max effort
通用 general
通用体验 · 视觉 · 推理 · 忠实性 faithfulness · 搜索 · 知识工作
E1
gen · low
E2
gen · high
E3
gen · max
通用 agent general agents
长程助手 long-horizon · 深度研究 deep research · 段落级写作
E4
ag · low
E5
ag · high
E6
ag · max
编程 agent coding agents
软件工程 SWE · 编程体验 · 算子内核 kernel · Web 开发
E7
code · low
E8
code · high
E9
code · max

RL FLOPs 增加,这三大 domain 在 knowledge / reasoning / vision / general agent / coding 上一致提升,平均 tool-call 步数也持续上升——"多花算力做 RL"确实换来"更会用工具、更强"

Figure 8

RL 阶段的四件套算法

partial rollout · Reasoning-Effort RL · Agentic GRM · MOPD 蒸馏
long-horizon 任务(比如一个 deep research 要调几十次工具)最大的痛点是拖尾:一批任务里总有几条特别慢,你若非等它们全跑完才更新策略,GPU 就一直空等那几个"钉子户"。partial rollout 的思路很朴素——跑完一大半就先开饭,剩下没跑完的下顿接着热
图1 · Partial Rollout|跑完一大半先开饭 N prompt × K 轨迹并行生成 暂停闸门 λ完成即停 已完成 λNK 条 policy 优化 · 先开饭 prompt 的 K 条凑齐整组 dispatch (K2.5) 未完成 (1-λ)NK 未完成入队 sandbox 存现场 下一轮优先恢复,接着跑 long-horizon 轨迹横跨多个 iteration 才跑完 ⇒ 数据极端 off-policy(陈旧) K3 解法 · per-token 邻域约束 每步更新只允许在旧策略局部邻域内小步走 —— 用「每步小步走」的稳定换「不必等齐」的吞吐
不拖尾的代价是吞下极端 off-policy:λ 一到就开饭、未完成回队接着跑,靠 per-token 邻域正则兜住稳定。
  1. 每个 iteration 取 $N$ 个 prompt,每个 prompt 采 $K$ 条轨迹(completion),一共 $N\times K$ 条活跃轨迹并行生成;
  2. 不等全部结束——一旦有 $\lambda\in(0,1)$ 比例(即 $\lambda NK$ 条)轨迹完成,生成阶段就暂停,让 policy optimization 先跑起来,不被 execution straggler 拖住
  3. 但 dispatch 的粒度是 prompt,不是单条轨迹:某个 prompt 的全部 $K$ 条 response 一旦都完成,就立即整组打包送去策略优化(这一步遵循 Kimi K2.5 的算法)——保证同一 prompt 的 $K$ 条能凑成一组做组内比较,而不是零散地喂;
  4. 被暂停(没跑完)的 rollout 入队,下一轮优先恢复接着跑,靠 sandbox 基础设施(§5.3.2)保存现场;
  5. 后果:一条 long-horizon 轨迹横跨好几个 iteration 才生成完,等它跑完时当初那版策略早已更新了很多步——数据变得极端 off-policy(陈旧)
同一道题,有人两句话答完,有人写满三页草稿。reasoning effort 就是"允许模型想多久"这个旋钮。K3 的洞察是:别让模型自由发挥,而是给每题定一个 token 预算,超支就扣分,从而把"想的深浅"训练成一个可控维度。
图2 · Reasoning-Effort RL:把「想多深」训成可控维度 问题 x 冷启动模型 估预算 b₀(x) 候选 rollout · 话痨程度不同 阈值 τ·b₀(x) y₁ y₂ y₃ reward = −1 未超阈值 → 正常给分 超阈值 → 话痨即罚 −1 reward(y) = −1 if T(y) > τ·b₀(x) T(y) general:数 thinking token T(y) agentic:数累积输出 token stage-wise 退火课程:τ 由宽松逐步收紧 → 分档蒸馏三档 effort 专家 max-budget 专家 τ 宽松(想很深) high-effort 专家 τ 收紧 low-effort 专家 τ 最紧(想很浅)
per-problem 预算 b₀(x) + 超支一律罚 −1 + τ 退火,把 effort 从不可控副作用变成能分档蒸馏的显式控制轴。
  1. 对每个问题 $x$,由冷启动模型估一个初始 token 预算 $b_0(x)$(这题大概该花多少 token);
  2. 某条轨迹实际花的总 budget $T(y)$ 若超过阈值 $\tau\cdot b_0(x)$,就把它的 reward 直接覆盖为 $-1$(不管对不对,话痨就罚);
  3. $T(y)$ 口径分场景:general 数 thinking token,agentic 数 累积输出 token(含 reasoning + tool-call 参数);
  4. stage-wise curriculum:先用大 $\tau$(宽松预算)训 max-budget 变体,再逐步退火 $\tau$(收紧)得到 high / low effort 专家。
reward$(y) = -1 \ $ if $\ T(y) \gt \tau\cdot b_0(x)$ —— 话痨判负
写作、deep research 这类任务没有标准答案对拍,没法像数学题那样自动判对错。K3 沿用 K2.5 的锦标赛式二元比较:让一个 judge 模型两两 PK 候选答案。但裁判本身会犯懒——容易"谁写得长判谁赢",于是要给裁判上强制协议话痨预算
图3 · Agentic GRM:不可验证任务怎么打分 锦标赛·二元比较 候选 A (无标答) 候选 B (无标答) vs Judge 模型 两两 PK 四步 rubric-scorepad 协议(强制) ① 读产出 完整读候选 ② 生成 rubric 现场列评分细则 ③ 逐条打分 按 rubric 每条评 ④ 记入 scorepad 据此判胜负 verbosity 闸门 · 反 hacking 长度超限 → 自动判负 len > σ·ℓ0 → 判负 ✗ ℓ0 基线长度 · σ 倍率上限 本场胜者 (据 scorepad) 超限则否决
裁判必须先立 rubric 再逐条打分,且谁话超过 σ·ℓ0 直接取消资格,从制度上堵死"堆字取胜"。

judge 被强制走四步 rubric-scorepad 协议:①读产出(先完整读候选)→ ②生成 rubric(现场列评分细则)→ ③按 rubric 打分(逐条对着细则打)→ ④记入 scorepad(据此判胜负)。防 reward hacking:引入 verbosity 预算控制——某输出长度超过 $\sigma\cdot\ell_0$ 就自动输掉这场比较,不给它靠堆字取胜的机会。

现在手里有 9 个专家(3 domain × 3 effort),但上线只能部署一个模型。MOPD(Multi-Teacher On-Policy Distillation)让一个 student 同时拜这 9 位师傅:当前采样属于哪个 domain $d$、哪档 effort $e$,就听对应那位老师 $\pi_{teacher}^{(d,e)}$ 的。整个过程 on-policy(用 student 自己当前生成的轨迹),蒸馏信号做成 per-token 的 dense reward,直接塞进现成 RL 框架,兼容前面的 partial rollout。
$r_{opd}^{d}(y_t \mid e, x, y_{\lt t}) = \mathrm{clip}\!\left(\mathrm{sg}\!\left(\log \frac{\pi_{teacher}(y_t \mid x, y_{\lt t})}{\pi_\theta(y_t \mid e, x, y_{\lt t})}\right), -R_{max}, R_{max}\right)$
  • $r_{opd}^{d}$:domain $d$ 上的 on-policy distillation per-token reward(逐 token 发放);
  • $\log \frac{\pi_{teacher}}{\pi_\theta}$:teacher 与 student 的对数概率比——teacher 觉得更该出的 token,值为正,变正向奖励;
  • $\mathrm{sg}(\cdot)$:stop-gradient,只当数值奖励用,不让梯度从这里回传;
  • $\mathrm{clip}(\cdot,-R_{max},R_{max})$:裁掉极端 log-ratio 造成的巨大 advantage,防训练打飞。
本质:让 student 在"teacher 高概率、自己却低概率"的 token 上被推着对齐——把 log 概率比当每个 token 的 dense reward,分歧越大奖励越强,一 token 一 token 地学到 teacher 的行为。
▸ MOPD 一步的最小骨架(论文未放代码,按 Eq.15 复现 reward 计算)

主线:采样属于哪个 (domain, effort) → 选对应 teacher → 逐 token log-ratio 当 dense reward → 喂进 RL。

d, e = sample_domain_and_effort()        # 采样域 d 与 effort 档 e ∈ {low,high,max}
teacher = EXPERTS[(d, e)]                 # 9 个专家里选对应那位, 冻结
y = student.generate(x, effort=e)         # on-policy: 用 student 自己当前生成轨迹

rewards = []
for t in range(len(y)):
    logp_teacher = teacher.logprob(y[t], x, y[:t])      # teacher 在该前缀下的 log 概率
    logp_student = student.logprob(y[t], x, y[:t], e)   # student 在同前缀 + effort 下
    r = stop_gradient(logp_teacher - logp_student)      # sg(log(π_teacher/π_θ))
    r = clip(r, -R_MAX, R_MAX)                          # 裁掉极端 advantage 稳训
    rewards.append(r)                                   # per-token dense reward

loss = policy_gradient_loss(student, y, rewards)        # 兼容 partial rollout

三处关键:(1) EXPERTS[(d,e)] 体现"多 teacher",每步只用一位;(2) stop_gradient 是 Eq.15 的 sg,log-ratio 只当数值奖励;(3) rewards 是 per-token——这正是它能"无缝接进 RL + 兼容 partial rollout"的原因。作者试过更精细的 top-k distillation(对齐 top-k 分布),但没有明显收益,遂保留这个更简洁的单 token log-ratio 方案。

Environment Scaling — RL 真正的护城河

任务与环境怎么"造"出来:(A) 用什么壳跑 → (B) 任务从哪来 → (C) 拿什么打分
前面 partial rollout / reasoning-effort / MOPD 都是"怎么训"的招式。但 agentic RL 有个比算法更卡脖子的问题:训练信号从哪来?数学题有标准答案可对拍,可"帮我把这个 3D 相机维修系统复刻成网页""做一次尽职调查写份投行报告"这类长任务,既没现成数据集,也没有一个函数能告诉你"做对了没有"。K3 花整整一章(§4.2)讲一件事:如何大规模地"制造"可验证、够多样、难度可控的任务与环境——与其说 K3 赢在模型,不如说赢在能把环境本身 scale 起来
这套环境工程拆成三层看:(A) 用什么壳跑(统一 white-box 环境)→ (B) 任务从哪来(知识图谱驱动合成)→ (C) 拿什么打分(五类可验证环境 + 反 hacking)。下面每一层各配一张机制图,逐层拆开看。
图4A · Environment Scaling (A):统一 white-box 环境 agent harness → 可组合模块 工具接口 system prompt 上下文管理 skills memories subagents 组合 配置 配置实例化 → 主流壳 Kimi Code Claude Code Codex OpenClaw Hermes 也能拼出全新的壳 训练时动态换壳 逼模型学「通用 agent 能力」 而非某个壳的肌肉记忆 ⚠ 防过拟合 固定单壳 → 过拟合那套习惯 训练中不断重组、动态重配
harness 拆成可组合模块,按配置拼各种主流壳,训练时动态换壳——逼模型学通用 agent 能力而非过拟合单一壳。
踩过的坑:如果 RL 全程只用一种固定的 agent harness(工具 schema、system prompt、上下文管理、交互协议都写死),模型会过拟合到这套壳的习惯——换个 harness 就变笨。这在 agentic RL 里是隐性但致命的问题。
  1. 把 harness 拆成可配置模块。K3 把一个 agent harness 抽象成一堆可组合模块:工具接口、system prompt、上下文管理策略、skills、memories、subagents 等。
  2. 靠配置实例化主流壳。把模块按不同方式组合,就能拼出 Kimi CodeClaude CodeCodexOpenClawHermes 等主流 harness,也能拼全新的壳。
  3. 训练时动态换壳。RL 中给不同任务组动态构造不同 harness 配置,逼 K3 学"通用 agent 能力"而非"某个壳的肌肉记忆"。
图4B · Environment Scaling (B):任务从哪来 · 知识图谱驱动合成 agent 递归深挖 · 逛图复用等价概念 种子 / 领域 主题 A 主题 B RoPE GPU kernel attention 边:粗概念 → 细概念(coarse → fine) 采样 keyword set { RoPE · GPU kernel } + 祖先节点上下文 拼 query web query → 互联网检索 学术文章 · 博客 · 代码库 合成 agent 产各类任务 Coding Knowledge Vision ① agent 自建概念树 ② 分层采样 keyword ③ 检索真实材料 · 合成
让 agent 自己长出一棵不断扩张的概念树,从不同粒度采样节点去检索真实材料合成任务——把"任务从哪来"变成可无限扩张、粒度可调、覆盖可控的自动流水线。
任务的质量和多样性,本质由源材料决定。K3 的思路:与其人肉找素材,不如让 agent 自己长出一棵不断扩张的"概念树",再从树上采样概念去检索真实材料、合成任务。细粒度概念能挖到专业、冷门知识;跨概念采样保证领域覆盖广。
Figure 9
Figure 9. 层级化知识图谱把概念从粗(领域)到细(细粒度概念)组织;采样相关节点组成 keyword set(如 RoPE / GPU kernel),去互联网检索公开材料(学术文章 / 博客 / 代码库),每个合成实例再选一种任务类型(Coding / Knowledge / Vision …)合成对应任务。
  1. 建图:agent 递归自演化。知识图谱是一张有向无环图(DAG),从粗粒度种子节点出发。每个节点派一个 agent 做多轮 web search 深挖;加新节点前先逛一遍现有图找等价/相关概念、尽量复用。边永远粗概念→细概念,节点足够原子就停止分裂。
  2. 采样:控制粒度与覆盖。为命中目标的领域/任务类型分布,在不同粒度层采样节点——可单独采,也可采一组相关节点。
  3. 检索 + 合成。用采样节点关键词 + 其在图中祖先节点上下文拼 web query 抓真实材料;合成 agent 据此产出各类任务。
为什么这招关键:它把"任务从哪来"从人工出题变成可无限扩张、粒度可调、覆盖可控的自动流水线——图越长越大,能造的任务就越多越专。这是 environment scaling 的引擎。

有了壳和任务,还得有可靠的 reward。K3 针对不同能力造了五类专门环境(§4.2.3–4.2.7),核心原则贯穿始终:reward 必须 robustly verifiable,且防得住 reward hacking。(注:low/high/max reasoning-effort 是叠加在这些环境之上的"想多深"维度,不是独立环境类型。)下面逐类拆开详讲。

① 可验证 agentic 问题(§4.2.3)

三类任务共性是产出可验证答案多步复杂信息搜索(model 规划 research、逐步从 web 搜证据、产出可对拍的 verifiable answer);专业日常工作(投行 / 数据分析 / 法律——把复杂请求分解、在 sandbox 里操作领域工具、跨几十到几百步完成一份 deliverable);多步视觉推理(STEM 题 / 视觉谜题 / 图表理解)。视觉推理尤其精巧:在带 Python 解释器的隔离 sandbox 里,模型迭代写代码执行去 crop / zoom / transform 输入图像、精算、验证中间结果,并把执行输出(含生成的图)当作新观测喂回——图像操作与观测越多,视觉推理越强。

可验证 agentic 问题 · Verifiable Problems in Agentic Environments 三类任务都产出可验证答案:搜索对拍 · 专业交付 · 视觉推理迭代 多步复杂 信息搜索 model plan research web search ×多步 gather evidence verifiable answer 对拍验证 专业日常工作 投行/数据/法律 分解复杂请求 sandbox 操作 领域工具 deliverable 交付 跨几十~几百步 多步视觉推理 STEM·图表·谜题 model 写代码 isolated Python sandbox 执行 crop / zoom / 精算 执行输出 + 生成图 = 新 observation 执行结果回灌为新 observation · 多轮迭代 图像操作越多 → 观测越多 → 视觉推理越强
三类任务都落到可验证答案:搜索多步对拍答案、专业工作在 sandbox 产出 deliverable、视觉推理靠 Python sandbox 迭代操作图像并把执行结果当新 observation。

② GPU Kernel 优化(§4.2.4)

任务谱系从单算子 kernel融合 mega-kernel,源自 Flash Linear Attention 等高质量 GitHub repo;覆盖 CUDA / Triton / CuTe DSL / Gluon / ThunderKittens / TileLang 多种编程方式与 BF16 / FP8 / FP4 数值格式。reward 兼看正确性 + 性能:每个 kernel 带 PyTorch reference,解超过数值误差阈值直接给 0;性能对标专家实现——追平给 0.5逼近硬件 roofline 趋近 1。再配一套 hacking-detection 系统,惩罚 CUDA graph replay / 输入缓存 / 降精度 等作弊,并随开发中发现新作弊持续加防线。

GPU Kernel 优化:reward = 正确性(gate) + 性能 ① 任务谱系 · 数据源 单算子 kernel 融合 mega-kernel 源自高质量 GitHub 仓库 Flash Linear Attention GPU 编程语言 / 数值格式 CUDA Triton CuTe DSL Gluon ThunderKittens TileLang BF16 FP8 FP4 ② reward = 正确性 + 性能 先过正确性门,再按性能给分 1 0.5 0 ③ 逼近 roofline → 趋近 1 ② 追平专家实现 → 0.5 ① 数值误差超阈值 → 0 PyTorch reference 门禁 ③ 反 hacking 检测 罚作弊策略(持续扩充) CUDA graph replay input caching 输入缓存 precision reduction 降精度 发现新作弊策略 → 持续加新防线 罚0
reward 先过正确性门(超误差阈值判 0),再按性能给分:追平专家 0.5、逼近 roofline 趋近 1,并用 hacking-detection 罚 graph replay / 输入缓存 / 降精度等作弊。

③ 个人助理任务(§4.2.5)

为 long-horizon 助手造 Gmail / Notion / Slack / Canvas 的高保真 mock——保留真实应用核心语义,但可复现、可大规模交互,无需外部 API、无 rate limit。在此之上设计受真实职场流程(HR / 法律 / 金融)启发的复杂任务:agent 在一个持久、逐日演化的环境里跨多个模拟日操作,遇到跨应用分布的几十个相互依赖事件;单条 rollout 可达数千次工具调用、百万级 context token。每个事件自带评判(确定性规则或 LLM evaluator);初始工作区由 agent 自主搜网构建,RL 框架也被扩展以支持这种 living environment。

个人助理任务 · long-horizon(Personal Assistant Tasks) 高保真 mock 应用 Gmail email Notion docs Slack chat Canvas board 保留真实应用核心语义 可复现 · 大规模交互 无外部 API · 无 rate limit 持久 · 逐日演化环境 跨多个模拟日 (multiple simulated days) 持续演化 数千次 tool calls 百万级 context token interdependent events(几十个 · 跨 app) Day 1 Day 2 Day 3 单条 rollout 跨日累积 · 事件相互依赖 RL 框架扩展以支持 living environment(事件流 + 世界状态转移) 每个事件自带评判 确定性规则 deterministic rules LLM-based evaluator 每事件挂一个判分器 初始工作区 agent 自主搜网构建 连贯 · 任务相关环境 RL 框架扩展支持 living environment: 事件流 + 状态转移
Gmail/Notion/Slack/Canvas 做成高保真 mock,构成逐日演化、几十个相互依赖事件的持久环境,单 rollout 数千工具调用/百万 context,每事件自带确定性或 LLM 评判。

④ AET 自主执行(§4.2.6)— 最能体现"造环境"野心的一类

AET 设定近乎苛刻:每个任务只给 agent 五样东西——初始状态、一个受约束的目标、基于工具的动作空间、执行预算,外加一个独立的 verifier不给参考轨迹、不给预定义流程。agent 只看到目标、上下文、约束与验证接口,必须自主完成任务分解 / 工具选择 / 规划 / 错误恢复 / 终止判断,训练出一个通用闭环:假设 → 行动 → 分析反馈 → 调整

AET 自主执行 · Autonomous Execution Tasks 任务只给五样 · five inputs ① 初始状态 initial state ② 受约束目标 constrained goal ③ 工具动作空间 tool-based action space ④ 执行预算 execution budget ⑤ 独立 verifier independent verifier ✕ 不给参考轨迹 · ✕ 不给预定义流程 agent 自主:分解/选工具/规划/错误恢复/终止判断 agent verify-in-the-loop 闭环 hypothesize 假设 act 行动 analyze 分析反馈 adapt 调整 迭代提交 solution 收 verifier feedback 改进 reward 锚 verifier 评「环境最终状态」 非 agent 自称完成(堵自我报告作弊) 三类 verifier 黑箱系统复刻 black-box replication · Fig.10 相机维修 定量因子发现 quantitative factor discovery 税务审计 tax auditing 反 hacking 三招 (a) 隔离 isolation agent ↔ verifier (b) public verifier 诊断反馈 + hidden verifier held-out 防过拟合 (c) 有限提交预算 惩罚式 reward under budget
AET 只给五要素(初始态/受约束目标/动作空间/预算/独立 verifier),逼 agent 自主跑 hypothesize→act→analyze→adapt 闭环;reward 锚最终状态,靠隔离 + public/hidden verifier + 惩罚式 reward 反作弊。
  1. reward 锚在环境的最终状态,而非 agent 自称"我做完了"——堵死"自我报告式"作弊。
  2. 多类 verifier 支持多样环境:黑箱系统复刻(Figure 10 相机维修系统)、定量因子发现、税务审计。
  3. 三重反 hacking:(a) agent 与 verifier 隔离;(b) public verifier(给诊断反馈)配 hidden verifier(评 held-out 场景,防过拟合公开检查);(c) 有限提交预算下用惩罚式 reward

⑤ Web 开发(§4.2.7)

专家精选的 web 开发任务:输入从一行场景描述多段规格;产物涵盖网站 / 交互游戏 / 3D·WebGL / 数据可视化 / SVG / 全栈应用。每个任务跑在容器化 sandbox,且在多种 agent scaffold(而非单一固定 harness)下 rollout,促跨 scaffold 泛化。reward = 确定性检查 + 模型判分两部分:确定性检查功能测试应用行为、复刻类打结构与像素级相似度;模型判分用其它模型做源码审查、看/交互产物。build 失败、运行报错、或假装实现(fake 而非 implement)→ reward 直接清零。

图C-⑤ · Web 开发 · sandbox + 多 scaffold rollout 输入谱系 一行描述 场景规格 多段 specification 由短到长: 一行 → 多段 spec 产物 artifacts 网站 交互游戏 3D·WebGL 数据可视化 SVG 全栈应用 容器化 sandbox 每任务隔离运行 · rollout scaffold A scaffold B scaffold C 跨 scaffold 泛化 reward = 确定性检查 + 模型判分 确定性检查 deterministic checks 功能测试 app 行为 复刻类: 结构 + 像素级相似度 模型判分 model judging 其它模型: 源码审查 + 看/交互产物 build 失败 / 运行报错 / fake 假装实现 → reward 清零 = 0
输入从一行描述到多段规格,产物覆盖网站/游戏/3D·WebGL/可视化/全栈;容器化 sandbox 下多 scaffold rollout 促泛化,reward = 确定性检查(功能+像素相似度) + 模型判分(源码审查+交互),build 失败或造假直接清零。
一句话看懂 environment scaling 的价值:K3 把"agentic RL 该给什么信号"这个最脏最难的问题,变成一条可扩张的流水线——知识图谱负责造题量与覆盖,五类可验证环境负责给可靠 reward,white-box 壳负责防过拟合,hidden verifier + hacking-detection 负责防作弊。相比之下,换个 loss、调个 advantage 反而是小事。

Infra for 1M Agentic RL — 护城河的另一半在工程

在有限算力里把百万 token、多步 agentic RL 跑起来(论文 §5.3)
前面 Environment Scaling 解决"训练信号从哪来",但还有个同样脏的问题:把一个 Kimi K3 这么大的模型、拉到百万 token 上下文做 agentic RL,在有限算力预算下怎么跑得动?K3 把 资源效率 当成一等目标,砸了两块 infra:(1) 高效训练与 rollout(KV-cache 管理、请求调度、训练态摆放);(2) 高性能可续跑的 sandbox(长程交互)。

K3 用 co-located RL training(训练与 rollout 同卡)把每个 1M-context 实验压进几百张 GPU,再用 partial rollout 削超长轨迹的尾延迟。硬件利用率上去了,却带来一个新矛盾:要留给下一轮的 rollout KV-cache训练本身要的显存 互相抢地方——长上下文下尤其致命。三招各治一处:

co-located RL training + partial rollout —— 高硬件利用率 代价:rollout KV-cache(要留给下一轮)↔ 训练显存 争抢,长上下文尤甚 ▼ 三招:省显存 · 降尾延迟 ① External KV-cache pool write-back 设计 GPU KV cache active decoding 常驻 evict→write-back ↓ ↑ prefetch 回 GPU CPU DRAM 外部池 存可复用 idle prefix KDA state 对齐 MLA KV 块 生命周期一起 offload/prefetch 只为离开 active 的 prefix 付 DRAM+带宽,不冗余拷贝 训练态(w+opt) iter 后→NVMe ② Auto-throttling scheduler rollout 动态并发 · 反馈闭环 运行时信号 active / queued · KV util 调节阀 valve 动态控制发出请求数 inference engine 执行多步 rollout 闭环反馈 早期高利用,压力升则降并发 KV 压力↑ → 降并发 避免触发 preemption ③ Gradient-buffer reuse 非策略模型前向 reference model forward-only 太大 → 放 CPU 借用物化 policy FP32 grad-buffer 存前向,零额外分配 真梯度算出时覆盖回(安全) ZeRO-2:每 GPU 留 2 个 VPP chunk slot0 compute slot1 prefetch 逐 chunk 流式换入,隐藏拷贝开销
co-located + partial rollout 换来高利用率却引发 KV-cache 与训练显存争抢;write-back KV 池、auto-throttling、grad-buffer 复用三招把 1M-context RL 压进几百张卡。
  1. External KV-cache pool(write-back 设计)。1M-context 多步 rollout 下,一次 prefix KV-cache miss 极其昂贵;partial rollout 在每轮开头还会让上一轮没跑完的长 prefill 请求扎堆涌来,加上投机解码加速请求周转,prefix block 频繁 churn → 触发 preemption、拉低命中率。解法:把"prefix 保留"与"GPU 常驻"解耦——active decoding block 留在 GPU KV cache,可复用的 idle prefix 只在被逐出 GPU 时才 write-back 到 CPU DRAM 外部池,下次复用前 prefetch 回来(KDA state 与对应 MLA KV 块对齐生命周期一起搬)。比 write-through 只为"离开 active decode 的 prefix"付 DRAM 与带宽,不冗余拷贝仍活跃的块。DRAM 不够就在 iteration 结束后把训练态 offload 到 NVMe。
  2. Rollout auto-throttling scheduler(自动限流调度)。多步 rollout 里 context 随轨迹推进越来越长,按"整条轨迹平均长度"定固定并发既难估、早期又过保守;并发调太高则后期 KV 压力大触发 preemption。K3 在请求调度层做自动限流:用运行时信号(active 请求数、queued 请求数、KV 利用率)动态决定发多少请求进推理引擎——早期保持高利用,KV 压力升就降并发,无需手调就避开欠饱和与过载两头。
  3. Gradient-buffer reuse(复用梯度缓冲跑非策略模型)。RL loss 常要 reference model 这类 forward-only 的非策略模型,权重太大不能常驻 GPU。K3 把它们放 CPU、用时才物化,且借 policy model 的 FP32 gradient-buffer 存储来放——零额外分配、不产生碎片,真梯度算出时正好覆盖回来(安全)。ZeRO-2 梯度分片下每 GPU 只留 2 个 VPP chunk 的 grad buffer:一个 slot 做当前前向、另一个 prefetch 下一 chunk,逐 chunk 流式换入,把拷贝开销藏起来、不占额外显存。

K3 用多种 sandbox runtime 支撑后训练与评测:传统 container、GPU sandbox,以及最亮眼的 microVM 沙箱 AgentENV(与合作伙伴联合研发,专为 agentic 负载设计)。它围绕三个目标:

图6 · Sandbox Infrastructure — AgentENV K3 选多种 sandbox runtime Container runtime (传统隔离) GPU sandbox (加速卡隔离) AgentENV ★ Firecracker microVM AgentENV · Firecracker microVM 沙箱 高保真隔离 agent 越强越激进探索 / reward hacking 传统 container → kernel panic / deadlock microVM:挂盘 · 跑容器 · 起 VM 仍隔离安全 增量 checkpoint(仅脏页 write-back) 133ms checkpoint 49ms resume (a) Pause / Resume 等模型推理时暂停沙箱 暂停态 零内存零 CPU 98% 「等推理」占沙箱生命周期 (b) Fork 从精确状态复制新沙箱 原沙箱继续运行 无副作用 reward 判分 (c) Snapshot 定时快照 → 错误恢复 / 容错 崩溃后恢复训练现场 高密度 · 高效存储与规模 OverlayBD + 自定义 ublk + 存储层共享 + P2P → 亚秒级启动 copy-on-write + page-cache → 内存 overcommit 6.5× 全程训练 + 评测累计创建 51,219,741 sandbox · 1,505,678 image
AgentENV 用 Firecracker microVM 做高保真隔离,靠脏页增量 checkpoint 撑起 Pause(省 98% 空等)/Fork(无副作用判分)/Snapshot(容错),亚秒启动 + 6.5× overcommit 共创 5000 万次沙箱。
  1. 高保真隔离 runtime。agent 越强越爱激进探索、甚至试图 reward hacking——早期用传统 container runtime 时就出现过 agent 误操作引发的 kernel panic / deadlock。既要放开探索不限能力,复杂任务又需要贴近真实的环境(agent 得能挂盘、跑容器、甚至随手起虚拟机)。用 Firecracker 跑隔离 microVM,隔离度与保真度是容器给不了的。
  2. 灵活的沙箱生命周期。底层增量 checkpoint:只存自上次以来的脏页,checkpoint 低至 133ms、resume 低至 49ms。之上给三大高级能力:(a) Pause/Resume——等模型推理时把沙箱暂停,暂停态零内存零 CPU,而"等推理"可占沙箱生命周期高达 98%(b) Fork——从原沙箱精确状态复制一个新沙箱、原沙箱继续跑,用于无副作用的 reward 判分(c) Snapshot——定时快照做错误恢复。
  3. 高效率、高密度。数万个各带不同 image 的沙箱可能要在几秒内创建。用 OverlayBD 做 image 格式,配自定义 ublk 驱动、存储层共享与 P2P 传输,做到亚秒级启动;再靠 copy-on-write 与 page-cache 优化,内存 overcommit 实测高达 6.5×
全程训练 + 评测共创建 51,219,741 个 sandbox、跨 1,505,678 个 image —— 这个体量本身就是"环境即基础设施"的注脚。

Deployment-aware:训练即部署

从头就为上线量化做准备,消除 train-inference mismatch
$L_{LK} = -\log \sum_x \min\big(p(x),\, q(x)\big)$ —— 最大化 draft 与 target 分布重叠

翻译成人话:最大化 draft 与 target 概率分布的重叠,就是直接最大化"draft 猜的 token 被 target 采纳"的比例,即直接优化投机解码的接受率,让推理更快。

一句话记住这条主线

Kimi K3 的后训练,不是发明一个新目标函数,而是把 agentic 能力拆成一条"分工再合并 + 环境自造"的流水线:SFT 冷启动 → 3 domain × 3 effort 裂变出 9 个专家分别 RL → MOPD 用 per-token log-ratio 把 9 个专家蒸回一个 student。

而真正的护城河藏在 Environment Scaling:white-box 壳防过拟合、知识图谱造题量与覆盖、五类可验证环境给可靠 reward、hidden verifier + hacking-detection 防作弊——与其说 K3 赢在模型,不如说赢在能把环境本身 scale 起来

Kimi K3 · Post-Training · 教学拆解 · 数字与机制来自 K3 技术报告 §4