UniRL 文档
架构

概念与术语

UniRL 文档与 recipe 中通用的核心心智模型与领域术语。

如果文档其余部分出现你不熟悉的术语,请先读本页。它是概念入门,不是 API 参考;贴近代码的契约见嵌入在各分区下的 package 页面,例如 Code Architecture。

生命周期

RL、监督训练和异步训练并不共享同一个生命周期:

同步 RL:
prompts -> rollout(填充 Sample 中生成的 Part)
        -> reward (把 media 打分为逐样本 reward)
        -> advantage(在组内/跨组归一化 reward)
        -> train  (replay trajectory,算 loss,backward,optimizer step)
        -> [可选] weight sync 回 dedicated rollout engine

SFT:
records -> 构建监督 Part -> train

异步 AR / diffusion:
独立 rollout slab -> buffered Sample -> reward/advantage -> 独立 train slab
                  <- 带版本的权重发布 <-

SFT 没有 rollout、reward、advantage 或 weight-sync 阶段。异步 AR 和 diffusion 在两个独立 placement slab 上重叠工作,同时保留权重发布和 checkpoint barrier。

每个生成 Part 一个算法

rollout engine 把 request Sample 转换为填充后的 Sample。Sample.parts 是有序的 Part lineage;生成 Part 携带对应 stage 的 segment、conditions、primitives、rewards 和 advantages。每个可训练的生成 Part 绑定一个 loss 算法,即 replay stage、计算 loss 并调用 backward() 的 StageAlgorithm。

不存在独立的 driver 侧 "rollout control" 对象。reward→advantage 的整形与 SDE-index 选择都在 typed 对象上:

关注点所在位置
Losscfg.algorithm → 一个 StageAlgorithm(如 diffusion FlowGRPO 或 AR GRPO)
reward → advantagePart.compute_advantages(unirl/types/sample.py)
哪些推理步跑 SDEDiffusionSamplingParams.resolve_sde_indices(unirl/types/sampling.py)

单 stage recipe 绑定一个顶层 cfg.algorithm。PE 为每个生成 Part 嵌套一个 algorithm: 节点(diffusion.algorithm、ar.algorithm),并运行兄弟 TrainStack。 unified-model 训练则为 shared AR + image backbone 使用一个 UnifiedModelTrainStack。

术语表

编排

术语含义
Driver跑训练循环的进程:一个入口(unirl.train_diffusion 等)构建 <Domain>Trainer。
Trainerunirl/trainer/<domain>.py——负责该领域的 placement 块、worker 和生命周期。
Remote / placementsingle-controller 层(unirl/distributed/group/):Remote 是逻辑 worker;一个 placement 块把 sibling Remote 分配到同一 GPU slab,并携带 RankInfo(DP/TP/PP/SP/EP rank)。
Bundle一个模型包暴露给训练和 rollout 的可训练+冻结模块(transformer、VAE、text encoder)。
Pipeline模型的采样 pipeline(去噪/生成),用于产出 media 和 trajectory。

Rollout

术语含义
Rollout engine采样 backend:trainside、sglang、sglang_llm、vllm_omni、composed。
Direct samplingtrainside:被 FSDP wrap 的训练模块本身就是 sampler;无独立 engine、无 weight sync。
Dedicated sampling独立 engine(SGLang / vLLM-Omni)持有自己的权重,需要 trainer→rollout weight sync。
Colocate vs separatetrain 与 rollout 是否共享 GPU bundle(colocate)或跑在不同 GPU slab(separate)。
Samplerollout 与 training 的 typed 边界。每个 engine 都接收并返回 Sample;见 unirl/types/sample.py。
Part / SegmentSample.parts 是有序 lineage。每个 Part 可持有 stage segment(如带逐步 log-prob 的 diffusion trajectory)、conditions、primitives、rewards 和 advantages。
Group一条 prompt 的 sampling.samples_per_prompt 个同组样本;advantage 在组内归一化。

SDE 与 log-prob

术语含义
SDE strategy产生逐步 log-prob 的随机 kernel(FlowSDEStrategy、DanceSDEStrategy ...)。
Sigma schedule各去噪步的 σ 值;作为 single source of truth 钉在生成 Part 的 sampling params 上。
old_logp / new_logprollout 时 vs 当前权重的 log-prob;其比值驱动 GRPO 的 clipped 目标。
Log-prob replay训练时通过 replay stage 重算 log-prob;多次更新间 old log-prob 保持固定。

训练

术语含义
Backendtraining-state Remote(FSDPBackend),负责结构注入 + optimizer + scheduler + EMA。
Stage / StageAlgorithm可训练 stage,以及 replay 它并做 forward/backward 的 loss 对象。
Train stackTrainStack——实现在 unirl/train/stack/base.py,并由 unirl.train.stack 导出;PE 使用兄弟 stack,HI3 使用 unified_model_stack。
EMA rollout用 EMA 平滑权重采样 rollout(NFT 开启;GRPO / DPPO 不可)。
Batch geometrymicro_batch_size、num_updates_per_batch;多更新会在每个 rollout shard 上冻结一次 π_old。

Reward

术语含义
RewardServiceunirl/reward/service.py——持有一个 backend:本地 scorer 或远程 HTTP 客户端。
Reward component / scorer给 media 打分的单元(PickScore、HPS、OCR、GenEval2、VideoPickScore ...)。
Advantageloss 相乘的归一化 reward 信号。

数据面 vs 权重面

术语含义
Weight sync(cfg.sync)把最新训练权重发给 dedicated rollout engine(NCCL broadcast、tensor、IPC)。
Tensor transport数据面(unirl/distributed/tensor/),在 worker 间搬运体积大的rollout 输出。

两者方向相反,不要混为一谈。

下一步

目录