Задача
У клиента не было одного централизованного суперкомпьютера — были серверы, рабочие станции и видеокарты в разных местах. По отдельности каждый ресурс использовался не полностью, а вручную распределять между ними задачи, данные и версии программ было слишком сложно.
Сложность не в самом разбиении работы, а в том, что исполнители неравноценны и ненадёжны. Узлы отличаются по CPU, GPU, объёму видеопамяти и пропускной способности сети, а пользовательский компьютер может выключиться посреди расчёта. Вдобавок чужие мощности нужно было использовать честно: только в разрешённые интервалы, без майнинга и без скрытой нагрузки на машину владельца.
Решение
Постановка задачи. В веб-панели оператор загружает набор данных и вычислительный пакет, задаёт параметры, приоритет и требования к оборудованию. Интерфейс показывает очередь, прогресс, промежуточные результаты и историю запусков.
Реестр ресурсов. Оркестратор знает конфигурацию каждого узла: количество и тип CPU, модель GPU и доступную видеопамять, RAM, свободное место, пропускную способность сети, географию и текущую загрузку. Это не инвентарная опись — именно на этих полях строится выбор исполнителя.
Агент на узле. C++-приложение ставится на сервер или пользовательский компьютер, регистрирует доступные ресурсы, принимает задания, загружает фрагменты данных и отправляет результат. Владелец машины задаёт лимиты CPU/GPU, разрешённые часы и условия приостановки, когда за компьютером работают.
Планировщик. Он определяет, можно ли распараллелить задачу, строит граф этапов и превращает подходящие части в набор операций Map. Жёсткие требования сразу отсекают неподходящие узлы: GPU нужной архитектуры, объём видеопамяти и RAM, операционная система, доступ к данным, минимальное свободное место. Среди оставшихся узел выбирается по совокупной стоимости — скорость передачи данных, ожидаемое время выполнения, текущая загрузка, надёжность узла и близость зависимых этапов.
Размер блока под машину. Быстрые GPU получают больше работы, слабые CPU — небольшие независимые части. Предобработка данных, пакетный инференс и перебор гиперпараметров хорошо раскладываются на независимые Map-задачи, результаты и метрики сходятся на Reduce-этапе. Этапы, которые нельзя безопасно разделить, назначаются целиком на подходящий узел или устойчивую группу ресурсов.
Расчёт на ненадёжном железе. Задания выдаются по временной аренде: агент подтверждает работу heartbeat-сигналами, а при потере узла незавершённый блок возвращается в очередь. Долгие операции продолжаются с контрольной точки, а медленные критические блоки запускаются резервно на другом узле — первый корректный результат завершает обе копии. Отказоустойчивость строится на небольших повторяемых блоках, а не на надёжности отдельного компьютера.
Изоляция и учёт. Подписанный пакет запускается в изолированном окружении: агент ограничивает доступ задания к системе, шифрует обмен с оркестратором и не превышает выбранные владельцем лимиты. В учёте остаются затраченные CPU- и GPU-часы, объём переданных данных, вклад каждого узла и статистика успешности — это одновременно контроль сети и основание для расчёта предоставленных пользователями мощностей.
Сборка результата. Промежуточные данные объединяются по ключам или этапам, итоговые метрики, артефакты модели и обработанные наборы возвращаются в центральное хранилище.
Результат
Разрозненные вычислительные мощности заработали как единая управляемая платформа. Задача уходит в сеть через веб-интерфейс, распределение по узлам видно на дашборде, собранный результат возвращается сам — назначать работу на конкретные машины вручную больше не нужно. При отключении узлов незавершённые блоки перераспределяются автоматически, и расчёт не начинается заново.
Дашборд показывает географию сети, число доступных компьютеров, суммарные CPU/GPU/RAM, состояние агентов и загрузку по задачам. Для каждого запуска сохраняются конфигурация, распределение блоков, потраченные ресурсы, ошибки, повторные назначения и итоговые артефакты, поэтому запуски можно сравнивать между собой и повторять с теми же параметрами. Владельцы пользовательских машин отдают ровно то, что разрешили сами, и видят свой вклад в учёте.