LeRobot documentation

EVO1

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

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