## 问题 FastSAC 为减少 replay buffer 和异步 ring 的显存占用,可以只存每步的当前观测,并从下一条 transition 的观测推导 `next_obs`。这一布局在普通连续步上成立,但在 **auto-reset + timeout/truncation** 边界上不能直接成立:下一条 transition 的观测属于新 episode,bootstrap 所需的却是上一 episode 截断前的最后观测。 actor 与 critic 使用不对称观测时,两套观测都受影响。 ## 最小例子 ```text transition t: obs=A, action=a, reward=r, terminated=False, truncated=True 截断前最后观测: B auto-reset 后观测: C transition t+1: obs=C ``` 若把 successor slot 的 `C` 当成 transition t 的 `next_obs`,timeout target 会变为: ```text r + gamma * V(C) # 新 episode 的初始状态 ``` 而正确的 timeout bootstrap 应使用: ```text r + gamma * V(B) # 被截断 episode 的最后状态 ``` 物理 termination 不应 bootstrap;即使同一步也达到时间限制,termination 仍应优先。多步 return 应在 termination 或 truncation 的第一个边界停止奖励累积,不能把 reset 后新 episode 的奖励并入旧 episode。 ## 存储约束 直接为每条 transition 增加完整的 `next_obs` 或 `final_obs` 能保留边界信息,但会基本抵消 successor-slot 布局节省的观测存储;异步 ring、共享 IPC 张量与 pinned staging 也会承担额外成本。 例如 2048 个环境、每环境 1024 条 transition、actor/critic 观测维度分别为 291/294、float32 时,额外两套 dense 观测约需 **4.57 GiB**,尚未计入 ring/staging 和临时张量。这只是规模示例,不应成为固定配置假设。 ## 需要明确的契约 - 普通步继续复用 successor observation,避免重复存储。 - 需要 bootstrap 的截断边界能取得真实的截断前 actor/critic 观测,而非 reset 观测。 - 环境返回给下一步 policy 的 reset 观测与提供给上一 transition 的边界观测必须区分。 - 异步传输的边界数据在 slot 复用、wraparound、消费延迟及多 collector 情况下不能丢失或错配。 - Replay 覆盖旧 transition 后,对应边界数据必须失效;n-step 采样应选择最终边界 transition 的观测。 - 应明确额外存储的容量、最坏情况和超容量行为,避免静默退回错误的 reset bootstrap。 ## 验证要求 用明显不同的 A/B/C 观测构造测试,验证 timeout bootstrap 使用 B、下一步 policy 使用 C;同时覆盖非对称 critic、纯 termination、termination+timeout、n-step、ring/replay wraparound 和异步消费。记录不同截断密度下 replay/ring/staging 的实际内存开销。 本 issue 聚焦 auto-reset 截断边界的观测语义与节省存储之间的矛盾,不预设具体实现方案。
Activity
wlgys8 commentedon Oct 14, 2026
#120