LeRobot documentation

FLUX 3 Action

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.7.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

FLUX 3 Action

FLUX 3 Action предсказывает действия робота на основе наблюдений с камер, состояния и инструкции к задаче. Замороженные Video VAE и текстовый энкодер подают данные диффузионному трансформеру, который предсказывает латенты видео и блоки действий; на этапе инференса возвращаются только действия. LeRobot поддерживает инференс и PEFT: LoRA адаптирует ствол модели, в то время как головы действий и условий робота обучаются полностью.

Мы предоставляем flux-3-action-base в качестве базовой модели действий, а также дообученные версии для роботов SO-101 flux-3-action-so101 и Franka Panda flux-3-action-droid (дообученные на датасете DROID). Центральный пример здесь — адаптация задачи с помощью LoRA на основе модели flux-3-action-so101.

Для обучения новой роботизированной конфигурации на основе базовой модели или полного дообучения используйте наш отдельный репозиторий flux-action.

Установка

Video VAE требует NATTEN версии 0.21.6 или новее, в виде wheel-пакета, собранного для ваших точных версий torch и CUDA, с сайта https://whl.natten.org. NATTEN публикует wheel-пакеты для torch 2.10–2.13, но пока не для torch 2.15, который LeRobot устанавливает по умолчанию, поэтому сначала установите поддерживаемую версию torch. Например, из репозитория LeRobot установите torch 2.13 с CUDA 13.0 вместе с зависимостями для обучения, policy, PEFT и EMA. Как и в руководстве по установке, TorchCodec устанавливается из CPU-индекса:

pip install --index-url https://download.pytorch.org/whl/cu130 \
    'torch==2.13.0+cu130' 'torchvision==0.28.0+cu130' 'numpy>=2.0,<2.3'
pip install --index-url https://download.pytorch.org/whl/cpu 'torchcodec==0.13.0+cpu'
pip install -e ".[training,flux3,peft,diffusion]" \
    'torch==2.13.0+cu130' 'torchvision==0.28.0+cu130' 'torchcodec==0.13.0+cpu'
pip install 'natten==0.21.7+torch2130cu130' --find-links https://whl.natten.org

Для драйвера NVIDIA старше 580.65 используйте сборку CUDA 12.6: индекс cu126, теги +cu126 для torch и torchvision, а также natten==0.21.7+torch2130cu126. Для другой версии torch используйте колесо NATTEN с соответствующим тегом, например natten==0.21.6+torch2110cu130 для torch 2.11 с CUDA 13.0.

Адаптация задачи SO-101

Используйте датасет LeRobot v3 с частотой 30 Гц, содержащий шесть каналов абсолютных командных действий и шесть каналов измеренного состояния в соответствующем порядке и единицах измерения для суставов. Захватчик (gripper) указывается последним. Предоставляйте необработанные значения, согласованную калиброботу и инструкции в task.

Камеры

Имена, количество и расположение камер настраиваются. В пакете SO-101 две камеры названы по тому, что они показывают:

КамераКлюч
Сценаobservation.images.scene
Запястьеobservation.images.wrist

SO-101 scene camera (left) and wrist camera (right), showing the blue box and container

Вы можете использовать --rename_map, чтобы сопоставить имена камер с ожидаемыми ключами, например:

--rename_map='{"observation.images.top":"observation.images.scene","observation.images.gripper_cam":"observation.images.wrist"}'

Используйте то же самое сопоставление для rollout; для совпадающих ключей карта не требуется. См. карты переименования.

Загрузка и обучение

Загрузите политику SO-101 из black-forest-labs/flux-3-action-so101. Сохранённая конфигурация автоматически загружает общие VAE и текстовый энкодер из закреплённой реvisions black-forest-labs/flux-3-action-base. Если доступ ограничен, выполните аутентификацию с помощью hf auth login, используя учётную запись с доступом. Запустите из каталога LeRobot:

lerobot-train \
  --config_path=examples/flux3/lora.json \
  --policy.path=black-forest-labs/flux-3-action-so101 --policy.device=cuda \
  --dataset.repo_id=YOUR_ORG/YOUR_SO101_DATASET \
  --output_dir=outputs/so101_lora

Кэш Hub сохраняет загруженную модель и общие энкодеры для возобновления и адаптерного вывода.

Закрепленный чекпоинт SO-101-finetuned использует ключи камер scene / wrist, восемь временных шагов наблюдений, два независимо закодированных визуальных снимка и обусловливание на основе прошлых действий/состояний. Он предсказывает 42 действия, выполняет первые 32 с частотой 30 Гц, а затем пересчитывает план. Сохранённые процессоры содержат соответствующие статистики нормализации базовой модели. Эти настройки чекпоинта сохраняются при адаптации под задачу. Общий файл examples/flux3/lora.json содержит только настройки обучения/выполнения и бюджет обучения; тот же файл поставляется как lora.json в каждом пакете Hub. Раскладка камер, обусловливание, представление действий и настройки функции потерь берутся из чекпоинта. Эти команды сохраняют сохранённую длину выполнения 32, guidance 3/3 и немедленное выполнение. Для guidance 4/1 и компиляции добавьте --policy.guidance_scale=4 --policy.guidance_scale_action=1 --policy.compile_model=true.

Эксперименты с условием: LeRobot предоставляет n_obs_steps, history_snapshots и condition_on_past_actions. Изменение этих параметров требует совместимых настроек модели/процессора и дообучения; для обычной адаптации под задачу сохраняйте значения, сохранённые в контрольной точке.

Пресет включает LoRA с rank/alpha 32 и EMA с коэффициентом затухания 0.999; автоматическая загрузка не выполняется. Новые адаптеры включаются через настройки верхнего уровня peft, а не через --policy.use_peft=true, который указывает на сохранённый адаптер.

В наших экспериментах EMA принесла существенную пользу на DROID, тогда как результаты для SO-101 пока неоднозначны. Её эффективность зависит от данных и конфигурации обучения. Мы рекомендуем оставлять EMA включённой и оценивать как исходные, так и EMA-чекпоинты по одному и тому же протоколу rollout перед выбором варианта для развёртывания. Периодическая офлайн-валидация по функции потерь использует исходные веса; она не сравнивает оба варианта автоматически.

Начните с бюджета для одного GPU, чтобы быстро итерировать. Для более крупного бюджета обучения используйте тот же конфиг с этими переопределениями:

accelerate launch --num_processes=4 --multi_gpu -m lerobot.scripts.lerobot_train \
  --config_path=examples/flux3/lora.json \
  --policy.path=black-forest-labs/flux-3-action-so101 --policy.device=cuda \
  --dataset.repo_id=YOUR_ORG/YOUR_SO101_DATASET \
  --batch_size=8 --steps=14000 \
  --output_dir=outputs/so101_lora_large
БюджетGPUРазмер батча на GPUНакоплениеЭффективный размер мини-батчаМикрошаги (steps)Обновления оптимизатора
Быстрая итерация (по умолчанию)124810,0002,500
Более крупный бюджет48412814,0003,500

Эффективный размер батча равен числу GPU × батч на GPU × накопление. LeRobot считает steps, save_freq и eval_steps в микроступах; для получения числа обновлений оптимизатора разделите на коэффициент накопления. Пресет сохраняет и оценивает модель каждые 500 микроступов (125 обновлений). При изменении коэффициента накопления убедитесь, что все три параметра делятся на него без остатка. Длины фаз заморозки, разгона, затухания и охлаждения планировщика также задаются в микроступах. При установке длительности этих фаз умножьте желаемое число обновлений оптимизатора на коэффициент накопления. Оба бюджета используют одни и те же настройки LoRA, оптимизатора и EMA, а также сохраняют условия, размерность действий и нормализацию загруженной базовой модели. Чекпоинты содержат как исходные, так и EMA-адаптеры. Выбор бюджета и чекпоинта следует осуществлять на основе оценки на выделенной тестовой выборке и роллаутов; более крупный батч не гарантирует лучших результатов.

Пресет выделяет последние 20% эпизодов для каждой задачи на оценку. Настройте размер батча и накопление для вашего оборудования; см. обучение на нескольких GPU и обучение PEFT.

Адаптация задачи DROID

Экспериментально: examples/flux3/lora.json переиспользует настройки оптимизатора PEFT SO-101, LoRA, dropout, EMA и бюджета обучения. Загрузка конфигурации проверена, однако обучение DROID PEFT от начала до конца и качество выполнения задач пока не валидированы.

Загрузите DROID policy напрямую по идентификатору репозитория; его общие энкодеры будут разрешены автоматически:

lerobot-train \
  --config_path=examples/flux3/lora.json \
  --policy.path=black-forest-labs/flux-3-action-droid \
  --dataset.repo_id=YOUR_ORG/YOUR_DROID_TASK_DATASET \
  --output_dir=outputs/droid_lora

Здесь используется эффективный размер батча 8 и 2500 обновлений оптимизатора, с включённым EMA и сохранением контрольных точек raw/EMA каждые 125 обновлений. Автоматическая загрузка на Hub отключена. Для более крупного бюджета запустите обучение на четырёх GPU, как в примере SO-101, и добавьте --batch_size=8 --steps=14000.

Пресет загружает раскладку камер, условия, представление действий, частоту управления и процессоры из контрольной точки DROID, переопределяя только перечисленные настройки обучения/выполнения. Ваш набор данных должен соответствовать контракту контрольной точки: текущий пакет использует три камеры, восемь каналов состояния/действия и абсолютные команды позиционирования суставов с частотой 15 Гц. При необходимости сопоставьте имена камер с помощью --rename_map. Оба робота используют один и тот же пример обучения; для загрузки или инференса не требуется отдельный рецепт для конкретного робота.

Значения по умолчанию и нормализация

Новые конфигурации используют эти значения PEFT по умолчанию. Загрузка --policy.path применяет настройки, сохранённые в контрольной точке; явные переопределения в конфигурации или CLI имеют приоритет. Контрольные точки DROID сохраняют собственную конфигурацию.

НастройкаПо умолчанию
УсловиеТекущие изображения и измеренное состояние; 1 снимок, прошлых действий нет
ДействияКомандные дельты; 32 предсказанных и 32 выполненных при 30 Гц
КамерыДва вида рядом на холсте 256 × 512
Скорость обучения адаптера / головы1e-4 / 5e-4
Смещение весов / обрезание градиентов0 / 1
Заморозка / разминкаNone
Контрольные точки градиентов / аугментация изображенийВкл / выкл

Новые конфигурации используют n_obs_steps=1, history_snapshots=1 и condition_on_past_actions=false. При загрузке чекпоинта сохраняются его явные значения: закреплённый пакет SO-101 использует восемь временных шагов истории, два визуальных снимка и обусловливание по прошлым действиям/состоянию. conditioning="history" выбирает независимое кодирование снимков; само по себе оно не определяет количество временных шагов. Обучение также читает будущие кадры и команды как целевые значения, а также предшествующую команду для вычисления дельт действий.

Названия и порядок камер, размерности состояний/действий и абсолютные каналы действий остаются специфичными для конкретного робота. Чекпоинт SO-101 сохраняет последний канал абсолютным (delta_absolute_dims=[-1]) и использует веса каналов [1, 1, 1, 1, 1, 2]. Значения по умолчанию в классе не используют исключений для абсолютных каналов и применяют равные веса.

Сохранённые процессоры базовой модели содержат статистику нормализации. Передавайте сырые состояния/действия и поддерживайте одинаковую статистику для обучения, возобновления и инференса. Квантили пакета SO-101 предполагают определённый порядок суставов, единицы измерения и калибровку; они не являются универсальными значениями калибровки для SO-101. Чтобы использовать другую статистику, подготовьте отдельную базовую модель с соответствующими процессорами перед обучением. Статистика набора данных абсолютных действий не может заменить статистику командных дельт.

При обучении сохраняются адаптеры и обученные слои с ссылкой на полную базовую модель. При повторной загрузке убедитесь, что эта базовая модель и файлы её замороженного энкодера доступны; адаптеры не объединяются с ней автоматически.

Продолжить

lerobot-train \
  --config_path=outputs/so101_lora/checkpoints/last/pretrained_model/train_config.json \
  --resume=true

Возобновите обучение из исходного контрольного пункта pretrained_model, который восстанавливает состояние оптимизатора и EMA. Для инференса вы можете выбрать его «сестринский» контрольный пункт pretrained_model_ema, если включена EMA. Сохраняйте исходную базовую модель и процессоры для каждого адаптера; скачанная заново базовая модель не является заменой той, что использовалась старым адаптером.

Вывод

Укажите в параметре --policy.path исполнителя LeRobot путь к обученному контрольному пункту адаптера; он загрузит указанный базовый модельный контрольный пункт и сохранённые процессоры. Для прямых вызовов с полным базовым контрольным пунктом загрузите процессоры вместе с ним:

from lerobot.policies.factory import make_pre_post_processors
from lerobot.policies.flux3 import Flux3Policy

checkpoint = "black-forest-labs/flux-3-action-so101"
policy = Flux3Policy.from_pretrained(checkpoint).eval()
preprocessor, postprocessor = make_pre_post_processors(policy.config, pretrained_path=checkpoint)

# Run on every control tick, including while actions are queued:
prepared = preprocessor(observation)
normalized_action = policy.select_action(prepared)
absolute_command = postprocessor(normalized_action)

Предобработчик буферизует историю наблюдений и команд. Постобработчик отменяет нормализацию, интегрирует дельты и обновляет общую историю команд на каждом тике. Первая команда привязывается к измеренному состоянию; последующие команды интегрируются от предыдущей. Прямые выходные данные политики нормализуются и должны проходить постобработку. Сбрасывайте политику и оба процессора на границах эпизодов или после вмешательства; синхронный раннер LeRobot выполняет это автоматически. RTC/асинхронный вывод не поддерживается.

Для политики по умолчанию с одним временным шагом достаточно текущих изображений и измеренного состояния. Для офлайн-предсказания с якорем явного дельта-сдвига передайте observation.command_history с одной предыдущей командой; это фиксирует интеграцию вывода, не добавляя команду в условия модели. Чекпоинты, явно настроенные для нескольких временных шагов наблюдения, требуют policy.config.n_obs_steps изображений/состояний и истории команд. Пропустите входные данные через препроцессор, вызовите predict_action_chunk, затем выполните постобработку. --policy.compile_model=true включает ленивую компиляцию замороженных энкодеров и DiT для вывода; DiT для обучения не компилируется.

Для снижения VRAM при инференсе переместите Qwen на CPU после загрузки и финального вызова policy.to(...):

policy.frozen.text_encoder.cpu()

Это перемещает около 8,3 ГиБ весов в оперативную память хоста; некэшированные инструкции кодируются медленнее, при этом эмбеддинги по-прежнему передаются на устройство политики и кэшируются. Это не снижает пиковое потребление памяти при загрузке, а последующий вызов policy.to(...) перемещает Qwen обратно вместе с политикой.

Обучение других воплощений

Для вариантов, в которых мы пока не предлагаем дообученную контрольную точку, начните с базовой модели в flux-action. Этот рабочий процесс требует определения голов действий и условий робота, раскладки камер, представления и нормализации действий. Одинаковые размеры сами по себе не делают головы другого робота переиспользуемыми.

Для последующего вывода или адаптации задач в LeRobot упакуйте обученную модель в полный LeRobot policy вместе с её конфигурацией и соответствующими процессорами. Сам по себе файл с весами не является загружаемым пакетом --policy.path. В этом руководстве рассматривается адаптация существующих policy для SO-101 и DROID к новым задачам.

Все политики формируют только потоки контента video и video_cond, а также потоки действий робота. Неиспользуемые веса изображений/аудио отфильтровываются перед загрузкой, что экономит около 28% параметров DiT без изменения предсказаний действий. Сохранённые списки потоков не активируют ветви изображений/аудио; при загрузке и сохранении полной базовой модели фиксируется сокращённая структура. Адаптеры, нацеленные на удалённые потоки, требуют исходной базовой модели и более старой ревизии кода.

Политики загружаются строго по умолчанию. После отсечения известных неиспользуемых потоков отсутствующие, неожиданные или веса с неверной формой вызывают ошибку. Явное указание strict=False разрешает инициализировать отсутствующие или изменить размер несовпадающих головок embodiment; веса стержня остаются обязательными и проверяются по форме.

Валидация

Тесты на CPU охватывают упаковку, процессоры, обновления PEFT и восстановление из контрольных точек. Ранее проверки с реальными весами на H200 предшествовали текущему рефакторингу процессора. Для данной точной ревизии всё ещё требуется валидация на GPU и робототехнической платформе; существующие проверки не подтверждают работоспособность с четырьмя GPU или качество PEFT для нового воплощения.

Update on GitHub