前言
我司之前通过 “IL + RL” 的方法,给过两家工厂做过自动线缆插板的机器人解决方案,所以对类似业务场景的解决方案一直保持着高度关注
- 近日,看到UC伯克利提出的通用灵巧机器人框架:结合视觉和人类演示与修正的RL方法,可以做到自动插拔USB线,和线缆插拔场景很像,而且是通过视觉与人为参与的RL方法训练,看着效果还可以
- 加之,我为了加速我司各块业务的更快、更好落地,故在不断做前沿探索,从而一直在看各种paper 然后解读paper
一方面,我建了一个HIL-SERL的复现交流群,有意向进群的,欢迎私我一两句简介——比如在哪个公司做什么 或者哪个高校什么专业,邀你入群
二方面,如果想部署一系列前沿框架——RDT/HIL-SERL/DP3/iDP3,从而完成咖啡胶囊冲泡、电路板装配等(硬件构型:双臂+两个wrist相机+一个exterior相机+遥操作硬件)
皆可通过CSDN私信私我,畅谈合作
故本文来了,且本文的这个HIL-SERL工作,算是开启了机器人「视觉 + 人工示教、纠正 + RL训练」的路线
第一部分 通用灵巧机器人框架:HIL-SERL
1.1 HIL-SERL及其与以前工作的差异
1.1.1 HIL-SERL:其结合视觉和人类演示与修正的RL方法
近日,UC伯克利的一研究团队提出了一个通用灵巧机器人框架:HIL-SERL,其结合视觉和人类示教与纠正的RL方法进行训练
- 其对应的论文为:《Precise and Dexterous Robotic Manipulation via Human-in-the-Loop Reinforcement Learning》
- 其对应的项目地址为:hil-serl.github.io
其对应的GitHub地址为:rail-berkeley/hil-serl - 其对应的作者为
1) Jianlan Luo,伯克利人工智能研究 (BAIR)实验室 的博士后学者,与Sergey Levine 教授一起工作。2022 年之前,曾在Google [X]担任研究员两年,与Stefan Schaal 教授一起工作。且于 2020 年获得加州大学伯克利分校的硕士/博士学位。也曾在Deepmind和Everyday Robots工作过一段时间,这里有篇他的个人访谈
顺带一提,他还参与了一个有意思的工作:Yell At Your Robot 🗣️:Improving On-the-Fly from Language Corrections
2) Charles Xu
3) Jeffrey Wu
4) Sergey Levine——有意思的是,Sergey Levine还是推出通用机器人模型π0所在公司Physical Intelligence的联创,以及还是UC伯克利电气工程和计算机科学系副教授,其谷歌学术被引用量为超过12.7万)
具体而言,他们系统中包含了精心设计的低层控制器,以确保策略训练过程中的安全性。在训练过程中,系统会向人工操作员请求潜在的纠正建议,这些建议随后以离线策略的方式用于更新策略
他们发现这种人类参与的纠正过程对于使策略能够从错误中学习并提升性能至关重要,尤其是在本文所涉及的具有挑战性的任务中——而如果这些任务从零开始学习会非常困难
- 他们的系统解决的任务包括:在平底锅中动态翻转物体、从积木塔中抽出Jenga积木块、在两只机械臂之间传递物体 以及使用单臂或双臂组装复杂装置,例如计算机主板、宜家书架 汽车仪表盘或正时皮带
- 这些任务在动态复杂性和精细性、高维状态与动作空间、长时序决策,或这些因素的组合方面都提出了重大挑战
其中一些技能,如许多双臂操作任务,以前被认为难以通过强化学习在真实环境中直接训练,或者以当前机器人方法几乎难以实现,例如正时皮带组装或Jenga积木抽取。这些任务还需要不同类型的控制策略,例如反应式闭环控制可用于精确的操作任务,或实现诸如“Jenga鞭击”这类极难通过传统方法描述的精细开环行为
换言之,本文介绍的HIL-SERL是第一个在现实世界环境中使用RL实现双臂协调和任务,如抽积木和组装正时皮带 - 总之,UC伯克利的这个工作,表明RL确实能够在实际可行的训练时间内,直接在现实世界中学习广泛且复杂的基于视觉的操作策略,而这在以往方法中被认为是不可行的
该系统能够在真实环境中仅用一小时到2.5小时的训练时间,就让RL策略在几乎所有任务上达到近乎完美的成功率和超越人类的操作周期。他们训练得到的强化学习策略在成功率上平均提升101%,操作周期加快1.8倍,远超在相同数量人类数据(如相同数量的演示或纠正回合)基础上训练的模仿学习方法
1.1.2 其与以前工作的差异
- 与他们最相关的工作之一是SERL「Luo等,2024a,其实还是HIL-SERL团队」其提出了一个用于训练强化学习(RL)策略以完成操作任务的系统
HIL-SERL的方法与SERL不同之处在于:
HIL-SERL结合了人类演示和修正来训练RL策略,而SERL仅依赖于人类演示
虽然这看起来只是一个细微的区别,但HIL-SERL的结果表明,融入纠正对于使策略能够从错误中学习并提升性能至关重要,特别是在那些智能体从零开始学习较为困难的任务中
此外,SERL主要关注于相对简单、时间跨度较短的任务,并未涉及双臂协作或动态操作
HIL-SERL的独特贡献在于展示了他们的方法能够在具有不同物理特性的广泛任务中,有效学习通用的基于视觉的操作策略 - 在插入任务中,先前的工作
有使用基于模型方法的「Autonomous alignment of peg and hole by force/torque measurement for robotic assembly;Contact pose identification for peg-inhole assembly under uncertainties」
以及带有被动柔顺性的末端执行器工具机制(Morgan* et al., 2021; Su et al., 2022)
这些方法通常依赖于无感知的基于状态的模型,或需要针对特定任务进行开发,因此在鲁棒性和适应性方面存在局限
另一种方法在多阶段流程中使用视觉伺服,先将机械臂与目标对齐,然后通过搜索原语完成插入操作(Spector et al., 2022; Chang et al., 2024; Song et al., 2015)
但这些方法同样面临特征可靠性和对齐精度的挑战
相比之下,HIL-SERL的方法采用了更紧密的感知-动作闭环。该方法能够以闭环方式学习与任务相关的视觉特征和视觉运动策略,这对于许多需要高精度反应的任务至关重要
从控制的角度来看,所学习的策略可以被视为输出反馈控制的一个实例(Astrom and Murray,2008) - 此外,还有许多关于动态操作任务的研究(Mason and Lynch, 1993),这些任务也是本文所关注的
再比如,Kormushev etal等人(2010) 利用动作捕捉系统和动态运动基元(Ijspeert et al., 2013)学习如何在平底锅中翻转物体
然而,HIL-SERL系统直接使用像素输入,从而无需精确的动作捕捉系统,同时实现了显著更高的成功率
Fazeli等人(2019) 提出了一种学习方法,以准动态方式将积木从 Jenga 塔中推出。然而,HIL-SERL采用鞭子动态移除Jenga 积木,这是一项更具挑战性的任务,需要更加复杂的控制策略
此外,虽然已有关于柔性物体操作的研究,例如
电缆布线(Luo et al., 2024b; Jin et al., 2019)
路径追踪或解缠(Viswanath et al., 2023;Shivakumar et al., 2023; Viswanath et al., 2022)
但HIL-SERL论文中的正时皮带装配任务要求两只机械臂进行动态且精确的协调,以同时调整张紧器和正时皮带
这一任务在本质上与以往的电缆操作研究有根本性区别,并且更具挑战性
1.2 人工参与的强化学习系统
1.2.1 HIL-SERL的三个组件:actor(执行)进程、learner(学习)进程、重放缓冲区replay buffer
机器人强化学习任务可以通过一个来定义,其中
- 是状态观测(例如,图像与机器人本体感觉状态信息的组合)
- 是动作(例如,期望的末端执行器运动)
- 是初始状态的分布,是依赖于系统动力学的未知且可能具有随机性的转移概率
- 而是奖励函数,用于编码任务
- 最优策略是最大化奖励的累计期望值的策略,即
其中期望是通过关于初始状态分布、转换概率和策略
在实践中,策略通常建模为由神经网络参数化的高斯分布
为了实现机器人任务的强化学习算法,必须仔细选择合适的状态观察空间和动作空间。这涉及到对摄像头、本体状态以及相应机器人低层控制器的合理组合进行选择
- 对于所有的任务,他们采用稀疏奖励函数,该函数使用训练过的分类器对任务是否成功做出二元决策(下图中的Intervention属于人类干预)
- 在这种设置中,优化目标
旨在最大化每条轨迹成功的概率。理想情况下,在收敛时,策略应在每次尝试中都能成功
具体而言,他们构建的核心基础RL算法是RLPD『Ball等,2023,即Efficient online reinforcement learning with offline data,相当于利用离线数据实现高效的在线RL,即Online RL with Offline Data 』,之所以选择它,是因为其样本效率高,且能够融合先验数据
该工作关注的是,是否可以在在线学习时,直接应用现有的离策略方法以充分利用离线数据,作者从头开始在线强化学习,同时将离线数据包含在回放缓冲区中,从而展示了online off-policy RL algorithms利用离线数据进行学习时表现出极高的效率
且在每一步训练中,RLPD 在先验数据和on-policy 数据之间等概率采样,以形成一个训练批次「Song等,2023——Hybrid RL: Using both offline and online data can make RL efficient」
即“对称采样”,即每个批次有50%的数据来自(在线)回放缓冲区,另外50%来自离线数据缓冲区「We call this ‘symmetricsampling’, whereby for each batch we sample 50% of the data from our replay buffer, and the remaining 50% fromthe offline data buffer」
然后,它根据各自损失函数的梯度,更新参数化Q函数和策略的参数
其中,是一个目标网络,而actor 损失则是使用带有自适应调整权重的熵正则化(Haarnoja et al., 2018)
总之,HIL-SERL系统由三个主要组件组成:actor进程、learner进程以及位于learner进程内部的重放缓冲区replay buffer,所有组件均以分布式方式运行,如下图所示(定义为图2)
- 左下角所示的Actor Process通过在机器人上执行当前策略与环境进行交互,并将数据发送回重放缓冲区replay buffer
The actor process interacts with the environment by executing the current policy on the robot and sends the databack to the replay buffer - 左上角所示的环境Environment 采用模块化设计,支持灵活配置各种设备。这包括多摄像头支持、集成像SpaceMouse这样的输入设备以实现远程操作,并能控制不同类型控制器的可变数量机械臂
此外,系统需要实现一个奖励函数,用于评估任务是否成功,该函数通过人类演示离线训练获得「即A implemented reward function is required to assess the success of a task, which is trained offline using human demonstrations,相当于人类的示范作为机器人的模仿学习目标」
在Actor Process中,人类可以通过使用SpaceMouse介入操作机器人,从而将从RL策略中接管对机器人的控制权——which will then take over the control of the robot from the RL policy(相当于人类干预Human Intervention) - 如右下角所示,HIL-SERL系统采用两个重放缓冲区replay buffer
一个用于存储离线人类演示,称为示范缓冲区demo buffer,通常包含20-30条演示(即one to store offline human demonstrations, called the demo buffer, usually on the range of 20-30)
另一个用于存储在线策略数据,称为RL缓冲区RL buffer (the other one for storing the on-policy data, called the RL buffer)
从而,学习者进程Learner Process从演示和RL回放缓冲区中等量采样数据(samples data equally from the demo and RL replay buffers),使用RLPD优化策略,并定期将更新的策略发送给Actor Process
1.2.2 系统设计:ResNet、基于人类演示设计二元奖励函数、夹持器控制
为了开发能够在现实世界中实现高效样本利用的策略学习系统,他们做出了以下设计选择
- 预训练视觉骨干网络
为了提高训练过程的效率,他们利用预训练的视觉骨干网络来处理图像数据。虽然这种方法现在已经成为计算机视觉领域中为了提升鲁棒性稳和泛化能力的常规做法『Radford等,2021;Dosovitskiy等,2021;Kolesnikov等人,2020』
但在强化学习中,这种处理方式提供了额外的好处,如优化的稳定性和探索效率(Yang 和 Wang,2019;Du 等人,2020),因此该方法对于实际机器人RL训练尤为有利
神经网络架构如上图右上角或下图所示 使用相同的预训练视觉骨干处理来自多个摄像头的图像
具体来说,他们采用在 ImageNet (Deng 等人,2009) 上预训练的 ResNet-10 模型 (He 等人,2015) 来生成输出嵌入
这些嵌入随后被拼接,并进一步与Encoder处理过的本体感知信息(Proprioceptive State)整合(通过MLP整合),从而促进更高效、更有效的学习过程 - 奖励函数
强化学习系统的一个关键方面是奖励函数,它用于引导学习过程并评估策略的优劣。虽然之前有研究提出利用奖励塑形(reward shaping)来加速学习过程「Ng等人,1999;Florensa等人,2018;2017」,该过程往往具有任务特定性,且设计起来耗时。在某些复杂任务中,进行奖励塑形几乎不可行
好在他们发现,结合稀疏奖励函数与人类演示及纠正,为多种任务提供了一种简单而有效的设置
具体来说,他们收集离线数据,并为每个任务训练一个二元分类器(binary classifier),该分类器只有在任务完成时给予正奖励,否则奖励为零 - 下游机器人系统
为适应策略学习过程,他们对下游机器人系统做了一些尤为重要的设计选择。为了促进空间泛化,他们采用相对坐标系中表示机器人的本体感觉状态,从而实现以自我为中心的表达方式
具体来说,在每个训练回合开始时,机器人的末端执行器位姿会在工作空间内的预定义区域内均匀随机化
机器人的本体感觉信息被表示为相对于末端执行器初始姿态的坐标系;策略输出的动作是相对于当前末端执行器坐标系的(the action output from the policy is relative to thecurrent end-effector frame)
该过程模拟了在附着于末端执行器的坐标系下,相对地移动目标物体。因此,即使物体移动,或在他们的一些实验中 在任务过程中受到干扰,策略仍然能够成功完成任务
对于涉及接触的任务,在实时层使用具有参考限制的阻抗控制器,以确保安全,如(Luo et al.,2024a)所述「For tasks involving dealing withcontact, we use an impedance controller with reference limiting in the real-time layer to ensure safety asin (Luo et al., 2024a)」
对于动态任务,直接在末端执行器坐标系中指令前馈扭矩,以加速机械臂,尽管该方法未在加速度环路内执行闭环控制,他们发现这种简单的开环控制已足以满足所考虑的任务「For dynamic tasks, we directly command feed forward wrenches in the end-effector frame to accelerate the robot arm, while it doesn’t perform closed-loop control around acceleration, we foundthis simple open-loop control to be sufficient for considered tasks」 - 夹爪控制
对于涉及夹持器控制的任务,他们采用一个单独的critic network来评估离散抓取动作
For tasks involving the control of grippers, we employ a separate critic network to evaluate discrete grasping actions
尽管这种方法最初看起来可能会带来额外的开销或显得有些非常规,但在实际应用中,特别是在结合人类演示和纠正时,它已被证明非常有效
在作者的任务中,夹爪动作的离散性使得用连续分布对其进行近似更加具有挑战性,尤其是在本文所考虑的复杂任务中。通过使用离散动作,作者简化了训练过程,并提升了强化学习系统的整体效果
具体来说,他们在这些任务中分别求解两个马尔可夫决策过程MDP
其中和分别是连续和离散动作空间
它们都接收来自环境的相同状态观测,如图像、本体感受、夹爪状态等
离散动作空间包含所有可能的离散动作
对于单个夹爪,这些动作是“open”、“close”和“stay”。如果涉及两个夹爪,动作空间扩展到种组合,考虑到每个夹爪可能采取的所有动作
对于的critic更新遵循标准的DQN方法(Mnih etal.,2013),并通过一个额外的目标网络以稳定训练,具体如下
其中,是目标网络,可以通过使用当前网络参数进行Polyak平均获得(van Hasselt et al.,2015)
在训练或推理时,他们首先从策略中查询连续动作,然后通过对critic 在中的输出取argmax来查询离散动作
最后作者将连接的动作应用于机器人「At training or inference time, we first query the continuous actions fromthe policy in 1, and then query the discrete actions from the critic in 2 by taking the argmax over the critic’s output; we then apply the concatenated actions to the robot.」
1.2.3 人工参与的强化学习——Human-in-the-Loop Reinforcement Learning
在RL中,状态/动作空间或任务时域的扩大,或它们的组合,会导致学习最优策略所需样本数量成比例增加;最终会超过一个阈值,使得在现实世界中训练RL策略变得不可行
- 为了应对现实机器人RL训练中的这一挑战,他们引入人工反馈以引导学习过程,帮助策略更高效地探索
- 这点还挺像ChatGPT中的RLHF的,即由于奖励函数不太好设计,故通过引入基于人类偏好选择下的排序数据训练RM
详见此文:ChatGPT技术原理解析:从RL之PPO算法、RLHF到GPT4、instructGPT
具体而言,在训练过程中,由人工操作员对机器人进行监督,并在必要时提供纠正性操作,如图2所示(或下图所示),对于从时间步到的自主rollout轨迹,人类可以在任意时刻进行干预,其中
在干预期间,人类可以控制机器人最多步,在单个轨迹中可以发生多次干预,如下图左下角中的红色段所示。当人类干预时,其动作会替代策略的动作会应用于机器人
- 他们将干预数据 同时存储在示范数据和RL数据缓冲区中「We store theintervention data in both the demonstration and RL data buffer」
- 然而,只有策略的转移——即干预前后的状态和动作,会被加入到RL缓冲区中
we add the policy’s transitions(i.e., the states and actions before and after the intervention) only to the RL buffer
这种方法已被证明在提高策略训练效率方面是有效的
实际上,这种干预在以下场景中至关重要:当策略导致机器人进入无法恢复或不理想的状态,或者陷入局部最优且没有人类帮助需要大量时间才能克服时
这个过程类似于HG-DAgger(Kelly等人,2018),当策略表现不佳时,人类接管机器人的控制以收集数据,但他们的方法使用这些数据通过强化学习而不是监督学习来优化策略,类似于Luo等人2023「Rlif: Interactive imitation learning as reinforcement learning」
且在他们的设置中,人工操作员使用SpaceMouse 3D鼠标为机器人提供纠正性动作
- 在训练过程的初期,人类更频繁地介入以提供纠正性操作,随着策略的改进,干预频率逐渐降低
- 且根据他们的经验,当人类操作员在关键时刻给出具体纠正,而在其他情况下让机器人自主探索时,策略的提升速度更快
1.2.4 训练过程
- 首先,他们选择最适合任务的摄像头。腕部摄像头由于其提供的自我中心视角,对于促进学习策略的空间泛化尤为有用
然而,如果仅靠腕部摄像头无法全面观察环境,他们还会布置几个侧面摄像头
对于所有摄像头,作者都会进行图像裁剪,以聚焦关注区域,并将图像尺寸调整为128x128,以便神经网络处理(如图2即下图右上角所示) - 接下来,收集用于训练奖励分类器reward classifier的数据(训练了一个二元分类器作为奖励检测器,它以手腕和/或侧面摄像机的图像作为输入,并预测当前状态是否成功完成当前任务),这是定义引导学习过程的奖励函数的关键步骤
通常,作者通过远程操作机器人执行任务的方式,收集200个正样本和1000个负样本。假设每条轨迹大约需要10秒,这大致相当于10条人类演示轨迹。利用作者的数据采集流程(详见补充代码),通常收集这些数据点只需大约5分钟
此外,他们可能会额外收集数据,以解决奖励分类器中的假阴性和假阳性问题,使得经过训练的奖励分类器在评估数据集上的准确率通常超过95% - 然后,收集20到30条人类演示的轨迹,用于完成任务,并用这些轨迹初始化离线演示回放缓冲区(offline demo replay buffer)
对于每个任务,要么编写机器人复位动作脚本,要么让人工操作员在每个轨迹开始时手动复位任务,例如USB拾取插入任务 - 最后,启动策略训练过程
在此阶段,如有必要,可以对策略进行人为干预(human interventions),直到策略收敛
还需要注意的是,应避免持续提供导致任务成功的长时间稀疏干预。这种干预策略会导致价值函数的高估,尤其是在训练初期阶段,从而可能引发训练过程的不稳定
1.3 实验结果
1.3.1 主板组装任务:内存插入、SSD组装、USB插入、电缆夹紧
主板组装任务包括四个子任务:将RAM卡插入其对应插槽,将PCI-E固态硬盘安装到主板上、拾取悬空的USB数据线并插入插槽,以及将USB数据线固定在紧密的卡扣内
- 内存插入
在该任务中,机器人需要将RAM卡插入匹配的插槽
整个过程主要包括两个步骤:
首先,机器人需将RAM卡对准插槽两侧的狭窄开口;随后,以适当的力度进行精细的向下运动,将RAM卡插入插槽
如果RAM卡能够完全插入插槽且未触发锁定机制,便于后续重置,则任务被视为成功。如有需要,在执行训练好的策略后,可以施加额外的向下压力,将RAM卡锁定到位
该任务的难点在于:如果施加的力稍有过大,RAM卡可能在夹爪内倾斜,导致失败;而力度不足则可能导致RAM卡未能正确插入插槽。假设机器人已预先抓取好RAM卡,但我们也会定期将其放回夹具并重新抓取,以引入抓取方式的变化 - SSD 组装
在此任务中,机器人需要将SSD的一侧插入匹配的插槽,然后将另一侧放置到主板上的固定夹具上。如果SSD的两侧都正确地插入到相应的位置,则任务被视为成功。该任务最初需要一种既轻柔又精确的插入策略,以避免损坏接触针脚,随后还需进行另一次精确的运动,将另一侧对准支撑夹具
假设SSD已被机器人预先抓取,但作者也会定期将其放回夹具并重新抓取,以引入抓取方式的变化 - USB 接头抓取插入
在此任务中,USB线被随意放置在桌面上,机器人需要抓取USB连接器部分,将其插入相应插槽并松开夹爪。若USB连接器完全插入插槽且夹爪释放,则任务视为成功
该任务的难点在于USB线初始放置位置的多样性,以及由此带来的不确定性 且,抓取姿势上,在插入过程中,策略必须学会应对这类不确定性。例如,如果执行了一个不合适的抓取,策略可能需要释放物体并重新抓取,以获得更好的抓取姿态
且,并偶尔将其从机械手中强制移出以模拟不良的抓取姿态,策略也能通过释放连接器并重新抓取来适应,从而获得更好的插入姿态
且,这些稳健的行为通常难以通过模仿学习方法实现,因为它们缺乏这种自主探索和从其行动结果中学习的机制
而这一切,不就是先进技术所带来的灵活性、抗干扰性,以及为达目的想尽办法的智能么?确实是伟大的智能化时代 - USB线夹持
本任务假设USB线已插入主板,机器人需要拾取剩余部分的线缆,并将其插入一个紧密的理线夹中
只有当USB线完全插入夹子时,任务才算成功
任务的难点在于USB线本身的可变形特性以及紧密插入阶段的操作难度 - 整体组装
作者还通过将上述四个子任务串联起来,执行了整体组装任务,并利用脚本化动作在各子任务之间进行过渡
1.3.2 与各路其他方法的PK,包括扩散策略
对于每个任务,作者报告了成功率、循环时间和训练时间。训练时间包括所有脚本化运动、策略回放、预期停止,以及在一块NVIDIA RTX 4090 GPU上进行的板载计算。除非另有说明,所有结果均基于100次评估试验
在这些评估过程中,通过脚本化机器人动作或人工复位来随机化初始状态。评估协议可以在补充材料中找到
本文的一个核心论点是,HIL-SERL优于基于人类远程操作的模仿学习方法。为了证实这一点,关键在于在相同设置下,公平地比较相关的模仿学习方法
正如(Ross et al.,2011)所指出的,朴素的模仿学习方法常常存在误差累积的问题。DAgger及其变体「Ross et al.,2011;Kelly et al.,2018」通过引入人类修正,并利用监督学习来优化策略,从而解决了这个问题
HIL-SERL的方法也利用了人类修正,但将其通过基于任务特定奖励的强化学习策略优化。因此,通过在相同数量的人类示范下,采用HG-DAgger(Kelly et al.,2018)训练基线模型,并将HIL-SERL方法与模仿学习进行比较——使用与RL中相同数量的人类演示和修正
具体而言
- 首先使用与本HIL-SERL方法等量的离线人类演示,通过行为克隆(BC)对基础策略进行预训练
- 然后,运行这个策略并收集人类专家的修正,使得总的试验次数和干预次数与强化学习训练相匹配
具体来说,运行与本方法相同数量的回合,并力求每个回合提供可比数量的干预。这个比较在所有任务中执行,除了Jenga 鞭打和物体翻转任务,这些任务中干预是具有挑战性和不受欢迎的
对于这两个任务,分别收集了 50 和 200 条离线演示,并以此训练 BC 策略作为基线。这相比HIL-SERL方法需要的演示数量要多得多,而HIL-SERL方法通常只需 20-30 条演示
另在HIL-SERL所有的实验中,使用成功率和循环时间作为主要指标来比较不同的方法,且为了进一步验证HIL-SERL方法的有效性,作者还报告了随时间变化的干预率,显示HIL-SERL的策略能够持续改进,减少对干预的需求。理想情况下,干预率趋向于零,表明策略可以自主执行
具体如下图所示
「此图展示了HIL-SERL和DAgger在几个代表性任务中的成功率、周期时间和干预率,显示为20个回合的运行平均值
对于HIL-SERL,成功率在训练过程中迅速增加,最终达到100%,而干预率和周期时间逐渐减少,最终干预率达到0%(如下图第二行、第三行所示)
对于HG-DAgger,成功率在训练回合中波动,并不随着训练的进行而必然增加。由于干预频繁发生,导致成功结果,真实的策略成功率可能低于曲线所示。此外,干预率并没有随着时间一致地减少,这表明策略并没有稳步改善。这也反映在周期时间上,没有显示出改善,因为DAgger缺乏提升性能的机制,超出所提供的训练数据」 也进一步说明了HIL-SERL在较少人类监督的情况下取得了更好的性能,包括之所以优于HG-DAgger,主要得益于RL的关键优势 - 实验结果可以在上图图4和下表表1a中找到
首先,如上表表1所示,HIL-SERL在几乎所有任务中,仅经过1至2.5小时的真实环境训练,就实现了100%的成功率。这相比于HG-DAgger基线方法,是一个显著的提升
且如下表所示
从零开始的RL,没有任何演示或纠正,在所有任务上成功率为0%(即如上表倒数第三列的HIL-SERL no demo no itv所示)
为了验证在线人工纠正的重要性,作者将SERL的离线缓冲区中的演示数量增加了十倍,从常规的20增加到200(即如上表倒数第二列的HIL-SERL no itv所示)
然而,在没有任何在线纠正的情况下,这种方法的成功率显著低于HIL-SERL,并且在诸如汽车仪表盘组装等复杂任务上完全失败(0%成功率)
这进一步证实了在线纠正对于策略学习的关键作用。实验结果表明,离线演示和基于策略的人为干预在引导策略学习方面同样至关重要,尤其是在需要持续反应性操作的复杂操作任务中
对于物体翻转(Object Flipping)任务,他们使用20和200次示范数据训练了行为克隆(BC)策略。这两种BC策略的结果非常相似,成功率分别为47%和46%,尽管示范次数增加了十倍。提升也不明显。这表明,仅仅模仿人类示范并不足以解决该任务,尽管该任务在很大程度上是开环的
另一个需要考虑的重要方面是我们的方法在处理演示数据时与其他方法的不同。为了与上述基线方法进行对比,作者为每个任务收集了200次演示。请注意,这个数字远远大于HIL-SERL方法中的离线演示数量,通常在离线回放缓冲区中大约为20-30次
对于Residual RL和IBRL,作者使用这些演示训练了行为克隆(BC)策略,以输入他们的算法管道
总体而言,HIL-SERL的方法始终以较大优势超越了这些基线方法,如上表表1所示。这可以解释为:残差强化学习(Residual RL)依赖于预训练的行为克隆(BC)基础策略,以促进学习过程
然而,这种方法在需要精确操作的任务中可能会出现问题,例如汽车仪表盘组装或内存条插入。在这些场景中,包括BC在内的模仿学习方法通常表现不佳。因此,RL策略的学习过程可能会遭遇严重失败。对于IBRL,执行者是BC策略和RL策略的混合体,使得行为更接近“BC风格”——该方法在行为克隆(BC)表现不佳的任务上同样难以取得好成绩
对于DAPG,作者将这200次演示存储在一个单独的缓冲区中,并将策略动作正则化到它们
此外,为了与扩散策略(Chi等,2024)进行比较,作者为每个任务训练了使用200个演示的策略,这远远超过了HIL-SERL方法中离线回放缓冲区中可用的20个示范
在RAM 插入和汽车仪表板面板任务中,扩散策略分别达到了27 % 和28 % 的成功率。在物体翻转任务中,成功率为56 %。这一表现明显低于我们的方法,甚至不及HG-DAgger基线
这一结果并不令人意外,因为扩散策略的主要优势在于学习更具表现力的策略分布,以准确“记忆”机器人运动——对比的好啊
然而,这些任务需要更多“闭环”反应行为,例如持续的视觉伺服以纠正运动误差。因此,扩散策略在学习表现力策略分布方面的优势不一定能在这些任务中带来更好的表现 - 另一个需要考虑的重要方面是周期时间,即完成任务所需的时间。平均而言,HG-DAgger 策略的平均周期时间为 9.6 秒,而HIL-SERL的方法平均周期时间为 5.4秒。这表明提高了 1.8 倍的速度
这种改进是预期的,因为模仿学习方法缺乏处理人类演示次优性的机制。相比之下,强化学习(RL)可以利用动态规划来优化折扣奖励总和。对于折扣因子,这种方法鼓励策略更快地获得奖励,从而导致比模仿人类演示所实现的周期时间更短
在这些实验中,作者注意到HIL-SERL的方法在具有截然不同物理特性的任务中表现出通用性和有效性,生成了适合每个任务特定要求的开环和闭环策略
比如对于精确操作任务,如组装正时皮带或插入 RAM 条,策略学习将任务相关的视觉特征与适当的扭转动作关联起来。它执行连续的视觉伺服行为,实时响应流媒体观察并调整其动作直到达到目标
相比之下,对于像叠叠乐抽取和物体翻转这样的任务,策略通过交互学习预测其动作的潜在结果
1.3.3 对实验结果的反思与分析:RL为何强于模仿学习
HIL-SERL性能的一个关键方面是其高可靠性,在所有任务中均实现了100%的成功率。作者认为这种可靠性源于强化学习固有的自我纠正能力,通过策略采样使代理能够从成功和失败中不断学习和改进
- 相比之下,模仿学习方法,包括交互式方法,缺乏这种自我纠正机制,因此在相同数据量下实现相当的性能要困难得多。尽管关于Q学习收敛性的理论工作已经存在(Papavassiliou 和 Russell, 1999;Bhandari等人,2018;Jin等人,2020;Yang和Wang,2019),作者的分析集中在提供对训练动态的直观理解
- 为此,作者分析了RAM插入任务,该任务需要精确的操作,并且由于X和Y方向的对称随机化,易于可视化
作者在下图图6中绘制了不同策略检查点在时间步长上的状态访问次数热图,基于末端执行器的Y和Z位置
通过策略学习,作者观察到一个漏斗状结构逐渐形成,将初始状态与目标位置连接起来。随着空白区域被填充,这一漏斗逐渐清晰;在接近目标时变窄,表明策略的信心和精度提升。随着时间推移,质量集中在更有可能成功的区域
然后作者引入了“关键状态”的概念,定义为Q函数方差较大的状态,即使用以下方法计算该方差:
对于每个数据点及其相关的策略检查点,作者在每个状态下向动作(归一化到[-1, 1])添加来自[-0.2, 0.2]的均匀随机噪声,并通过蒙特卡洛采样(100次采样)计算Q函数的方差。较大的方差表明该状态对策略的成功至关重要,因为采取不同的动作会导致显著不同(通常更小)的Q值
上图图6还显示了不同状态下Q值及其方差的热图。这些图清晰地展示了策略在形成漏斗结构:被访问频率最高的状态拥有更高的Q值和更高的Q值方差。这表明策略正在增强该区域的鲁棒性,通过动态规划,有效地将重要状态与能够获得高Q值的动作连接起来
相比之下,HG-DAgger 在相同任务下的状态访问计数热图(见图6第四行)显示出分布更加稀疏。漏斗形状不那么明显,更加平坦,且分布更为分散,与 RL 情况相比,各状态的访问更加均匀
这是因为RL可以自主探索,并使用任务奖励指导的动态规划,而DAgger 只能围绕当前策略进行探索。因此,为了达到类似的性能,DAgger 可能需要显著更多的演示和纠正,并且需要人类操作员更加细致地关注数据质量。这种在漏斗内的稳定化行为已在基于状态的灵巧操作和运动规划中进行研究(Burridge等,1999;Tedrake等,2010)
然而,HIL-SERL的方法不同之处在于,HIL-SERL直接利用感知输入,并使用RL探索自主形成漏斗。在最优控制领域,一个类似的概念是开发使用局部反馈围绕标称轨迹实现稳定的控制器「An analogousconcept in optimal control is the development of controllers that stabilize around nominal trajectories using local feedback (Astrom and Murray, 2008).」
在上面的案例中,演示和修正可以被视为"标称轨迹",RL 方法围绕这些轨迹开发稳定化的漏斗
1.4 现存工作的局限性与不足
- 首先,HIL-SERL的方法可以作为生成高质量数据以训练机器人基础模型的有效工具(Brohan etal.,2023b;a;Collaboration et al.,2024;Team et al.,2024;Kim et al.,2024)
鉴于每项任务的训练时间相对较短,且训练过程基本实现自动化,该框架能够被用于开发多种技能。随后,可以通过执行收敛后的策略来收集数据,并将这些数据提炼到通用模型中 - 其次,尽管当前的训练时间相对较短,但每个任务仍需从头开始训练。可以通过预训练一个能够涵盖不同机器人形态下解决多种任务所需通用操作能力的价值函数,进一步缩短这一时间
该预训练价值函数随后可以被快速微调,以应对特定任务 - 当然,作者也发现了他们方法的一些局限性。尽管他们成功应对了多种具有挑战性的任务,但目前尚不确定该方法能否进一步扩展到时间跨度显著更长的任务,在这类任务中样本复杂度问题会更加突出
然而,这一挑战可能通过改进的预训练技术得到缓解,或者采用能够自动将长时间跨度任务分割为一系列较短子任务的方法(如视觉-语言模型)来加以解决
还需要注意的是,他们在实验并未进行大量的随机化,也未测试该方法在非结构化环境中的泛化能力。本文的主要关注点在于展示该方法能够以高性能习得广泛的操作技能,具有通用性
作者相信,随机化问题可以通过延长策略在所需随机化水平下的训练时间来解决,正如Luo等人(2021)所做的那样。此外,泛化问题则有望通过引入在大规模多样化数据集上预训练的视觉基础模型来解决
作者希望,这项工作能为使用强化学习解决机器人操作问题铺平道路,实现高性能并最终将其部署到现实世界中
第二部分 HIL-SERL执行相关人物所用的硬件配置及训练细节
2.1 主板组装任务
2.1.1 RAM 插入
下图图8展示了主板组装任务的硬件设置,包括机器人、相机位置和任务安排
为了聚焦于场景中与任务相关的部分,故作者裁剪了图像,如下图图9所示(用作策略输入的相机样本输入图像)
下表则是RAM插入任务的策略训练细节
2.1.2 SSD 组装
同样的,为了聚焦于场景中与任务相关的部分,他们裁剪了图像,下图便是用作策略输入的摄像机的示例输入图像
2.1.3 USB抓取-插入
为了聚焦于场景中与任务相关的部分,他们照例裁剪了图像,如下图所示是用于策略输入的相机采集的样本输入图像
下表则是该任务策略训练的更多细节
2.1.4 电缆夹持
为了聚焦于场景中与任务相关的部分,他们照例裁剪了图像,如下图所示是用于策略输入的相机采集的样本输入图像
2.2 库的安装与运行
2.2.1 安装
- 设置 Conda 环境: 使用以下命令创建环境
conda create -n hilserl python=3.10
- 安装 Jax 如下:
对于CPU
对于GPUpip install --upgrade "jax[cpu]"
对于TPUpip install --upgrade "jax[cuda12_pip]==0.4.35" -f https://storage.googleapis/jax-releases/jax_cuda_releases.html
pip install --upgrade "jax[tpu]" -f https://storage.googleapis/jax-releases/libtpu_releases.html
有关安装Jax的更多详细信息,可以参阅:Jax GitHub
- 安装 serl_launcher
cd serl_launcher pip install -e . pip install -r requirements.txt
- 安装 serl_robot_infra
按照README中的说明进行安装和基本机器人操作。其中包含基于阻抗的serl_franka_controllersserl_robot_infra的安装说明安装完成后,您应该能够运行机器人服务器,并与硬件进行交互
第三部分 HIL-SERL的两个衍生库:Ke-Wang1017/hil-serl、LeRobot's HilSerl
3.1 HIL-SERL在仿真中的复现
3.1.1 仿真抓方块:Ke-Wang1017/hil-serl
GitHub上有人把hil-serl稍微改写了下:github/Ke-Wang1017/hil-serl
- 怎么发现的这个项目呢?
是我组建的「七月具身:HIL-SERL复现交流大群」的群里一朋友从hil-serl官方对应的discord讨论组中发现的 - 而这个Ke-Wang做了什么任务呢——很简单 抓方块(过程中,通过手柄遥操机械臂辅助其抓方块 作为人工干预的方式),如此视频所示
// 待更
3.1.2 我司对Ke-Wang1017/hil-serl的复现(仿真中抓方块)
在历时一周多之后,25年6.29日,我们(同事文弱为主)——七月具身长沙分部,通过基于uc伯克利的RL项目hil-serl,成功实现在仿真中抓方块(成功率基本100%),respect kewang
复现uc伯克利hil-serl(仿真中抓方块)
3.2 真机上的部署:LeRobot's HilSerl
我司在复现hil-serl的过程中,同事文弱找到了这个GitHub:lerobot-hilserl-guide
再后来,lerobot官方把这个hil-serl直接集成到了lerobot中,这是最终正式的指南:HIL-SERL 真实机器人训练工作流程指南
其训练过程始于对 HILSerl 环境进行适当的配置,其对应的配置类位于:HILSerlRobotEnvConfig中lerobot/common/envs/configs.py,其定义如下
class HILSerlRobotEnvConfig(EnvConfig):
robot: Optional[RobotConfig] = None # 机器人硬件配置,用于定义机器人类型
wrapper: Optional[EnvWrapperConfig] = None # 环境包装器设置;查看 `lerobot/scripts/server/gym_manipulator.py`
fps: int = 10 # 控制频率(每秒帧数)
name: str = "real_robot" # 环境名称
mode: str = None # 模式,取值为 "record"(记录)、"replay"(回放) 或 None(用于训练)
repo_id: Optional[str] = None # LeRobot 数据集仓库 ID
dataset_root: Optional[str] None = # 本地数据集根目录(可选)
task: str = "" # 任务标识符
num_episodes: int = 10 # 记录时的剧集数量
episode: int = 0 # 用于回放的剧集索引
device: str = "cuda" # 计算设备
push_to_hub: bool = True # 是否将记录的数据集推送到 Hub
pretrained_policy_name_or_path: Optional[str] = None # 用于策略加载的预训练策略名称或路径
reward_classifier_pretrained_path: Optional[str] = None # 用于奖励模型的预训练分类器路径
number_of_steps_after_success: int = 0 # 对于奖励分类器,在成功训练分类器后收集更多正面示例
3.2.1 步骤1:确定机器人工作空间边界
在收集演示数据之前,需要确定机器人合适的操作范围
- 这有助于简化在真实机器人上学习的问题,通过将机器人的操作空间限制在能解决任务的特定区域内,从而避免不必要的或不安全的探索
- 且允许在末端执行器空间而非关节空间进行训练。经验表明,在关节空间进行强化学习操作通常是一个更难的问题——有些任务在关节空间几乎不可能学习,但当动作空间转换为末端执行器坐标系时,就可以学习了
- 使用 find_joint_limits.py
此脚本可帮助你找到机器人末端执行器的安全操作范围:
此脚本可帮助您找到机器人末端执行器的安全操作范围。假设你有一个主臂、一个从臂,你可以使用该脚本找到将在训练期间应用的从臂的边界。限制动作空间可以减少代理的冗余探索并确保安全python -m lerobot.scripts.find_joint_limits \ --robot.type=so100_follower \ --robot.port=/dev/tty.usbmodem58760431541 \ --robot.id=black \ --teleop.type=so100_leader \ --teleop.port=/dev/tty.usbmodem58760431551 \ --teleop.id=blue
- 工作流程
以下脚本将记录末端执行器的最小和最大位置,并将其打印到控制台
ps,end_effector_bounds在远程操作设备(TeleoperatorConfig)的配置中使用这些值Max ee position [0.2417 0.2012 0.1027] Min ee position [0.1663 -0.0823 0.0336] Max joint positions [-20.0, -20.0, -20.0, -20.0, -20.0, -20.0] Min joint positions [50.0, 50.0, 50.0, 50.0, 50.0, 50.0]
以下是示例配置"end_effector_bounds": { "max": [0.24, 0.20, 0.10], "min": [0.16, -0.08, 0.03] }
3.2.2 步骤2:收集演示——涉及设置记录模式、游戏手柄控制、录制演示
定义了界限后,就可以收集用于训练的演示内容了
- 设置记录模式
创建用于录制演示的配置文件(或编辑现有文件,如env_config_so100.json):
1 将模式设置为“录制record”
2 为你的数据集指定一个唯一的 repo_id(例如,“用户名/任务名称”)
3 将 num_episodes 设置为你想要收集的演示次数
4 最初将 crop_params_dict 设置为 null(稍后将确定裁剪参数)
5 配置机器人、相机和其他硬件设置
以下是示例配置部分"mode": "record", "repo_id": "username/pick_lift_cube", "dataset_root": null, "task": "pick_and_lift", "num_episodes": 15, "episode": 0, "push_to_hub": true
除了的机器人之外,还需要一个远程操作设备来控制它,以便收集任务数据集,并在在线训练期间进行干预。本项目支持使用游戏手柄、键盘或机器人的主臂。
- HIL-Serl 在机器人末端执行器的空间中学习动作。因此,遥操作将控制末端执行器的 x、y、z 位移
- 为此,需要定义一个在末端执行器空间中执行动作的机器人版本
如下代码,可以查看机器人类 SO100FollowerEndEffector 及其配置 SO100FollowerEndEffectorConfig 中与末端执行器空间相关的默认参数class SO100FollowerEndEffectorConfig(SO100FollowerConfig): """Configuration for the SO100FollowerEndEffector robot.""" # 末端执行器位置的默认边界(以米为单位) end_effector_bounds: dict[str, list[float]] = field( # bounds for the end-effector in x,y,z direction default_factory=lambda: { "min": [-1.0, -1.0, -1.0], # min x, y, z "max": [1.0, 1.0, 1.0], # max x, y, z } ) # 夹爪打开的最大夹持位置 max_gripper_pos: float = 50 end_effector_step_sizes: dict[str, float] = field( # maximum step size for the end-effector in x,y,z direction default_factory=lambda: { "x": 0.02, "y": 0.02, "z": 0.02, } )
- 游戏手柄控制
游戏手柄为控制机器人和游戏进程状态提供了一种非常便捷的方式
要设置游戏手柄,需要将控制模式设置为“gamepad”,并在配置文件中定义遥操作部分
以下图片展示了录制过程中所使用的游戏手柄按键映射(即用于机器人控制和关卡管理的游戏手柄按钮映射)"teleop": { "type": "gamepad", "use_gripper": true },
设置 SO101 领导者
SO101 领航臂采用了减速齿轮,这使其在探索过程中能够移动并追踪从动臂,因此接管过程比无齿轮的 SO100 平稳得多。
要设置 SO101 领导者,您需要将控制模式设置为“leader”,并在配置文件中定义遥操作部分
"teleop": { "type": "so101_leader", "port": "/dev/tty.usbmodem585A0077921", # check your port number "use_degrees": true },
为了标注该集的成功/失败,需要使用键盘按 s 表示成功,按 esc 表示失败。在在线训练期间,按空格键接管策略,再次按空格键将控制权交还给策略
- 录制演示
开始录制过程
录制过程中python lerobot/scripts/server/gym_manipulator.py --config_path lerobot/configs/env_config_so100.json
1 机器人将重置到配置文件 fixed_reset_position 中定义的初始位置
2 使用游戏手柄控制机器人(已启用 use_gamepad)
3 成功完成任务
4 当您按下“成功”按钮时,该回合结束并获得 1 分奖励
5 如果达到时间限制或按下“失败”按钮,该回合结束并获得 0 分奖励
6 您可以按下“重录”按钮重新录制一个回合
7 过程会自动进入下一个回合
8 录制完所有回合后,数据集将被推送到 Hugging Face Hub(可选)并保存到本地
3.2.3 步骤3:处理数据集
收集演示数据后,对其进行处理以确定最佳的相机裁剪范围。强化学习对背景干扰很敏感,因此将图像裁剪到相关的工作区域非常重要
视觉强化学习算法直接从像素输入中学习,这使得它们容易受到无关视觉信息的影响。诸如变化的光线、阴影、移动的人或工作区外的物体等背景元素可能会扰乱学习过程。良好的感兴趣区域(ROI)选择应当:
- 仅包含任务发生的必要工作区域
- 捕捉机器人末端执行器以及任务中涉及的所有物体
- 排除不必要的背景元素和干扰项
注意:如果你已经知道裁剪参数,可以跳过此步骤,在录制期间仅在配置文件中设置 crop_params_dict 即可
- 确定作物参数
使用 crop_dataset_roi.py 脚本在你的相机图像中交互式选择感兴趣区域
1 对于每个摄像机视角,脚本将显示第一帧python lerobot/scripts/server/crop_dataset_roi.py --repo-id username/pick_lift_cube
2 在相关工作区周围绘制一个矩形
3 按“c”键确认选择
4 对所有摄像机视角重复此操作
5 脚本输出裁剪参数并创建一个新的裁剪数据集
以下是示例输出
下图便代表选择感兴趣区域——即用于选择感兴趣区域的交互式裁剪工具Selected Rectangular Regions of Interest (top, left, height, width): observation.images.side: [180, 207, 180, 200] observation.images.front: [180, 250, 120, 150]
- 更新配置
将这些裁剪参数添加到训练配置中:"crop_params_dict": { "observation.images.side": [180, 207, 180, 200], "observation.images.front": [180, 250, 120, 150] }, "resize_size": [128, 128]
3.2.4 训练奖励分类器
// 待更
3.2.5 步骤5:使用 Actor-Learner 进行训练
接下来,设置配置和启动两个进程:Learner 和 Actor
- 配置的设置
创建一个训练配置文件(参见示例 train_config_hilserl_so100.json)。该训练配置基于 lerobot/configs/train.py 中的主要 TrainPipelineConfig 类
1 将模式设置为 null(用于训练模式)
2 配置策略设置(类型、设备等)
3 将数据集设置为你上面裁剪好的数据集
4 使用裁剪参数配置环境设置
5 检查与 SAC 相关的其他参数
6 验证策略policy配置是否正确,输入特征input_features和输出特征output_features是否适合你的任务 - 启动学习者Learner 首先,启动学习者Learner服务器进程:
学习者Learnerpython lerobot/scripts/server/learner_server.py --config_path lerobot/configs/train_config_hilserl_so100.json
1 初始化策略网络
2 准备重放缓冲区
3 开启一个 gRPC 服务器以与执行者Actor通信
4 处理过渡并更新策略 - 启动执行者Actor
在另一个终端中,使用相同的配置启动 Actor 进程:
执行者Actor:python lerobot/scripts/server/actor_server.py --config_path lerobot/configs/train_config_hilserl_so100.json
1 通过 gRPC 与学习者Learner建立连接
2 初始化环境
3 执行策略policy的 rollout 以收集经验
4 将转换transitions 发送给学习者Learner
5 接收更新后的策略参数 - 训练流程
训练自动进行,步骤如下所示 1 执行者Actor在环境中执行策略
2 收集到的转换被发送给学习者Learner
3 学习者Learner根据这些转换transitions 更新策略
4 更新后的策略参数被送回给执行者Actor
5 该过程持续进行,直至达到指定的步数限制 - 人机交互
1 高效学习的关键在于有人工干预来提供纠正性反馈,并完成任务以辅助策略policy学习和探索
2 要进行人工干预,可以按下游戏手柄右上角的触发按钮。这将暂停策略动作,让你接管
3 成功的实验是,开始时需要人工干预,但随着策略的改进,干预次数逐渐减少。具体可以在 wandb 仪表板中监控干预率。
如下图所示——示例展示了人类干预如何随着时间的推移帮助引导policy学习 该图展示了在交互步骤中阶段性奖励的变化曲线。该图展示了人类干预对策略学习的影响
橙色曲线是没有人类干预的实验,而粉色和绿色曲线是有人类干预的实验
可以观察到,当存在人类干预时,策略开始获得最大奖励的步骤数减少了四分之一
对于人工干预而言
建议:
1 在最初的几集里,几乎在整个集数中进行干预
2 当策略变得不那么混乱时,逐渐减少一集中的干预时间,让策略有更长的时间进行探索
3 一旦策略开始引导机器人完成任务,即使不是完美的,也可以将干预限制为简单的快速动作,例如抓取命令,或者抓取和提升命令
如果在配置中将 wandb.enable 设置为 true,则可以通过 Weights & Biases 控制台实时监控训练进度
// 待更
发布评论