Развертывание моделей машинного обучения как API с использованием FastAPI
Развертывание обычно является последним шагом в любом конвейере проекта Data Science. Возможность интеграции вашей модели ML / DL в веб-приложение является довольно важной задачей. Есть много популярных фреймворков, которые можно использовать для выполнения этой задачи, например Flask и Django. Django обычно используется для крупномасштабных приложений, и для его настройки требуется довольно много времени, в то время как Flask обычно является вашим помощником для быстрого развертывания вашей модели в веб-приложении. Помимо двух упомянутых, существует еще один фреймворк, который становится довольно популярным, настолько, что его используют такие компании, как Netflix и Uber, и этот фреймворк - FastAPI. Итак, давайте разберемся, что делает FastAPI таким популярным и как его можно использовать для развертывания моделей машинного обучения в качестве API.
FastAPI против Flask:
- FastAPI намного быстрее, чем Flask, не только потому, что это один из самых быстрых модулей Python.
- В отличие от Flask, FastAPI обеспечивает более простую реализацию проверки данных для определения конкретного типа данных, которые вы отправляете.
- Автоматические документы для вызова и тестирования вашего API (Swagger UI и Redoc).
- FastAPI имеет встроенную поддержку Asyncio, GraphQL и Websockets.
Установка FastAPI:
Установка FastAPI такая же, как и для любого другого модуля Python, но вместе с FastAPI вам также необходимо установить uvicorn для работы в качестве сервера. Вы можете установить их оба, используя следующую команду: -
pip install fastapi uvicorn
Создание базового API с использованием FastAPI:
Прежде чем создавать нашу модель машинного обучения, давайте начнем с создания базового API, который вернет нам простое сообщение.
Python3
# Importing Necessary modules from fastapi import FastAPI import uvicorn # Declaring our FastAPI instance app = FastAPI() # Defining path operation for root endpoint @app .get( '/' ) def main(): return { 'message' : 'Welcome to GeeksforGeeks!' } # Defining path operation for /name endpoint @app .get( '/{name}' ) def hello_name(name : str ): # Defining a function that takes only string as input and output the # following message. return { 'message' : f 'Welcome to GeeksforGeeks!, {name}' } |
Тестирование нашего API:
В приведенном выше коде определены все операции с путями в файле, который мы назовем basic-app.py. Теперь, чтобы запустить этот файл, мы откроем терминал в нашем каталоге и напишем следующую команду: -
uvicorn basic-app: приложение --reload
Теперь приведенная выше команда имеет следующий формат: -
- basic-app относится к имени файла, в котором мы создали наш API.
- app относится к экземпляру FastAPI, который мы объявили в файле.
- –Reload указывает перезапускать сервер каждый раз при перезагрузке.
Теперь, после того как вы запустите эту команду и перейдете на http://127.0.0.1:8000/, вы увидите в своем браузере следующее.
Вы видите это сообщение, потому что вы сказали FastAPI вернуть его как Response при вызове корневого пути. Следует отметить, что наше сообщение представляло собой словарь Python, но оно было автоматически преобразовано в JSON. Теперь вместе с этим у вас также есть еще одна конечная точка, в которой вы можете получить настраиваемую строку, которая будет отображаться в сообщении, для вызова этого перехода по адресу http://127.0.0.1:8000/herumb , здесь в браузере будет отображаться следующее сообщение .
Интерактивная документация API:
Теперь, чтобы получить вышеуказанный результат, нам пришлось вручную вызывать каждую конечную точку, но FastAPI поставляется с документами интерактивного API, к которым можно получить доступ, добавив / docs в ваш путь. Чтобы получить доступ к документации по нашему API, мы перейдем на http://127.0.0.1:8000/docs. Здесь вы попадете на следующую страницу, на которой вы можете протестировать конечные точки вашего API, просмотрев вывод, который они выдадут для соответствующих входных данных, если таковые имеются. Вы должны увидеть следующую страницу нашего API.
Развертывание нашей модели машинного обучения:
Построение нашей модели:
В этом руководстве мы собираемся использовать GuassianNB в качестве нашей модели и набор данных радужной оболочки глаза для обучения нашей модели. Для построения и обучения нашей модели мы используем следующий код:
из sklearn.datasets импортировать load_iris из sklearn.naive_bayes импортировать GaussianNB # Загрузка набора данных Iris радужная оболочка = load_iris () # Получение функций и целей из набора данных X = iris.data Y = iris.target # Подгонка нашей модели к набору данных clf = GaussianNB () clf.fit (X, Y)
Теперь, когда у нас есть готовая модель, нам нужно определить формат данных, которые мы собираемся предоставить нашей модели, чтобы делать прогнозы. Этот шаг является импортом, потому что наша модель работает с числовыми данными, и мы не хотим передавать данные любого другого типа в нашу модель, для этого нам нужно подтвердить, что данные, которые мы получаем, соответствуют этой норме.
Тело запроса:
Данные, отправленные со стороны клиента в API, называются телом запроса. Данные, отправленные из API клиенту, называются телом ответа.
Чтобы определить тело запроса, мы будем использовать BaseModel в модуле pydantic и определим формат данных, которые мы будем отправлять в API. Чтобы определить тело запроса, мы создадим класс, наследующий BaseModel, и определим функции как атрибуты этого класса вместе с их подсказками по типу. Что делает pydantic, так это то, что он определяет эти подсказки типа во время выполнения и генерирует ошибку, когда данные недействительны. Итак, давайте создадим наш класс request_body: -
из pydantic import BaseModel класс request_body (BaseModel): sepal_length: float sepal_width: float petal_length: float petal_width: float
Конечная точка:
Теперь, когда у нас есть тело запроса, все, что осталось сделать, это добавить конечную точку, которая будет предсказывать класс и возвращать ее в качестве ответа:
@ app.post ('/ прогнозировать') def прогнозировать (данные: request_body): test_data = [[ data.sepal_length, data.sepal_width, data.petal_length, data.petal_width ]] class_idx = clf.predict (test_data) [0] return {'class': iris.target_names [class_idx]}
И вот наша модель машинного обучения развернута как API. Теперь все, что осталось сделать, это проверить это.
Тестирование нашего API:
Чтобы протестировать наш API, мы будем использовать пользовательский интерфейс Swagger, чтобы получить доступ к нему, вам просто нужно добавить / docs в конце вашего пути. Так что перейдите на http://127.0.0.1:8000/docs . И вы должны увидеть следующий результат:
Теперь нажмите кнопку « Попробовать» и введите данные, для которых вы хотите получить прогноз:
После того, как вы ввели все значения, нажмите « Выполнить», после чего вы увидите свой результат в разделе ответов:
Как видите, в качестве ответа мы получили наш класс. И с этим мы успешно развернули нашу модель машинного обучения как API с помощью FastAPI.
Python3
from fastapi import FastAPI import uvicorn from sklearn.datasets import load_iris from sklearn.naive_bayes import GaussianNB from pydantic import BaseModel # Creating FastAPI instance app = FastAPI() # Creating class to define the request body # and the type hints of each attribute class request_body(BaseModel): sepal_length : float sepal_width : float petal_length : float petal_width : float # Loading Iris Dataset iris = load_iris() # Getting our Features and Targets X = iris.data Y = iris.target # Creating and Fitting our Model clf = GaussianNB() clf.fit(X,Y) # Creating an Endpoint to recieve the data # to make prediction on. @app .post( '/predict' ) def predict(data : request_body): # Making the data in a form suitable for prediction test_data = [[ data.sepal_length, data.sepal_width, data.petal_length, data.petal_width ]] # Predicting the Class class_idx = clf.predict(test_data)[ 0 ] # Return the Result return { 'class' : iris.target_names[class_idx]} |