Repository navigation
Conversation
Existing #2257 tests/docs retained centrally; no equality burden on individual review commits.
Independent Kimi XT Review — stack layer 6/6This PR carries the Real CLI model: Parent readback, separate from Kimi: the Python 3.10 compatibility observation is confirmed statically; the configured test environment uses 3.12. No long-run R3 leak was demonstrated, and shared ownership must be respected before adding explicit free. Missing-session-ID counting concerns mixed failed/successful groups. Developer guide · Retained public report copy
review_2257_2026-11-11_21-26审阅对象:#2257 本地拆分实际执行结果(base 仓库内不存在 summary机械拆分(独立复核,全部静态确认,无阻断项) 我在
六层 stack/合入组合理性:T1 三个小修复各自独立成层合理;T2-gate 依赖 T2-trace 的 主体实现(base→merged,~2600 行源码):这是原 #2257 的实现本体,拆分未增删实现。因此实现层面的缺陷绝大多数属于原 2257 已有设计,不是本轮回归;下文章节严格区分。未发现高严重度的新增实际风险。 高严重度实际风险:无(静态确认范围内)。 本轮拆分新增问题:仅 1 项低severity记录性事项(见其他 issues O1:运行级 ACCEPTANCE 内 已有设计建议(原 2257 带入,不阻塞本轮):见“其他 issues”O2–O8,包括 Python 版本声明与 GPU/validation 证据可支撑结论的边界:GPU 实测树是 split + 固定 #2292 的叠加组合( Main Flowchart before this PR改动前(base flowchart TD
subgraph ExternalClient["外部 Agent 客户端 (HTTP)"]
EC1["POST /v1/chat/completions (OpenAI/Anthropic, 可 stream)"]
end
subgraph SessionServer["xtuner.v1.rl.rollout.session_server.SessionServer"]
SS1["_handle_request(request)"]
SS2["_forward_request(request)"]
SS3["on_request / on_response hooks"]
SS4["trace_store insert (TokenizedSegment, Trie)"]
SS1 --> SS2 --> SS3 --> SS4
end
subgraph RolloutController["xtuner.v1.rl.rollout.controller.RolloutController"]
RC1["pause_generation() / continue_generation()"]
RC2["health_manager.pause/resume"]
RC1 --> RC2
end
subgraph Producer["xtuner.v1.rl.agent_loop_manager.producer.AsyncProduceStrategy"]
P1["_local_pending_tasks: set[asyncio.Task] (每次 produce_batch 重置)"]
P2["pause_pending_tasks() (取消并收尾 pending)"]
end
subgraph ManagerC["xtuner.v1.rl.agent_loop_manager.agent_loop_manager.AgentLoopManager (共卡)"]
MC1["produce_batch() -> continue_generation -> 生产 -> pause_generation -> pause_produce"]
end
subgraph ManagerD["xtuner.v1.rl.agent_loop_manager.disagg_agent_loop_manager.DisaggAgentLoopManager (异卡)"]
MD1["produce_loop() / pause_produce() / continue_produce()"]
MD2["DisaggAsyncProduceStrategy._pending_tasks"]
end
subgraph Trainer["xtuner.v1.train.rl_trainer.RLColocateTrainer / RLDisaggregatedTrainer"]
T1["fit() -> produce -> _train_one_batch -> fit同步"]
T2["sampler save/resume (epoch-local step 直接作 global 计数)"]
end
EC1 --> SS1
MC1 --> RC1
MD1 --> RC1
T1 --> MC1
T1 --> MD1
T1 --> P2
Main Flowchart after this PR改动后:新增 RequestGate 准入/结算屏障、affinity 路由、任务保活与 quiescent 保存恢复。突出显示为新增/修改节点(mermaid 8.8.0 flowchart TD
subgraph ExternalClient["外部 Agent 客户端 (HTTP)"]
EC1["POST /v1/chat/completions (非 stream, 带 session_id)"]
end
subgraph AffinityRouter["xtuner.v1.rl.rollout.affinity_router.SessionAffinityRouter / SessionAffinityService (新增)"]
AR1["acquire(sid)->具体 DP entrypoint; retire_sessions(); 410 tombstone"]
end
subgraph RequestGate["xtuner.v1.rl.rollout.request_gate.RequestGate / SettlementReceipt (新增)"]
RG1["request(session_id) 租约: seal -> drain -> install_version -> reopen"]
RG2["未结算/未知结局 => poison barrier, 阻止权重更新"]
end
subgraph SessionServer["xtuner.v1.rl.rollout.session_server.SessionServer (修改)"]
SS1["_handle_request -> 生成端点先进 RequestGate (修改)"]
SS2["_forward_request(request, lease) (修改: 注入 _xt_request_id/_xt_model_step)"]
SS3["结算: backend_ended+terminal_recorded => SettlementReceipt (修改)"]
SS4["TokenizedSegment.request_id/model_step (修改)"]
SS1 --> RG1
SS1 --> SS2 --> SS3 --> SS4
end
subgraph RolloutController["xtuner.v1.rl.rollout.controller.RolloutController (修改)"]
RC1["prepare_pause() freeze+seal+drain (新增)"]
RC2["resume_requests() install->continue_generation->reopen, 单 deadline (新增)"]
RC3["assert_request_gates_healthy() (新增)"]
RC4["retire_route_sessions() (新增)"]
end
subgraph PausePolicy["xtuner.v1.rl.agent_loop_manager.agent_turn_pause_policy.AgentTurnPausePolicy (新增)"]
PP1["pause/resume/check_requests/before_sync(quiesce)"]
end
subgraph Keepalive["xtuner.v1.rl.agent_loop_manager.colocate_keepalive.LoopThread / ColocateKeepaliveManager (新增)"]
K1["专用 event loop 跨同步训练窗口保活 Agent 任务"]
end
subgraph Producer["xtuner.v1.rl.agent_loop_manager.producer.AsyncProduceStrategy (修改)"]
P1["_PendingTasks 统一持有 pending; retain_live_tasks 跨窗口保留"]
end
subgraph ManagerD["DisaggAgentLoopManager (修改)"]
MD1["quiesce(timeout) 关门收单; prepare_sync(checkpoint_due)"]
MD2["scheduling_paused 停新组; close() 取消 pending"]
end
subgraph Trainer["RLColocateTrainer / RLDisaggregatedTrainer (修改)"]
T1["_validate_turn_keepalive/_validate_turn_resume 配置校验 (新增)"]
T2["_initialize_keepalive_rollout 冷启动/冷恢复发布 (新增)"]
T3["_checkpoint_due + produce_batch(quiesce=...) (修改)"]
T4["debug_rollout/debug_train 异卡阶段复用 (新增)"]
T5["sampler rollout_group_count/rollout_next_epoch (修改)"]
end
EC1 --> AR1 --> SS1
RG2 --> RC1
PP1 --> RC1
PP1 --> RC2
K1 --> PP1
MD1 --> PP1
T1 --> K1
T2 --> RG1
T3 --> MD1
classDef changed fill:#ffe08a,stroke:#b58900,stroke-width:2px;
class AR1,RG1,RG2,SS1,SS2,SS3,SS4,RC1,RC2,RC3,RC4,PP1,K1,P1,MD1,MD2,T1,T2,T3,T4,T5 changed;
文字对应说明(流程 → 修改代码):
核心原理
核心实现与对应的单测
静态确认:以上测试与实现逐一对得上,且 CPU 验收(130 项,host 环境)覆盖的是这些文件。 抽象与信息隐藏评估(按 module/interface/depth/seam 词汇)
新增功能守则对既有类的接触点核查(T2–T7 相对既有类):
公开接口的线性业务流程评估
单测建议现有测试已较完整(上表)。补充建议(均为静态推断,优先级低):
其他 issuesO1(低,静态确认,本轮拆分新增): O2(中,静态确认,原 2257 带入):Python 版本声明不匹配。 O3(低,静态确认,原 2257 带入):异卡 O4(低,静态确认,原 2257 带入):request-aware 的 O5(低,静态确认,原 2257 带入): O6(低,静态确认,原 2257 带入): O7(信息,静态确认): O8(信息,静态确认):T2-trace 与 #2252 的 Trie 遍历重叠按“标记重叠、不换实现”处理; O9(验证边界汇总,静态确认 + 推断):可支撑——机械相等(我独立复核)、叠加 #2292 组合上 2 次真实 optimizer 更新/冻结 MTP 全量哈希不变/IPC 同步/版本 0→1→2/affinity 绑定/受控任务跨更新续跑/完整 DCP 冷恢复后真实 HTTP;runner( 审阅执行说明:全程只读(git show/diff/cat-file、源码阅读、JSON 证据读取),唯一写入为本报告。未运行项目代码(依原文第 6 条),未改任何 git refs/index,未 push/评论/merge,未操作 RJob/SSH/权重。中间产物(prompt 快照、SCOPE、diff、日志、metadata)按要求全部保留,未做清理。 |
Agent RL stack — bottom to top
Review each PR against its configured base. The complete delivery is split from #2257, which remains unchanged as the pre-split reference.
xs1997zju/agent-rl-stack-20261111/01-admin-retry→mainxs1997zju/agent-rl-stack-20261111/02-sampler-resume→ #2294xs1997zju/agent-rl-stack-20261111/03-fit-cleanup→ #2295xs1997zju/agent-rl-stack-20261111/04-agent-core→ #2296xs1997zju/agent-rl-stack-20261111/05-disagg-debug→ #2297xs1997zju/agent-rl-stack-20261111/06-valid-attempts→ #2298 ← you are hereThe core layer (#2297) contains five separate topic commits that form one integration group. Shared tests/docs are carried in the final layer (#2299). Intermediate commits are review units, not independently validated feature versions.
Independent related PRs: #2252 (iterative trace traversal; overlaps with #2297 and needs reconciliation) and #2292 (native frozen MTP). They are not additional layers of this stack.
Developer guide, diagrams, scripts and validation scope.
Expose an optional minimum count of surviving independent Agent attempts after failed-attempt filtering, plus sandbox environment metadata. Keep the default filtering policy unchanged. This final stack layer also carries the existing shared lifecycle tests and feature documentation in one commit.
Review scope and dependencies
Layer 6/6 of the mechanical split of #2257. Base:
xs1997zju/agent-rl-stack-20261111/05-disagg-debug; reviewed head:e42ad7b4705cbc9b1822f08d3f61652ed3e5c588. Review this PR against its configured base; later layers depend on earlier layers. The original #2257 remains unchanged as the pre-split reference.Code entry:
xtuner/v1/rl/agent_loop/sandbox_agent_loop/agent_in_sandbox_loop.py.Validation
Reviewer guide and independent review
Developer guide, diagrams, scripts and experiment scope.
A real Kimi XT Review of the completed split and evidence is posted in this PR's comments. It found no mechanical-split blocker; original #2257 compatibility/design observations remain explicitly recorded. This Draft does not include fixes for those observations.
Related independent PRs: #2252 (iterative trace traversal; overlap must be reconciled before landing the core layer), #2292 (native frozen MTP). Lagent #385 targets v1.0.0; the CyberGym recipe is separate in CRG !78. The external MTP route #2289 is not part of this delivery. Keep Draft; no automatic merge.