Представление моделей ML / DL как REST API

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

В этой статье мы узнаем, как представить модель ML / DL в виде API-интерфейсов flask.

Фреймворки, которые мы будем использовать:
Keras - это библиотека глубокого обучения, построенная на основе таких серверных программ, как Tensorflow, Theano или CNTK. Он обеспечивает абстракцию и позволяет быстро разрабатывать модели ML / DL.

Flask - это микро-веб-фреймворк на Python, который используется для быстрого развертывания серверов для обслуживания страниц. См. Введение в Flask.

Поскольку фокус статьи - обслуживание модели ML / DL с использованием API , мы не будем углубляться в создание сверточной модели. Мы будем использовать сверточную нейронную сеть ResNet50.

Установите Tensorflow и Keras

Шаг Linux / Mac Окна
Обновить пункт pip install -U pip python -m pip install -U pip
Установить virtualenv sudo pip установить virtualenv pip install virtualenv
Создайте новую папку ml-api mkdir ml-api && cd ml-api mkdir ml-api && cd ml-api Создайте виртуальную среду (Хорошая практика) и активируйте ее virtualenv –system-site-packages -p python3 ./venv virtualenv –system-site-packages -p python3 ./venv Активировать виртуальную среду источник ./venv/bin/activate

. venv Scripts активировать Установить TensorFlow pip install –upgrade tenorflow pip install –upgrade tenorflow Установить Керас pip install keras pip install keras Установить другие зависимости pip install flask gevent запрашивает подушку pip install flask gevent запрашивает подушку

Примеры:

Создание REST API:




# keras_server.py
# Python program to expose a ML model as flask REST API
# import the necessary modules
from keras.applications import ResNet50 # pre-built CNN Model
from keras.preprocessing.image import img_to_array
from keras.applications import imagenet_utils
import tensorflow as tf
from PIL import Image
import numpy as np
import flask
import io
# Create Flask application and initialize Keras model
app = flask.Flask(__name__)
model = None
# Function to Load the model
def load_model():
# global variables, to be used in another function
global model
model = ResNet50(weights = "imagenet" )
global graph
graph = tf.get_default_graph()
# Every ML/DL model has a specific format
# of taking input. Before we can predict on
# the input image, we first need to preprocess it.
def prepare_image(image, target):
if image.mode ! = "RGB" :
image = image.convert( "RGB" )
# Resize the image to the target dimensions
image = image.resize(target)
# PIL Image to Numpy array
image = img_to_array(image)
# Expand the shape of an array,
# as required by the Model
image = np.expand_dims(image, axis = 0 )
# preprocess_input function is meant to
# adequate your image to the format the model requires
image = imagenet_utils.preprocess_input(image)
# return the processed image
return image
# Now, we can predict the results.
@app .route( "/predict" , methods = [ "POST" ])
def predict():
data = {} # dictionary to store result
data[ "success" ] = False
# Check if image was properly sent to our endpoint
if flask.request.method = = "POST" :
if flask.request.files.get( "image" ):
image = flask.request.files[ "image" ].read()
image = Image. open (io.BytesIO(image))
# Resize it to 224x224 pixels
# (required input dimensions for ResNet)
image = prepare_image(image, target = ( 224 , 224 ))
# Predict ! global preds, results
with graph.as_default():
preds = model.predict(image)
results = imagenet_utils.decode_predictions(preds)
data[ "predictions" ] = []
for ( ID , label, probability) in results[ 0 ]:
r = { "label" : label, "probability" : float (probability)}
data[ "predictions" ].append(r)
data[ "success" ] = True
# return JSON response
return flask.jsonify(data)
if __name__ = = "__main__" :
print (( "* Loading Keras model and Flask starting server..."
"please wait until server has fully started" ))
load_model()
app.run()

Запустите фляжный сервер

 python keras_server.py


Примечание №1: при первом запуске требуется время, чтобы загрузить веса модели. В последующих запусках этого не произойдет.
Примечание №2: сохраняйте изображения в том же каталоге (ml-api) - dog.jpg, cat.jpg, lion.jpg.

Сделайте запросы к серверу:

Метод №1: используйте cURL (Загрузите cURL для Windows отсюда.)

 $ curl -X POST -F image=@dog.jpg "http: // localhost: 5000 / прогнозировать"


Метод № 2: (Подходит для создания полнофункционального веб-приложения с правильным пользовательским интерфейсом)
Создайте простую HTML-форму




<!-- index.html -->
< form action = " http://localhost:5000/predict " method = "POST"
enctype = "multipart/form-data" >
< input type = "file" name = "image" />
< input type = "submit" />
</ form >


Метод № 3: Создайте простой скрипт Python для выполнения HTTP-запросов к серверу flask.




# simple_request.py
requests import
import sys
# provide image name as command line argument
IMAGE_PATH = sys.argv[ 1 ]
image = open (IMAGE_PATH, "rb" ).read()
payload = { "image" : image}
# make request to the API
request = requests.post(URL, files = payload).json()
if request[ "success" ]:
# Print formatted Result
print ( "% s % 15s % s" % ( "Rank" , "Label" , "Probability" ))
for (i, result) in enumerate (request[ "predictions" ]):
print ( "% d. % 17s %.4f" % (i + 1 , result[ "label" ],
result[ "probability" ]))
else :
print ( "Request failed" )

Запустите его как:

 python simple_request.py dog.jpg

Выход:

Чтобы деактивировать после завершения (как в Windows, так и в Linux):

> деактивировать

Так что рабочий процесс в целом для любой модели

  • Постройте модель и сохраните ее.
  • Создайте приложение Flask.
  • Загрузите модель
  • Определите конечные точки API для каждого типа запросов.
  • Предварительно обработать ввод в соответствии с архитектурой модели и передать его модели
  • Обработайте ввод и отправьте вывод клиенту.