LeRobot documentation

FineART-VLA

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

FineART-VLA

FineART-VLA основан на π0.5 от Physical Intelligence и его реализации openpi через политику Pi05 в LeRobot. Он расширяет эту основу обучаемой языковой головой PaliGemma и рантаймом, который чередует генерацию языка с генерацией действий. Одна контрольная точка может предсказывать низкоуровневую подзадачу, при необходимости обновлять память или отвечать на визуальные вопросы, а также использовать этот текст как условие для своего эксперта по действиям с flow-matching.

Используйте Pi05, если вам нужны только действия, обусловленные задачей. Используйте FineART-VLA, если политика должна генерировать или использовать промежуточный язык во время rollout.

Чем FineART-VLA отличается от Pi05

ВозможностьPi05FineART-VLA
Модель действийПрефикс vision-language PaliGemma + экспертная модель действий GemmaТа же базовая архитектура
Языковая головкаНе обучен для генерации во время выполненияВключено повторно и обучено с использованием кросс-энтропии текста
Условие на действиеЗадача эпизодаАктивная низкоуровневая подзадача и нормализованное состояние робота
Цели обученияДействия flow-matchingДействия потока, текст, выбранный рецептом, и необязательные токены действий FAST
Требования к набору данныхСтандартные изображения, состояние, действия и задачаТе же поля плюс языковые аннотации для каждого языкового навыка, которому вы обучаете
RolloutПрямая политика «задача-действие»Иерархический цикл «задача → подзадача → действие» с необязательной памятью и VQA

FineART-VLA может инициализироваться из контрольной точки Pi05. Архитектура политики остаётся совместимой, при этом FineART-VLA создаёт собственные процессоры, чтобы метки рецептов и метки FAST не заменялись молча стеком процессоров Pi05.

Установка

Установите LeRobot с зависимостями FineART-VLA:

git clone https://github.com/huggingface/lerobot.git
cd lerobot
python -m venv .venv
source .venv/bin/activate
pip install -e ".[fineart_vla]"

Дополнение fineart_vla включает зависимости PaliGemma/FAST. Для необязательных объединённых ядер обучения на Linux с CUDA-видеокартой установите ".[fineart_vla_kernels]" вместо него. Это добавляет liger-kernel и пакет kernels Hugging Face, используемый бэкендами FlashRT. Ядра FlashRT публикуются только для некоторых версий PyTorch; при отсутствии соответствующей сборки бэкенды FlashRT записывают предупреждение в журнал и переключаются на PyTorch. Liger включается опционально с помощью --policy.use_liger_kernels=true: он патчит PaliGemma RoPE/GeGLU в transformers для всего процесса, поэтому другие политики на базе PaliGemma, загруженные в том же процессе, также работают с объединёнными ядрами.

Подготовка данных с языковыми аннотациями

FineART-VLA не выводит контролируемые подзадачи из обычного набора данных LeRobot во время обучения. Набор данных должен содержать языковые цели, используемые выбранным рецептом, в необязательных столбцах language_persistent и language_events.

Минимально необходимо разметить непрерывную временную шкалу subtask, чтобы для каждого кадра обучения была активна низкоуровневая инструкция. Добавляйте разметку memory, VQA, вставок и речи только в том случае, если рецепт обучает этим возможностям.

FineART-VLA, как и EO-1, встраивает свой рецепт по умолчанию в FineARTVLAConfig. Он выбирает 30% для предсказания высокоуровневой задачи → подзадачи и 70% для обучения низкоуровневым действиям, обусловленным подзадачей. Каждая конфигурация содержит свой словарь рецептов, а сохранённые контрольные точки переносят этот словарь в процесс вывода.

Используйте --policy.recipe_path=/path/to/custom.yaml, чтобы переопределить значение по умолчанию. Общие рецепты в src/lerobot/configs/recipes/ сохраняют семантику ветки main; FineART-VLA не заменяет их. Для обучения только на целевых состояниях используйте встроенный рецепт с одним низкоуровневым пользовательским сообщением, содержащим ${task}, либо установите recipe=None и отключите потери text/FAST для стандартного конвейера PI05.

По умолчанию инференс факторизуется как π(a|o, subtask)·π(subtask|o, task). Для пользовательского рецепта совместной последовательности требуется соответствующий процессор во время выполнения, который отображает задачу и сгенерированный фрагмент ассистента с теми же каузальными маркерами, что и при обучении. Старый конструктор совместного промпта на стороне политики больше не используется в rollout.

Rollout управляет периодичностью планирования (--autosteer_interval_s=3), интерактивными командами и синхронным/RTC-расписанием. FineART-VLA генерирует текст только при запросе; обычные вызовы действий никогда не создают новый подзадачу за спиной рантайма.

Объединённые scratchpad-память и подзадачи не являются настройкой по умолчанию и требуют кастомного рецепта, а также контроллера рантайма с учётом памяти. Для обычной генерации подзадач оставляйте memory_scratchpad=false; старые checkpoint'и scratchpad сохраняют явную защиту от прямой передачи объединённых ответов в управление действиями.

Используйте lerobot-annotate для генерации этих столбцов. В репозитории есть запускатель Hugging Face Jobs, который можно отредактировать под ваши исходный и целевой датасеты. Для локального запуска аннотации сначала установите pip install -e ".[annotations]":

HF_TOKEN=hf_... uv run python examples/annotations/run_hf_job.py

Перед длительным запуском обучения проверьте несколько эпизодов и убедитесь, что подзадачи расположены в правильном временном порядке и охватывают всю демонстрацию. См. Конвейер аннотирования для генерации и валидации, а также Языковые столбцы и рецепты для схемы и резолвера рецептов.

If a dataset has no language columns, recipe rendering becomes a no-op and FineART-VLA falls back to the plain Pi05 prompt path. This is useful for compatibility but does not train the language planner.

Обучение FineART-VLA

В этом примере FineART-VLA инициализируется из lerobot/fineart_vla_base, контрольной точки, обученной на FineART для предсказания собственного следующего подзадания, и обучается встроенный рецепт подзаданий 70/30. Флаг --policy.path загружает конфигурацию самой базовой контрольной точки, поэтому при дообучении сохраняется структура токенов FAST (fast_skip_tokens) и рецепт, с которым обучалась базовая модель; остальные флаги --policy.* переопределяют её.

lerobot-train \
    --dataset.repo_id=${HF_USER}/my_language_annotated_dataset \
    --policy.path=lerobot/fineart_vla_base \
    --policy.tokenizer_max_length=256 \
    --policy.dtype=bfloat16 \
    --policy.device=cuda \
    --policy.freeze_vision_encoder=false \
    --policy.gradient_checkpointing=true \
    --batch_size=8 \
    --steps=30000 \
    --output_dir=outputs/fineart_vla \
    --job_name=fineart_vla \
    --trackio.enable=true

Начните с небольшого запуска и убедитесь в дашборде Trackio, что потери ведут себя ожидаемым образом, прежде чем масштабировать эксперимент.

Чтобы начать с исходного контрольного пункта PI0.5, оставьте конфигурацию FineART-VLA по умолчанию и укажите --policy.pretrained_path на него: --policy.type=fineart_vla --policy.pretrained_path=lerobot/pi05_base. Веса в формате OpenPI конвертируются при загрузке, а потери для текста и FAST начинаются с языковой головы PaliGemma, а не с промежуточного обучения FineART.

Основные параметры обучения

ПараметрПо умолчаниюНазначение
policy.recipe_pathNoneНеобязательное переопределение встроенного рецепта подзадач 70/30
policy.text_loss_weight1.0Вес кросс-энтропии для языковой головы; 0 отключает обучение текста
policy.flow_loss_weight10.0Вес потери потока непрерывных действий
policy.enable_fast_action_losstrueДобавляет дискретный надзор за токенами действий FAST
policy.fast_action_loss_weight1.0FAST-веса кросс-энтропии
policy.knowledge_insulationtrueБлокирует градиенты функции потерь действия через путь K/V VLM
policy.flow_num_repeats5Повторно использует один префикс VLM для независимых целей денойзинга
policy.lm_head_lr_scale1.0Масштабирует скорость обучения языковой головы; 1.0 использует базовую скорость
policy.fast_skip_tokens1152FAST id offset; пропускает <seg>+<loc>, чтобы VQA и FAST никогда не конфликтовали

fast_skip_tokens=1152 размещает коды FAST ниже диапазона <loc> модели PaliGemma. Согласно конвенции pi0-FAST в openpi, это значение равно 128 (FAST занимает идентификаторы <loc>); используйте это значение только для сохранения совместимости весов с чекпоинтами, обученными таким образом, и избегайте его сочетания с рецептом VQA, у которого цели <loc> разделяли бы строки эмбеддингов с кодами FAST.

Веса потерь являются отправными точками, а не константами, не зависящими от набора данных. Отслеживайте потерю потока и потери текста/FAST отдельно, а также анализируйте сгенерированные подзадачи, а не выбирайте контрольную точку только на основе общей потери.

FAST-токенизатор для конкретного набора данных

По умолчанию (--policy.auto_fit_fast_tokenizer=true) при обучении FAST-токенизатор подгоняется под обучающую выборку, начиная с --policy.action_tokenizer_name, и кэшируется в --policy.fast_tokenizer_cache_dir. Это также применяется при дообучении из контрольной точки, например lerobot/fineart_vla_base, чтобы целевые значения FAST соответствовали распределению действий нового робота. Подогнанный токенизатор сохраняется в артефактах процессора контрольной точки, поэтому при инференсе он переиспользуется. Установите --policy.auto_fit_fast_tokenizer=false, чтобы использовать action_tokenizer_name без изменений.

Производительность обучения

FineART-VLA по умолчанию использует оптимизированные пути обучения:

  • batches повторяет flow targets и suffix projections, вместо того чтобы воспроизводить мелкие операции в Python;
  • кэширует постоянные маски действий и вычисляет позиции RoPE один раз на каждый прямой проход;
  • выбирает реализацию кросс-энтропии text/FAST на основе целевой формы и разреженности;
  • пропускает математически неактуальное обратное распространение для VLM/зрительных моделей на батчах, изолированных по знаниям и содержащих только поток;
  • использует нативный не-реентерантный чекпоинтинг слоёв SigLIP, когда включён чекпоинтинг градиентов; и
  • сохраняет ядра Liger RoPE/GeGLU, избегая более медленного патча LayerNorm для форм SigLIP.

Необязательные бэкенды обучения отключены по умолчанию:

ПараметрКогда стоит попробовать
policy.use_flashrt_adarms=trueСквозное адаптивное RMSNorm и затворные остаточные связи на поддерживаемых GPU с CUDA
policy.use_compiled_text_ce=trueСкомпилированные бакеты материализованных логитов для CE
policy.use_compiled_vision=trueКомпиляция только визуальной части, когда в визуальном проходе нет градиентов
policy.use_flex_attention=trueПрофилированные конфигурации CUDA с изоляцией знаний и flow_num_repeats > 1; в противном случае используется SDPA
policy.use_manual_attention=trueЯвно профилированные формы, для которых материализованное внимание быстрее
policy.manual_attention_scope=actionОграничивает ручное внимание запросами действий

Не включайте все бэкенды бездумно. Flex и ручное внимание взаимоисключающи, а альтернативы attention/AdaRMS требуют изоляции знаний. Конфигурация с наилучшими результатами в бенчмарках использовала скомпилированный text CE и FlashRT AdaRMS, при этом Flex/ручное внимание и скомпилированное зрение были отключены.

Производительность инференса

FineART-VLA имеет два цикла вывода, и оба избегают многократного кодирования дорогостоящего мультимодального префикса:

  1. Action denoising кодирует префикс изображения/текста один раз, повторно использует его кэш KV на шагах потока, формирует маски для суффикса действий на устройстве и обрезает временные K/V суффикса вместо клонирования кэша префикса. Расписание временных шагов создаётся на устройстве один раз на чанк, сохраняя историческую арифметику временных шагов. Эта деталь реализации не гарантирует ускорения на всём пути без бенчмаркинга.
  2. Расшифровка языка использует авторегрессионное кэширование KV, поэтому каждый новый токен обрабатывает только сэмплированный токен по кэшированным ключам изображения/языка, а не пересчитывает весь префикс.

Общий runtime выполняет языковые модели и действия с разной частотой. Увеличьте --autosteer_interval_s, если подзадача остается актуальной дольше, или используйте /subtask, чтобы задать инструкцию напрямую без генерации языка. Более длинный интервал снижает стоимость генерации, но также замедляет повторное планирование.

Запуск контрольной точки

Используйте lerobot-rollout с конфигурацией робота/камеры, соответствующей контрольной точке, --interactive=true и --autosteer_interval_s=3. Выберите --inference.type=sync или --inference.type=rtc. В интерактивном терминале /autosteer <goal> включает генерацию подзадач, /subtask <instruction> позволяет задать одну подзадачу вручную, а /start запускает управление роботом. См. Интерактивное языковое управление для полной настройки оборудования, поведения в аварийных ситуациях и управления записью. Прежние параметры CLI адаптера --sim, --mode и --high_level_hz не входят в этот интерфейс.

Устранение неполадок

  • Крупные градиенты flow-loss: FineART-VLA выполняет KI-off совместное префиксное/действенное внимание на математическом бэкенде PyTorch SDPA с арифметикой внимания в FP32, приводя результат обратно к типу данных модели (стандартный PI0.5 сохраняет своё eager-внимание). Это позволяет избежать внимания с пониженной точностью, которое может дестабилизировать градиенты на малых временных шагах потока с большими активациями query/key. Существующие контрольные точки и слои нормализации не изменяются; KI-off по-прежнему обучается через ключи и значения VLM. Отслеживайте отдельные flow_loss, text_loss и норму градиента до обрезания, а не полагайтесь только на конечное общее значение потери.
  • Нет потери текста или сгенерированных подзадач: убедитесь, что выбранный рецепт может связать аннотации на выбранных кадрах и что policy.text_loss_weight > 0.
  • Подзадачи выглядят правдоподобно, но действия не срабатывают: проверьте границы подзадач, нормализованную статистику состояний и действий, а также наличие образцов низкоуровневых рецептов.
  • Текст сворачивается в повторяющиеся или токены местоположения: проверьте покрытие text-target, скорость обучения language-head и баланс между потерями flow, FAST и text.
  • Недостаточно памяти: сначала уменьшите размер батча, затем включите градиентный чекпоинтинг. Не включайте скомпилированные или альтернативные бэкенды внимания без профилирования их потребления памяти для вашего количества камер.
  • Медленное развёртывание: разделите задержку действий и задержку языка, затем настройте --autosteer_interval_s (частота генерации нового подзадания) и --policy.num_inference_steps (шаги денойзинга потока).

Цитирование

Если вы используете FineART-VLA или набор данных FineART, пожалуйста, укажите следующую ссылку:

@misc{choghari2026fineart,
  title  = {FineART: Fine-Grained Annotated Robotic Trajectory Dataset and Vision-Language-Action Model for Bimanual Manipulation},
  author = {Choghari, Jade and Kooijmans, Pepijn and Agarwal, Mansi and Ciftci, Yusuf Umut and Doriwala, Aseem and Weaver, Catherine and Sivapurapu, Mouli and Yang, Kai and Lee, Jackson and Wolf, Thomas and Mannam, Pragna},
  year   = {2026},
}

FineART-VLA основан на π₀.₅ и knowledge insulation от Physical Intelligence.

Лицензия

Эта модель распространяется по лицензии Apache 2.0 License, что соответствует исходному репозиторию OpenPI repository, на основе которого адаптирован базовый блок PI0.5.

Update on GitHub