Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

DISCOVERSE: генерация данных, обучение и многовидовое видео на ROCm

DISCOVERSE — это фреймворк симуляции для обучения роботов по схеме Real2Sim2Real [от реальности к симуляции и обратно], охватывающий AIRBOT, MMK2, экспертные конечные автоматы, имитационное обучение, LiDAR и 3DGS (3D Gaussian Splatting). В этой главе мы начинаем с загрузки исходного кода и моделей, создаём экспертные данные, конвертируем их в формат LeRobot, обучаем ACT и Diffusion Policy [диффузионная стратегия], выполняем замкнутую оценку и экспортируем видео с трёх камер в высоком разрешении.

Результаты главы

  • записи о запуске сцен AIRBOT и MMK2;
  • успешные экспертные траектории и список сгенерированных эпизодов;
  • набор данных LeRobot, соответствие действий и наблюдений и видео воспроизведения;
  • модель ACT или Diffusion Policy, результаты замкнутой оценки и многовидовое видео;
  • необязательный динамический рендеринг 3DGS.

После установки зафиксируйте версию вышестоящего проекта:

git -C "$SRC_ROOT/DISCOVERSE" rev-parse HEAD

1. Загрузка и установка

cd "$SRC_ROOT"
git lfs install
git clone https://github.com/discoverse-dev/DISCOVERSE.git
cd DISCOVERSE

export DISCOVERSE_ENV="$ENV_ROOT/discoverse-rocm"
python3.10 -m venv "$DISCOVERSE_ENV"
source "$DISCOVERSE_ENV/bin/activate"
python -m pip install --upgrade pip
python -m pip install -e .
python scripts/setup_submodules.py
python scripts/check_installation.py

Дополнительные зависимости ставятся по назначению:

python -m pip install -e '.[act_full]'
python -m pip install -e '.[lidar,visualization]'
python -m pip install -e '.[gs]'

Модели 3DGS (3D Gaussian Splatting) публикуются в tatp/DISCOVERSE-models. При первом запуске они скачиваются автоматически, но можно выполнить вход заранее:

hf auth login

2. Базовая проверка запуска

export MUJOCO_GL=egl
python discoverse/robots_env/airbot_play_base.py
python discoverse/robots_env/mmk2_base.py

python examples/mocap_ik/mocap_ik_manipulator.py \
  -r airbot_play \
  -t place_block \
  --record \
  --camera-names global_camera wrist_camera

Приёмка миграции охватывает 18 проверок запуска, 12 задач AIRBOT и 8 фиксированных сцен MMK2. Генерировать обучающие данные нужно только после того, как базовые проверки пройдены.

3. Генерация экспертных траекторий

Официальные скрипты задач уже содержат экспертный конечный автомат. Для примера с укладкой кубика на AIRBOT:

python examples/tasks_airbot_play/place_block.py --help

Экспертный конечный автомат должен одновременно соблюдать кинематические и физические ограничения. Если возникает недостижимость IK [обратная кинематика], сначала проверьте, не выходит ли целевая поза за рабочее пространство манипулятора, не приводит ли ориентация концевого звена к пределам суставов и нет ли скачков позы между соседними состояниями. Для задач укладки стоит разбить путь эксперта на фазы: предзахват, захват, подъём, предукладка, опускание, освобождение и отход; между соседними состояниями выполнять интерполяцию. Если опорный объект опрокидывается, меняйте направление подхода и отхода, а не увеличивайте массу объекта.

Названия параметров могут различаться в разных версиях, поэтому сначала смотрите --help. При пакетной генерации фиксируйте каталог данных, диапазон seed [random seed] и требуемое число успешных эпизодов:

export DISCOVERSE_DATA_ROOT="$DATA_ROOT/discoverse"
mkdir -p "$DISCOVERSE_DATA_ROOT/place_block"

for seed in $(seq 0 499); do
  python examples/tasks_airbot_play/place_block.py \
    --data_idx "$seed" \
    --data_set_size 1 \
    --auto
done

rsync -a data/place_block/ "$DISCOVERSE_DATA_ROOT/place_block/"

Официальный скрипт сначала пишет данные в data/place_block внутри каталога исходного кода DISCOVERSE; последняя строка переносит на диск данных большого объёма только те эпизоды, которые прошли проверку успеха. Перед повторным запуском с тем же seed проверьте, не существует ли уже целевой эпизод, чтобы не генерировать его дважды.

Каждую траекторию проверяйте минимум по следующим пунктам:

  • условие успеха в симуляции истинно;
  • число состояний, действий и кадров камер совпадает;
  • временные метки строго возрастают;
  • хвостовое заполнение действий не переходит в следующий эпизод;
  • при воспроизведении захват, перенос и укладка выполняются полностью.

Архивный корпус экспертных данных place_block содержит 500 принятых эпизодов и 44 439 выровненных кадров.

4. Конвертация в обучающие данные

Исходные данные DISCOVERSE обычно включают obs_action.json, изображения или видео камер и метаданные задачи. При конвертации в LeRobot [библиотека робототехнического обучения] создаются единые поля:

observation.state
observation.images.{camera}
action
task
episode_index
frame_index
timestamp

Сначала конвертируйте одну траекторию, затем пакет:

python "$EVERY_EMBODIED_ROOT/<topic-folder>/code/convert_discoverse_to_lerobot.py" \
  --input-root "$DISCOVERSE_DATA_ROOT/place_block" \
  --output-root "$DATA_ROOT/discoverse-lerobot/place_block" \
  --repo-id local/discoverse-place-block \
  --task 'Place the green block in the pink bowl' \
  --fps 20 \
  --image-size 256

Здесь <topic-folder> — каталог этой темы в исходном репозитории every-embodied.

Конвертер читает obs_action.json, cam_0.mp4 и cam_1.mp4 каждого успешного эпизода и проверяет, что оба изображения и 7-мерные суставные состояния и 7-мерные действия имеют одинаковую длину покадрово. DISCOVERSE записывает наблюдение после выполнения действия, поэтому по умолчанию используется --action-bias=-1, которое выравнивает момент наблюдения со следующим действием. В файле discoverse_conversion_manifest.json записываются исходные эпизоды, число кадров и диапазоны индексов действий. Не ограничивайтесь сравнением форм массивов: проверьте временную согласованность, воспроизведя действия.

5. Обучение ACT

lerobot-train \
  --dataset.repo_id=local/discoverse-place-block \
  --dataset.root="$DATA_ROOT/discoverse-lerobot/place_block" \
  --policy.type=act \
  --policy.device=cuda \
  --policy.chunk_size=100 \
  --policy.n_action_steps=100 \
  --steps=100000 \
  --batch_size=32 \
  --save_freq=5000 \
  --log_freq=100 \
  --wandb.enable=false \
  --output_dir="$RUN_ROOT/discoverse/act_place_block"

На ROCm [открытая платформа вычислений AMD] запись --policy.device=cuda остаётся правильной. Сначала запустите 10–50 шагов, чтобы проверить данные и обратное распространение, и только потом начинайте полное обучение.

6. Обучение Diffusion Policy

lerobot-train \
  --dataset.repo_id=local/discoverse-place-block \
  --dataset.root="$DATA_ROOT/discoverse-lerobot/place_block" \
  --policy.type=diffusion \
  --policy.device=cuda \
  --steps=100000 \
  --batch_size=16 \
  --save_freq=5000 \
  --log_freq=100 \
  --wandb.enable=false \
  --output_dir="$RUN_ROOT/discoverse/diffusion_place_block"

Точное имя стратегии зависит от версии LeRobot, поэтому ориентируйтесь на вывод lerobot-train --help. В конфигурации обучения обязательно сохраняйте отображение наблюдений, нормализацию действий и временное окно.

7. Замкнутая оценка

Цикл оценки должен реально продвигать симулятор действиями стратегии:

observation = env.reset()
for step in range(max_steps):
    action = policy.select_action(observation)
    observation, reward, terminated, truncated, info = env.step(action)
    recorder.append(observation, action, info)
    if terminated or truncated:
        break

Зафиксируйте два набора seed: похожий на обучающий и неизвестный. Для каждого отдельно подсчитывайте приближение, захват, подъём, перенос, выравнивание и итоговую укладку. Результаты оценки и видео записываются в один каталог эпизода.

8. Многовидовой вывод в высоком разрешении

Задача kiwi_pick.py для MMK2 по умолчанию уже записывает три камеры, но с разрешением 640×480. Скопируйте скрипт задачи и измените только разрешение записи — официальный конечный автомат эксперта при этом сохраняется:

cd "$SRC_ROOT/DISCOVERSE"
mkdir -p "$RUN_ROOT/discoverse/mmk2_kiwi_hd"
cp examples/tasks_mmk2/kiwi_pick.py \
  "$RUN_ROOT/discoverse/mmk2_kiwi_hd/kiwi_pick_hd.py"

python - <<'PY'
import os
from pathlib import Path

path = Path(os.environ["RUN_ROOT"]) / "discoverse/mmk2_kiwi_hd/kiwi_pick_hd.py"
text = path.read_text()
text = text.replace('"width"  : 640', '"width"  : 1920')
text = text.replace('"height" : 480', '"height" : 1080')
path.write_text(text)
PY

python "$RUN_ROOT/discoverse/mmk2_kiwi_hd/kiwi_pick_hd.py" \
  --data_idx 0 \
  --data_set_size 1 \
  --auto

После успешного выполнения три исходных видео лежат в data/pick_kiwi/000/cam_0.mp4, cam_1.mp4 и cam_2.mp4. Скрипт записывает их на диск только после выполнения условий успеха, поэтому видео и соответствующие экспертные действия относятся к одному эпизоду.

Чтобы сохранить исходные видео по одной камере и получить сводное видео с трёх видов:

ffmpeg \
  -i data/pick_kiwi/000/cam_0.mp4 \
  -i data/pick_kiwi/000/cam_1.mp4 \
  -i data/pick_kiwi/000/cam_2.mp4 \
  -filter_complex '[0:v][1:v][2:v]hstack=inputs=3[v]' \
  -map '[v]' -c:v libx264 -crf 18 -pix_fmt yuv420p \
  "$RUN_ROOT/discoverse/mmk2_kiwi_hd/composite.mp4"

9. Рендеринг 3DGS

python -m pip install -e '.[gs]'
hf auth login

В сценах, поддерживающих Gaussian renderer [гауссов рендерер], задайте cfg.use_gaussian_renderer = True; в интерактивном окне переключение выполняется сочетанием Ctrl+g. При проверке сохраняйте:

  • путь к фактически загруженному облаку точек .ply;
  • число точек и разрешение рендеринга;
  • минимум один динамический повтор;
  • сетку MuJoCo для той же задачи как контрольный вариант.

10. Ключевые моменты переноса на AMD

МодульЧто переносится
Стратегии PyTorchИнтерфейс torch.cuda сохраняется, устанавливается колесо ROCm
MuJoCoВывод видео через EGL [интерфейс рендеринга без окна]
3DGS (3D Gaussian Splatting)Замена расширений, специфичных для CUDA, или использование реализации, собирающейся под ROCm
ДанныеИсправление границ эпизодов, блоков действий и временной синхронизации камер
ACTДлина блока действий одинакова при обучении и выполнении
Несколько роботовОтдельная проверка MJCF робота, контроллера и условия успеха

11. Что считается результатом

Запуск среды, успешность экспертов и успешность обученной стратегии фиксируются раздельно. Примеры результатов миграции: проверки запуска 18/18, AIRBOT 12/12, MMK2 8/8, задачи высокой чёткости 4/4 и 500 экспертных траекторий. Модели обучения оцениваются по собственным замкнутым задачам и собственным знаменателям.

12. Официальные материалы