1. 从零开始理解LeRobot与ACT如果你刚开始接触机器人模仿学习面对LeRobot这个开源框架和ACT这个模型可能会有点懵。我刚开始的时候也一样感觉文档里每个字都认识但连起来就不知道从哪下手。简单来说LeRobot是Hugging Face推出的一个机器人学习框架它把训练机器人策略Policy这件事变得像训练一个普通的机器学习模型一样“标准化”了。你不用再自己从零搭建数据管道、训练循环和部署环境LeRobot提供了一套完整的工具链。而ACT全称Action Chunking with Transformers是LeRobot官方最推荐新手入门的策略模型。为什么是它文档里那句“fast training time, low computational requirements, and strong performance”不是客套话。我实测下来在单张消费级GPU比如RTX 3090/4090上用几十条示教数据几小时就能训练出一个能完成精细操作任务的模型这对于个人研究者或者小团队来说门槛降低太多了。很多更强大的模型比如后面的VLA或者π₀系列需要更多的数据和算力ACT就像一个“快速原型工具”让你能最快地验证想法、跑通流程。它的核心思想是“动作分块预测”。传统的模仿学习模型可能一次只预测下一个瞬间的动作而ACT利用Transformer架构一次性预测未来一小段连续的动作序列一个“块”。这样做有两个巨大好处第一输出的动作在时间上是连贯平滑的减少了机器人执行时的抖动第二它让模型具备了“前瞻性”在做出当前动作时已经考虑了接下来几步要达到的状态这对于需要连续接触的精细操作比如插拔、装配至关重要。输入是多个视角的摄像头图像和机器人当前的关节位置输出就是未来k步的动作序列思路非常清晰。2. 训练ACT前的环境与数据准备在兴奋地敲下lerobot-train命令之前有两件事必须搞定环境和数据。环境是地基数据是砖瓦缺一不可。2.1 搭建稳定可靠的训练环境LeRobot的安装其实不复杂但有几个细节容易踩坑。官方推荐用Conda管理环境这是非常正确的选择能最大程度避免包版本冲突。# 创建并激活一个专门的conda环境 conda create -n lerobot python3.10 conda activate lerobot # 安装PyTorch请根据你的CUDA版本去官网选择对应命令 # 例如对于CUDA 11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装LeRobot核心包 pip install lerobot这里有个关键点务必确认你的PyTorch CUDA版本与系统安装的CUDA驱动版本兼容。你可以通过nvidia-smi查看驱动支持的CUDA最高版本然后安装不高于此版本的PyTorch。我遇到过因为版本不匹配训练时GPU利用率极低甚至报错的问题。安装完成后强烈建议运行一个简单的导入测试和查看版本python -c “import lerobot; print(lerobot.__version__)”如果顺利说明核心环境没问题。接下来你需要一个地方来存放你的训练产出比如模型和日志。LeRobot深度集成了Hugging Face Hub和Weights Biases (WandB)。我建议你都用上。Hugging Face Hub用于存储数据集和训练好的模型。你需要去 huggingface.co 注册一个账号并在本地用huggingface-cli login登录。这样你的数据集和模型都能有一个永久的、可分享的线上地址。WandB用于可视化训练过程。它能实时绘制损失曲线、评估指标甚至记录预测的动作与真实动作的对比对于调试超参数和监控训练状态不可或缺。同样需要去 wandb.ai 注册并获取API Key。2.2 准备与处理你的示教数据集数据是模仿学习的灵魂。对于ACT你需要的是一个由“状态-动作”对组成的时序数据集。状态State通常包括多相机RGB图像和机器人的关节角度joint positions动作Action则是机器人执行器如关节扭矩或末端执行器位姿的命令。LeRobot支持多种数据格式但最省心的是使用其标准的LeRobotDataset格式。你可以将自己的数据比如通过机械臂示教器或VR设备录制转换成这种格式也可以直接使用Hub上已有的数据集。如果你要从零创建数据集需要关注以下几点数据对齐图像、关节状态、动作命令必须在时间戳上严格对齐。哪怕几十毫秒的错位都可能导致模型学到错误关联。在录制时最好使用统一的时钟源或高精度的硬件同步触发。相机配置ACT支持多视角输入。常见的配置包括一个“眼在手”wrist相机和一个“第三人称”front/top相机。在数据集的元信息info.json或dataset_config.yaml中必须明确定义每个相机的名称、参数和对应的数据键。例如cameras: wrist_camera: name: “Wrist Camera” type: “opencv” front_camera: name: “Front Camera” type: “opencv”动作表示你的动作空间是什么是关节角度position、关节速度velocity、关节扭矩torque还是末端执行器的位姿pose这需要在数据集和策略配置中保持一致。ACT的默认输出通常是相对关节位置增量delta position这是一种稳定且易于学习的表示。数据量正如文档所说ACT是数据高效的。对于一项简单的拾放pick-and-place任务50-100条高质量的成功示教轨迹episode往往就足够了。每条轨迹长度在几百到上千个时间步step。质量远大于数量一条干净、流畅、目标明确的示教胜过十条杂乱、抖动、包含多余动作的示教。准备好数据后使用LeRobot提供的工具如lerobot-upload-dataset将其上传到你的Hugging Face Hub仓库。这一步会帮你完成格式校验、视频编码如果使用流式加载等工作。3. ACT训练命令的深度拆解与调参实战当环境和数据都就绪后就可以开始训练了。官方给出的命令是一个很好的起点但每个参数背后都有门道。lerobot-train \ --dataset.repo_id${HF_USER}/your_dataset \ # 你的数据集在HF Hub上的ID --policy.typeact \ # 指定使用ACT策略 --output_diroutputs/train/act_your_dataset \ # 本地输出目录 --job_nameact_your_dataset \ # 任务名称用于WandB日志 --policy.devicecuda \ # 使用GPU训练 --wandb.enabletrue \ # 启用WandB日志 --policy.repo_id${HF_USER}/act_policy # 训练好的模型将上传到这个HF仓库让我们深入几个关键参数和调优思路3.1 核心训练参数解析--training.n_steps训练的总步数step。这是最重要的参数之一。对于约100条轨迹、总步数几十万的数据集10万到20万步通常是一个合理的起点。你可以通过WandB观察训练损失和验证损失曲线当损失曲线趋于平缓、不再显著下降时就说明模型已经收敛可以提前停止或结束训练。盲目增加步数只会导致过拟合。--training.batch_size批次大小。文档建议从8开始。这个值受限于你的GPU显存。在RTX 409024GB上处理640x480的双视角图像batch_size8通常是安全的。如果出现CUDA out of memory错误可以逐步降低到4或2。增大batch_size通常能使训练更稳定、梯度估计更准确但会消耗更多显存。你也可以尝试使用梯度累积gradient accumulation来模拟更大的batch size但LeRobot的命令行接口可能没有直接暴露这个参数需要修改训练脚本。--policy.act.*ACT模型本身的超参数。这些通常藏在policy配置组里。例如--policy.act.action_horizon动作预测的步长即“块”的大小k。默认值可能是8或16。对于动作频率高、需要快速反应的任务如打乒乓球可以设小一点对于缓慢、精细的操作如穿针可以设大一点。--policy.act.latent_dim潜在风格变量z的维度。这个变量让模型能学习示教数据中的不同“风格”如快慢、用力大小。通常不需要修改保持默认即可。--policy.act.backbone视觉主干网络。默认是resnet18。如果你的任务对视觉特征要求极高且计算资源充足可以尝试换成resnet34或resnet50但这会显著增加参数量和训练时间。3.2 学习率与优化器策略学习率Learning Rate是训练神经网络的“油门”和“刹车”。LeRobot的ACT训练默认应该使用了AdamW优化器和一个适当的学习率。如何判断学习率是否合适观察WandB上的训练损失曲线。如果损失值剧烈震荡、不下降甚至变成NaN说明学习率可能太大了。如果损失值下降得非常缓慢说明学习率可能太小了。调整方法你可以通过--training.learning_rate参数来调整。一个常见的策略是使用“热身Warm-up”和“衰减Decay”。例如在前1000步线性地将学习率从0增加到设定值然后在训练过程中按余弦规律衰减到0。LeRobot可能内置了这样的调度器你需要查阅文档或源码来确认并调整参数。我的经验对于ACT初始学习率在1e-4到5e-4之间通常效果不错。我一般会先跑一个短时间的训练比如5000步观察损失曲线的初始下降趋势如果正常再放开跑完整的训练。3.3 数据加载与增强训练速度的瓶颈有时不在前向传播和反向传播而在数据加载。--dataloader.num_workers数据加载的子进程数。如果你的CPU核心数多可以将其设置为CPU核心数或略少一些比如8或16这能显著加快数据准备速度让GPU不再“饥饿”等待。--dataset.streaming是否使用流式加载。如果你的数据集很大无法全部放入内存务必启用此选项。它会动态地从硬盘或网络加载数据。数据增强Data Augmentation对于视觉输入适度的数据增强能提升模型的泛化能力比如随机的颜色抖动color jitter、小幅度的平移裁剪translation crop。LeRobot可能提供了相关的配置选项。但要注意对于机器人任务某些增强要谨慎使用例如大幅度的旋转或翻转可能会改变物体与机器人末端之间的空间关系导致学习到错误的几何对应。4. 训练过程中的监控、调试与问题排查训练启动后并不意味着可以高枕无忧。你需要像照顾一个婴儿一样持续监控它的“健康状况”。4.1 利用WandB进行全方位监控WandB仪表盘是你的作战指挥中心。你需要重点关注以下几个面板损失曲线Loss这是最核心的指标。你会看到train/loss和eval/loss。理想情况下两者都应该稳步下降并且eval/loss最终略高于train/loss但差距不大。如果train/loss持续下降而eval/loss开始上升这是典型的过拟合信号可能需要增加数据、使用更强的正则化如Dropout或提前停止。动作预测可视化一些高级的集成可能会将模型预测的动作与数据集中真实的动作进行对比绘图。检查预测的动作序列是否平滑是否与真实动作在趋势上一致幅度可以不同因为模型学习的是策略而非完全复现。学习率与梯度观察学习率调度器的变化是否符合预期。查看梯度范数gradient norm如果梯度爆炸值变得极大可能需要降低学习率或使用梯度裁剪gradient clipping。系统资源监控GPU利用率、显存占用、CPU和内存使用率。确保GPU利用率保持在较高水平如80%以上否则可能是数据加载或预处理成了瓶颈。4.2 常见训练问题与解决方案即使按照指南操作你也可能会遇到一些“坑”。以下是我和社区同行们遇到过的一些典型问题问题一训练损失Loss居高不下或波动剧烈。可能原因1数据问题。这是最常见的原因。检查你的数据集中是否存在无效值NaN或Inf或者动作量纲是否异常大例如关节角度以弧度表示但值达到了几百。对数据进行标准化Normalization通常是必要的步骤LeRobot的Processor管道应该会自动处理。可能原因2学习率过大。尝试将学习率降低一个数量级例如从1e-4降到1e-5重新开始训练。可能原因3模型架构与任务不匹配。虽然ACT是通用模型但对于某些极其复杂的任务其容量80M参数可能不足。可以尝试增加Transformer的层数或隐藏层维度如果配置允许或者考虑使用更大的模型如SmolVLA。排查步骤首先用一个极小的学习率如1e-6跑几十步看损失是否开始缓慢下降。如果是说明模型和数据基本能对上只是学习率不合适。如果损失依然不动那就要深度怀疑数据问题了。问题二训练后期验证损失Eval Loss开始上升。可能原因过拟合。模型过度记忆了训练数据中的噪声和特定细节而失去了泛化能力。解决方案增加数据收集更多样化的示教数据。数据增强对图像输入应用更丰富但合理的增强。正则化在ACT的Transformer层中增加Dropout率通过--policy.act.dropout_rate参数。早停Early Stopping定期在验证集上评估模型性能当验证损失连续多个epoch不再下降时就停止训练并回滚到验证集上性能最好的那个模型 checkpoint。问题三GPU显存溢出CUDA Out Of Memory。可能原因batch_size太大、图像分辨率太高、模型太大或使用了过长的动作预测序列action_horizon。解决方案首先降低batch_size。如果任务允许可以考虑降低输入图像的分辨率例如从640x480降到320x240。这需要在数据预处理阶段完成。检查是否同时开启了多个实验占用了显存。使用torch.cuda.empty_cache()清理缓存但治标不治本。5. 模型评估与真实机器人部署测试训练完成后你会得到一个模型checkpoint。评估它是否有效分两步离线评估和在线部署。5.1 使用lerobot-record进行离线评估这是部署到真机前最关键的一步。lerobot-record命令会在仿真环境如果配置了或直接连接机器人运行你的策略并记录执行过程生成一个新的评估数据集。lerobot-record \ --robot.typeso100_follower \ # 机器人类型需与你的硬件匹配 --robot.port/dev/ttyACM0 \ # 机器人端口 --policy.path${HF_USER}/act_policy \ # 你训练好的策略路径 --dataset.repo_id${HF_USER}/eval_act_your_dataset \ # 评估数据存放位置 --dataset.num_episodes10 \ # 评估10个回合 --dataset.single_task“Pick up the red block and place it in the box” # 任务描述评估时要注意什么安全第一在真机上运行前务必在仿真环境中充分测试。确保机器人的工作空间内没有障碍物并且你随时可以按下急停按钮。观察与记录不要只看最终的成功/失败。通过记录的视频和状态数据仔细观察机器人的每一步动作它是否在接近目标时显得犹豫末端执行器的轨迹是否平滑有没有出现剧烈的抖动或不可预测的突变定量指标除了目测成功率可以计算一些定量指标如任务完成时间、末端执行器轨迹与示教轨迹的偏差、动作的平滑度加速度的方差等。这些可以帮助你更客观地比较不同模型或不同超参数的效果。5.2 从评估结果中发现问题并迭代如果评估结果不理想不要气馁这是调试和改进的黄金机会。问题机器人动作僵硬、抖动。分析可能是动作预测序列action_horizon太短导致模型缺乏“远见”只能做短视的决策。也可能是训练数据中的动作本身就带有抖动。行动尝试增大action_horizon。同时检查你的原始示教数据确保示教者操作是平滑流畅的。可以在数据预处理阶段加入一个低通滤波器来平滑动作数据。问题机器人经常在同一个地方失败例如抓取时总是差一点。分析这很可能意味着模型对于那个特定的状态图像和关节位置组合感知不准或决策错误。可能是那个状态的训练数据不足或质量不高。行动这是一种“针对性数据增强”。你可以专门在那个失败的状态附近人工补充几条成功的示教数据重新加入到数据集中进行微调fine-tuning。这就是模仿学习中的“DAgger”或“迭代式数据收集”思想。问题仿真中表现良好但转移到真机后失败。分析经典的“仿真到现实”Sim2Real鸿沟。可能是仿真中的物理参数摩擦力、质量、关节阻尼与真实世界不符也可能是仿真中的视觉渲染与真实相机图像存在域差异Domain Gap。行动域随机化Domain Randomization在仿真训练时随机化纹理、光照、物体质量、摩擦系数等参数让模型学会在多变的环境中工作。使用真实数据微调在真机上收集少量成功数据对仿真中训练好的模型进行微调。改进感知如果问题主要在视觉可以考虑使用在真实图像上预训练的视觉主干网络Backbone或者使用像ResNet这类经过ImageNet预训练的模型它们对真实世界的特征提取能力更强。训练一个优秀的ACT模型很少能一蹴而就。它往往是一个“训练-评估-分析-改进数据/参数-再训练”的迭代循环。每一次循环你都会对任务、对模型、对机器人有更深的理解。这个过程本身就是机器人学习中最有价值的部分。当你看到自己训练的模型让机械臂流畅地完成一个复杂操作时那种成就感是无与伦比的。