LeRobot documentation
MolmoAct2 정책
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로 유지하면서 action expert 블록을 선택적으로 컴파일합니다. 이 경계는 동일한 시작 출력, 그래디언트, 옵티마이저 업데이트 동등성 검증을 통과했으며, bf16 VLM 경로를 컴파일하는 경우 통과하지 못했습니다.
accelerate를 통한 멀티 GPU 학습은 처리량과 전역 배치 크기를 증가시킵니다. 이 경로는 2노드, 8GPU GB200 환경에서 검증되었지만, 이 LeRobot 포팅 버전은 원래 MolmoAct2의 fsdp_devices 모델 병렬 학습 경로를 노출하지 않습니다. 실제 프롬프트 폭 2개를 사용한 1GPU GB200 리플레이에서는 그래프 브레이크가 없는 컴파일된 액션 그래프 1개를 생성했으며, 이그저 실행과 동일한 55.15 GiB의 피크 메모리를 사용했고, 안정적인 상태에서의 속도 향상이 modest한 수준이었습니다. 이러한 결과를 이식 가능한 처리량이나 ETA 주장이 아닌 구현 검증으로 간주하십시오.
이 저장소는 Ubuntu 22.04에서 테스트되었습니다.
사용
LeRobot 학습 구성에서 MolmoAct2를 사용하려면 다음을 설정하세요:
--policy.type=molmoact2
학습
MolmoAct2는 공개된 MolmoAct2 Hugging Face 체크포인트 형식에서 또는 LeRobot으로 이미 저장된 체크포인트에서 fine-tune할 수 있습니다. 두 경로 모두 동일한 LeRobot 학습 루프, 데이터셋 변환, 체크포인트 저장 및 로깅을 사용합니다. 차이점은 초기 정책 가중치와 프로세서 상태를 로드하는 방식뿐입니다.
LeRobot은 기본적으로 데이터셋 이미지 증강을 비활성화합니다. MolmoAct2 학습 명령에 --dataset.image_transforms.enable=true를 유지하세요. 원래 MolmoAct2 변환 레시피는 LeRobot의 일반 변환 기본값이 아니므로, 첫 번째 명령에서는 95% 크롭, 5도 회전, 컬러 지터를 명시적으로 고정합니다. 원래 레시피는 확률 0.2로 가우시안 블러를 추가로 적용하지만, LeRobot의 일반 변환 부분집합 구성은 필수인 세 가지 변환 중 하나가 간헐적으로 누락되는 문제를 피하면서 해당 선택적 네 번째 변환을 표현할 수 없습니다.
Training With Original MolmoAct2 Weight
릴리스된 MolmoAct2 체크포인트에서 시작할 경우 policy.checkpoint_path를 사용하세요. 예를 들어 allenai/MolmoAct2 또는 allenai/MolmoAct2-LIBERO입니다. LeRobot은 원래의 HF 모델 파일을 로드한 다음, 데이터셋 메타데이터와 아래 정책 옵션을 기반으로 자체 정책 프로세서를 구성합니다.
아래 명령은 공개된 base checkpoint에서 병합된 LIBERO 데이터셋으로 전체 fine-tuning을 수행하는 방법을 보여줍니다. bf16 모델 로딩, 8개의 flow timesteps, 공식 LIBERO quantile 통계, 이미지 증강, 그리고 LeRobot의 checkpointing/logging 경로를 사용합니다. lerobot/libero의 근사 metadata quantiles를 공개된 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=2000LeRobot MolmoAct2 가중치로 학습
LeRobot로 저장된 MolmoAct2 체크포인트를 로컬 pretrained_model 디렉터리 또는 Hub에서 시작할 때는 policy.path를 사용하세요. 이를 통해 저장된 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개 미만인 실세계 데이터셋과 같이 상대적으로 작은 데이터셋으로 fine-tuning을 수행하는 경우, 16에서 32 사이의 global batch size가 좋은 시작점이 됩니다. 이러한 설정에서는 policy.train_mode_vlm=lora(기본값) 사용을 권장하며, 이는 일반적으로 fft와 유사하거나 더 나은 성능을 제공합니다. 또한 policy.train_mode_vlm=freeze도 실용적인 선택지입니다. 모든 모드에서 action expert를 완전히 학습 가능하도록 의도적으로 유지하며, 이는 모델 성능에 결정적으로 중요하다고 판단했습니다. 더 큰 fine-tuning 데이터셋의 경우, 더 큰 global batch size와 완전한 VLM fine-tuning(policy.train_mode_vlm=fft)이 일반적으로 선호됩니다.
일반적인 정책 옵션
policy.checkpoint_path: 초기화에 사용할 원래의 MolmoAct2 HF 체크포인트입니다. 공개된 MolmoAct2 가중치를 사용할 때 이 값을 지정합니다.policy.path: 초기화에 사용할 LeRobot 체크포인트. LeRobot 학습으로 생성된 체크포인트에 이 값을 사용합니다.policy.action_mode: 학습 대상이며continuous,discrete,both중 하나입니다. 공식 MolmoAct2 로봇 파인튜닝에는continuous가 사용됩니다. 공개된 체크포인트에는 이산 동작 가중치가 유지되며,both는 명시적인 결합 flow-matching 및 action-token ablation을 위해 사용할 수 있습니다.policy.train_mode_vlm: VLM fine-tuning 모드를 제어하며,fft,lora,freeze중 하나입니다.fft는 VLM을 완전히 fine-tune하고,lora는 VLM의 linear layer에 LoRA 어댑터를 학습하며,freeze는 VLM을 동결합니다. 세 모드 모두에서 action expert는 완전히 fine-tune됩니다. 기본값은lora입니다.freeze는policy.action_mode=continuous를 요구합니다.policy.enable_knowledge_insulation:true인 경우, action loss 계산 전에 action-expert의 context K/V 상태를 detach합니다. 기본값은false입니다.policy.chunk_size: 정책이 사용하는 action horizon입니다. LIBERO의 경우10을 사용합니다. 이 LeRobot 포트는 로드된 체크포인트의max_action_horizon값을 이 값으로 덮어씁니다.policy.n_action_steps: 정책을 다시 조회하기 전에 각 예측된 chunk에서 소비되는 동작의 수. 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는 autocast를 비활성화하고 전체 모델을 fp32로 유지합니다. 저메모리bfloat16프로필은 원래 MolmoAct2 FP32-master AMP 실행과 의도적으로 다릅니다. AdamW moments는 각 파라미터의 저장 dtype를 따르므로, 대형 bf16 VLM 파라미터도 bf16 moments를 가집니다. 전체 fine-tuning은 각 gradient를 가진 bf16 파라미터마다 하나의 bf16 보상 텐서를 지연 할성하여, 하나의 파라미터 ULP보다 작은 업데이트가 후속 단계로 전달되도록 합니다. 이는 fp32 master copy가 아닙니다. LoRA 어댑터, action expert, 명시적으로 민감한 모듈은 fp32 파라미터와 옵티마이저 상태를 유지하며, LoRA 모드에서 동결된 VLM 파라미터는 보상 텐서를 할성하지 않습니다.policy.compile_model: MolmoAct2의 블록 단위torch.compile경로를 활성화합니다. Full fine-tuning과 LoRA 모두 action-expert transformer 블록만 컴파일합니다. Eager VLM/ViT/connector 실행은 컴파일러로 인한 BF16 activation 및 gradient drift를 방지하면서, 모든 flow timestep에서 평가되는 action path의 가속을 유지합니다. Inductor는 또한 fused operations를 가로지르는 eager BF16 downcast/upcast 경계를 보존하도록 지시됩니다. 이것은 고정된 정밀도 안전 경계 하나이며, 추가적인 compile 옵션을 제공하지 않습니다. 컴파일은 기본적으로 비활성화되어 있으며, 긴 GPU 학습 실행을 위해 활성화하십시오. Action 블록은 PyTorch의 automatic shape 전략을 사용합니다. gradient checkpointing이 사용되면, 가변적인 encoder-context sequence 차원만 dynamic으로 표시되며, batch size, action horizon, flow-timestep count는 static으로 유지됩니다. 해당 모드에서는 Dynamo graph-cache 재배열과 추가적인 DDP graph splitter가 비활성화되어, backward recomputation이 forward와 동일한 블록 그래프를 선택하도록 합니다. Batch-local text/action 시퀀스는 BOS 삽입 전에 내부적으로 8의 배수로 left-padding됩니다. 이것은 최대 7개의 masked token을 추가할 뿐, shape-specific compile warm-up을 크게 줄이며, 사용자 노출 옵션이 아닙니다.policy.num_flow_timesteps: 학습 중 각 예제당 샘플링되는 flow-matching timestep의 수입니다. fine-tuning에는8을 사용합니다.policy.num_inference_steps: 추론 시 연속 동작 생성 단계에 대한 선택적 오버라이드입니다.policy.gradient_checkpointing: VLM/액션 경로에서 체크포인트를 활성화하여 활성화 메모리를 줄입니다.policy.freeze_embedding: 입력 임베딩을 고정합니다. 기본값은true입니다.policy.normalize_gripper: gripper 차원이 상태/행동 quantile 정규화에 포함될지 여부를 제어합니다. 기본값은false입니다.policy.normalize_language: 프롬프트 구성 전 작업 문자열을 정규화합니다. 기본값은true입니다.policy.mask_action_dim_padding: flow loss에서 패딩된 차원을 마스크합니다. 발행된 체크포인트는policy.expected_max_action_dim=32를 사용합니다.policy.max_sequence_length: 선택적 수동 시퀀스 상한. 설정하지 않으면 이미지, 상태 차원, 동작 차원, 동작 지평선, 이산 동작 모드에서 추론합니다.
학습률
MolmoAct2는 원래 MolmoAct2 fine-tuning 실험과 일치하도록 parameter-group learning rates를 사용합니다.
- Full fine-tuning은 VLM에
policy.optimizer_lr=1e-5, vision tower에policy.optimizer_vit_lr=5e-6, 이미지 커넥터 레이어에policy.optimizer_connector_lr=5e-6, action expert에policy.optimizer_action_expert_lr=5e-5를 사용합니다. - LoRA VLM fine-tuning은
policy.train_mode_vlm=lora일 때 VLM, vision, connector LoRA parameter group을5e-5로 설정합니다. action expert는 여전히policy.optimizer_action_expert_lr로 완전히 fine-tune됩니다. - Frozen-VLM fine-tuning은
policy.train_mode_vlm=freeze를 사용하고, action expert만 학습하며,policy.optimizer_action_expert_lr=5e-5를 사용합니다. policy.optimizer_grad_clip_norm은 LLM, vision tower, image connector, action-expert 파라미터 그룹에 독립적으로 적용되며, 이는 원래 MolmoAct2 옵티마이저와 일치합니다. 단일 글로벌 모델의 그래디언트 노름이 아닙니다.
policy.optimizer_lr, policy.optimizer_vit_lr, policy.optimizer_connector_lr, policy.optimizer_action_expert_lr를 사용하여 전체 fine-tuning 및 action-expert의 learning rate를 오버라이드할 수 있습니다.
policy.scheduler_warmup_steps, policy.scheduler_decay_steps, policy.scheduler_decay_lr를 사용하여 Scheduler 설정을 변경할 수 있습니다. 기본값인 24,000-step decay horizon은 공식 train_lerobot.py recipe와 일치합니다.
Dataset Quantile Statistics
MolmoAct2는 기본적으로 상태 및 동작 특징에 대해 quantile normalization을 사용합니다. 데이터셋이 quantile 통계로 변환되지 않은 경우, 다음을 추가할 수 있습니다:
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의 정규화 대상(target)을 변경하고, 결과적으로 손실(loss) 규모에 영향을 줍니다. 기존 체크포인트에 이미 저장된 통계에는 영향을 미치지 않습니다.
또는 MolmoAct2를 mean/std 정규화로 학습할 수 있습니다:
--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=1000Original MolmoAct2 Weight로 평가
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: 모델 저장/autocast 프로필. 일반적인 GPU 평가에는bfloat16를 사용하세요. 명시적으로 full-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를 8개의 H100 GPU에서 GPU당 배치 크기 32로 LIBERO 데이터셋에서 추가로 10k 스텝 동안 파인튜닝한 후, 결과를 원래 MolmoAct2 기준 결과와 비교했습니다.
여기 보고된 LeRobot fine-tuned 체크포인트는 allenai/MolmoAct2-LIBERO-LeRobot에서 사용할 수 있으며, allenai/MolmoAct2-LIBERO-Dataset로 학습되었습니다.
| 벤치마크 | LeRobot 구현 | MolmoAct2 Original |
|---|---|---|
| LIBERO Spatial | 98.4% | 97.8% |
| LIBERO Object | 100.0% | 100.0% |
| LIBERO 목표 | 98.0% | 97.8% |
| LIBERO 10 | 96.6% | 93.2% |
| 평균 | 98.25% | 97.20% |
이 결과는 MolmoAct2가 다양한 로봇 조작 작업에서 뛰어난 성능을 발휘함을 보여줍니다. 이를 재현하려면 LIBERO 평가 섹션의 지침을 따르세요.
하드웨어 배포(lerobot-rollout)
LeRobot 형식의 체크포인트는 lerobot-rollout에서 바로 사용할 수 있도록 Hub에 제공되며, 각 체크포인트는 로봇의 카메라 구성과 일치해야 하는 특정 카메라 이름을 사용합니다.
카메라 명명 규칙
각 체크포인트는 특정 observation.images.* 키를 기대합니다.
로봇 카메라의 이름이 다른 경우, --rename_map을 사용하여 매핑하십시오:
| 체크포인트 | 카메라 키 | 설명 |
|---|---|---|
| MolmoAct2-LIBERO-LeRobot | image, wrist_image | LIBERO 시뮬레이션 카메라 |
| MolmoAct2-BimanualYAM-LeRobot | top, left, right | YAM 3-카메라 구성 |
| MolmoAct2-DROID-LeRobot | cam0, cam1 | 외부 + 손목 |
| MolmoAct2-SO100_101-LeRobot | cam0, 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.이는 zero-shot deployment와 원본 체크포인트로부터의 fine-tuning 모두에 영향을 미칩니다. 사전 학습된 가중치는 기존 규약을 기대하므로, 모든 결합 데이터(관측값과 동작)를 이에 맞게 변환해야 합니다.
변환된 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 포팅 버전은 항목당 하나의 LeRobot 샘플로 학습하며, 추론된 최대 시퀀스 길이 가드를 사용한 배치 로컬 패딩을 사용합니다.
- LeRobot 포트는 LeRobot의 옵티마이저, 스케줄러, 체크포인트 저장, 데이터셋 변환, 이미지 증강, Trackio 로깅 규약을 따릅니다.
- 원래 학습 경로는 패딩을
max_action_horizon까지 수행하고, 액션 전문가의 자기 주의(self-attention)에서 패딩된 호라이즌 슬롯을 마스킹함으로써 혼합 액션 호라이즌을 지원합니다. 이는 서로 다른 제어 주파수를 가진 데이터셋을 가로질러 학습할 때 유용합니다. 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 라이선스 하에 배포됩니다. allenai/molmoact2와 일치하는 Ai2 책임 있는 사용 가이드라인에 따라 연구 및 교육 목적으로 사용하도록 설계되었습니다.
Update on GitHub