03. Перенос ACT на ROCm и диагностика DAgger
Эта задача посвящена ACT. Снижение loss на обучающей выборке ещё не означает, что стратегия стабильно успешна в замкнутом цикле. Особенно при воспроизведении на устройстве ROCm сначала нужно доказать, что сбой не вызван средой, данными, видеопамятью или критерием успеха, и только потом обсуждать структуру модели и стратегию работы с данными.
Практический Notebook к этой задаче: 03_act_dagger_diagnostics.ipynb.
Краткий итог
Для начала запомните три строки; различать много групп оценки пока не нужно:
| Модель | Проверенный результат | Учебная роль |
|---|---|---|
| SmolVLA | 57/60 (красная кружка 27/30, синяя 30/30) | Основной пример: сначала смотрим успешные повторы, затем изучаем обучение и оценку |
| Pi0 | 12/14; из них нерассмотренная позиция 9/10, сложная группа 6/8 | Продвинутый пример: права доступа к большой модели, выравнивание действий и диагностика сбоев |
| ACT | Текущий защищённый кандидат 15/30; историческая ссылка из учебника 17/30 | Пример диагностики: смещение распределения в замкнутом цикле, DAgger и строгое определение успеха |
Результат 15/30 получен на AMD395 и относится к уже выполненному защищённому кандидату. В Notebook записан тот же нативный рецепт обучения, но чтобы назвать эту цифру «воспроизведением из Notebook», его нужно полностью выполнить заново с нуля в среде с ядром Jupyter. Поэтому учебник показывает рабочий рецепт и проверяемый результат отдельно и не смешивает их.
Маршрут диагностики ACT
Проверяйте в таком порядке:
flowchart LR A["Воспроизведение действий из данных"] --> B["Обучение ACT"] B --> C["teacher-forced / open-loop"] C --> D["closed-loop rollout"] D --> E["Видео неудачного seed"] E --> F["DAgger / коррекция оракулом"]
Каждый шаг отвечает на свой вопрос:
| Шаг | Вопрос |
|---|---|
| Воспроизведение действий из данных | Может ли собранный набор данных сам по себе выполнить задачу |
| Обучение ACT | Может ли модель выучить распределение действий по офлайн-данным |
| open-loop | Может ли модель воспроизвести траекторию на состояниях из данных |
| closed-loop | Стабильна ли стратегия, когда действует сама |
| Видео неудачи | На каком этапе произошёл сбой: подход, захват, перенос или освобождение |
| DAgger | Как добавить состояния, которые возникают после ухода в замкнутом цикле |
Типичные сбои ACT
| Тип сбоя | Признак | Возможная причина |
|---|---|---|
| Не касается кружки | Захват остановился рядом с кружкой | Недостаточно условий по изображению, начальная поза вне распределения, сдвиг в замкнутом цикле |
| Поднимает, но не отпускает | Кружка висит над тарелкой или уносится | Метки захвата, слишком короткий финальный участок release |
| Ставит на край тарелки, но опрокидывает | Положение почти верное, поза неверная | Недостаточно демонстраций конечной фазы, нестабильная высота укладки |
| open-loop успешен, closed-loop нет | На данных работает, самостоятельно — нет | Смещение распределения в замкнутом цикле |
Как собирать данные DAgger
Понятная для обучения схема DAgger:
- Обучите базовую модель на старте из reset.
- Зафиксируйте набор seed и выполните замкнутые rollout.
- Найдите неудачные seed.
- Пусть текущая стратегия выполнит первые несколько шагов, например 40 управляющих тактов.
- Переключитесь на оракул или скриптовую стратегию из состояния рядом с неудачей.
- Сохраните суффикс коррекции.
- При объединении данных записывайте источник, смещение временной метки и вес выборки.
- Переобучите модель и оцените её на том же наборе seed.
Важно: данных коррекции не должно быть как можно больше. Если добавить данные неудач из полного reset с высоким весом в основное обучение, можно разрушить уже выученное поведение из старта reset.
Что изменилось в этом раунде ACT
В прежнем конспекте учебника записан результат 17/30. Текущий защищённый кандидат repair15 при том же строгом протоколе даёт 15/30, но историческое 17/30 пока полностью не восстановлено. Для сравнения: обычный ACT на W7900 даёт 0/30, резервная базовая модель stable61 на AMD395 — 7/30, а старый защищённый артефакт DAgger — 2/30. Исходный замкнутый базовый вариант ACT почти не проходит строгий критерий физического успеха, поэтому последующие диагностические изменения опираются на цепочку воспроизводимых правок.
Первый шаг — ужесточить критерий оценки. Старый success учитывал только геометрические условия среды, и такие случаи, как толчок кружки, её сдавливание или опрокидывание, могли ошибочно считаться успехом. В этой теме используется единый показатель physical_success: кружка должна быть поднята, перенесена на тарелку и в итоге стоять почти вертикально. Без этого шага последующие изменения обучения легко вводят в заблуждение из-за старой метрики.
Второй шаг — разделить неудачи на open-loop и closed-loop. Действия ACT генерируются по наблюдениям из набора данных, затем эти действия воспроизводятся в MuJoCo в режиме open-loop. Такая диагностика позволяет различить два факта: выучило ли модель действия на состояниях из данных и сбивается ли стратегия при самостоятельном выполнении из-за дрейфа состояния. Результаты показывают, что на одиночной демонстрации или чистых данных траектория руки иногда близка к рабочей, но фаза release очень короткая, а смещение в замкнутом цикле заметно; поэтому одной правкой захвата или дальнейшим обучением проблему не решить.
Третий шаг — пересобрать данные с выравниванием по reset. Во многих эпизодах старого набора начало не совпадало с позой reset, которую использует оценка. Потери при обучении выглядели нормально, но замкнутый цикл из reset не касался кружки. Основная линия переведена на скриптовый оракул с выравниванием по reset: каждая траектория начинается с состояния reset, которое используется при оценке, и сначала проверяется, что сами данные по тому же физическому критерию выполняют задачу.
Четвёртый шаг — настроить обучение ACT. Итоговая линия использует no-VAE, chunk_size=20, n_action_steps=10, состояние с временной меткой, состояние obj_init, BCE для захвата с весом 0.5 и ранний вес по эпизодам. Каждый пункт связан с конкретным сбоем:
| Изменение | Какую проблему решает |
|---|---|
| no-VAE | При малом объёме данных уменьшает случайность выборки и делает воспроизведение стабильнее |
| Состояние с временной меткой | Явно задаёт фазу времени, чтобы стадии не усреднялись |
Состояние obj_init | Сообщает модели начальное геометрическое соотношение кружки и тарелки |
BCE захвата 0.5 | Усиливает порядок открытия и закрытия захвата, не жертвуя слишком сильно траекторией руки |
| Ранний вес по эпизодам | Защищает начало каждого эпизода от reset, чтобы данные коррекции не перекрывали начальное поведение |
n_action_steps=10 | Сохраняет связность блока действий и снижает дрейф при слишком длинном выполнении одного блока |
Пятый шаг — DAgger с префиксом 40. Текущая ACT выполняет 40 управляющих тактов, затем оракул с заданным скриптом перехватывает управление и сохраняет суффикс. Так собираются состояния, в которые стратегия сама уходит, а это ближе к распределению неудач в замкнутом цикле, чем только идеальная демонстрация из старта reset.
Шестой шаг — смещение временной метки для эпизодов коррекции. Суффикс с префиксом 40 — это не полная задача от reset. Если его временная метка начинается с нуля, модель примет «корректирующие действия посреди задачи» за «действия в начале задачи». Поэтому эпизоды коррекции используют timestamp offset = 2.0, чтобы фаза времени отличалась от эпизодов из reset.
Седьмой шаг — понижение веса данных коррекции. Проверены разные веса:
| Вес выборки коррекции | Строгий результат | Вывод |
|---|---|---|
0.1 | 1/15 | Данных коррекции слишком мало: способности к release и укладке не восстанавливаются |
0.5 | 0/15 | Данных коррекции слишком много: основное распределение из reset разрушается |
0.25 | 13/30 | Лучший компромисс на тот момент |
Затем на контрольной точке best025 выполнен один раунд DAgger v1 с префиксом 40 по неудачным seed. Получено 3 пригодных корректирующих траектории; их объединили с основным обучением при смещении временной метки 2.0 и весе 0.25, так появился старый защищённый checkpoint DAgger. Его точная проверка даёт 2/30. После этого от защищённых весов stable61 выполнено дообучение на 2500 шагов с низкой скоростью обучения без утечки памяти на тех же данных коррекции; так появился текущий защищённый кандидат repair15:
ckpt/act_scripted_reset_oracle_plus_prefix40_dagger_best025_toffset2_downweight025_chunk20_n10_novae_gpu_5000_20260629_031208/step_5000
AMD395 protected/act_stable61_to_dagger_nomemleak_step1500_strict15of30
physical_success = 15/30
fixed_seed_groups = 3 группы по 10 эпизодов
В фиксированной оценке по трём наборам на AMD395 stable61/step2500 даёт 7/30, защищённый DAgger — 2/30, repair15 — 15/30. Сбор экспертного восстановления дал 17/40 пригодных траекторий; это характеристика качества данных. Результаты стратегии везде берутся из последующей замкнутой оценки по physical_success.
Notebook notebooks/16_act_end_to_end.ipynb содержит тот же защищённый рецепт обучения: упаковка данных, взвешенная по траекториям выборка, no-VAE, BCE для захвата, tqdm, checkpoint и строгая оценка. При запуске задайте ACT_RECIPE=repair15; обучение и оценка используют один и тот же выходной каталог.
Что записывать на ROCm
Обучение ACT обычно не требует много видеопамяти, но фиксируйте:
- размер батча;
- размер chunk;
n_action_steps;- использование no-VAE;
- наличие вспомогательной функции потерь для захвата;
- температуру во время обучения;
- использование видеопамяти;
- наличие сбоев ядра или OOM.
Если обучение падает, сначала по журналам устройства докажите, что причина не в аппаратуре или ROCm. Если обучение стабильно, но стратегия не работает, возвращайтесь к данным и диагностике замкнутого цикла.
Результаты диагностики замкнутого цикла
Базовый чистый closed-loop даёт 0/10. После добавления смещения временной метки, коррекции с пониженным весом и данных DAgger: stable61 — 7/30, защищённый DAgger — 2/30, продолженный repair15 — 15/30. Три фиксированные панели дают 3/10, 4/10 и 8/10.
Рисунок 1: изменение физического успеха ACT в замкнутом цикле по шагам диагностики. Улучшение получено за счёт коррекции данных и состояний замкнутого цикла, а не простым увеличением времени обучения.
| Этап | Физический успех | Пояснение |
|---|---|---|
| Чистый closed-loop | 0/10 | Модель в замкнутом цикле не может стабильно касаться и переносить кружку |
| Смещение временной метки | 3/15 | Выравнивание действий улучшило часть траекторий, но результат всё ещё нестабилен |
| DAgger с пониженным весом | 13/30 | Данные коррекции начинают покрывать состояния рядом с неудачами |
| Резерв stable61 | 7/30 | Прежний базовый вариант |
| Защищённый артефакт DAgger | 2/30 | Точный результат старой защищённой папки |
| Защищённый кандидат repair15 | 15/30 | Текущий лучший: три группы фиксированных seed по 10 эпизодов, результаты по группам 3/10 + 4/10 + 8/10 |
Рисунок 2: успешный rollout ACT DAgger с физическим критерием. Используйте его, чтобы проследить этапы захвата, переноса и освобождения.
Рисунок 3: типичный неудачный rollout лучшего DAgger у ACT. Даже если геометрические условия среды иногда почти выполнены, нужно дополнительно проверять высоту подъёма и итоговое положение.
Checkpoint
После выполнения задачи оформите следующие пункты:
| Пункт | Содержание |
|---|---|
| checkpoint ACT | Путь записан через переменную |
| Результат open-loop | Обучающая выборка или фиксированные seed |
| Результат closed-loop | По physical_success |
| Описание данных DAgger | Длина префикса, тип оракула, веса выборки |
| Видео типичной неудачи | Не меньше одного |
| Следующий шаг | Продолжить DAgger / исправить захват / добавить демонстрации / изменить chunk |