LeRobot documentation
Политика MolmoAct2
Политика MolmoAct2
MolmoAct2 — это реализация политики LeRobot для MolmoAct2, адаптированная под интерфейсы обучения, оценки, сохранения контрольных точек и работы с наборами данных LeRobot для более удобного использования с наборами данных LeRobot.
Эта реализация в настоящее время поддерживает обучение и оценку для стандартной модели MolmoAct2. MolmoAct2-Think, которая поддерживает адаптивное рассуждение по глубине, пока не включена в эту политику LeRobot.
Исходный код обучения MolmoAct2, использованный для экспериментов, описанных в статье, доступен в allenai/molmoact2.
Требования к установке
Установите LeRobot с дополнительными зависимостями MolmoAct2:
uv sync --locked --extra molmoact2Для запуска моделей из этого репозитория требуется GPU от NVIDIA. Текущий путь смешанной точности хранит полный action expert в fp32, а большие матрицы VLM — в bf16. policy.compile_model=true по желанию компилирует блоки action expert, оставляя VLM, vision tower, connector и policy wrapper в режиме eager. Эта граница прошла проверки соответствия на старте вывода, градиентов и обновлений оптимизатора; компиляция пути bf16 VLM не прошла.
Обучение на нескольких GPU через accelerate повышает пропускную способность и глобальный размер батча. Этот путь был проверен на запусках с двумя узлами и восемью GPU GB200, однако данный порт LeRobot не предоставляет исходный путь обучения с параллелизмом моделей fsdp_devices MolmoAct2. Повторный прогон на одном GPU GB200 с двумя реальными ширинами промптов сгенерировал один скомпилированный граф действий без разрывов графа, с пиковым потреблением памяти 55,15 ГиБ, идентичным режиму eager, и умеренным ускорением в стационарном режиме. Рассматривайте эти результаты как проверки реализации, а не как переносимые заявления о пропускной способности или оценке времени выполнения.
Репозиторий был протестирован на Ubuntu 22.04.
Использование
Чтобы использовать MolmoAct2 в конфигурации обучения LeRobot, установите:
--policy.type=molmoact2
Обучение
MolmoAct2 можно дообучить как из опубликованного чекпоинта MolmoAct2 в формате Hugging Face, так и из чекпоинта, уже сохранённого с помощью LeRobot. Оба пути используют один и тот же цикл обучения LeRobot, преобразования датасета, сохранение чекпоинтов и логирование. Отличие состоит только в том, как загружаются начальные веса политики и состояние процессора.
LeRobot по умолчанию отключает аугментацию изображений в датасетах. В командах обучения MolmoAct2 необходимо сохранять --dataset.image_transforms.enable=true. Оригинальный рецепт трансформаций MolmoAct2 не является стандартным набором трансформаций LeRobot, поэтому в первой команде явно фиксируются обрезка 95%, поворот на 5 градусов и цветовая джиттеризация. Кроме того, в оригинальном рецепте с вероятностью 0.2 применяется гауссово размытие; стандартная конфигурация подмножества трансформаций LeRobot не позволяет задать этот дополнительный четвёртый трансформ без риска случайного удаления одного из трёх обязательных.
Обучение с исходными весами MolmoAct2
Используйте policy.checkpoint_path при запуске из опубликованного чекпоинта MolmoAct2, например allenai/MolmoAct2 или allenai/MolmoAct2-LIBERO. LeRobot загрузит исходные файлы модели HF, а затем создаст собственный policy processor на основе метаданных датасета и параметров политики, указанных ниже.
Команда ниже демонстрирует полную дообучение (full fine-tuning) на объединённом датасете LIBERO из опубликованного базового контрольного пункта. Она использует загрузку модели в bf16, 8 временных шагов потока (flow timesteps), официальные квантильные статистики 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
Используйте policy.path при запуске из контрольной точки MolmoAct2, сохранённой с помощью
LeRobot, из локального каталога pretrained_model или из Hub. Это
восстанавливает сохранённую конфигурацию политики LeRobot, веса модели, процессор и
статистику нормализации. Вы по-прежнему можете переопределять параметры, связанные с обучением, такие как batch_size, steps или policy.action_mode. Загрузка контрольной точки выполняется строго и
сохраняет заданную топологию FFT или LoRA, поэтому не переопределяйте policy.train_mode_vlm при использовании policy.path. Чтобы начать новый прогон с LoRA,
инициализируйте модель из весов HF с помощью policy.checkpoint_path, например
с параметрами --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доступен как явная абляция совместного flow-matching и action-token.policy.train_mode_vlm: управляет режимом дообучения VLM, одно из значенийfft,loraилиfreeze.fftвыполняет полное дообучение VLM,loraобучает адаптеры LoRA на линейных слоях VLM, аfreezeзамораживает VLM. Эксперт действий полностью дообучается во всех трёх режимах. По умолчанию используетсяlora. Дляfreezeтребуетсяpolicy.action_mode=continuous.policy.enable_knowledge_insulation: при значенииtrueотключает связь контекстных состояний K/V action-expert перед вычислением action loss. По умолчанию установлено значение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. Больше примеров приведено в записяхmetadata_by_tagфайлаnorm_stats.json.policy.control_mode: текст, вставляемый в промпт для описания пространства действий, например,delta end-effector poseилиabsolute joint pose.policy.image_keys: упорядоченные ключи наблюдений изображений LeRobot, передаваемые в процессор.policy.dtype: переключатель точности в стиле Pi0.5.bfloat16использует bf16 autocast/хранение для больших матриц VLM, сохраняя при этом полный action expert и численно чувствительные модули в fp32.float32отключает autocast и сохраняет всю модель в fp32. Профиль с низкой памятьюbfloat16намеренно отличается от исходного запуска MolmoAct2 с FP32-master AMP: моменты AdamW следуют dtype хранения каждого параметра, поэтому у больших параметров VLM в bf16 также есть моменты в bf16. При полной дообучении лениво выделяется один тензор компенсации bf16 для каждого параметра bf16, несущего градиент, чтобы обновления, меньшие одного ULP параметра, переносились в последующие шаги. Это не fp32 master copy. Адаптеры LoRA, action expert и явно чувствительные модули сохраняют параметры и состояние оптимизатора в fp32; замороженные параметры VLM в режиме LoRA не выделяют тензор компенсации.policy.compile_model: включает блочный путьtorch.compileдля MolmoAct2. Полная дообучение и LoRA компилируют только блоки трансформера action-expert. Исполнение VLM/ViT/connector в режиме eager предотвращает дрейф активаций и градиентов в BF16, вызванный компилятором, сохраняя при этом ускорение для action-пути, который оценивается на каждом шаге потока. Индуктору также указывается сохранять границы eager-преобразования BF16 (downcast/upcast) между слияемыми операциями. Это одна фиксированная граница, безопасная с точки зрения точности, и она не добавляет нового параметра компиляции. Компиляция отключена по умолчанию; включайте её для длительных прогонов обучения на GPU. Блоки action используют автоматическую стратегию форм PyTorch. При использовании checkpointing градиентов динамической помечается только переменное измерение последовательности контекста энкодера; размер батча, горизонт действия и количество шагов потока остаются статическими. В этом режиме отключаются переупорядочивание кэша графов Dynamo и дополнительный разделитель графов DDP, чтобы обратное вычисление выбирало тот же граф блока, что и прямое. Последовательности текста/действий в пределах батча выравниваются слева до внутреннего кратного 8 перед вставкой BOS. Это добавляет не более семи маскированных токенов, но резко сокращает время прогрева компиляции для конкретных форм; это не является опцией, доступной пользователю.policy.num_flow_timesteps: количество шагов flow-matching, отбираемых для каждого примера во время обучения. Для дообучения мы используем8.policy.num_inference_steps: необязательное переопределение количества шагов генерации непрерывных действий при выводе.policy.gradient_checkpointing: включает 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для эксперта действий. - При дообучении VLM с использованием LoRA группы параметров LoRA для VLM, визуального модуля и коннектора устанавливаются в
5e-5, еслиpolicy.train_mode_vlm=lora; при этом action expert по-прежнему полностью дообучается с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, vision tower, image connector и action-expert, что соответствует исходному оптимизатору MolmoAct2. Это не единая норма градиента для всей модели.
Вы можете переопределить скорости обучения для полного дообучения и эксперта действий с помощью 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.
Статистика квантилей набора данных
По умолчанию MolmoAct2 использует квантильную нормализацию для признаков состояния и действия. Если ваш набор данных не был преобразован с использованием квантильных статистик, вы можете добавить их с помощью:
python src/lerobot/scripts/augment_dataset_quantile_stats.py \ --repo-id=your_dataset
Запись, возобновление и объединение агрегированных квантилей из сводок по эпизодам, чтобы в meta/stats.json в итоге хранилась консервативная огибающая (min для q <= 50, max для q > 50), а не квантили по всему набору данных. Для оценки последних просканируйте каждый эпизод с использованием накопительной гистограммы:
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
Используйте policy.path для контрольной точки, сохранённой LeRobot. Сохранённый процессор и статистика нормализации восстанавливаются вместе с моделью.
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 загружает статистику нормализации действий/состояний LIBERO, горизонт действий, метаданные промптов и порядок ключей изображений из norm_stats.json чекпоинта.
Чтобы полностью воспроизвести результаты статьи MolmoAct2 с использованием опубликованных контрольных точек Hugging Face, мы рекомендуем использовать ветку allenai/lerobot molmoact2-hf-inference с закреплённой версией v0.5.1. Эта ветка соответствует исходным настройкам оценки, использованным для получения приведённых показателей.
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. Та же команда работает и для других опубликованных контрольных точек MolmoAct2, при условии, что запрашиваемый policy.norm_tag присутствует в файле norm_stats.json данной контрольной точки.
Часто используемые варианты оценки
policy.inference_action_mode: требуется для rollout. Используйтеcontinuousдля инференса flow-matching илиdiscreteдля инференса action-token. Он должен быть совместим с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: профиль хранения/автоматического приведения типов модели. Используйтеbfloat16для обычной оценки на GPU. Используйтеfloat32только в том случае, если вы явно хотите выполнять инференс в полном fp32.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 в течение дополнительных 10k шагов на датасете LIBERO с размером батча на GPU 32 на 8 GPU H100, а затем сравнили полученные результаты с исходными эталонными результатами MolmoAct2.
Точка проверки (checkpoint), дообученная с помощью LeRobot и описанная в данном разделе, доступна по адресу 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 доступны на Hub для прямого использования с lerobot-rollout. Каждый чекпоинт использует определённые имена камер, которые должны
совпадать с конфигурацией камер вашего робота.
Соглашение об именовании камер
Каждая контрольная точка ожидает определённые ключи observation.images.*.
Если камеры вашего робота имеют другие имена, используйте --rename_map, чтобы сопоставить их:
| Чекпоинт | Ключи камеры | Описание |
|---|---|---|
| MolmoAct2-LIBERO-LeRobot | image, wrist_image | Камеры симуляции LIBERO |
| MolmoAct2-BimanualYAM-LeRobot | top, left, right | Настройка YAM с тремя камерами |
| 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 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.Это затрагивает как развёртывание без обучения, так и дообучение из исходной контрольной точки. Предобученные веса ожидают старый формат, поэтому все объединённые данные (наблюдения и действия) должны быть преобразованы для соответствия.
Преобразованный чекпоинт 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, тогда как action expert и численно чувствительные модули остаются в fp32, а подходящие операторы выполняются в режиме bf16 autocast. Тензор компенсации обновлений в bf16 снижает потери от округления параметров при полном дообучении, однако его моменты Adam в bf16 всё равно не воспроизводят исходное состояние оптимизатора в fp32 точно. - Исходный репозиторий использует собственный путь обучения FSDP/модельного параллелизма. Порт LeRobot использует стандартный путь обучения LeRobot/Accelerate и не был протестирован для обучения на нескольких узлах.
- Исходный репозиторий поддерживает упаковку последовательностей. Порт LeRobot обучается на одном образце LeRobot на элемент и использует локальную для батча заполняющую последовательность (padding) с ограничением максимальной длины последовательности, определяемым автоматически.
- Порт 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. Она предназначена для исследовательского и образовательного использования в соответствии с Руководством Ai2 по ответственному использованию, что согласуется с allenai/molmoact2.
Update on GitHub