LeRobot documentation
Политика π₀.₅ (Pi05)
Политика π₀.₅ (Pi05)
π₀.₅ — это модель Vision-Language-Action с обобщением на открытый мир от Physical Intelligence. Реализация в LeRobot адаптирована из их открытого репозитория OpenPI.
Обзор модели
π₀.₅ представляет собой значительное развитие π₀, разработанное Physical Intelligence для решения крупной задачи в робототехнике: обобщения в открытых средах. Хотя роботы способны выполнять впечатляющие задачи в контролируемых условиях, π₀.₅ спроектирован так, чтобы обобщаться на совершенно новые среды и ситуации, которые никогда не встречались во время обучения.
Проблема обобщения
Как объясняет Physical Intelligence, фундаментальная проблема заключается не в выполнении задач, требующих ловкости или проворства, а в генерализации — способности правильно выполнять задачи в новых условиях с новыми объектами. Представьте робота, убирающего в разных домах: в каждом доме разные объекты расположены в разных местах. Генерализация должна происходить на нескольких уровнях:
- Физический уровень: понимание того, как взять ложку (за ручку) или тарелку (за край), даже если объекты незнакомы и окружение загромождено
- Семантический уровень: понимание семантики задачи, куда положить одежду и обувь (в корзину для белья, а не на кровать) и какие инструменты подходят для уборки пролитых жидкостей
- Уровень среды: адаптация к «неупорядоченным» реальным условиям, таким как дома, продуктовые магазины, офисы и больницы
Совместное обучение на гетерогенных данных
Прорывной инновацией в π₀.₅ является совместное обучение на гетерогенных источниках данных. Модель обучается на:
- Мультимодальные веб-данные: генерация описаний изображений, визуальный вопросно-ответный диалог, обнаружение объектов
- Устные инструкции: люди направляют роботов в выполнении сложных задач пошагово
- Команды подзадач: семантические метки высокого уровня (например, «подними подушку» для неубранной кровати)
- Данные для роботов с разными корпусами: данные с различных роботизированных платформ, обладающих разными возможностями
- Данные из нескольких сред: статические роботы, развёрнутые в большом количестве различных домов
- Данные мобильной манипуляции: ~400 часов демонстраций мобильного робота
Эта разнообразная смесь для обучения формирует «учебную программу», которая позволяет обобщать знания одновременно на физическом, визуальном и семантическом уровнях.
Требования к установке
Установите LeRobot, следуя нашему Руководству по установке.
Установите зависимости Pi0.5, выполнив:
pip install -e ".[pi]"Если вы установили LeRobot из PyPI:
pip install 'lerobot[pi]'
Использование
Чтобы использовать π₀.₅ в вашей конфигурации LeRobot, укажите тип политики как:
policy.type=pi05Обучение
Быстрый старт на LIBERO
Довыучите базовую модель LIBERO на lerobot/libero, видеокодированной копии демонстраций объёмом ~1,9 ГБ, лежащей в основе результатов ниже.
Он содержит ключи, которые читает π₀.₅, и те же самые ключи, которые генерирует среда LIBERO во время оценки:
| Возможность | Форма в наборе данных | Как π₀.₅ потребляет его |
|---|---|---|
observation.images.image | 256×256×3, agentview | изменён размер до 224×224 |
observation.images.image2 | 256×256×3, запястье | изменён размер до 224×224 |
observation.state | 8 | дискретизованы в 256 бинов и записываются в промпт |
action | 7 | внутренне дополняется до 32; в функции потерь используются первые 7 измерений |
Здесь не требуется --rename_map — ключи уже совпадают; если ваши отличаются, см. Rename Map and Empty Cameras.
π₀.₅ uses the gated [google/paligemma-3b-pt-224](https://huggingface.co/google/paligemma-3b-pt-224) tokenizer — accept its license on the Hub and log in with `hf auth login` before training.
Рассчитано на один GPU с 80 ГБ памяти:
lerobot-train \
--dataset.repo_id=lerobot/libero \
--policy.type=pi05 \
--policy.pretrained_path=lerobot/pi05_libero_base \
--policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}' \
--policy.n_action_steps=10 \
--policy.empty_cameras=1 \
--policy.freeze_vision_encoder=false \
--policy.train_expert_only=false \
--policy.gradient_checkpointing=true \
--policy.dtype=bfloat16 \
--policy.device=cuda \
--policy.push_to_hub=false \
--output_dir=./outputs/pi05_libero \
--job_name=pi05_libero \
--batch_size=64 \
--num_workers=8 \
--steps=30000 \
--save_freq=5000 \
--seed=1000Нормализация по среднему/стандартному отклонению, а не по умолчанию по квантилям для π₀.₅ — в соответствии с pi05_libero_finetuned_v044, чекпоинтом, на котором были получены приведённые ниже результаты.
--policy.n_action_steps=10 и --policy.empty_cameras=1 указаны явно, так как --policy.pretrained_path загружает только веса — lerobot/pi05_libero_base хранит оба параметра, и в противном случае они приняли бы значения по умолчанию 50 и 0 (см. Загрузка контрольной точки).
Затем оцените контрольную точку с помощью lerobot-eval и сравните с эталонными показателями успешности — см. LIBERO.
Статистика квантилей
π₀.₅ нормализует STATE и ACTION с помощью квантилей, поэтому в файле meta/stats.json вашего набора данных должны присутствовать q01 и q99. В более старых наборах данных есть только min/max/mean/std, и обработка падает на первой партии:
ValueError: QUANTILES normalization mode requires q01 and q99 statsПересчитайте их:
lerobot-edit-dataset \
--repo_id your_dataset \
--new_repo_id your_dataset \
--operation.type recompute_stats \
--operation.overwrite trueРезультат сохраняется в $HF_LEROBOT_HOME/your_dataset, а не в кэше, который читает --dataset.repo_id — поэтому обучайте модель с параметром --dataset.root=$HF_LEROBOT_HOME/your_dataset или добавьте --push_to_hub true выше.
Или оставьте набор данных как есть и передайте --policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}'.
Запись, возобновление и объединение агрегированных квантилей из сводок по эпизодам, чтобы в meta/stats.json в итоге хранилась консервативная огибающая (min для q <= 50, max для q > 50), а не квантили по всему набору данных. Для оценки последних просканируйте каждый эпизод с использованием накопительной гистограммы:
python src/lerobot/scripts/augment_dataset_quantile_stats.py \
--repo-id=your_dataset \
--overwrite \
--skip-images--skip-images сохраняет существующую статистику изображений и позволяет избежать загрузки или декодирования видеоданных, если требуется пересчитать только STATE/ACTION, а --root читает локальный датасет вместо Hub. Эти значения являются гистограммными оценками, подверженными ошибкам дискретизации и ребиннинга, поэтому они могут отличаться от консервативных — что изменяет нормализованные целевые значения π₀.₅ и, следовательно, масштаб его функции потерь. Статистика, уже сохранённая внутри существующей контрольной точки, не затрагивается.
Пример команды обучения
Тот же самый дообучение с замороженной VLM: меньше памяти, но с некоторым снижением успешности. Замените --dataset.repo_id на идентификатор вашего набора данных.
lerobot-train \
--dataset.repo_id=lerobot/libero \
--policy.type=pi05 \
--policy.pretrained_path=lerobot/pi05_libero_base \
--policy.normalization_mapping='{"ACTION": "MEAN_STD", "STATE": "MEAN_STD", "VISUAL": "IDENTITY"}' \
--policy.n_action_steps=10 \
--policy.empty_cameras=1 \
--policy.freeze_vision_encoder=true \
--policy.train_expert_only=true \
--policy.gradient_checkpointing=true \
--policy.dtype=bfloat16 \
--policy.device=cuda \
--policy.push_to_hub=false \
--output_dir=./outputs/pi05_libero_expert \
--job_name=pi05_libero_expert \
--batch_size=64 \
--num_workers=8 \
--steps=30000 \
--save_freq=5000 \
--seed=1000Ключевые параметры обучения
--policy.compile_model=true: Включает компиляцию модели для ускорения обучения--policy.gradient_checkpointing=true: значительно снижает потребление памяти во время обучения--policy.dtype=bfloat16: Используйте обучение с смешанной точностью для повышения эффективности--batch_size=64: Размер батча для обучения, настройте его в зависимости от памяти вашей GPU--policy.pretrained_path=lerobot/pi05_base: Базовая модель π₀.₅, которую вы хотите дообучить. Доступные варианты:- lerobot/pi05_base
- lerobot/pi05_libero_base (специально обучен на наборе данных Libero)
--policy.optimizer_fused=true: Использует слиянный AdamW для более быстрых шагов оптимизатора; этот флаг игнорируется при возобновлении запуска
Необязательный RTC на этапе обучения
Pi05 может по желанию обучаться условному управлению с префиксом действий для эффективного Real-Time Chunking, следуя подходу Training-Time Action Conditioning for Efficient Real-Time Chunking.
Установите policy.rtc_training_max_delay в значение наибольшего ожидаемого задержки вывода в
шагах контроллера:
lerobot-train \
--dataset.repo_id=${HF_USER}/my_dataset \
--policy.type=pi05 \
--policy.pretrained_path=lerobot/pi05_base \
--policy.rtc_training_max_delay=10 \
--policy.dtype=bfloat16 \
--policy.device=cuda \
--batch_size=8 \
--steps=30000 \
--output_dir=outputs/pi05_rtc \
--job_name=pi05_rtcПо умолчанию установлено значение 0, что отключает RTC на этапе обучения и оставляет стандартную целевую функцию Pi05 без изменений. Настроенная задержка должна быть меньше chunk_size. Во время обучения Pi05 независимо для каждого примера выбирает длину чистого префикса и вычисляет потерю потока только для оставшейся постфиксной части.
Используйте полученный контрольный пункт с обученным RTC явно:
lerobot-rollout \
--strategy.type=base \
--policy.path=outputs/pi05_rtc/checkpoints/last/pretrained_model \
--inference.type=rtc \
--inference.rtc.mode=trained \
--inference.rtc.execution_horizon=10 \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--task="pick up the cube" \
--fps=50 \
--device=cudaУстановите inference.rtc.execution_horizon между rtc_training_max_delay контрольной точки и chunk_size - rtc_training_max_delay, а inference.queue_threshold — не менее rtc_training_max_delay. Единичный всплеск задержки за пределами обученного диапазона приводит к отбрасыванию данного чанка и повторной попытке; rollout останавливается с явной ошибкой только в том случае, если задержка остаётся вне диапазона. По умолчанию --inference.rtc.mode=guided по-прежнему доступен для обычных контрольных точек.
Загрузка контрольной точки
Эти две формы не взаимозаменяемы:
--policy.path | --policy.pretrained_path | |
|---|---|---|
| Загрузки | веса и файл config.json контрольной точки | только веса |
| Имена признаков | из контрольной точки | из вашего набора данных, после --rename_map |
Сохранённые настройки, например n_action_steps | наследуемый | сбросить значения по умолчанию |
--policy.type | должен быть опущен | обязательный |
--rename_map | нужен, когда ваши ключи камеры отличаются | поддерживается для канонизации ключей набора данных |
Используйте --rename_map в любом из форматов загрузки, если имена признаков исходного набора данных отличаются от имён признаков политики. Например, команда дообучения RoboMME сопоставляет исходные столбцы image, wrist_image, state и actions, инициализируя веса с помощью --policy.pretrained_path.
Параметры обучения
| Параметр | По умолчанию | Описание |
|---|---|---|
freeze_vision_encoder | false | Не замораживайте визуальный энкодер |
train_expert_only | false | Не замораживайте VLM, обучайте все параметры |
💡 Совет: установка train_expert_only=true замораживает VLM и обучает только action expert и проекции, что позволяет выполнять дообучение с меньшим потреблением памяти.
Память наблюдений с коротким горизонтом (MEM)
Pi05 может по желанию использовать контекст визуальных и проприоцептивных данных с коротким горизонтом на основе MEM. Оба пути отключены по умолчанию, поэтому существующие контрольные точки и команды обучения сохраняют поведение Pi05 с одним кадром.
Это реализует только краткосрочную память MEM — видеовидеоконкодер из раздела III-C и проприоцептивную проекцию из раздела III-D. Долгосрочная языковая память MEM (раздел III-B), в которой высокоуровневая политика предсказывает следующее подзадание и сжатое резюме на естественном языке о том, что произошло до сих пор, не реализована. В абляциях из статьи только видеопомнит восстанавливает лишь часть прогресса в задачах полного MEM на долгосрочных задачах.
Введение памяти при дообучении из контрольной точки, предобученной без неё, также соответствует более слабому варианту
MEM-Posttrain-Onlyиз статьи. Основные результаты MEM получены путём предобучения видеоконвейера на разнообразной смеси роботизированных и нероботизированных видео, что в настоящее время не обеспечивает ни одна публичная контрольная точка Pi05.
Включите его при дообучении с помощью:
lerobot-train \
--dataset.repo_id=your_dataset \
--policy.type=pi05 \
--policy.pretrained_path=lerobot/pi05_base \
--policy.use_visual_memory=true \
--policy.memory_frames=6 \
--policy.memory_stride=30 \
--policy.memory_temporal_attention_every=4 \
...memory_frames включает текущее наблюдение. memory_stride измеряется в кадрах датасета, а не в секундах, поэтому масштабируйте его с учётом fps вашего датасета: MEM
предобучается на шести наблюдениях с интервалом в одну секунду, что соответствует memory_stride=30 для
датасета с частотой 30 fps (значение по умолчанию), но memory_stride=10 для датасета с частотой 10 fps, например lerobot/robomme.
Каждый четвёртый слой SigLIP заменяет своё внимание на составное пространственно-временное внимание MEM: причинно-следственное временное внимание между соответствующими токенами патчей, составленное со стандартным пространственным вниманием и переиспользующее предобученные проекции, так что в башню зрения не добавляются обучаемые параметры. Токены прошлых кадров отбрасываются после выполнения последнего такого слоя, что сохраняет неизменной длину префикса для последующего языкового/действенного блока.
Недоступная история в начале эпизода дополняется и маскируется. Во время инференса Pi05 внутренне поддерживает ту же историю изображений с шагом и очищает её каждый раз при сбросе политики.
Историческая проприоцепция — это независимый вариант:
--policy.use_proprioceptive_memory=trueПри включении для каждого сохраняемого кадра добавляется один проекционный токен непрерывного состояния, а дискретизованное состояние удаляется из текстового промпта, чтобы состояние было представлено ровно один раз (раздел III-D MEM). Это изменяет формат промпта, поэтому включайте эту опцию с начала обучения, а не на середине. Визуальная и проприоцептивная память используют одни и те же настройки memory_frames и memory_stride, но любой из путей можно включить независимо. Обучайте или дообучайте модель с выбранными опциями памяти; включение этих опций только на этапе инференса не обеспечит поведение, характерное для чекпоинта, обученного на одном кадре.
В рамках PEFT proprio_history_proj обучается и сохраняется полностью через modules_to_save, поскольку у него нет предобученных весов для адаптации.
На этапе инференса MEM поддерживает одну батчевую очередь истории и предполагает, что все строки батча разделяют границы эпизодов. lerobot-eval обеспечивает это, вызывая policy.reset() перед каждым батчевым роллаутом и перед сбросом векторного окружения. Независимый автосброс строк в асинхронном векторном батче не поддерживается; начните новый роллаут, чтобы полные очереди политики и действий были сброшены вместе.
Относительные действия
По умолчанию π₀.₅ предсказывает абсолютные действия. Вы можете включить относительные действия, чтобы модель предсказывала смещения относительно текущего состояния робота. Это может повысить стабильность обучения для определённых конфигураций.
Чтобы использовать относительные действия, сначала пересчитайте статистику набора данных в относительном пространстве через CLI:
lerobot-edit-dataset \
--repo_id your_dataset \
--new_repo_id your_dataset \
--operation.type recompute_stats \
--operation.overwrite true \
--operation.relative_action true \
--operation.chunk_size 50 \
--operation.relative_exclude_joints "['gripper']" \
--push_to_hub trueИли эквивалентно на Python:
from lerobot.datasets import LeRobotDataset, recompute_stats
dataset = LeRobotDataset("your_dataset")
recompute_stats(dataset, relative_action=True, chunk_size=50, relative_exclude_joints=["gripper"])
dataset.push_to_hub()chunk_size должен совпадать с chunk_size вашей политики (по умолчанию 50 для π₀.₅). relative_exclude_joints содержит имена суставов, которые должны оставаться в абсолютном пространстве (например, команды захвата). Используйте --push_to_hub true, чтобы загрузить обновлённую статистику в Hub.
Затем обучите модель с включёнными относительными действиями:
lerobot-train \
--dataset.repo_id=your_dataset \
--policy.type=pi05 \
--policy.use_relative_actions=true \
--policy.relative_exclude_joints='["gripper"]' \
...Результаты производительности
Результаты бенчмарка Libero
π₀.₅ продемонстрировал высокие результаты на наборе бенчмарков Libero. Для сравнения и проверки реализации LeRobot мы дообучили базовую модель libero на дополнительных 6k шагов на датасете Libero и сравнили результаты с эталонными результатами OpenPI.
| Бенчмарк | Реализация LeRobot | Справочник OpenPI |
|---|---|---|
| Libero Spatial | 97.0% | 98.8% |
| Libero Object | 99.0% | 98.2% |
| Цель Libero | 98.0% | 98.0% |
| Libero 10 | 96.0% | 92.4% |
| Среднее | 97.5% | 96.85% |
Эти результаты демонстрируют высокую способность модели π₀.₅ к обобщению на разнообразных задачах манипуляции роботами. Чтобы воспроизвести эти результаты, следуйте инструкциям в разделе Libero.
Лицензия
Эта модель распространяется по лицензии Apache 2.0 License, что соответствует исходному репозиторию OpenPI.
Update on GitHub