LeRobot documentation
EVO1
EVO1
EVO1 — это политика Vision-Language-Action для управления роботами, построенная на основе бэкбона InternVL3 и непрерывной головы действий flow-matching. Интеграция с LeRobot представляет EVO1 как стандартный тип политики, что позволяет обучать и оценивать его с использованием стандартных API набора данных, контрольных точек и процессоров LeRobot.
Обзор модели
Политика кодирует одно или несколько изображений с камер и языковую задачу с помощью InternVL3, дополняет векторы состояния/действий робота до фиксированных максимальных размеров и предсказывает будущие блоки действий с помощью action head на основе flow-matching. Во время инференса политика выбирает блок действий и возвращает n_action_steps действий из этого блока перед следующим выбором.
Что охватывает интеграция LeRobot
- Стандартная конфигурация
policy.type=evo1через LeRobot - Встраивание изображений и текста в InternVL3 с необязательным использованием FlashAttention в качестве резервного варианта
- Параметры управления поэтапной дообучением для прогонов дообучения только action-head и VLM
- Непрерывное предсказание действий с помощью flow-matching
- Сохранение и загрузка контрольных точек через API политик LeRobot
- Обучение с помощью
lerobot-trainи оценка с использованием стандартных API вывода политики
Более широкий проект EVO1 может включать дополнительные скрипты обучения и инструменты для работы с наборами данных. Эта страница посвящена пути политики управления роботом LeRobot.
Требования к установке
Установите LeRobot, следуя Руководству по установке.
Установите зависимости EVO1:
pip install -e ".[training,evo1]"Для обучения и оценки LIBERO также установите дополнительный пакет LIBERO:
pip install -e ".[training,evo1,libero]"Устанавливайте колесо
flash-attnтолько в том случае, если оно совместимо с вашей версией Python, PyTorch, CUDA и конфигурацией GPU. Еслиflash_attnнедоступен, EVO1 переключается на стандартное внимание.
EVO1 использует нативную реализацию InternVL из библиотеки Hugging Face transformers, поэтому policy.vlm_model_name должен указывать на нативно сконвертированный чекпоинт, например OpenGVLab/InternVL3-1B-hf (обратите внимание на суффикс -hf). При первом запуске загружается настроенный чекпоинт VLM, а при последующих запусках он повторно используется из кэша Hugging Face.
Требования к данным
EVO1 ожидает набор данных LeRobot со следующими характеристиками:
- От одного до
policy.max_viewsвизуальных наблюдений, напримерobservation.images.image observation.stateaction- Инструкция языковой задачи в поле
taskнабора данных или в другом поле, настроенном с помощьюpolicy.task_field
Векторы состояния и действия дополняются нулями до размеров policy.max_state_dim и policy.max_action_dim. Прогнозы обрезаются обратно до размерности действий из набора данных перед возвратом.
Использование
Для использования EVO1 в конфигурации LeRobot укажите:
policy.type=evo1По умолчанию новая политика EVO1 инициализирует свою VLM из:
policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf
Когда станет доступна контрольная точка EVO1 в формате LeRobot, загрузите её с помощью:
policy.path=your-org/your-evo1-checkpoint
Обучение
Этап 1
На этапе 1 VLM замораживается, а обучается головка действий:
lerobot-train \ --dataset.repo_id=your_org/your_dataset \ --policy.type=evo1 \ --policy.training_stage=stage1 \ --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \ --policy.device=cuda \ --policy.chunk_size=50 \ --policy.n_action_steps=50 \ --policy.max_state_dim=24 \ --policy.max_action_dim=24 \ --policy.optimizer_lr=1e-5 \ --batch_size=4 \ --steps=5000 \ --output_dir=./outputs/evo1_stage1
Этап 2
Stage 2 загружает политику Stage 1, но запускает новый оптимизатор и планировщик:
lerobot-train \ --dataset.repo_id=your_org/your_dataset \ --policy.path=./outputs/evo1_stage1/checkpoints/005000/pretrained_model \ --policy.training_stage=stage2 \ --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \ --policy.device=cuda \ --policy.chunk_size=50 \ --policy.n_action_steps=50 \ --policy.max_state_dim=24 \ --policy.max_action_dim=24 \ --policy.optimizer_lr=1e-5 \ --batch_size=4 \ --steps=80000 \ --output_dir=./outputs/evo1_stage2
По умолчанию policy.training_stage повторно применяет значения по умолчанию для дообучения, соответствующие данному этапу. Это важно при запуске этапа 2 из контрольной точки этапа 1, поскольку конфигурация контрольной точки этапа 1 сохраняет флаги дообучения VLM в отключённом состоянии. Эти значения по умолчанию для этапов имеют приоритет над сохранёнными или вручную заданными флагами policy.finetune_*, если не указано policy.apply_training_stage_defaults=false, поэтому устанавливайте этот флаг только в том случае, если вы вручную управляете каждым флагом дообучения.
Ключевые параметры обучения
| Параметр | По умолчанию | Описание |
|---|---|---|
policy.vlm_model_name | OpenGVLab/InternVL3-1B-hf | Проверочная точка InternVL3 или локальный каталог модели, преобразованные нативно |
policy.training_stage | stage1 | stage1 обучает головку действий; stage2 дообучает ветви VLM |
policy.apply_training_stage_defaults | true | Повторно применяет значения по умолчанию для дообучения этапа после загрузки контрольной точки |
policy.vlm_num_layers | 14 | Количество языковых слоев InternVL3, сохраняемых для политики |
policy.dtype | bfloat16 | Запрошенный dtype VLM |
policy.use_flash_attn | true | Запрашивает FlashAttention при его установке; в противном случае использует резервный вариант |
policy.enable_gradient_checkpointing | true | Включает чекпоинтинг для поддерживаемых модулей InternVL3 |
policy.gradient_checkpointing_use_reentrant | false | Параметр reentrant, передаваемый в gradient checkpointing при его поддержке |
policy.chunk_size | 50 | Количество предсказываемых будущих действий на чанк |
policy.n_action_steps | 50 | Количество действий, извлечённых из выборки |
policy.max_state_dim | 24 | Размер измерения отступов |
policy.max_action_dim | 24 | Размер отступов для действий |
policy.postprocess_action_dim | null | Необязательное измерение действия, возвращаемое после постобработки EVO1 |
policy.binarize_gripper | false | Бинаризирует канал захвата после постобработки для оценки в стиле LIBERO |
policy.task_field | task | Поле батча, используемое в качестве языкового промпта |
Вывод
Попробуйте это на обученном чекпоинте EVO1:
# --inference.type=rtc is optional
lerobot-rollout \
--policy.path=your-org/your-evo1-checkpoint \
--inference.type=rtc \
...Результаты
Оценка LIBERO
Справочный результат
Опубликованная контрольная точка Stage-2 прошла проверку чистого скачивания и развертывания:
zuoxingdong/evo1_libero, ревизия515921f4a2c1d3f3ad523721eafa26fdf2af315b. Для оценки чистого скачивания использовалась ревизия LeRobote40b58a8dfa9e7b86918c374791599d070518d11.
Одиночный запуск контрольной точки Stage-2 на шаге 70 000 дал:
| Suite | Успешные эпизоды | Эпизоды | Успешность |
|---|---|---|---|
| LIBERO Spatial | 485 | 500 | 97.0% |
| LIBERO Object | 496 | 500 | 99.2% |
| LIBERO Цель | 483 | 500 | 96.6% |
| LIBERO-10 | 469 | 500 | 93.8% |
| Общее | 1,933 | 2,000 | 96.65% |
Эти результаты получены с использованием одной обученной контрольной точки и одного семени оценки 1000; они не являются средним значением по нескольким семенам или оценкой доверительного интервала.
Рецепт обучения
Опубликованный контрольный пункт фиксирует полную разрешённую конфигурацию этапа 2 в train_config.json.
В ходе измеренного запуска использовались два GPU H100 с двумя процессами DDP и размером батча 64 на процесс, что давало глобальный батч 128. Оба этапа использовали одинаковую топологию. Базовая VLM была получена из ревизии 014c0583a0d4bedf29fbe2dbff4f865eb998e171 репозитория OpenGVLab/InternVL3-1B-hf.
Опубликованный артефакт не фиксирует точный коммит обучения LeRobot или его исходный файл блокировки зависимостей,
поэтому приведённые ниже команды воспроизводят записанную конфигурацию и топологию из текущего состояния репозитория,
а не восстанавливают программное окружение побитово.
Из исходного кода LeRobot установите зафиксированные зависимости и скачайте именно эту ревизию VLM:
uv sync --locked --extra training --extra evo1 --extra libero
VLM_DIR=$(uv run hf download OpenGVLab/InternVL3-1B-hf \
--revision=014c0583a0d4bedf29fbe2dbff4f865eb998e171)На этапе 1 VLM замораживается, а головка действий обучается в течение 5 000 шагов:
uv run accelerate launch --num_processes=2 -m lerobot.scripts.lerobot_train \
--dataset.repo_id=lerobot/libero \
--dataset.revision=a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 \
--dataset.video_backend=torchcodec \
--dataset.return_uint8=true \
--dataset.image_transforms.enable=true \
--dataset.use_imagenet_stats=true \
--dataset.eval_split=0.0 \
--policy.type=evo1 \
--policy.training_stage=stage1 \
--policy.apply_training_stage_defaults=true \
--policy.vlm_model_name="${VLM_DIR}" \
--policy.vlm_num_layers=14 \
--policy.dtype=bfloat16 \
--policy.device=cuda \
--policy.use_amp=true \
--policy.use_flash_attn=true \
--policy.enable_gradient_checkpointing=true \
--policy.gradient_checkpointing_use_reentrant=false \
--policy.image_resolution='[448,448]' \
--policy.chunk_size=50 \
--policy.n_action_steps=50 \
--policy.max_state_dim=24 \
--policy.max_action_dim=24 \
--policy.dropout=0.2 \
--policy.optimizer_lr=1e-5 \
--policy.optimizer_weight_decay=1e-3 \
--policy.optimizer_grad_clip_norm=1.0 \
--policy.scheduler_warmup_steps=1000 \
--policy.push_to_hub=false \
--use_policy_training_preset=true \
--batch_size=64 \
--steps=5000 \
--save_checkpoint=true \
--save_checkpoint_to_hub=false \
--save_freq=2500 \
--log_freq=10 \
--env_eval_freq=0 \
--num_workers=4 \
--prefetch_factor=2 \
--persistent_workers=true \
--seed=1000 \
--trackio.enable=false \
--output_dir=./outputs/evo1-libero-stage1-g128-5kЭтап 2 загружает политику с этапа 1, но запускает новый оптимизатор и планировщик. Обучение длится 80 000 шагов; сообщаемый контрольный пункт — это сохранение на шаге 70 000:
uv run accelerate launch --num_processes=2 -m lerobot.scripts.lerobot_train \
--dataset.repo_id=lerobot/libero \
--dataset.revision=a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 \
--dataset.video_backend=torchcodec \
--dataset.return_uint8=true \
--dataset.image_transforms.enable=true \
--dataset.use_imagenet_stats=true \
--dataset.eval_split=0.0 \
--policy.path=./outputs/evo1-libero-stage1-g128-5k/checkpoints/005000/pretrained_model \
--policy.training_stage=stage2 \
--policy.apply_training_stage_defaults=true \
--policy.vlm_model_name="${VLM_DIR}" \
--policy.vlm_num_layers=14 \
--policy.dtype=float32 \
--policy.device=cuda \
--policy.use_amp=true \
--policy.use_flash_attn=true \
--policy.enable_gradient_checkpointing=true \
--policy.gradient_checkpointing_use_reentrant=false \
--policy.image_resolution='[448,448]' \
--policy.chunk_size=50 \
--policy.n_action_steps=50 \
--policy.max_state_dim=24 \
--policy.max_action_dim=24 \
--policy.dropout=0.2 \
--policy.optimizer_lr=1e-5 \
--policy.optimizer_weight_decay=1e-3 \
--policy.optimizer_grad_clip_norm=1.0 \
--policy.scheduler_warmup_steps=1000 \
--policy.push_to_hub=false \
--use_policy_training_preset=true \
--batch_size=64 \
--steps=80000 \
--resume=false \
--save_checkpoint=true \
--save_checkpoint_to_hub=false \
--save_freq=10000 \
--log_freq=10 \
--env_eval_freq=0 \
--num_workers=4 \
--prefetch_factor=2 \
--persistent_workers=true \
--seed=1000 \
--trackio.enable=false \
--output_dir=./outputs/evo1-libero-stage2-g128-80kПрофиль оценки в формате автора
Профиль EVO1 LIBERO в формате автора использует исходные имена камерных признаков LIBERO (observation.images.agentview_image и observation.images.robot0_eye_in_hand_image), пересчитывает план каждые 14 действий и бинаризирует команду захвата перед шагом симулятора. Постпроцессор политики EVO1 может обрезать дополненное до 24D действие до 7D пространства действий LIBERO и применить указанное бинарирование захвата. Чтобы оценить контрольную точку в формате автора в том же режиме «один эпизод на задачу», используйте исходные имена камер вместо отображения по умолчанию image/image2 и установите флаги постобработки действий LIBERO:
lerobot-eval \
--policy.path=your-org/your-evo1-libero-checkpoint \
--policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
--policy.device=cuda \
--policy.use_flash_attn=true \
--policy.n_action_steps=14 \
--policy.postprocess_action_dim=7 \
--policy.binarize_gripper=true \
--env.type=libero \
--env.task=libero_object \
--env.camera_name_mapping="{agentview_image: agentview_image, robot0_eye_in_hand_image: robot0_eye_in_hand_image}" \
--env.observation_height=448 \
--env.observation_width=448 \
--eval.batch_size=1 \
--eval.n_episodes=1Профиль Native lerobot/libero v3
Ревизия a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 хранит признаки камеры как image и image2. В этом примере оцениваются все десять задач LIBERO Object, при этом каждая задача запускается в отдельном процессе:
export MUJOCO_GL=egl
export PYOPENGL_PLATFORM=egl
suite=libero_object
horizon=280
for task_id in {0..9}; do
lerobot-eval \
--policy.path=zuoxingdong/evo1_libero \
--policy.pretrained_revision=515921f4a2c1d3f3ad523721eafa26fdf2af315b \
--policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
--policy.device=cuda \
--policy.use_amp=true \
--policy.dtype=bfloat16 \
--policy.use_flash_attn=false \
--policy.enable_gradient_checkpointing=false \
--policy.vlm_num_layers=14 \
--policy.image_resolution='[448,448]' \
--policy.max_text_length=1024 \
--policy.chunk_size=50 \
--policy.n_action_steps=14 \
--policy.max_state_dim=24 \
--policy.max_action_dim=24 \
--policy.num_inference_timesteps=32 \
--policy.postprocess_action_dim=7 \
--policy.binarize_gripper=true \
--policy.gripper_threshold=0.0 \
--policy.gripper_below_threshold_value=-1.0 \
--policy.gripper_above_threshold_value=1.0 \
--env.type=libero \
--env.task="${suite}" \
--env.task_ids="[${task_id}]" \
--env.camera_name=agentview_image,robot0_eye_in_hand_image \
--env.camera_name_mapping="{agentview_image: image, robot0_eye_in_hand_image: image2}" \
--env.control_mode=relative \
--env.obs_type=pixels_agent_pos \
--env.observation_width=448 \
--env.observation_height=448 \
--env.init_states=true \
--env.episode_length="${horizon}" \
--env.render_mode=rgb_array \
--env.max_parallel_tasks=1 \
--eval.n_episodes=50 \
--eval.batch_size=1 \
--eval.use_async_envs=false \
--eval.recording=false \
--seed=1000 \
--output_dir="./outputs/evo1-libero-stage2-70k-eval/${suite}/task-${task_id}" \
--job_name="evo1-libero-stage2-70k-${suite}-task-${task_id}"
doneЗапустите все десять идентификаторов задач для каждого набора с такими горизонтами:
env.task | env.episode_length |
|---|---|
libero_spatial | 280 |
libero_object | 280 |
libero_goal | 300 |
libero_10 | 520 |
Установите suite и horizon для каждой строки. Это даст 500 эпизодов на каждый набор и 2 000 эпизодов в целом, при этом создание нового процесса для каждой задачи в цикле соответствует измеренной топологии сброса ГПСЧ.
Ссылки
Лицензия
Эта интеграция LeRobot распространяется по лицензии Apache 2.0, используемой в LeRobot. Лицензии на опубликованные контрольные точки и данные см. на страницах моделей EVO1 и InternVL3.
Update on GitHub