Skip to content

motrix_rl: 异步 transport 原语上移并改为 TransitionSchema 驱动 #159

Closed

Description

@wlgys8

问题

异步训练的 transport 原语(RingCursors / SharedTransitionRing / IpcTransitionRing,含 SPSC cursor 协议、有界 backpressure、x86/TSO 内存序、CUDA-IPC 变体)目前全部位于 motrix_rl_builtin 的 fastsac 插件包内,且 transition 字段集是硬编码的:

  • SharedTransitionRing.FIELDS = (obs, critic_obs, actions, rewards, dones, truncations) 是类常量,构造函数按位置接收 obs_dim/critic_obs_dim/act_dim 逐字段分配共享内存;
  • ipc_ring.py 同样逐字段硬编码 IPC handle;
  • learner 侧 DrainStaging 硬编码六个 pinned buffer;
  • collector 侧 push 按位置接收六个张量。

这带来两个问题:

  1. 字段集成了 transport 的编译期决定。任何需要不同字段集的异步训练后端(例如 transition 需要携带特权状态向量、任务上下文、episode 元数据或 curriculum 捎带量的算法),都无法复用这套已经过测试验证的传输实现,只能整段复制或侵入式修改 fastsac;
  2. 公共基建的位置倒挂。跨算法可复用的传输层活在具体算法插件包里,motrix_rl 作为控制平面反而没有它。

方案

  1. 新增 motrix_rl/transport/schema.py:TransitionField(name, per_env_shape, dtype) 与 TransitionSchema(推导 per-slot 布局);
  2. 将 ring 原语(cursors / host ring / IPC ring / common)上移至 motrix_rl/transport,构造函数改为接收 schema,存储按字段分配,push / read_span 按字段名收发;
  3. cursor 语义、backpressure、内存序协议一行不动——只改字段布局的决定方式,不改已验证的传输协议;
  4. fastsac 声明自身的 TransitionSchema(六字段)迁为首个消费者;DrainStaging 的 pinned buffer 与 collector push 改为按 schema 迭代生成;
  5. FinalObsStorage 保持 fastsac 私有语义随迁,不做泛化;
  6. transition 中的辅助量(如 curriculum 捎带)建模为普通 schema 字段,不引入新的传输原语。

验收

  • fastsac 既有测试全绿(test_fastsac_ipc_ring / test_fastsac_collector / test_fastsac_async_multi),证明为收窄改造、行为不变;
  • 新增一个非 fastsac 形状的合成 schema(例如含特权状态向量 + int64 标量元数据字段)的 ring roundtrip / backpressure / 多 slot 连续读写契约测试,证明字段集真正开放——该测试即本 issue 想长期保护的公共契约。

边界

  • 不涉及权重通道(WeightChannelShared)的泛化与 checkpoint 多模块化,二者另行立项;
  • 不改变 fastsac 的任何运行时行为与配置面。

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions