Главная/Блог/Гайд/Потоковый цикл данных: Как Strands…
Гайд9 мин чтения · 13 августа 2026 г.

Потоковый цикл данных: Как Strands Agents и LeRobot упрощают обучение роботов

Разбираем архитектуру непрерывного цикла обучения роботов: от записи демонстраций до деплоя политик через Hugging Face Storage Buckets без скачивания данных.

Потоковый цикл данных: Как Strands Agents и LeRobot упрощают обучение роботов

В мире робототехники, питаемой искусственным интеллектом, существует одна вечная проблема, которая часто оказывается более сложной, чем сама архитектура нейросети. Это проблема данных. Как собрать демонстрации, как их хранить, как обучить модель на этих данных и, что самое важное, как развернуть эту модель обратно на физическом устройстве, чтобы собрать новые данные, которые улучшат следующую итерацию? Традиционно этот процесс требовал сложной оркестрации: отдельные скрипты для записи, ручное перемещение гигабайтов видеофайлов на серверы для обучения, ожидание завершения обучения, а затем загрузка весов обратно на робота. Каждый шаг этого цикла — это узкое горлышко, источник ошибок и, что критично для коммерческих проектов, значительные расходы на передачу данных.

Команда Amazon, в сотрудничестве с разработчиками Hugging Face, представила решение, которое меняет эту парадигму. В рамках экосистемы Strands Agents и стека LeRobot они реализовали концепцию «потокового цикла данных» (streaming data loop). Это не просто набор инструментов, а единая архитектура, где запись, обучение и развертывание происходят в рамках одного агента, использующего общее хранилище. Ключевым нововведением здесь является использование Hugging Face Storage Buckets, которые позволяют работать с данными как с изменяемым слоем, избегая избыточных копий и версионирования, которое замедляет итерации. В этой статье мы подробно разберем, как эта система работает изнутри, почему она эффективнее традиционных подходов и как вы можете запустить такой цикл на своем оборудовании.

01Контекст: Почему традиционный цикл данных тормозит развитие

Чтобы понять ценность нового подхода, нужно взглянуть на то, как обычно выглядит цикл обучения робота. Представьте, что у вас есть агент, который уже умеет записывать демонстрации и отправлять их на Hugging Face Hub. На первый взгляд, это звучит как готовое решение. Однако, если вы попытаетесь запустить этот цикл непрерывно — собирать эпизоды в течение дня, обучать политику на растущем наборе данных, развертывать её и собирать новые данные — вы столкнетесь с серьезными проблемами масштабируемости.

Первая проблема — это стоимость передачи данных. Если вы каждый день загружаете весь набор записей, вы платите за одни и те же байты многократно. Вторая проблема — это задержка обучения. Перед началом каждого этапа обучения система часто копирует весь датасет на GPU-серверы. Если датасет весит сотни гигабайт, видеокарты простаивают в ожидании загрузки. Третья проблема — это управление версиями. Хранение каждой итерации датасета как отдельной версии в репозитории приводит к экспоненциальному росту хранилища, даже если изменения минимальны. Именно для решения этих проблем был создан Strands Robots SDK от AWS и интегрирован с Hugging Face Storage Buckets.

💡
Ключевое отличие. Hugging Face Storage Buckets — это изменяемое (mutable), не версионированное хранилище объектов, основанное на технологии Xet. В отличие от стандартных репозиториев на Hub, где каждая запись создает новую версию, бакет работает как рабочий слой, где данные перезаписываются на месте, что кардинально снижает объем передаваемой информации.

02Архитектура единого агента: Запись, Синхронизация, Поток

Основная идея подхода заключается в том, чтобы объединить все этапы в одном объекте — экземпляре `Robot()`. Этот объект не только управляет физическим или симулированным роботом, но и выступает в роли интерфейса для работы с данными. Давайте рассмотрим, как выглядит этот цикл на практике, шаг за шагом.

Первый этап — это запись демонстрации. Используя Strands Agents, вы можете задать задачу на естественном языке. Агент сам настроит сцену, камеры и политику (в данном случае — заглушку, mock policy, для тестирования), запустит запись и сохранит данные в локальном формате LeRobot. Формат LeRobot уже является стандартом де-факто: более 90 000 датасетов на Hub используют его структуру. Это означает, что любой инструмент, умеющий читать LeRobot, сможет работать с данными, собранными Strands Robots, без необходимости конвертации.

После завершения записи данные синхронизируются в Storage Bucket. Здесь важно отметить, что запись и синхронизация разделены. Вы можете записывать данные локально, а затем отправить их в облако. Это позволяет гибко управлять тем, когда именно данные становятся доступны для обучения. Синхронизация происходит через команду `sync_dataset_to_bucket`, которая принимает локальный путь к датасету и URI бакета.

terminalpython
from strands import Agent
from strands_robots import Robot, sync_dataset_to_bucket

sim = Robot("so100")  # mode="sim" по умолчанию
agent = Agent(tools=[sim])

# Один промпт управляет сценой, камерами, политикой и записью
agent(
    "Create a world with the so100 robot, add a red cube and a front camera, "
    "start recording (repo_id='local/cube_pick', root='/tmp/cube_pick', fps=30, "
    "overwrite=True, task='pick up the red cube'), run the mock policy for "
    "60 steps, then stop recording."
)

# Синхронизация завершенного датасета в бакет
sync_dataset_to_bucket(
    "/tmp/cube_pick",
    "my-org/robot-fave"
)

Результатом этой операции является URI вида `hf://buckets/my-org/robot-fave/cube_pick`. Этот URI становится точкой входа для всех последующих операций. Обратите внимание, что формат данных на диске остается неизменным — это тот же формат LeRobot, который используется в аппаратных реализациях.

Потоковый цикл данных: Как Strands Agents и LeRobot упрощают обучение роботов

03Хранение с дедупликацией на уровне байтов: Экономия ресурсов

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

Storage Buckets используют технологию Xet, которая применяет дедупликацию на уровне байтов с использованием chunking, зависящего от содержимого (content-defined chunking). Это означает, что границы блоков (чанков) определяются не фиксированным размером, а самим содержимым данных. Если вы вставляете или изменяете несколько байт в начале файла, это влияет только на тот чанк, в котором произошло изменение. Все остальные чанки остаются неизменными и не требуют перезагрузки.

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

⚠️
Важно для масштабируемости. Без дедупликации перезапись объекта означает отправку всех его байтов. С Xet изменение 1% данных в 500 МБ файле требует загрузки всего 5.5 МБ. Это делает ежедневные итерации обучения экономически и технически целесообразными.

Структура данных LeRobot также способствует эффективности. Эпизоды разбиваются на паркетные фрагменты (Parquet shards) для данных и MP4 фрагменты для видео. При синхронизации загружаются только новые или измененные фрагменты, а не весь набор данных целиком. Это позволяет накапливать данные в течение дней, не перегружая сеть и хранилище.

04Обучение через потоковую передачу: GPU не простаивает

Когда данные собраны и сохранены в бакете, наступает очередь обучения. В традиционном подходе вы скачиваете весь датасет на локальный диск или сервер, а затем начинаете обучение. Пока идет загрузка, мощные GPU-кластеры простаивают. В потоковом цикле Strands Agents этот этап кардинально меняется.

Метод `stream_dataset()` позволяет читать данные прямо из Hub, не скачивая их полностью. Благодаря структуре фрагментов, описанной выше, загрузка батча для обучения превращается в несколько запросов на чтение диапазонов байтов (byte-range reads) по крупным фрагментам, а не в тысячи мелких запросов. LeRobot предоставляет класс `StreamingLeRobotDataset`, который превращает этот поток в стандартный PyTorch итератор.

terminalpython
reader = sim.stream_dataset(
    "my-org/robot-fave/cube_pick",
    repo_type="bucket",
    shuffle=False,
    max_num_shards=1,
    buffer_size=1
)

print(reader.num_episodes, reader.num_frames, reader.fps)

for frame in reader:
    # Кадр декодируется на лету из удаленного MP4 фрагмента
    frame["observation.images.front"]  # тензор (3, H, W)
    frame["observation.state"]  # вектор суставов
    frame["action"]
    break

На локальном диске остается только небольшая папка `meta/` с метаданными, схемой и индексом эпизодов. Видеокадры декодируются из удаленных MP4 фрагментов по мере итерации, а данные о состоянии и действиях поступают из Parquet фрагментов. Это позволяет начать обучение с первого же батча, не ожидая завершения загрузки всего датасета.

Потоковый цикл данных: Как Strands Agents и LeRobot упрощают обучение роботов

Для непосредственного обучения вы можете передать этот ридер в стандартный PyTorch DataLoader. Внутренняя буферизация позволяет параллелизовать декодирование видео между процессами-работниками, что значительно ускоряет подготовку данных. Если вы используете стандартные инструменты LeRobot для обучения, вы можете просто указать тип репозитория как `bucket` и включить потоковую передачу:

terminalbash
lerobot-train --policy.type=act \
  --dataset.repo_id=my-org/robot-fave/cube_pick \
  --dataset.repo_type=bucket \
  --dataset.streaming=true \
  --num_workers=4

Обратите внимание, что для бакетов потоковая передача обязательна, так как они не поддерживают версионирование в традиционном смысле. Конфигурация обучения автоматически отклонит попытку использовать бакет без флага `--dataset.streaming=true`.

Сравнение путей загрузки: традиционное скачивание всего датасета против потоковой передачи, позволяющей начать обучение мгновенно.
Сравнение путей загрузки: традиционное скачивание всего датасета против потоковой передачи, позволяющей начать обучение мгновенно.

05Развертывание и замкнутый цикл

Финальный шаг цикла — это развертывание обученной политики обратно на робота. В Strands Agents это делается с минимальными усилиями. После завершения обучения вы получаете чекпоинт модели. Чтобы развернуть его на роботе, достаточно изменить один аргумент при инициализации объекта `Robot()` — переключить режим с симуляции на реальный (`mode="real"`) и указать путь к модели.

Робот начинает выполнять задачу, используя новую политику. Если он успешно справляется с задачей, данные записываются. Если нет — агент может проанализировать неудачу и решить, нужно ли собрать дополнительные демонстрации. Эти новые данные снова попадают в тот же Storage Bucket, где они дедуплицируются с существующими данными, и цикл начинается заново.

Этот замкнутый цикл позволяет непрерывно улучшать способности робота. Вы не ограничены одной записью и одним обучением. Вы можете собирать данные в течение недель, обучать модель на растущем наборе и постепенно повышать его надежность. При этом архитектура гарантирует, что каждый шаг цикла оптимизирован: данные не копируются лишний раз, GPU загружены сразу, а хранилище растет только за счет уникальной информации.

📌
Практический совет. Для записи на физическом роботе SO-101 используйте CLI LeRobot. Он автоматически настраивает связь между лидером (оператором) и ведомым (роботом), записывает данные в тот же формат, что и симуляция, и позволяет синхронизировать их в бакет той же командой `sync_dataset_to_bucket`.

06Что это значит на практике

Для исследователей и инженеров, работающих с робототехникой, описанный подход означает переход от разрозненных инструментов к единой экосистеме. Больше не нужно писать кастомные скрипты для синхронизации данных между симулятором, сервером обучения и роботом. Все эти компоненты связаны через общий интерфейс Strands Agents и общее хранилище Hugging Face.

Для бизнеса это означает снижение операционных расходов. Экономия на передаче данных за счет дедупликации и отсутствие простоев GPU за счет потокового обучения напрямую влияют на стоимость разработки. Кроме того, использование открытых стандартов (LeRobot, Hugging Face Hub) гарантирует, что ваши данные и модели не будут привязаны к проприетарным решениям, что упрощает масштабирование и интеграцию с другими инструментами.

Наконец, этот подход демократизирует доступ к передовой робототехнике. Благодаря открытому SDK Strands Robots и бесплатному уровню Hugging Face Hub, исследователи и энтузиасты могут запускать сложные циклы обучения на своих ноутбуках, используя симуляцию, а затем переносить их на реальное оборудование без изменения кодовой базы. Это ускоряет инновации и позволяет быстрее тестировать гипотезы в реальных условиях.

В заключение, интеграция Strands Agents, LeRobot и Hugging Face Storage Buckets представляет собой значительный шаг вперед в области автоматизации цикла обучения роботов. Она решает ключевые проблемы эффективности, масштабируемости и удобства использования, позволяя сосредоточиться на самом важном — создании умных и надежных роботов, а не на управлении инфраструктурой данных.

Источник: Hugging Face ↗