LeRobot documentation

EVO1

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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.

Требования к установке

  1. Установите LeRobot, следуя Руководству по установке.

  2. Установите зависимости EVO1:

    pip install -e ".[training,evo1]"

    Для обучения и оценки LIBERO также установите дополнительный пакет LIBERO:

    pip install -e ".[training,evo1,libero]"
  3. Устанавливайте колесо 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.state
  • action
  • Инструкция языковой задачи в поле 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_nameOpenGVLab/InternVL3-1B-hfПроверочная точка InternVL3 или локальный каталог модели, преобразованные нативно
policy.training_stagestage1stage1 обучает головку действий; stage2 дообучает ветви VLM
policy.apply_training_stage_defaultstrueПовторно применяет значения по умолчанию для дообучения этапа после загрузки контрольной точки
policy.vlm_num_layers14Количество языковых слоев InternVL3, сохраняемых для политики
policy.dtypebfloat16Запрошенный dtype VLM
policy.use_flash_attntrueЗапрашивает FlashAttention при его установке; в противном случае использует резервный вариант
policy.enable_gradient_checkpointingtrueВключает чекпоинтинг для поддерживаемых модулей InternVL3
policy.gradient_checkpointing_use_reentrantfalseПараметр reentrant, передаваемый в gradient checkpointing при его поддержке
policy.chunk_size50Количество предсказываемых будущих действий на чанк
policy.n_action_steps50Количество действий, извлечённых из выборки
policy.max_state_dim24Размер измерения отступов
policy.max_action_dim24Размер отступов для действий
policy.postprocess_action_dimnullНеобязательное измерение действия, возвращаемое после постобработки EVO1
policy.binarize_gripperfalseБинаризирует канал захвата после постобработки для оценки в стиле LIBERO
policy.task_fieldtaskПоле батча, используемое в качестве языкового промпта

Вывод

Попробуйте это на обученном чекпоинте 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. Для оценки чистого скачивания использовалась ревизия LeRobot e40b58a8dfa9e7b86918c374791599d070518d11.

Одиночный запуск контрольной точки Stage-2 на шаге 70 000 дал:

SuiteУспешные эпизодыЭпизодыУспешность
LIBERO Spatial48550097.0%
LIBERO Object49650099.2%
LIBERO Цель48350096.6%
LIBERO-1046950093.8%
Общее1,9332,00096.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.taskenv.episode_length
libero_spatial280
libero_object280
libero_goal300
libero_10520

Установите suite и horizon для каждой строки. Это даст 500 эпизодов на каждый набор и 2 000 эпизодов в целом, при этом создание нового процесса для каждой задачи в цикле соответствует измеренной топологии сброса ГПСЧ.

Ссылки

Лицензия

Эта интеграция LeRobot распространяется по лицензии Apache 2.0, используемой в LeRobot. Лицензии на опубликованные контрольные точки и данные см. на страницах моделей EVO1 и InternVL3.

Update on GitHub