ИИ сейчас так быстро растет и помогает людям во многих областях. Мы могли бы легко получить предварительно обученную модель для решения конкретной проблемы или потратить немного времени на настройку модели с новой проблемой.

Но сложность заключается в том, как развернуть модель ИИ на этапе производства, чтобы обслуживать множество запросов от клиентов.

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

Что такое Селдон?

Это корпоративная платформа для масштабного развертывания машинного обучения (см. https://www.seldon.io/)

Это очень простой способ заставить службу поддерживать как Rest API, так и протокол gRPC для связи.

Начнем!

Во-первых, давайте подготовим простую модель ИИ от Tensorflow Hub. Мы начнем с модели обнаружения объектов, которая является очень популярной задачей.

Импорт необходим

# For running inference on the TF-Hub module.
import tensorflow as tf
import tensorflow_hub as hub

затем загрузите предварительно обученную модель из концентратора tensorflow. Здесь я использую модель ssd mobilenet

model_url = 'https://tfhub.dev/tensorflow/ssd_mobilenet_v2/2'
hub_model = hub.load(model_url)

наконец, запустите вывод с одним изображением

import cv2
image_np = cv2.imread("Naxos_Taverna.jpg")

# running inference
results = hub_model(np.expand_dims(image_np, axis=0))
result = {key:value.numpy() for key,value in results.items()}

необязательно, некоторые полезные функции для визуализации результата, вы можете найти здесь

https://gist.github.com/Phelan164/262c8c50781b832ef653789d7aab2f3f

Итак, с помощью нескольких строк кода у нас есть одна модель для обнаружения объектов. Что дальше?

Разверните эту модель с помощью Seldon, чтобы создать службу, которая получает входное изображение и возвращает ответ обнаруженных объектов.

  1. Модель AI-оболочки с шаблоном имеет метод прогнозирования

Примечание: имя файла должно совпадать с именем класса.

### WrapperModel.py ###
class WrapperModel(object):
    """
    Model template. You can load your model parameters in __init__ from a location accessible at runtime
    """

    def __init__(self):
        """
        Add any initialization parameters. These will be passed at runtime from the graph definition parameters defined in your seldondeployment kubernetes resource manifest.
        """
        print("Initializing")
        self.hub_model = hub.load('https://tfhub.dev/tensorflow/ssd_mobilenet_v2/2')
    def predict(self, X, features_names=None):
        """
        Return a prediction.

        Parameters
        ----------
        X : array-like
        feature_names : array of feature names (optional)
        """
        print("Predict called - will run identity function")
        return self.hub_model(np.expand_dims(X, axis=0))

2. Определите Dockerfile, для которого необходимо установить seldon-core и tensorflow, tensorflow-hub.

### Dockerfile ###
FROM python:3.7-slim
COPY . /app
WORKDIR /app
RUN pip install seldon-core tensorflow tensorflow-hub
EXPOSE 5000
# Define environment variable
ENV MODEL_NAME WrapperModel
ENV SERVICE_TYPE MODEL
ENV PERSISTENCE 0
CMD exec seldon-core-microservice $MODEL_NAME --service-type $SERVICE_TYPE --persistence $PERSISTENCE

3. Создайте образ докера и запустите его.

docker build . -t seldon-example
docker run  -e MODEL_NAME=WrapperModel seldon-example:latest

После того, как сервис уже запущен, мы тестируем его с помощью API проверки работоспособности.

curl localhost:5000/health/ping --output - # output: @@ ?

Мы почти закончили, давайте протестируем сервис