# ╔══════════════════════════════════════════════════════════════════╗
# ║  VLA-Factory Training Recipe — Reference Template               ║
# ║  每个字段都标注了含义、可选值和典型用法。                         ║
# ║  复制此文件作为起点,删除不需要的部分即可。                       ║
# ╚══════════════════════════════════════════════════════════════════╝

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 模型 ──────────────────────────────────────────────────────────────
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
model:
  name: act                    # [必填] 注册表中的模型名
                               #   可选值: act | pi0 | pi05 | openvla-7b | gr00t | octo | smolvla
                               #

  path: null                   # [可选] 预训练权重路径
                               #   - 指向目录或文件,由模型的 factory 解读
                               #   - null = 从零训练 (适用于 ACT 等小模型)
                               #   - pi0/pi05 仅支持微调,训练时必填 (如 "lerobot/pi0_base")
                               #   - 示例: "outputs/openpi/pi0.5", "openvla/openvla-7b"

  # config:                    # [可选] 逐 run 的模型配置,深度合并到
  #                            #   vla_factory/config/model/<name>.yaml 之上 (recipe 优先)
  #   camera_mapping:          # [pi0/pi05 必填] {模型相机角色: 数据集相机名}
  #     base_0_rgb: front      #   角色以 base checkpoint 的 config.json 为准,
  #     left_wrist_0_rgb: wrist#   用 `vlafactory-cli list --config <recipe>` 查询/校验;
  #                            #   未映射的角色自动用占位图 (mask=0)
  #   default_task: "..."      # [可选] 任务文本兜底 (语言条件模型 pi0/pi05)。
                               #   取值优先级: 帧级任务文本 (数据集/部署端 task 字段)
                               #   > default_task > "" (空 prompt, 模型仍可运行)。
                               #   部署时 prompt 由客户端 task 字段传入;数据集缺
                               #   任务文本或部署端不发 task 时才用到这里的兜底。


# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 动作空间 ─────────────────────────────────────────────────────────
# 描述机器人动作向量的语义。框架据此做归一化、delta转换、padding。
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
action_spec:
  action_dim: 6                # [必填] 机器人实际动作维度
                               #   SO101 单臂 = 6, ALOHA 双臂 = 14, delta_eef = 7

  action_horizon: 100          # [必填] 模型每次推理预测的未来步数
                               #   也叫 chunk_size
                               #   ACT = 100, PI0 = 50, OpenVLA = 7

  action_type: joint_pos       # [必填] 动作语义类型
                               #   ┌──────────────┬──────────────────────────────────┐
                               #   │ 值            │ 含义                              │
                               #   ├──────────────┼──────────────────────────────────┤
                               #   │ joint_pos    │ 绝对关节位置 (ACT, 常见)          │
                               #   │ delta_joint  │ 关节位置增量                       │
                               #   │ delta_eef    │ 末端执行器位姿增量 (x,y,z,rx,ry,rz,gripper) │
                               #   │ se3          │ SE(3) 末端位姿                     │
                               #   │ tokenized    │ 离散化动作 token (OpenVLA)         │
                               #   └──────────────┴──────────────────────────────────┘

  bounds_low: null             # [可选] 每维最小值, 长度 = action_dim
  bounds_high: null            # [可选] 每维最大值, 长度 = action_dim
                               #   示例 (6维): [-1, -1, -1, -1, -1, -1]


# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 数据 ─────────────────────────────────────────────────────────────
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
data:
  source:
    path: ""                   # [必填] 数据集根路径
                               #   示例: "outputs/lerobot_train_data_100"

    format: auto               # [可选] 数据格式
                               #   ┌──────────────┬──────────────────────────────┐
                               #   │ 值            │ 说明                         │
                               #   ├──────────────┼──────────────────────────────┤
                               #   │ auto         │ 自动检测 (推荐)              │
                               #   │ lerobot-v3   │ HuggingFace LeRobot v3 格式   │
                               #   │ hdf5         │ HDF5 (Robomimic / ALOHA)     │
                               #   │ rlds         │ TFRecord RLDS 格式           │
                               #   │ zarr         │ Zarr 数组 (BridgeData V2)    │
                               #   └──────────────┴──────────────────────────────┘

  sampler:
    type: sliding_window       # 采样策略 (当前仅支持 sliding_window)

    n_obs_steps: 1             # 观测窗口帧数
                               #   大多数模型 = 1; 时序堆叠 = 2-3

    action_horizon: 100        # 每个样本包含的未来动作步数
                               #   通常与 action_spec.action_horizon 一致

  split:
    strategy: episode          # 数据划分策略
                               #   ┌──────────┬──────────────────────────────────────┐
                               #   │ 值        │ 说明                                 │
                               #   ├──────────┼──────────────────────────────────────┤
                               #   │ episode  │ 按 episode 划分 (推荐, 防泄漏)        │
                               #   │ random   │ 随机打乱划分 (暂未实现)                │
                               #   │ task     │ 按 task 划分 (多任务数据集, 暂未实现)  │
                               #   └──────────┴──────────────────────────────────────┘

    train_ratio: 0.9           # 训练集比例 (0.0 - 1.0); 剩余部分自动分配给验证集
    seed: 42                   # 随机种子


# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 微调策略 ─────────────────────────────────────────────────────────
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
finetuning:
  strategy: full               # [必填] 微调策略
                               #   ┌────────────┬────────────────────────────────────┐
                               #   │ 值          │ 适用场景                           │
                               #   ├────────────┼────────────────────────────────────┤
                               #   │ full       │ 全参数训练 (ACT从零训练, 或全量微调)  │
                               #   │ lora       │ LoRA 低秩适配 (大模型推荐)           │
                               #   │ freeze     │ 冻结指定组件, 训练其余               │
                               #   │ selective  │ 只训练指定组件, 冻结其余             │
                               #   └────────────┴────────────────────────────────────┘

  # ── strategy == "lora" 时需要 ──
  # 字段名与 peft.LoraConfig 对齐(r/lora_alpha/lora_dropout/use_rslora/init_lora_weights
  # 透传给 peft);rank/alpha 作为向后兼容别名也接受。target_components 是 vla 自己的
  # 抽象(component → subtree → peft target_modules),因为不同模型 module 名不同。
  lora:
    r: 16                      # LoRA 秩, 越大容量越大. 常用: 8, 16, 32 (peft 名; rank 也接受)
    lora_alpha: 16             # 缩放因子, 等效 = lora_alpha / r. 通常设为与 r 相同 (alpha 也接受)
    lora_dropout: 0.0         # adapter dropout, 透传 peft
    use_rslora: false          # rank-stabilized LoRA, 透传 peft
    init_lora_weights: gaussian # 初始化方案, 透传 peft (默认 gaussian, 对齐 RLinf openpi LoRA)
    target_components:          # LoRA 应用到哪些组件 (引用 ModelMetadata.components 的 key)
      - llm                    #   PI0 示例: ["llm"] (只 VLM) 或 ["llm", "action_expert"]
      - action_expert          #   OpenVLA 示例: ["llm", "action_head"]

  # ── strategy == "freeze" 时需要 ──
  # freeze_components: ["vision_encoder"]   # 冻结视觉编码器

  # ── strategy == "selective" 时需要 ──
  # trainable_components: ["action_head"]   # 只训练 action head


# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 训练参数 ─────────────────────────────────────────────────────────
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
training:
  backend: pytorch             # 训练后端
                               #   pytorch | jax (预留)

  lr: 1.0e-4                   # 基础学习率
                               #   ACT: 1e-4 ~ 1e-5
                               #   PI0 LoRA: 2.5e-5
                               #   OpenVLA: 5e-5

  lr_backbone: null            # [可选] backbone 独立学习率 (通常更低)
                               #   ACT: ResNet 用 1e-5
                               #   null = 与 lr 相同

  batch_size: 8                # 每 GPU 批大小

  total_steps: 50000           # 总训练步数 (optimizer steps)

  gradient_checkpointing: false # 梯度检查点: 省 ~40% 显存, 慢 ~30%
                                #   大模型 (PI0, OpenVLA) 建议开启

  inference_steps: 1           # 推理时的去噪/flow-matching 步数
                               #   确定性 head (ACT, OpenVLA) = 1
                               #   flow matching (PI0) = 10
                               #   diffusion (Octo) = 10-20

  num_workers: 4               # DataLoader 子进程数
                               #   0 = 单进程 (调试用)
                               #   4~8 = 多进程并行加载 (推荐, 视频数据集建议 ≥4)

  augmentation:
    random_crop: true          # 随机裁剪
    crop_scale: [0.9, 1.0]    # 裁剪面积比例范围
    color_jitter: 0.1          # 颜色抖动强度 (0.0 = 关闭)


# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 输出 ─────────────────────────────────────────────────────────────
# 注意: 输出字段必须嵌套在 output: 块下; 顶层的 output_dir: 会被解析器忽略。
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
output:
  output_dir: outputs/act_aloha  # [必填] checkpoint、日志、最终权重的保存目录
                                 #   示例: "outputs/act_aloha_000"

  report_to: none                # [可选] 训练日志后端
                                 #   ┌──────────────┬────────────────────┐
                                 #   │ 值            │ 说明               │
                                 #   ├──────────────┼────────────────────┤
                                 #   │ none         │ 不记录 (默认)       │
                                 #   │ tensorboard  │ TensorBoard         │
                                 #   │ wandb        │ Weights & Biases   │
                                 #   └──────────────┴────────────────────┘

  logging_steps: 200             # [可选] 每隔 N 步记录一次训练指标

  save_steps: 20000              # [可选] 每隔 N 步保存一个 checkpoint

  save_total_limit: 3            # [可选] 最多保留的 checkpoint 数量
                                 #   超出后删除最旧的

  overwrite_output_dir: true     # [可选] 训练前是否清空 output_dir
                                 #   true  = 清空 (重新训练时推荐)
                                 #   false = 追加 (断点续训时用)