LeRobot documentation

VLA-JEPA

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

VLA-JEPA

Это порт VLA-JEPA для LeRobot — модели Vision-Language-Action, которая объединяет языковую основу Qwen3-VL, самообучаемую модель мира для видео (V-JEPA2) и головку действий flow-matching DiT.


Обзор архитектуры

VLA-JEPA состоит из трёх основных компонентов:

КомпонентМодульРоль
Базовая модель Qwen3-VLQwen3VLInterfaceОбъединяет изображения и языковую инструкцию в контекстные токены
Голова действий DiT-BVLAJEPAActionHeadДиффузия с потоковым согласованием для чанка действий
Мировая модель V-JEPA2ActionConditionedVideoPredictorПотери самообучающегося предсказания видео (только для обучения)

Поток данных

Обучение:

  1. Видеоклип из num_video_frames кадров кодируется V-JEPA2 в токены патчей для каждого кадра.
  2. Базовая модель Qwen3-VL обрабатывает изображения с нескольких ракурсов + инструкцию к задаче и формирует последовательность контекстных токенов, включающую специальные токены действий (для настройки мировой модели) и токены воплощения.
  3. Голова действий получает эти токены контекста в качестве ключей и значений для кросс-внимания и предсказывает очищенный от шума блок действий с помощью flow matching.
  4. Предиктор мировой модели использует токены действий, извлечённые из Qwen, для предсказания будущих эмбеддингов кадров V-JEPA2; к потере действий добавляется регрессионная потеря для этих предсказаний.

Вывод: используются только Qwen и головка действий. Модель мира на этапе вывода не требуется.

Детали action head

Доступные пресеты через action_model_type:

ПресетГоловыРазмер головы
DiT-B1264
DiT-L3248

Пресет задаёт только геометрию внимания, и каждую запись можно переопределить с помощью action_num_heads / action_attention_head_dim. Из неё следуют две ширины:

  • внутренняя ширина DiT равна heads x head_dim (768 для DiT-B), она вычисляется, а не настраивается;
  • Ширина выхода DiT, а также ширина MLP-блоков декодера действий и энкодера состояния, задается параметром action_hidden_size (по умолчанию 1024).

Так DiT-B использует трансформер шириной 768, который проецируется в 1024. Эти два значения независимы.

Детали модели мира

Видео-предиктор представляет собой трансформер в стиле ViT (ActionConditionedVideoPredictor), который принимает:

  • Токены кадров: эмбеддинги патчей V-JEPA2, спроецированные в predictor_embed_dim
  • Токены действий: эмбеддинги токенов действий Qwen, спроецированные в predictor_embed_dim

Он использует блочно-каузальное внимание, благодаря которому каждый временной шаг может обращать внимание на все предыдущие шаги. Входное значение embed_dim предсказателя равно num_views × video_encoder_hidden_size (например, 2 вида × 1024 = 2048 для предобученных контрольных точек).


Предобученные контрольные точки

Внутри организации LeRobot здесь доступны три контрольные точки: lerobot/VLA-JEPA, сконвертированные из ginwind/VLA-JEPA:

ЧекпоинтНабор данныхКамерыМировая модельРазмерность действия
lerobot/VLA-JEPA-LIBEROLIBERO-102 (agentview + wrist)Включено7
lerobot/VLA-JEPA-PretrainDROID 1.0.12 (виды с левой стороны)Включено7
lerobot/VLA-JEPA-SimplerEnvOXE Bridge / RT-11 (дублируется ×2)Включено7

Все контрольные точки используют Qwen/Qwen3-VL-2B-Instruct в качестве языковой основы.


Конфигурация

Ключевые параметры в VLAJEPAConfig:

ПараметрПо умолчаниюОписание
chunk_size7Количество действий, предсказанных за один вызов инференса
n_action_steps7Шаги, выполненные из предсказанного фрагмента до повторного планирования
num_video_frames8Длина видеоклипа, передаваемая в мировую модель
enable_world_modelTrueЗагружать ли и обучать предиктор V-JEPA2
world_model_loss_weight0.1Вес функции потерь предсказания JEPA относительно функции потерь действия
causal_world_model_contextFalseКодировать контекст мировой модели каузально (один проход V-JEPA2 только с префиксом на каждую позицию контекста), чтобы двунаправленное внимание не могло «утечь» будущими кадрами во вход предиктора. Стоимость — t_enc_ctx дополнительных вызовов энкодера
num_inference_timesteps4Шаги интегрирования Эйлера для удаления шума из действия
freeze_qwenFalseЗаморозьте базовую модель Qwen3-VL и обучайте только головку действий
reinit_modulesNoneКлючевые префиксы, которые разрешено случайно переинициализировать при загрузке (для переноса между разными воплощениями, см. Доработка на другом воплощении)
resize_images_toNone(height, width) — размер, к которому каждый кадр камеры приводится перед передачей в визуальную башню Qwen3-VL. Значение None сохраняет исходное разрешение, при этом количество патчей в Qwen3-VL растёт вместе с ним, поэтому камера с разрешением 720x1280 может исчерпать память GPU. В опубликованных контрольных точках используется [224, 224]
gripper_dim6Индекс измерения захвата в векторе действия. Игнорируется, если gripper_joint_names совпадает с именем действия в наборе данных
gripper_joint_names["gripper"]Имена измерений действий, идентифицирующие захват; совпавший индекс имеет приоритет над gripper_dim
gripper_threshold0.5Порог, используемый в pre_snap_gripper_action и binarize_gripper_action. Обратите внимание, что binarize выполняется после денормализации, поэтому сравнение происходит с физическим значением захвата
pre_snap_gripper_actionFalseПриведите значение gripper dim к {0, 1} перед денормализацией. Специфично для LIBERO, см. ниже
binarize_gripper_actionFalseБинаризируйте размер захвата в {-1, 1} после денормализации. Специфично для LIBERO, см. ниже
clip_normalized_actionsTrueОбрезка нормализованных действий до диапазона [-1, 1] перед денормализацией. Применяется только в том случае, если ACTION использует MIN_MAX; игнорируется (с предупреждением) при использовании MEAN_STD, где это привело бы к обрезке на уровне 1 сигма
world_model_num_viewsNoneКамера, для которой предназначен предиктор world-model. Закодирована в формах контрольных точек. None переключается на jepa_tubelet_size, что соответствует значениям, закодированным в опубликованных контрольных точках

pre_snap_gripper_action и binarize_gripper_action — это порт цикла оценки LIBERO из starVLA, и они корректны только для конвенции действий LIBERO. pre_snap записывает {0, 1} в пространство normalized, денормализатор отображает эти значения на середину и максимум диапазона, а затем binarize сравнивает это physical значение с gripper_threshold (0.5). Если захват измеряется в градусах, мм или в диапазоне [0, 100], оба значения окажутся выше порога, и управляющий сигнал захвата станет константой. По этой причине по умолчанию они установлены в False; включайте их только для конфигураций в стиле LIBERO, и при этом задавайте gripper_threshold в собственных единицах захвата. Фабрика процессоров выводит предупреждение, если статистика датасета показывает, что диапазон не может работать.


Обучение

Количество шагов обучения может варьироваться в зависимости от размера набора данных и вычислительного бюджета. В исходной статье модель предварительно обучалась на 50k шагов на ssv2 + droid совместно, затем на дополнительные 30k шагов на LIBERO, однако при дообучении из предоставленных предварительно обученных контрольных точек хорошее качество может быть достигнуто за меньшее количество шагов.

Полная обучение с нуля

lerobot-train \
  --policy.type=vla_jepa \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=your_org/your_dataset

Доработка из предварительно обученной контрольной точки

lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=your_org/your_dataset

Если вы хотите заморозить базовую модель Qwen и обучать только головку действий, установите policy.freeze_qwen=True:

lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --policy.freeze_qwen=true \
  --dataset.repo_id=your_org/your_dataset

Доподнастройка на другом воплощении

Если целевой робот имеет другую размерность действий или состояний, чем предобученная контрольная точка, слои проекции входа/выхода в action head будут иметь несовпадающие формы и не смогут быть загружены напрямую. reinit_modules позволяет указать префиксы ключей, для которых допустимо несовпадение форм — эти слои будут случайным образом переинициализированы, тогда как все остальные веса будут переиспользованы из контрольной точки. Любое несовпадение форм вне указанных префиксов приводит к ошибке.

Слои, зависящие от action_dim и state_dim:

СлойПрефикс ключа
Кодировщик действий (action_dim → inner_dim)model.action_model.action_encoder
Декодер действий (hidden_size → action_dim)model.action_model.action_decoder
Кодировщик состояния (state_dim → inner_dim)model.action_model.state_encoder
lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --policy.freeze_qwen=true \
  --policy.reinit_modules='["model.action_model.action_encoder", "model.action_model.action_decoder", "model.action_model.state_encoder"]' \
  --dataset.repo_id=your_org/your_dataset

Если у вашего робота нет проприоцептивного состояния, опустите model.action_model.state_encoder из списка.

Воспроизведение результатов LIBERO

Обучение на LIBERO: запускает обучение с контрольной точки Pretrain, обучает модель в течение 30k шагов на наборе данных LIBERO. В исходной статье упоминается обучение на 8 GPU с размером батча 32, что означает глобальный размер батча 256.

lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=HuggingFaceVLA/libero \
  --steps=30000

Оценка предобученного контрольного файла LIBERO-10:

lerobot-eval \
  --policy.path=lerobot/VLA-JEPA-LIBERO \
  --env.type=libero \
  --env.task=libero_spatial,libero_object,libero_goal,libero_10 \
  --eval.n_episodes=10 \
  --eval.batch_size=5

Для оценки только подмножества задач:

lerobot-eval \
  --policy.path=lerobot/VLA-JEPA-LIBERO \
  --env.type=libero \
  --env.task=libero_10 \
  --env.task_ids='[0,1,2]' \
  --eval.n_episodes=10 \
  --eval.batch_size=5

Ожидаемые результаты:

SuiteЭпизодыУспехиУровень успеха
libero_spatial1009395.0%
libero_object100100100.0%
libero_goal1009898.0%
libero_101009693.0%
Общее40038796.5%

Допобучение на наборах данных с разным количеством камер

Предобученный предиктор мировой модели обучался с embed_dim = world_model_num_views × 1024, то есть с двумя камерными видами.

Количество кадров в этом представлении ранее читалось из jepa_tubelet_size, который также задавал размер временного tubelet в кодере JEPA. Теперь для этого используется поле world_model_num_views; если оставить его равным None, значение будет взято из jepa_tubelet_size, чтобы опубликованные контрольные точки продолжали загружаться без изменений.

Поведение по умолчанию — просмотр отступов / обрезки (действия не требуются)

При дообучении из VLA-JEPA-Pretrain модель автоматически настраивает количество представлений, подаваемых в мировую модель, в соответствии с world_model_num_views:

  • Наборы данных с одним видом (например, BridgeV2): латентное представление одного вида дублируется для создания входных данных модели мира с двумя видами, что сохраняет самонастраивающийся сигнал JEPA без какого-либо рассогласования весов.
  • >Датасеты с более чем 2 видами (например, DROID с 3 видами): все виды передаются в Qwen backbone (для более богатого контекста), но для world model используются только первые world_model_num_views виды (один вид с запястья и один вид от третьего лица, в соответствии с заданным порядком видов).

Вариант 1 — отключить world model

Установите enable_world_model=False, чтобы полностью пропустить потерю JEPA. Загружаются и обучаются только базовая модель Qwen и головная часть для действий. Этого достаточно для хорошей производительности действий.

lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.enable_world_model=false \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=your_org/single_camera_dataset

Вариант 2 — Переинициализация проекции входа предсказателя

Если вы хотите изменить world_model_num_views на значение, отличное от 2, загрузите контрольную точку с strict=False и заново инициализируйте model.video_predictor.predictor_embed для нового embed_dim. Все остальные веса блоков предсказателя (внимание, MLP, нормализация, выходная проекция) не зависят от количества камер и могут быть переиспользованы из предобученной контрольной точки.


Цитирование

@misc{sun2026vlajepaenhancingvisionlanguageactionmodel,
  title         = {VLA-JEPA: Enhancing Vision-Language-Action Model with Latent World Model},
  author        = {Jingwen Sun and Wenyao Zhang and Zekun Qi and Shaojie Ren and Zezhi Liu and Hanxin Zhu and Guangzhong Sun and Xin Jin and Zhibo Chen},
  year          = {2026},
  eprint        = {2602.10098},
  archivePrefix = {arXiv},
  primaryClass  = {cs.RO},
  url           = {https://arxiv.org/abs/2602.10098},
}

Лицензия

Веса распространяются на условиях лицензии исходного репозитория ginwind/VLA-JEPA (Apache 2.0 License). Код интеграции LeRobot распространяется по лицензии Apache 2.0 License.

Update on GitHub