第十章:HIL-SERL 真实机器人训练实战
引言
在机器人学习领域,如何让机器人在真实环境中快速、安全地学习复杂任务一直是一个重要挑战。传统的强化学习方法往往需要大量的试错过程,这在真实机器人上既耗时又存在安全风险。而纯粹的模仿学习虽然安全,但往往难以处理训练数据中未见过的情况。
HIL-SERL(Human-in-the-Loop Sample-Efficient Reinforcement Learning,人在环路样本高效强化学习)为这一问题提供了一个优雅的解决方案。这种方法巧妙地结合了人类演示、在线学习和人工干预,能够在短短几个小时内训练出高性能的机器人策略。
本章将详细介绍如何使用 LeRobot 框架实践 HIL-SERL ,帮助读者掌握在真实机器人上进行强化学习训练的完整流程。
10.1 HIL-SERL 方法概述
HIL-SERL 是一种样本高效的强化学习算法,它将人类演示与在线学习和人工干预相结合。该方法从少量人类演示开始,使用这些演示训练奖励分类器(reward classifier),然后采用演员-学习者( actor-learner)架构,在策略执行过程中允许人类干预,以指导探索并纠正不安全的行为。
HIL-SERL 方法包含三个关键要素:
1. 离线演示与奖励分类器
系统首先收集少量的人类遥操作演示数据,这些数据为策略提供了一个良好的起始点。同时,基于视觉的成功检测器(奖励分类器)能够自动判断任务是否成功完成,为强化学习提供奖励信号。
这种设计的优势在于,相比于手工设计奖励函数,基于演示数据训练的奖励分类器能够更好地捕捉任务的本质特征,同时避免了奖励函数设计不当导致的问题。
2. 机器人演员/学习者循环与人工干预
系统采用分布式的 Soft Actor Critic (SAC) 学习器来更新策略,同时演员在物理机器人上进行探索。关键的创新在于,人类操作员可以随时介入,纠正危险或无效的行为。
这种人在环路的设计确保了学习过程的安全性和效率。当机器人即将执行危险动作或偏离正确轨迹时,人类可以立即接管控制,既避免了潜在的安全风险,又为学习算法提供了有价值的纠正信号。
3. 安全与效率工具
为了保证硬件安全和数据质量,HIL-SERL 集成了多种安全与效率工具:
- 关节/末端执行器边界限制:通过设定机器人的工作空间边界,避免不必要或危险的探索
- 感兴趣区域(ROI)裁剪预处理:专注于任务相关的视觉信息,提高学习效率
- WandB 监控:实时监控训练过程,确保数据质量和系统状态
这些要素协同工作,使 HIL-SERL 能够达到接近完美的任务成功率,并且比纯模仿学习基线方法具有更快的学习速度。
10.2 系统需求与准备工作
在开始 HIL-SERL 训练之前,需要准备以下硬件和软件环境:
硬件需求
必需设备:
- 游戏手柄(推荐)或键盘:用于控制机器人和提供人工干预
- NVIDIA GPU:用于深度学习模型的训练和推理
- 真实机器人:配备跟随臂和引导臂(如果使用键盘或游戏手柄控制,引导臂可选)
可选设备:
- 机器人 URDF 文件:用于运动学计算包(可在
lerobot/common/model/kinematics.py
中查看支持的机器人类型)
适用任务类型
HIL-SERL 适用于多种操作任务,但建议按以下顺序进行学习:
初学者任务(建议起步):
- 将立方体推到目标区域
- 用夹爪抓取并举起立方体
这些简单任务有助于理解系统工作原理,建议将任务时长控制在 5-10 秒内,避免过长的时间跨度。
进阶任务(熟悉系统后):
- 抓取并放置立方体
- 双臂协作抓取物体
- 物体在两臂间的传递任务
- 更复杂的创新任务
软件安装
要使用 HIL-SERL 功能,需要安装 LeRobot 的 hilserl
扩展包:
pip install -e ".[hilserl]"
这个命令会安装 HIL-SERL 所需的所有依赖包,包括强化学习算法、机器人控制接口和监控工具等。
10.3 配置系统
HIL-SERL 的训练过程始于正确的环境配置。理解配置系统是成功实施 HIL-SERL 的关键步骤。
核心配置类
HIL-SERL 环境的核心配置类是 HILSerlRobotEnvConfig
,位于 lerobot/envs/configs.py
文件中。这个配置类定义了训练过程中的所有重要参数:
class HILSerlRobotEnvConfig(EnvConfig):robot: RobotConfig | None = None # 主机器人代理配置(defined in `lerobot/robots`)teleop: TeleoperatorConfig | None = None # 遥操作设备配置(e.g., gamepad or leader arm, defined in `lerobot/teleoperators`)wrapper: EnvTransformConfig | None = None # 环境包装器设置( check `lerobot/scripts/server/gym_manipulator.py`)fps: int = 10 # 控制频率name: str = "real_robot" # 环境名称mode: str = None # 模式:"record"、"replay" 或 None(训练)repo_id: str | None = None # LeRobot 数据集仓库 IDdataset_root: str | None = None # 本地数据集根目录(可选项)task: str = "" # 任务标识符num_episodes: int = 10 # 录制的回合数episode: int = 0 # 回放的回合索引device: str = "cuda" # 计算设备push_to_hub: bool = True # 是否推送数据集到 Hubpretrained_policy_name_or_path: str | None = None # 预训练策略路径(For policy loading)reward_classifier_pretrained_path: str | None = None # 奖励模型路径(For reward model)number_of_steps_after_success: int = 0 # 成功后收集的额外步数(For reward classifier, collect more positive examples after a success to train a classifier)
配置参数详解
机器人配置 (robot):定义主要的机器人参数,包括机器人类型、通信端口、设备 ID 等信息。这些参数需要根据具体使用的机器人硬件进行设置。
遥操作配置 (teleop):定义遥操作设备的配置,可以是游戏手柄、键盘或引导臂。这个配置决定了人类如何与系统交互。
控制频率 (fps):设置系统的控制频率,默认为 10Hz。这个参数需要根据任务复杂度和硬件性能进行调整。
工作模式 (mode):
"record"
:数据收集模式,用于录制演示数据"replay"
:回放模式,用于验证已录制的数据None
:训练模式,用于实际的强化学习训练
数据集配置:包括数据集仓库 ID、本地存储路径等,用于管理训练数据的存储和共享。
理解这些配置参数对于成功部署 HIL-SERL 系统至关重要。在实际应用中,需要根据具体的硬件环境和任务需求对这些参数进行适当调整。
10.4 确定机器人工作空间边界
在收集演示数据之前,确定机器人的适当操作边界是一个关键步骤。这个过程不仅关系到训练效率,更直接影响到系统的安全性。
边界设置的重要性
设定工作空间边界能够从两个方面简化真实机器人的学习问题:
1. 限制操作空间
通过将机器人的操作空间限制在解决任务所需的特定区域内,可以避免不必要或不安全的探索。这种限制不仅提高了学习效率,还大大降低了机器人在训练过程中发生碰撞或其他意外的风险。
2. 启用末端执行器空间训练
边界设置允许系统在末端执行器空间而非关节空间中进行训练。根据经验,在操作任务的强化学习中,关节空间学习往往是一个更困难的问题。许多在关节空间中几乎不可能学会的任务,当动作空间转换为末端执行器坐标时就变得可以学习。
这种转换的优势在于,末端执行器空间更直观地反映了任务的本质特征,使得学习算法能够更容易地发现有效的策略。
使用 find_joint_limits.py 脚本
LeRobot 提供了一个专门的脚本来帮助确定机器人末端执行器的安全操作边界。这个脚本的使用方法如下:
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
边界确定工作流程
步骤 1:运行脚本
执行上述命令后,系统会启动边界确定模式。此时需要使用引导臂(或其他遥操作设备)控制机器人。
步骤 2:探索工作空间
在脚本运行期间,需要手动控制机器人在能够解决目标任务的整个空间范围内移动。这个过程需要仔细考虑任务的具体要求:
- 确保覆盖所有任务相关的位置
- 避免包含不必要的危险区域
- 考虑机器人的物理限制和安全约束
步骤 3:记录边界数据
脚本会自动记录机器人末端执行器的最小和最大位置,以及相应的关节角度。完成探索后,系统会在控制台输出类似以下的信息:
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]
步骤 4:应用边界配置
将获得的边界值应用到遥操作设备配置(TeleoperatorConfig)的 end_effector_bounds
字段中:
"end_effector_bounds": {"max": [0.24, 0.20, 0.10],"min": [0.16, -0.08, 0.03]
}
这些边界值将在后续的训练过程中用于约束机器人的动作空间,确保训练过程的安全性和效率。
边界设置的最佳实践
保守原则:在设定边界时,建议采用相对保守的策略,确保边界内的所有位置都是安全的。
任务相关性:边界应该紧密围绕任务需求设定,既不能过于限制(影响任务完成),也不能过于宽松(降低学习效率)。
安全验证:在正式训练前,建议在设定的边界内进行多次测试,确认所有位置都是安全可达的。
10.5 收集演示数据
确定了工作空间边界后,下一步是收集用于训练的演示数据。HIL-SERL 使用离线强化学习算法,能够有效利用预先收集的数据集来提高学习效率。
演示数据的作用
演示数据在 HIL-SERL 中发挥着多重作用:
1. 策略初始化
高质量的演示数据为策略网络提供了良好的初始化点,使得强化学习能够从一个相对合理的起点开始,而不是完全随机的探索。
2. 奖励分类器训练
演示数据用于训练基于视觉的成功检测器(奖励分类器),这个分类器能够自动判断任务是否成功完成,为强化学习提供必要的奖励信号。
3. 探索指导
在训练过程中,演示数据还可以作为探索的参考,帮助算法更快地发现有效的行为模式。
配置录制模式
要开始收集演示数据,需要创建或编辑配置文件,设置录制模式。以下是关键的配置步骤:
1. 设置工作模式
将配置文件中的 mode
参数设置为 "record"
,这告诉系统进入数据收集模式。
2. 指定数据集信息
设置唯一的 repo_id
用于标识数据集(例如:“username/task_name”),这有助于数据的管理和共享。
3. 确定收集数量
设置 num_episodes
参数来指定要收集的演示回合数。对于大多数任务,10-20 个高质量的演示通常就足够了。
4. 初始化视觉处理
将 crop_params_dict
初始设置为 null
,稍后会根据实际情况确定图像裁剪参数。
5. 配置硬件设置
确保 robot
、cameras
和其他硬件相关的配置正确设置。
示例配置如下:
{"mode": "record","repo_id": "username/pick_lift_cube","dataset_root": null,"task": "pick_and_lift","num_episodes": 15,"episode": 0,"push_to_hub": true
}
演示数据收集的最佳实践
质量优于数量:相比于收集大量的低质量演示,少量高质量的演示数据通常能够取得更好的效果。每个演示都应该是任务的成功完成示例。
多样性考虑:在保证质量的前提下,演示数据应该包含一定的多样性,覆盖任务的不同执行方式和起始条件。
一致性要求:所有演示应该遵循相同的任务定义和成功标准,确保奖励分类器能够学到正确的成功模式。
环境控制:在收集演示时,应该保持环境条件的相对稳定,包括光照、物体位置等因素。
10.6 配置遥操作设备
在 HIL-SERL 系统中,遥操作设备扮演着双重角色:既用于收集高质量的演示数据,也在在线训练过程中提供关键的人工干预功能。系统支持三种主要的遥操作方式:游戏手柄、键盘控制以及机器人引导臂。
HIL-SERL 采用末端执行器空间的动作表示方法,这意味着所有的遥操作指令都会被转换为末端执行器在三维空间中的位移控制(x、y、z 方向)。这种设计使得操作更加直观,因为操作者可以直接控制机器人"手部"的运动,而无需考虑复杂的关节角度变化。
为了实现末端执行器空间的控制,系统定义了专门的机器人配置类 SO100FollowerEndEffector
和对应的配置 SO100FollowerEndEffectorConfig
。以下是关键的配置参数:
class SO100FollowerEndEffectorConfig(SO100FollowerConfig):"""SO100FollowerEndEffector 机器人的配置类"""# 末端执行器工作空间边界(单位:米)end_effector_bounds: dict[str, list[float]] = field(default_factory=lambda: {"min": [-1.0, -1.0, -1.0], # x、y、z 方向的最小边界"max": [1.0, 1.0, 1.0], # x、y、z 方向的最大边界})max_gripper_pos: float = 50 # 夹爪完全打开时的位置值end_effector_step_sizes: dict[str, float] = field( # 各方向的最大单步移动距离default_factory=lambda: {"x": 0.02, # x 方向最大步长(米)"y": 0.02, # y 方向最大步长(米)"z": 0.02, # z 方向最大步长(米)})
这些参数定义了机器人末端执行器的安全工作范围和运动精度。end_effector_bounds
确保机器人不会移动到危险区域,而 end_effector_step_sizes
控制了运动的精细程度。
系统中的 Teleoperator
类负责处理不同类型的遥操作设备。您可以在 lerobot/teleoperators
目录中查看所有支持的遥操作器实现。
游戏手柄配置
游戏手柄是推荐的遥操作方式,因为它提供了直观的多轴控制和丰富的按键功能,能够同时处理机器人运动控制和训练状态管理。
配置游戏手柄需要在环境配置文件中进行以下设置:
"teleop": {"type": "gamepad","use_gripper": true
},
同时需要将控制模式设置为:"control_mode": "gamepad"
游戏手柄的按键映射经过精心设计,左摇杆控制 x-y 平面的移动,右摇杆控制 z 轴(上下)运动,触发键控制夹爪开合,其他按键用于训练状态的标注和控制。
SO101 引导臂配置
SO101 引导臂是一种更加自然的遥操作方式,特别适合需要精细操作的任务。与无齿轮的 SO100 相比,SO101 配备了减速齿轮系统,这使得操作者可以更平滑地进行示教,引导臂能够实时跟踪跟随臂的运动。
配置 SO101 引导臂的步骤如下:
"teleop": {"type": "so101_leader","port": "/dev/tty.usbmodem585A0077921", # 根据实际情况修改端口号"use_degrees": true
},
控制模式设置为:"control_mode": "leader"
使用引导臂时,任务成功/失败的标注需要通过键盘完成:按 s
键标记成功,按 esc
键标记失败。在在线训练阶段,按 space
键可以从策略控制切换到人工控制,再次按 space
键则将控制权交还给策略。
这种设计允许操作者在训练过程中无缝地进行干预,既保证了安全性,又为算法提供了宝贵的纠正信号。
10.7 演示数据录制
演示数据的质量直接影响后续训练的效果,因此录制过程需要仔细规划和执行。系统提供了完整的录制工具链,支持自动化的数据收集和管理流程。
启动录制程序的命令如下(配置文件示例可参考官方文档):
python -m lerobot.scripts.rl.gym_manipulator --config_path src/lerobot/configs/env_config_so100.json
录制过程遵循标准化的工作流程,确保数据的一致性和完整性:
- 初始化阶段:机器人自动重置到配置文件中
fixed_reset_joint_positions
参数定义的初始位置 - 任务执行:操作者通过遥操作设备控制机器人完成指定任务
- 成功标注:任务成功完成后,按下相应的"成功"按钮,系统记录奖励值为 1
- 失败处理:如果任务失败或超时,按下"失败"按钮或等待自动超时,系统记录奖励值为 0
- 重录功能:对于不满意的演示,可以按"重新录制"按钮重新执行当前回合
- 自动续录:完成一个回合后,系统自动准备下一个回合的录制
- 数据管理:所有回合录制完成后,数据集自动保存到本地,并可选择性地上传到 Hugging Face Hub
这种设计确保了数据收集的高效性和标准化,为后续的学习过程奠定了坚实基础。
10.8 数据集预处理
原始的演示数据通常包含大量与任务无关的视觉信息,这些冗余信息不仅会增加计算负担,还可能干扰学习过程。因此,数据预处理阶段的核心任务是确定最优的图像裁剪策略。
视觉强化学习算法的一个重要特点是直接从像素级输入中学习策略,这使得它们对视觉环境的变化极为敏感。环境中的无关元素——如变化的光照条件、移动的阴影、背景中的人员活动,或者工作区域外的物体——都可能成为学习过程中的干扰因素,导致策略泛化能力下降。
有效的感兴趣区域(ROI)选择应当遵循以下原则:
- 最小化原则:仅保留任务执行所必需的视觉区域
- 完整性原则:确保机器人末端执行器和所有任务相关物体都在视野范围内
- 排除性原则:主动排除可能引起干扰的背景元素和无关物体
值得注意的是,如果您已经通过先前的实验确定了合适的裁剪参数,可以直接在录制阶段的配置文件中设置 crop_params_dict
参数,从而跳过交互式裁剪步骤。
交互式裁剪参数确定
系统提供了专门的交互式工具来帮助用户确定最优的图像裁剪参数:
python -m lerobot.scripts.rl.crop_dataset_roi --repo-id username/pick_lift_cube
该工具的使用流程简单直观:
- 图像显示:工具会依次显示每个相机视角的第一帧图像
- 区域选择:用鼠标在图像上拖拽绘制矩形,框选出任务相关的工作区域
- 确认选择:按 ‘c’ 键确认当前选择的区域
- 多视角处理:重复上述步骤,为所有相机视角确定裁剪区域
- 参数生成:工具自动输出裁剪参数,并生成经过裁剪的新数据集
工具输出的参数格式示例:
Selected Rectangular Regions of Interest (top, left, height, width):
observation.images.side: [180, 207, 180, 200]
observation.images.front: [180, 250, 120, 150]
这些数值分别表示裁剪区域的起始位置(top, left)和尺寸(height, width),为后续的训练配置提供了精确的参数。
配置文件更新
获得裁剪参数后,需要将其集成到训练配置文件中:
"crop_params_dict": {"observation.images.side": [180, 207, 180, 200],"observation.images.front": [180, 250, 120, 150]
},
"resize_size": [128, 128]
图像分辨率选择建议
在视觉强化学习领域,图像分辨率的选择需要在计算效率和信息保留之间找到平衡。根据大量实验验证,大多数基于视觉的策略在方形输入格式下表现最佳,推荐的分辨率规格包括:
- 128×128 像素(默认推荐):提供良好的细节保留和合理的计算开销
- 64×64 像素:适用于 GPU 内存受限或需要高速推理的场景
建议将 resize_size
参数设置为 [128, 128]
,如果系统资源紧张,可以考虑使用 [64, 64]
。虽然其他分辨率在技术上可行,但缺乏充分的实验验证,可能影响训练效果。
10.9 奖励分类器训练
奖励分类器是 HIL-SERL 系统的智能核心组件之一,它承担着自动化奖励分配和任务成功检测的关键职责。与传统的手工设计奖励函数或依赖人工逐步反馈的方法不同,奖励分类器通过学习从视觉观察中识别任务成功状态,为强化学习算法提供了一致且自动化的奖励信号。
这种设计的优势在于:它不仅减少了人工干预的频率,还提高了奖励信号的一致性和可靠性。通过基于机器人相机输入的视觉判断,系统能够实现更加客观和标准化的任务评估。
需要说明的是,奖励分类器的训练并非必需步骤。对于初次尝试 HIL-SERL 的用户,完全可以通过游戏手柄或键盘设备进行手动的成功/失败标注来开始第一轮强化学习实验。
系统中的奖励分类器实现(位于 modeling_classifier.py
)采用了预训练视觉模型作为特征提取器,具备灵活的输出配置:既可以输出单一数值用于二元分类(成功/失败),也可以输出多个数值支持多类别的复杂任务评估。
为奖励分类器收集数据集
在训练之前,您需要收集带有标记示例的数据集。gym_manipulator.py
中的 record_dataset
函数支持收集观察、动作和奖励的数据集过程。
要收集数据集,您需要基于 HILSerlRobotEnvConfig 修改环境配置中的一些参数。
python -m lerobot.scripts.rl.gym_manipulator --config_path src/lerobot/configs/reward_classifier_train_config.json
数据收集的关键参数
mode
:将其设置为"record"
以收集数据集repo_id
:“hf_username/dataset_name”,Hub 上数据集和仓库的名称num_episodes
:要录制的回合数number_of_steps_after_success
:检测到成功(奖励=1)后要录制的额外帧数fps
:每秒录制的帧数push_to_hub
:是否将数据集推送到 Hub
number_of_steps_after_success
参数至关重要,它的核心价值在于扩充正样本的采集范围。当系统检测到成功状态时,会持续记录后续指定步数的数据,同时保持奖励标签值为1。这种机制有效解决了训练数据中正样本不足的问题,确保分类器能够获得充分的监督信号进行优化。若未启用该参数,数据集中标记为成功状态(reward=1)的样本数量将无法满足分类器的训练需求,直接影响模型性能。
数据收集的示例配置部分:
{"mode": "record","repo_id": "hf_username/dataset_name","dataset_root": "data/your_dataset","num_episodes": 20,"push_to_hub": true,"fps": 10,"number_of_steps_after_success": 15
}
奖励分类器配置
奖励分类器使用 configuration_classifier.py
进行配置。以下是关键参数:
model_name
:基础模型架构(例如,我们主要使用"helper2424/resnet10"
)model_type
:"cnn"
或"transformer"
num_cameras
:相机输入数量num_classes
:输出类别数(通常为 2,用于二元成功/失败)hidden_dim
:隐藏表示的大小dropout_rate
:正则化参数learning_rate
:优化器的学习率
训练奖励分类器的示例配置:
{"policy": {"type": "reward_classifier","model_name": "helper2424/resnet10","model_type": "cnn","num_cameras": 2,"num_classes": 2,"hidden_dim": 256,"dropout_rate": 0.1,"learning_rate": 1e-4,"device": "cuda","use_amp": true,"input_features": {"observation.images.front": {"type": "VISUAL","shape": [3, 128, 128]},"observation.images.side": {"type": "VISUAL","shape": [3, 128, 128]}}}
}
训练分类器
要训练分类器,请使用 train.py
脚本和您的配置:
python -m lerobot.scripts.train --config_path path/to/reward_classifier_train_config.json
部署和测试模型
要使用您训练的奖励分类器,请配置 HILSerlRobotEnvConfig 以使用您的模型:
env_config = HILSerlRobotEnvConfig(reward_classifier_pretrained_path="path_to_your_pretrained_trained_model",# 其他环境参数
)
或在 json 配置文件中设置参数。
{"reward_classifier_pretrained_path": "path_to_your_pretrained_model"
}
运行 gym_manipulator.py
来测试模型。
python -m lerobot.scripts.rl.gym_manipulator --config_path path/to/env_config.json
奖励分类器将根据机器人相机的视觉输入自动提供奖励。
训练奖励分类器的示例工作流程
-
创建配置文件:为奖励分类器和环境创建必要的 json 配置文件。查看示例[这里]。
-
收集数据集:
python -m lerobot.scripts.rl.gym_manipulator --config_path src/lerobot/configs/env_config.json
-
训练分类器:
python -m lerobot.scripts.train --config_path src/lerobot/configs/reward_classifier_train_config.json
-
测试分类器:
python -m lerobot.scripts.rl.gym_manipulator --config_path src/lerobot/configs/env_config.json
10.10 使用演员-学习者进行训练
LeRobot 系统使用分布式演员-学习者架构进行训练。这种架构将机器人交互与学习过程解耦,允许它们并发运行而不会相互阻塞。演员服务器处理机器人观察和动作,将交互数据发送到学习者服务器。学习者服务器执行梯度下降并定期更新演员的策略权重。您需要启动两个进程:一个学习者和一个演员。
配置设置
创建训练配置文件(示例可在[这里]获得)。训练配置基于 lerobot/configs/train.py
中的主要 TrainRLServerPipelineConfig
类。
- 配置策略设置(
type="sac"
、device
等) - 将
dataset
设置为您的裁剪数据集 - 使用裁剪参数配置环境设置
- 检查
configuration_sac.py
中与 SAC 相关的其他参数。 - 验证策略配置对于您的任务具有正确的
input_features
和output_features
。
启动学习者
首先,启动学习者服务器进程:
python -m lerobot.scripts.rl.learner --config_path src/lerobot/configs/train_config_hilserl_so100.json
学习者:
- 初始化策略网络
- 准备重放缓冲区
- 打开 gRPC 服务器与演员通信
- 处理转换并更新策略
启动演员
在单独的终端中,使用相同配置启动演员进程:
python -m lerobot.scripts.rl.actor --config_path src/lerobot/configs/train_config_hilserl_so100.json
演员:
- 通过 gRPC 连接到学习者
- 初始化环境
- 执行策略的推出以收集经验
- 将转换发送到学习者
- 接收更新的策略参数
训练流程
训练自动进行:
- 演员在环境中执行策略
- 收集Transitions并发送到学习者
- 学习者基于这些Transitions更新策略
- 更新的策略参数发送回演员
- 过程继续直到达到指定的步数限制
10.11 人在环路
-
高效学习的关键是进行人工干预,以提供纠正反馈并完成任务,从而帮助策略学习和探索。
-
要执行人工干预,您可以按游戏手柄上的右上触发按钮(或键盘上的
space
键)。这将暂停策略动作并允许您接管。 -
成功的实验是人类在开始时不得不干预,但随着策略改进而减少干预次数的实验。您可以在 wandb 仪表板中监控干预率。
显示人工干预如何随时间帮助指导策略学习的示例
-
该图显示了每个交互步骤的回合奖励图。该图显示了人工干预对策略学习的影响。
-
橙色曲线是没有任何人工干预的实验。而粉色和蓝色曲线是有人工干预的实验。
-
我们可以观察到,当存在人工干预时,策略开始达到最大奖励的步数减少了四分之一。
监控和调试
如果您在配置中将 wandb.enable
设置为 true
,您可以通过 Weights & Biases 仪表板实时监控训练进度。
人工干预指南
学习过程对干预策略非常敏感。需要几次运行才能理解如何有效干预。一些提示和建议:
-
在训练开始时允许策略探索几个回合。
-
避免长时间干预。尝试在机器人行为偏离轨道时进行干预以纠正机器人的行为。
-
一旦策略开始完成任务,即使不完美,您也可以将干预限制为简单的快速动作,如简单的抓取命令。
理想的行为是您的干预率应该在训练期间逐渐下降,如下图所示。
在抓取和举起立方体任务的训练运行期间的干预率图
10.12 关键超参数调优
一些配置值对训练稳定性和速度有不成比例的影响:
-
temperature_init
(policy.temperature_init
)— SAC 中的初始熵温度。较高的值鼓励更多探索;较低的值使策略在早期更具确定性。一个好的起点是 1e-2。我们观察到设置得太高会使人工干预无效并减慢学习速度。 -
policy_parameters_push_frequency
(policy.actor_learner_config.policy_parameters_push_frequency
)— 从学习者到演员的两次权重推送之间的间隔(以秒为单位)。默认值是 4 秒。减少到 1-2 秒以提供更新的权重(以更多网络流量为代价);仅在连接缓慢时增加,因为这会降低样本效率。 -
storage_device
(policy.storage_device
)— 学习者保存策略参数的设备。如果您有备用 GPU 内存,请将其设置为"cuda"
(而不是默认的"cpu"
)。将权重保持在 GPU 上可以消除 CPU→GPU 传输开销,并可以显著增加每秒学习者更新的数量。
结语
HIL-SERL代表了机器人学习领域的一个重要进步,它成功地将人类的智慧与机器学习的能力结合起来,为解决复杂的机器人任务提供了一个实用的框架。希望通过本章的详细介绍,读者能够快速掌握HIL-SERL的核心概念、实施方法和最佳实践。
参考文献
[1] HuggingFace LeRobot Documentation. HIL-SERL Real Robot Training Workflow Guide. https://huggingface.co/docs/lerobot/hilserl