Допустим, у вас есть приложение для электронной коммерции и / или приложение для работы с большими данными (например, Apache Spark), работающее на платформе Kubernetes (система оркестровки контейнеров с открытым исходным кодом для автоматизации развертывания, масштабирования и управления контейнерными приложениями). Теперь у вас есть потребность в обслуживании предварительно обученной модели машинного обучения в существующей инфраструктуре Kubernetes с использованием ваших устоявшихся практик DevOps. В этом руководстве по решению исследуется индивидуальный подход к обслуживанию модели машинного обучения (ML) в этой инфраструктуре Kubernetes с использованием ваших устоявшихся практик DevOps. В руководстве рассматриваются следующие темы:

  • Разработайте веб-приложение и приложение Apache Spark и протестируйте их в локальной среде разработки.
  • Подготовьте среду GKE для развертывания и тестирования приложений, выполняющих вывод модели машинного обучения.
  • Разверните предварительно обученную модель TensorFlow (сквозной фреймворк машинного обучения) на KFServing (бессерверная платформа вывода моделей), размещенной на Google Kubernetes Engine (GKE) - полностью управляемой службе оркестрации контейнеров Kubernetes в Google. Облако.

Почему Google Kubernetes Engine (GKE)?

GKE - это полностью управляемый Kubernetes как сервис, который обеспечивает автоматическое масштабирование кластера, автоматическое восстановление, безопасность рабочих нагрузок и сети, интегрированное ведение журнала и мониторинг, встроенную панель управления, поддержку GPU и TPU, изоляцию контейнеров через песочницу GKE и многое другое. . Пожалуйста, проверьте документацию за исчерпывающим списком последних функций.

Почему КФСервинг?

KFServing позволяет выполнять бессерверный логический вывод в Kubernetes с контейнерами в качестве базовой инфраструктуры. Он абстрагирует различные фреймворки машинного обучения, такие как TensorFlow, PyTorch и XGBoost. Он поддерживает автоматическое масштабирование, масштабирование до нуля, канареечные развертывания, графические процессоры и многое другое.

Пошаговый подход к разработке и развертыванию решения

Вы можете продолжать использовать существующую инфраструктуру CI / CD и практику DevOps для создания решения. Ваше веб-приложение и задание Spark могут выполнять вызовы с низкой задержкой в ​​одном кластере Kubernetes в приложение вывода модели машинного обучения (работающее в KFServing). Вы можете выбрать разные типы машин для базовых узлов Kubernetes для своего веб-приложения, приложения Spark и т. Д. и приложение для вывода модели машинного обучения в зависимости от ваших требований к производительности. В качестве примера вы можете использовать оптимизированные для ЦП или оптимизированные для памяти типы машин для приложения логического вывода модели машинного обучения, использовать тип машины E для веб-приложения и использовать тип машины N2 для приложения Spark.

Представленная ниже архитектура развертывания представляет собой визуальное представление решения:

На приведенной ниже диаграмме последовательности показано взаимодействие между веб-приложением и конечной точкой вывода модели ml:

На схеме ниже показано взаимодействие между приложением Spark и конечной точкой вывода модели ml:

Решение использует следующие среды:

  1. Среда разработки - Mac (команды, которые вы будете использовать, были протестированы на Mac). Вы можете использовать Google Compute Engine (высокопроизводительные виртуальные машины) или Google Dataproc (управляемый кластер Hadoop и Spark).
  2. Разработка и модульное тестирование всех контейнерных приложений локально. Выполните интеграционный тест в GKE.
  3. Взаимодействуйте с сервисами Google Cloud с помощью Google Cloud SDK (инструменты командной строки gcloud и gsutil).
  4. Среда Google Cloud

В решении используются следующие оплачиваемые компоненты Google Cloud:

Вы будете использовать Java для веб-приложения и Scala для приложения Spark. Вы найдете весь код, файл сборки, команды, входной файл, предварительно обученную модель, файл war приложения и файл jar приложения Spark в репозитории git.

Решение включает в себя следующие шаги:

  1. Определите предварительно обученную модель машинного обучения
  2. Проверить SignatureDef модели в среде разработки
  3. Создать набор входных данных для тестирования приложения Spark на
  4. Разверните модель в TensorFlow Serving для вывода модели в среду разработки.
  5. Разработать и протестировать веб-приложение в среде разработки
  6. Создайте контейнер веб-приложения и протестируйте его в среде разработки. Отправьте его в Google Реестр контейнеров.
  7. Разработайте и протестируйте приложение Spark в среде разработки
  8. Создайте образы Spark и отправьте их в Реестр контейнеров Google
  9. Подготовить кластер Google Kubernetes Engine (GKE)
  10. Развернуть веб-приложение в GKE
  11. Разверните KFServing в GKE и протестируйте образец цветочной модели TensorFlow
  12. Разверните модель rpm в GKE и протестируйте вывод модели
  13. Протестируйте приложение Spark и веб-приложение, работающее на GKE
  14. Следить за журналами приложений GKE в Google Cloud Logging
  15. Установите все необходимое программное обеспечение в среде разработки

Пожалуйста, обратитесь к git-репозиторию commands.txt для получения полных инструкций, включая переменные и рабочие каталоги, которые вы будете использовать при создании решения.

Определите предварительно обученную модель машинного обучения

Первый шаг - собрать предварительно обученную модель машинного обучения из существующего конвейера операций машинного обучения. Вы, безусловно, можете использовать одну и ту же инфраструктуру GKE для обеспечения централизованной платформы разработки и эксплуатации для всего обучения, тестирования и проверки вашей модели машинного обучения. Машинное обучение и обучение моделей обычно являются ресурсоемкими процессами, которые затрудняют запуск на локальных машинах. Kubernetes использует распределенные вычисления для предоставления необходимых дополнительных ресурсов. Вы можете использовать Kubeflow (инструментарий машинного обучения для Kubernetes) или вы можете выборочно использовать только конвейерный фреймворк Kubeflow Pipelines, в зависимости от ваших потребностей. Для текущего решения вы будете использовать предварительно обученную модель, которую вы создали в разделе Как создать сквозную склонность к покупке решения с использованием BigQuery ML и Kubeflow Pipelines.

Вот краткий обзор решения Как создать сквозную склонность к покупке решения с использованием BigQuery ML и Kubeflow Pipelines »: варианты использования склонности к покупке широко применимы во многих отраслях, таких как розничная торговля, финансы и более. Решение показывает вам, как построить комплексное решение (самоуверенное) с использованием Google Cloud BigQuery ML (BQML), Google Cloud AI Platform Prediction и Kubeflow Pipelines (KFP) с использованием набора данных Google Analytics для определить, какие клиенты склонны совершать покупки. Самоуверенное решение включает в себя некоторые из лучших практик SDLC, в частности, при разработке компонентов конвейера. Вы можете использовать решение для охвата целевых клиентов в офлайн-кампании по электронной почте или почтовым каналам. Вы также можете использовать его в онлайн-кампании с помощью оперативного решения, когда клиент просматривает ваши продукты на вашем веб-сайте, чтобы рекомендовать некоторые продукты или инициировать персонализированное электронное письмо для клиента.

Если вы еще не построили модель, вы можете сделать это сейчас или использовать ту, которую мы предоставили в репозитории git. Это модель TensorFlow. BQML экспортировал модель в корзину Google Cloud Storage. Для оставшейся части этого решения вы будете использовать модель предрасположенности к розничной торговле (об / мин).

Проверьте подпись модели в среде разработки

После определения модели вам необходимо понять входные и выходные параметры модели. Вы можете получить это у разработчика модели или самостоятельно проверить модель. Последнее вы сделаете в текущем решении. Вы будете использовать знание параметров, чтобы использовать их в своих приложениях (веб-приложении и приложении Spark), чтобы создать правильный набор входных данных и составить полезную нагрузку данных json для проверки вывода модели rpm.

В этом разделе вам нужно будет сделать следующее:

  • Установите инструмент saved_model_cli для проверки модели оборотов TensorFlow.
  • Загрузите артефакты rpm
  • Просмотрите сохраненную модель SignatureDefs.

Установите инструмент для проверки модели TensorFlow

Вы можете установить инструмент saved_model_cli двумя способами: установив пакет tensorflow или собрав инструмент из исходного кода. Вы сделаете первое в своей среде разработки. Вы найдете команды для сборки с использованием blaze в репозитории git, если вы хотите просто использовать инструмент, а не пакет tensorflow.

Приведенные ниже команды установят инструмент saved_model_cli:

Ниже представлен результат последней команды:

Приведенный выше вывод показывает, что вы используете saved_model_cli версии 0.1.0. Если у вас другая версия, проблем возникнуть не должно. Но обратите внимание на структуру и формат экспорта модели.

Загрузите артефакты rpm из Google Cloud Storage

Теперь вы загрузите модель TensorFlow, которую BQML экспортировал в Облачное хранилище. Вы создали модель в предыдущем решении Как создать сквозную склонность к покупке решения с использованием BigQuery ML и Kubeflow Pipelines. В качестве альтернативы вы можете использовать модель, доступную в репозитории git.

Ниже приведен результат выполнения указанной выше команды gsutil:

Обязательные файлы: saved_model.pb, variables.data-0000-of-00001 и variable.index. Вы можете игнорировать eval_details.txt и train_detail.txt, которые вы создали ранее для предыдущего решения, с намерением сохранить разные версии модели rpm. Вы удалите их позже.

Проверьте сохраненную модель RPM SignatureDefs

Вы будете использовать инструмент saved_model_cli, чтобы понять входные и выходные параметры модели (SignatureDef.)

Приведенная ниже команда напечатает SignatureDef сохраненной модели rpm:

# prints the inputs and the outputs of the rpm saved model
$PATH_TO_SAVED_MODEL_CLI/saved_model_cli show \
  --dir $HOME/rpm/$RPM_MODEL_VER/ \
  --all

Ниже приведен результат выполнения указанной выше команды:

Модель об / мин предполагает "отказов" и "time_on_site" в качестве входных данных. Затем модель возвращает три выходных параметра, а именно. «Predicted_will_buy_on_return_visit», «will_buy_on_return_visit_probs» и «will_buy_on_return_visit_value».

Создайте набор входных данных для тестирования приложений

Вам необходимо создать набор входных данных на основе SignatureDef модели rpm, который вы будете использовать для тестирования приложения Spark. Вы найдете образец набора данных в репозитории git. Вы будете использовать набор данных позже, когда собираетесь тестировать приложение Spark в процессе разработки и в среде GKE.

Вы создадите файл, содержащий следующую информацию:

  • fullVisitorId

Вы проигнорируете столбец fullVisitorId. Вы можете использовать его как ключ для интеграции предрасположенности к прогнозам покупок с данными системы управления взаимоотношениями с клиентами (CRM), такими как адреса электронной почты, чтобы упростить работу с клиентами. Пример такой интеграции см. В разделе Интеграция аудитории Salesforce Marketing Cloud. В этой статье описывается, как интегрировать Google Analytics 360 с Salesforce Marketing Cloud, чтобы вы могли использовать аудитории Analytics 360 в кампаниях прямого маркетинга Salesforce по электронной почте и SMS.

  • отказов

Наша модель оборотов в минуту нуждается в этом в качестве входного параметра.

  • время_на_сайте

Наша модель оборотов в минуту нуждается в этом в качестве входного параметра.

  • will_buy_on_return_visit

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

Следующая команда распечатает образец набора данных:

Приведенная ниже команда напечатает SignatureDef сохраненной модели rpm:

# Refer to the commands.txt for detailed commands in the “4. input file to test the Spark application” section
# peek the input csv file
head -n 3 $HOME/sparkjob/rpm-hdfs-input.csv

Ниже приведен результат выполнения указанной выше команды:

Разверните модель в TensorFlow Serving для вывода модели в среде разработки.

Вы развернете модель rpm в TensorFlow Serving (TFServing), чтобы получить конечную точку. Вы будете использовать конечную точку для проверки работы запроса / ответа и для модульного тестирования приложений (веб-приложение и приложение Spark) в среде разработки.

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

Самый простой способ начать использовать TensorFlow Serving - использовать Docker.

В этом разделе вам нужно будет сделать следующее:

  • Установить / проверить Docker
  • Загрузите контейнер TFServing
  • Запустите TFServing для модели rpm
  • Проверьте конечную точку вывода rpm

Docker понадобится вам для тестирования конечной точки вывода модели rpm и контейнеров веб-приложений, которые вы собираетесь создать позже.

Следующие команды помогут вам проверить и / или установить Docker:

Ниже приведены выходные данные команд docker и docker-image version:

Загрузите контейнер TFServing:

# pull the image and ensure that the image is now available for you to use
docker pull tensorflow/serving
docker image ls tensorflow/serving

Запустите TFServing для модели rpm

TFServing ожидает, что сохраненные модели следуют определенной семантике структуры каталогов. Вы измените структуру загруженной ранее модели оборотов в минуту. Вы также удалите ненужные файлы. Затем вы запустите TFServer для модели rpm. Ваш сервер будет прослушивать порт 8000. Вы можете открыть любой порт в зависимости от потребностей вашей среды. Если вы решили это сделать, настройте команды так, чтобы они ссылались на новый порт.

Ниже приведены команды, выполняющие то, что мы только что описали:

Ниже приведен вывод команды процесса докера:

Теперь вы составите запрос POST с входными данными для модели, а именно. ‘Bounces’ и ‘time_on_site’ в контейнер TFServing, обслуживающий модель rmp:

Ниже приведен результат запроса POST:

Приведенный выше результат показывает, что покупатель собирается совершить покупку при следующем посещении веб-сайта. Вы увидите это значение в «will_buy_on_return_visit_values». Прогноз основан на пороговом значении 0,5. И вероятность составляет 0,775 (77,5%), что находится в поле «will_buy_on_return_visit_probs».

Разработка и тестирование веб-приложения в среде разработки

Вы разработаете веб-приложение в демонстрационных целях для тестирования конечной точки вывода модели ml, которая уже работает как контейнер и прослушивает порт 8000. Пожалуйста, обратитесь к диаграмме последовательности UML для взаимодействия веб-приложения с выводом модели ml конечная точка. Вы будете использовать Java в качестве серверной части и HTML / CSS в качестве клиентской части. Вы экспортируете веб-приложение как файл ecommerce.war. Приложение электронной коммерции будет доступно по пути / ecommerce / web.

В качестве альтернативы вы можете пропустить разработку веб-приложения и использовать файл ecommerce.war, который доступен в репозитории git.

В этом разделе вам нужно будет сделать следующее:

  • Установите, настройте и протестируйте Apache Tomcat
  • Разработать и протестировать веб-приложение
  • Экспортируйте файл войны (назовите его ecommerce.war)

Установить, настроить и протестировать tomcat

Если у вас нет Apache Tomcat, установите его на свой компьютер для разработки. Вы запустите tomcat на порту 8080. Вы можете настроить порт в соответствии с вашими требованиями.

Выполните следующие команды, чтобы установить и протестировать Tomcat:

Ниже приведены результаты выполнения вышеуказанных команд:

Разработать и протестировать веб-приложение

Теперь вы будете использовать HTML и файл Java из репозитория git для разработки веб-приложения с использованием вашей любимой IDE или инструмента разработки для создания файла war (ecommerce.war). Вы можете преобразовать свой проект в проект maven. Мы не будем давать инструкции по использованию IDE / maven и т. Д. Для разработки и сборки файла износа, это выходит за рамки текущего решения.

Вы будете использовать следующие поля формы:

  • URL-адрес узла вывода ML: это конечная точка узла вывода ml. Для среды разработки это будет конечная точка TFServing.
  • Вызов конечной точки вывода ML: если «нет», то внутренний Java-код пропускает вызов вывода ml. Это обеспечивает механизм для устранения неполадок
  • Отскоки (функция ввода): это входные данные для модели. Вы обнаружили входной параметр ранее, проверив SigngureDef ранее.
  • Время на сайте (функция ввода): это входные данные для модели. Вы обнаружили входной параметр ранее, проверив SigngureDef ранее.
  • Кнопка «Отправить»: отправляет форму на сервер.

Ниже приведен фрагмент HTML-страницы index.html: (полный код доступен здесь.)

Ниже представлен вывод со страницы index.html:

Ниже приведен фрагмент кода Java: (полный код доступен здесь.)

Ниже приведен результат работы бэкэнд-кода Java:

Как вы можете видеть, серверное приложение Java сделало вывод для модели rpm и распечатало ее вывод. Пожалуйста, обратитесь к диаграмме последовательности для получения подробной информации.

Вы также можете пропустить часть публикации вывода ML в целях устранения неполадок, указав «нет» (без кавычек) в поле HTML-формы «Вызов конечной точки вывода ML». Ниже приведен снимок экрана с ответом на сообщение http:

Как видите, серверное приложение Java пропустило вывод модели rpm. Это удобно при устранении неполадок, когда вы хотите протестировать только сервлет Java.

Экспорт файла войны

После того, как вы закончили разработку и модульное тестирование приложения, экспортируйте файл war, чтобы мы могли продолжить создание контейнера приложения. В качестве альтернативы вы можете использовать файл войны, доступный в репозитории git.

См. Команды и инструкции ниже:

Создайте контейнер веб-приложения и протестируйте его в среде разработки. Отправьте его в Google Реестр контейнеров.

Теперь, когда у вас есть файл .war, вы создадите образ докера, запустите контейнер с изображением, протестируете код в контейнере и отправите образ в реестр контейнеров.

Используйте приведенные ниже команды, чтобы создать контейнер с войной веб-приложений и запустить изображение:

Ниже приведены результаты выполнения вышеуказанных команд:

Вы можете видеть, что catalina.sh (сервер tomcat) запущен и прослушивает порт 8080.

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

Чтобы протестировать приложение с помощью браузера:

  • Запустите браузер и перейдите на сайт http: // {MY_DOCKER_HOST}: 8080 / ecommerce /
  • Введите «да» в поле «Вызов конечной точки вывода ML».
  • Заполните поле «URL-адрес хоста вывода ML:» конечной точкой вывода ml.

Вы найдете скриншоты веб-приложения в разделе «Разработка и тестирование веб-приложения».

Чтобы протестировать приложение с помощью curl, используйте следующие команды:

Ниже приведены результаты выполнения команд curl:

Приведенный выше вывод показывает, что сервлет Java вызвал вывод модели rpm.

Приведенный выше вывод показывает, что сервлет Java пропустил вывод модели rpm.

Теперь вы поместите изображение в Реестр контейнеров Google.

Выполните приведенные ниже команды, чтобы отправить образ веб-приложения в реестр контейнеров.

Ниже приведены выходные данные тега и команд push:

Ваш вывод для docker push зависит от того, выполняете ли вы команду в первый раз.

Разработайте и протестируйте приложение Spark в среде разработки

Вы разработаете приложение Spark для демонстрационных целей, чтобы протестировать точку вывода модели rpm, которая уже работает как контейнер и прослушивает порт 8000. Пожалуйста, обратитесь к диаграмме последовательности UML, чтобы узнать о взаимодействии приложения scala с конечной точкой вывода ml. . Вы будете использовать Scala для приложения. Вы экспортируете приложение как файл jar. Инструмент, который вы собираетесь использовать, назовет jar-файл как mlinference_2.12–1.0.jar.

Вы можете пропустить разработку приложения scala и использовать файл jar, который доступен в репозитории git.

В этом разделе вам нужно будет сделать следующее:

  • Установить и проверить работоспособность Scala
  • Установка и проверка работоспособности sbt
  • Установите и проверьте работоспособность Spark
  • Разработайте и протестируйте приложение Spark

Команды ниже устанавливают и проверяют работоспособность Scala install:

Ниже приведены выходные данные команд компиляции и запуска Scala:

Команды ниже устанавливают и проверяют работоспособность sbt install:

Ниже приведены выходные данные команд компиляции и запуска sbt:

Теперь вы подготовите рабочий каталог Spark, загрузите дополнительные jar-файлы, создадите соответствующий файл конфигурации, скопируете json-файл учетной записи службы Google Cloud и протестируете Spark-Shell. У вас будет Spark использовать Google Cloud Storage вместо локального HDFS как для файла jar приложения, так и для входного файла, файла csv, который вы создали ранее.

Выполните следующие команды, чтобы подготовить Spark к следующим шагам:

Выполните следующую команду, чтобы запустить spark-shell для быстрой проверки установки Spark:

Ниже приведен снимок экрана с командами с их выходными данными для быстрой проверки работоспособности установки Spark:

Выполните следующую команду, чтобы запустить spark-shell для тестирования программы REPL Scala для установки Spark:

Ниже приведен снимок экрана с командами с их выходными данными для программы REPL Scala для установки Spark:

Упакуйте программу HelloWorld в файл jar, используя следующие команды:

# package the code to a jar and spark-submit to the local master
cd $HOME/sbttest_sanity
sbt package

Выполните следующую команду, чтобы запустить программу Hello World с помощью spark-submit:

cd $HOME/Downloads/spark_dir/spark-3.0.1-bin-hadoop2.7/bin
./spark-submit \
  --class com.mycos.test.HelloWorld \
  --master local[1] \
$HOME/sbttest_sanity/target/scala-2.12/sbttest_sanity_2.12-0.1.0-SNAPSHOT.jar

Ниже приведен снимок экрана команды spark-submit с ее выходными данными для тестирования Spark путем отправки задания HelloWorld Spark:

Теперь вы разработаете программу scala, которая будет читать входной файл, содержащий образцы данных, которые вы создали ранее, и вызывать точку вывода ml для каждой из входных записей. Вы можете оптимизировать программу для разделения данных в Spark и отправки разделенных данных для прогнозирования в пакетном режиме, а не в интерактивном режиме. Однако это выходит за рамки текущего решения.

Программа scala ожидает следующих аргументов:

  • URL-адрес узла вывода ML: это конечная точка узла вывода ml. Для среды разработки это будет конечная точка TFServing.
  • Вызов конечной точки вывода ML: если «нет», то внутренний Java-код пропускает вызов вывода ml. Это обеспечивает механизм для устранения неполадок
  • Путь к входному файлу: это полный путь к образцу данных в Google Cloud Storage.

В дополнение к приведенным выше аргументам искровая оболочка ожидает определенных переменных. Мы объясним их позже.

Вы сделаете следующее:

  • Разработайте, скомпилируйте и упакуйте файл jar приложения Spark.
  • Загрузите файл jar в корзину Google Cloud Storage.
  • Загрузите файл rpm-hdfs-input.csv в корзину хранилища.
  • Протестируйте искру-отправку с правильными аргументами

Вы можете пропустить разработку файла jar и использовать тот, который доступен в репозитории git.

Следуйте приведенным ниже инструкциям, чтобы разработать, скомпилировать и упаковать приложения scala:

Ниже приведен фрагмент программы Scala: (полный код доступен здесь.)

Ниже приведен фрагмент файла sbt: (полный код доступен здесь.)

Следуйте приведенным ниже инструкциям, чтобы загрузить входной файл с образцами данных и файл jar в Google Cloud Storage:

Следуйте приведенным ниже инструкциям, чтобы протестировать искровую работу в среде разработки:

Задание scala считывает входной CSV из облачного хранилища Google, выполняет итерацию по каждой строке, печатает ее и (необязательно, в зависимости от аргумента «да» или «нет») вызывает конечную точку вывода модели ml.

Ниже приведен результат работы искровой отправки:

Приведенные выше выходные данные показывают следующие данные об оборотах на входе:

  • Полный набор данных в rpm-hdfs-input.csv
  • Каждая строка указанного выше набора данных
  • Сообщение «Пропущен вызов логического вывода ML» (поскольку в аргументе указано «нет»)

Приведенные выше выходные данные показывают следующие данные об оборотах на входе:

  • Полный набор данных в rpm-hdfs-input.csv
  • Каждая строка указанного выше набора данных
  • Прогнозы на основе логического вывода модели оборотов в минуту (потому что вы указали «да» в аргументе)

Создайте образы Spark и отправьте их в Google Реестр контейнеров.

В этом разделе вы создадите два образа Spark. Вы создадите базовый образ Spark и образ Spark, который расширяет базовый образ, с помощью Google Cloud Storage Connector с дополнительными файлами jar. Вы могли бы создать один образ с дополнительными банками, но это могло бы создать проблему при устранении неполадок. Таким образом, вы сохраните два изображения для лучшего модульного тестирования.

Приведенные ниже команды создадут два изображения и отправят их в Реестр контейнеров Google:

Подготовьте кластер Google Kubernetes Engine (GKE)

Вы разработали и протестировали веб-приложение и приложение Spark. Теперь вы собираетесь развернуть его в GKE для выполнения интеграционного тестирования.

Вы сделаете следующее:

  • Подготовьте кластер GKE и пулы узлов для конкретных рабочих нагрузок
  • Предоставьте соответствующие разрешения
  • Развернуть веб-приложение
  • Разверните и протестируйте задание Spark с помощью образов Spark из реестра.
  • Разверните KFServing и протестируйте образец модели цветов TensorFlow.
  • Разверните модель rpm

Подготовьте кластер GKE и пулы узлов

Теперь вы создадите кластер GKE и несколько пулов узлов для разных типов рабочих нагрузок Kubernetes. Вы можете изменить типы машин для каждого пула узлов в командах в соответствии с вашими потребностями. Вы развернете веб-приложение в пуле узлов «webapp-pool», а модель rpm - в пуле узлов «kfserving-pool». Искровые задания развертываются в пуле узлов по умолчанию.

Пожалуйста, найдите полную команду в репозитории git. Для KFServing вам понадобится Knative (платформа на базе Kubernetes для развертывания и управления современными бессерверными рабочими нагрузками). Поскольку Cloud Run представляет собой полностью управляемую бессерверную платформу, поставляемую Google из коробки, вы будете использовать ее в качестве компонента Knative. Для проверки готовности тестовой модели, развернутой в KFServing, вам потребуется внешняя конечная точка. который представляет собой istio-ingress, предоставляемый вам как часть установки Cloud Run.

Ниже приведены команды для этого:

Предоставить надлежащее разрешение

Вы настроите идентификацию нагрузки. Это рекомендуемый способ доступа к сервисам Google Cloud из приложений, работающих в GKE, благодаря улучшенным свойствам безопасности и управляемости. Заданию Spark требуется доступ к учетной записи хранения Google, в которой хранятся входной файл и файл jar приложения.

Выполните следующие команды, чтобы настроить идентификатор рабочей нагрузки:

Закрепите и запятнайте узлы

Теперь вы закрепите и испортите узлы webapp и kfserving, чтобы приложение использовало нужные типы компьютеров, которые вы уже создали, когда ранее подготовили GKE.

Вы создадите пространство имен и предоставите соответствующее разрешение, прежде чем переходить к следующим шагам.

Вы запустите приведенные ниже команды, чтобы закрепить и заразить узлы:

Создайте пространство имен и протестируйте изображения Spark

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

Ниже приведены команды для этого:

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

Теперь, когда вы создали пространство имен, предоставили надлежащий доступ и поместили изображения Spark в регистр контейнеров Google, вы проведете их модульное тестирование, используя готовый пример «Pi».

Приведенные ниже команды проверяют оба изображения с помощью примера «Пи»:

Ниже приведен результат выполнения команды создания искрового изображения:

Ниже представлен вывод журнала контейнера:

Приведенный выше вывод показывает, что «Pi составляет примерно 3,139155695778479». Вы получите аналогичный результат как для spark-submit, с изображением «spark: v3.0.1», так и для другого с изображением «spark_gcs: v3.0.1».

Разверните веб-приложение в GKE

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

Вы найдете файл webapp.yaml в репозитории git. Он понадобится вам для его развертывания.

Ниже приведены команды, которые вы будете использовать для развертывания веб-приложения:

Разверните KFServing в GKE и протестируйте образец модели цветов TensorFlow.

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

Следующая команда развертывает диспетчер сертификатов:

cp $GIT_CLONE_HOME_DIR/gke_deploy_dir/cert-manager.yaml .
# deploy cert-manager
kubectl apply --validate=false -f $HOME/gke_deployment/cert-manager.yaml

Ниже приведен результат выполнения указанной выше команды:

Вы развернете версию KFServing v1beta1. Вы будете использовать измененную версию файла kfserving.yaml, доступного в репозитории git для вашего кластера. Пожалуйста, обратитесь к файлу yaml, чтобы узнать о точных изменениях, внесенных в файл в репозитории. Вы создадите пространство имен для развертывания KFServing, а затем развернете файл yaml. Вы настроите идентификацию рабочей нагрузки. Вы также развернете пример TensorFlow flowers, который доступен в репозитории Git KFServing. После этого развертывания вы сможете проверить работоспособность развертывания.

Выполните команду ниже, чтобы развернуть пример:

Следующие команды и инструкции делают это:

Ниже приведен результат выполнения команды kubectl apply:

После развертывания KFServing в кластере GKE вы можете проверить работоспособность развертывания, выполнив следующие команды, чтобы сделать вывод из примера TensorFlow flowers, который доступен в репозитории git KFServing:

Ниже приведен снимок экрана двух команд curl с их выходными данными:

Выходные данные первого curl показывают «состояние» как «ДОСТУПНО», что означает, что модель готова обслуживать запросы. Выходные данные второй команды показывают «прогнозы», возвращаемые KFServing.

Разверните модель rpm в GKE и проверьте вывод модели

Вы развернете загруженную ранее модель rpm в кластер. Вы будете использовать файл .yaml, который доступен в репозитории git. Вы также проверите, готова ли модель rpm принимать трафик. Следующие ниже команды делают это:

Ниже приведен результат выполнения указанной выше команды curl:

Протестируйте приложение Spark и веб-приложение в GKE

Вы протестируете веб-приложение, а также отправите искровое задание в GKE. Вы протестируете сквозную интеграцию как из веб-приложения, так и из приложения Spark. Он включает вызов модели машинного обучения из обоих приложений.

Вы начнете с тестирования приложения Scala, отправив его в Spark в GKE. Для проверки вам необходимо сделать следующее:

  • Подготовьте каталог с двоичными файлами Spark, включая spark-submit
  • Установите сертификат, токен и секрет для подключения к кластеру GKE.
  • Наконец, отправьте искру задание Spark

Нижеуказанные команды выполняют вышеупомянутые задачи:

Вы найдете скриншоты выходных данных приложения Spark в разделе «Разработка и тестирование приложения Spark».

Чтобы протестировать веб-приложение с помощью браузера:

  • Запустите браузер и перейдите на сайт http: // ‹EXTERNAL_IP›: 8080 / ecommerce /
  • Введите «да» в поле «Вызов конечной точки вывода ML».
  • Заполните поле «URL-адрес хоста вывода ML:» конечной точкой вывода ml. Вы уже собрали локальный узел докеров в следующей переменной $ MLINFER_ENDPOINT_INTERNAL.

Ниже приведена команда, которая дает вам внешний IP-адрес:

# gather the external ip
export EXTERNAL_IP=`kubectl get svc -n $WEBAPP_NAMESPACE -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'`
echo $EXTERNAL_IP

Вы найдете скриншоты веб-приложения в разделе «Разработка и тестирование веб-приложения».

Отслеживайте журналы приложений GKE в Google Cloud Logging

Вы будете отслеживать все журналы своих приложений в Google Cloud Logging. Вам нужно найти контейнер, который выполнил вашу работу.

Вы найдете контейнер последнего запуска, введя следующую команду:

kubectl logs -f `kubectl get pods -n $SPARK_NAMESPACE \
  --sort-by=.metadata.creationTimestamp | grep driver \
  | tail -1 | awk -F ' ' '{print $1}'` -n $SPARK_NAMESPACE

Перейдите в Google Cloud Console → Kubernetes Engine → рабочая нагрузка → ‹определите контейнер, в котором запущено задание› → Журналы → Журналы контейнеров

Следующие шаги

  • Обратите внимание на безопасность:

- вы использовали конечную точку HTTP как для веб-приложения, так и для приложения Spark. Настройте и используйте SSL.

- Установите флажок Повышение безопасности кластера.

- Проверьте Обзор безопасности.

  • Вызов конечной точки вывода машинного обучения на стороне веб-клиента:

Зарегистрируйте URL-адрес хоста службы, предоставляемой knative, в вашем DNS с общедоступным IP-адресом входа. Значение хоста находится в переменной MLINFER_ENDPOINT_EXTERNAL. Публичный IP находится в переменной INGRESS_HOST.

  • Используйте разделение данных и пакетное прогнозирование:

Вы выполнили итерацию по входным данным, и для каждой строки входных данных вы вызывали конечную точку вывода ml. Вы использовали онлайн-прогноз для вывода ml. Вы можете разделить данные для задания Spark. Затем вы можете выполнить пакетное прогнозирование для повышения производительности.

  • Запишите результаты прогнозов в постоянное хранилище:

Вы распечатали результаты прогноза на консоли в приложении Spark. Вы можете записать результаты в постоянное хранилище.

  • Разверните разные версии модели и проведите A / B-тестирование, чтобы узнать эффективность новых моделей:

Вы развернули только одну версию модели rpm. Вы можете развернуть несколько версий модели rpm. Вы можете протестировать их на реальном производстве, проведя A / B-тестирование, чтобы выяснить, какая версия модели работает лучше.

  • Используйте оператор Spark:

Вы использовали уменьшенную версию Spark в демонстрационных целях. Возможно, вы уже используете Оператор Spark для полноценного кластера Spark. Если нет, то вы можете рассмотреть оператор Spark

Вы использовали докер в локальной среде для тестирования веб-приложения, приложения Spark и обслуживания модели rpm. Вы можете тестировать свои приложения в GKE напрямую, используя Skaffold. «Skaffold управляет рабочим процессом для создания, продвижения и развертывания вашего приложения, позволяя вам сосредоточиться на самом важном: написании кода».

  • Сверните часть статьи, посвященную инициализации и ci / cd, в существующую инфраструктуру DevOps. Используйте декларативный YAML вместо императивных команд kubectl

Вы выполнили команды оболочки и gcloud для подготовки инфраструктуры GKE и для создания образов Docker. Вы использовали операцию kubectl для изменения кластера, например. "Kubectl expose deployment". Вы можете создать развертывание и сервис YAML, а затем использовать kustomize, чтобы развернуть его очень легко с помощью одной команды. Мы предлагаем вам автоматизировать эти шаги и написать Infra как код и включить их в существующую инфраструктуру конвейера.

  • Используйте gRPC вместо конечной точки HTTP:

В решении вы использовали HTTP, однако для повышения производительности мы рекомендуем использовать gRPC. Пожалуйста, ознакомьтесь с дорожной картой KFServing, чтобы узнать о поддержке этой функции.

Резюме

Поздравляем !!! Вы дошли до конца решения. Вы узнали, как выполнить вывод модели машинного обучения в KFServing из веб-приложения и приложения Spark, в котором и приложения, и KFSeriving запускают среду GKE. Мы надеемся, что вам понравилось комплексное решение, и надеемся, что вы сможете использовать полученные знания и фрагмент кода в своих проектах.

Хочу больше?

Пожалуйста, оставьте мне свои комментарии с любыми предложениями или исправлениями.

Обо мне: Я работаю в Google Cloud. Я помогаю нашим клиентам создавать решения в Google Cloud. Вот мой профиль в linkedin.

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

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