LeRobot documentation

MolmoAct2 Policy

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.6.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

MolmoAct2 Policy

MolmoAct2 là bản triển khai chính sách LeRobot của MolmoAct2, được chuyển đổi sang các giao diện huấn luyện, đánh giá, lưu checkpoint và dataset của LeRobot để dễ dàng sử dụng hơn với các dataset LeRobot.

Cài đặt này hiện hỗ trợ huấn luyện và đánh giá cho mô hình MolmoAct2 thông thường. MolmoAct2-Think, hỗ trợ suy luận độ sâu thích ứng, chưa được bao gồm trong chính sách LeRobot này.

Đối với mã huấn luyện MolmoAct2 gốc được sử dụng cho các thí nghiệm được báo cáo trong bài báo, hãy xem allenai/molmoact2.

Yêu cầu cài đặt

Cài đặt LeRobot với các phụ thuộc tùy chọn của MolmoAct2:

uv sync --locked --extra molmoact2

Để chạy các mô hình trong kho lưu trữ này, bạn cần một GPU NVIDIA. Đường dẫn mixed-precision hiện tại lưu trữ action expert hoàn chỉnh ở fp32 và các ma trận VLM lớn ở bf16. policy.compile_model=true tùy chọn biên dịch các khối action expert trong khi giữ VLM, vision tower, connector và policy wrapper ở chế độ eager. Ranh giới này đã vượt qua các kiểm tra parity về đầu ra cùng điểm khởi đầu, gradient và optimizer-update; việc biên dịch đường dẫn VLM bf16 thì không vượt qua.

Huấn luyện đa GPU thông qua accelerate làm tăng thông lượng và kích thước lô toàn cục. Lộ trình này đã được kiểm chứng trên các lần chạy GB200 với hai nút, tám GPU, nhưng bản port LeRobot này không mở lộ lộ trình huấn luyện song song mô hình fsdp_devices gốc của MolmoAct2. Một lần chạy lại GB200 trên một GPU với hai độ rộng prompt thực tế đã tạo ra một đồ thị hành động được biên dịch mà không có điểm ngắt đồ thị, cùng mức bộ nhớ đỉnh 55.15 GiB giống như khi thực thi theo kiểu eager, và một mức tăng tốc ổn định khiêm tốn. Hãy xem những kết quả này như các bước kiểm tra triển khai chứ không phải là các tuyên bố về thông lượng hoặc ETA có thể áp dụng rộng rãi.

Kho đã được kiểm tra với Ubuntu 22.04.

Cách sử dụng

Để sử dụng MolmoAct2 trong cấu hình huấn luyện LeRobot, hãy đặt:

--policy.type=molmoact2

Huấn luyện

MolmoAct2 có thể được tinh chỉnh từ checkpoint định dạng Hugging Face của MolmoAct2 đã phát hành hoặc từ checkpoint đã được lưu bởi LeRobot. Cả hai phương án đều sử dụng cùng một vòng lặp huấn luyện LeRobot, các phép biến đổi tập dữ liệu, việc lưu checkpoint và ghi log. Sự khác biệt duy nhất là cách tải trọng số chính sách ban đầu và trạng thái bộ xử lý.

LeRobot vô hiệu hóa tăng cường ảnh cho dataset theo mặc định. Giữ --dataset.image_transforms.enable=true trong các lệnh huấn luyện MolmoAct2. Công thức transform gốc của MolmoAct2 không phải là mặc định transform chung của LeRobot, do đó lệnh đầu tiên cũng cố định rõ ràng các tham số crop 95%, xoay 5 độ và jitter màu. Công thức gốc ngoài ra còn áp dụng làm mờ Gaussian với xác suất 0,2; cấu hình tập con transform chung của LeRobot không thể diễn đạt transform tùy chọn thứ tư đó mà không đôi khi bỏ sót một trong ba transform bắt buộc.

Huấn luyện Với Trọng Số MolmoAct2 Gốc

Sử dụng policy.checkpoint_path khi bắt đầu từ một checkpoint MolmoAct2 đã phát hành, ví dụ allenai/MolmoAct2 hoặc allenai/MolmoAct2-LIBERO. LeRobot sẽ tải các tệp mô hình HF gốc, sau đó xây dựng policy processor của riêng nó từ metadata của dataset và các tùy chọn policy bên dưới.

Lệnh bên dưới cho thấy quá trình fine-tuning đầy đủ trên bộ dữ liệu LIBERO đã được gộp từ checkpoint cơ sở đã phát hành. Lệnh này sử dụng tải mô hình bf16, 8 bước thời gian flow, thống kê phân vị chính thức của LIBERO, tăng cường hình ảnh và đường dẫn checkpointing/logging của LeRobot. Không thay thế các phân vị metadata gần đúng của lerobot/libero bằng norm_stats.json đã phát hành; các giá trị q01/q99 của chúng không giống hệt nhau.

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

Huấn luyện Với Trọng số LeRobot MolmoAct2

Sử dụng policy.path khi bắt đầu từ một checkpoint MolmoAct2 được lưu bởi LeRobot, từ một thư mục pretrained_model cục bộ hoặc từ Hub. Điều này khôi phục cấu hình policy LeRobot đã lưu, trọng số mô hình, processor và thống kê chuẩn hóa. Bạn vẫn có thể ghi đè các tùy chọn khi huấn luyện như batch_size, steps hoặc policy.action_mode. Việc nạp checkpoint là nghiêm ngặt và giữ nguyên topology FFT hoặc LoRA đã lưu, vì vậy không ghi đè policy.train_mode_vlm khi sử dụng policy.path. Để bắt đầu một lượt chạy LoRA mới, khởi tạo từ trọng số HF bằng policy.checkpoint_path thay vào đó, ví dụ với --policy.type=molmoact2, --policy.checkpoint_path=allenai/MolmoAct2 và --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

Các thực hành phổ biến

Đối với việc tinh chỉnh trên một tập dữ liệu tương đối nhỏ, chẳng hạn như một bộ LIBERO duy nhất hoặc một tập dữ liệu thực tế có ít hơn 200 minh chứng, kích thước lô toàn cục từ 16 đến 32 là điểm khởi đầu tốt. Trong các cài đặt này, chúng tôi khuyến nghị sử dụng policy.train_mode_vlm=lora (mặc định), thường cho hiệu suất tương đương hoặc thậm chí tốt hơn so với fft. Ngoài ra, policy.train_mode_vlm=freeze cũng là một lựa chọn thực tế. Trong tất cả các chế độ, chúng tôi cố ý giữ chuyên gia hành động hoàn toàn có thể huấn luyện, điều mà chúng tôi nhận thấy là rất quan trọng đối với hiệu suất của mô hình. Đối với các tập dữ liệu tinh chỉnh lớn hơn, kích thước lô toàn cục lớn hơn và tinh chỉnh VLM đầy đủ (policy.train_mode_vlm=fft) thường được ưu tiên.

Các tùy chọn chính sách phổ biến

  • policy.checkpoint_path: checkpoint MolmoAct2 HF gốc để khởi tạo. Sử dụng tham số này cho các trọng số MolmoAct2 đã phát hành.
  • policy.path: checkpoint LeRobot để khởi tạo. Sử dụng cho các checkpoint được tạo bởi quá trình huấn luyện LeRobot.
  • policy.action_mode: mục tiêu huấn luyện, một trong continuous, discrete, hoặc both. Việc tinh chỉnh robot MolmoAct2 chính thức sử dụng continuous. Các checkpoint được phát hành giữ lại trọng số hành động rời rạc; both có sẵn như một phép loại trừ (ablation) kết hợp flow-matching và action-token.
  • policy.train_mode_vlm: kiểm soát chế độ fine-tuning VLM, một trong số fft, lora, hoặc freeze. fft fine-tune toàn bộ VLM, lora huấn luyện các adapter LoRA trên các lớp tuyến tính của VLM, và freeze đóng băng VLM. Action expert được fine-tune toàn bộ trong cả ba chế độ. Mặc định là lora. freeze yêu cầu policy.action_mode=continuous.
  • policy.enable_knowledge_insulation: khi true, tách trạng thái K/V ngữ cảnh của chuyên gia hành động trước khi tính tổn thất hành động. Giá trị mặc định là false.
  • policy.chunk_size: chân trời hành động (action horizon) được sử dụng bởi chính sách. Đối với LIBERO, chúng tôi sử dụng 10. Bản port LeRobot này ghi đè max_action_horizon của checkpoint đã tải bằng giá trị này.
  • policy.n_action_steps: số lượng hành động được lấy từ mỗi khối dự đoán trước khi truy vấn lại chính sách. Đối với LIBERO, hãy đặt nó bằng chunk_size.
  • policy.setup_type: văn bản được chèn vào prompt để mô tả robot và cảnh, ví dụ single franka robotic arm in libero. Các ví dụ khác được liệt kê trong các mục metadata_by_tag của norm_stats.json.
  • policy.control_mode: văn bản được chèn vào prompt để mô tả không gian hành động, ví dụ delta end-effector pose hoặc absolute joint pose.
  • policy.image_keys: các khóa quan sát hình ảnh LeRobot có thứ tự được truyền vào bộ xử lý.
  • policy.dtype: Công tắc độ chính xác kiểu Pi0.5. bfloat16 sử dụng bf16 autocast/lưu trữ cho các ma trận VLM lớn trong khi giữ nguyên các module chuyên gia hành động và các module nhạy cảm về mặt số học ở fp32. float32 tắt autocast và giữ toàn bộ model ở fp32. Hồ sơ bfloat16 bộ nhớ thấp cố ý khác với lần chạy AMP FP32-master gốc của MolmoAct2: các moment của AdamW tuân theo dtype lưu trữ của từng tham số, do đó các tham số VLM bf16 lớn cũng có các moment bf16. Fine-tuning đầy đủ phân bổ lười một tensor bù trừ bf16 cho mỗi tham số bf16 mang gradient để các cập nhật nhỏ hơn một ULP của tham số được đưa vào các bước sau. Đây không phải là bản sao master fp32. Các adapter LoRA, chuyên gia hành động và các module nhạy cảm được chỉ định rõ ràng giữ nguyên tham số và trạng thái optimizer fp32; các tham số VLM bị đóng băng ở chế độ LoRA không phân bổ tensor bù trừ.
  • policy.compile_model: bật đường dẫn torch.compile theo khối của MolmoAct2. Cả fine-tuning đầy đủ và LoRA đều chỉ biên dịch các khối transformer của action-expert. Chế độ chạy eager cho VLM/ViT/connector giúp tránh sự trôi dạt kích hoạt và gradient BF16 do trình biên dịch gây ra, đồng thời vẫn giữ được tốc độ tăng tốc cho đường dẫn action được đánh giá ở mỗi bước thời gian của flow. Inductor cũng được chỉ thị để giữ nguyên các ranh giới downcast/upcast BF16 eager xuyên suốt các thao tác đã hợp nhất. Đây là một ranh giới an toàn về độ chính xác cố định và không thêm tùy chọn biên dịch nào khác. Biên dịch bị tắt theo mặc định; hãy bật nó cho các phiên huấn luyện GPU dài. Các khối action sử dụng chiến lược hình dạng tự động của PyTorch. Khi có gradient checkpointing, chỉ chiều chuỗi ngữ cảnh encoder biến đổi được đánh dấu là động; kích thước batch, chân trời action và số bước thời gian flow vẫn giữ tĩnh. Việc sắp xếp lại bộ đệm đồ thị của Dynamo và bộ tách đồ thị DDP bổ sung của nó bị tắt trong chế độ đó để phép tính lại backward chọn cùng một đồ thị khối như forward. Các chuỗi text/action cục bộ theo batch được đệm trái đến bội số nội bộ của 8 trước khi chèn BOS. Điều này thêm tối đa bảy token bị mask trong khi giảm mạnh thời gian làm nóng biên dịch theo hình dạng cụ thể; đây không phải là tùy chọn dành cho người dùng.
  • policy.num_flow_timesteps: số bước thời gian flow-matching được lấy mẫu cho mỗi ví dụ trong quá trình huấn luyện. Chúng tôi sử dụng 8 để tinh chỉnh.
  • policy.num_inference_steps: tùy chọn ghi đè cho các bước sinh hành động liên tục khi suy luận.
  • policy.gradient_checkpointing: bật checkpointing trong đường dẫn VLM/hành động để giảm bộ nhớ kích hoạt.
  • policy.freeze_embedding: đóng băng các embedding đầu vào. Mặc định là true.
  • policy.normalize_gripper: kiểm soát việc các chiều của gripper có được đưa vào chuẩn hóa phân vị của state/action hay không. Mặc định là false.
  • policy.normalize_language: chuẩn hóa các chuỗi tác vụ trước khi xây dựng prompt. Giá trị mặc định là true.
  • policy.mask_action_dim_padding: che các chiều được đệm trong tổn thất luồng. Các checkpoint được phát hành sử dụng policy.expected_max_action_dim=32.
  • policy.max_sequence_length: giới hạn độ dài chuỗi thủ công tùy chọn. Để trống để suy ra từ hình ảnh, kích thước trạng thái, kích thước hành động, chân trời hành động và chế độ hành động rời rạc.

Tốc độ học

MolmoAct2 sử dụng tốc độ học theo nhóm tham số để khớp với các thí nghiệm tinh chỉnh ban đầu của MolmoAct2

  • Fine-tuning toàn bộ sử dụng policy.optimizer_lr=1e-5 cho VLM, policy.optimizer_vit_lr=5e-6 cho vision tower, policy.optimizer_connector_lr=5e-6 cho các lớp image connector, và policy.optimizer_action_expert_lr=5e-5 cho action expert.
  • Fine-tuning LoRA VLM đặt các nhóm tham số LoRA của VLM, vision và connector thành 5e-5 khi policy.train_mode_vlm=lora; action expert vẫn được fine-tune hoàn toàn với policy.optimizer_action_expert_lr.
  • Fine-tuning Frozen-VLM sử dụng policy.train_mode_vlm=freeze, chỉ huấn luyện action expert và sử dụng policy.optimizer_action_expert_lr=5e-5.
  • policy.optimizer_grad_clip_norm được áp dụng độc lập cho các nhóm tham số của LLM, vision tower, image connector và action-expert, khớp với optimizer gốc của MolmoAct2. Đây không phải là chuẩn gradient toàn cục của mô hình.

Bạn có thể ghi đè các tốc độ học của fine-tuning toàn bộ và action-expert bằng policy.optimizer_lr, policy.optimizer_vit_lr, policy.optimizer_connector_lr và policy.optimizer_action_expert_lr. Các cài đặt scheduler có thể được thay đổi bằng policy.scheduler_warmup_steps, policy.scheduler_decay_steps và policy.scheduler_decay_lr. Khoảng thời gian suy giảm mặc định 24.000 bước khớp với công thức train_lerobot.py chính thức.

Thống kê phân vị của bộ dữ liệu

MolmoAct2 mặc định sử dụng chuẩn hóa phân vị cho các đặc trưng trạng thái và hành động. Nếu tập dữ liệu của bạn chưa được chuyển đổi với thống kê phân vị, bạn có thể thêm chúng bằng cách:

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

Ghi lại, tiếp tục và gộp các phân vị tổng hợp từ các bản tóm tắt theo từng episode, để meta/stats.json cuối cùng chứa một bao bảo thủ (min cho q <= 50, max cho q > 50) thay vì các phân vị của toàn bộ tập dữ liệu. Để ước lượng các phân vị của toàn bộ tập dữ liệu, quét mọi episode bằng một histogram chạy:

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

--skip-images giữ nguyên thống kê hình ảnh hiện có và tránh tải hoặc giải mã dữ liệu video khi chỉ cần tính lại STATE/ACTION, còn --root đọc bộ dữ liệu cục bộ thay vì từ Hub. Các giá trị này là ước lượng từ histogram, chịu sai số do rời rạc hóa và gộp lại bin, nên có thể khác so với các giá trị bảo thủ — điều này làm thay đổi các mục tiêu đã chuẩn hóa của MolmoAct2 và do đó thay đổi thang loss. Thống kê đã được lưu bên trong checkpoint hiện có không bị ảnh hưởng.

Hoặc huấn luyện MolmoAct2 với chuẩn hóa mean/std:

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

Đánh giá

Evaluation cũng hỗ trợ cả checkpoint được lưu bằng LeRobot và checkpoint HF gốc của MolmoAct2. Để tái hiện LIBERO, hãy giữ nguyên môi trường render EGL và sử dụng policy.per_episode_seed=true.

Quan trọng: Chúng tôi nhận thấy rằng num_steps_wait=10 không đảm bảo cho phép cảnh LIBERO ổn định và có thể làm giảm thành công đo được. Tất cả kết quả đánh giá LIBERO được báo cáo ở đây sử dụng num_steps_wait=50.

Đánh giá Với Trọng số LeRobot MolmoAct2

Sử dụng policy.path cho checkpoint được lưu bởi LeRobot. Bộ xử lý và thống kê chuẩn hóa đã lưu sẽ được khôi phục cùng với mô hình.

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

Đánh giá Với Trọng Số MolmoAct2 Gốc

Bạn có thể đánh giá trực tiếp một checkpoint Hugging Face đã phát hành mà không cần chuyển đổi nó thành checkpoint LeRobot trước. Trong trường hợp này, hãy đặt policy.checkpoint_path thành kho mô hình HF và cung cấp policy.norm_tag. Đối với LIBERO, policy.norm_tag=libero sẽ tải thống kê chuẩn hóa hành động/trạng thái của LIBERO, chân trời hành động, metadata prompt và thứ tự khóa hình ảnh từ norm_stats.json của checkpoint.

Để tái hiện đầy đủ kết quả của bài báo MolmoAct2 với các checkpoint Hugging Face đã phát hành, chúng tôi khuyến nghị sử dụng nhánh allenai/lerobot molmoact2-hf-inference được ghim ở phiên bản v0.5.1. Nhánh này khớp với các cài đặt đánh giá gốc đã được sử dụng cho các con số được báo cáo.

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

Sử dụng --env.task=libero_10,libero_goal,libero_object,libero_spatial để chạy bộ bài kiểm tra LIBERO đầy đủ. Lệnh tương tự cũng hoạt động với các checkpoint MolmoAct2 đã phát hành khác, miễn là policy.norm_tag được yêu cầu có tồn tại trong norm_stats.json của checkpoint đó.

Các tùy chọn đánh giá phổ biến

  • policy.inference_action_mode: bắt buộc cho rollout. Sử dụng continuous cho suy luận flow-matching hoặc discrete cho suy luận action-token. Nó phải tương thích với policy.action_mode tại thời điểm huấn luyện được lưu trong checkpoint.
  • policy.path: Đường dẫn checkpoint LeRobot hoặc kho Hub. Sử dụng cho các checkpoint được lưu bởi LeRobot.
  • policy.checkpoint_path: đường dẫn checkpoint MolmoAct2 HF gốc hoặc kho Hub. Sử dụng cùng với policy.type=molmoact2 và policy.norm_tag.
  • policy.norm_tag: chọn thống kê chuẩn hóa, siêu dữ liệu prompt, thứ tự khóa hình ảnh và chân trời hành động từ norm_stats.json của checkpoint gốc. Tham số này là bắt buộc để đánh giá trực tiếp checkpoint HF gốc.
  • policy.dtype: hồ sơ lưu trữ/autocast của mô hình. Sử dụng bfloat16 cho đánh giá GPU thông thường. Chỉ sử dụng float32 khi bạn thực sự muốn suy luận fp32 đầy đủ.
  • policy.enable_inference_cuda_graph: bật đường dẫn đồ thị CUDA suy luận của MolmoAct2 để thực hiện rollout hành động liên tục lặp lại nhanh hơn.
  • policy.per_episode_seed và policy.eval_seed: làm cho việc tạo hành động liên tục ngẫu nhiên trở nên tất định theo từng episode để phục vụ việc tái lập.
  • env.task: các bộ LIBERO phân tách bằng dấu phẩy hoặc một bộ duy nhất. Sử dụng libero_10,libero_goal,libero_object,libero_spatial cho bộ benchmark đầy đủ.
  • env.camera_name_mapping: ánh xạ tên camera của LIBERO sang các khóa hình ảnh được kỳ vọng bởi bộ xử lý chính sách.

Kết quả Hiệu năng

Kết quả Benchmark LIBERO

MolmoAct2 đã thể hiện hiệu suất mạnh mẽ trên bộ benchmark LIBERO. Để so sánh và kiểm tra việc triển khai LeRobot của nó, chúng tôi đã fine-tune allenai/MolmoAct2-LIBERO thêm 10k bước trên tập dữ liệu LIBERO với per-GPU batch size 32 trên 8 GPU H100, sau đó so sánh kết quả với kết quả tham chiếu gốc của MolmoAct2.

Checkpoint LeRobot được tinh chỉnh và báo cáo tại đây có sẵn tại allenai/MolmoAct2-LIBERO-LeRobot và được huấn luyện trên allenai/MolmoAct2-LIBERO-Dataset.

Đánh giá hiệu năngLeRobot ImplementationMolmoAct2 Bản gốc
LIBERO Spatial98.4%97.8%
LIBERO Object100.0%100.0%
Mục tiêu LIBERO98.0%97.8%
LIBERO 1096.6%93.2%
Trung bình98.25%97.20%

Những kết quả này cho thấy hiệu suất vượt trội của MolmoAct2 trên nhiều tác vụ thao tác robot đa dạng. Để tái tạo chúng, hãy làm theo các hướng dẫn trong phần đánh giá LIBERO.

Triển khai phần cứng (lerobot-rollout)

Các checkpoint định dạng LeRobot có sẵn trên Hub để sử dụng trực tiếp với lerobot-rollout. Mỗi checkpoint sử dụng các tên camera cụ thể phải khớp với cấu hình camera của robot của bạn.

Quy ước đặt tên camera

Mỗi checkpoint kỳ vọng các khóa observation.images.* cụ thể. Nếu camera của robot có tên khác, hãy dùng --rename_map để ánh xạ chúng:

CheckpointPhím cameraMô tả
MolmoAct2-LIBERO-LeRobotimage, wrist_imageLIBERO camera mô phỏng
MolmoAct2-BimanualYAM-LeRobottop, left, rightCấu hình 3 camera YAM
MolmoAct2-DROID-LeRobotcam0, cam1Ngoài + cổ tay
MolmoAct2-SO100_101-LeRobotcam0, cam1Xem chính + phụ

Ví dụ với robot SO-100 sử dụng camera phía trên và camera bên:

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

Để sử dụng camera đeo cổ tay thay thế, chỉ cần thay đổi ánh xạ đổi tên:

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

Biến đổi khung khớp (SO-100/101 zero-shot)

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.

Điều này ảnh hưởng đến cả triển khai zero-shot và fine-tuning từ checkpoint gốc. Trọng số được huấn luyện trước kỳ vọng theo quy ước cũ, do đó tất cả dữ liệu liên hợp (quan sát và hành động) phải được biến đổi để khớp với quy ước đó.

Checkpoint LeRobot đã được chuyển đổi (lerobot/MolmoAct2-SO100_101-LeRobot) đã bao gồm sự hiệu chỉnh này trong pipeline processor của nó. Nếu bạn tự chuyển đổi hoặc tinh chỉnh checkpoint, hãy đặt các giá trị sau trong cấu hình policy (configuration_molmoact2.py):

  • joint_signs: [1, -1, 1, 1, 1, 1] (đảo chiều shoulder_lift)
  • joint_offsets: [0, 90, 90, 0, 0, 0] (dịch chuyển shoulder_lift và elbow_flex 90°)

Xem hướng dẫn tương thích ngược để biết chi tiết về thay đổi hiệu chuẩn.

Sự khác biệt so với bản triển khai gốc

Phiên bản LeRobot này được thiết kế để khớp với hành vi của MolmoAct2 trong khi sử dụng cơ sở hạ tầng về tập dữ liệu, huấn luyện, đánh giá, checkpoint và ghi log của LeRobot. Các khác biệt chính so với kho lưu trữ huấn luyện gốc là:

  • Bộ stack huấn luyện trong bài báo gốc giữ các tham số master ở fp32 và huấn luyện dưới bf16 AMP. Bản port LeRobot này sử dụng policy.dtype=bfloat16 để giảm bộ nhớ: các ma trận VLM lớn được lưu ở bf16, trong khi action expert và các module nhạy cảm về mặt số học vẫn ở fp32, và các toán tử đủ điều kiện chạy dưới bf16 autocast. Một tensor bù trừ cập nhật bf16 làm giảm tổn thất làm tròn tham số trong quá trình fine-tuning toàn bộ, nhưng các moment Adam bf16 của nó vẫn không tái tạo chính xác trạng thái optimizer fp32 gốc.
  • Kho lưu trữ gốc sử dụng đường dẫn huấn luyện FSDP/song song mô hình riêng của nó. Bản port LeRobot sử dụng đường dẫn huấn luyện LeRobot/Accelerate tiêu chuẩn và chưa được kiểm tra cho huấn luyện đa nút.
  • Kho lưu trữ gốc hỗ trợ đóng gói chuỗi (sequence packing). Bản port LeRobot huấn luyện trên một mẫu LeRobot cho mỗi mục và sử dụng đệm cục bộ theo lô (batch-local padding) với một bộ bảo vệ giới hạn độ dài chuỗi tối đa được suy luận.
  • Phiên bản port của LeRobot tuân theo các quy ước về optimizer, scheduler, lưu checkpoint, biến đổi dataset, tăng cường hình ảnh và ghi log Trackio của LeRobot.
  • Đường dẫn huấn luyện gốc hỗ trợ các chân trời hành động hỗn hợp bằng cách đệm lên max_action_horizon và che các vị trí chân trời đã đệm trong self-attention của chuyên gia hành động. Điều này hữu ích khi huấn luyện trên các tập dữ liệu có tần số điều khiển khác nhau. Bản port LeRobot hiện nhắm đến fine-tuning trên một tập dữ liệu đơn, do đó policy.chunk_size ghi đè lên max_action_horizon của checkpoint và việc che chân trời (horizon masking) chưa được triển khai. Hỗ trợ cho đường dẫn chân trời hỗn hợp này đang được lên kế hoạch.

Trích dẫn

@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},
}

Giấy phép

Mô hình này được cấp phép theo Apache 2.0. Nó được thiết kế cho mục đích nghiên cứu và giáo dục, tuân thủ Hướng dẫn Sử dụng Có trách nhiệm của Ai2, nhất quán với allenai/molmoact2.

Update on GitHub