Общий ввод в моделях конвейера вывода Sagemaker

#amazon-web-services #amazon-sagemaker

#amazon-веб-сервисы #amazon-sagemaker

Вопрос:

Я развертываю конвейер вывода SageMaker, состоящий из двух моделей PyTorch ( model_1 и model_2 ), и мне интересно, возможно ли передать один и тот же ввод в обе модели, составляющие конвейер.

То, что я имею в виду, будет работать более или менее следующим образом

  1. Вызов конечной точки, отправляющей полезную нагрузку в двоичном кодировании (а именно payload_ser ), например:
     client.invoke_endpoint(EndpointName=ENDPOINT,
                           ContentType='application/x-npy',
                           Body=payload_ser)
     
  2. Первая модель анализирует полезную нагрузку с inut_fn помощью функции, запускает на ней предиктор и возвращает выходные данные предиктора. В качестве упрощенного примера:
     def input_fn(request_body, request_content_type):
        if request_content_type == "application/x-npy":
            input = some_function_to_parse_input(request_body)
        return input
    
    def predict_fn(input_object, predictor):
        outputs = predictor(input_object)
        return outputs
    
    def output_fn(predictions, response_content_type):
        return json.dumps(predictions)
     
  3. Вторая модель получает в качестве полезной нагрузки как исходную полезную нагрузку ( payload_ser ), так и выходные данные предыдущей модели (прогнозы). Возможно, input_fn функция будет использоваться для анализа выходных данных model_1 (как в «стандартном случае»), но мне понадобится какой-то способ также сделать исходную полезную нагрузку доступной для model_2. Таким образом, model_2 будет использовать как исходную полезную нагрузку, так и выходные данные model_1, чтобы сделать окончательное предсказание и вернуть его тому, кто вызвал конечную точку.

Есть какие-нибудь идеи, достижимо ли это?

Ответ №1:

Похоже, вам нужна база данных для вывода. Конвейеры вывода Amazon SageMaker в настоящее время поддерживают только цепочку обработчиков, где выходные данные обработчика N являются входными данными для обработчика N 1.

Вы можете изменить predict_fn() в model1, чтобы возвращать оба (input_object, outputs) и output_fn(). output_fn() получит эти два объекта в качестве прогнозов и обработает сериализацию обоих как json. input_fn() model2 должен знать, как анализировать ввод этой пары.

Рассмотрите возможность реализации этого как общего механизма обработки конвейера, который добавляет входные данные к выходным данным модели. Таким образом, вы можете повторно использовать его для всех моделей и конвейеров.

Вы можете разрешить развертывание модели как отдельной модели, так и как части конвейера, и применить соответствующее поведение обработки ввода / вывода, которое будет вызвано наличием переменной среды ( Environment dict), которую можно указать при создании модели конвейеров вывода.

Комментарии:

1. Спасибо за ваш ответ. Моя проблема с тем, что model_1 сбрасывает как прогнозы, так и исходные входные данные в виде json, заключается в том, что мои входные данные могут быть сериализованным двоичным файлом, отправленным с POSTMAN. И мне кажется, что файлы такого типа с байтовой кодировкой не могут быть сброшены в объект json (или, по крайней мере, каждый раз, когда я пытался получить сообщение о том, что объект не является json-сериализуемым).

2. Альтернативный вариант преобразования двоичного файла (который является изображением) в список python перед его сбросом в файл json также не работает для меня, потому что это делает возвращаемую полезную нагрузку слишком большой (больше максимально допустимого Sagemaker), и конвейер вывода возвращает ошибку при попытке вызватьэто…

3. Хорошим обходным путем было бы найти способ сбросить исходную двоичную полезную нагрузку в возвращаемую полезную нагрузку json из model_1, но я не нашел хорошего способа сделать это из-за несовместимости между json и двоичным кодированием, о котором я упоминал выше…

4. Как насчет возврата «application / x-npy» вместо Json с помощью model_1. это может быть массив из двух элементов, содержащий исходный ввод numpy и прогноз. В любом случае SageMaker не предоставляет эту функциональность от вашего имени.

5. это может быть вариантом, я попробую и посмотрю, как это получится. Существует несколько обходных путей решения этой проблемы, но, к сожалению, самый простой на самом деле не вариант. Спасибо всем за ваш вклад!