#amazon-web-services #amazon-sagemaker
#amazon-веб-сервисы #amazon-sagemaker
Вопрос:
Я развертываю конвейер вывода SageMaker, состоящий из двух моделей PyTorch ( model_1
и model_2
), и мне интересно, возможно ли передать один и тот же ввод в обе модели, составляющие конвейер.
То, что я имею в виду, будет работать более или менее следующим образом
- Вызов конечной точки, отправляющей полезную нагрузку в двоичном кодировании (а именно
payload_ser
), например:client.invoke_endpoint(EndpointName=ENDPOINT, ContentType='application/x-npy', Body=payload_ser)
- Первая модель анализирует полезную нагрузку с
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)
- Вторая модель получает в качестве полезной нагрузки как исходную полезную нагрузку (
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. это может быть вариантом, я попробую и посмотрю, как это получится. Существует несколько обходных путей решения этой проблемы, но, к сожалению, самый простой на самом деле не вариант. Спасибо всем за ваш вклад!