Parent: #1259 (MuJoCo 性能线)
依据:#1262 调查结论
前置:#1267 已合入,保留 state-feedback action 的 per-substep callback 路径。
一句话问题
ManagerBasedRlEnv._configure_action_control() 在 sim_substeps > 1 时为所有 active action term 注册 pre-step callback;但 #1259 的 7 个 benchmark case 均不依赖 substep 后的新状态,仍走 callback 会保留不必要的逐 substep Python/control 成本。
为什么现在做
最小交付结果
Action term 显式声明是否需要 substep state feedback(默认否,仅 Go2WMixedAction 为是)。ActionManager 聚合该声明;ManagerBasedRlEnv 仅在任一 active term 需要反馈时注册现有 pre-step callback。其余 term 每个 control step 计算一次 ctrl,并由 backend 以 nsteps=N 推进;_sim_step_counter 与 lifecycle 不变。
In scope
Non-goals
不修改或删除 perf: MuJoCo backend 接入单次 dispatch per-substep control (#1259 M1b) #1267 的 upstream callback / MuJoCo adapter 路径,不升级 mujoco-uni-runtime。
不新增 SimBackend 方法、backend 私有能力探测、第二套 env lifecycle 或 direct fallback。
不改 action 数值定义、control decimation、task YAML、policy I/O、reset/RNG、sim2sim contract 或 backend support 等级。
不顺带做 chunk tuner、sensor materialization、observation/reward/getter 优化。
Owner 与预计改动
Owner:MBA ActionTerm / ActionManager + ManagerBasedRlEnv action-control 选择;各 backend adapter 继续消费现有接口。
Small:预计 4–7 个文件、≤200 行净手写改动、1 个 PR,base 为 dev/issue-1042-manager-based-api。
永久维护成本:新增 state-feedback action term 必须正确声明并由契约测试覆盖。
Acceptance criteria
全部 active term 都不需要反馈时,不注册 pre-step callback;apply_actions() 每 control step 只执行一次,backend 收到 nsteps=sim_substeps。
任一 term 需要反馈时继续使用现有 callback;Go2WMixedAction 每个 substep 都读取最新 joint state,数值行为不变。
两条路径的 _sim_step_counter、异常传播和 close() 清理正确;control 数值 parity 与 Research: 单次 BatchEnvPool dispatch 保留 MBA per-substep control 的可行性 #1262 的 state-independent 审计一致。
focused tests 通过;最终提交本地 make test-all 通过;PR 记录 before/after timing 及各 backend 行为影响,不把路径可达性自动写成 support 升级。
Stop conditions
发现除 Go2WMixedAction 外还有依赖 substep 新状态的现有 term,或无法从 owner 代码证明某 term 为 state-independent。
需要新增 SimBackend 公共方法、backend-specific task allowlist、热路径 asset/metadata 探测或新的 manager/env lifecycle。
改动会新增当前未支持的 backend/task 组合或提升 support 等级;该决定必须另行确认。
超过 7 个文件、200 行净手写改动或出现第二个可独立交付结果时,暂停并重新拆单。
创建本 issue 只授权规划与 tracking;开始开发需 maintainer 另行确认。
Parent: #1259(MuJoCo 性能线)
依据:#1262 调查结论
前置:#1267 已合入,保留 state-feedback action 的 per-substep callback 路径。
一句话问题
ManagerBasedRlEnv._configure_action_control()在sim_substeps > 1时为所有 active action term 注册 pre-step callback;但 #1259 的 7 个 benchmark case 均不依赖 substep 后的新状态,仍走 callback 会保留不必要的逐 substep Python/control 成本。为什么现在做
JointPositionAction家族及 footstand、stewart、allegro 在一个 control step 内重复apply_actions()产生相同 ctrl;当前唯一需要实时joint_pos/joint_vel反馈的是Go2WMixedAction。nstep=1为 95.8–103.4 ms/control step,单次 trajectory/broadcast 为 66.3–74.1 ms,收益上限约 28%–31%;feat(mujoco_uni): BatchEnvPool 单次 dispatch per-substep control callback 能力 (#1259 M1a) #1266 的完成记录另已确认 callback 路径仍保留主要同步固定成本。最小交付结果
Action term 显式声明是否需要 substep state feedback(默认否,仅
Go2WMixedAction为是)。ActionManager聚合该声明;ManagerBasedRlEnv仅在任一 active term 需要反馈时注册现有 pre-step callback。其余 term 每个 control step 计算一次 ctrl,并由 backend 以nsteps=N推进;_sim_step_counter与 lifecycle 不变。In scope
ActionTerm/ActionManager增加最小的 substep state-feedback 声明与聚合查询。Go2WMixedAction显式声明需要反馈;其他现有 action term 沿用默认值。_configure_action_control()与无 callback 的 action 应用/计数路径,不按 task 或 backend 建白名单。sim_substeps=1、空 action manager 与close()清理。Non-goals
mujoco-uni-runtime。SimBackend方法、backend 私有能力探测、第二套 env lifecycle 或 direct fallback。Owner 与预计改动
ActionTerm/ActionManager+ManagerBasedRlEnvaction-control 选择;各 backend adapter 继续消费现有接口。dev/issue-1042-manager-based-api。Acceptance criteria
apply_actions()每 control step 只执行一次,backend 收到nsteps=sim_substeps。Go2WMixedAction每个 substep 都读取最新 joint state,数值行为不变。_sim_step_counter、异常传播和close()清理正确;control 数值 parity 与 Research: 单次 BatchEnvPool dispatch 保留 MBA per-substep control 的可行性 #1262 的 state-independent 审计一致。make test-all通过;PR 记录 before/after timing 及各 backend 行为影响,不把路径可达性自动写成 support 升级。Stop conditions
Go2WMixedAction外还有依赖 substep 新状态的现有 term,或无法从 owner 代码证明某 term 为 state-independent。SimBackend公共方法、backend-specific task allowlist、热路径 asset/metadata 探测或新的 manager/env lifecycle。创建本 issue 只授权规划与 tracking;开始开发需 maintainer 另行确认。