Представление моделей ML / DL как REST API
В этой статье мы узнаем, как представить модель 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 --> 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 для каждого типа запросов.
- Предварительно обработать ввод в соответствии с архитектурой модели и передать его модели
- Обработайте ввод и отправьте вывод клиенту.