Repository navigation
Open
Description
背景
fastsac 多 collector 拓扑下, 每个 collector 进程持有独立的环境 shard, 课程类状态(难度档位、command 采样分布、自适应统计等)在各 shard 内独立演化, 会发生 drift。(曾实现过一版 ShardStateBus 原型, 因当时没有实际接入的使用方已移除。)
问题
- 是否需要同步? 分布式/多 collector 训练时, 课程信息是否必须在所有节点间保持一致?
- 对收敛性的影响? shard 间课程分布不一致时, 同一个 policy 看到的难度分布不一致, 这对训练收敛性/样本效率的影响缺乏定量结论。
同类框架分析
IsaacLab —— 不同步
- multi-GPU(RSL-RL / rl_games)下每个 rank 跑一份完整独立的环境副本; 课程状态(如
terrain_levels)在 rank 内独立演化; - 框架层(managers / terrain importer)无任何
all_reduce/all_gather, collective 只出现在 RL 库接入层(仅同步梯度); - curriculum term 的返回值(如
terrain_levels_vel的平均地形等级)只是日志量, 进 TensorBoardextras, 不参与同步。
mjlab —— 不同步
CurriculumManager与 IsaacLab 同源(reset 边界 compute, 状态仅用于日志), 全库无 curriculum 相关的分布式同步代码(collective 仅出现在 sensor/actuator 等无关模块)。
holosoma —— 有同步, 且语义是 broadcast 决策状态
- env 上有显式的
synchronize_curriculum_state(device, world_size)(locomotion_manager.py), 由 agent 侧统一调用(base_algo._synchronize_curriculum_metrics, 有 curricula 时才触发); - 同步对象是一个白名单小集合:
AverageEpisodeLengthTracker的均值(自适应课程的输入统计)和reward_penalty_scale; - 语义是 broadcast(src=0): rank 0 的值直接胜出, 不是归并平均——等价于
RESOLVE_ONE而非MERGE_STATS。
对我们的启示
| IsaacLab / mjlab | holosoma | 我们 (fastsac 多 collector) | |
|---|---|---|---|
| 拓扑 | 每 rank 独立完整环境副本 | 每 GPU rank 独立副本 | 一个 learner 拆出的环境池, shard 共享同一 policy |
| 课程同步 | 无 | broadcast rank-0 决策状态 | 待定 |
| 漂移容忍的隐含理由 | 各 rank 独立探索难度, 可接受 | 不接受, 输入统计必须一致 | shard 漂移直接造成同一 policy 看到不一致难度分布 |
holosoma 证明"课程状态需要同步"在同类工作中是被认真对待的问题; 它选择最小集 + broadcast, 说明同步不必是全量状态归并, 白名单决策量即可。
待接入的具体场景(以 WBT 自适应帧采样为例)
WbtMotionCommand 的 adaptive_bin_failed_count(per-bin 失败计数 EMA)决定 sampling_cdf, 目前多 collector 下各 shard 的 CDF 独立漂移。曾讨论过的同步方案:
- 上报量: 各 shard 的 EMA 向量, 包装成充分统计量
{count: 折入失败量(失败量加权), sum: ema*count, sumsq: zeros}; - 归并: fleet 级失败量加权平均 EMA(近似——加权平均各 shard 的 EMA ≠ fleet 作为一个 pool 的 EMA);
- 回灌: 写回
adaptive_bin_failed_count, 下次 reset 各 shard 重建一致的 CDF; - 状态留在 command term(采样发生在 fused kernel 内, buffer 是 kernel data), 不宜拆到独立的 manager。
决策点
- 确认课程状态漂移在实际任务(WBT 等)中是否真的伤害收敛(可先做 A/B: 同步 vs 不同步)
- 若需要同步: 确定语义(参考 holosoma 的 broadcast 决策量, 或失败量加权归并的统计量), 重新落地
report_shard_state/apply_shard_state接缝 - 若仅 WBT 需要: 最小方案是只给
WbtMotionCommand实现这对 hooks
Metadata
Metadata
Assignees
Labels
No labels
Activity
wlgys8 commentedon Sep 24, 2026
补充:观测归一化(EmpiricalNormalization)同步的四框架对比
对 IsaacLab / mjlab / holosoma / rsl_rl 源码的调研结论:
empirical_normalization仅是配置开关)modules/normalization.py),纯本地增量公式weight_publish_interval(当前=4)步要点: