Как использовать Функции Azure для предоставления конечной точки REST API для обслуживания моделей машинного обучения, которые могут быть вычислены на другом сервере

Когда специалист по обработке данных разрабатывает модель машинного обучения, будь то с помощью Scikit-Learn, фреймворков глубокого обучения (TensorFlow, Keras, PyTorch) или специального кода (выпуклое программирование, OpenCL, CUDA), конечной целью является сделать ее доступной в производственной среде.

Однако в большинстве случаев нам просто нужен простой способ вызвать REST API и получить прогнозы с использованием текущего классификатора. Например, мы можем просто показать, как модель интегрируется с пользовательским интерфейсом, не беспокоясь о настройке среды, масштабировании до производственной среды, балансировке нагрузки и т. Д.

Этот пост продемонстрирует самый простой способ, который я нашел:

  • Построить модель машинного обучения;
  • Предоставьте конечную точку (REST API), чтобы веб-сайт / приложение могло отправить сообщение на http://myendpoint.com/predict и получить результаты;
  • Весь исходный код и инструкции по установке доступны по адресу https://github.com/douglas125/AzureMLDeploy

Нам не нужно беспокоиться об экспорте моделей, создании образов Docker, запуске непосредственно в браузере, установке пакетов и т. Д. - есть множество ресурсов, которые решают эти проблемы (см. Ссылки). В этой статье сервер машинного обучения (MLServer) может быть локальным компьютером или виртуальной машиной в облаке. Он получит данные, которые необходимо обработать, и отправит результаты обратно.

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

Как это работает?

Приложение-функция Azure действует как посредник, который получает и хранит запросы от клиентов и ответы от MLServer. Когда клиент возвращается, чтобы получить результаты, приложение-функция доставляет их клиенту.

Это выглядит очень просто - и так оно и есть. Именно то, что мы ищем в этой статье.

Пример 1: простая страница Ajax

Следуя инструкциям по установке, доступным в репозитории, можно создать простую страницу Ajax, которая суммирует рабочий процесс на стороне клиента и MLServer. Обратите внимание, что, хотя страница HTML чрезвычайно проста, она по-прежнему демонстрирует, как отправлять данные POST на конечные точки со стороны клиента (для отправки заданий и получения результатов) и из MLServer (для получения заданий и отправки результатов).

Пример 2: Запуск DeepLabV3 + как службы

C # - хороший инструмент для создания пользовательских интерфейсов для Windows. В этом примере показано, как сделать вывод с помощью python (который служит MLServer). Еще раз, весь код доступен в этом репозитории.

Последовательность изображений ниже демонстрирует, что происходит на стороне клиента и MLServer. Обратите внимание, что MLServer может быть любым компьютером или виртуальной машиной, на которой работает модель Keras в Jupyter Notebook.

Сохраняя простоту

Бессерверные архитектуры, такие как Функции Azure или AWS Lambda, являются отличным способом включения облачных вычислений: они решают проблему масштабирования службы, обычно просты в использовании и, во многих случаях, также являются самым дешевым вариантом, поскольку не нуждаются в выделенном сервер и пользователи платят за использование (план потребления). Выбор функций Azure вызван просто моим знакомством с C #.

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

Рабочий процесс выглядит следующим образом:

  • Пользователь делает запрос на прогноз, отправляя сообщение POST для конечной точки / прогнозирования со своей полезной нагрузкой - текстом, изображением, звуком или любыми другими данными, которые необходимо проанализировать;
  • Сервер получает запрос пользователя, сохраняет полезную нагрузку и генерирует уникальный task_id, который отправляется обратно пользователю;
  • MLServer (сервер машинного обучения) запрашивает у сервера следующую работу;
  • Сервер отправляет task_id и полезную нагрузку следующего задания на MLServer;
  • MLServer обрабатывает полезную нагрузку и отправляет результаты task_id на сервер;
  • Сервер получает и хранит результаты task_id;
  • Пользователь запрашивает сервер, используя task_id, и получает результаты.

Настройка сервиса

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

Серверу необходимо обрабатывать запросы от Клиента и MLServer. Нам нужно четыре конечных точки:

  • прогнозировать - получает полезную нагрузку и создает task_id;
  • getresult - получает task_id и возвращает результаты по этой задаче (если есть);
  • getnexttask - отправляет task_id и payload на MLServer;
  • puttaskresult - получает task_id и сохраняет результат.

Мы будем использовать хранилище BLOB-объектов Azure для хранения полезных данных и результатов. Нам понадобятся две папки: входящие (где будут храниться незавершенные задачи) и исходящие (для хранения результатов). Если мы хотим использовать несколько серверов для параллельной обработки данных, мы, вероятно, захотим отслеживать, какие задачи обрабатываются (чтобы одна и та же задача не выполнялась дважды). Однако это выходит за рамки данной статьи и добавит дополнительных, ненужных сложностей для наших целей.

В функции puttaskresult мы удалим полезную нагрузку из папки входящих и сохраним результаты в папке исходящих. Если бы мы хотели, мы могли бы скопировать полезную нагрузку в «обработанную» папку перед ее удалением, но здесь мы сделаем все просто.

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

Заключение

В этой статье продемонстрирован очень простой способ развертывания моделей машинного обучения в клиентских приложениях с помощью функций Azure для хранения и обслуживания запросов и результатов прогнозирования. Хотя этот метод не такой мощный, как Tensorflow Serving, и не универсален, как tensorflow.js, он имеет важные преимущества;

  • Развернуть очень просто;
  • Это позволяет программисту использовать ЛЮБУЮ модель машинного обучения, а не только нейронные сети, а также любые этапы предварительной и постобработки;
  • Нет необходимости ничего конвертировать или докеризовать;
  • Нет необходимости выделять выделенную виртуальную машину - логический вывод можно выполнять локально;
  • Поскольку логический вывод может выполняться локально, а приложения-функции оплачиваются за запрос / хранилище, это дешевый вариант для демонстрации концепций.

Конечно, есть недостатки:

  • Это не лучший вариант для обслуживания моделей, которые должны работать в режиме, близком к реальному времени (т. Е. Имеют ограничения по времени выполнения);
  • Он не запускается в клиенте, как tf.js;
  • Балансировка нагрузки на MLServers должна выполняться вручную.

Обратите внимание, что чаще всего разработчики не беспокоятся об этих недостатках на ранних этапах прототипирования / разработки - они могут просто оставить один компьютер включенным (или даже Google Colab) и сделать REST API доступным для команды пользовательского интерфейса.

Я нашел самый простой способ быстрого развертывания алгоритма машинного обучения в его текущем состоянии в клиентском приложении.

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

Tensorflow.js. Https://js.tensorflow.org/

Развертывайте модели с помощью службы машинного обучения Azure. Https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-deploy-and-where

Руководство по развертыванию моделей машинного / глубокого обучения в производственной среде. Https://medium.com/@maheshkkumar/a-guide-to-deploying-machine-deep-learning-model-s-in-production-e497fd4b734a

Как ЛЕГКО внедрить модели машинного обучения в производство с помощью Tensorflow Serving. Https://medium.com/coinmonks/how-to-easily-put-machine-learning-models-into-production-using-tensorflow-serving-91998fa4b4e1

Что мы узнали, обслуживая модели машинного обучения с помощью AWS Lambda. Https://medium.freecodecamp.org/what-we-learned-by-serving-machine-learning-models-using-aws-lambda-c70b303404a1

Классификация изображений - образец оценки. Https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/getting-started/DeepLearning_ImageClassification_TensorFlow

ML.NET - кроссплатформенная платформа машинного обучения с открытым исходным кодом. Https://dotnet.microsoft.com/apps/machinelearning-ai/ml-dotnet

Руководство для начинающих по обучению и развертыванию моделей машинного обучения с использованием Python. Https://medium.freecodecamp.org/a-beginners-guide-to-training-and-deploying-machine-learning-models-using-python-48a313502e5a

Развертывание модели машинного обучения как REST API. Https://towardsdatascience.com/deploying-a-machine-learning-model-as-a-rest-api-4a03b865c166

Развертывание моделей машинного обучения сложно, но не обязательно. Https://www.anaconda.com/blog/developer-blog/deploying-machine-learning-models-is-hard-but-it-doesnt-have-to-be/

КАК МЫ РАЗВЕРТЫВАЕМ МОДЕЛЬ SCIKIT-LEARN С ФЛЯСКОЙ И ДОКЕРОМ. Https://blog.solutotlv.com/deployed-scikit-learn-model-flask-docker/?utm_medium=How-do-I-deploy-Machine-Learning-Models-as-an-API&utm_source=quora

Файл: Policja konna Poznań.jpg. Https://commons.wikimedia.org/wiki/File:Policja_konna_Pozna%C5%84.jpg

Автор LukaszKatlewa - собственная работа, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=49248622

Реализация Deeplabv3 + в Keras. Https://github.com/bonlime/keras-deeplab-v3-plus