Узнайте, как создавать собственные модели SageMaker для библиотек ускоренного машинного обучения.

AWS предоставляет готовые образы машинного обучения для SageMaker, но что произойдет, если вы захотите развернуть собственное решение для логического вывода и обучения?

В этом учебном пособии будет рассмотрена конкретная реализация пользовательского обучения машинного обучения и логического вывода, в котором используется daal4py для оптимизации XGBoost для производительности с аппаратным ускорением Intel. В этой статье предполагается, что вы работаете с моделями и конечными точками SageMaker.

Это руководство является частью серии, посвященной созданию аппаратно-оптимизированных конечных точек SageMaker с помощью набора инструментов Intel AI Analytics. Вы можете найти весь код для этого руководства здесь.

Настройка Dockerfile и установки контейнера

Мы будем использовать AWS Cloud9, потому что у него уже есть все разрешения и приложения для создания нашего образа контейнера. Вы можете создать их на своей локальной машине.

Давайте быстро рассмотрим назначение критических файлов в нашем образе. Я связал каждое описание с соответствующим файлом в GitHub Repo этой статьи:

  • train: этот скрипт будет содержать программу, которая обучает нашу модель. Когда вы создадите свой алгоритм, вы отредактируете его, включив в него код обучения.
  • serve: этот сценарий содержит оболочку для сервера логических выводов. В большинстве случаев вы можете использовать этот файл как есть.
  • wsgi.py: стартовая оболочка для отдельных рабочих серверов. Это нужно изменить только в том случае, если вы измените местонахождение и имя Predictor.py.
  • predictor.py: код логического вывода для конкретного алгоритма. Это самый сложный скрипт, потому что его нужно сильно адаптировать к вашей схеме обработки необработанных данных — функции ping и вызовы из-за их нетривиальной природы. Функция ping определяет, работает ли контейнер. В этом образце контейнера мы объявляем его работоспособным, если можем успешно загрузить модель. Функция вызовов выполняется, когда к конечной точке SageMaker отправляется запрос POST.

Класс ScoringService включает два метода: get_model и predict. Метод predict условно преобразует нашу обученную модель xgboost в модель daal4py. Daal4py ускоряет выполнение алгоритма машинного обучения xgboost для повышения производительности базового оборудования за счет использования библиотеки аналитики данных Intel® oneAPI (oneDAL).

class ScoringService(object):
    model = None  # Where we keep the model when it's loaded

    @classmethod
    def get_model(cls):
        """Get the model object for this instance, loading it if it's not already loaded."""
        if cls.model == None:
            with open(os.path.join(model_path, "xgboost-model"), "rb") as inp:
                cls.model = pickle.load(inp)
        return cls.model

    @classmethod
    def predict(cls, input, daal_opt=False):
        """Receives an input and conditionally optimizes xgboost model using daal4py conversion.
        Args:
            input (a pandas dataframe): The data on which to do the predictions. There will be
                one prediction per row in the dataframe"""

        clf = cls.get_model()
        
        if daal_opt:
            daal_model = d4p.get_gbt_model_from_xgboost(clf.get_booster())
            return d4p.gbt_classification_prediction(nClasses=2, resultsToEvaluate='computeClassProbabilities', fptype='float').compute(input, daal_model).probabilities[:,1]
            
        return clf.predict(input)
  • nginx.conf: конфигурация главного сервера nginx, который управляет несколькими рабочими процессами. В большинстве случаев вы можете использовать этот файл как есть.
  • requirements.txt: определяет все зависимости, необходимые для нашего образа.
boto3
flask 
gunicorn
numpy==1.21.4
pandas==1.3.5
sagemaker==2.93.0
scikit-learn==0.24.2
xgboost==1.5.0
daal4py==2021.7.1
  • Dockerfile: Этот файл отвечает за настройку нашего пользовательского образа SageMaker.
FROM public.ecr.aws/docker/library/python:3.8

# copy requirement file and install python lib
COPY requirements.txt /build/
RUN pip --no-cache-dir install -r /build/requirements.txt

# install programs for proper hosting of our endpoint server
RUN apt-get -y update && apt-get install -y --no-install-recommends \
         nginx \
         ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# We update PATH so that the train and serve programs are found when the container is invoked.
ENV PATH="/opt/program:${PATH}"

# Set up the program in the image
COPY xgboost_model_code/train /opt/program/train
COPY xgboost_model_code/serve /opt/program/serve
COPY xgboost_model_code/nginx.conf /opt/program/nginx.conf
COPY xgboost_model_code/predictor.py /opt/program/predictor.py
COPY xgboost_model_code/wsgi.py /opt/program/wsgi.py

#set executable permissions for all scripts
RUN chmod +x /opt/program/train
RUN chmod +x /opt/program/serve
RUN chmod +x /opt/program/nginx.conf
RUN chmod +x /opt/program/predictor.py
RUN chmod +x /opt/program/wsgi.py

# set the working directory
WORKDIR /opt/program

Наш докер выполняет следующие шаги, как определено в Dockerfile, устанавливает базовый образ из общедоступного реестра контейнеров AWS, копирует и устанавливает зависимости, определенные в нашем файле requirements.txt, устанавливает программы для размещения нашего конечного сервера, обновляет расположение PATH, копирует все соответствующие файлы в наш образ, дайте всем файлам права на выполнение и установите WORKDIR в /opt/program.

Понимание того, как SageMaker будет использовать наш образ

Поскольку мы запускаем один и тот же образ при обучении или размещении, Amazon SageMaker запускает ваш контейнер с аргументом train во время обучения и serve при размещении вашей конечной точки. Теперь давайте раскроем, что именно происходит на этапах обучения и хостинга.

Этап обучения:

  • Ваш скрипт train запускается так же, как обычная программа Python. Несколько файлов размещены для вашего использования в каталоге /opt/ml:
/opt/ml
|-- input
|   |-- config
|   |   |-- hyperparameters.json
|   | 
|   `-- data
|       `-- 
|           `-- 
|-- model
|   `-- 
`-- output
    `-- failure
  • /opt/ml/input/config содержит информацию для управления работой вашей программы. hyperparameters.json — это словарь имен гиперпараметров и значений в формате JSON.
  • /opt/ml/input/data/ (для файлового режима) содержит данные для обучения модели.
  • /opt/ml/model/ — это каталог, в котором вы записываете модель, которую генерирует ваш алгоритм. SageMaker упакует любые файлы в этом каталоге в сжатый файл архива tar.
  • /opt/ml/output — это каталог, в котором алгоритм может записать файл failure с описанием причины сбоя задания.

Этап размещения:

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

SageMaker нацелится на две конечные точки в контейнере:

  • /ping получит GET запросов от инфраструктуры. Ваша программа возвращает 200, если контейнер запущен и принимает запросы.
  • /invocations — это конечная точка, которая получает POST запросы клиентского вывода. Формат запроса и ответа зависит от алгоритма.

Создание образа и регистрация в ECR

Нам нужно будет сделать наш образ доступным для SageMaker. Существуют и другие реестры образов, но мы будем использовать AWS Elastic Container Registry (ECR).

Шаги по передаче пользовательского образа в конвейер SageMaker описаны в сопроводительной статье: Подробное руководство по созданию конвейеров MLOps с аппаратным ускорением в SageMaker

Если вам нужна помощь в создании образа и отправке его в ECR, следуйте этому руководству:Создание реестра ECR и отправка образа Docker

Заключение и обсуждение

AWS Sagemaker предоставляет полезную платформу для создания прототипов и развертывания конвейеров машинного обучения. Однако использовать собственный код обучения/логического вывода непросто из-за сложности построения базового образа в соответствии со спецификациями SageMaker. В этой статье мы решили эту проблему, научив вас, как:

  • Как настроить скрипт обучения XGBoost
  • Настройка API-интерфейсов Flask для конечных точек вывода
  • Преобразование моделей в формат Daal4Py для ускорения вывода
  • Как упаковать все вышеперечисленное в образ Docker
  • Как зарегистрировать наш собственный образ SageMaker в реестре AWS Elastic Container Registry.

Источники: