LeRobot documentation
FineART-VLA
FineART-VLA
FineART-VLA 基于 Physical Intelligence 的 π0.5 及其 openpi 实现,并通过 LeRobot 的 Pi05 策略构建。它在上述基础上扩展了一个可训练的 PaliGemma 语言头,以及一个在语言生成与动作生成之间交替运行的运行时。单个检查点可以预测低级子任务,可选地更新记忆或回答视觉问题,并以其文本为条件来约束其流匹配动作专家。
当只需要任务条件化动作时,请使用 Pi05。当策略必须在 rollout 过程中生成或消费中间语言时,请使用 FineART-VLA。
FineART-VLA 与 Pi05 的区别
| 功能 | Pi05 | FineART-VLA |
|---|---|---|
| 动作模型 | PaliGemma 视觉语言前缀 + Gemma 动作专家 | 相同的底层架构 |
| 语言头 | 未针对运行时生成进行训练 | 重新启用并使用文本交叉熵进行训练 |
| 动作条件 | 回合任务 | 处于激活状态的底层子任务以及归一化的机器人状态 |
| 训练目标 | Flow-matching 操作 | Flow 操作、配方选定的文本以及可选的 FAST 操作标记 |
| 数据集要求 | 标准图像、状态、动作和任务 | 相同的字段,外加针对你所训练的每种语言能力的语言注释 |
| Rollout | 直接的任务到动作策略 | 分层任务 → 子任务 → 动作循环,支持可选的记忆和 VQA |
FineART-VLA 可以从 Pi05 检查点进行初始化。策略架构保持兼容,而 FineART-VLA 会构建自己的处理器,因此配方标签和 FAST 标签不会被 Pi05 处理器堆栈静默替换。
安装
使用 FineART-VLA 依赖项安装 LeRobot:
git clone https://github.com/huggingface/lerobot.git
cd lerobot
python -m venv .venv
source .venv/bin/activate
pip install -e ".[fineart_vla]"fineart_vla 附加组件包含 PaliGemma/FAST 依赖项。对于在配备 CUDA GPU 的 Linux 系统上可选的融合训练内核,请改为安装 ".[fineart_vla_kernels]"。它会添加 liger-kernel 以及 FlashRT 后端所使用的 Hugging Face kernels 包。Liger 通过 --policy.use_liger_kernels=true 进行选择性启用:它会为整个进程修补 transformers 的 PaliGemma RoPE/GeGLU,因此在同一进程中加载的其他基于 PaliGemma 的策略也会使用融合内核运行。
准备带有语言标注的数据
FineART-VLA 在训练期间不会从普通的 LeRobot 数据集中推断出监督子任务。数据集必须包含所选配方所使用的语言目标,位于可选的 language_persistent 和 language_events 列中。
至少,请标注连续的subtask时间线,以确保每个训练帧都有一个处于激活状态的底层指令。仅当训练配方需要训练这些能力时,才添加memory、VQA、插入语和语音标注。
FineART-VLA 将其默认配方嵌入到 FineARTVLAConfig 中,与 EO-1 类似。它以 30% 的比例采样高层任务到子任务的预测,以 70% 的比例采样低层子任务条件动作训练。每个配置都拥有自己的配方字典,并且保存的检查点会将该字典带入推理阶段。
使用 --policy.recipe_path=/path/to/custom.yaml 来覆盖默认设置。
src/lerobot/configs/recipes/ 中的共享配方保留了 main 分支的语义;
FineART-VLA 不会替换它们。对于仅目标训练,请使用包含一个带有 ${task} 的低层用户消息的内联配方,或者设置 recipe=None 并禁用纯 PI05 流水线中的文本/FAST 损失。
默认情况下,推理被分解为 π(a|o, subtask)·π(subtask|o, task)。 自定义的联合序列配方需要一个匹配的运行时处理器,以便以与训练时相同的因果标记来渲染任务和生成的助手片段。 旧策略端的联合提示构建器不再被 rollout 使用。
Rollout 负责规划节奏(--autosteer_interval_s=3)、交互式命令以及同步/RTC 调度。FineART-VLA 仅在收到查询时生成文本;普通的 action 调用绝不会在运行时背后生成另一个子任务。
合并的内存/子任务草稿板并非默认配置,需要自定义配方以及内存感知的运行时控制器。对于普通的子任务生成,请保持 memory_scratchpad=false;旧版草稿板检查点保留了对将合并响应直接传递给动作控制的显式防护。
使用 lerobot-annotate 来生成这些列。该仓库包含一个 Hugging Face Jobs 启动器,您可以编辑它以指定源数据集和目标数据集。对于本地标注运行,请先安装 pip install -e ".[annotations]":
HF_TOKEN=hf_... uv run python examples/annotations/run_hf_job.py
在长时间训练之前,请检查多个 episode,并验证子任务在时间上是否正确且覆盖了完整的演示。有关生成和验证,请参阅 Annotation Pipeline;有关模式和配方解析器,请参阅 Language Columns and Recipes。
If a dataset has no language columns, recipe rendering becomes a no-op and FineART-VLA falls back to the plain Pi05 prompt path. This is useful for compatibility but does not train the language planner.
训练 FineART-VLA
本示例从 lerobot/fineart_vla_base 初始化 FineART-VLA,该检查点是在 FineART 上经过中期训练、用于预测自身下一个子任务的模型,并训练嵌入的 70/30 子任务配方。--policy.path 会加载基础检查点自身的配置,因此微调会保留 FAST 令牌布局(fast_skip_tokens)以及基础模型训练时使用的配方;其他 --policy.* 标志则会覆盖该配置。
lerobot-train \
--dataset.repo_id=${HF_USER}/my_language_annotated_dataset \
--policy.path=lerobot/fineart_vla_base \
--policy.tokenizer_max_length=256 \
--policy.dtype=bfloat16 \
--policy.device=cuda \
--policy.freeze_vision_encoder=false \
--policy.gradient_checkpointing=true \
--batch_size=8 \
--steps=30000 \
--output_dir=outputs/fineart_vla \
--job_name=fineart_vla \
--trackio.enable=true先进行小规模运行,并在 Trackio 仪表板中确认损失表现符合预期,然后再扩大规模。
若要改为从原始的 PI0.5 检查点开始,请保留 FineART-VLA 的默认配置,并将 --policy.pretrained_path 指向该检查点:--policy.type=fineart_vla --policy.pretrained_path=lerobot/pi05_base。OpenPI 格式的权重会在加载时进行转换,并且文本和 FAST 损失将从 PaliGemma 的语言头开始,而不是从 FineART 的中期训练开始。
主要训练控制
| 选项 | 默认 | 目的 |
|---|---|---|
policy.recipe_path | None | 可选的嵌入式 70/30 子任务配方覆盖 |
policy.text_loss_weight | 1.0 | 语言头交叉熵权重;0 表示禁用文本训练 |
policy.flow_loss_weight | 10.0 | 连续动作流损失权重 |
policy.enable_fast_action_loss | true | 添加离散 FAST 动作标记监督 |
policy.fast_action_loss_weight | 1.0 | FAST 交叉熵权重 |
policy.knowledge_insulation | true | 通过 VLM K/V 路径阻断 action-loss 梯度 |
policy.flow_num_repeats | 5 | 复用单个 VLM 前缀用于独立的去噪目标 |
policy.lm_head_lr_scale | 1.0 | 缩放语言头学习率;1.0 使用基础学习率 |
policy.fast_skip_tokens | 1152 | FAST id 偏移;跳过 <seg>+<loc>,因此 VQA 和 FAST 永远不会冲突 |
fast_skip_tokens=1152 将 FAST 代码放置在 PaliGemma 的 <loc> 范围之下。
openpi 的 pi0-FAST 约定值为 128(FAST 占用 <loc> 的 id);仅当需要与以该方式训练的 checkpoint 保持权重兼容时才使用该值,
并且避免将其与 VQA 配方结合使用,因为该配方的 <loc> 目标会与 FAST 代码共享嵌入行。
损失权重是起点,而非与数据集无关的常数。请分别跟踪 flow loss 和 text/FAST losses,并检查生成的子任务,而不是仅根据总损失来选择检查点。
特定数据集的 FAST 分词器
默认情况下(--policy.auto_fit_fast_tokenizer=true),训练会在训练数据集上拟合一个 FAST tokenizer,起始于 --policy.action_tokenizer_name,并将其缓存到 --policy.fast_tokenizer_cache_dir。从 lerobot/fineart_vla_base 等检查点进行微调时同样适用,因此 FAST 目标与新机器人的动作分布相匹配。拟合后的 tokenizer 会保存在检查点的 processor artifacts 中,以便推理时复用。设置 --policy.auto_fit_fast_tokenizer=false 可保持 action_tokenizer_name 不变。
训练性能
FineART-VLA 默认使用优化后的训练路径:
- batches 重复的 flow targets 和 suffix projections,而不是在 Python 中重放小型操作;
- 缓存常量动作掩码,并在每次前向传播中仅计算一次 RoPE 位置;
- 根据目标形状和稀疏度选择 text/FAST 交叉熵实现;
- 在知识隔离、仅包含数据流的批次中,跳过数学上无效的 VLM/视觉反向传播;
- 在启用梯度检查点时,使用原生的非重入 SigLIP 层检查点;并且
- 保留了 Liger RoPE/GeGLU 内核,同时避免了在 SigLIP 形状下较慢的 LayerNorm 补丁。
可选的训练后端默认处于禁用状态:
| 选项 | 何时尝试 |
|---|---|
policy.use_flashrt_adarms=true | 在受支持的 CUDA GPU 上融合自适应 RMSNorm 和门控残差 |
policy.use_compiled_text_ce=true | 编译后的物化对数几率交叉熵桶 |
policy.use_compiled_vision=true | 仅当视觉路径没有梯度时编译视觉 |
policy.use_flex_attention=true | 使用知识隔离且 flow_num_repeats > 1 的已配置 CUDA 环境;否则将使用 SDPA |
policy.use_manual_attention=true | 显式配置了使用物化注意力(materialized attention)更快的形状 |
policy.manual_attention_scope=action | 将手动注意力限制为动作查询 |
不要盲目启用所有后端。Flex 和手动注意力机制互斥,而 attention/AdaRMS 的替代方案需要知识隔离。基准测试中表现最佳的配置使用了编译后的文本 CE 和 FlashRT AdaRMS,并禁用了 Flex/手动注意力机制以及编译后的视觉模块。
推理性能
FineART-VLA 包含两个推理循环,两者都避免了重复编码代价高昂的多模态前缀:
- 动作去噪对图像/语言前缀仅编码一次,在流式步骤间复用其 KV 缓存,在设备上构建动作后缀掩码,并裁剪临时的后缀 K/V,而非克隆前缀缓存。它针对每个数据块在设备上一次性创建时间步调度,同时保留历史时间步算术。在未进行基准测试的情况下,此实现细节并不能证明端到端的加速效果。
- 语言解码使用自回归 KV 缓存,因此每个新 token 只需将采样出的 token 与缓存的图像/语言键进行计算,而无需重新运行完整的前缀。
共享运行时以不同的速率运行语言和动作。当子任务保持有效的时间更长时,请增加 --autosteer_interval_s,或使用 /subtask 直接提供指令而无需进行语言生成。更长的间隔会降低生成成本,但也会减慢重新规划的速度。
运行检查点
使用与检查点匹配的机器人/相机配置运行 lerobot-rollout,并设置 --interactive=true 和 --autosteer_interval_s=3。选择 --inference.type=sync 或 --inference.type=rtc。在交互式终端中,/autosteer <goal> 用于启用生成的子任务,/subtask <instruction> 用于手动提供单个子任务,/start 用于启动机器人控制。有关完整的硬件设置、安全行为和录制控制,请参阅 交互式语言控制。之前的 --sim、--mode 和 --high_level_hz 适配器 CLI 选项不属于此接口。
故障排除
- 较大的 flow-loss 梯度:FineART-VLA 在 PyTorch SDPA 的 math 后端上运行 KI-off 联合前缀/动作注意力,采用 FP32 注意力算术,并将其输出转换回模型 dtype(原版 PI0.5 保留其 eager 注意力)。这避免了低精度注意力,后者在具有较大 query/key 激活值的低 flow 时间步可能会使梯度不稳定。现有的检查点和归一化层保持不变;KI-off 仍然通过 VLM 的 keys 和 values 进行训练。监控单独的
flow_loss、text_loss以及裁剪前的梯度范数,而不要仅依赖有限的总损失。 - 无文本损失或生成的子任务:确认所选配方能够绑定采样帧上的注释,并且
policy.text_loss_weight > 0。 - 子任务看起来合理但操作失败:请检查子任务边界、归一化后的状态/动作统计量,以及是否存在底层配方样本。
- 文本坍缩为重复或位置标记:检查文本目标覆盖率、语言头学习率,以及 flow、FAST 和文本损失之间的平衡。
- 内存不足:首先减小 batch size,然后启用梯度检查点。在未针对您的摄像头数量分析其内存占用之前,请勿启用编译或替代注意力后端。
- 缓慢展开:将动作延迟与语言延迟分开,然后调整
--autosteer_interval_s(生成新子任务的频率)和--policy.num_inference_steps(flow 去噪步数)。
引用
如果您使用 FineART-VLA 或 FineART 数据集,请引用:
@misc{choghari2026fineart,
title = {FineART: Fine-Grained Annotated Robotic Trajectory Dataset and Vision-Language-Action Model for Bimanual Manipulation},
author = {Choghari, Jade and Kooijmans, Pepijn and Agarwal, Mansi and Ciftci, Yusuf Umut and Doriwala, Aseem and Weaver, Catherine and Sivapurapu, Mouli and Yang, Kai and Lee, Jackson and Wolf, Thomas and Mannam, Pragna},
year = {2026},
}FineART-VLA 基于 Physical Intelligence 的 π₀.₅ 和 knowledge insulation 构建。
许可证
该模型遵循 Apache 2.0 许可证,与 PI0.5 主干网络所适配的原始 OpenPI 仓库 保持一致。
Update on GitHub