В этом сообщении блога мы упакуем нашу ранее созданную модель выживания Титаника и создадим службу прогнозирования на основе 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
ожидаемый результат должен вернуть версию bentomlbentoml, 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.