В мире робототехники, питаемой искусственным интеллектом, существует одна вечная проблема, которая часто оказывается более сложной, чем сама архитектура нейросети. Это проблема данных. Как собрать демонстрации, как их хранить, как обучить модель на этих данных и, что самое важное, как развернуть эту модель обратно на физическом устройстве, чтобы собрать новые данные, которые улучшат следующую итерацию? Традиционно этот процесс требовал сложной оркестрации: отдельные скрипты для записи, ручное перемещение гигабайтов видеофайлов на серверы для обучения, ожидание завершения обучения, а затем загрузка весов обратно на робота. Каждый шаг этого цикла — это узкое горлышко, источник ошибок и, что критично для коммерческих проектов, значительные расходы на передачу данных.
Команда 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.
02Архитектура единого агента: Запись, Синхронизация, Поток
Основная идея подхода заключается в том, чтобы объединить все этапы в одном объекте — экземпляре `Robot()`. Этот объект не только управляет физическим или симулированным роботом, но и выступает в роли интерфейса для работы с данными. Давайте рассмотрим, как выглядит этот цикл на практике, шаг за шагом.
Первый этап — это запись демонстрации. Используя Strands Agents, вы можете задать задачу на естественном языке. Агент сам настроит сцену, камеры и политику (в данном случае — заглушку, mock policy, для тестирования), запустит запись и сохранит данные в локальном формате LeRobot. Формат LeRobot уже является стандартом де-факто: более 90 000 датасетов на Hub используют его структуру. Это означает, что любой инструмент, умеющий читать LeRobot, сможет работать с данными, собранными Strands Robots, без необходимости конвертации.
После завершения записи данные синхронизируются в Storage Bucket. Здесь важно отметить, что запись и синхронизация разделены. Вы можете записывать данные локально, а затем отправить их в облако. Это позволяет гибко управлять тем, когда именно данные становятся доступны для обучения. Синхронизация происходит через команду `sync_dataset_to_bucket`, которая принимает локальный путь к датасету и URI бакета.
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, который используется в аппаратных реализациях.

03Хранение с дедупликацией на уровне байтов: Экономия ресурсов
Одним из самых мощных преимуществ использования Storage Buckets является механизм дедупликации. В традиционных системах хранения, если вы обновляете один файл в наборе данных, вам часто приходится загружать весь файл заново, даже если изменилась только одна секунда видео. В робототехнике, где данные представляют собой непрерывные потоки видео с камер и телеметрии, это приводит к колоссальным накладным расходам.
Storage Buckets используют технологию Xet, которая применяет дедупликацию на уровне байтов с использованием chunking, зависящего от содержимого (content-defined chunking). Это означает, что границы блоков (чанков) определяются не фиксированным размером, а самим содержимым данных. Если вы вставляете или изменяете несколько байт в начале файла, это влияет только на тот чанк, в котором произошло изменение. Все остальные чанки остаются неизменными и не требуют перезагрузки.
По данным Hugging Face, такой подход снижает объем передаваемых данных при загрузке примерно в четыре раза. В контексте робототехники это означает, что если вы записываете робота, который выполняет одни и те же действия в стабильной среде, большая часть видеофайлов будет состоять из идентичных чанков. При синхронизации следующего дня система загрузит только новые чанки и частично заполненные файлы, а не весь датасет заново.
Структура данных LeRobot также способствует эффективности. Эпизоды разбиваются на паркетные фрагменты (Parquet shards) для данных и MP4 фрагменты для видео. При синхронизации загружаются только новые или измененные фрагменты, а не весь набор данных целиком. Это позволяет накапливать данные в течение дней, не перегружая сеть и хранилище.
04Обучение через потоковую передачу: GPU не простаивает
Когда данные собраны и сохранены в бакете, наступает очередь обучения. В традиционном подходе вы скачиваете весь датасет на локальный диск или сервер, а затем начинаете обучение. Пока идет загрузка, мощные GPU-кластеры простаивают. В потоковом цикле Strands Agents этот этап кардинально меняется.
Метод `stream_dataset()` позволяет читать данные прямо из Hub, не скачивая их полностью. Благодаря структуре фрагментов, описанной выше, загрузка батча для обучения превращается в несколько запросов на чтение диапазонов байтов (byte-range reads) по крупным фрагментам, а не в тысячи мелких запросов. LeRobot предоставляет класс `StreamingLeRobotDataset`, который превращает этот поток в стандартный PyTorch итератор.
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 фрагментов. Это позволяет начать обучение с первого же батча, не ожидая завершения загрузки всего датасета.

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