## 问题 运行 `uv run train --algo flashsac --task g1_motion_tracking --sim mjwarp` 时,终端 logger(`OffPolicyLogger`)collector `Env Step` 分解中缺少 `Backend Step` 行。 ## 仓库证据 - mjwarp 的 `step_tensor` 是全异步的:只发射 kernel/CUDA graph 并记录 event 型 `CompletionToken` 即返回(`third-party/unisim/src/unisim/backend/mjwarp/backend.py` `step_tensor`,无 synchronize),因此 `TorchEnv.step` 测得的 `step_core_ms` 只是 host 端发射开销(亚毫秒级)。 - 第一个 host 同步点是 `src/unilab/base/torch_env.py` step 内 autoreset gate 的 `bool((terminated | truncated).any())`,它落在 `reset_done_ms` 计时窗口中——真实的 GPU 物理等待被误记入 `Reset Done`,`Backend Step`(`env_step_backend_ms`)接近 0。 - 终端 logger 对非核心行有 1% collector-cycle 占比过滤(`src/unilab/rl/logging/offpolicy.py` `_COLLECTOR_DIAGNOSTIC_TERMINAL_MIN_PCT`),把接近 0 的 `Backend Step` 行隐藏,于是用户看到该行"缺失"。 - 对照:mujoco 后端 `step_tensor` 是同步 CPU 物理,`Backend Step` 正常显示。 ## 交付行为 `TorchEnv.step` 把 autoreset gate 的 done-mask host 读取从 `reset_done_ms` 窗口拆出,归因到 `step_core_ms`:事件型异步后端(mjwarp)的物理等待归 `Backend Step`,同步后端(mujoco/motrix)数值基本不变。终端 `Backend Step` 行按既有 1% 物化规则正常显示。 ## 影响面 - owner 层:`src/unilab/base/torch_env.py`(step 计时归因)、`tests/base/test_torch_env.py`。 - 仅计时归因变化,不改变 step/reset 语义与执行路径;MuJoCo/Motrix/macOS 无行为影响。 - 同 PR 附带 #2479 观测缺口收口的一部分:终端 logger System 列显示 CUDA MPS 状态(on/ambient/off),消费既有 `runtime_manifest["cuda_process_sharing"]` 证据。 ## 验收 - 新增确定性测试:fake clock 下 done-gate 窗口计入 `step_core_ms`、不计入 `reset_done_ms`。 - logger 测试:System 列按 manifest 证据渲染 MPS 行。 - `make check`、focused tests、`make test-all` 通过。 ## PR base `main`
Activity
fix(envs): re-attribute the update-state queue drain to step core timing
TATP-233 commentedon Oct 22, 2026
已修复,可以关闭:PR #2497 已合入当前
main(merge50b8d9c1)。TorchEnv现在将异步后端 done-gate/drain 的 host 同步窗口归因到Backend Step,OffPolicyLogger 也会按 runtime manifest 渲染CUDA MPS状态;相关回归测试已随 PR 合入。