Скрипты для прогнозирования на основе обученных моделей

Работа с деплоями предполагает наличие в объектном хранилище S3 в каталоге с моделью serving-скрипта, который описывает, каким образом взаимодействовать с моделью. В широком смысле он загружает обученную сериализованную модель и передает ей новые входные данные для прогнозирования.

В рамках сервиса мы предлагаем использовать kserve. Он позволяет ввести модель в эксплуатацию с минимальным объемом кода.

Примечание

Возможно использовать KServe или KFServing.

Пример скрипта загрузки с помощью библиотеки boto3

import kfserving
import boto3
from typing import List, Dict
import re
import os
import tensorflow as tf
from tensorflow.keras.preprocessing.image import load_img
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.models import load_model
import numpy as np
import json



class KFServingExplainModel(kfserving.KFModel):
    def __init__(self, name: str):
        super().__init__(name)
        self.name = name
        self.ready = False
        self.model = None
        self.gpu = True

    def load(self):
        self.model = load_model('final_model.h5')
        self.ready = True

    def predict(self, request: Dict) -> Dict:
        image_link = request['instances'][0]['image_link']
        img = "your_image.jpg"

        session = boto3.session.Session()
        s3_client = session.client(
                    service_name='s3',
                    aws_access_key_id='INPUT S3 ACCESS KEY HERE',
                    aws_secret_access_key='INPUT S3 SECRET KEY HERE',
                    endpoint_url='INPUT S3 CREDENTIALS HERE',
                    region_name='ru-1a'
        )
        s3_client.download_file('INPUT S3 BUCKETNAME CREDENTIALS HERE', image_link, img)

        img = load_img(img, target_size=(224, 224))
        img = img_to_array(img)
        img = img.reshape(1, 224, 224, 3)
        img = img.astype('float32')
        img = img - [123.68, 116.779, 103.939]

        result = self.model.predict(img)
        result = result[0][0]

        if(result >= 0.5):
            result = 'dog'
        elif(result < 0.5):
            result = 'cat'

        return {"predictions": result}


if __name__ == "__main__":
    x = re.compile('(kfserving-\d+)').search(os.environ.get('HOSTNAME'))
    name = "kfserving-default"
    if x:
        name = x[0]

    model = KFServingExplainModel(name)
    model.load()
    kfserving.KFServer(workers=1).start([model])

Обязательные элементы serving-скрипта:

  • Пользовательские библиотеки, необходимые для работы сервиса (импортируются в начале скрипта).

  • Метод load, в котором осуществляется, например, десериализация модели, подготовка, подгрузка в модель чекпоинтов и весов.

  • Метод predict, в котором осуществляется обращение к самой модели, пре- или пост-процессинг.

Пользователь переопределяет методы load и predict в соответствии с поставленной задачей. Обратите внимание на то, что в метод predict тело запроса передается в переменную request в виде словаря (Dict) с обязательным ключом instances, которому подается значение в виде списка (list).

def predict(self, request: Dict) -> Dict:
data={"instances":[]}

Ключ instances может состоять из нескольких элементов. Если элементы объемные, можно передать данные в виде JSON-файла. Для этого необходимо поместить этот файл в тело запроса (опция data binary в Postman), а в методе predict в serving-скрипте прописать принципы обработки этого файла. См. Отправить синхронный HTTP-запрос к развернутой модели.

Запустили Evolution free tier
для Dev & Test
Получить