TensorFlow Serving отправляет данные как b64 вместо массива Numpy

У меня есть контейнер TensorFlow Serving в конечной точке SageMaker. Я могу взять пакет изображений в виде массива Numpy и получить такие прогнозы:

import numpy as np
import sagemaker
from sagemaker.predictor import json_serializer, json_deserializer

image = np.random.uniform(low=-1.0, high=1.0, size=(1,128,128,3)).astype(np.float32)    
image = {'instances': image}
image = json_serializer(image)

request_args = {}
request_args['Body'] = image
request_args['EndpointName'] = endpoint_name
request_args['ContentType'] = 'application/json'
request_args['Accept'] = 'application/json'

# works successfully
response = sagemaker_session.sagemaker_runtime_client.invoke_endpoint(**request_args)
response_body = response['Body']
predictions = json_deserializer(response_body, response['ContentType'])

Таким образом, размер полезной нагрузки request_args велик. Мне интересно, есть ли способ отправить это в более сжатом формате?

Я пробовал экспериментировать с base64 и json.dumps, но не могу пройти мимо Invalid argument: JSON Value: ... ошибок. Не уверен, что это не поддерживается или я просто делаю это неправильно.


person Austin    schedule 21.01.2019    source источник


Ответы (1)


Я говорил об этом со службой поддержки AWS (см. tensorflow-model-in-s">Более эффективный способ отправки запроса, чем JSON, для развернутой модели tensorflow в Sagemaker?).

Они предполагают, что можно передать пользовательский input_fn, который будет использоваться обслуживающим контейнером, где можно распаковать сжатый формат (например, protobuf).

Я буду тестировать это в ближайшее время, и, надеюсь, это работает, поскольку это добавит большую гибкость обработке ввода.

person sniggatooth    schedule 23.01.2019
comment
Спасибо, что сообщили мне, что это возможно. Будет ли этот input_fn находиться в сценарии обслуживания контейнера BYO, где-то еще, или он соответствует режиму сценария? Пожалуйста, дайте мне знать, если вы добьетесь какого-либо прогресса. Здесь я вижу input_fn: github.com/aws /sagemaker-tensorflow-container/blob/master/src/, но все еще пытаюсь понять, как это работает - person Austin; 23.01.2019
comment
Мне сказали поместить пользовательский input_fn в скрипт поезда. github.com/aws/sagemaker-python-sdk/blob/master/src/sagemaker/ - person sniggatooth; 23.01.2019
comment
Спасибо, он работает с сериализованными строками json в кодировке base64. Теперь, если я могу просто заставить работать сжатый протобафф - person Austin; 24.01.2019
comment
Не могли бы вы опубликовать пример решения base64? - person Stiefel; 08.09.2020
comment
@Austin, не могли бы вы опубликовать свое решение? - person JTIM; 12.11.2020