LeRobot documentation

MolmoAct2 策略

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

MolmoAct2 策略

MolmoAct2 是 MolmoAct2 的 LeRobot 策略实现,已移植到 LeRobot 的训练、评估、检查点和数据集接口中,以便更轻松地与 LeRobot 数据集配合使用。

此实现目前支持常规 MolmoAct2 模型的训练和评估。支持自适应深度推理的 MolmoAct2-Think 尚未包含在此 LeRobot 策略中。

有关论文中报告的实验所使用的原始 MolmoAct2 训练代码,请参阅 allenai/molmoact2。

安装要求

使用 MolmoAct2 可选依赖项安装 LeRobot:

uv sync --locked --extra molmoact2

要运行本仓库中的模型,您需要一块 NVIDIA GPU。当前的混合精度路径将完整的动作专家(action expert)存储在 fp32 中,并将大型 VLM 矩阵存储在 bf16 中。policy.compile_model=true 可选择性地编译动作专家块,同时保持 VLM、视觉塔(vision tower)、连接器(connector)和策略包装器(policy wrapper)处于 eager 模式。该边界已通过相同起始输出、梯度和优化器更新的一致性检查;而编译 bf16 VLM 路径则未通过。

通过 accelerate 进行多 GPU 训练可以提高吞吐量和全局批处理大小。该路径已在双节点、八 GPU 的 GB200 环境中经过验证,但此 LeRobot 移植版本并未暴露原始 MolmoAct2 的 fsdp_devices 模型并行训练路径。在单 GPU GB200 上,使用两种真实提示宽度进行的回放测试生成了一个编译后的动作图,且无图断裂,峰值内存与即时执行相同,均为 55.15 GiB,并实现了适度的稳态加速。请将这些结果视为实现层面的检查,而非可移植的吞吐量或预计完成时间(ETA)声明。

该仓库已在 Ubuntu 22.04 上完成测试。

用法

要在 LeRobot 训练配置中使用 MolmoAct2,请设置:

--policy.type=molmoact2

训练

MolmoAct2 可以从发布的 MolmoAct2 Hugging Face 检查点格式,或从已由 LeRobot 保存的检查点进行微调。这两种方式都使用相同的 LeRobot 训练循环、数据集转换、检查点保存和日志记录。区别仅在于如何加载初始策略权重和处理器状态。

LeRobot 默认禁用数据集图像增强。请在 MolmoAct2 训练命令中保留 --dataset.image_transforms.enable=true。原始的 MolmoAct2 变换配方并非 LeRobot 的通用变换默认值,因此第一条命令还显式固定了其 95% 裁剪、5 度旋转和颜色抖动。原始配方还会以 0.2 的概率应用高斯模糊;LeRobot 的通用变换子集配置无法在不偶尔丢弃三个必需变换之一的情况下表达该可选的第四个变换。

使用原始 MolmoAct2 权重进行训练

从已发布的 MolmoAct2 检查点开始时,请使用 policy.checkpoint_path,例如 allenai/MolmoAct2 或 allenai/MolmoAct2-LIBERO。LeRobot 将加载原始的 HF 模型文件,然后根据数据集元数据和下方的策略选项构建其自身的策略处理器。

以下命令展示了从发布的基线检查点对合并后的 LIBERO 数据集进行全量微调。它使用 bf16 模型加载、8 个 flow 时间步、官方 LIBERO 分位数统计、图像增强,以及 LeRobot 的检查点/日志路径。请勿用 lerobot/libero 的近似元数据分位数替代发布的 norm_stats.json;它们的 q01/q99 值并不相同。

accelerate launch \
  --num_processes=8 \
  --mixed_precision=bf16 \
  -m lerobot.scripts.lerobot_train \
  --dataset.repo_id=lerobot/libero \
  --dataset.root=/path/to/lerobot/libero \
  --dataset.video_backend=pyav \
  --dataset.image_transforms.enable=true \
  --dataset.image_transforms.max_num_transforms=3 \
  --dataset.image_transforms.random_order=false \
  --dataset.image_transforms.tfs='{"crop":{"weight":1.0,"type":"RandomResizedCrop","kwargs":{"size":[256,256],"scale":[0.9025,0.9025],"ratio":[1.0,1.0]}},"rotation":{"weight":1.0,"type":"RandomRotation","kwargs":{"degrees":[-5.0,5.0],"interpolation":2}},"color":{"weight":1.0,"type":"ColorJitter","kwargs":{"brightness":0.2,"contrast":[0.8,1.2],"saturation":[0.8,1.2],"hue":0.05}}}' \
  --policy.type=molmoact2 \
  --policy.checkpoint_path=allenai/MolmoAct2 \
  --policy.device=cuda \
  --policy.action_mode=continuous \
  --policy.norm_tag=libero \
  --policy.norm_stats_path=/path/to/MolmoAct2-LIBERO/norm_stats.json \
  --policy.train_mode_vlm=fft \
  --policy.chunk_size=10 \
  --policy.n_action_steps=10 \
  --policy.setup_type="single franka robotic arm in libero" \
  --policy.control_mode="delta end-effector pose" \
  --policy.image_keys='["observation.images.image","observation.images.image2"]' \
  --policy.dtype=bfloat16 \
  --policy.num_flow_timesteps=8 \
  --policy.gradient_checkpointing=true \
  --policy.compile_model=true \
  --policy.freeze_embedding=true \
  --policy.normalize_gripper=false \
  --policy.enable_knowledge_insulation=false \
  --policy.push_to_hub=false \
  --trackio.enable=true \
  --trackio.project=<trackio_project> \
  --job_name=<job_name> \
  --output_dir=outputs/<job_name> \
  --steps=10000 \
  --batch_size=32 \
  --num_workers=4 \
  --log_freq=20 \
  --env_eval_freq=-1 \
  --save_checkpoint=true \
  --save_freq=2000

使用 LeRobot MolmoAct2 权重进行训练

从由 LeRobot 保存的 MolmoAct2 检查点开始训练时,请使用 policy.path,该检查点可以来自本地的 pretrained_model 目录,也可以来自 Hub。这将恢复已保存的 LeRobot 策略配置、模型权重、处理器以及归一化统计信息。您仍然可以覆盖训练时的选项,例如 batch_size、steps 或 policy.action_mode。检查点的加载是严格的,并且会保留已保存的 FFT 或 LoRA 拓扑结构,因此在使用 policy.path 时,请勿覆盖 policy.train_mode_vlm。若要开始新的 LoRA 训练,请改用 policy.checkpoint_path 从 HF 权重进行初始化,例如使用 --policy.type=molmoact2、--policy.checkpoint_path=allenai/MolmoAct2 和 --policy.train_mode_vlm=lora。

accelerate launch \
  --num_processes=8 \
  --mixed_precision=bf16 \
  -m lerobot.scripts.lerobot_train \
  --dataset.repo_id=allenai/MolmoAct2-LIBERO-Dataset \
  --dataset.root=/path/to/lerobot/data/allenai/MolmoAct2-LIBERO-Dataset \
  --dataset.video_backend=pyav \
  --dataset.image_transforms.enable=true \
  --policy.path=/path/to/pretrained_model \
  --policy.device=cuda \
  --policy.action_mode=continuous \
  --policy.chunk_size=10 \
  --policy.n_action_steps=10 \
  --policy.dtype=bfloat16 \
  --policy.num_flow_timesteps=8 \
  --policy.gradient_checkpointing=true \
  --policy.compile_model=true \
  --trackio.enable=true \
  --trackio.project=<trackio_project> \
  --job_name=<job_name> \
  --output_dir=outputs/<job_name> \
  --steps=10000 \
  --batch_size=32 \
  --num_workers=4 \
  --log_freq=20 \
  --env_eval_freq=-1 \
  --save_checkpoint=true \
  --save_freq=2000

常见做法

对于在相对较小的数据集上进行微调,例如单个 LIBERO 套件或包含少于 200 个演示的真实世界数据集,全局批大小 16 到 32 是一个不错的起点。在这些设置中,我们建议使用 policy.train_mode_vlm=lora(默认值),它通常能提供与 fft 相当甚至更好的性能。此外,policy.train_mode_vlm=freeze 也是一个实用的选择。在所有模式下,我们有意保持动作专家完全可训练,我们发现这对模型性能至关重要。对于更大的微调数据集,通常更倾向于使用更大的全局批大小和完整的 VLM 微调(policy.train_mode_vlm=fft)。

常用策略选项

  • policy.checkpoint_path:用于初始化的原始 MolmoAct2 HF 检查点。 请使用此参数加载已发布的 MolmoAct2 权重。
  • policy.path:用于初始化的 LeRobot 检查点。请对由 LeRobot 训练生成的检查点使用此参数。
  • policy.action_mode:训练目标,取值为 continuous、discrete 或 both 之一。MolmoAct2 官方的机器人微调使用 continuous。发布的检查点保留了离散动作权重;both 可作为显式的联合流匹配加动作标记消融选项使用。
  • policy.train_mode_vlm:控制 VLM 的微调模式,取值为 fft、lora 或 freeze 之一。fft 对 VLM 进行全量微调,lora 在 VLM 的线性层上训练 LoRA 适配器,freeze 则冻结 VLM。在这三种模式下,动作专家均会进行全量微调。默认值为 lora。freeze 要求 policy.action_mode=continuous。
  • policy.enable_knowledge_insulation:当为 true 时,在计算动作损失之前,会分离动作专家上下文的 K/V 状态。默认值为 false。
  • policy.chunk_size:策略使用的动作时间范围。对于 LIBERO,我们使用 10。此 LeRobot 移植版本会用该值覆盖加载的检查点中的 max_action_horizon。
  • policy.n_action_steps:在再次查询策略之前,从每个预测块中消耗的动作数量。对于 LIBERO,请将其设置为 chunk_size。
  • policy.setup_type:插入到提示词中用于描述机器人和场景的文本,例如 single franka robotic arm in libero。norm_stats.json 中的 metadata_by_tag 条目列出了更多示例。
  • policy.control_mode:插入到提示中以描述动作空间的文本,例如 delta end-effector pose 或 absolute joint pose。
  • policy.image_keys:传递给处理器的有序 LeRobot 图像观测键。
  • policy.dtype:Pi0.5 风格的精度开关。bfloat16 对大型 VLM 矩阵使用 bf16 自动混合精度(autocast)/存储,同时保留完整的动作专家(action expert)和数值敏感模块为 fp32。float32 禁用自动混合精度,并将整个模型保持在 fp32。低内存的 bfloat16 配置有意区别于原始的 MolmoAct2 FP32-master AMP 运行:AdamW 动量遵循每个参数的存储数据类型,因此大型 bf16 VLM 参数也拥有 bf16 动量。全量微调会为每个携带梯度的 bf16 参数惰性分配一个 bf16 补偿张量,以便将小于一个参数 ULP 的更新带入后续步骤。这不是 fp32 主副本。LoRA 适配器、动作专家以及显式指定的敏感模块保留 fp32 参数和优化器状态;LoRA 模式下的冻结 VLM 参数不分配补偿张量。
  • policy.compile_model:启用 MolmoAct2 的按块 torch.compile 路径。 全量微调和 LoRA 均仅编译动作专家 Transformer 块。 以 Eager 模式执行 VLM/ViT/connector,可避免编译器引起的 BF16 激活值和梯度漂移,同时保留在每个流时间步评估的动作路径的加速效果。 Inductor 也被指示在融合操作中保留 Eager BF16 降精度/升精度边界。 这是一个固定的精度安全边界,不会引入额外的编译选项。 编译默认处于禁用状态;建议在长时间 GPU 训练运行时启用。 动作块使用 PyTorch 的自动形状策略。 在启用梯度检查点时,仅将可变的编码器上下文序列维度标记为动态;批次大小、动作时间跨度和流时间步数保持静态。 在该模式下,Dynamo 图缓存重排序及其额外的 DDP 图分割器被禁用,以便反向重计算选择与正向相同的块图。 批次内的文本/动作序列在插入 BOS 之前会被左填充至内部 8 的倍数。 这最多增加七个掩码 token,同时大幅减少特定形状的编译预热时间;它不是面向用户的选项。
  • policy.num_flow_timesteps:训练期间每个样本采样的 flow-matching 时间步数。我们在微调时使用 8。
  • policy.num_inference_steps:可选参数,用于在推理时覆盖连续动作生成的步数。
  • policy.gradient_checkpointing:在 VLM/动作路径中启用检查点,以减少激活内存。
  • policy.freeze_embedding:冻结输入嵌入。默认值为 true。
  • policy.normalize_gripper:控制夹爪维度是否包含在状态/动作分位数归一化中。默认值为 false。
  • policy.normalize_language:在构建提示词之前对任务字符串进行规范化。默认值为 true。
  • policy.mask_action_dim_padding:在流损失中屏蔽填充维度。 发布的检查点使用 policy.expected_max_action_dim=32。
  • policy.max_sequence_length:可选的手动序列长度上限。如果未设置,将根据图像、状态维度、动作维度、动作时域以及离散动作模式来推断该值。

学习率

MolmoAct2 使用参数组学习率,以匹配原始 MolmoAct2 微调实验。

  • 全量微调使用 policy.optimizer_lr=1e-5 作为 VLM 的学习率,policy.optimizer_vit_lr=5e-6 作为视觉塔的学习率,policy.optimizer_connector_lr=5e-6 作为图像连接器层的学习率,以及 policy.optimizer_action_expert_lr=5e-5 作为动作专家的学习率。
  • 当 policy.train_mode_vlm=lora 时,LoRA VLM 微调会将 VLM、视觉和连接器 LoRA 参数组的值设置为 5e-5;动作专家仍使用 policy.optimizer_action_expert_lr 进行完全微调。
  • Frozen-VLM 微调使用 policy.train_mode_vlm=freeze,仅训练动作专家,并使用 policy.optimizer_action_expert_lr=5e-5。
  • policy.optimizer_grad_clip_norm 会独立应用于 LLM、视觉塔、图像连接器和动作专家参数组,这与原始 MolmoAct2 优化器保持一致。它并非针对整个全局模型的单一梯度范数。

您可以使用 policy.optimizer_lr、policy.optimizer_vit_lr、policy.optimizer_connector_lr 和 policy.optimizer_action_expert_lr 来覆盖全量微调和动作专家的 learning rate。 调度器设置可以通过 policy.scheduler_warmup_steps、policy.scheduler_decay_steps 和 policy.scheduler_decay_lr 进行修改。默认的 24,000 步衰减周期与官方 train_lerobot.py 配方一致。

数据集分位数统计

MolmoAct2 默认对状态和动作特征使用分位数归一化。如果您的数据集尚未使用分位数统计量进行转换,您可以通过以下方式添加:

python src/lerobot/scripts/augment_dataset_quantile_stats.py \
  --repo-id=your_dataset

记录、恢复并合并来自各回合摘要的聚合分位数,使 meta/stats.json 最终保存一个保守的包络(对于 q <= 50 使用 min,对于 q > 50 使用 max),而不是整个数据集的分位数。若要估算后者,请使用运行直方图扫描每个回合:

python src/lerobot/scripts/augment_dataset_quantile_stats.py \
  --repo-id=your_dataset \
  --overwrite \
  --skip-images

--skip-images 会保留现有的图像统计信息,并在仅需重新计算 STATE/ACTION 时避免下载或解码视频数据,而 --root 则从本地数据集读取,而非从 Hub 读取。这些值是直方图估计值,会受到离散化和重新分箱误差的影响,因此可能与保守值不同——这会改变 MolmoAct2 的归一化目标,进而影响其损失尺度。已保存在现有检查点内的统计信息不受影响。

或者,使用均值/标准差归一化来训练 MolmoAct2:

--policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}'

评估

评估同时支持 LeRobot 保存的检查点和原始 MolmoAct2 HF 检查点。对于 LIBERO 复现,请保持 EGL 渲染环境固定,并使用 policy.per_episode_seed=true。

重要:我们发现 num_steps_wait=10 无法可靠地让 LIBERO 场景稳定下来,并可能降低测得的成功率。此处报告的所有 LIBERO 评估结果均使用 num_steps_wait=50。

使用 LeRobot MolmoAct2 权重进行评估

对于由 LeRobot 保存的检查点,请使用 policy.path。保存的处理器和归一化统计信息将与模型一起恢复。

export MUJOCO_GL=egl
export PYOPENGL_PLATFORM=egl
export OMP_NUM_THREADS=1
export MKL_NUM_THREADS=1

lerobot-eval \
  --policy.path=allenai/MolmoAct2-LIBERO-LeRobot \
  --policy.inference_action_mode=continuous \
  --policy.dtype=bfloat16 \
  --policy.enable_inference_cuda_graph=true \
  --policy.device=cuda \
  --policy.per_episode_seed=true \
  --policy.eval_seed=1000 \
  --env.type=libero \
  --env.task=libero_10,libero_goal,libero_object,libero_spatial \
  --env.camera_name_mapping='{"agentview_image":"image","robot0_eye_in_hand_image":"wrist_image"}' \
  --eval.batch_size=1 \
  --eval.n_episodes=50 \
  --seed=1000

使用原始 MolmoAct2 权重进行评估

您可以直接评估已发布的 Hugging Face 检查点,而无需先将其转换为 LeRobot 检查点。在这种情况下,请将 policy.checkpoint_path 设置为 HF 模型仓库,并提供 policy.norm_tag。 对于 LIBERO,policy.norm_tag=libero 会从检查点的 norm_stats.json 中加载 LIBERO 的动作/状态归一化统计信息、动作范围、提示元数据以及图像键顺序。

若要使用发布的 Hugging Face 检查点完全复现 MolmoAct2 论文的结果,我们建议使用固定于 v0.5.1 的 allenai/lerobot molmoact2-hf-inference 分支。该分支与用于报告数值的原始评估设置相匹配。

export MUJOCO_GL=egl
export PYOPENGL_PLATFORM=egl
export OMP_NUM_THREADS=1
export MKL_NUM_THREADS=1

lerobot-eval \
  --policy.type=molmoact2 \
  --policy.checkpoint_path=allenai/MolmoAct2-LIBERO \
  --policy.norm_tag=libero \
  --policy.inference_action_mode=continuous \
  --policy.dtype=float32 \
  --policy.enable_inference_cuda_graph=true \
  --policy.device=cuda \
  --policy.per_episode_seed=true \
  --policy.eval_seed=1000 \
  --env.type=libero \
  --env.task=libero_goal \
  --env.camera_name_mapping='{"agentview_image":"image","robot0_eye_in_hand_image":"wrist_image"}' \
  --eval.batch_size=1 \
  --eval.n_episodes=50 \
  --seed=1000

使用 --env.task=libero_10,libero_goal,libero_object,libero_spatial 可运行完整的 LIBERO 测试套件。只要所请求的 policy.norm_tag 存在于该检查点的 norm_stats.json 中,相同的命令也适用于其他已发布的 MolmoAct2 检查点。

常用评估选项

  • policy.inference_action_mode:rollout 所必需。对于 flow-matching 推理,请使用 continuous;对于 action-token 推理,请使用 discrete。它必须与检查点中保存的训练时 policy.action_mode 兼容。
  • policy.path:LeRobot 检查点路径或 Hub 仓库。对于由 LeRobot 保存的检查点,请使用此项。
  • policy.checkpoint_path:原始 MolmoAct2 HF 检查点路径或 Hub 仓库。 请将其与 policy.type=molmoact2 和 policy.norm_tag 一起使用。
  • policy.norm_tag:从原始检查点的 norm_stats.json 中选择归一化统计量、提示元数据、图像键顺序以及动作范围。直接评估原始 HF 检查点时需要此参数。
  • policy.dtype:模型存储/自动转换配置。在常规 GPU 评估中,请使用 bfloat16。仅当您明确希望进行全 fp32 推理时,才使用 float32。
  • policy.enable_inference_cuda_graph:启用 MolmoAct2 推理 CUDA 图路径,以加速重复的连续动作 rollout。
  • policy.per_episode_seed 和 policy.eval_seed:使随机连续动作生成在每个回合内具有确定性,以便进行复现。
  • env.task:以逗号分隔的 LIBERO 套件,或单个套件。若要使用完整基准测试,请使用 libero_10,libero_goal,libero_object,libero_spatial。
  • env.camera_name_mapping:将 LIBERO 的相机名称映射到策略处理器所期望的图像键。

性能结果

LIBERO 基准测试结果

MolmoAct2 在 LIBERO 基准测试套件上展现了强劲的性能。为了对比并测试其 LeRobot 实现,我们在 LIBERO 数据集上对 allenai/MolmoAct2-LIBERO 进行了额外 10k 步的微调,使用 8 块 H100 GPU,每 GPU 批处理大小为 32,然后将结果与原始 MolmoAct2 参考结果进行了比较。

此处报告的 LeRobot 微调检查点可在 allenai/MolmoAct2-LIBERO-LeRobot 获取,该检查点基于 allenai/MolmoAct2-LIBERO-Dataset 进行训练。

基准测试LeRobot 实现MolmoAct2 原始
LIBERO 空间98.4%97.8%
LIBERO 对象100.0%100.0%
LIBERO 目标98.0%97.8%
LIBERO 1096.6%93.2%
平均98.25%97.20%

这些结果展示了 MolmoAct2 在多种机器人操作任务中的出色表现。要复现这些结果,请遵循 LIBERO 评估部分的说明。

硬件部署(lerobot-rollout)

LeRobot 格式的模型检查点可在 Hub 上获取,可直接用于 lerobot-rollout。每个检查点使用特定的相机名称,这些名称必须与您的机器人相机配置相匹配。

相机命名约定

每个检查点都期望特定的 observation.images.* 键。 如果您的机器人摄像头名称不同,请使用 --rename_map 进行映射:

检查点相机键描述
MolmoAct2-LIBERO-LeRobotimage, wrist_imageLIBERO 模拟相机
MolmoAct2-BimanualYAM-LeRobottop, left, rightYAM 三摄像头设置
MolmoAct2-DROID-LeRobotcam0, cam1外部 + 手腕
MolmoAct2-SO100_101-LeRobotcam0, cam1主视图 + 次视图

使用顶部和侧面摄像头的 SO-100 机器人示例:

lerobot-rollout \
  --policy.path=lerobot/MolmoAct2-SO100_101-LeRobot \
  --rename_map='{"observation.images.top": "observation.images.cam0", "observation.images.side": "observation.images.cam1"}' \
  --robot.type=so100_follower \
  --robot.port=/dev/ttyACM0 \
  --robot.cameras='{
      top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30},
      side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}
  }' \
  --task="pick up the red cube" --duration=30

若要改用腕部摄像头,只需更改重命名映射:

--rename_map='{"observation.images.top": "observation.images.cam0", "observation.images.wrist": "observation.images.cam1"}'

联合帧变换(SO-100/101 零样本)

The MolmoAct2-SO100_101 checkpoint was trained on data that uses a different joint calibration convention than LeRobot >= 0.5.0. Without a frame correction, the arm may move in the wrong direction.

这会影响从原始检查点进行的零样本部署和微调。预训练权重遵循旧的约定,因此所有联合数据(观测值和动作)都必须进行转换以使其匹配。

转换后的 LeRobot 检查点(lerobot/MolmoAct2-SO100_101-LeRobot) 的处理器流水线中已包含此修正。如果您自行转换 或微调该检查点,请在策略配置(configuration_molmoact2.py)中设置以下内容:

  • joint_signs: [1, -1, 1, 1, 1, 1](翻转 shoulder_lift 方向)
  • joint_offsets:[0, 90, 90, 0, 0, 0](将 shoulder_lift 和 elbow_flex 偏移 90°)

有关校准变更的详细信息,请参阅向后兼容性指南。

与原始实现的区别

此 LeRobot 移植版本旨在匹配 MolmoAct2 的行为,同时使用 LeRobot 的数据集、训练、评估、检查点和日志记录基础设施。与原始训练仓库的主要区别如下:

  • 原始论文的训练栈保留 fp32 主参数,并在 bf16 AMP 下进行训练。此 LeRobot 移植版本使用 policy.dtype=bfloat16 以降低内存占用:大型 VLM 矩阵以 bf16 存储,而动作专家模块和数值敏感模块保持为 fp32,符合条件的算子在 bf16 自动混合精度下运行。一个 bf16 更新补偿张量可减少全量微调过程中的参数舍入损失,但其 bf16 Adam 动量仍无法完全复现原始的 fp32 优化器状态。
  • 原始仓库使用其自身的 FSDP/模型并行训练路径。LeRobot 移植版本使用标准的 LeRobot/Accelerate 训练路径,并且尚未针对多节点训练进行测试。
  • 原始仓库支持序列打包。LeRobot 移植版本针对每个条目训练一个 LeRobot 样本,并使用基于批次的局部填充以及推断出的最大序列长度保护机制。
  • LeRobot 移植版本遵循 LeRobot 的优化器、调度器、检查点保存、数据集转换、图像增强以及 Trackio 日志记录约定。
  • 原始训练路径通过填充至 max_action_horizon 并在动作专家的自注意力中屏蔽填充的时间步槽位,来支持混合动作时间范围。这在跨不同控制频率的数据集进行训练时非常有用。LeRobot 移植版本目前针对单数据集微调,因此 policy.chunk_size 会覆盖检查点中的 max_action_horizon,且尚未实现时间范围屏蔽。计划支持此混合时间范围路径。

引用

@misc{fang2026molmoact2actionreasoningmodels,
      title={MolmoAct2: Action Reasoning Models for Real-world Deployment},
      author={Haoquan Fang and Jiafei Duan and Donovan Clay and Sam Wang and Shuo Liu and Weikai Huang and Xiang Fan and Wei-Chuan Tsai and Shirui Chen and Yi Ru Wang and Shanli Xing and Jaemin Cho and Jae Sung Park and Ainaz Eftekhar and Peter Sushko and Karen Farley and Angad Wadhwa and Cole Harrison and Winson Han and Ying-Chun Lee and Eli VanderBilt and Rose Hendrix and Suveen Ellawela and Lucas Ngoo and Joyce Chai and Zhongzheng Ren and Ali Farhadi and Dieter Fox and Ranjay Krishna},
      year={2026},
      eprint={2605.02881},
      archivePrefix={arXiv},
      primaryClass={cs.RO},
      url={https://arxiv.org/abs/2605.02881},
}

许可证

该模型采用 Apache 2.0 许可证。它旨在用于研究和教育用途,并符合 Ai2 的负责任使用指南,与 allenai/molmoact2 保持一致。

Update on GitHub