本文档面向使用 LoongForge框架进行具身模型训练的用户,聚焦框架级通用能力,说明框架各模块支持的功能、配置入口及使用方式。具体模型的专用训练方案、数据预处理脚本、性能优化项目请参阅对应的 快速入门 文档。
本章说明 embodied 的目录结构与启动脚本约定,并介绍 TrainingArgs / ModelConfig / DataConfig 三类配置对象及其覆盖优先级。
| 路径 | 说明 |
|---|---|
examples/embodied/ |
模型级启动脚本目录,可通过脚本末尾的透传参数覆盖默认配置 |
configs/models/embodied/ |
模型默认 YAML 配置目录,包含 model: / data: 两个顶层配置段 |
loongforge/embodied/train.py |
训练入口,负责解析配置、构建 Trainer 并启动训练 |
loongforge/embodied/train/training_args.py |
通用训练参数定义文件,负责生成 shell CLI |
loongforge/embodied/train/config_map.py |
模型配置路由表,将 --model-name 绑定到 YAML、ModelConfig 与 DataConfig |
loongforge/embodied/model/ |
模型组网、模型注册 |
loongforge/embodied/data/datasets/ |
数据处理相关功能 |
训练链路如下:
examples/embodied/<model>/run_*.sh
↓
loongforge/embodied/train.py
↓
parse_train_args()
↓
build_model_trainer()
↓
trainer.train()
启动脚本通常负责设置环境变量、路径、分布式参数与模型默认训练参数,并在命令末尾保留 "$@",用于透传用户追加的 shell flag 或 YAML dotlist 覆盖项:
PYTHONPATH=$LOONGFORGE_PATH:${PYTHONPATH:-} \
torchrun "${DISTRIBUTED_ARGS[@]}" \
"$LOONGFORGE_PATH/loongforge/embodied/train.py" \
"${MODEL_CONFIG_ARGS[@]}" \
"${DATA_ARGS[@]}" \
"${TRAINING_ARGS[@]}" \
"${DISTRIBUTED_TRAINING_ARGS[@]}" \
"${LOGGING_ARGS[@]}" \
"$@"示例:
bash examples/embodied/pi05/run_pi05_ddp_finetune.sh \
--train-iters 10000 \
--per-device-batch-size 8 \
model.action_horizon=64 \
data.image_size=256将配置分为三类对象:
| 配置对象 | 配置入口 | 作用域 | 示例 |
|---|---|---|---|
TrainingArgs |
Shell flag | 训练流程参数 | --train-iters, --lr-base |
ModelConfig |
YAML 或 model.xxx=... |
模型结构与训练策略参数 | model.action_horizon=64 |
DataConfig |
YAML 或 data.xxx=... |
数据加载与预处理参数 | data.image_size=256 |
配置优先级为:
dataclass 默认值 < YAML 配置 < shell flag / dotlist 覆盖
数据处理模块负责:将数据集样本转换为模型可直接消费的 PreparedBatch,用户通过 TrainingArgs 指定数据集格式与 DataLoader 行为,通过 DataConfig 配置模型相关的数据处理逻辑。
数据处理链路:
Dataset
↓
sample-level transform
↓
preprocessor / collate_fn
↓
PreparedBatch
↓
batch.to(device)
↓
model.forward(batch)
通过 --dataset-format 选择数据读取格式,支持 LeRobot、HDF5 和 dummy 三种格式。dummy_datasets 可在无真实数据时生成随机样本,用于调试验证。
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| 数据格式 | --dataset-format |
lerobot_datasets |
lerobot_datasets, hdf5_datasets, dummy_datasets |
选择数据集格式 |
| 数据路径 | --dataset-path |
None |
本地路径或数据集 id | 训练数据路径 |
| 数据 split | --split |
train |
字符串 | 数据集切分 |
| dummy 样本数 | --num-samples |
100 |
正整数 | dummy_datasets 下生成的样本数 |
使用 LeRobot 格式时,可通过以下参数进一步控制数据加载行为:指定数据集格式版本(v2.0 / v2.1 / v3.0)、选择针对不同机器人或任务的构建策略、配置视频解码后端,以及指定 Robot型号以匹配 embodiment 的 action-state 布局。
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| LeRobotdataset 版本 | --lerobotdataset-version |
v3.0 |
v2.0, v2.1, v3.0 |
解析不同 LeRobot 磁盘格式 |
| 数据策略 | --dataset-strategy |
default |
default, fastwam, groot_n1_7, cosmos3_droid, dreamzero |
选择 LeRobot 构建策略 |
| 视频后端 | --video-backend |
torchcodec |
torchcodec, decord, opencv, pyav, torchvision_av |
视频解码实现 |
| robot 类型 | --robot-type |
None |
字符串 | 选择 embodiment / action-state layout |
注意:
--video-backend用于指定--lerobotdataset-versionv2.x 系列及其变体的数据读取后端;v3.0 系列默认支持torchcodec、pyav两种后端。
本节配置项控制 DataLoader 的 worker 并行度、多进程启动方式、分布式 index 切分与流式读取模式,覆盖从数据预取到超大规模数据集加载的常见需求。
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| worker 数 | --num-workers |
4 |
非负整数 | 每个 rank 的 DataLoader worker 数 |
| worker seed | --dataloader-seed-workers |
False |
布尔开关 | 是否基于 --seed 设置 worker seed |
| 多进程上下文 | --dataloader-multiprocessing-context |
None |
fork, spawn, forkserver |
DataLoader worker 启动方式 |
| 分布式采样方式 | --distributed-sampler-mode |
cyclic |
cyclic, block |
分布式 sampler 的 index 切分方式(可扩展) |
| 流式读取 | --streaming |
False |
布尔开关 | 使用 streaming / iterable dataset |
训练配置模块负责解析 shell 参数和 YAML 文件,并生成 TrainingArgs、ModelConfig、DataConfig 三个类型化配置对象。通用训练能力均通过 TrainingArgs 暴露为 shell flag。
支持以下能力:
- 通过
--model-name选择预注册模型,自动绑定 YAML、ModelConfig与DataConfig - 通过
--config-file指定默认 YAML,使用自定义配置文件 - 通过
--tokenizer-path指定 tokenizer 路径(本地路径或 HF repo id)
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| 选择模型 | --model-name |
None |
config_map.py 中注册的模型名 |
选择模型 schema、默认 YAML、ModelConfig 与 DataConfig |
| 指定 YAML | --config-file |
None |
YAML 文件路径 | 覆盖 --model-name 对应的默认 YAML |
| 指定 tokenizer | --tokenizer-path |
None |
本地路径或 HF repo id | 设置 tokenizer 路径,并同步到 TOKENIZER_PATH 环境变量 |
注意: 即使使用
--config-file,仍需提供--model-name,用于选择结构化配置类。
本节配置项控制训练规模(迭代步数与 batch 大小)、可复现性(随机种子)与产物输出目录,通过梯度累积在不增加单卡显存的前提下弹性扩大全局 batch。
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| 训练总步数 | --train-iters |
150000 |
正整数 | optimizer update 步数 |
| 每设备 batch | --per-device-batch-size |
4 |
正整数 | 单个 rank forward时的micro-batch |
| 梯度累积 | --gradient-accumulation-steps |
1 |
正整数 | 每次 optimizer step 前累积的 micro-batch 数 |
| 随机种子 | --seed |
3047 |
整数 | 用于训练初始化与数据随机性控制 |
| 输出目录 | --output-dir |
outputs/default |
路径 | 保存日志、checkpoint 与运行产物 |
全局 batch 计算方式:
global_batch_size = per_device_batch_size * world_size * gradient_accumulation_steps
学习率与优化器相关能力较多,本节按「基础调度 → 优化器实现 → 分组学习率」的顺序展开。
支持以下能力:
- 基础学习率与分模块独立学习率
- 10 种学习率调度策略,涵盖线性、cosine、polynomial、恒定及带 warmup / min_lr 变体
- 6 种优化器实现,包含标准 AdamW 及多种 CUDA 融合加速变体
- 梯度裁剪与权重衰减,支持对 bias / norm 参数单独分组
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| 基础学习率 | --lr-base |
2.5e-5 |
float | 默认参数组学习率 |
| 学习率策略 | --lr-decay-style |
cosine_with_min_lr |
见下表 | scheduler 类型 |
| warmup 步数 | --lr-warmup-iters |
2000 |
非负整数 | 线性 warmup 步数 |
| decay 步数 | --lr-decay-iters |
None |
正整数或不传 | 不传时使用 --train-iters |
| 最小学习率 | --min-lr |
1e-6 |
float | decay 下限 |
| 梯度裁剪 | --clip-grad |
1.0 |
float,<=0 表示关闭 |
最大梯度范数 |
| 权重衰减 | --weight-decay |
0.01 |
float | decoupled weight decay 系数 |
| 权重衰减分组 | --weight-decay-grouping |
all |
all, bias_norm |
是否对 bias / norm 参数禁用 weight decay |
--lr-decay-style 支持 10 种调度策略,涵盖linear、cosine、polynomial等。
| 取值 | 说明 |
|---|---|
linear |
warmup 后线性衰减 |
cosine |
warmup 后 cosine 衰减 |
cosine_with_restarts |
cosine 衰减并带 hard restart |
polynomial |
polynomial decay |
constant |
恒定学习率 |
constant_with_warmup |
warmup 后保持恒定 |
inverse_sqrt |
inverse sqrt decay |
cosine_with_min_lr |
cosine 衰减到 --min-lr |
cosine_warmup_with_min_lr |
带最小 LR 的 cosine warmup |
lambda_linear |
框架自定义 cycle linear scheduler |
通过 --optimizer 指定优化器实现,支持标准 AdamW、多种融合加速实现(PyTorch / TransformerEngine / Apex)及 Adam、SGD:
| 取值 | 说明 |
|---|---|
AdamW(默认) |
标准 AdamW |
TorchFusedAdamW |
PyTorch fused AdamW |
TEFusedAdamW |
TransformerEngine FusedAdam |
ApexFusedAdamW |
Apex FusedAdam |
Adam |
torch Adam |
SGD |
torch SGD |
Fused Adam 加速实现说明:
- TEFusedAdamW:将参数更新融合为单次 CUDA kernel,显著降低显存带宽压力,依赖
Transformer-engine - ApexFusedAdamW:多参数组融合更新,在大模型场景下优化器步骤耗时更低,依赖
apex
通过 --lr-group 为不同模块配置独立学习率,常用于微调时对 backbone 使用较小学习率、对动作头使用较大学习率,未匹配的参数使用 --lr-base。
- 配置项:
--lr-group - 默认值:
None(不启用,所有参数统一使用--lr-base) - 格式:
module.path=lr,module.path=lr
示例:
bash examples/embodied/pi05/run_pi05_ddp_finetune.sh \
--lr-base 1.0e-4 \
--lr-group "model.backbone=1.0e-5,model.action_head=1.0e-4"配置规则:
- 路径匹配顺序敏感,子模块路径应位于父模块路径之前
- 未匹配参数使用
--lr-base - 模块路径以模型实现中的实际属性路径为准
Checkpoint 模块提供以下能力:
- 权重保存:支持 safetensors、pt、dcp 三种格式,其中 DCP 可启用异步保存
- 训练状态保存:持久化 optimizer、scheduler、RNG 与 DataLoader 状态,用于断点续训
- 预训练加载:可指定外部 checkpoint 初始化模型参数
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| 加载预训练权重 | --pretrained-checkpoint |
None |
checkpoint 路径 | 用于初始化模型参数 |
| 续训 | --resume |
False |
布尔开关 | 从 output_dir/checkpoints 查找最新 checkpoint 并恢复 |
| 保存间隔 | --save-interval |
10000 |
非负整数,0 表示关闭 |
每 N 个 update step 保存一次 checkpoint |
| 保存格式 | --save-format |
safetensors |
safetensors, pt, dcp |
checkpoint 文件格式 |
| 保存训练状态 | --save-training-state |
True |
布尔开关 | 保存 optimizer、scheduler、RNG 与 DataLoader 状态 |
| 异步保存 | --async-save |
False |
布尔开关 | DCP 格式下可启用异步保存 |
续训示例:
bash examples/embodied/pi05/run_pi05_ddp_finetune.sh \
--output-dir /path/to/previous_run \
--resume支持以下监控方式:
- 控制台 metrics 日志,可配置记录间隔与阶段计时详细程度
- W&B 集成,支持 online / offline / disabled 三种模式
- TensorBoard 集成,指定目录即可启用
- 可按 rank 粒度控制 loss 聚合与输出来源
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| 日志间隔 | --log-interval |
1 |
正整数 | 每 N 步记录 metrics |
| 详细计时间隔 | --detail-log-interval |
20 |
非负整数 | 每 N 步记录阶段耗时 |
| 计时日志级别 | --timing-log-level |
0 |
0, 1 |
阶段耗时日志详细程度 |
| W&B 项目 | --wandb-project |
loongforge |
字符串 | W&B project 名称 |
| W&B 模式 | --wandb-mode |
disabled |
online, offline, disabled |
W&B 启用模式 |
| TensorBoard 目录 | --tensorboard-dir |
None |
路径 | 不传表示关闭 TensorBoard |
| loss 日志 rank | --loss-log-rank |
[-1] |
rank 列表,-1 表示全局平均 |
控制 loss 聚合与输出来源 |
通过 --freeze-modules 冻结指定模块参数,常用于微调时固定视觉编码器或语言模型主干,仅更新动作头等目标模块。模块路径以模型实现中的 named_modules() 为准,具体模型的常用冻结路径在对应 Quick Start 中说明。
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| 冻结模块 | --freeze-modules |
空字符串(不冻结任何模块) | 逗号分隔模块路径 | 将匹配模块参数设置为 requires_grad=False |
Trainer 模块负责训练生命周期编排,包括分布式上下文初始化、模型构建、权重加载、模型包装、优化器与 scheduler 构建、DataLoader 构建、训练循环、日志、checkpoint 与资源清理。
通过 --trainer-type 选择训练器,可选值为 trainer_builder.py 中注册的 Trainer 类名。默认的 FinetuneTrainer 适用于标准单数据流的监督微调;若涉及多数据流、特殊 loss 组合或非标准 step 调度,可在 trainer_builder.py 中注册自定义 Trainer 类。
支持两种分布式并行策略:
- DDP:标准数据并行,适用于模型与 optimizer state 均可放入单卡的场景;可叠加 ZeRO-1 分片 optimizer state 以节省显存
- FSDP:全参数分片,适用于模型、梯度或 optimizer state 超出单卡显存的场景;支持 HSDP(二维 mesh 分片)
训练精度支持 bfloat16(默认)、float16、float32。
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| 分布式策略 | --distributed-strategy |
fsdp |
ddp, fsdp |
选择 DDP 或 FSDP |
| 训练精度 | --dtype |
bfloat16 |
bfloat16, float16, float32 |
模型训练 dtype |
| DDP ZeRO-1 | --zero-optimizer |
False |
布尔开关 | DDP 下分片 optimizer state |
| HSDP shard size | --hsdp-shard-size |
None |
正整数 | FSDP 下启用 HSDP |
DDP 示例:
bash examples/embodied/pi05/run_pi05_ddp_finetune.sh \
--distributed-strategy ddp \
--dtype bfloat16FSDP 示例:
bash examples/embodied/pi05/run_pi05_fsdp_finetune.sh \
--distributed-strategy fsdp \
--dtype bfloat16DDP + ZeRO-1 示例:
bash examples/embodied/pi05/run_pi05_ddp_finetune.sh \
--distributed-strategy ddp \
--zero-optimizer策略选择建议:
| 场景 | 建议 |
|---|---|
| 模型参数与 optimizer state 可完整放入单卡 | DDP |
| 模型可放入单卡,但 optimizer state 显存占用较高 | DDP + ZeRO-1 |
| 模型、梯度或 optimizer state 难以放入单卡 | FSDP |
| 多节点训练,希望参数分片限制在 shard group 内、减少跨节点 FSDP 通信 | FSDP + HSDP |
以下参数提供对 DDP 策略的通信行为和 ZeRO-1 的精细控制,仅在 --distributed-strategy ddp 时生效:
- DDP 行为:可调节未使用参数检测、静态图优化、bucket 大小与 bucket view,用于减少通信开销或节省内存
- ZeRO-1:开启后分片 optimizer state,可进一步配置 bucket view 和 fp32 master 参数维护
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| 未使用参数检测 | --ddp-find-unused-parameters |
True |
布尔开关 | 模型存在条件分支时通常需要保持开启 |
| 静态图优化 | --ddp-static-graph |
False |
布尔开关 | 计算图每步稳定时可开启 |
| bucket view 梯度 | --ddp-gradient-as-bucket-view |
False |
布尔开关 | 复用 DDP bucket 内存 |
| DDP bucket 大小 | --ddp-bucket-cap-mb |
None |
整数 MB | 控制 DDP all-reduce bucket 大小 |
| ZeRO-1 | --zero-optimizer |
False |
布尔开关 | 分片 optimizer state |
| ZeRO bucket view | --zero-parameters-as-bucket-view |
False |
布尔开关 | ZeRO 下复用 bucket 内存 |
| ZeRO master 参数 | --zero-master-param-dtype |
none |
none, fp32 |
是否维护 fp32 master 参数 |
示例:
bash examples/embodied/pi05/run_pi05_ddp_finetune.sh \
--distributed-strategy ddp \
--no-ddp-find-unused-parameters \
--ddp-static-graph以下参数提供对 FSDP 分片、wrap 策略和 dtype 的精细控制,仅在 --distributed-strategy fsdp 时生效:
- 分片与 reshard:控制 forward 后是否立即 reshard,可针对 root group 单独配置
- wrap 策略:可手动指定或排除 FSDP unit 类,也可按参数量阈值自动包装
- dtype 控制:分片前参数 dtype、all-gather 后 dtype 与梯度 reduce dtype 均可独立配置
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| HSDP | --hsdp-shard-size |
None |
正整数 | 启用二维 mesh 的 shard 维度 |
| 默认 reshard 策略 | --fsdp-reshard-default |
None |
true, false, none, 大于 1 的整数 |
控制 forward 后参数 reshard |
| root reshard 策略 | --fsdp-reshard-root |
False |
true, false, none, 大于 1 的整数 |
root FSDP group 的 reshard 策略 |
| 指定 wrap 类 | --fsdp-wrap-modules |
None |
逗号分隔模块类名 | 指定 FSDP unit |
| 排除 wrap 类 | --fsdp-no-wrap-modules |
None |
逗号分隔模块类名 | 排除指定模块类 |
| 自动 wrap 阈值 | --fsdp-min-num-params |
1000000 |
非负整数 | 自动包装重复层的参数阈值 |
| leftover wrap 阈值 | --fsdp-leftover-min-num-params |
1000000 |
非负整数 | 自动包装剩余模块的参数阈值 |
| 原始参数 dtype | --fsdp-original-param-dtype |
None |
fp32, bf16, fp16 |
FSDP 分片前参数 dtype |
| unsharded 参数 dtype | --fsdp-unsharded-param-dtype |
None |
fp32, bf16, fp16 |
all-gather 后前向/反向 dtype |
| reduce dtype | --fsdp-reduce-dtype |
fp32 |
fp32, bf16, fp16 |
梯度 reduce dtype |
| cast forward inputs | --fsdp-cast-forward-inputs |
True |
布尔开关 | 是否将输入 cast 到参数 dtype |
训练过程中如遇 loss 异常波动、数值不稳定或显存 OOM,可通过以下手段介入:
- loss spike 防护与 NaN/Inf 检查,保障训练健壮性
- 确定性模式与 TF32 禁用,用于结果复现对齐
- 手动 GC 模式,减少 GC 引入的步间抖动
| 功能 | 配置项 | 默认值 | 取值 / 类型 | 说明 |
|---|---|---|---|---|
| loss spike 防护 | --loss-spike-threshold |
100.0 |
float | loss 超过阈值或为 NaN/Inf 时,该次 loss 贡献置零 |
| NaN / Inf 检查 | --check-for-nan-in-loss-and-grad |
True |
布尔开关 | 检查 loss 与 gradient 中的异常值 |
| 确定性模式 | --deterministic-mode |
False |
布尔开关 | 启用确定性算法 |
| 禁用 TF32 | --disable-tf32 |
False |
布尔开关 | 禁用 CUDA TF32 |
| 手动 GC | --manual-gc |
False |
布尔开关 | 关闭自动 GC 并改为显式触发 |
| 手动 GC 间隔 | --manual-gc-interval |
0 |
非负整数 | --manual-gc 启用后每 N 步执行 GC |