BDN Sealed Volumes: один раз опубликовали, смонтировали где угодно

Источник: Baseten•

BDN Sealed Volumes: один раз опубликовали, смонтировали где угодно

BDN Sealed Volumes делают для данных моделей то же, что контейнеры делают для кода: один раз опубликовали, получили дайджест, смонтировали в любом месте. Монтирование занимает секунды.

Когда для файлов моделей нет единого источника правды, данные начинают расходиться со своим источником.

Допустим, вы дообучаете модель, а затем сохраняете контрольную точку в облачное хранилище. Затем кто-то скачивает копию на свой ноутбук для тестирования, выгружает ее куда-то еще для развертывания, и у каждого окружения (например, staging, production и testing) есть свой конфигурационный файл, указывающий на контрольную точку. Когда один человек закрепляет другую ревизию, никто этого не замечает, пока результаты не начнут различаться.

Та же проблема касается LoRA-адаптеров, векторных индексов, токенизаторов, индексов встраивания (embedding indexes), таблиц поиска и любых артефактов моделей или развертывания. Десять лет назад образы контейнеров решили эту проблему для кода: вы собираете один раз, получаете дайджест, а затем запускаете этот дайджест где угодно. Мы выпускаем BDN Sealed Volumes, чтобы сделать то же самое для данных моделей и помочь нашим клиентам обеспечивать согласованность данных между итерациями.

Что такое Sealed Volume?

Sealed Volumes позволяют один раз опубликовать любые данные только для чтения и смонтировать их в любом окружении. Передайте директорию или синхронизируйте репозиторий Hugging Face, бакет или контрольную точку обучения, и BDN запечатает результат как неизменяемую версию с дайджестом. Сошлитесь на этот дайджест в вашем config.yaml, и каждый репликатор будет передавать идентичные данные по потоку без необходимости что-либо скачивать вручную.

Том (volume) в частности — это поименованный, версионированный набор файлов, который Baseten Delivery Network (BDN) доставляет в ваши развертывания. Тома живут в пространствах имен, таких как weights, и содержат серию версий. Когда завершается baseten volume push или baseten volume sync, BDN фиксирует файлы как новую версию и запечатывает ее. Запечатанная версия никогда не меняется, и BDN идентифицирует ее по дайджесту ее содержимого:

Вы можете использовать параметр --tag при отправке (push), чтобы назначить изменяемое имя (единственную изменяемую часть) определенной версии. Например, отправка с тегом --tag prod указывает prod на новую версию; поэтому, хотя bdn:weights/qwen3-8b:prod — это имя, которое могут читать люди, дайджест — это то, на что должно ссылаться развертывание. Если вы пользовались реестрами контейнеров, это то же самое разделение между тегом и дайджестом образа, и оно существует по тем же причинам.

Поскольку ваш дайджест находится в конфигурационных файлах, несоответствия между версиями отображаются в diff.

Один том с тремя запечатанными версиями. Тег «prod» указывает на вторую версию, перемещенную туда с помощью команды push или tag, и оба развертывания ссылаются на ее дайджест.

Зачем нужны Sealed Volumes?

Запечатывание томов — это то, что поддерживает согласованность данных, когда вы строите решения поверх них. Поскольку они запечатаны:

  • Каждая реплика обслуживает одни и те же байты: запечатанная версия никогда не меняется, и каждое ссылающееся на нее развертывание монтирует те же файлы только для чтения, поэтому каждая реплика передает по потоку одни и те же байты. Закрепление дайджеста означает, что последующие отправки не смогут изменить то, что монтирует это развертывание. Чтобы откатиться, просто укажите в config.yaml более ранний дайджест.

Каждая реплика обслуживает одни и те же байты: запечатанная версия никогда не меняется, и каждое ссылающееся на нее развертывание монтирует те же файлы только для чтения, поэтому каждая реплика передает по потоку одни и те же байты. Закрепление дайджеста означает, что последующие отправки не смогут изменить то, что монтирует это развертывание. Чтобы откатиться, просто укажите в config.yaml более ранний дайджест.

  • Обновления загружают только то, что изменилось: BDN разбивает файлы на фрагменты и сохраняет каждый фрагмент один раз по его хешу содержимого, поэтому новая контрольная точка, которая разделяет большую часть своих байтов с предыдущей, загружает только те фрагменты, которые изменились. Файлы идентифицируются по хешу, поэтому BDN никогда не передает файл, который у него уже есть. Это делает итеративные загрузки (например, дообучение базовой модели) быстрыми.

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

  • Развертывания запускаются без этапа скачивания: поскольку запечатанный том монтируется по пути, который вы выбрали в config.yaml, файлы доступны сразу после запуска контейнера. Байты поступают из уровней кеша BDN по мере чтения их вашей моделью. Время запуска больше не зависит от размера тома.

Развертывания запускаются без этапа скачивания: поскольку запечатанный том монтируется по пути, который вы выбрали в config.yaml, файлы доступны сразу после запуска контейнера. Байты поступают из уровней кеша BDN по мере чтения их вашей моделью. Время запуска больше не зависит от размера тома.

Как опубликовать Sealed Volume за две команды

Для модели на Hugging Face синхронизация выполняется как надежная фоновая задача на Baseten; на вашу машину ничего не скачивается. Вот весь цикл:

Когда задача сообщает статус READY, она выводит ссылку на запечатанную версию. Скопируйте ее в развертывание:

Укажите вашему серверу путь /mnt/weights/qwen3-8b и выполните развертывание с помощью baseten model push.

Здесь нет блока weights для поддержки или учетных данных в развертывании. Последующие развертывания, ссылающиеся на уже зеркально отраженный контент, разрешаются при проверке метаданных, а не при передаче данных.

sync работает одинаково для бакетов Hugging Face, S3, GCS, Azure Blob, Cloudflare R2 и CoreWeave. Для частных источников требуется секрет Baseten, а для S3 и GCS вы можете полностью пропустить сохраненные учетные данные и предоставить доступ с помощью OIDC. Чтобы вместо этого опубликовать локальную директорию, используйте:

push загружает фрагменты параллельно и пропускает любые фрагменты, которые уже есть у BDN.

Обновление версий и откат

Отправка с флагом --tag prod перемещает тег на новую версию без публикации чего-либо:

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

Чтобы откатиться, выберите более ранний дайджест из baseten volume versions, установите его в качестве источника и повторите развертывание. Удаленная версия остается доступной для восстановления в течение 7 дней с помощью baseten volume restore.

BDN Sealed Volumes предназначены не только для весов моделей

Все, что ваша модель читает и во что не пишет, относится к тому. Распространенные файлы, которые развертывание читает во время выполнения и которые принадлежат томам, включают в себя:

  • Адаптеры и подмодели. Развертывайте несколько LoRA-адаптеров на одной базовой модели и переключайтесь между ними во время инференса. Каждый адаптер может быть собственным томом, и для нового адаптера не требуется новый образ.

Адаптеры и подмодели. Развертывайте несколько LoRA-адаптеров на одной базовой модели и переключайтесь между ними во время инференса. Каждый адаптер может быть собственным томом, и для нового адаптера не требуется новый образ.

  • Предварительно скомпилированные движки. Движок TensorRT-LLM или скомпилированный граф имеет большой объем, специфичен для GPU и неизменяем. Опубликуйте его один раз для каждого типа GPU и смонтируйте по дайджесту, чтобы при повторных развертываниях не нужно было пересобирать его.

Предварительно скомпилированные движки. Движок TensorRT-LLM или скомпилированный граф имеет большой объем, специфичен для GPU и неизменяем. Опубликуйте его один раз для каждого типа GPU и смонтируйте по дайджесту, чтобы при повторных развертываниях не нужно было пересобирать его.

  • Индексы и таблицы. Сюда входят поисковые индексы, файлы словарей, конфигурации токенизаторов, таблицы поиска и классификаторы безопасности. Сегодня они загружаются в load() или встраиваются в образ, но с использованием тома они версионируются, совместно используются в разных развертываниях и доступны при запуске.

Индексы и таблицы. Сюда входят поисковые индексы, файлы словарей, конфигурации токенизаторов, таблицы поиска и классификаторы безопасности. Сегодня они загружаются в load() или встраиваются в образ, но с использованием тома они версионируются, совместно используются в разных развертываниях и доступны при запуске.

  • Данные для оценки и эталонные данные. Например, эталонный набор, по которому развертывание оценивает себя, или шаблоны промптов, которые рендерит слой обслуживания.

Данные для оценки и эталонные данные. Например, эталонный набор, по которому развертывание оценивает себя, или шаблоны промптов, которые рендерит слой обслуживания.

  • Кэши компиляции. Кэш запуска BDN (BDN Startup Cache), первое, что мы создали на томах, публикует скомпилированные ядра реплики и захваченные графы в виде запечатанного тома (Sealed Volume) и восстанавливает их в каждой последующей реплике развертывания. Он отображается в baseten volume ls рядом с томами, которые вы публикуете самостоятельно.

Кэш компиляции. Кэш запуска BDN (BDN Startup Cache), первое, что мы создали на томах, публикует скомпилированные ядра реплики и захваченные графы в виде запечатанного тома (Sealed Volume) и восстанавливает их в каждой последующей реплике развертывания. Он отображается в baseten volume ls рядом с томами, которые вы публикуете самостоятельно.

Каждый из них представляет собой каталог и отдельную отправку тома baseten volume push. Подключение более чем одного тома означает добавление новых записей в bdn.mounts, а два развертывания, подключающие один и тот же дайджест, используют одинаковые байты на каждом уровне кэша.

Внедрение согласованности в цикл от обучения до развертывания

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

Тома помогают предотвратить рассинхронизацию данных в цикле от обучения до развертывания. Если вы обучаете модель в собственном кластере, задача с использованием CLI и ключа API публикует свой собственный результат по завершении:

С другой стороны, если вы обучаетесь на Baseten, контрольные точки задачи уже синхронизируются с хранилищем Baseten, и оттуда контрольная точка синхронизируется в том (без необходимости управления учетными данными):

Контрольная точка в вашем собственном бакете синхронизируется оттуда с помощью s3://, gs:// или других указанных выше источников.

Поскольку push и sync выгружают только те фрагменты, которые изменились, процесс обучения, публикующий контрольную точку каждые несколько сотен шагов, каждый раз переносит лишь часть модели, и каждая версия остается доступной для адресации. Информацию о более частых версиях этого цикла, когда модуль обучения публикует дельты каждые несколько минут, а кластеры развертывания применяют их «на лету», см. в описании синхронизации дельта-весов для управляемых развертываний RL (BDN в обоих случаях выступает в роли транспорта).

Насколько быстры запечатанные тома BDN?

Запечатанные тома (Sealed Volumes) считываются через те же три уровня кэша, что и веса BDN: диск ноды, кэш внутри кластера и зеркалированный источник. Разница заключается в том, что блок весов подтягивает каждый файл до запуска контейнера, поэтому время запуска увеличивается вместе с размером модели.

В отличие от этого, запечатанный том BDN монтируется за секунды, и модель считывает данные из него с той же скоростью, что и из смонтированных весов. Это означает, что фаза извлечения исключается из времени запуска (ничего остальное не меняется). Данные обслуживаются так быстро, как позволяют сеть и диск, что позволяет избежать лишних запросов на каждом уровне стека.

Та же модель с блоком «весов» и с запечатанным томом BDN. Фаза извлечения превращается в монтирование, а фаза загрузки модели выполняется одинаково в обоих случаях.

Путь ленивого чтения (lazy read) также позволяет использовать тома, размер которых превышает объем диска ноды, поскольку нода хранит фрагменты, к которым обращалась модель, и вытесняет те, которые она может получить снова. Когда модель считывает вытесненный фрагмент, кэш внутри кластера (тот же уровень, который помогает ускорить холодные запуск BDN) возвращает его на скорости сетевого соединения.

Будущее блоков весов против запечатанных томов

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

Для новых весов мы рекомендуем использовать запечатанные тома напрямую: синхронизировать источник в том и смонтировать его.

Вот как соотносятся блоки весов и тома на сегодняшний день:

Для миграции запустите синхронизацию с источником в весах, а затем смонтируйте результат в том же mount_location. Ничего в коде вашей модели менять не нужно.

Тома доступны только для чтения; для файлов, которые ваша модель записывает во время выполнения, используйте b10cache.

Начало работы

Чтобы начать использовать запечатанные тома BDN, обновите Baseten CLI до версии 1.1.0 или новее (brew upgrade baseten), а Truss до версии 0.18.30 или новее, если вы выполняете развертывание с помощью Truss. Затем запустите руководство по быстрому старту, которое публикует каталог, монтирует его и развертывает модель примерно за пять минут. На страницах управления и синхронизации рассматриваются вопросы версионирования, отката и все типы источников.

Запечатанные тома — это первый доступный пользователю примитив BDN Fabric, нового поколения сети доставки Baseten Delivery Network. Если вы хотите обсудить ваш конвейер весов, обратитесь к нашим инженерам.

Примечание. Монтирование томов недоступно на инстансах T4 или L4 по состоянию на дату последнего обновления этой статьи.

Благодарности

Большое спасибо всем, кто внес свой вклад в создание запечатанных томов BDN: Angie Montemayor, Xiaoqian Liu, Kamal Haddad, Ahmet Balkan, Amy Hu, Christine Wang, Shreya Ravi, Brian Broll, Sid Gupta, Chad Retz и Patrick R.

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

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

Все →

Ещё от Baseten