一台 SO-100 低成本机器人臂放在桌子上,配置用于远程操作和策略训练
DAggerSO-100模仿学习VLA远程操作

在 SO-100 上运行 DAgger 循环搭配 VLA 策略

AY-Robots ResearchAugust 27, 202615 分钟阅读

一个人类管控的 DAgger 轮次的逐步说明,在 SO-100 臂上进行:运行策略并记录,出现问题时接管,将运行作为修正归档,组合混合数据集,并从检查点继续训练。包含了不带 leader 臂的人员的键盘和滑块接管路径,以及使一个轮次无用的四个错误。

你的策略在运行。它伸向立方体,关闭夹爪的时间早了一厘米,然后继续前进,好像它已经抓住了。没有错误发生,再多看训练损失也解释不了。解决方法不是在相同演示上再进行 20000 个梯度步。而是把你的手重新放在臂上出错的地方,记录你做了什么,然后在旧数据加上那个修正上训练下一个检查点。这是一个 DAgger 轮次,这是如何在 SO-100 上搭配视觉-语言-动作策略运行的。

理论在别处:为什么数据集聚合在所有情况下都起作用人类管控如何改变了它。这是操作手册,它假定你有一个已训练的检查点、一个工作的摄像头集和一个可以移动的臂。以下六个步骤是在 该平台的 DAgger 页面 上实现的循环,但序列在你自己的脚本中也是一样的。

简短来说一个轮次

  • 运行训练的策略并记录它,使用运行的任务文本而不是通用远程操作标签。
  • 在行为出现错误的那一刻接管:使用 leader 臂进行镜像交接,或在没有 leader 臂的情况下通过键盘或滑块进行即时和手动操作。
  • 对每次运行进行分类:将其归档为修正、保留为评估片段,或丢弃。
  • 手动组合混合 - 原始演示加上修正,按来源选择的片段。永远不要仅在修正上进行训练。
  • 从最后的检查点继续训练,并注意哪个检查点产生了哪个混合。
  • 说明轮次是否有价值的数字是 intervention rate,而不是训练损失。

为什么第二个轮次不只是更多数据

Behavior cloning 在人类访问的状态上训练。在测试时,策略访问它自己造成的状态,小的动作错误会复合成演示没有覆盖的状态。Ross、Gordon 和 Bagnell 在 AISTATS 2011 上正式化了那个失败,并用一个迭代算法回答它,该算法训练一个平稳的确定性策略,在他们的约化下,必须在它诱导的状态分布上表现良好:运行当前策略,让专家标记它实际到达的状态,将这些添加到数据集,重新训练,重复。Kelly 等人通过 HG-DAgger 使查询具有实际可行性,其中人类决定何时接管控制,而不是在不持控的情况下标记状态;他们报告了在模拟和真实自动驾驶任务上相比 DAgger 和 behavior cloning 的改进性能。人类管控使得在桌上臂的循环变得可以容忍 - 你只在有东西出错时才移动你的手。

两个后果在实践中比理论更重要。修正不是普通演示:它们集中在 Mandlekar 等人描述的瓶颈区域,其中小的偏差会将策略丢入演示从未覆盖的状态。而一个仅由这些困难部分组成的数据集是一个结构不良的数据集 - Belkhale、Cui 和 Sadigh 从数据侧论证状态多样性并不总是有益的,而动作发散和转换多样性一起决定数据集质量。混合数据集不是折中方案,它是目的本身。

在第一轮前冻结这些

DAgger 轮次比较策略与自己在不同时间的表现。任何你在轮次之间改变的、不是数据集的东西都会使那个比较变得无意义。

  • 摄像头位置和安装,包括腕部摄像头。松开一个夹子,你改变的是观察分布,而不是策略。
  • 曝光和白平衡,如果你的捕获堆栈让你固定它们。自动曝光在轮次之间漂移是一个缓慢的、看不见的域转移。
  • 臂校准和伺服零位置。如果你必须重新校准,将在此之前记录的所有东西视为单独的数据集。
  • 任务文本。这里的每个 VLA 都以它为条件;在循环中重新措辞是一个不同的任务。
  • 照明、表面、对象集。一个新对象是一个新实验,而不是下一个轮次。
  • 记录帧率。比较两个采样栅栏上的 intervention rate 会产生来自栅栏的差异。
腕部摄像头不是可选的家具

Hsu 等人比较了以手为中心的视图与通常的第三人称视角,发现手眼视角一直改进了训练效率和分布外泛化,尽管看到了更少的场景。在五关节臂上,夹爪时序通常是你的修正在修复的东西,而夹爪时序是腕部视角携带的。

端到端的轮次

  1. 1
    运行推理并记录它

    针对你想改进的检查点启动运行,然后启动记录到推理根目录。以这种方式记录,它继承了运行自己的任务文本,这是策略被训练的内容,而不是默认远程操作标签。没有记录,你可以看到失败但不能在上面训练。

    bash
    # two calls, not one: the run, then its recording
    POST /inference/start      # model_id, and hf_repo_id = the checkpoint to drive
    POST /recording/start      # root=inference
    # root=inference also makes the recording inherit the run's task text
  2. 2
    出现错误时接管

    按下接管并选择输入模式:leader 臂、键盘或滑块。运行器暂停,你纠正,你交回。在你驾驶时记录的帧自动标记为干预。

    bash
    POST /inference/takeover/start   # input = leader | keyboard | sliders
    POST /inference/takeover/nudge   # keyboard, relative delta per call
    POST /inference/takeover/set     # sliders, absolute target
    POST /inference/takeover/stop    # back to the policy
  3. 3
    对片段进行分类

    按片段决定:归档为修正、保留为评估,或丢弃。一个策略在没有帮助的情况下完成的运行是评估数据。

  4. 4
    同步修正数据集

    修正按策略收集在本地数据集中,并通过自动同步进入云存储。你没有放在那里的东西不会被混合。

  5. 5
    组合混合数据集

    结合原始数据集和修正数据集,按来源明确选择片段。结果从那时起就是一个普通数据集。

    bash
    POST /training/datasets/compose
      sources  = [ original_dataset, korrekturen_<policy> ]
      episodes = explicit selection per source
  6. 6
    从检查点继续训练

    从前一个检查点而不是基础模型训练混合。注意哪个检查点和哪个混合;没有那个对,轮次是不可重现的。

    bash
    # field on the training job
    base_checkpoint = s3://ay-robots/checkpoints/<run>/<checkpoint>
    # the platform passes it to the training pod as BASE_CKPT_S3

第 2 步详解:两种接管方式

带 leader 臂

leader-follower 模式中,接管是两个不在相同姿态的臂之间的交接。按下接管暂停运行器,并将 leader 驾驶到 follower 的当前姿态,所以扭矩转移时没有东西跳跃。如果那个对齐驾驶超时,你手动对齐 leader,只有在两者在五度以内时才释放。从那时起,你正常进行远程操作,动作列记录你下达的命令。

对这条路要诚实:对齐驾驶和扭矩交接是在真实硬件上循环中测试最少的部分。在你在关心的运行中依赖它之前,在缓慢的、无害的姿态上测试交接。leader 臂在三种模式中产生最光滑的修正,并且机械上最容易出错的东西最多。

没有 leader 臂:键盘和滑块

大多数阅读这篇文章的人拥有一条臂。这已经足够了。在按下接管的那一刻选择键盘或滑块输入,接管是即时和手动的 - 没有第二条臂要对齐,所以没有对齐步骤。follower 保持其姿态并等待输入。

输入模式臂如何移动由服务器强制的每次调用限制锁定时间
Leader 臂镜像从 leader 的关节角度驱动 follower在这个模式下没有轻推或设置调用;镜像连续写入 follower 目标永不锁定,如果没有给定输入模式则为默认值 - 但它需要第二条臂;没有 leader id 接管被拒绝
键盘每次按键按下的相对轻推,发送到接管轻推端点在每个关节 2 度处硬夹,夹爪 4 度如果接管在 leader 模式下启动则拒绝并返回 409
滑块绝对目标姿态,发送到接管设置端点每次调用最多 6 度的目标行进;界面大约每秒发送十次如果接管在 leader 模式下启动则拒绝并返回 409

夹子在服务器端强制执行,而不是在界面,因为总线-伺服臂上打错的 delta 是一次碰撞。键盘修正逐步进行且略微粗糙;滑块修正更顺滑,因为服务器朝着目标行进而界面继续流式传输。无论哪种方式,动作列接收完整的下达姿态向量,干预标记与 leader 路径相同,所以键盘修正不带格式差异地进入相同数据集。

text
Q / A   joint 1      R / F   joint 4
W / S   joint 2      T / G   joint 5
E / D   joint 3      Z / X   gripper
与堆栈中其他地方相同的按键布局,所以从记录中得到的肌肉记忆转移。
训练指南显示 SO-100 数据集上 GR00T 微调运行的有序步骤
轮次的训练端是与首次运行相同的引导序列;只有检查点字段不同。

何时按按钮

早于晚。在夹爪关闭空气后开始的修正教授从策略不应该进入的失败中恢复,恢复数据远不如回避数据值钱。在你确信轨迹是错误的第一刻中断,通过困难部分修正,一旦状态是策略之前处理过的,就交回。ThriftyDAgger 通过在固定的人类预算下基于新颖性和估计风险关闭干预来自动化那个决定,但在一条带有已经观看的人类的臂上,人类门控比你将调整的任何东西便宜和校准得更好。

可以用开源堆栈和几个脚本做到。它花费的是记录工作,而记录工作就是 DAgger 轮次死亡的地方。

  1. 从你自己的推理脚本将帧写入 LeRobot 数据集,使用策略被训练的任务字符串。
  2. 暂停策略循环,切换命令源,并将你驾驶的每一帧标记为干预。没有标志,修正看起来像普通演示。
  3. 有意决定在策略释放控制和你的首次输入之间的转换帧会发生什么。
  4. 在每个策略中保留修正到他们自己的数据集,并手动追踪片段索引以便可以重建混合。
  5. 指向微调入口点到前一个检查点,并检查日志它加载了这些权重。

第 3 步详解:分类决定质量

在运行后,你有一个记录,其中一些帧标记为干预。三个目的地存在,错误的那个悄悄地毒害下一个轮次。

  • 当干预是一个真正的修复时,作为修正归档:策略正在去某个错误的地方,你的输入从策略本身产生的状态展示了正确的东西。
  • 为干净的自主运行和你出于谨慎而接管的运行保留为评估。评估片段是你如何测量下一个检查点的方式,它们绝不能被训练。
  • 丢弃被无关的东西毁掉的运行 - 丢弃的摄像头帧、停滞的伺服、你撞翻的对象。一个混乱的修正比没有修正更糟。
冻结帧属于原始记录,不属于训练数据

在策略释放控制和你的首次输入之间,臂保持静止,而记录器继续写入 - 一系列相同的姿态与稍有不同的图像配对。这里那些交接帧保留在原始记录中,不在修正数据集之外。如果你自己构建循环,有意地切割它们:一个在它应该采取行动的地方学会暂停的策略。

第 5 步详解:组合混合

组合采用原始数据集加上修正数据集,并产生一个新的、普通的 LeRobot 数据集,像任何其他一样训练。重要的属性是片段选择是按来源明确的 - 没有任何东西自动混合。那听起来很小,直到你的策略表现得很奇怪的第一次,你必须重建它被训练的东西。

开放的问题是比率,没有人有一个转移的数字。文献所同意的是修正应该比其帧份额计数。Mandlekar 等人在他们的干预系统收集的数据上迭代地重新训练,所以策略学会遍历瓶颈,并报告以这种方式训练的代理超越在来自非干预演示者的等效样本数量上训练的代理。Sirius 进一步进行并通过近似的人类信任重新加权训练样本,报告在模拟中 8 百分比的增益和在真实硬件上与其比较的方法相比策略成功率增加 27 百分比,收敛速度提高两倍。这里没有训练入口点暴露样本加权旋钮,所以粗糙的替代是保留每个修正片段而子采样原始演示 - 并写下你做了什么。

数据集记录视图显示带有摄像头流的 SO-100 数据集的片段
修正片段是普通片段,带有每帧干预标志,所以它们与原始数据集组合而不转换。

第 6 步详解:从检查点继续训练真正意味着什么

从基础模型训练混合有效但丢弃前一个轮次并花费完整运行。从前一个 检查点 继续更快且通常更好。它也比短语建议的更有限。

权重初始化不是优化器恢复

仅权重检查点包含参数,没有其他。加载它给下一个运行比基础模型更好的起点,但优化器矩、学习率计划位置和数据顺序都从零开始。期望在继续运行开始时有损失尖峰,不要将其读作失败,不要称轮次为恢复。这是一个热启动。

策略大小GPU 层级每个动作步的推理数据集格式值得尝试之前的片段
GR00T N1.7大约 3 B,在微调期间大约训练了 40 MA100 80 GB 或 H100 80 GB大约 152 毫秒LeRobot v2.0 或 v2.150
GR00T N1.5大约 3 BA100 80 GB 或 H100 80 GB大约 165 毫秒LeRobot v2.0 或 v2.150
Pi0.5大约 3 B,基于 PaliGemma 骨干A100 80 GB 或 H100 80 GB大约 485 毫秒LeRobot v3.050
SmolVLA大约 450 MRTX 4090 或任何 24 GB 卡大约 245 毫秒LeRobot v3.030
ACT大约 80 M,从头训练RTX 4090 或任何 24 GB 卡大约 20 毫秒LeRobot v3.050

延迟在 DAgger 循环内复合的方式它在演示期间没有:在大约每个动作步 485 毫秒,你接管是因为臂犹豫了,而不是因为它是错的,犹豫修正不是有用的训练数据。如果你是在数据上而不是追逐最终成功率上迭代,在快速模型上迭代。Shukor 等人描述 SmolVLA 为被设计在单个 GPU 上训练并在消费 GPU 或 CPU 上部署,带有一个异步推理堆栈,将动作预测与执行分离以允许更高的控制速率 - 保持接管循环响应的属性。

数据集格式不是可互换的。GR00T 采取 LeRobot v2.0 或 v2.1,并且 Isaac-GR00T 存储库将其输入描述为 LeRobot v2 格式的一个风味加上增加的模态描述文件;较新的训练器这里期望 v3.0。一个以错误版本组合的混合在加载时失败而不是产生一个坏策略 - 更好的失败模式,仍然是一个浪费的队列槽。数据集文档 列出每个训练器采用的格式。

带有记录工作已经完成的循环

使用 leader 臂、键盘或滑块接管;每帧干预标记;将运行作为修正或评估归档;按来源进行明确片段选择组合混合数据集;并从检查点而不是基础模型继续训练。你的决定保持的是哪个运行算作修正、什么进入混合,以及何时 intervention rate 停止下降。

查看 DAgger 循环如何连接

四种浪费轮次的方法

1. 仅在修正上训练

最常见的失败和最诱人的捷径。一个仅修正的数据集几乎完全是任务的困难中间,方法和撤退缺失;策略在困难部分变得更好,忘记如何到达那里。聚合不是方法的实现细节,它是机制:旧数据是保持其余行为的东西,而修正移动它的一部分。

2. 在轮次之间移动摄像头

一个在轮次之间移动两厘米的摄像头产生一个比你开始的更糟的策略,以及一个花费一天的诊断。这里每个 VLA 都以图像为条件;仅关节状态不消除对象在哪里。在首轮前拍摄设置,并在每个后来的之前检查那张照片。

3. 让交接伪影进入训练

在上面覆盖,并在列表上是因为它看不见。症状是一个策略,以完全之前轮次的操作员接管的地方停滞一瞬间。它看起来像犹豫;它是模仿。

4. 称热启动为恢复

如果你相信优化器状态转移,初始损失尖峰读作一个错误,你去搜索损坏的数据。如果你知道优化器从新启动,尖峰是预期的,你看来之后的。相同的数字,相反的结论。

测量轮次

人类管控循环的指标是 intervention rate:你在控制时记录的帧,除以运行的总帧。它在接管状态中,它是唯一回答轮次问的问题的数字。训练损失下降无论策略是否改进;成功率是二元的,在桌臂产生的样本大小上很吵。Intervention rate 是连续的,在策略本身造成的状态上测量,它随着策略需要你更少而下降。

仅在相同条件下记录的运行中比较它。完整的论证,以及如何构建一个在两个以上轮次中存活的评估集,在 测量 DAgger 循环的文章 中。轮次一现实地是一个可行性测试:你正在检查接管在你的硬件上有效,修正带有他们的标志到达,而继续运行加载了你命名的检查点。轮次二和三是利率应该开始移动的地方。如果在轮次四还没有移动,问题是 DAgger 上游。

每轮写下为什么稍后重要
被驾驶的检查点没有它你不能将改进归因于混合
用于接管的输入模式键盘修正比 leader 修正更粗糙,并且它显示在数据中
运行数量和每个是如何分类的轮次是否有足够的修正来重要
每次运行的 intervention rate,和平均值循环的进度指标
每个来源的精确片段选择重现或撤销轮次的唯一方法
热启动或新鲜训练解释你将在一周内看到的损失曲线

如果你还没有检查点

循环没有不带一个的入口点。记录首个数据集,训练首个策略,运行它 - 记录训练运行策略 覆盖那条路。记录客户端在 下载页面,GPU 层级和小时费率在 定价页面,以及什么一个可用的片段在 SO-100 数据收集指南 中。在修正前先把演示弄对:DAgger 是一个修复机制,它在已经几乎对的东西上工作好得多。

我可以在没有 leader 臂的情况下运行 DAgger 循环吗?

可以。在你按下接管时选择键盘或滑块输入:接管是即时和手动的,没有第二条臂要对齐。键盘发送服务器在每个关节 2 度和夹爪 4 度硬夹的相对轻推;滑块发送一个绝对目标,服务器每次调用最多朝它移动 6 度,而界面继续流式传输。动作列和干预标记与 leader 模式相同,所以修正在数据集中不可区别。

一个轮次需要多少个修正?

没有可防守的通用数字,帧计数比片段计数更重要。工作规则是修正不能在混合中丢失:有 200 个原始片段和三个修正片段,什么都不会移动。目标是从几个起始配置而不是三个相同救救的重复覆盖失败行为的修正。

为什么仅在修正上训练是个坏主意?

因为修正几乎完全是任务的困难中间。方法、对齐和撤退缺失,所以策略失去它已经做得很好的东西,同时在你修复的部分改进。保持旧数据并添加到它是机制本身,而不是可选的额外。

从检查点继续是否恢复前一个训练运行?

不是。仅权重检查点恢复参数,什么都没有:优化器矩、学习率计划位置和数据顺序从新开始。这是热启动,初始损失尖峰是预期的而不是症状。写下你实际做了两个中的哪一个,以便你一周后正确读曲线。

如果 intervention rate 不下降怎么办?

停止增加轮次。平坦的利率意味着修正没有教授你认为的东西。常见的原因是上游:摄像头移动了,修正开始得太晚而不能是回避数据,交接帧在训练集中,或任务从策略实际获得的观察中不确定。

这些都不是已解决的问题,都不是一个点击。交互式模仿学习是一个活跃的研究领域,正是因为它的问题 - 何时干预、如何加权人类所做的、要保留多少旧数据 - 没有固定的答案;Celemin 等人的调查映射了什么仍然是开放的。循环所拥有的是当它被小心运行时、在成本几百欧元的硬件上的可测量收敛。冻结设置,早期干预,诚实地分类,有意地混合,并每次记录 intervention rate。

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started