Prhub

#7448 [tool] feat: Forward Agent Loop telemetry to RL-Insight

原始 PR 作者 tardis-key 合并时间 2026-08-25 13:36 文件变更 3 提交数 8 评论 2 代码增减 +155 / -5

执行摘要

RL-Insight 日志器新增 span 与会话转发

PR body 说明目标是 add trace_span and agent_loop_session forwarding through RLInsightLogger,并 enforces RL-Insight 0.3.0 for new APIs。RFC 7509 明确三仓库分工:rl-insight 拥有 agent_loop_session 协议与 dashboard,verl 只负责从 trainer 配置初始化并把完成的 span 和 session 转发出去,不掺入 agent 业务语义。verl 需要在不破坏旧版 rl-insight 的前提下接入新协议。

值得精读 verl/utils/tracking.py 中的版本门控与降级设计:用 MINIMUM_VERSION + callable 检查 + 一次性告警的组合,让新 API 在不破坏旧依赖的前提下逐步演进。可结合 RFC 7509 观察跨仓库协作中的接口边界,后续 uni-agent 埋点落地后再回看 agent_loop_session 的实际消费情况。

讨论亮点

PR 内没有技术 review 评论,wuxibin89 直接 APPROVED。作者在 issue 评论中明确要求 do not merge until @yyDing1 approves,最终由 yyDing1 合并。RFC 7509 的 todo 记录版本兼容性验证已完成,并说明因为 men-agent 方案尚未有代表性结果,verl 文档暂不更新,待 uni-agent 实验结果成熟后再补充。

实现拆解

  1. 在 verl/utils/tracking.py 中为 RLInsightLogger 增加版本门控:新增 MINIMUM_RL_INSIGHT_VERSION = Version("0.3.0")、_rl_insight_version() 从模块 version 探测当前版本,以及 _warn_unsupported_rl_insight() 保证每个特性只告警一次。
  2. 抽取 _ensure_rl_insight_init():把 log() 和 trace_state() 中重复的懒初始化逻辑收敛到单一入口,新 API 复用,避免多次初始化。
  3. 新增 trace_span():接收 name、start_time_ns、end_time_ns 与可选 attributes,版本不足或 API 缺失时安全降级;满足条件时调用 rl-insight 的 trace_span 上报完成的 span。
  4. 新增 agent_loop_session():将 sample、session、uid、global_steps、session_id 组装为 agent-loop session;当 rl-insight 版本不足时回退到基于 RolloutTraceConfig 的本地 session(fallback_session),测试验证回退后 identity 仍包含 state_lane_id 与 global_steps。
  5. 配套测试与文档:tests/utils/test_rl_insight_logger_on_cpu.py 新增两个旧版回退用例并清理 _warned_unsupported_features 状态;docs/advance/rl_insight.md 追加 Agent Loop 协议与 uni-agent 集成文档入口。
文件 模块 状态 重要度
verl/utils/tracking.py 追踪模块 modified 8.11
tests/utils/test_rl_insight_logger_on_cpu.py 测试 modified 5.73
docs/advance/rl_insight.md 文档 modified 1.96

关键符号

trace_span agent_loop_session _ensure_rl_insight_init _warn_unsupported_rl_insight _rl_insight_version

关键源码片段

verl/utils/tracking.py dependency-wiring

核心日志后端,新增 RL-Insight 0.3 版本检查、trace_span 与 agent_loop_session 转发及旧版本降级逻辑。

# 检查已安装的 rl-insight 版本;模块未暴露 __version__ 时按 0 处理。
@classmethod
def _rl_insight_version(cls) -> Version:
    module = cls._get_rl_insight()
    return Version(getattr(module, "__version__", "0"))# 每个特性最多警告一次,避免重复刷日志。
@classmethod
def _warn_unsupported_rl_insight(cls, feature: str) -> None:
    if feature in cls._warned_unsupported_features:
        return
    cls._warned_unsupported_features.add(feature)
    logger.warning(
        'RL-Insight does not support %s (requires >= %s); monitoring is disabled for this feature',
        feature,
        cls.MINIMUM_RL_INSIGHT_VERSION,
    )# 懒初始化:首次使用时才调用 rl-insight 的 init。
@classmethod
def _ensure_rl_insight_init(cls) -> None:
    if not cls._init_done:
        cls._get_rl_insight().init()
        cls._init_done = True# 上报一个已结束的 span;版本过旧或缺少 trace_span API 时安全降级为 no-op。
@classmethod
def trace_span(cls, name: str, *, start_time_ns: int, end_time_ns: int, attributes: dict[str, Any] | None = None) -> None:
    if not cls.enabled():
        return
​
    module = cls._get_rl_insight()
    if cls._rl_insight_version() < cls.MINIMUM_RL_INSIGHT_VERSION or not callable(getattr(module, 'trace_span', None)):
        cls._warn_unsupported_rl_insight('trace_span')
        return
​
    cls._ensure_rl_insight_init()
    cls._get_rl_insight().trace_span(
        name=name,
        start_time_ns=start_time_ns,
        end_time_ns=end_time_ns,
        attributes=dict(attributes or {}),
    )

评论区精华

合并门槛:等待 yyDing1 批准 other

作者在 PR 评论中明确要求 do not merge until @yyDing1 approves,表示该 PR 涉及三仓库协同,需要核心维护者确认。

结论:wuxibin89 已 APPROVED,yyDing1 最终合并,合并门槛满足。 · 已解决

风险与影响

关键风险集中在 verl/utils/tracking.py 的版本兼容与初始化路径上:

  • _rl_insight_version() 依赖 rl_insight.version 属性,如果环境未暴露该属性会按 0 处理,导致 trace_span、agent_loop_session 全部静默降级;
  • 降级只产生一次 warning,长时间运行可能掩盖“监控未生效”的事实;
  • agent_loop_session 的 fallback 依赖 RolloutTraceConfig 全局状态,测试前调用了 reset(),生产环境若未正确重置可能出现 session 身份串扰;
  • _ensure_rl_insight_init() 非原子,异步并发已有测试覆盖,但多线程严格互斥未验证;
  • 仅新增两个降级路径测试,没有覆盖新版本成功上报路径的单元测试。

影响范围限定在启用 VERL_RL_INSIGHT_ENABLE=1 的用户:rl-insight >= 0.3.0 时可获得 agent-loop span 与 session 的可观测性;旧版本自动降级,不影响原有标量指标与 trace_state 功能。对未启用 RL-Insight 的普通用户零影响。对团队而言,verl 侧保持薄集成,协议与 dashboard 都在 rl-insight,业务埋点在 uni-agent,后续升级只需跟随三方版本协议。

版本兼容降级路径 依赖 rl-insight>=0.3.0 懒初始化并发风险 回退路径测试不足

关联 Issue

#7509 [RFC] Agent Loop Observability Across VeRL, Uni-Agent and RL-Insight

完整报告

参与讨论