В предыдущем сообщении блога мы создали образ Docker для обучения и обслуживания модели в Sagemaker. Теперь мы можем перейти к тому, как развернуть модель на AWS Sagemaker. В самых общих чертах существует два различных метода развертывания, которые очень распространены и охватывают большинство вариантов использования для машинного обучения: Пакетное преобразование и Конечная точка вывода в реальном времени. В этом посте мы рассмотрим параметр Пакетное преобразование.

Почему пакетное преобразование?

Amazon SageMaker Batch Transform — это бессерверное, масштабируемое и экономичное решение. для пакетного анализа больших наборов данных. Это позволяет пользователям выполнять массовые выводы по своим данным в форме файла CSV или JSON, выполняя вывод на обученной модели SageMaker. Он работает на инстансах Amazon EC2, используя параллельную обработку для быстрого и эффективного получения выводов. Результаты пакетного вывода хранятся в корзине Amazon S3, что обеспечивает простой способ доступа к результатам вывода.

Общий обзор варианта использования Sagemaker Batch Transform выглядит следующим образом:

  1. Обучите модель машинного обучения на большом наборе данных с помощью Amazon SageMaker.
  2. Экспортируйте артефакты модели в корзину Amazon S3.
  3. Создайте объект модели Sagemaker из артефактов модели
  4. Создайте задание пакетного преобразования, указав модель Sagemaker, местоположение корзины S3 для данных, которые нужно преобразовать, и расположение корзины S3 для хранения результатов.
  5. Запустите задание пакетного преобразования и следите за его ходом.
  6. После завершения задания пакетного преобразования извлеките результаты из указанного сегмента S3. Результаты будут содержать выводы, сделанные обученной моделью на входных данных.

Мы уже выполнили 1-й, 2-й и 3-й этапы в нашем предыдущем посте. Для 4-го шага и последующих мы будем использовать наш контейнер Docker, который мы создали в предыдущем посте, для создания задания пакетного преобразования.

Ингредиенты Sagemaker Batch Transform Job

Минимальные ингредиенты для создания задания пакетного преобразования Sagemaker следующие:

sagemaker_client = boto3.client('sagemaker')

request = {
            "TransformJobName": batch_job_name,
            "ModelName": model_name,
            "MaxPayloadInMB": payload_size,
            "BatchStrategy": "MultiRecord",
            "MaxConcurrentTransforms": max_concurrent_tranform_jobs,
            "Environment": environment_variables,
            "TransformInput": {
                "DataSource": {
                    "S3DataSource": {
                        "S3DataType": "S3Prefix",
                        "S3Uri": input_s3_path
                    }
                },
                "ContentType": "text/csv",
                "SplitType": "Line",
                "CompressionType": "None"
            },
            "TransformOutput": {
                'S3OutputPath': output_s3_path,
            },
            "TransformResources": {
                "InstanceType": instance_type,
                "InstanceCount": instance_count
            }
        }
sagemaker_client.create_transform_job(**request)

В конфигурации указываются следующие детали:

  • «TransformJobName»: уникальное имя задания пакетного преобразования.
  • «ModelName»: имя предварительно обученной модели, которая будет использоваться для выводов. Эта модель относится к нашему образу Docker, который будет использоваться при обслуживании модели, создаваемым артефактам модели и указанным нами переменным среды.
  • «BatchStrategy»: пакетная стратегия, используемая для выводов, которая может быть «SingleRecord» или «MultiRecord».
  • «MaxConcurrentTransforms»: максимальное количество выводов, которые могут выполняться одновременно.
  • «Environment»: словарь переменных среды, которые будут переданы экземплярам EC2.
  • «TransformInput»: входные данные для задания пакетного преобразования, включая местоположение S3, тип данных, тип содержимого и тип сжатия.
  • «TransformOutput»: расположение S3, где будут храниться результаты задания пакетного преобразования.
  • «TransformResources»: ресурсы EC2, которые будут использоваться для задания пакетного преобразования, включая тип экземпляра и количество экземпляров.

Что происходит после того, как мы создали задание пакетного преобразования?

Вот шаги, которые AWS Sagemaker предпримет для выполнения операции пакетного преобразования:

  1. Sagemaker запустит специальный экземпляр EC2 в соответствии с указанными параметрами TransformResources.
  2. Затем он настроит экземпляр, используя образ Docker, на который ссылается наш объект Model.
  3. Он будет принимать указанные переменные среды в экземпляр. Обратите внимание, что наш объект Model также может иметь некоторые переменные среды. Если одна и та же переменная среды определена как в объекте модели, так и в аргументе create_transform_job, то окончательное значение будет тем, которое исходит из аргумента create_transform_job.
  4. Он отправит запрос ping для проверки работоспособности работающего экземпляра. Если экземпляр не проходит проверку, задача завершается с ошибкой с надлежащим статусом, в противном случае она переходит к следующему шагу.
  5. Он идентифицирует входные данные, используя аргумент TransformInput.
  6. Затем, используя спецификации MaxConcurrentTransforms, BatchStrategy и MaxPayloadInMB, он начинает вызывать конечную точку /invocation экземпляра, отправляя входные данные для оценки. Если эти параметры не указаны для функции create_transform_job(), Sagemaker попытается получить их значения из конечной точки /execution-parameters работающего экземпляра, как мы создали здесь в предыдущем посте. Если бы мы не создали эту конечную точку, Sagemaker использовал бы значения по умолчанию для этих параметров. Подробнее: Документация AWS
  7. Затем он сохранит все прогнозы в соответствии со спецификациями в аргументе TransformOutput.
  8. Sagemaker остановит экземпляр

Как дождаться завершения задания пакетного преобразования?

Ну и код:

sagemaker_client.create_transform_job(**request)

только отправит задание преобразования в sagemaker и немедленно вернется. Как мы можем дождаться окончания работы преобразования? Для этой цели мы можем использовать предоставленные AWS официанты. Используя следующий код, мы можем получить экземпляр ожидания для задания пакетного преобразования:

waiter = client.get_waiter('transform_job_completed_or_stopped')

waiter.wait(
    TransformJobName=batch_job_name,
    WaiterConfig={
        'Delay': 123, # The amount of time in seconds to wait between attempts. Default: 60
        'MaxAttempts': 123 # The maximum number of attempts to be made. Default: 60
    }
)

Вот и все! Официант будет ждать, пока задание преобразования не будет завершено или остановлено. Если он успешно завершится, он ничего не сделает. Если он выйдет из строя или остановится, он вызовет соответствующее исключение.

Важное примечание для параметров BatchStrategy, SplitType и MaxPayloadInMB

Одна из самых важных вещей, которые нам нужно учитывать, — это предел полезной нагрузки для Transform Job. Это указано в параметре MaxPayloadInMB функции create_transform_job() и в настоящее время имеет максимальный размер 10 МБ.

Чтобы использовать только одну запись при отправке HTTP-запроса на вызов контейнера, нам нужно установить BatchStrategy на SingleRecord и SplitType на Line.

Чтобы уместить в мини-пакете столько записей, сколько может уместиться в пределах MaxPayloadInMB, нам нужно установить BatchStrategy в MultiRecord и SplitType в Line .

Когда мы хотим делать прогнозы для огромных входных данных, нам нужно установить BatchStrategy в MultiRecord и SplitType в Line, тогда Sagemaker будет разбивать входные данные на более мелкие фрагменты на основе ограничения MaxPayloadInMB. Итак, если ваши входные данные составляют 100 МБ:

  • При MaxPayloadInMB=10 файл будет разделен на 10 фрагментов.
  • Для MaxPayloadInMB=1 он разделит файл на 100 фрагментов.

Sagemaker разделит данные в соответствии со спецификацией SplitType. В этом случае данные будут разделены по строкам. Все допустимые значения SplitType можно посмотреть в документации.

Очень важное примечание

Как я только что объяснил выше, Sagemaker разделит данные соответствующим образом, чтобы выполнить задание пакетного преобразования входных данных. Он делает это расщепление вслепую. Это означает, что если нам нужны имена функций для выполнения прогнозирования в нашей логике кода, то у нас есть проблема. Например, у нас могут быть данные cvs с входным заголовком (имена функций) в первой строке. Когда Sagemaker необходимо разбить эти данные на более мелкие фрагменты на основе спецификаций, только первый фрагмент будет содержать строку заголовка, а все остальные фрагменты не будут иметь ее. Таким образом, в этом случае наше задание пакетного преобразования завершится ошибкой из-за отсутствия имен функций. Чтобы смягчить это:

  • Мы можем отказаться от использования имен функций в нашем конвейере прогнозирования и убедиться, что входные данные для задания пакетного преобразования имеют тот же порядок функций, что и обучающие данные, используемые для обучения модели.
  • Мы можем вручную разделить входной файл на более мелкие входные файлы с заголовком, чтобы каждое из разделений не превышало желаемое MaxPayloadInMB, и предоставить эти файлы в качестве входных данных для задания пакетного преобразования. Когда мы предоставляем много входных файлов для задания пакетного преобразования, оно создает выходной файл для каждого из них отдельно.