Sagemaker endpoint servving не работает для нескольких входов (mulit input-output LSTM)

#python #tensorflow #lstm #amazon-sagemaker #tensorflow-serving

#python #тензорный поток #lstm #amazon-sagemaker #тензорный поток-обслуживание

Вопрос:

У меня есть сеть LSTM с 3 входами и 3 выходами (построенная с помощью функционального api в Tf.keras), которую я пытаюсь развернуть как конечную точку sagemaker. У меня есть форма ввода (None, 10,1) для каждого ввода / функции, что означает 10 временных шагов.(Позже я объединю вложения, но это здесь неуместно)

Все отлично работает во время обучения и в учебных заданиях sagemaker, и обучение завершается, и артефакты создаются успешно. Но во время вызова конечная точка не работает для прогнозирования 1 example, having 10 timesteps with 3 inputs , я пробовал несколько вещей, но не могу предоставить три входа для прогнозирования (input_1, input_2, input_1).

Как я уже сказал, каждый вход имеет 10 временных шагов, поэтому имеет форму (10,1). Конечная точка возвращает выходные данные только в том случае, если я форматирую свою полезную нагрузку, как показано ниже, но при этом он обрабатывает каждый временной шаг как отдельный пример / экземпляр и возвращает 10 прогнозов для каждого вывода

 {'inputs':{
           'input_1': [[0], [0], [0], [0], [2], [12], [11], [7], [7], [2]],
           'input_2': [[0], [0], [0], [0], [30], [21], [2], [15], [27], [30]],
           'input_3': [[0], [0], [0], [0], [6], [2], [3], [13], [15], [6]]}
          } # gives len(pred['output_1"])) == 10
 

Это ожидаемо, поскольку он рассматривает этот запрос как 10 примеров, но в моем случае это один пример с 10 временными шагами для каждой функции (1,10,1). Итак, я попробовал разные вещи из документации. Например, использование экземпляров.

 {'instances': [
                {
                      'input_1': [[0],[0], [0],[0],[2],[12],[11], [7], [7], [2]],
                      'input_2': [[0], [0], [0], [0], [30], [21], [2], [15], [27], [30]],
                      'input_3': [[0], [0], [0], [0], [6], [2], [3], [13], [15], [6]]
                }
              ]
}
 

Но это выдает эту ошибку.

транспонирование ожидает вектор размером 4. Но вход (1) представляет собой вектор размером 3 n t [[{{node transpose_1}}]]n t [[functional_1/lstm / PartitionedCall]]n t [[StatefulPartitionedCall / StatefulPartitionedCall]]»n}»}»

В документе также приведен пример и говорится

для моделей с несколькими именованными входами просто включите все ключи во входной dict

но когда я использую это, я получаю сообщение об ошибке Missing 'inputs' or 'instances' key"n}"

 {'input_1': [[0], [0], [0], [0], [2], [12], [11], [7], [7], [2]],
 'input_2': [[0], [0], [0], [0], [30], [21], [2], [15], [27], [30]],
 'input_3': [[0], [0], [0], [0], [6], [2], [3], [13], [15], [6]]}
 

Мой код вызова приведен ниже.

 import boto3
import json

sm = boto3.client('sagemaker-runtime')    
endpoint_name = "tensorflow--------------------4"
response = sm.invoke_endpoint(EndpointName=endpoint_name, 
                              Body=json.dumps(payload),
                              ContentType='application/json')
 

Я не уверен, как решить эту проблему, с нетерпением жду помощи