Skip to content

Latest commit

 

History

History
421 lines (315 loc) · 20.5 KB

File metadata and controls

421 lines (315 loc) · 20.5 KB

总览

本文档面向使用 LoongForge框架进行具身模型训练的用户,聚焦框架级通用能力,说明框架各模块支持的功能、配置入口及使用方式。具体模型的专用训练方案、数据预处理脚本、性能优化项目请参阅对应的 快速入门 文档。

1. 使用入口与配置约定

本章说明 embodied 的目录结构与启动脚本约定,并介绍 TrainingArgs / ModelConfig / DataConfig 三类配置对象及其覆盖优先级。

1.1 目录说明

路径 说明
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、ModelConfigDataConfig
loongforge/embodied/model/ 模型组网、模型注册
loongforge/embodied/data/datasets/ 数据处理相关功能

训练链路如下:

examples/embodied/<model>/run_*.sh
    ↓
loongforge/embodied/train.py
    ↓
parse_train_args()
    ↓
build_model_trainer()
    ↓
trainer.train()

1.2 启动脚本约定

启动脚本通常负责设置环境变量、路径、分布式参数与模型默认训练参数,并在命令末尾保留 "$@",用于透传用户追加的 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

1.3 配置分层

将配置分为三类对象:

配置对象 配置入口 作用域 示例
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 覆盖

2. 数据处理

数据处理模块负责:将数据集样本转换为模型可直接消费的 PreparedBatch,用户通过 TrainingArgs 指定数据集格式与 DataLoader 行为,通过 DataConfig 配置模型相关的数据处理逻辑。

数据处理链路:

Dataset
    ↓
sample-level transform
    ↓
preprocessor / collate_fn
    ↓
PreparedBatch
    ↓
batch.to(device)
    ↓
model.forward(batch)

2.1 数据集格式

通过 --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 下生成的样本数

2.2 LeRobot 数据策略

使用 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-version v2.x 系列及其变体的数据读取后端;v3.0 系列默认支持 torchcodecpyav 两种后端。

2.3 DataLoader 行为

本节配置项控制 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

3. 训练配置

训练配置模块负责解析 shell 参数和 YAML 文件,并生成 TrainingArgsModelConfigDataConfig 三个类型化配置对象。通用训练能力均通过 TrainingArgs 暴露为 shell flag。

3.1 模型配置选择

支持以下能力:

  • 通过 --model-name 选择预注册模型,自动绑定 YAML、ModelConfigDataConfig
  • 通过 --config-file 指定默认 YAML,使用自定义配置文件
  • 通过 --tokenizer-path 指定 tokenizer 路径(本地路径或 HF repo id)
功能 配置项 默认值 取值 / 类型 说明
选择模型 --model-name None config_map.py 中注册的模型名 选择模型 schema、默认 YAML、ModelConfigDataConfig
指定 YAML --config-file None YAML 文件路径 覆盖 --model-name 对应的默认 YAML
指定 tokenizer --tokenizer-path None 本地路径或 HF repo id 设置 tokenizer 路径,并同步到 TOKENIZER_PATH 环境变量

注意: 即使使用 --config-file,仍需提供 --model-name,用于选择结构化配置类。

3.2 训练基础参数

本节配置项控制训练规模(迭代步数与 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

3.3 学习率与优化器

学习率与优化器相关能力较多,本节按「基础调度 → 优化器实现 → 分组学习率」的顺序展开。

支持以下能力:

  • 基础学习率与分模块独立学习率
  • 10 种学习率调度策略,涵盖线性、cosine、polynomial、恒定及带 warmup / min_lr 变体
  • 6 种优化器实现,包含标准 AdamW 及多种 CUDA 融合加速变体
  • 梯度裁剪与权重衰减,支持对 bias / norm 参数单独分组

3.3.1 基础学习率与调度

功能 配置项 默认值 取值 / 类型 说明
基础学习率 --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

3.3.2 优化器实现

通过 --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

3.3.3 模块级分组学习率

通过 --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
  • 模块路径以模型实现中的实际属性路径为准

3.4 Checkpoint

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

3.5 日志与监控

支持以下监控方式:

  • 控制台 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 聚合与输出来源

3.6 冻结训练

通过 --freeze-modules 冻结指定模块参数,常用于微调时固定视觉编码器或语言模型主干,仅更新动作头等目标模块。模块路径以模型实现中的 named_modules() 为准,具体模型的常用冻结路径在对应 Quick Start 中说明。

功能 配置项 默认值 取值 / 类型 说明
冻结模块 --freeze-modules 空字符串(不冻结任何模块) 逗号分隔模块路径 将匹配模块参数设置为 requires_grad=False

4. 分布式 Trainer

Trainer 模块负责训练生命周期编排,包括分布式上下文初始化、模型构建、权重加载、模型包装、优化器与 scheduler 构建、DataLoader 构建、训练循环、日志、checkpoint 与资源清理。

4.1 Trainer 选择

通过 --trainer-type 选择训练器,可选值为 trainer_builder.py 中注册的 Trainer 类名。默认的 FinetuneTrainer 适用于标准单数据流的监督微调;若涉及多数据流、特殊 loss 组合或非标准 step 调度,可在 trainer_builder.py 中注册自定义 Trainer 类。

4.2 分布式策略

支持两种分布式并行策略:

  • DDP:标准数据并行,适用于模型与 optimizer state 均可放入单卡的场景;可叠加 ZeRO-1 分片 optimizer state 以节省显存
  • FSDP:全参数分片,适用于模型、梯度或 optimizer state 超出单卡显存的场景;支持 HSDP(二维 mesh 分片)

训练精度支持 bfloat16(默认)、float16float32

功能 配置项 默认值 取值 / 类型 说明
分布式策略 --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 bfloat16

FSDP 示例:

bash examples/embodied/pi05/run_pi05_fsdp_finetune.sh \
    --distributed-strategy fsdp \
    --dtype bfloat16

DDP + 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

4.2.1 DDP / ZeRO 通用参数

以下参数提供对 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

4.2.2 FSDP 通用参数

以下参数提供对 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

4.3 稳定性与运行时控制

训练过程中如遇 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