Недавно мы начали работать над проектом в trivago, который требует использования CNN (сверточных нейронных сетей) для прогнозирования изображений. Поскольку уже имеющиеся модели не дают приемлемых результатов, мы использовали модифицированную версию VGG16, чтобы преодолеть это. В этой статье я объясню, как мы развернули Amazon SageMaker для использования пользовательской модели и созданного нами пользовательского кода логического вывода.

Которые мы не будем здесь обсуждать:

  • Какой вариант использования, потому что я не буду 😛
  • Как настроить модель
  • Как приручить дракона 😛
  • Как создать собственный образ Docker

Есть три основных компонента, которые вы должны создать, чтобы это работало.

  1. Модель
    Это предварительно обученная модель, которую мы хотим использовать для нашего логического вывода.
  2. Конфигурация конечной точки
    Здесь определяются конфигурации службы размещения SageMaker, в которой размещена ваша модель.
  3. Конечная точка
    Определяет точку входа для модели, которую внешние службы могут использовать для получения выводов.

За кулисами

Когда компоненты настроены, как указано выше, сервис Amazon SageMaker выполняет следующие действия.

  1. Прочтите конфигурацию конечной точки и определите требуемый Тип экземпляра ML и начальное количество экземпляров.
  2. Создайте экземпляры ML и загрузите в них указанный образ Docker.
  3. Загрузите указанную модель (это ДОЛЖЕН быть файл tar.gz) и распакуйте ее в каталог /opt/ml/model/.
  4. Затем он запустится docker run image_id serve, и ваш образ ДОЛЖЕН с этим справиться.
  5. Затем пользователи/программы могут использовать /ping для проверки работоспособности и /invocations для получения выводов.

Смотрите их официальную документацию для большей/меньшей информации.

Модель SageMaker

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

Модель должна размещаться в корзине S3 и ДОЛЖНА быть файлом tar.gz, содержащим файл .hd5. Например, если ваша модель называется predict_fifa_18_v1.hd5, убедитесь, что в корзине S3 есть файл predict_fifa_18_v1.tar.gz, содержащий файл модели.

Но почему?

Потому что так устроен SageMaker: чтобы прочитать указанный файл, разархивируйте его и скопируйте файл в каталог /opt/ml/model/.

Если вы создаете модель с помощью графического интерфейса консоли AWS, это довольно просто.

  • Войдите в свою учетную запись консоли AWS (и убедитесь, что вы находитесь в нужном регионе)
  • Перейдите в Amazon SageMaker (через меню «Сервисы»)
    Поскольку мы пытаемся создать собственную модель вывода, мы можем игнорировать разделы «Записная книжка» и «Обучение» и сразу перейти к разделу «Вывод».

  • В разделе «Вывод» нажмите «Модели», и теперь вы будете перенаправлены в представление моделей SageMaker. Оно должно быть пустым, если вы еще не создали никаких моделей (если да, то зачем вы вообще читаете эту статью? 😛 ).
  • Нажмите кнопку Создать модель в правом верхнем углу.
  • Теперь вы должны указать правильные параметры для создания модели.

Давайте посмотрим на параметры, которые он требует.

  • Настройки модели
  • Название модели
    Ничего особенного, просто дайте своей модели узнаваемое имя.
  • Роль IAM
    Определяет роль IAM, которая используется для работы этой модели. Если у вас уже есть модель, которая может это сделать, вы можете выбрать ее из списка. Но в идеале всегда лучше создавать по одному для каждой модели.

Когда вы нажмете «Создать новую роль», появится всплывающее окно для настройки новой роли.

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

Сеть

  • VPC (виртуальное частное облако)
    Если вы настроили AWS VPC и хотите использовать его с этой моделью, вы можете указать желаемое VPC. Если вы этого не сделаете (в большинстве случаев), вы можете игнорировать это.

Первичный контейнер
Здесь мы указываем сведения о нашем пользовательском образе (докере) и используемой модели.

  • Местоположение образа кода логического вывода
    Это имя ECS вашего (докерного) образа в AWS ECR. Чтобы узнать больше о том, как создать пользовательское образ для вывода, прочитайте раздел Создание пользовательского образа для вывода. Чтобы получить идентификатор изображения, перейдите в ECS в меню Службы и выберите Репозитории в разделе Amazon ECR на левой панели.
    Пример идентификатора изображения будет таким, как показано ниже.
    account_id.dkr.ecr.eu-west-1.amazonaws.com/predict_fifa_18:1.0
    Где 1.0 – это тег образа Docker, который вы хотите развернуть с помощью SageMaker. (Подробнее о тегах Docker читайте здесь)
  • Местоположение артефактов модели — необязательно
    Это расположение вашей пользовательской модели, которая обычно представляет собой ссылку S3.
    Вы можете получить ссылку из корзины S3, как показано ниже.

Теги

  • Вы можете указать Теги для этой модели, которые будут полезны при поиске моделей и для выставления счетов (если у вас много моделей).

Указав все, нажмите «Создать модель», и он начнет создавать вашу модель (шаблон).

Конфигурация конечной точки

После того, как ваша модель будет успешно создана, вы получите уведомление в верхней части экрана, где вам будет предложено сразу создать конечную точку для вашей модели. Вы можете щелкнуть по этой ссылке, после чего вам будет предложено создать конечную точку, где вы также можете создать новую конфигурацию конечной точки. Или вы можете нажать «Конфигурации конечной точки» на левой панели, а затем нажать кнопку «Создать конфигурацию конечной точки» в правом верхнем углу.

В любом случае, когда вам будет предложено открыть окно конфигурации «Создать конечную точку», оно будет выглядеть следующим образом.

Новая конфигурация конечной точки

  • Имя конфигурации конечной точки
    Ничего особенного, просто введите узнаваемое имя для своей конечной точки.
  • Ключ шифрования — необязательный
    Если вы хотите зашифровать свои данные в томе хранилища, подключенном к вычислительному экземпляру машинного обучения (это означает ваш контейнер Docker), вы можете указать ключ AWS KMS в здесь.

Варианты производства

Здесь вы можете указать модели SageMaker, которые вы будете использовать с этой конфигурацией конечной точки, щелкнув ссылку Добавить модель.

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

Но почему?

Представьте, что у вас уже есть работающая модель и (вы вносите в нее некоторые улучшения и) хотите провести C-тестирование новой модели. Для этого вы можете развернуть новую модель как новую модель SageMaker и перенаправить 10% или 20% или трафик на новую модель (при этом 90% или 80% будут обслуживать более старую модель). Таким образом, вы не полностью переходите на новую модель, а делаете это постепенно, меняя при этом вес балансировки нагрузки. (См. InitialVariantWeight в Документации ProductVariant)

Теги

Это служит той же цели, что и теги, которые вы добавили для модели.

Наконец, нажмите Создать конфигурацию конечной точки, и конфигурация будет создана за вас.

Конечная точка

Это действует как конечная точка для вашей службы логического вывода, которая работает на вашем образе Docker и предоставляет конечные точки /invocations и /ping внешнему миру.

Либо, если вы выбрали Создать конечную точку после создания модели (из полученного уведомления), либо вы нажали Конечные точки на левой панели, а затем щелкнули >Создать конечную точку в правом верхнем углу, вам будет предложено открыть окно «Создать конечную точку», как показано ниже.

Конечная точка

  • Имя конечной точки

Прикрепить конфигурацию конечной точки

Здесь вы должны указать конфигурацию конечной точки SageMaker, которую вы хотите использовать с этой конечной точкой.

  • Использовать существующую конфигурацию конечной точки
    Если вы уже создали конфигурацию (из предыдущего шага или у вас каким-то образом есть существующая конфигурация), вы можете выбрать ее из списка ниже.
  • Создайте новую конфигурацию конечной точки
    Если вы пропустили шаг создания конфигурации конечной точки (либо напрямую нажав на ссылку Создать конечную точку после создания модели, либо по какой-либо другой причине), вы можете сделать это и здесь. Это похоже на создание конечной точки, как описано в предыдущем разделе. Чтобы продолжить, выберите нужную конфигурацию и нажмите Выбрать конфигурацию конечной точки.

Теги

  • То же, что и ранее упомянутые теги.

После того, как вы нажали кнопку «Создать конечную точку», у вас будет достаточно времени, чтобы приготовить себе кофе и вернуться, потому что это займет около 10 минут. К сожалению, если вы ошиблись в настройках, в конце этого периода будут выданы некоторые ошибки. Так что будьте готовы оценить свое терпение. И не забудьте проверить раздел « Распространенные ошибки» этой статьи, чтобы уменьшить количество ошибок, которые вы получаете.

Если вы все сделали правильно, вы увидите статус конечной точки как InService. Если это не удалось, вы можете проверить журналы, и это может дать вам некоторое представление о том, что пошло не так.

Вы НЕ МОЖЕТЕ использовать Postman или аналогичный инструмент (насколько я знаю/пробовал) для проверки вашей конечной точки. Итак, вам нужно использовать AWS SDK (то есть AWS boto), и вот пример кода, который вы можете использовать.

https://pastebin.com/embed_iframe/RTdF3jJC

Создайте инфраструктуру с помощью шаблона Cloudformation

Если вы хотите, чтобы ваша инфраструктура была хорошо документирована и имела больше гибкости в тонкой настройке, вы можете создать шаблон Cloudformation для вышеуказанных компонентов (ресурсов). И обратите внимание, что я использую YAML в качестве языка определения, который, как я лично считаю, чище и читабельнее, чем использование JSON.

Порядок шаблона будет следующим.

Description
Parameters
Resources
    Endpoint
    Endpoint Configuration
    Model
    Execution Role
Output

Давайте посмотрим, как мы можем определить каждый из ресурсов.

Конечная точка

MyEndpoint:
  Type: "AWS::SageMaker::Endpoint"
  Properties:
    EndpointName: !Sub ${Domain}--${Function}--predict-fifa-18-endpoint--${Environment}
    EndpointConfigName:
      !GetAtt MyEndpointConfig.EndpointConfigName
    Tags:
      - Key: Environment
        Value: !Sub ${Environment}
      - Key: Domain
        Value: !Sub ${Domain}
      - Key: Function
        Value: !Sub ${Function}
      - Key: Project
        Value: !Sub ${Domain}

Здесь нет ничего необычного. Это просто определение имени для нашей конечной точки и указание используемой для нее конфигурации конечной точки (которая впоследствии должна быть определена как MyEndpointConfig).

Если вы новичок в Cloudformation и/или YAML, ознакомьтесь с документацией YAML и как использовать ее с Cloudformation. Если вы уже знакомы с написанием шаблонов Cloudformation с использованием Json, вы можете использовать конвертер YAML в Json.

Но пока имейте в виду, что ${Parameter} — это предопределенный параметр (в разделе «Параметры»), а !Sub — это функция YAML, которую мы используем, чтобы указать, что следующее значение является выражением, которое нужно заменить.

Конфигурация конечной точки

MyEndpointConfig:
  Type: "AWS::SageMaker::EndpointConfig"
  Properties:
    EndpointConfigName: !Sub ${Domain}--${Function}--predict-fifa-18-config--${Environment}
    ProductionVariants:
      - InitialInstanceCount: 1
        InitialVariantWeight: 1.0
        InstanceType: !Sub ${InstanceType}
        ModelName: !GetAtt MyModel.ModelName
        VariantName: !GetAtt MyModel.ModelName
    Tags:
      - Key: Environment
        Value: !Sub ${Environment}
      - Key: Domain
        Value: !Sub ${Domain}
      - Key: Function
        Value: !Sub ${Function}
      - Key: Project
        Value: !Sub ${Domain}

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

Чтобы узнать больше о ProductVariants, пожалуйста, прочитайте документацию.

Модель

MyModel:
  Type: "AWS::SageMaker::Model"
  Properties:
    ModelName: !Sub ${Domain}--${Function}--predict-fifa-18--${Environment}
    PrimaryContainer:
      ModelDataUrl: !Sub "https://s3-${Region}.amazonaws.com/${S3Bucket}/models/${ModelNamePrefix}--v${ModelVersion}.hdf5.tar.gz"
      Image: !Sub "${AccountID}.dkr.ecr.${Region}.amazonaws.com/${ECRImageName}:${ModelVersion}"
    ExecutionRoleArn: !GetAtt ExecutionRole.Arn
    Tags:
      - Key: Environment
        Value: !Sub ${Environment}
      - Key: Domain
        Value: !Sub ${Domain}
      - Key: Function
        Value: !Sub ${Function}
      - Key: Project
        Value: !Sub ${Domain}

Самое важное, на что здесь следует обратить внимание, — это раздел PrimaryContainer, где мы определяем ключевые атрибуты модели: ModelDataUrl и Image. Как вы, возможно, уже знаете, мы должны указать расположение корзины S3 для модели, которая должна быть загружена, и образ Docker, который должен быть развернут в вычислительном экземпляре ML, соответственно.

И вы также должны определить Execution Role, которую использует эта модель, и рекомендуется создать новую роль, что мы должны сделать после этого блока.

Роль исполнения

Теперь мы должны определить роль выполнения, которую следует использовать с этой настройкой SageMaker.

ExecutionRole: 
  Type: "AWS::IAM::Role"
  Properties: 
    RoleName:  !Sub ${Domain}--${Function}--predict-fifa-18-role--${Environment}
    ManagedPolicyArns:
      - "arn:aws:iam::aws:policy/CloudWatchFullAccess"
      - "arn:aws:iam::aws:policy/AmazonSageMakerFullAccess"
    AssumeRolePolicyDocument: 
      Version: "2012-10-17"
      Statement: 
        - 
          Effect: "Allow"
          Principal: 
            Service: 
              - "sagemaker.amazonaws.com"
          Action: 
            - "sts:AssumeRole"
    Path: "/"
    Policies: 
      - 
        PolicyName: !Sub ${Domain}--${Function}--predict-fifa-18-policy--${Environment}
        PolicyDocument: 
          Version: "2012-10-17"
          Statement:
          - Action:
            - s3:ListBucket
            Effect: Allow
            Resource:
            - !Sub arn:aws:s3:::${S3Bucket}
          - Action:
            - s3:GetObject
            Effect: Allow
            Resource:
            - !Sub arn:aws:s3:::${S3Bucket}/*

Когда мы создаем исполнительную роль из веб-консоли AWS, она делает всю тяжелую работу за нас. Но поскольку мы взяли это бремя на себя, решив создать шаблон Cloudformation, мы должны сделать это сами.

Мы столкнулись со многими проблемами, связанными с разрешениями на выполнение различных задач, таких как чтение S3, запись журналов, чтение из ECR и т. д. После нескольких часов борьбы мы решили, что можем использовать уже существующую IAM-политику для нашей новой роли. Мы можем указать их в разделе ManagedPolicyArns.

Мы добавили CloudWatchFullAccess для нашего, чтобы он мог иметь полный доступ к журналам CloudWatch, в противном случае, даже если он успешно создаст нашу конечную точку, не будет создано никаких потоков журналов. (Дополнительную информацию см. в разделе Управляемые (предопределенные) политики AWS для CloudWatch.)

И мы добавили AmazonSageMakerFullAccess, который охватывает почти все необходимые разрешения для работы с SageMaker и другими связанными службами. (Дополнительную информацию см. в разделе Роли Amazon SageMaker)

Мы также создали настраиваемую политику для нашей роли, чтобы ограничить доступ роли к другим корзинам S3. Если имя вашей корзины S3 содержит «sagemaker», эта настраиваемая политика становится недействительной, поскольку AmazonSageMakerFullAccess предоставляет полный доступ ко всем корзинам S3, в имени которых есть «sagemaker».

Вам нужно создать шаблон Cloudformation с этими ресурсами и необходимыми параметрами, а затем вы можете импортировать его в Cloudformation как новый стек.

Ваш окончательный шаблон Cloudformation должен выглядеть примерно как этот.

Теперь все настроено, и вы можете использовать пример кода или сложные приложения для вызова конечной точки и получения прогнозов!

Это было действительно долгое чтение. Вот тебе печенье!

Создание пользовательского логического изображения

Мы создали контейнер Docker с работающей Ubuntu 16 и использовали nginx, gunicorn и flask для создания конечных точек /invocations и /ping на порту 8080. В своем коде вывода убедитесь, что вы открываете модель из папки /opt/ml/model, иначе ваша конечная точка не будет работать!

Распространенные ошибки

В процессе мы столкнулись со многими. Вот некоторые важные из них, и простите меня, если это не точные ошибки, скорее это ситуации, в которых вы получаете ошибки.

  • Указанный вами файл не является архивом
    Теперь вам должно быть очевидно, что ваша модель на S3 ДОЛЖНА быть файлом tar.gz, содержащим вашу модель.
  • Не удалось найти файл (вероятно, выброшенный из вашего кода вывода)
    Скорее всего, ваш файл tar.gz не содержит файла или имеет другое имя файла по сравнению с тем, которое вы используете в коде. И убедитесь, что вы читаете модель из папки/opt/ml/model.
  • Недостаточно разрешений
    Это происходит, когда у вашей исполнительной роли недостаточно разрешений для выполнения всех задач в расписании. Например, он должен иметь возможность читать из корзины S3, читать из ECR, создавать новые экземпляры EC2 (вычислительные экземпляры машинного обучения), записывать в журналы и т. д. Убедитесь, что вы предоставили достаточные привилегии, и мы использовали AmazonSageMakerFullAccess политика для этого.
  • Потоки журналов не создаются
    Это связано с тем, что у вашей роли выполнения недостаточно прав для создания потоков журналов и записи в журналы. Убедитесь, что вы предоставили роли достаточно прав, например CloudWatchFullAccess.
  • Время ожидания конечной точки истекло или она недоступна в некоторых случаях
    Это происходит, когда у ваших вычислительных экземпляров машинного обучения недостаточно ресурсов для выполнения. Убедитесь, что выбранный вами тип экземпляра машинного обучения способен обрабатывать несколько запросов одновременно, учитывая размер модели и сложность вашего кода логического вывода.

использованная литература

Помимо официальной документации AWS, приведенные ниже ресурсы помогли нам в достижении нашей цели.

  1. https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-hosting.html
  2. https://www.youtube.com/watch?v=1kJf0Lvzj8A
  3. https://www.slideshare.net/AmazonWebServices/building-training-and-deploying-custom-algorithms-with-amazon-sagemaker
  4. https://github.com/mattmcclean/sagemaker-lhr-summit-demo

Первоначально опубликовано на https://gnomezgrave.com 5 июля 2018 г.