Представляем наш Training API

Источник: Modal•

Представляем наш Training API

Spindle — это API с открытым исходным кодом для обучения и дообучения открытых моделей. Разверните сервер одной командой и запускайте любой код обучения, совместимый с Tinker.

Thinking Machines изменили подход к пост-тренировке. Вы пишете цикл обучения на обычном Python на своем ноутбуке, а Tinker выполняет прямой и обратный проходы на своих GPU. Мы — большие поклонники этого решения, как и многие команды, с которыми мы работаем.

Однако по мере масштабирования эти команды постоянно сталкиваются с двумя проблемами:

  • Цена за токен становится слишком высокой, когда вы проводите десятки экспериментов.
  • Вы ограничены только теми моделями и функциями, которые решил поддерживать провайдер.

Мы считаем, что хороший API заслуживает больше одной реализации. Сегодня мы выпускаем Spindle — сервер обучения с открытым исходным кодом, совместимый с Tinker, который работает в вашем рабочем пространстве Modal. Поскольку вы владеете сервером, вы можете настроить в нем всё что угодно, а платить вы будете за время работы GPU, а не за токены. Наши конфигурации по умолчанию настроены на максимальное использование GPU «из коробки», и мы планируем продолжать внедрять оптимизации для дальнейшего улучшения соотношения цены и производительности.

Для развертывания сервера достаточно одной команды:

Затем запустите свой скрипт обучения, обратившись к серверу.

Когда вашей команде стоит использовать Spindle?

Modal теперь охватывает весь стек пост-тренировки: от кластеров по требованию до библиотеки, которая выполняет цикл обучения за вас. С чего начать?

Если вы не хотите писать цикл обучения самостоятельно, используйте нашу библиотеку обучения Modal Dojo, которую мы выпустили вчера. Просто предоставьте модель и набор данных, а Dojo сделает всё остальное. Если вы хотите контролировать всё вплоть до кластера, Modal предоставляет базовые примитивы: многоузловые кластеры по требованию и «песочницы» для развертывания RL.

Spindle занимает промежуточное положение. Вы пишете цикл обучения со своими функциями потерь, наградами и средами, а Spindle берет на себя распределенное обучение. Он поддерживает полнопараметрическое обучение и multi-LoRA для широкого спектра открытых моделей. Для команд, проводящих множество экспериментов, Spindle поддерживает сотни одновременных запусков обучения с аналогичной производительностью и значительно меньшими затратами по сравнению с API с закрытым исходным кодом.

Как это устроено

API Spindle, совместимый с Tinker, работает на базе распределенной плоскости управления, которая обрабатывает запросы и управление сессиями, а также автоматическое масштабирование контейнеров, построенное на Modal Functions.

Бэкенд Spindle включает набор дезагрегированных движков обучения и пулов вывода. Обратите внимание, что им не обязательно работать на одних и тех же ускорителях или с одинаковой точностью! Мы писали о том, как поддерживать стабильность RL в таких случаях и использовать преимущества естественной экономии средств и более высокой доступности GPU.

Вся наша система построена на примитивах Modal: Modal Clusters позволяют планировать входящие запросы для больших моделей на динамически доступных узлах, соединенных через RDMA, без необходимости резервирования кластера; Modal Volumes обеспечивают быстрое и надежное создание контрольных точек, а Modal Servers предоставляют быстрый уровень вывода. При создании обучения multi-LoRA мы также внесли различные улучшения в vLLM и PyTorch, и мы продолжим инвестировать в экосистему открытого исходного кода.

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

Spindle в действии

За последние пару месяцев мы запустили обширный набор рабочих нагрузок RL с помощью Spindle. Вот несколько примеров.

Пост-тренировка поискового агента с многоходовым диалогом

Мы воспроизвели Training Search Agents with GRPO от Джаспера Лу, где модель gpt-oss-20b обучается выполнять многоходовой агентный поиск по корпусу документов SEC с использованием инструментов сопоставления ключевых слов, grep и чтения. Задача состоит в том, чтобы отобрать набор документов, отвечающих на запрос.

Мы взяли его код с открытым исходным кодом, изменили только BASE_URL и API_KEY, чтобы они указывали на наше развертывание Spindle, и выполнили uv run. Это всё, что потребовалось.

Сравнивая два сида Spindle, наш собственный перезапуск того же кода на Tinker и результаты обучения, опубликованные автором, мы видим, что Spindle отслеживает оба варианта с точностью до 0,01 награды по всем обновлениям.

Затем мы оценили контрольные точки на обновлениях 16, 20 и 24 на тех же 32 отложенных запросах и наблюдали аналогичное соответствие:

Расширение Spindle под ваши задачи

Если вы обучаете через закрытый API, вы ограничены только теми моделями и функциями, которые решил поддерживать провайдер. Когда вам нужно что-то, чего у них нет, вы мало что можете сделать, кроме как ждать или искать обходные пути.

Поскольку Spindle имеет открытый исходный код и работает в вашем рабочем пространстве Modal, вы можете вносить изменения по мере необходимости, а наш уровень конфигурации делает это невероятно простым. Например, когда мы хотели обучить Qwen3.5-9B для долгосрочных программных задач, у нас была только конфигурация с контекстом 16k. Двумя простыми изменениями в конфигурации мы увеличили его до 256k:

Этот запуск длился около 3 дней на прерываемых GPU, автоматически возобновляясь с контрольных точек всякий раз, когда машина освобождалась. Кроме того, 8 клиентов использовали одни и те же GPU через multi-LoRA, что означает, что вы можете выполнить 8 абляций с длинным контекстом по цене и времени одной. Подробнее об этом далее.

Накопительная экономия средств

Агентный RL тратит большую часть времени на генерацию развертываний (rollouts), что требует как длительного времени декодирования, так и задержек выполнения. Пока клиент ждет длинных многоходовых развертываний, его GPU-тренеры в основном простаивают. В зависимости от рабочей нагрузки мы заметили, что тренер, обслуживающий одного клиента (даже при запуске асинхронного RL), занят менее половины времени.

В полностью асинхронном RL стандартный подход к недогрузке тренера заключается в масштабировании вычислительных мощностей для вывода и разрешении слегка off-policy развертываниям постоянно подпитывать тренера. Multi-LoRA идеально подходит для этого подхода: при фиксированном размере тренера вы можете масштабировать вывод для одного запуска, увеличить количество запусков при фиксированном бюджете на вывод или сделать и то, и другое!

Бэкенд multi-LoRA в Spindle заставляет время простоя тренера работать, позволяя многим клиентам использовать одного и того же тренера. Пока один клиент ждет развертываний, тренер выполняет шаг обучения другого клиента. Когда несколько клиентов используют одни и те же GPU, каждый запуск стоит лишь часть того, что он стоил бы на выделенных вычислительных мощностях.

Чтобы количественно оценить это, рассмотрим ту же простую задачу GRPO (модель 27B на DAPO-math) с участием от одного до восьми клиентов, использующих одного и того же тренера и GPU для вывода (4×H200 для обучения, 12×B200 для вывода).

Глядя на загрузку тренера, мы видим, откуда берется экономия:

С одним клиентом у тренера длительные периоды простоя. С четырьмя клиентами, чередующими шаги обучения, он занят примерно на 88%. Добавление клиентов снижает стоимость каждого запуска ценой того, что каждый запуск завершается немного медленнее. Обратите внимание, что существует предел: после четырех клиентов мы наблюдаем «пробуксовку» тренера, что значительно снижает пропускную способность на одного клиента.

Тот же эффект масштабируется и на агентные рабочие нагрузки. Вот некоторые рабочие нагрузки, которые мы запустили на Spindle, от одноходовой математики до долгосрочных агентов, каждая из которых сравнивается с запуском того же скрипта на Tinker:

Оплата за использование GPU вместо токенов означает, что каждый бит дополнительной пропускной способности, которую вы получаете, снижает вашу цену за токен. Более общий вывод из этих экспериментов заключается в том, что если вы загружаете свои GPU работой, например, запуская несколько экспериментов одновременно, Spindle предлагает гораздо лучшее соотношение цены и производительности, чем API с закрытым исходным кодом.

Попробуйте сейчас

Чтобы начать, следуйте инструкциям по настройке для развертывания Spindle в вашем рабочем пространстве Modal.

Spindle — это проект с открытым исходным кодом, и мы хотим развивать его вместе с пользователями. Если вы обнаружили ошибку или вам нужна модель или функция, которые мы еще не поддерживаем, создайте issue. Вы можете напрямую отправить PR для добавления конфигураций новых моделей или оптимизации производительности существующих. Чтобы предложить что-то более масштабное, приходите пообщаться с нами в наш Slack, где мы сможем обсудить ваши идеи!

Мы все еще находимся в стадии бета-тестирования и готовим оптимизации производительности, улучшенное автомасштабирование, новые функции, рецепты обучения и многое другое. Оставайтесь с нами и приятного использования Spindle! 🍽️

О чём эта статья

Ещё в разделе «AI и машинное обучение»

Все →

Ещё от Modal