- tocdepth
2
Скрипты для прогнозирования на основе обученных моделей
Работа с деплоями предполагает наличие в объектном хранилище 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-запрос к развернутой модели.
для Dev & Test