LeRobot documentation

MolmoAct2 ポリシー

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.7.0).
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 が必要です。現在の混合精度パスでは、完全なアクションエキスパートを fp32 で、大きな VLM 行列を bf16 で保存します。policy.compile_model=true を設定すると、オプションとしてアクションエキスパートブロックのみをコンパイルし、VLM、ビジョンタワー、コネクタ、ポリシーラッパーは eager のままにします。この境界設定では、同じ開始点からの出力、勾配、オプティマイザー更新の整合性チェックに合格しました。一方、bf16 の VLM パスをコンパイルした場合は合格しませんでした。

accelerate を通じたマルチ GPU トレーニングにより、スループットとグローバルバッチサイズが向上します。このパスは 2 ノード 8 GPU の GB200 実行で検証されていますが、この LeRobot ポートでは、元の MolmoAct2 の fsdp_devices を用いたモデル並列トレーニングパスは公開されていません。1 GPU の GB200 上で 2 種類の実際のプロンプト幅を用いたリプレイでは、グラフブレイクなしで 1 つのコンパイル済みアクショングラフが生成され、イージア実行と同一の 55.15 GiB のピークメモリを消費し、定常状態では modest な高速化が得られました。これらの結果は、移植可能なスループットや 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の汎用的な変換サブセット設定では、必須の3つの変換のいずれかを時折欠落させることなく、この任意の4つ目の変換を表現することができません。

元のMolmoAct2の重みでトレーニングする

リリース済みの MolmoAct2 チェックポイントから開始する場合は、policy.checkpoint_path を使用します。例えば allenai/MolmoAct2 や allenai/MolmoAct2-LIBERO などです。LeRobot は元の HF モデルファイルを読み込んだ後、データセットのメタデータと以下のポリシーオプションから独自のポリシープロセッサを構築します。

以下のコマンドは、公開されたベースチェックポイントから、マージされたLIBEROデータセットでのフルファインチューニングを示しています。bf16モデル読み込み、8つのフロータイムステップ、公式の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スイートの1つや、デモが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 をフリーズします。アクションエキスパートは、3 つのモードすべてで完全にファインチューニングされます。デフォルトは lora です。freeze を使用するには、policy.action_mode=continuous が必要です。
  • policy.enable_knowledge_insulation: trueの場合、action lossの前にaction-expertのcontext K/V状態をdetachします。デフォルトは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/ストレージを使用し、完全なアクションエキスパートおよび数値的に敏感なモジュールを fp32 で保持します。float32 は autocast を無効にし、モデル全体を fp32 で保持します。低メモリ用の bfloat16 プロファイルは、元の MolmoAct2 の FP32-master AMP 実行と意図的に異なります。AdamW のモーメントは各パラメータのストレージ dtype に従うため、大規模な bf16 の VLM パラメータも bf16 のモーメントを持ちます。フルファインチューニングでは、勾配を持つ各 bf16 パラメータに対して 1 つの bf16 補償テンソルを遅延割り当てし、パラメータ 1 ULP 未満の更新を後続のステップに反映します。これは fp32 のマスターコピーではありません。LoRA アダプタ、アクションエキスパート、および明示的に指定された敏感なモジュールは、fp32 のパラメータとオプティマイザ状態を保持します。LoRA モードで凍結された VLM パラメータには補償テンソルは割り当てられません。
  • policy.compile_model: MolmoAct2 のブロック単位の torch.compile パスを有効にします。 フルファインチューニングと LoRA の両方で、コンパイルされるのはアクションエキスパートの Transformer ブロックのみです。 Eager な VLM/ViT/コネクタの実行により、コンパイラ起因の BF16 アクティベーションおよび勾配のドリフトを回避しつつ、各フロータイムステップで評価されるアクションパスの高速化を維持します。 また、Inductor には、融合された演算にまたがる Eager な BF16 のダウキャスト/アップキャスト境界を保持するよう指示されます。 これは固定された精度安全な境界の 1 つであり、追加のコンパイルオプションは提供されません。 コンパイルはデフォルトで無効です。長時間の GPU トレーニング実行時に有効にしてください。 アクションブロックは PyTorch の自動シェイプ戦略を使用します。 勾配チェックポイントを使用する場合、可変なエンコーダコンテキストのシーケンス次元のみが動的としてマークされ、バッチサイズ、アクションホライズン、フロータイムステップ数は静的のままです。 そのモードでは、Dynamo のグラフキャッシュの並べ替えと、それによる追加の DDP グラフスプリッターが無効化され、バックワードの再計算がフォワードと同じブロックグラフを選択するようにします。 バッチローカルのテキスト/アクションシーケンスは、BOS の挿入前に、内部の 8 の倍数に左パディングされます。 これにより、最大 7 個のマスク済みトークンが追加されますが、シェイプ固有のコンパイルウォームアップを大幅に削減します。これはユーザー向けのオプションではありません。
  • 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 のファインチューニング実験に合わせて、パラメータグループごとの学習率を使用しています。

  • フルファインチューニングでは、VLMにpolicy.optimizer_lr=1e-5、ビジョンタワーにpolicy.optimizer_vit_lr=5e-6、画像コネクタ層にpolicy.optimizer_connector_lr=5e-6、アクションエキスパートにpolicy.optimizer_action_expert_lr=5e-5を使用します。
  • LoRA VLMファインチューニングでは、policy.train_mode_vlm=loraの場合、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 は、元の MolmoAct2 のオプティマイザーに合わせ、LLM、ビジョンタワー、イメージコネクタ、アクションエキスパートのパラメータグループそれぞれに独立して適用されます。これは単一のグローバルモデルの勾配ノルムではありません。

policy.optimizer_lr、policy.optimizer_vit_lr、policy.optimizer_connector_lr、policy.optimizer_action_expert_lr を使用して、フルファインチューニングおよびアクションエキスパートの学習率を上書きできます。 スケジューラーの設定は、policy.scheduler_warmup_steps、policy.scheduler_decay_steps、policy.scheduler_decay_lr で変更できます。デフォルトの 24,000 ステップの減衰ホライズンは、公式の train_lerobot.py レシピと一致しています。

Dataset Quantile Statistics

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"}'

評価

Evaluationは、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: ロールアウトに必要です。フローマッチング推論にはcontinuousを、アクショントークン推論には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グラフパスを有効にし、連続アクションのロールアウトを高速化します。
  • 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実装を比較・テストするために、allenai/MolmoAct2-LIBEROをLIBEROデータセット上で、8枚のH100 GPUを使用し、GPUあたりのバッチサイズ32でさらに10kステップファインチューニングし、その結果を元のMolmoAct2の参照結果と比較しました。

ここで報告されているLeRobotのファインチューニング済みチェックポイントはallenai/MolmoAct2-LIBERO-LeRobotで利用可能であり、allenai/MolmoAct2-LIBERO-Datasetで学習されました。

ベンチマークLeRobotの実装MolmoAct2 元
LIBERO Spatial98.4%97.8%
LIBERO Object100.0%100.0%
LIBERO Goal98.0%97.8%
LIBERO 1096.6%93.2%
平均98.25%97.20%

これらの結果は、MolmoAct2が多様なロボティック操作タスクにおいて優れたパフォーマンスを発揮していることを示しています。再現するには、LIBERO評価セクションの手順に従ってください。

ハードウェアデプロイ(lerobot-rollout)

LeRobot形式のチェックポイントは、lerobot-rolloutで直接使用できるようHubで利用できます。各チェックポイントは特定のカメラ名を使用しており、これらはロボットのカメラ構成と一致する必要があります。

カメラの命名規則

各チェックポイントは、特定のobservation.images.*キーを期待しています。 ロボットのカメラの名前が異なる場合は、--rename_mapを使用してマッピングしてください:

チェックポイントカメラキー説明
MolmoAct2-LIBERO-LeRobotimage, wrist_imageLIBERO シミュレーションカメラ
MolmoAct2-BimanualYAM-LeRobottop, left, rightYAM 3カメラセットアップ
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移植版は、LeRobotのデータセット、学習、評価、チェックポイント、およびログ記録のインフラストラクチャを使用しながら、MolmoAct2の動作に一致することを目的としています。元の学習リポジトリとの主な違いは以下の通りです。

  • 元の論文の学習スタックは fp32 のマスターパラメータを保持し、bf16 AMP の下で学習を行います。この LeRobot ポートでは、policy.dtype=bfloat16 を使用してメモリを削減します。大きな VLM 行列は bf16 で保存され、アクションエキスパートおよび数値的に敏感なモジュールは fp32 のままで、対象となる演算子は bf16 オートキャストの下で実行されます。bf16 の更新補償テンソルはフルファインチューニング中のパラメータの丸め誤差を軽減しますが、その bf16 Adam モーメントは、元の fp32 オプティマイザの状態を正確に再現するものではありません。
  • 元のリポジトリは独自のFSDP/モデル並列学習パスを使用しています。LeRobotの移植版は標準的なLeRobot/Accelerate学習パスを使用しており、マルチノード学習はテストされていません。
  • 元のリポジトリはシーケンスパッキングをサポートしています。LeRobotの移植版では、1つのアイテムにつき1つの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