
写这篇文章的时候刚好是lerobot系列教程的第六篇。前五篇已经搞定了环境搭建、数据采集、数据集格式整理这些准备工作都是些听起来琐碎但实际绕不过去的活。这篇把所有准备工作的终点打通把采集到的轨迹数据真正喂给模型去训练再把训练好的模型部署回真实环境里做测试。目标很明确就是让你跟着操作记录走一遍能顺利拿到一个可以动起来的策略模型。先交代一下这篇内容适合谁看。如果你已经按lerobot官方流程跑通过数据采集手上有一批自己的演示数据或者你只是想用官方推的pusht、aloha这类公开数据集快速体验一下“从零训练一个机器人操作策略”的完整闭环那这篇文章就是给你准备的。我这边全程用的是真实环境采集的数据不是仿真数据训练和测试都踩过不少坑所以实操层面的东西会写得比较细。1. 先把训练思路理清楚数据、策略、硬件三件事开始跑命令之前我建议你先花十几分钟把这三件事想明白比直接复制粘贴训练命令重要得多。lerobot这个框架的定位其实很清晰它把“从数据到策略”这一条流水线给你搭好了但每一个环节里面的选择仍然需要你自己根据实际情况做决策。1.1 数据格式更新从hdf5到mcap到底改了什么先聊数据格式。你可能在lerobot的issue区或者社区里见过这两种后缀名hdf5和mcap。早期版本的lerobot统一用hdf5存储数据集一个文件里塞了全部的图像、动作状态和元信息。hdf5格式本身没什么不好数据读取、切片都很方便但它有个硬伤不方便做流式读取。如果你采集的数据量一大比如我这边用两个摄像头各采了2万多个步长光是把hdf5文件完整加载进内存就要吃掉不少资源而且每次训练都要重复这个过程很浪费。所以lerobot在v0.3.0版本之后数据集的官方推荐格式改成了mcap。这里面有个很关键的原因mcap是机器人行业里为“流式数据”设计的容器格式它天然支持按topic分通道存储可以把摄像头图像、关节角度、时间戳这些数据分开写入读取的时候只需要按需订阅对应通道并不需要把整个文件都读进内存。实际体验下来训练时数据加载速度明显比hdf5版本顺滑尤其是在长时间采集、多摄像头场景下差距非常明显。我是直接用的新版本lerobot数据采集时就已经是mcap格式了所以训练前不需要做额外转换。但如果你跟我情况相反手上是hdf5旧数据集建议你先跑一下lerobot仓库里自带的转换脚本把数据升级成新版本格式再继续。需要提醒一句转换完之后一定要重新检查一遍数据集里的图像分辨率和状态维度别转换完闷头训练跑到一半发现数据维度对不上。1.2 策略模型怎么选ACT、Diffusion Policy和TDMPC的差异lerobot框架里内置了多种策略模型同一个数据集你可以用ACT训练也可以用Diffusion Policy训练甚至在部分版本里还能跑TDMPC。不少新手上来就挑最复杂的模型这是误区。我强烈建议你先根据自己的任务类型来选而不是根据模型热度来选。先说说ACT。ACTAction Chunking with Transformers的核心思想是让模型一次性预测未来一段时间内的动作序列而不是一个时间点一个时间点地预测。这种“动作分块”的机制天然适合那些需要连续、平滑操作的任务比如用机械臂夹东西、倒水、叠衣服。ACT在lerobot里也是文档最全、社区讨论最多的模型遇到问题最容易搜到解决方案。再说Diffusion Policy。这个名字听着很玄乎本质上是把动作生成当成一个去噪过程模型在一个随机噪声动作序列上迭代去噪逐步收敛到目标动作。它的优势是表达能力强能拟合非常复杂的多模态动作分布比如同一个物体可以从不同角度去抓它都能学到。代价就是训练和推理速度都比ACT慢你需要评估自己硬件是否扛得住。TDMPC这一类模型融合了模型预测控制的思想它不仅要学策略还要学一个世界模型来预测未来状态。听起来很厉害但落地复杂度也高不太适合作为第一个跑通的模型。我这边最终选的是ACT原因很直接我的任务是真实机械臂的搬运动作演示动作轨迹相对稳定没有特别复杂的多模态需求而且ACT的收敛速度更快真机部署时推理延迟也更低。如果你第一次接触lerobot想快速看到训练效果ACT通常是最稳的选择。1.3 显卡资源有限训练配置如何取舍聊一下硬件。lerobot训练并不像大语言模型那样动辄几十张卡但也不至于一张老显卡就能轻松跑完。以我的实际经验来看单张显存12GB以上的NVIDIA显卡是起步线。太小的显存倒也不是完全不能跑只是要把batch size压得非常小训练时间会拉得很长而且容易出现显存溢出的问题。我手头是单张RTX 4060 Ti 16GB训练ACT模型图像分辨率从原来的640x480做了缩放batch size设置在32左右显存占用已经接近上限。如果你的显存只有8GB建议把batch size调成8到16同时将图像分辨率进一步缩小到224x224或更低牺牲一点精度换训练可行性。还有一点要注意lerobot训练默认会使用CUDA但不同的PyTorch版本对CUDA版本有要求。我记得第一次配置环境时因为PyTorch的CUDA版本和显卡驱动不匹配训练脚本一开始就报“CUDA unavailable”这个排查过程非常折磨。建议动手之前先确认一下自己GPU的CUDA compute capability和PyTorch官方要求的CUDA版本是否匹配。2. 模型训练实操记录思路理顺了可以开始跑训练了。这一部分我把自己的完整操作流程和遇到的细节记录在这里包括命令行参数怎么填、checkpoint怎么存、训练过程中应该盯哪些指标。建议你尽量照着做一遍出问题的时候再回头看第4部分的排查列表。2.1 启动训练之前的环境检查别急着运行train.py先花两分钟做一次环境体检。我每次训练前都会跑这几个检查确认环境没问题再动手python -c import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))这一步能看到PyTorch版本、CUDA是否可用、显卡型号。如果CUDA显示False多半是PyTorch的CUDA版本和驱动不匹配或者安装的是CPU版PyTorch这个必须先解决。接下来检查lerobot装的是不是最新版本最好同步一下。我这次用的是v0.3.x的代码库如果你从pip直接装的话版本号可能对不上功能和命令行参数会有细微差别pip show lerobot再确认一下数据集路径。lerobot的数据集有固定的目录结构包括metadata、videos、episodes这些子目录。如果你是自己采的数据建议先跑一下lerobot自带的脚本做可视化回放确认每条episode的数据都完整没有明显跳帧或者传感器异常。最后检查一下数据集配置文件里的图像分辨率、状态维度跟模型配置是否一致。这一步非常关键我的经验是很多训练中途崩溃都是因为数据维度和模型输入维度对不上导致的。2.2 训练命令与关键参数说明lerobot的训练入口是一个train.py脚本通过命令行传入各种配置参数。我把自己的训练命令简化一下加上注释说明python lerobot/scripts/train.py \ --policy.typeact \ --dataset.repo_idmy_robot_dataset \ --dataset.root./data \ --output_dir./outputs/train/act_test \ --train.batch_size32 \ --train.num_steps50000 \ --train.log_freq100 \ --train.save_freq5000 \ --train.eval_freq2000 \ --policy.backboneresnet18 \ --policy.dim_model512 \ --policy.n_heads8 \ --policy.n_enc_layers4 \ --policy.n_dec_layers1 \ --policy.chunk_size100逐一解释一下我这些参数是怎么定的。--policy.typeact指定了用ACT模型--dataset.repo_id是你数据集在Hugging Face上的仓库名如果没有上传到HF也可以用本地路径加--dataset.root来指定。这里新手最容易困惑的是repo_id和root的区别简单说repo_id是给远程数据集用的标识root是本地数据集所在根目录。训练步数我设的是5万步。这个数值不是拍脑袋定的而是根据我的数据量粗略估算的2万步长的数据配合batch size 32一个epoch大约需要600多次迭代5万步大约是80个epoch。这不是严格意义上的标准公式但实际操作中够用了。如果你的数据量大可以适当减少步数数据量小就增加避免过早过拟合。--train.save_freq5000表示每5000步保存一次checkpoint。这个频率不是越高越好因为每个checkpoint都包含完整的模型权重和优化器状态占用空间不小。我踩过一次坑把save_freq设成1000结果训练到一半磁盘空间直接爆掉所有数据作废重头再跑。建议至少留出20GB以上的硬盘余量再开始训练。2.3 checkpoint机制训练中到底存了什么训练过程中output_dir下会不断生成checkpoint目录例如checkpoint-005000、checkpoint-010000这种命名方式。每个checkpoint目录里通常包含这几个文件model.safetensors是模型权重optimizer.safetensors是优化器状态config.json是训练配置training_state.json记录了当前训练步数和各项指标还有一个scaler文件用来保存混合精度缩放状态。这些文件各有用处其中model.safetensors是测试时必须要加载的权重文件optimizer.safetensors则是用来恢复训练断点的。如果你想中断训练再接着跑用--resumetrue就能从最近的checkpoint继续但如果只保留了model权重而丢了optimizer状态恢复训练就会有问题。我建议训练期间不要把checkpoint的保留间隔设得太密。lerobot默认只会保留最近几个checkpoint这个设计很合理因为早期checkpoint的模型权重基本没有使用价值。想让模型效果真实变好关键看loss曲线的收敛情况而不是checkpoint的数量。2.4 怎么判断训练收敛了训练过程中在终端里能看到实时打印的loss值同时训练完成之后还可以从output_dir下的日志文件里读取完整的指标变化。我比较建议直接看TensorBoard曲线启动方式很简单tensorboard --logdir./outputs/train/act_test然后浏览器打开TensorBoard地址重点看三个曲线total_loss、action_loss和grad_norm。total_loss是整体损失这个值应该随着训练步数增加稳步下降然后趋于平缓。action_loss是动作预测的损失这个值对最终策略质量的影响最大。grad_norm是梯度范数如果这个值出现了异常大的波动说明训练状态可能不稳定需要适当调小learning rate。还有一个细节训练过程中保存的eval指标也很值得关注。lerobot在eval频率处会对验证集数据做一次推理评估计算模型在未见过的数据上的动作误差。这个误差比训练集上的loss更有参考价值因为模型有可能在训练数据上过拟合loss很低但实际测试一塌糊涂。我这次训练到3万步左右total_loss就已经趋于平稳曲线斜率明显变缓。到5万步结束动作误差降到相对可接受的范围。如果你训练到后期发现loss还在明显下降不妨再多跑一段时间不要机械地按预设步数停止。3. 模型测试与效果评估训练完成challenge checkpoint已经有了接下来就是把模型测试跑起来看它在真实环境里到底能不能完成任务。这一步的坑比训练更多因为训练数据是静止的测试环境是动态的各种意外情况都会冒出来。3.1 离线评估与在线测试的区别先讲清楚两个概念离线评估和在线测试。离线评估指的是用验证集数据来做推理看模型在相同输入条件下预测的动作和真实动作之间的误差。这个过程不涉及机械臂运动纯粹是算法层面的评估速度快方便排查模型本身的问题。在线测试则是把模型加载到真实机器人上输入实时摄像头画面模型输出动作指令机械臂实际执行。这个过程中会有传感器噪声、执行延迟、物理碰撞一系列问题离线评估的误差指标在这里只能作为参考。我建议你两条路径都走一遍。先用离线评估快速筛掉明显有问题的checkpoint避免频繁把有问题的模型搬到机械臂上调试。等离线误差降到合理范围再上真机测试。3.2 加载checkpoint做rollout测试要加载模型测试第一个问题是我怎么知道训练集上最好的checkpoint是哪一个。我会看训练日志里eval指标的变化而不是盲目加载最后一个checkpoint。有时候模型在训练后期虽然loss不高但因为过拟合验证集误差反而会反弹。如果遇到这种情况我建议回到验证误差最低的那个checkpoint往往效果更好。测试时lerobot提供了一套评估脚本可以直接加载训练好的checkpoint在数据集上做评估并且在仿真环境里做rollout测试。如果你是像我一样的真实机器人场景那这一步会更接近部署通常是自己写一个推理脚本把模型加载起来订阅相机话题输出动作到机械臂控制器。我自己测试时用的大致逻辑是这样python eval_checkpoint.py \ --checkpoint./outputs/train/act_test/checkpoint-050000 \ --dataset.repo_idmy_robot_dataset \ --dataset.root./data这里的核心是确认checkpoint路径正确。如果加载报错很大概率是config.json里的配置和当前代码版本不一致比如backbone类型、图像尺寸、动作维度这些信息对不上。真机测试之前我还习惯先做一步“数据回放测试”检查机械臂能否按数据里的动作轨迹运行。这能提前暴露执行层面的问题比如关节限位、速度设置不合理等避免直接加载模型时把机械臂跑出问题。3.3 效果不好时的排查思路如果你的模型测试效果不理想不要急着调超参数先按下面这个顺序排查效率最高。第一步检查输入数据质量。训练时用的演示数据和测试时相机画面亮度、角度是否一致。如果测试画面稍微偏暗或者摄像头位置变了模型性能可能立刻下降这就是典型的训练数据与测试数据分布不一致问题。与其调模型不如采集一批更贴近真实环境的演示数据通过数据增强处理色彩、亮度的变化效果会更明显。第二步看动作平滑性。如果机械臂执行动作时抖动严重多半是动作预测噪声太大。ACT模型输出的是动作序列如果相邻时间步的动作预测不稳定执行起来就会抖动。可以适当调大chunk_size让模型预测更长的动作序列并且考虑在推理时做动作平滑比如取前后几个预测的平均值。第三步调整推理频率。机器人控制频率和模型推理频率不匹配也容易导致动作不连贯。机械臂的控制频率一般是几十赫兹但模型单次推理可能只有十几赫兹这种频率差会在执行时放大误差。解决思路是把模型推理放到单独的线程里动作指令通过队列传递给控制循环保证控制频率稳定。4. 常见问题与避坑心得最后一部分把我在训练和测试过程中踩过的坑集中整理一下。这些问题不亲身经历一遍很难意识到列出来帮你省点时间。4.1 训练中容易翻车的几个坑第一个坑是显存溢出。训练刚开始几秒钟就报CUDA out of memory。这个问题多半是batch size或图像分辨率设置过大可以逐步调小batch size也可以修改数据集的图像预处理参数把分辨率降到合适范围。第二个坑是数据集读取速度慢。训练时每个step都要从磁盘读一批数据如果数据加载成为瓶颈GPU利用率会非常低训练速度不升反降。mcap格式本身已经优化了读取性能但如果你把数据集放在机械硬盘上IO依然是瓶颈。建议把数据集放到SSD上有条件的话放到内存盘里训练速度提升非常明显。第三个坑是精度太低。这也算是我比较常用的一种手段。在lerobot训练脚本里设置混合精度训练能够减少显存占用同时加快训练速度而且大部分情况下精度损失可以忽略。实际操作里用bf16还是fp16也很有讲究NVIDIA Ampere架构以上的显卡用bf16更稳遇到loss突然变成nan的概率更小。第四个坑是torch的版本冲突。lerobot依赖的PyTorch版本如果过新或过旧部分内置模块可能无法正常工作。我之前遇到过深度学习框架版本和某个依赖包冲突导致模型初始化报错折腾了半天最后把PyTorch回退到官方建议版本解决。建议严格按照lerobot官方文档的依赖列表来安装别自己随便升版本。4.2 别把lerobot训练和llama factory微调搞混这段时间社区里经常有人问lerobot训练和llama factory这种大模型微调工具是不是可以互相替代。这里直接说明白两者完全是两个赛道不存在谁替代谁的问题。llama factory是一站式大语言模型微调平台处理的是文本、token训练的是语言模型目标是让模型更好地生成文本、回答问题。而lerobot是机器人策略学习框架处理的是图像、状态、动作序列训练的是策略模型目标是让机器人学会执行物理动作。两者的数据格式、模型架构、训练目标完全不同千万不要把llama factory的Lora配置套到lerobot上也不要用lerobot的数据处理流程去做语言模型微调。不过这两个工具倒确实有个共同点都追求开箱即用把复杂的训练流程封装成简单的命令行操作。这个思路对新人很友好但也就意味着你依然需要理解背后的数据流和训练逻辑否则遇到问题根本无从下手。4.3 新手最容易忽略的细节最后说几个新手最容易忽略的小细节都是我自己用代价换来的经验。第一训练数据不要全用同一个场景、同一个角度采集。数据多样性直接决定了模型在新场景下的泛化能力。我一开始偷懒采集的演示数据都是固定角度、固定光照结果模型一换位置就失灵重新采集加上适当的数据增强才好一些。第二别忽略训练过程中的梯度范数。很多新手只看loss不关心grad_norm。实际上grad_norm异常是训练崩溃的前兆。当grad_norm突然跳到正常值的数十倍甚至上百倍时训练很大概率马上要出nan了建议提前中断调低学习率。第三真机测试前一定要做好安全措施。模型在测试初期是完全不可控的可能出现大幅度关节动作、夹爪突然闭合这些状况。我建议设置好机械臂的关节速度上限和力矩限制同时准备好急停开关别让模型在无保护状态下直接运行。第四如果checkpoint莫名加载失败优先检查配置文件里是否包含了当前模型结构不支持的字段。比如你训练时用了某个版本的lerobot测试时换了另一个版本config.json里的模型参数可能发生了变化加载就会失败。保证训练和测试环境版本一致这是基础原则。根据我个人经验lerobot从数据采集到模型训练再到真机部署整个流程里最容易出问题的并不是训练本身而是训练前后那一圈环境准备和数据校验工作。模型训练是一个相对线性的过程只要数据、配置、环境都对了加速迭代、调参看曲线整个流程就会顺畅很多。建议第一次操作时把每一步都记录下来尤其是checkpoint路径、数据集配置这些测试阶段会反复用到。如果你用的是自己的机器人平台差异较大前期多花点时间做好数据质量校验后面训练和测试都会省心很多。