API машинного обучения с использованием FASTAPI

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

API стали очень распространены в нашей повседневной жизни; мы ежедневно используем API, начиная с входа в наши приложения на мобильных телефонах и заканчивая нажатием кнопки для совершения платежа на веб-сайте. API-интерфейсы предоставляют платформу для взаимодействия между этими приложениями с помощью различных команд. В машинном обучении мы можем заставить других взаимодействовать с нашими моделями машинного обучения с помощью API. В этом проекте FastAPI использовался для того, чтобы другие могли взаимодействовать со встроенной моделью классификации машинного обучения, предсказывающей шансы на выживание на титаническом корабле. FastAPI — это современная, быстрая (высокопроизводительная) веб-инфраструктура для создания API с Python 3.7+ на основе стандартных подсказок типа Python.

Ключевые особенности FastAPI включают в себя;

  1. Быстро: FastAPI — одна из самых быстрых доступных платформ Python. Он имеет очень высокую производительность, которая находится на одном уровне с NodeJS и Go.
  2. Быстро кодировать
  3. Меньше ошибок: Сокращение примерно 40% ошибок, вызванных человеком (разработчиком).
  4. Easy: Разработан, чтобы быть простым в использовании и обучении. Меньше времени на чтение документов.
  5. Надежность: получите готовый к работе код. С автоматической интерактивной документацией.

Ниже описана процедура создания моего FastAPI.

  1. Настройка виртуальной среды

Окна:

  python -m venv venv; venv\Scripts\activate; python -m pip install -q --upgrade pip; python -m pip install -qr requirements.txt  

MacOS и Linux

  python3 -m venv venv; source venv/bin/activate; python -m pip install -q --upgrade pip; python -m pip install -qr requirements.txt  

2. Импортированные необходимые библиотеки

###Imports
from fastapi import FastAPI
from sklearn import preprocessing
import pickle, uvicorn,os
from pydantic import BaseModel
from sklearn.impute import SimpleImputer
from sklearn.compose import make_column_selector as selector
from sklearn.metrics import accuracy_score
import pandas as pd 
import numpy as np
from typing import Union

В отличие от фреймворка Flask, FastAPI не содержит встроенного сервера разработки. Поэтому нам нужен Увикорн. Библиотека реализует стандарты ASGI и работает молниеносно. ASGI означает асинхронный интерфейс шлюза сервера. Uvicorn использует библиотеки uvloop и httptools. Он также обеспечивает поддержку HTTP/2 и WebSockets, которые не могут быть обработаны WSGI.

Pydantic — это библиотека Python для анализа и проверки данных. Он использует механизм подсказки типов более новых версий Python 3.6+ и проверяет типы во время выполнения. Pydantic определяет классBaseModel. Он действует как базовый класс для создания пользовательских моделей.

3. Конфигурация и установка

Чтобы настроить и настроить наш API, нам нужно указать путь каждой переменной в среде.

##Variable of environment

DIRPATH = os.path.dirname(__file__)
ASSETSDIRPATH = os.path.join(DIRPATH ,'assets')
ml_components = os.path.join(ASSETSDIRPATH ,'api_with_ml_pipline.pkl')
print(f"{'*'*10} Config {'*'*10}\n INFO: DIRPATH = {DIRPATH}\n INFO:ASSETSDIRPATH ={ASSETSDIRPATH}")
## API  Basic Config
app = FastAPI(title = 'Titanic Survival API',
               version = '0.0.1',
               desccription = "Prediction of Surival on the titanic Ship" )

4. Загрузка экспорта из блокнота Jupyter.

Модель и конвейер были экспортированы из Jupyter Notebook для встраивания в этот API.

## Loading of assets 
with open(ml_components,'rb')as f:
    loaded_items = pickle.load(f)
print("INFO: Loaded assets :",loaded_items)

ml_processsor = loaded_items['pipeline_for_preprocessing']
ml_model = loaded_items['model']

Чтобы экспортировать файл require.txt, модель и конвейер из ноутбука в API, использовались приведенные ниже коды.

ml_api = {'pipeline_for_preprocessing':preprocessor,
      'numeric_columns': num_cols,
      'categorical_columns': cat_cols,
      'model':best_rf_model}
with open("api_with_ml_pipline.pkl", 'wb') as file:
    pickle.dump(ml_api, file)
with open('api_with_ml_pipline.pkl', 'rb') as file:
    loaded_object = pickle.load(file)

5. Получение входных данных и их обработка для возврата в качестве выходных данных

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

### Base Model
class ModelInput(BaseModel):

    SibSp: float
    PassengerId :float
    Pclass: float
    Parch :float 
    Fare :  float
    Age: float
    Sex_female: float
    Embarked_C : float   
    Embarked_Q : float   
def processing_FE(dataset,  imputer=None, FE=None ): 
    if imputer is not None:
        output_dataset = imputer.transform(dataset)
    else:
        output_dataset = dataset.copy()
    if FE is not None:
        output_dataset = FE.transform(output_dataset)

    return output_dataset
def make_prediction(
    SibSp,PassengerId,Pclass, Parch,Fare, Age,Sex_female, Embarked_C,Embarked_Q
    ):
    df = pd.DataFrame([[SibSp,PassengerId,Pclass, Parch,Fare, Age,Sex_female, Embarked_C,Embarked_Q]],
    columns = ['SibSp','PassengerId','Pclass','Parch','Fare' ,'Age','Sex_female', ' Embarked_C',Embarked_Q ],
    )
    X = processing_FE(dataset = df, FE = None)
    model_output = ml_model.predict(X).tolist()

    return model_output

6. Конечные точки

Конечные точки API — это определенное цифровое местоположение, куда одна программа отправляет запросы на информацию для получения существующих там цифровых ресурсов. Конечные точки указывают, где API могут получить доступ к ресурсам, и помогают гарантировать правильное функционирование встроенного программного обеспечения.

### Endpoints
@app.post('/titanic survivor')
async def predict(input: ModelInput):
    """__descr___
    ____details___
    """
    output_pred = make_prediction(SibSp = input.SibSp,
        PassengerId = input.PassengerId,
        Pclass = input.Pclass,
        Parch  = input.Parch,
        Fare = input.Fare,
        Age = input.Age,
        Sex_female = input.Sex_female, 
        Embarked_C = input.Embarked_C,
        Embarked_Q = input.Embarked_Q)

7. Маркировка вывода модели

# Labelling Model output   
    if output_pred == 0:
        output_pred = "No,the person didn't survive"
    else:
        output_pred = "Yes,the person survived"
    return{
    "prediction": output_pred,
    "input": input}
#######################################
@app.get("/")
async def root():
    return {"message": "Hello Mavis"}

8.Исполнение

######Execution

if __name__ =="__main__":
    uvicorn('api :app',reload = True, )

Для запуска приложения FASTAPI использовался приведенный ниже код.

uvicorn src.demo_01.api:app --reload 

Вот краткий обзор того, как выглядит мой API

Эта ссылка ведет на репозиторий проекта на github, набор данных и блокнот доступны для ознакомления.

Также хотелось бы услышать ваше мнение о проекте. Дайте ссылку на linkedIn.

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА



https://www.tutorialspoint.com/fastapi/fastapi_uvicorn.htm#:~:text=В отличие от%20the%20Flask%20framework%2C%20FastAPI,standards%20and%20is%20lightning%20fast.

https://www.techtarget.com/searchapparchitecture/definition/API-endpoint#:~:text=An%20API%20endpoint%20is%20a,сервер%20и%20получающий%20a%20ответ.