Краткое руководство по созданию приложения для обслуживания модели обработки естественного языка, его контейнеризации и развертыванию.

Автор: Эдвард Крюгер и Дуглас Франклин.

Если вам нужна помощь в создании конвейера НЛП или оценке моделей, ознакомьтесь с нашей последней статьей. Мы рассмотрели некоторые основы НЛП и то, как построить конвейер НЛП с помощью Scikit-Learn. Затем мы оценили некоторые метрики модели и выбрали лучшую модель для нашей проблемы и данных.

Обязательно ознакомьтесь с README и кодом в нашем репозитории GitHub с инструкциями по настройке этого приложения локально с помощью Docker!



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

Создание приложения

Приложение для обслуживания этой модели простое. Нам просто нужно импортировать нашу модель в приложение, получить запрос POST и вернуть ответ модели на этот POST.

Вот код приложения.

Обратите внимание, что data_dict - это словарь Python, соответствующий полезной нагрузке, отправленной через запрос POST. Из этого словаря мы можем извлечь текст для категоризации. Это означает, что нашим POST-сообщениям нужен один и тот же ключ. Итак, мы собираемся отправить JSON, где {key: value} будет {"text": "message").

Поскольку конвейер Scikit-Learn ожидает список строк, мы должны обернуть текст как список. Кроме того, при получении результата от .predict method модели мы получаем список с одним элементом и распаковываем его, чтобы получить доступ к прогнозу.

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

Имейте в виду, что мы используем диспетчер пакетов и среды pipenv для обработки зависимостей нашего приложения. Если вы не знакомы с виртуальной средой и управлением пакетами, вам может потребоваться установить это и настроить виртуальную среду с помощью Pipfile в репозитории Github. Прочтите эту статью, чтобы узнать, как это сделать!



Контейнеризация приложения

Нам нужно внести некоторые окончательные изменения в наши файлы проекта при подготовке к развертыванию. В нашем проекте мы использовали pipenv и pipenv-to-requirements для обработки зависимостей и создания requirements.txt. Все, что вам понадобится для вашего контейнера Docker, - это requirements.txt файл.

Не забудьте добавить в репозиторий созданный ранее файл Dockerfile с помощью git.

Вот ссылка на наш Pipfile для зависимостей от этого проекта.



Докер и Dockerfiles

Прежде чем мы запустим приложение в облаке, мы должны сначала сделать его Dockerize. Ознакомьтесь с нашим README в репозитории GitHub, чтобы узнать, как настроить это приложение локально с помощью Docker.

Docker - лучший способ запускать приложения в производство. Docker использует Dockerfile для создания контейнера. Созданный контейнер хранится в реестре контейнеров Google, где его можно развернуть. Контейнеры Docker могут быть созданы локально и будут работать в любой системе, на которой запущен Docker .

Вот Dockerfile, который мы использовали для этого проекта:

Первая строка каждого Dockerfile начинается с FROM.. Здесь мы импортируем нашу ОС или язык программирования. Следующая строка, начинающаяся с ENV, устанавливает для нашей переменной среды ENV значение APP_HOME / app. Это имитирует структуру каталогов наших проектов, позволяя Docker узнать, где находится наше приложение.

Эти строки являются частью структуры облачной платформы Python, и вы можете прочитать о них в облачной документации.

Строка WORKDIR устанавливает наш рабочий каталог в $APP_HOME. Затем строка Copy делает локальные файлы доступными в контейнере докера.

Следующие две строки включают настройку среды и ее выполнение на сервере. За командой RUN может следовать любой код bash, который вы хотите выполнить. Мы используем RUN для установки наших требований. Затем CMD для запуска нашего HTTP-сервера. Аргументы в этой последней строке привязывают наш контейнер к$PORT, назначают порт работником, указывают количество потоков для использования в этом порту и указывают путь к приложению какapp.main:app.

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

Чтобы исключить файлы из загрузки в Cloud Build, добавьте a.gcloudignore file. Поскольку Cloud Build копирует ваши файлы в облако, вы можете опустить изображения или данные, чтобы сократить расходы на хранение.

Если вы хотите использовать их, обязательно ознакомьтесь с документацией для файлов .dockerignore и .gcloudignore, однако знайте, что шаблон такой же, как a.gitignore!

Сборка и запуск контейнера Docker локально

Назовите и создайте контейнер с этой строкой. Мы называем наш контейнер spam-detector.

docker build . -t spam-detector

Чтобы запустить наш контейнер, мы должны использовать эту строку, чтобы указать, какие порты будет использовать контейнер. Мы устанавливаем внутренний порт на 8000 и внешний порт на 5000. Мы также устанавливаем переменную среды PORT на 8000 и вводим имя контейнера.

PORT=8000 && docker run -p 5000:${PORT} -e PORT=${PORT} spam-detector

Теперь наше приложение должно быть запущено в нашем локальном контейнере Docker.

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

Тестирование приложения с Postman

Postman - это инструмент разработки программного обеспечения, который позволяет людям тестировать вызовы API. Пользователи Postman вводят данные. Данные отправляются на адрес веб-сервера. Информация возвращается в виде ответа или ошибки, которую Почтальон представляет пользователю.

Почтальон позволяет легко проверить наш маршрут. Откройте графический интерфейс и

  • Выберите POST и вставьте URL-адрес, добавив маршрут по мере необходимости.
  • Нажмите "Тело", а затем "Необработанное".
  • В раскрывающемся списке справа выберите JSON.

Обязательно используйте «текст» в качестве ключа в вашем JSON, иначе приложение выдаст ошибку. Поместите любой текст, который вы хотите, чтобы модель обрабатывала как значение. Теперь нажмите "Отправить"!

Тогда просмотрите результат в Почтальоне! Похоже, наше электронное письмо было отнесено к категории "ветчина". Если вы получили сообщение об ошибке, убедитесь, что вы использовали правильный ключ и у вас есть расширение маршрута /predict в URL-адресе POST.

Давайте попробуем письмо из моей папки со спамом Gmail.

Хм, похоже, у нас другая модель, чем у Google.

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

Тестирование приложения с помощью curl

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

Откройте терминал и вставьте следующее. Измените текстовое значение, чтобы увидеть, что модель классифицирует как спам и радиолюбитель.

curl -H "Content-Type: application/json" --request POST -d '{"text": "Spam is my name now give all your money to me"}' http://127.0.0.1:5000/predict

Результат или ошибка появится в терминале!

{"result":"ham"}

Теперь давайте развернем приложение на Google Cloud Platform, чтобы каждый мог им пользоваться.

Образы Docker и реестр Google Cloud

GCP Cloud Build позволяет создавать контейнеры удаленно, используя инструкции, содержащиеся в Dockerfiles. Удаленные сборки легко интегрировать в конвейеры CI / CD. Они также экономят локальное вычислительное время и энергию, поскольку Docker использует много оперативной памяти.

Когда у нас будет готовый файл Dockerfile, мы можем создать образ контейнера с помощью Cloud Build.

Выполните следующую команду из каталога, содержащего Dockerfile:

gcloud builds submit --tag gcr.io/PROJECT-ID/container-name

Примечание. Замените PROJECT-ID своим идентификатором проекта GCP, а имя-контейнера - своим именем контейнера. Вы можете просмотреть идентификатор своего проекта, выполнив команду gcloud config get-value project.

Этот образ Docker теперь доступен в реестре контейнеров GCP или GCR и может быть доступен через URL-адрес с помощью Cloud Run.

Разверните образ контейнера с помощью интерфейса командной строки.

  1. Разверните с помощью следующей команды:
gcloud run deploy --image gcr.io/PROJECT-ID/container-name --platform managed

Примечание. Замените PROJECT-ID идентификатором вашего проекта GCP, а имя-контейнера - именем ваших контейнеров. Вы можете просмотреть идентификатор своего проекта, выполнив команду gcloud config get-value project.

2. Вам будет предложено ввести название службы и регион: выберите название службы и регион по вашему выбору.

3. Вам будет предложено разрешить вызовы без аутентификации: ответить y, если вам нужен общий доступ, и n , чтобы ограничить IP-доступ к ресурсам в том же проекте Google.

4. Подождите несколько секунд до завершения развертывания. В случае успеха в командной строке отображается URL-адрес службы.

5. Посетите развернутый контейнер, открыв URL-адрес службы в веб-браузере.

Разверните образ контейнера с помощью графического интерфейса.

Теперь, когда у нас есть образ контейнера, хранящийся в GCR, мы готовы развернуть наше приложение. Зайдите в GCP Cloud Run и нажмите Создать сервис, обязательно настройте биллинг по мере необходимости.

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

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

Нажмите "Создать", когда будете готовы к сборке и развертыванию!

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

Щелкните URL-адрес, чтобы просмотреть развернутое приложение!

Поздравляю! Вы только что развернули приложение, упакованное в контейнер, в Cloud Run.

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

Заключение

Мы рассмотрели настройку приложения для обслуживания модели и локального создания контейнеров докеров. Затем мы докерили наше приложение и протестировали его локально. Затем мы сохранили наш образ докера в облаке и использовали его для создания приложения в Google Cloud Run.

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

Мы надеемся, что этот контент будет информативным и полезным. Сообщите нам, о чем вы хотите узнать больше в области программного обеспечения, разработки и машинного обучения!