В этом сообщении блога мы упакуем нашу ранее созданную модель выживания Титаника и создадим службу прогнозирования на основе REST на основе модели. Процесс довольно общий и может быть адаптирован к любой модели Sci-kit.

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

#Identify the model to define and initialize 
from sklearn.tree import DecisionTreeRegressor  
#define the model 
survivorModel = DecisionTreeRegressor()
#train the model
survivorModel.fit(training_set, training_survived)

Следующим шагом будет настройка метода predict в качестве службы REST.
Существует множество инструментов, позволяющих быстро это сделать. Недавно я попробовал BentoML и могу сказать, что он работает потрясающе хорошо, прост в реализации, может быть докеризован для развертывания в кластере Kubernetes.

Давайте начнем

Предпосылки

Установите BentoML в среду интерпретатора Python, используя
pip install bentoml

и проверьте с помощью командной строки
bentoml --version

ожидаемый результат должен вернуть версию bentoml
bentoml, version 0.11.0

К вашему сведению: в настоящее время BentoML официально не поддерживается для Python версии 3.9, я использую версию 3.8 для своей среды
Я столкнулся с проблемой невозможности выполнить «x86_64-linux-gnu-gcc»: Нет такой файл или каталог; но исправить это было просто:
sudo apt-get install gcc

Шаг 1. Создайте класс обслуживания, т. е. определение REST, и предоставьте соответствующий метод отдыха.

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

Минимальный класс службы прогнозирования выглядит следующим образом:
название: titanic_survivor.py

import pandas as pd   
from bentoml import env, artifacts, api, BentoService   
from bentoml.adapters import DataframeInput   
from bentoml.frameworks.sklearn import SklearnModelArtifact      
@env(infer_pip_packages=True)   @artifacts([SklearnModelArtifact('model')])   
class TitanicSurvivorPredictor(BentoService):          
    @api(input=DataframeInput(), batch=True)
    def predict(self, df: pd.DataFrame):           
        return self.artifacts.model.predict(df)

описание:
@env аннотация или дескриптор (в зависимости от ваших предпочтений) будут указывать зависимости, которые будут автоматически искаться в пути интерпретатора модели.

@artifacts определяет упакованный ключ модели («модель») и тип модели, в нашем случае SklearnModelArtifact.

BentoML также поддерживает другие платформы моделей для Pytorch, Keras и Xgboost. Подробнее здесь

Декоратор @api определяет точку входа и конечную точку для вызова, т.е. predict в данном случае. input определяет тип ввода, т. е. кадр данных, а batch=True указывает входной кадр данных для включения нескольких запросов прогнозирования в виде списка, а ответ должен предоставляться в виде соответствующего списка.

Шаг 2. Сохранить службу прогнозирования

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

Вы можете сделать это в отдельном классе или использовать блокнот модели Jupyter. Добавьте следующие строки кода, как показано ниже:

from titanic_survivor import TitanicSurvivorPredictor      predictor_service = TitanicSurvivorPredictor()   predictor_service.pack('model',mySampleModel)      
saved_path = predictor_service.save()

Здесь:

  • мы импортируем службу Prediction REST, созданную на шаге 1.
  • Мы создадим сервис пакета с моделью, т. е. mySampleModel, и сохраним сервис, используя метод save().

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

Шаг 3. Запуск модели как REST API

По данным BentoML:
The BentoML packaged model format contains all the code, files, and configs required to run and deploy the model.

BentoML также предлагает сервис управления моделями Yatai, который мне еще предстоит изучить

На данный момент мы просто будем использовать локальный сервер API BentoML и размещать службу.

bentoml serve TitanicSurvivorPredictor:latest

По сути, это запустит сервер модели и предоставит URL-адрес локального хоста. В моем случае это было:

Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Шаг 4. Проверка с помощью Postman

На данный момент у нас есть функция прогнозирования модели, преобразованная в службу REST с использованием BentoML, и мы локально развернули ее с помощью сервера моделей BentoML.

Давайте запустим Postman и сделаем почтовый вызов
В моем простом примере фрейм входных данных выглядит следующим образом:

`PassengerClass, PassengerKidsCount, PassengerSiblings, FarePaid`

Итак, пример фрейма данных будет выглядеть так

[[3,4,1,16.7]]

обратите внимание на двойной массив, потому что у нас есть пакет = True на шаге 1

Введите URL как:
http://127.0.0.1:5000/predict

с таким же необработанным телом и содержанием, как указано выше; Отправьте запрос, и вы должны увидеть ответ с прогнозами

[
1.0
]

Поздравляем!! Вы успешно преобразовали свою модель машинного обучения в службу REST.