Развертывание моделей машинного обучения как API с использованием FastAPI

Опубликовано: 17 Июля, 2021

Развертывание обычно является последним шагом в любом конвейере проекта 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]}

Предыдущий
Решения RD Sharma класса 8 - Глава 14 Сложные проценты - Упражнение 14.3 | Комплект 1
Следующий
Решения RD Sharma класса 8 - Глава 14 Сложные проценты - Упражнение 14.3 | Комплект 2
Рекомендуемые статьи
Страница :
Статья предоставлена:
Herumbshandilya
@herumbshandilya
Голосуйте за трудности
Теги статьи:
  • ML-развертывание
  • Машинное обучение
Теги практики:
  • Машинное обучение
Сообщить о проблеме
Машинное обучение

РЕКОМЕНДУЕМЫЕ СТАТЬИ