DreamZero 监督微调和 Franka 真机部署#
DreamZero:由视频生成世界模型微调得到的 VLA 策略。#
在 RLinf 中运行 DreamZero 监督微调(SFT):准备模型与 LeRobot 数据,启动训练,执行仿真评测,并将训练后的策略部署到 Franka 真机。
概览#
将基于 WAN 的 DreamZero 世界模型微调成操作策略,在 LeRobot 数据上训练,在仿真中评测,并部署到 Franka。
WAN2.1 · WAN2.2
SFT · Mixture SFT
LIBERO · DROID · Franka PnP
1+ 节点 · GPU
metadata.json → 运行 run_vla_sft.sh → 在仿真或 Franka 上评测。DreamZero 仓库 <https://github.com/RLinf/dreamzero>`_(``DREAMZERO_PATH`)· 一个 LeRobot 数据集。当前支持
数据集: LIBERO(
libero_sim)、OXE DROID(oxe_droid)、Franka pick-and-place(franka_pnp);支持跨 embodiment 的 mixture SFT (见libero_franka_mix_sft_dreamzero_5b.yaml)。骨干网络: WAN2.1(如 DreamZero-DROID 14B)、WAN2.2(如 Wan2.2-TI2V-5B 冷启动)。
安装#
首先,克隆 RLinf 仓库:
# 为提高国内下载速度,可以使用镜像:
# git clone https://ghfast.top/github.com/RLinf/RLinf.git
git clone https://github.com/RLinf/RLinf.git
cd RLinf
然后,使用下列两种方式之一准备依赖:预构建的 Docker 镜像(推荐)或自定义环境。
通用的安装流程(前置依赖、GPU 驱动、镜像内置的 switch_env 工具、镜像加速、常见问题排查)
在 安装说明 中统一说明;本方案中的命令仅在 Docker
镜像标签和 --env 取值上有所不同。
选项 1:仅 SFT 环境 — 安装 DreamZero,不安装仿真器依赖:
# 国内用户可以添加 --use-mirror 加速下载。
bash requirements/install.sh embodied --model dreamzero
source .venv/bin/activate
选项 2:SFT + LIBERO 评测 — 额外安装 LIBERO 仿真依赖:
bash requirements/install.sh embodied --model dreamzero --env libero
source .venv/bin/activate
单独克隆 DreamZero 仓库,并在 SFT 或评测前设置 DREAMZERO_PATH:
git clone https://github.com/RLinf/dreamzero.git
export DREAMZERO_PATH=/path/to/dreamzero
这些命令会:
通过
requirements/install.sh创建 DreamZero 专用 uv 虚拟环境。默认只安装离线 SFT 依赖;如果需要仿真评测,则额外安装 LIBERO。
通过
DREAMZERO_PATH让外部 DreamZero 包可导入;examples/sft/run_vla_sft.sh也会将其加入PYTHONPATH。
模型准备#
从 checkpoint 继续训练#
设置 actor.model.model_path 为已下载的权重目录;架构与权重从该目录加载。可选 checkpoint:
DreamZero 14B(DROID / AgiBot): DreamZero-DROID、 DreamZero-AgiBot — 参考
droid_sft_dreamzero_14b.yamlRLinf 5B(LIBERO SFT): RLinf-DreamZero-WAN2.2-5B-LIBERO-SFT-Step18000 — 参考
libero_sft_dreamzero_5b.yaml并将model_path指向该目录
下载示例:
pip install -U huggingface_hub
huggingface-cli download GEAR-Dreams/DreamZero-DROID --local-dir ./DreamZero-DROID
YAML 示例(DROID + 官方 14B,见 droid_sft_dreamzero_14b.yaml):
defaults:
- model/dreamzero_14b@actor.model
actor:
model:
model_path: ./DreamZero-DROID
tokenizer_path: google/umt5-xxl
embodiment_tag: oxe_droid
AgiBot 数据将 model_path 换为 ./DreamZero-AgiBot 即可。
从头训练(WAN2.2 组件冷启动)#
设置 model_path: null,并填写各 *_pretrained_path。需从 Hugging Face 下载:
Wan-AI/Wan2.2-TI2V-5B (DiT、T5、VAE)
Wan2.1 CLIP (
models_clip_open-clip-xlm-roberta-large-vit-huge-14.pth不在 5B 包内)
下载示例:
huggingface-cli download Wan-AI/Wan2.2-TI2V-5B --local-dir ./Wan2.2-TI2V-5B
huggingface-cli download Wan-AI/Wan2.1-I2V-14B-480P \
models_clip_open-clip-xlm-roberta-large-vit-huge-14.pth --local-dir ./Wan2.1-CLIP
huggingface-cli download google/umt5-xxl --local-dir ./umt5-xxl
YAML 示例(LIBERO 冷启动,见 libero_sft_dreamzero_5b.yaml):
defaults:
- model/dreamzero_5b@actor.model
actor:
model:
model_path: null
tokenizer_path: google/umt5-xxl
diffusion_model_pretrained_path: Wan-AI/Wan2.2-TI2V-5B
image_encoder_pretrained_path: Wan-AI/Wan2.1-I2V-14B-480P/models_clip_open-clip-xlm-roberta-large-vit-huge-14.pth
text_encoder_pretrained_path: Wan-AI/Wan2.2-TI2V-5B/models_t5_umt5-xxl-enc-bf16.pth
vae_pretrained_path: Wan-AI/Wan2.2-TI2V-5B/Wan2.2_VAE.pth
metadata_json_path: /path/to/metadata.json
embodiment_tag: libero_sim
数据准备#
训练数据需为 LeRobot v2/v3 布局(含 meta/、data/ 等)。通过 data.train_data_paths 指定本地目录或 Hugging Face 数据集 ID。
数据集下载#
当前支持:
LIBERO: physical-intelligence/libero —
embodiment_tag: libero_sim,配置见libero_sft_dreamzero_14b.yaml/libero_sft_dreamzero_5b.yamlDROID: GEAR-Dreams/DreamZero-DROID-Data —
embodiment_tag: oxe_droid,配置见droid_sft_dreamzero_14b.yamlFranka PnP:RLinf/dreamzero-franka-pnp —
embodiment_tag: franka_pnp,变换实现见data_transforms/franka_pnp.py``(继承 ``libero_sim双视角布局)混合训练:
libero_franka_mix_sft_dreamzero_5b.yaml中data.train_data_paths为列表,每项可指定不同的dataset_path/embodiment_tag/metadata_json_path/weight
下载示例:
pip install -U huggingface_hub
# LIBERO
huggingface-cli download physical-intelligence/libero --repo-type dataset --local-dir ./libero
# DROID
huggingface-cli download GEAR-Dreams/DreamZero-DROID-Data --repo-type dataset --local-dir ./DreamZero-DROID-Data
# Franka PnP 真机数据
huggingface-cli download RLinf/dreamzero-franka-pnp --repo-type dataset --local-dir ./franka_pnp
生成 metadata.json#
在新数据集或冷启动(无 experiment_cfg/metadata.json)时,必须先为对应 embodiment_tag 生成归一化统计:
# LIBERO
python toolkits/lerobot/generate_dreamzero_metadata.py \
--preset libero_sim \
--dataset-root /path/to/libero \
--output-metadata /path/to/metadata.json
# DROID(多数据集可 --merge)
python toolkits/lerobot/generate_dreamzero_metadata.py \
--preset oxe_droid \
--dataset-root /path/to/droid \
--output-metadata /path/to/metadata.json \
--merge
# Franka PnP
python toolkits/lerobot/generate_dreamzero_metadata.py \
--preset franka_pnp \
--dataset-root /path/to/franka_pnp \
--output-metadata /path/to/franka_pnp_metadata.json
然后在配置中设置 actor.model.metadata_json_path ( 或放到 model_path/experiment_cfg/metadata.json ) 。
配置参考#
配置文件由 Hydra 管理,入口脚本为 examples/sft/train_vla_sft.py。下面按 数据相关 与 模型及训练超参相关 分别说明含义与作用。
数据相关配置#
字段 |
含义与作用 |
|---|---|
|
单数据集:LeRobot 根路径或 HF |
|
是否懒加载 mp4 视频。 |
|
|
|
LeRobot 视频解码后端: |
|
视频时间戳与目标帧时间的容差(秒)。 |
|
Parquet episode 缓存上限(episode 数),影响内存与 IO。 |
|
DataLoader 并行与预取,影响数据吞吐。 |
时间对齐要点(数据采样 vs 模型块)
宏观时间块数来自
actor.model.action_head_cfg.config.diffusion_model_cfg.max_chunk_size(常见为 4;官方 Groot DROID 配方可为 5)。actor.model.action_horizon是 DreamTransform / WAN 每个块内的动作步数(LIBERO 常用 16,DROID 常用 24),不是数据集宏观步长。multi_anchor下,数据集侧动作序列长度约为action_horizon * max_chunk_size(如 LIBERO 64、DROID 96)。视频时间维在预设里配置
action_head_cfg.config.num_frames(DreamZero 默认 33,对应8 * max_chunk_size + 1);未设置时自动推导。
模型与训练相关配置#
标识与权重路径
字段 |
含义与作用 |
|---|---|
|
固定为 |
|
完整 checkpoint 目录;非 |
|
UMT5 分词器路径(训练与 collate 均需)。 |
|
因果 DiT(扩散骨干)预训练权重;冷启动必填。 |
|
WAN 图像编码器;WAN2.2 需指向 WAN2.1 CLIP 权重。 |
|
T5 文本编码器权重。 |
|
VAE 权重;WAN2.2 对应 |
|
数据集 |
|
选择数据变换与 collate 模板: |
时序与动作形状(需与数据、WAN 容量一致)
字段 |
含义与作用 |
|---|---|
|
每个 WAN 时间块内的动作步数(LIBERO 16,DROID 24)。 |
|
每个样本的状态行数(通常为 1,每个宏观锚点一个状态)。 |
|
与 |
|
多锚点宏观时间块数 / Causal DiT 容量;与 |
|
DreamTransform 填充与文本序列上限。 |
视频尺寸与 DROID 特有项
字段 |
含义与作用 |
|---|---|
|
WAN 策略头在 多视角拼接后 的目标分辨率(5B 预设如 176×320;Libero 常用 160×320)。仅作用于模型内部 resize, 不要 用于 data transform 的单视角 resize。 |
|
(可选)DROID 各视角 resize 覆盖。 |
|
是否使用相对动作及作用维度;DROID 常对 |
其它模型训练项
precision:Actor / Optimizer 侧的主精度设置(fp32/bf16)。推荐precision: fp32,并配合actor.fsdp_config.mixed_precision做混合精度训练:优化器状态与主参数保持 FP32(数值更稳),前向/反向的实际矩阵运算由 FSDP 在mixed_precision中降为 BF16(省显存、提速)。示例:actor: model: precision: fp32 fsdp_config: mixed_precision: param_dtype: bf16 reduce_dtype: bf16 buffer_dtype: bf16
若将
precision设为bf16,优化器也会以较低精度维护状态,一般不如上述组合稳定。启用 FSDP CPU offload 时,通常保持precision: fp32。is_lora:是否 LoRA 微调(DreamZero SFT 示例多为全参False)。actor.micro_batch_size/actor.global_batch_size:每 GPU 微批与全局有效 batch(需能被 GPU 数整除关系约束)。actor.optim.*:学习率、warmup、cosine 等。actor.fsdp_config:FSDP2 分片、梯度检查点;mixed_precision控制计算/通信 dtype(与actor.model.precision配合,见上)。
配置示例对照
# ---------- 数据(单数据集)----------
data:
train_data_paths: /path/to/libero
lazy_load: True
sampling_mode: multi_anchor
video_backend: torchcodec
num_workers: 8
# ---------- 数据(混合,见 libero_franka_mix_sft_dreamzero_5b.yaml)----------
data:
train_data_paths:
- dataset_path: /path/to/libero
weight: 4
embodiment_tag: libero_sim
metadata_json_path: /path/to/libero_metadata.json
- dataset_path: /path/to/franka_pnp
weight: 1
embodiment_tag: franka_pnp
metadata_json_path: /path/to/franka_metadata.json
# ---------- 模型(从 checkpoint 继续)----------
actor:
model:
model_path: /path/to/DreamZero-DROID
tokenizer_path: /path/to/umt5-xxl
embodiment_tag: oxe_droid
action_horizon: 24
metadata_json_path: /path/to/metadata.json # 若无 experiment_cfg/metadata.json
运行#
在仓库根目录执行:
# LIBERO + WAN2.1(checkpoint,dreamzero_14b 预设)
bash examples/sft/run_vla_sft.sh libero_sft_dreamzero_14b
# LIBERO + WAN2.2(冷启动,dreamzero_5b 预设)
bash examples/sft/run_vla_sft.sh libero_sft_dreamzero_5b
# DROID + WAN2.1(dreamzero_14b 预设,model_path 指向 DreamZero-DROID)
bash examples/sft/run_vla_sft.sh droid_sft_dreamzero_14b
# LIBERO + Franka 混合(WAN2.2,见 libero_franka_mix_sft_dreamzero_5b.yaml)
bash examples/sft/run_vla_sft.sh libero_franka_mix_sft_dreamzero_5b
脚本等价于:
python examples/sft/train_vla_sft.py \
--config-path examples/sft/config/ \
--config-name CONFIG_NAME \
runner.logger.log_path=LOG_DIR
日志目录:
仓库根目录下
logs/时间戳-config_name/run_embodiment.log
断点续训可设置 runner.resume_dir 指向 checkpoint 目录。
独立评测#
独立的仿真或真机评测由统一的 Evaluation 章节负责。本 SFT 页面只保留 DreamZero 特有的衔接点。
目标 |
从这里开始 |
DreamZero 专属字段 |
|---|---|---|
LIBERO 仿真 |
LIBERO 评测指南 和 |
将 |
Franka 部署 / 评测 |
真机评测指南 和 |
设置完整 DreamZero checkpoint 目录、 |
命令格式、Hydra 覆盖、日志与结果文件见 Evaluation CLI 参考
和 Evaluation 结果参考。如果 SFT checkpoint 仍是
.distcp 分片格式,请先按 checkpoint 转换指南 转换。
备注
DreamZero rollout 评测要求 max_steps_per_rollout_epoch 能被
actor.model.num_action_chunks 整除。
预训练 checkpoint 评测结果
RLinf-DreamZero-WAN2.2-5B-LIBERO-SFT-Step18000 在 LIBERO Spatial 上的评测结果(num_trajectory=512):
训练步数 |
success_once |
|---|---|
3000 |
7.81% |
6000 |
66.41% |
9000 |
89.06% |
12000 |
88.48% |
15000 |
66.60% |
18000 |
96.68% |
21000 |
90.43% |
可视化与结果#
查看
run_embodiment.log:time/step是否稳定;train/loss、train/action_loss、train/dynamics_loss是否合理。TensorBoard:
tensorboard --logdir ./logs --port 6006
开跑后尽早检查:
images/state/action的 shape、dtype、数值范围state_mask/action_mask/text_attention_mask有效比例WAN2.2 时确认输入分辨率与
frame_seqlen与config.json或预设一致
扩展 DreamZero 到新的 embodiment_tag#
当要在 新的机器人 或 新 LeRobot 数据集 上训练 DreamZero SFT 时,需要新增一个 embodiment_tag,并在 RLinf 中注册对应的数据变换与元数据生成逻辑。建议以现有实现为模板对照修改:
rlinf/data/datasets/dreamzero/data_transforms/libero_sim.py(双视角、简单 state/action 列)rlinf/data/datasets/dreamzero/data_transforms/franka_pnp.py(双视角,继承libero_sim,自定义num_frames等)rlinf/data/datasets/dreamzero/data_transforms/oxe_droid.py(三视角,meta/modality.json切片)
整体数据流:
LeRobot 数据集
→ DreamZeroLeRobotDataset(按 transform 链里的 keys 读 parquet/mp4)
→ ComposedModalityTransform + DreamTransform(归一化、多视角拼接、tokenize)
→ DreamZeroCollator → 训练
步骤 1:实现 embodiment 变换模块#
在 rlinf/data/datasets/dreamzero/data_transforms/ 下新建 your_tag.py,实现 DreamZeroEmbodimentTransform 协议(见 base.py),至少包含:
成员 / 方法 |
说明 |
|---|---|
|
字符串标识,与配置里 |
|
|
|
该 embodiment 默认每块动作步数(LIBERO 16、DROID 24),与 |
|
返回 |
|
组装 |
|
为多视角布局生成 T5 文本前缀(须与 Groot 训练模板语义一致)。 |
|
将 |
|
|
modality_keys 命名约定(与 DreamZeroLeRobotDataset 解析逻辑挂钩):
视频:
video.short_name(如video.image),短名通过meta/modality.json的original_key或info.json的observation.images.*/ 裸列名解析到真实特征列。状态/动作:
state.name、action.name;有meta/modality.json时用start/end切片;否则回退到observation.state/action整列或启发式切片(见lerobot_dataset.py中_build_component_sources)。训练 YAML 里的
video.*/state.*/action.*必须与 transform 里ConcatTransform的*_concat_order一致。
步骤 2:注册到 RLinf#
在
rlinf/data/datasets/dreamzero/data_transforms/embodiment_tag.py的EmbodimentTag枚举中增加成员(值等于TAG字符串)。编辑
rlinf/data/datasets/dreamzero/data_transforms/__init__.py:from ...your_tag import YourEmbodimentDataTransform在
_EMBODIMENT_REGISTRY中加入YourEmbodimentDataTransform.TAG: YourEmbodimentDataTransform
无需手写 Groot patch:get_model() 会将 groot.vla.data.schema.embodiment_tags.EmbodimentTag 替换为上述 RLinf 枚举。
未注册时,build_dreamzero_composed_transform 会报错并列出已有 tag。
步骤 3:生成 metadata.json#
为新数据集计算归一化统计,输出键名必须等于 TAG:
方式 A(推荐):在 toolkits/lerobot/generate_dreamzero_metadata.py 的 PRESETS 中增加一项(字段参考 libero_sim / oxe_droid:state_key、action_key、video_keys、use_modality_json),然后:
python toolkits/lerobot/generate_dreamzero_metadata.py \
--preset YOUR_TAG \
--dataset-root /path/to/lerobot_dataset \
--output-metadata /path/to/metadata.json
方式 B:不改脚本,用手动参数(--embodiment-tag、--state-key、--action-key、--video-keys、--use-modality-json)。
在训练配置中设置 actor.model.metadata_json_path (或放到 model_path/experiment_cfg/metadata.json)。
步骤 4:编写 / 调整训练配置#
复制 libero_sft_dreamzero_14b.yaml、libero_sft_dreamzero_5b.yaml 或 droid_sft_dreamzero_14b.yaml,至少修改:
data:
train_data_paths: /path/to/your_lerobot
lazy_load: True # multi_anchor 必须为 True(mp4 数据)
sampling_mode: multi_anchor
actor:
model:
embodiment_tag: "YOUR_TAG"
metadata_json_path: /path/to/metadata.json
action_horizon: 16 # 与 DEFAULT_ACTION_HORIZON 一致
# 从 checkpoint 继续时核对 action_loss_embodiment_ids 是否包含你的 projector ID
target_video_height: ...
target_video_width: ...
relative_action: ...
relative_action_keys: [...]
若冷启动 WAN,在 examples/sft/config/model/dreamzero_5b.yaml ( 或 14b)的 action_head_cfg.config.action_loss_embodiment_ids 中加入新 ID。
步骤 5:验证(短跑 + 数据检查)#
单独跑 metadata 脚本,确认
metadata.json中对应 tag 条目的statistics/modalities维度与 parquet 一致。用 50–200 step 启动 SFT,检查日志无
Could not map transform video keys、embodiment_tag not found in metadata等错误。在 TensorBoard / 日志中确认
train/action_loss有限;检查 batch 内images拼接形状、embodiment_id与DEFAULT_TAG_MAPPING一致。
易错细节 checklist
embodiment_tag字符串在四处置一致:embodiment_tag.py枚举成员值、TAG、配置 /train_data_paths子项、metadata.json顶层键。multi_anchor+ mp4 数据:必须将data.lazy_load设为True。action_horizon×max_chunk_size决定数据集动作长度;勿只改其一。多视角拼接顺序与 prompt 文案不一致会导致训练信号错乱。
继续微调官方权重时,随意改
DEFAULT_TAG_MAPPING的整数 ID 会导致 projector 对不上。视频 resize:单视角
VideoResize写在各 embodiment 的data_transforms代码中(如libero_sim、franka_pnp均为 256×256);target_video_height/width仅用于 WAN 在多视角拼接 之后 的模型内 resize,二者勿混用。 混合数据集训练 须保证各子数据集经DreamTransform拼接后输出相同images空间形状(H×W),否则 collate 无法组 batch;若各 embodiment 拼接布局不同(如oxe_droid为 2×2 网格)或单视角默认尺寸不一致,请在对应 transform 模块中手动对齐VideoResize参数。推理 / 评测:
examples/embodiment/config/下的 DreamZero 评测配置 中同样需要正确的embodiment_tag。
若仅推理、不改 RLinf 代码,且 Groot/DreamZero 上游已支持该 tag,有时只需准备 metadata.json 与评测配置;SFT 新数据 则须完成上述枚举成员、registry 注册与 transform 实现(get_model 会自动 patch Groot EmbodimentTag)。
常见问题#
找不到权重(No safetensors weights)
检查
model_path下是否存在model.safetensors或分片索引冷启动时确认各
*_pretrained_path可访问且与架构匹配
WAN2.2 维度不匹配
核对有效配置(
model_path/config.json或dreamzero_5b预设)中diffusion_model_cfg是否为 ti2v、in_dim/out_dim=48、vae_cfg为WanVideoVAE38图像编码器须使用 WAN2.1 CLIP 路径
metadata.json 找不到
运行
toolkits/lerobot/generate_dreamzero_metadata.py并设置metadata_json_path确认 JSON 内包含与
embodiment_tag同名的键
action_loss 异常偏高
检查归一化统计是否与当前数据集一致
检查
relative_action与数据是否冲突核对
action_horizon、max_chunk_size与sampling_mode是否匹配
DROID 视频尺寸错误
勿将
target_video_height/width用于 data transform 的单视角 resize;DROID 视角尺寸在oxe_droidtransform 代码中调整
multi_anchor 报错要求 lazy_load
设置
data.lazy_load: True
AttributeError: GR1_UNIFIED_SEGMENTATION或未知EmbodimentTag数据 transform 链须使用
dream_transform.DreamTransform(RLinf 子类),勿直接实例化 Groot 基类新 tag 须在
embodiment_tag.py与_EMBODIMENT_REGISTRY注册;训练经get_model()加载模型时会 patch Groot 枚举
实践建议#
追求稳定收敛时,优先从已发布的 DreamZero 权重继续 SFT(设置
model_path)。全量适配 WAN2.2 可冷启动,但需更大数据与更长训练;改配置后先用 50–200 step 试跑验证 shape 与 loss。
每次更换数据集或
embodiment_tag,务必重新生成或更新metadata.json。LIBERO 与 DROID 的
action_horizon、embodiment_tag、多视角拼接逻辑不同,不要混用配置模板。
训练加速#
RLinf 团队对 DreamZero 的训练管线进行了深度的系统级重构与加速。相比 DreamZero 官方提供的基线训练脚本,RLinf 实现了近 4 倍的训练吞吐加速,同时保持甚至优化了收敛效果。
端到端性能实测#
以下所有测试均在 Droid 数据集(单样本含左、右、腕部三个视角,视频规格 33 frames × 480 × 640)上,使用 8×H100 GPU 完成。
DreamZero-14B
在 14B 大模型上,由于显存压力巨大,官方基线通常被迫采用 DeepSpeed ZeRO-offload 方案,这导致了严重的计算/通信浪费与 CPU 换入换出开销。我们通过工程优化,以 FSDP2 full_shard 替代 DeepSpeed ZeRO-offload 方案,并进一步结合了计算图优化(算子融合与 CUDA Graph)。
实验配置 |
迭代耗时 (Step Time) |
训练吞吐 (Samples/sec/GPU) |
性能收益 (vs. 基线) |
|---|---|---|---|
DeepSpeed ZeRO2 + Offload(官方版本) |
18.0 s |
0.055 |
基线 |
FSDP2 Base(原生支持) |
9.0 s |
0.111 |
+100%(2.0x) |
RLinf 深度优化版 |
6.7 s |
0.150 |
+170%(2.7x) |
14B 模型使用 MBS=1 和 GBS=8 进行测试。RLinf 相比原生 DeepSpeed 方案实现了 2.7 倍**的加速;即便相比于未经优化的 FSDP2,吞吐量也进一步提升了 **35%。
DreamZero-5B
对于 5B 中等规模模型,RLinf 的优势在于能够通过高效率的重计算逻辑稳定开启更大的 Microbatch Size,并配合计算图调优,彻底释放 GPU 算力。
实验配置 |
迭代耗时 (Step Time) |
训练吞吐 (Samples/sec/GPU) |
性能收益 (vs. 基线) |
|---|---|---|---|
DeepSpeed ZeRO2 + Offload(官方版本,mbs=32 × 8 GPU) |
30.0 s |
1.10 |
基线 |
FSDP2 Base(mbs=1 × 8 GPU) |
1.8 s |
0.56 |
-49%(受限于小 MBS 算子效率低、CPU 开销显著、FSDP2 通信无法掩盖) |
RLinf 深度优化版(mbs=32 + Recompute × 8 GPU) |
7.2 s |
4.44 |
+300%(4.0x) |
5B 模型使用 GBS=256 测试。FSDP2 Base 版本由于 PyTorch 的一些限制不能开大 MBS,导致吞吐受限;RLinf 解决了这些问题并取得了显著的吞吐增长。训练吞吐从官方代码的 1.1 samples/sec/gpu 飙升至 4.44 samples/sec/gpu,实现了约 4 倍的训练加速。
DreamZero 5B 与 14B 模型的加速效果对比#
DreamZero 5B 与 14B 模型的吞吐提升对比#