Абстрактный

В мире машинного обучения развертывание модели является важной частью головоломки. В то время как специалисты по данным преуспевают в других частях конвейера, развертывание моделей машинного обучения, как правило, подпадает под эгиду разработки программного обеспечения или ИТ-операций. И не зря — для успешного развертывания требуется множество сложных задач, включая построение инфраструктуры, внедрение API, балансировку нагрузки и интеграцию с конвейерами данных. Мы кратко познакомим вас с примером развертывания базовой модели, выбрав инструменты и спланировав подход к построению простой модели классификации настроений.

вступление

К концу этого поста у вас будут инструменты для обслуживания ваших моделей глубокого обучения (DL) через API. Мы также обсудим плюсы и минусы каждого инструмента, а также общие проблемы, с которыми вы столкнетесь при развертывании. Ниже приведены требования к инструментам, которые мы будем использовать в этом руководстве. Мы будем использовать Python, поэтому вам необходимо знать код Python. Обратите внимание, что некоторые пакеты имеют большие размеры файлов, поэтому не стесняйтесь загружать их заранее. Давайте начнем с самой простой формы развертывания, сервера Flask.

Требования

Python 3.6=‹

Фляжка

TensorFlow/keras

Анаконда

Инструменты

Колба

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

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

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

TensorFlow и Керас

TensorFlow — это обширная платформа/инструментарий для создания моделей прогнозирования. Библиотека поддерживает численные вычисления и хорошо подходит для работы с компьютерным зрением и обработкой естественного языка. Он определяет модель как статический граф потока данных с подробными сведениями о том, как данные перемещаются по графу и какие операции применяются к данным. Другие функции включают Tensorboard с инструментами для визуализации и Tensorhub с предварительно обученными моделями.

Keras — это высокоуровневый API нейронной сети, который использует TensorFlow на сервере и позволяет быстро экспериментировать.

Анаконда

Anaconda — это платформа для обработки данных, которая поставляется в комплекте с обычными пакетами Python. Эта платформа также имеет другие полезные встроенные инструменты, такие как conda, которая представляет собой виртуальную среду и менеджер пакетов для python. Он также поставляется с блокнотом Spyder и Jupyter, которые являются популярными инструментами, упрощающими работу с данными, такую ​​как исследование и визуализация данных.

Используя эти инструменты вместе, мы используем платформу Flask для создания сервера приложений, который может обслуживать ваши модели TensorFlow и Keras.

Вариант использования

Flask идеально подходит для сценариев, в которых вы хотите быстро продемонстрировать вывод своей модели и смоделировать идеальный рабочий процесс. Этот рабочий процесс быстрого развертывания дает вам больше времени для разработки модели. Поскольку Flask включает встроенный веб-сервер, ему не требуется особых настроек или поддержки для приема HTTP-запросов. Однако Flask не очень хорошо масштабируется, так как он действительно предназначен для поддержки только одного запроса за раз. Как правило, вы хотите разместить выделенные веб-серверы (например, NGINX) и серверы приложений (например, uWSGI, Gunicorn, mod_wsgi) перед Flask, чтобы он мог обрабатывать большое количество запросов одновременно. .

Проекты Proof of Concepts (POC) выигрывают от Flask, поскольку он может быстро продемонстрировать сквозной рабочий процесс модели. Наличие сервера прогнозирования может помочь бизнес-руководителям легко увидеть и понять проблему, которую решает модель, и то, как она вписывается в производственный конвейер.

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

Теперь давайте начнем и развернем нашу модель классификации настроений!

Окружающая среда/зависимости

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

Если у вас уже есть эти пакеты, вы можете пропустить этот шаг. Сначала мы создадим виртуальную среду с именем «flask_deployment», хотя вы можете выбрать любое другое имя, которое вы предпочитаете. Создание виртуальной среды поможет содержать пакеты в этой среде, чтобы вы могли легко управлять версиями пакетов и избегать конфликтов между различными проектами.

$ conda create -n flask_deployment python=3.6 anaconda
$ source activate flask deployment
$ pip install Flask
$ pip install TensorFlow
$ pip install keras

Пошаговое руководство по коду

*Полный код доступен здесь: https://github.com/nightfalldlp/model_deployment

Прохождение кода Python

Вот шаги по развертыванию сервера Flask. Мы разбили строки кода для облегчения понимания. Мы также предоставили полный репозиторий кода в начале и в конце этого раздела.

1. Импорт

В строках 8–12 мы импортируем необходимые библиотеки.

import pickle
import tensorflow as tf
from flask import Flask, request, jsonify
from keras.preprocessing.sequence import pad_sequences
from keras.models import load_model

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

В строке 16 мы создаем экземпляр объекта Flask.

application = Flask(__name__)

3.Маршрут и декоратор

Строки 27–29 — это декоратор, который направляет любой запрос в указанную конечную точку (например, '/') и запускает декорируемую функцию, в данном случае это будет работа функция.

@application.route('/',methods=['GET'])
def running():
    return "Testing the landing page! This worked"

4.Запуск приложения

Строки 87–88 запускают сервер на локальном сервере разработки, который доступен как localhost (хотя, если вы укажете, что он работает на «0.0.0.0», он откроет ваш адрес для локальной сети). Однако они не рекомендуются для производственной среды и обычно используются только при разработке.

if __name__ == "__main__":
    application.run(host="0.0.0.0", port=5000, debug=True)

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

$ export FLASK_APP=test_app.py
$ flask run -h 0.0.0.0
If successful you should see  * Serving Flask app "test_app.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
To test your server, in your terminal you can either run
$ curl http://127.0.0.1:5000/

Или посетите http://127.0.0.1:5000/ в веб-браузере.

5. Маршрут номер 2 с использованием POST-запроса

В строках 40–45 мы переключаемся на POST-запрос с GET-запроса. Обе версии могут передавать данные через HTTP-протоколы, однако запрос GET содержит параметры в строках URL, а POST — в теле сообщения. Это избавляет вас от необходимости использовать кодировку URL и позволяет создавать более крупные (состоящие из нескольких частей) сообщения. С TLS оба они зашифрованы, однако ваши журналы на терминаторе могут захватывать целые URL-адреса.

Здесь появляется объект request. Вы можете извлечь информацию из тела запроса, используя request.get_json (строка 42).

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

$ curl http://127.0.0.1:5000/json-example -d '{"message":"this is a message"}'
You should get back {“output”: “this is a message”} if it is working successfully.

6. Запустите собственную модель TensorFlow.

В строках 55–80 мы предоставили код для нашей собственной модели TensorFlow, но вы можете изменить его, чтобы использовать свой собственный. Если вы хотите использовать свои собственные модели, сохраните свою модель keras с помощью метода model.save(path), и это позволит вам загрузить ее таким же образом. Мы также сохранили объект токенизатора (для преобразования текста в последовательность словарные идентификаторы) в виде файла рассола и теперь загружают его обратно как глобальную переменную.

with open('./dumps/tokenizer.pkl','rb') as f:
  tokenizer = pickle.load(f)

Строки 59–63 загружают модель TensorFlow.

def get_model():
  # global model
  model = load_model('./dumps/whole_model.h5')
  model._make_predict_function()
  return model
model = get_model()

Строки 70–80 используются для создания конечной точки, чтобы вы могли запустить вывод.

В этой функции мы сначала получаем сообщение из почтового запроса, а затем с помощью загруженного токенизатора преобразуем сообщение в массив numpy, чтобы наша модель могла выполнять вывод. Как только прогноз будет сделан, нам нужно будет проиндексировать массив numpy, чтобы получить доступ к оценке прогноза. Вы не можете вернуть массив numpy, поскольку он не сериализуем JSON. Вам нужно будет jsonify ваш вывод, который в основном преобразует его в строковое представление, строка 80.

@application.route('/keras-example',methods=['POST'])
def keras_exmample():
  req_data = request.json
  msg = req_data.get('message')
  ## tokenizing and model inference
  seq = tokenizer.texts_to_sequences([msg])
  seq = pad_sequences(seq,maxlen=50,padding='post')
  pred = model.predict(seq).tolist()[0][0]
  out = {'prob':pred}
  return jsonify(out)

7.Вывод маршрута

Маршрут /keras-example — это конечная точка для нашего вывода. Если ваш сервер работает, вы можете запустить следующее, чтобы получить прогнозы с вашего сервера фляги:

curl -X POST http://127.0.0.1:5000/keras-example -d '{"message":"I am extremely happy!"}' -H "Content-Type: application/json"

{В случае успеха вам должен вернуться следующий шаблон JSON: «prob»: 0.023021150380373.

}

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

Если нет, перезапустите код в терминале:

$ export FLASK_APP=test_app.py
$ flask run -h 0.0.0.0

Когда это работает успешно, вы развернули свою первую модель глубокого обучения!

Вывод

В этом посте мы узнали, как развернуть модель глубокого обучения с помощью Flask и выполнить вывод.

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

Непосредственными вызовами являются:

  1. Как масштабировать и обрабатывать одновременные запросы в вашем приложении
  2. Как сделать автомасштабирование количества машин (оптимально через облачного провайдера).

Мы можем рассказать об этих проблемах в одном из будущих постов блога и показать вам, как создать готовый к работе сервер, переместив этот сервер Flask на Amazon Elastic Beanstalk. Мы также рассмотрим дополнительные наборы функций, которые входят в комплект поставки Elastic Beanstalk.