Осмысление больших данных
Архитектура Kubernetes для развертывания веб-приложений машинного обучения
Используйте Kubernetes, чтобы снизить затраты на инфраструктуру машинного обучения и легко масштабировать ресурсы.
Kubernetes стал эталоном для оркестровки контейнеров. Оркестрация контейнеров означает запуск контейнеров, их выключение, их вертикальное масштабирование (количество памяти и ЦП) и горизонтальное масштабирование (количество контейнеров, работающих параллельно).
Добавляет ли Kubernetes ценность машинного обучения? Машинному обучению требуется много ресурсов для обучения модели, но мало ресурсов для обслуживания прогнозов. Kubernetes автоматически адаптирует ресурсы! Машинное обучение обычно подразумевает длительную продолжительность обучения, которую можно сократить, распределив задачу по нескольким компьютерам. Kubernetes блестяще адаптирует необходимое количество компьютеров. В целом Kubernetes снижает затраты на инфраструктуру, требуя с течением времени только необходимых ресурсов.
В этой статье описывается архитектура Kubernetes для веб-приложения с машинным обучением. Термин «архитектура Kubernetes» отвечает на вопрос «как приложение развертывается в Kubernetes?». Эта статья отвечает на этот вопрос в 4 частях, которые:
- Определите веб-приложение машинного обучения.
- Проанализируйте требования для развертывания веб-приложения машинного обучения в продакшене.
- Предложите архитектуру Kubernetes для развертывания веб-приложения машинного обучения.
- Адаптируйте архитектуру для распределенного обучения.
Если вас заинтересовала эта статья, вас также могут заинтересовать:
Определение веб-приложения машинного обучения
На высоком уровне приложение машинного обучения отвечает за две вещи:
- обучение модели: на основе обучающего набора данных обучается оценщик
- обслуживание прогнозов: на основе обученного оценщика и новых данных он прогнозирует новые значения
Один пример: прогнозист спроса
Представьте себе приложение, которое прогнозирует спрос на скутеры в районе города. Его входы и выходы отмечены красным. На следующем шаге каждый ввод и вывод будет сопоставлен с его компонентом Kubernetes.
- Ввод: считывает исторический спрос из базы данных.
- Вывод: он обслуживает прогнозы с помощью REST API. Uvicorn - это веб-сервер.
- Сериализация: записывает и считывает обученный оценщик на жестком диске. Это выход фазы обучения и вход фазы прогнозирования.
Требования к развертыванию веб-приложений машинного обучения
Требования для развертывания веб-приложений машинного обучения:
- Обеспечьте согласованность кода и средства оценки. Изменение библиотеки оценщика (например, версии sklearn, xgboost, tensorflow) может потребовать повторного обучения модели. Добавление элемента, обновление элемента или удаление элемента также требует повторного обучения модели. А поскольку веб-приложение постоянно выполняет прогнозирование, необходимо избегать расхождений между развернутым кодом и оценкой.
- Избегайте отклонения модели. Модель, обученная вчера, завтра будет менее точной. Это называется дрейфом модели. В одних областях это имеет большее значение, чем в других. При прогнозировании важны последние наблюдения, поэтому модель быстро меняется. Напротив, в компьютерном зрении, если задача состоит в том, чтобы классифицировать различные типы автомобилей, модель смещается, когда появляются новые модели автомобилей. Для большей точности следует избегать дрейфа модели.
- Вертикальное масштабирование. Обучение модели требует много памяти. Чтобы избежать ошибок, связанных с нехваткой памяти, необходимо предоставить достаточный объем памяти.
- Горизонтальное масштабирование. Обучение моделям машинного обучения может длиться очень долго. Помогает распределение обучения по нескольким компьютерам. Должно быть предоставлено достаточное количество компьютеров.
- Совместное использование обученного оценщика. Оценщик модели обучается на одном компьютере, а прогнозы обслуживаются на другом. Прогнозы также могут обслуживаться несколькими компьютерами. Сериализованный оценщик должен использоваться всеми компьютерами.
Архитектура Kubernetes для веб-приложения машинного обучения
Развертывание веб-приложения машинного обучения на производстве предъявляет новые требования. В этом разделе показано, как их можно решить с помощью Kubernetes.
Терминология Kubernetes
Раньше в этой статье говорилось о «компьютерах», в Kubernetes это переводится как «поды».
Модули - это самые маленькие и самые простые развертываемые объекты в Kubernetes. Pod представляет собой единственный экземпляр запущенного процесса в вашем кластере. Модули содержат один или несколько контейнеров, например контейнеры Docker.
Документация по Kubernetes Engine
Но чтобы упростить задачу: в этой статье у каждого модуля всегда будет один контейнер. В этой статье говорится также о сервисах Kubernetes:
Сервис Kubernetes - это логическая абстракция для развернутой группы модулей в кластере (которые все выполняют одну и ту же функцию). Поскольку модули являются эфемерными, служба позволяет группе модулей, которые обеспечивают определенные функции (веб-службы, обработка изображений и т. Д.), Может быть присвоено имя и уникальный IP-адрес (clusterIP).
В этом примере у Kubernetes будет одна служба. Эта служба отвечает за прогнозирование спроса. Он будет делать 2 вещи: обучать модель машинного обучения и предоставлять прогнозы.
Архитектура Kubernetes для веб-приложений машинного обучения
Работа Kubernetes (также известная как pod-init)
Задание Kubernetes - это модуль, который выполняется перед фактическим развертыванием, перед запуском модуля веб-сервера. Для обучения модели можно использовать задания Kubernetes. Таким образом, согласованность между кодом и оценщиком может быть обеспечена.
Kubernetes cronJob
Kubernetes cronJob - это модуль, который планируется выполнять на регулярной основе. Его можно использовать для регулярного переобучения модели (например, каждый день) с использованием последних данных. Так что дрейфа модели можно избежать.
Общий том Kubernetes
Общий том Kubernetes обменивается файлами между подами. Таким образом, обученный оценщик можно использовать в разных модулях.
На схеме выше сериализованные модели фактически сохраняются на AWS S3, но чистый подход Kubernetes заключается в использовании общих томов.
Вертикальный автомасштабирование модулей Kubernetes
Вертикальный автомасштабирование модулей Kubernetes выделяет модулям необходимую память и ЦП динамически с течением времени. Таким образом, можно избежать ошибок нехватки памяти и обеспечить вертикальное масштабирование.
Хорионцтальный скейлинг
Этому требованию отвечают 2 компонента. Количество модулей развертывания контролируется горизонтальным автоматическим масштабированием модулей Kubernetes. Он запускает и останавливает модули, чтобы удовлетворить количество одновременных HTTP-запросов. Кроме того, у заданий Kubernetes есть параметр «parallelism», позволяющий контролировать количество подов, запускаемых параллельно. Для обучения модели используются задания, и помимо Kubernetes обучение модели машинного обучения распределенным способом требует некоторой адаптации. Этому посвящен следующий раздел.
Адаптация к распределенному обучению
Обучение модели во время развертывания упрощает развертывание. Соавторам не нужно думать: как эта новая функция повлияет на устаревшую систему оценки? Как новая нормализация данных повлияет на устаревшую систему оценки? Как обновление библиотеки повлияет на устаревшую систему оценки?
Тем не менее, у него есть один недостаток: обучение модели во время развертывания (на этапе инициализации модуля) может длиться долгое время и сделать рабочий процесс развертывания (CI / CD) неэффективным. Медленный конвейер развертывания нарушает лучшие практики CI / CD.
В этом случае помогает распределение тренировки по нескольким модулям. Некоторые библиотеки предназначены для распределения обучения одной модели: например MLlib или Tensorflow. В этой статье речь не идет об этом.
В других случаях на тренинге подбирается несколько моделей, а не одна. В этом случае легко распределить обучение по схеме« мастер / рабочий ». Предполагая, что точки входа - это bin / master.py и bin / worker.sh, это представление модулей, которые оркестрируются Kubernetes:
Светло-зеленые прямоугольники показывают тип объекта Kubernetes, которым управляют: они группируют определения модулей по типу. Средние зеленые прямоугольники - это определение модуля, то есть YAML, как показано ниже. Темно-зеленые прямоугольники показывают реальные примеры определения.
apiVersion: batch/v1beta1
kind: CronJob
spec:
schedule: "40 2 * * *"
В распределенном мире Kubernetes управляет несколькими экземплярами подов.
Для заданий и cronJobs сначала выполняется модуль с именем «master»: он создает задачу в базе данных (redis, за пределами Kubernetes). Затем рабочие начинают: они выполняют задание. Рабочие процессы необходимо завершить, чтобы Kubernetes остановил модули, а затем запустил модули развертывания. С сельдереем помог следующий псевдокод:
Заключение
Развертывание веб-службы машинного обучения добавляет новые требования, такие как обеспечение согласованности между кодом и оценщиком, масштабируемость, совместное использование моделей между всеми компьютерами и предотвращение дрейфа модели. В этой статье показан один из способов решения этих требований с помощью Kubernetes. Кроме того, это значительно снижает затраты на инфраструктуру.