
Привет! С вами Олег, Рамиль и Андрей из Flocktory. Мы руководим машинным обучением и разработкой в компании, сейчас активно внедряем AI для лучшей персонализации. В прошлом году наши команды реализовали ML-сервисы, внедрили ML Feature Store и переработали жизненный цикл моделей (о чём мы подробно рассказывали на HighLoad++: https://highload.ru/moscow/2024/abstracts/12929). В этой статье поразмышляем над следующим шагом для среднего размера компании, которая внедряет AI – как масштабировать проекты машинного обучения. Обработка, анализ и обучение на данных влекут за собой применение ML систем, в том числе нейросетей. Это требует больших вычислительных ресурсов: сотни гигабайт ОЗУ, десятки ядер CPU, а также видеокарты и (или) специальные чипы для ускорения вычислений.
Рассмотрим основные варианты ресурсов, которые можно использовать, сложности, связанные с их эксплуатацией, целесообразность вложений и vendor lock. Но сначала поговорим о природе трудностей, возникающих при масштабировании.
Проблемы с масштабированием и откуда они берутся
На первый взгляд кажется, что если вы хорошо решаете задачи малыми усилиями, то с большими ресурсами делать это будет еще проще. Но нет. И вот несколько причин, почему так:
-
При работе над крупной системой в большой разнородной команде, где есть аналитики и исследователи данных, инженеры-разработчики, системные инженеры и так далее, сотрудники из разных команд часто используют различные инструменты для решения задач. Это касается как сред разработки и исполнения (Python, Matlab, Java, C/C++ etc.) так и используемых баз данных (RDBMS, NO SQL, файлы и пр.). Переквалификация может быть долгой, дорогой или невозможной в краткосрочной перспективе.
-
Внедрение новых технологий может сделать неудобным или невозможным использование единого инструментария. К примеру, основная часть ML системы может быть реализована на Java, но при имплементации новой модели могут потребоваться библиотеки на Python, C/С++ etc. Их придется интегрировать: повторная имплементация фич в текущем инструментарии может потребовать много времени и чревата большими издержками для бизнеса.
-
Вертикальное масштабирование системы может быть недоступно или слишком дорого. Конечно, это зависит от мощностей дата-центров вашего провайдера, но у любого из них есть практический предел. Это ограничивает увеличение вычислительных ресурсов на одном узле. Приходится использовать несколько узлов, объединенных в кластер, чтобы достичь требуемых мощностей.
-
В ряде случаев, когда требуется специализированное оборудование для вычислений, например, Nvidia Tesla и Tensor Cores, целесообразна покупка собственных серверов и установка их в дата-центрах провайдера.
Какие решения существуют?
Для решения проблем неоднородности инструментария используется контейнеризация приложений с помощью Docker и система оркестрации контейнеров.
Контейнерное приложение – это приложение и необходимая для него среда исполнения, собранные в определенном формате для запуска в изолированной среде в системе управления контейнерными приложениями.
В контейнерах могут быть практически любые приложения прикладного и системного уровня. они будут запущены в изолированной среде, что позволяет избегать конфликтов между системными библиотеками, а также гибко разграничивать доступ и ресурсы.
Docker – это наиболее распространенная платформа контейнеризации приложений. В ее состав входят как инструменты позволяющие собирать контейнерные приложения, так и демон, позволяющий запускать контейниризованные приложения и управлять ими в пределах одного узла.
Kubernetes – самая известная и стандартизированная система оркестрации контейнеров в кластере. Kubernetes кластеры доступны практически у любого крупного облачного провайдера (AWS, Azure, GCP и пр.).
Оговорюсь, что существуют другие технологии контейнеризации и кластерные системы управления контейнерами, но Kubernetes on Docker – наиболее распространенные и стандартные решения сейчас.
Сначала поговорим об особенностях выбора платформы для Kubernetes, а потом – об особенностях архитектуры ML систем в кластере Kubernetes. Как я отметил выше, основные варианты – это managed кластер in cloud или собственный кластер on bare metal. Рассмотрим подробнее эти варианты.
Кластер в облаке
Плюсы:
-
Обслуживанием занимается облачный провайдер. Отдельный администратор кластера не требуется, чаще всего разработчики сами справятся.
-
Доступны базы данных и другая инфраструктура с автоматическим масштабированием (S3, DynamoDB, RDS, Redshift и пр.).
-
Возможность быстро изменять количество ресурсов кластера при возникновении такой потребности.
-
Неисправности происходят реже.
Минусы:
-
Дорого, очевидно что bare metal сервера стоят дешевле без учета поддержки.
-
Большая вероятность получить жесткий vendor lock-in при использовании технологий провайдера (например, DynamoDB)
-
Неисправности, когда случаются, чинятся дольше.
-
Выбор оборудования ограничен, невозможно использовать специфическое железо.
-
Часто непрозрачное ценообразование.
Комментарий:
Конечно, сначала проще пользоваться managed кластером, чем разворачивать свой. Но потом, при возникновении проблем в расследованиях с траблшутингом, поиск причины и возможного решения может быть гораздо более долгим и болезненным. Вы будете ограничены в доступе к системному уровню, что влечет дополнительные сложности в диагностике и решении этих проблем. Некоторые, возможно, вы и не сможете решить самостоятельно при отсутствии доступа к системному уровню, придется ожидать помощи техподдержки.
С осторожностью нужно относиться к проприетарным сервисам in cloud. Они формируют vendor lock-in. Если вас перестанет устраивать провайдер, вам будет тяжелее отказаться от его услуг из-за внедренных решений на базе этих продуктов (например, проприетарные NO SQL хранилища).
Собственный кластер на физических серверах
Плюсы:
-
Аренда физических серверов у хостеров в несколько раз дешевле аренды узлов у cloud провайдеров (пример сравнения цен будет ниже).
-
Большая гибкость в выборе, конфигурировании и размещении оборудования. Colocation. Можно собрать собственные и разместить их в дата-центре. Актуально при использовании специфического оборудования (видеокарты, тензорные ядра, аппаратное шифрование и пр.).
-
Скорость устранения неисправностей часто выше, этому способствует отсутствие жестких vendor lock-in, что вводит возможность быстрой миграции и широту выбора решений провайдеров.
-
Большая гибкость в выборе и конфигурации систем и сервисов.
Минусы:
-
Для обслуживания кластера, включая развертывание, мониторинг, резервирование, требуется выделенный эксперт или даже целая команда администрирования.
-
Неисправности на раннем этапе происходят чаще, в зависимости от квалификации эксперта.
-
Масштабирование требует больше времени, в том числе на добавление серверов, изменение конфигурации, не исключена миграция между стойками и (или) датацентрами.
Комментарий:
При выборе оборудования надо отдать предпочтение именно dedicated серверам. При использовании virtual серверов можно заметить периодические просадки по IO или CPU – это аффектит скорость и стабильность вычислений.
Также имеет смысл обратить внимание на организацию сети между вашими серверами. Размещение в одном дата-центре – это хорошо, но гораздо лучше – в одной стойке и на одном коммутаторе. Скорость и стабильность связи между вашими серверами убирает множество проблем. У bare metal providers услуга размещения серверов на одной стойке называется colocation, обращайте на нее внимание.
Архитектура ML кластера
Рассмотрим минимальную схему кластера с типизацией по узлам, чтобы говорить предметнее. Каждый тип узла может быть отмаcштабирован в зависимости от требований.

-
На узлах Data приложений собираются данные для ML приложений. Хранилище Мастер Данных – это хранилище, в которое поды Data приложений загружают подготовленные данные. Если весь набор данных помещается в локальное хранилище узлов, то рекомендуется делать полную репликацию этих данных на все узлы. Это значительно снижает количество сбоев и нагрузку на сеть, когда поды с ML приложением читают данные. В качестве Хранилища Мастер Данных можно использовать ClickHouse и (или) MinIO.
-
Можно использовать colocation и подключить всю стойку (rack) к одному быстрому 10GE коммутатору. Однако, даже в этом случае, подготовленные данные важно грамотно сгруппировать. Это позволит использовать один из бинарных форматов хранения, тем самым исключить накладные расходы на парсинг, обращайте на это внимание.
-
На узлах ML приложений запускаются модели и связанные с ними функции. Они делают инференс и фиксируют результат. Узлы Хранилища Результатов Данных должны уметь принять результаты анализа данных, оценить их и предоставить доступ к ним извне. В качестве Хранилища Мастер Данных можно использовать ClickHouse и (или) MinIO.
-
Можно написать свой планировщик, используя Kubernetes API, либо воспользоваться встроенным в Dagster, Airflow и других планировщиках. В имплементации важно иметь контроль количества записей в etcd для подов. Завершившиеся поды приложений нужно периодически очищать, иначе etcd распухнет и кластер умрет.
-
Распределение нагрузки по нескольким узлам. При работе ML приложений ресурсы задействованы максимально, и это типичная ситуация, Важно, чтобы для системных сервисов всегда оставались свободные ресурсы. Исключение – environments for dev testing, в целях экономии их можно размещать на одном узле.
-
Резервирование должно быть выделено в отдельную систему, которая не зависит от работы самой ML системы. Важно, чтобы она включала в себя создание набора бекапов в разные моменты времени и их тестирование в плановых учениях по отработке внезапных отказов.
Выводы
Когда ваши ML сервисы только развиваются и не потребляют ресурсы круглосуточно, целесообразно пользоваться услугами in cloud. Можно арендовать spot и on-demand инстансы под выполнение конкретной задачи чтобы не платить за них постоянно. Да, это в разы дороже, чем virtual или bare metal инстансы (в пересчете на часы), но особенность оплаты по часам, в которых были действительно задействованы эти ресурсы, поможет сэкономить здесь и сейчас.
Если ваши ML сервисы будут круглосуточно нагружать кластер, то, при наличии экспертизы в команде, целесообразно рассмотреть bare metal провайдера. При отсутствии специальных скидок от cloud провайдера, даже при максимальной экономии и с учетом пакетных годовых офферов, стоимость virtual инстансов будет выше, чем стоимость bare metal инстансов. При резервировании менее чем на год — еще выше.
Автор: kolegich


