Пошаговый подход

Примечание автора. Я выбрал это изображение, так как упражнение, описанное в этой статье, завершается созданием шлюза API на AWS для модели прогнозирования для классификации билетов Jira, построенной на основе цепочки инструментов Amazon Sagemaker.

Введение

В предыдущей статье я задокументировал шаги, которые я предпринял для создания механизма классификации ошибок Jira с использованием Tensorflow (в частности, с использованием 1D CNN и встроенного слоя) и развертывания в виде контейнера Docker. В этой статье я описываю шаги, которые я предпринял, чтобы сделать то же самое, но с использованием набора инструментов Amazon Sagemaker, в частности встроенного алгоритма классификации текста BlazingText.

Как и в предыдущей статье, этот небольшой проект был выполнен в рамках курса AICamp, на этот раз курса Full Stack Deep Learning in AWS.

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

Моими личными целями при работе над этим проектом были:

  1. Попробуйте провести обучение на экземплярах GPU в AWS.
  2. Сравните результаты предыдущего подхода 1D CNN.
  3. Получите представление о том, как развернуть модель прогнозирования с помощью цепочки инструментов AWS.
  4. Попробуйте инструмент настройки гиперпараметров Baysian от Sagemaker.

Как и в предыдущей статье, блокноты и файлы данных можно найти в Gitlab:

https://gitlab.com/foohm71/octopus2

Для этого проекта я создал отдельную папку под названием BlazingText/supervised (если вам интересно, что такое папка word2vec в папке BlazingText, это тема будущей статьи).

Что такое BlazingText?

В моей предыдущей статье я упомянул несколько вариантов выполнения классификации текста с использованием DNN, и word2vec — один из вариантов. Использование 1D CNN со слоем встраивания слов было еще одним, что было рассмотрено в этой статье.

слово2век

Я не собираюсь слишком много рассказывать о word2vec, так как не смогу отдать должное теме, но достаточно сказать, что word2vec — это подход DNN к созданию встраивания слов.

Если вы хотите узнать больше о word2vec, я настоятельно рекомендую посмотреть Объяснение Word2Vec! от Python Programmer на YouTube. По сути, word2vec — это DNN, которая по заданному набору текста отображает слова в N-мерное векторное пространство. Идея заключается в том, что слова, которые ближе друг к другу, принадлежат друг другу. Обычно это зависит от расстояния между ними в предложениях набора текста, на котором он обучается. Затем мы можем использовать эту близость для обучения алгоритма классификации.

BlazingText

BlazingText — это реализация Amazon word2vec DNN, используемая для создания встраивания слов, а затем использование другой DNN с встраиванием для создания текстового классификатора поверх него. Чтобы лучше понять это, я настоятельно рекомендую посмотреть видео от Amazon на эту тему.

Amazon AWS и Sagemaker

Существует несколько инструментов AWS, которые мы используем для построения модели и ее развертывания, а именно:

  1. S3 — см. https://aws.amazon.com/getting-started/hands-on/backup-files-to-amazon-s3/
  2. Sagemaker — https://aws.amazon.com/getting-started/hands-on/build-train-deploy-machine-learning-model-sagemaker/
  3. Лямбда — https://aws.amazon.com/getting-started/hands-on/run-serverless-code/
  4. Шлюз API — https://docs.aws.amazon.com/cloud9/latest/user-guide/tutorial-lambda.html

Примечание автора. Если вам интересно узнать, как использовать стек AWS Sagemaker для создания развертываемого механизма машинного обучения или DNN, я настоятельно рекомендую пройти курс AICamp, упомянутый во введении. Это имеет большое значение, особенно если (а) у вас есть опыт работы с ML, но мало опыта работы с AWS или (б) у вас есть опыт работы с AWS, но не так много опыта работы с ML или DNN. Курс пытается соединить эти два понятия, и в начале есть много рук. Лично я был в группе (а) и смог освоить BlazingText, хотя он не был изучен в курсе.

Примечание. Я запускаю некоторые из своих блокнотов в Google Colab, так как их запуск в экземпляре блокнота Sagemaker будет стоить денег. При работе с AWS следует отметить одну вещь: вам необходимо постоянно проверять свои расходы, так как вы могли оставить некоторые неиспользуемые сервисы работающими, и это может привести к увеличению счета.

Подготовка данных

Первым шагом является подготовка данных для обучения и проверки в форме, используемой BlazingText. В документе BlazingText описываются 2 формата: (а) с разделением строк и (б) JSON. Мы будем использовать (a) для этого.

В этом упражнении я также использую JIRA_OPEN_DATA_LARGESET_PROCESSED.csv, так как хочу использовать результат для сравнения с 1D CNN, описанным в предыдущей статье.

Чтобы преобразовать csv в формат BlazingText, я использовал код, найденный в BlazingTextDataPrepTrainEval.ipynb (в репозитории gitlab, в подпапке BlazingText/supervised. Это блокнот Google Colab).

# mapping dictionary to map the priorities to labels
labels = {“Optional”: “__label__1”,
          “Trivial”: “__label__2”,
          “Minor”: “__label__3”,
          “Major”: “__label__4”,
          “Critical”: “__label__5”,
          “Blocker”: “__label__6”}
# write lst file function
def write_lst_data_to_file(path, Xdata, Ydata):
   with open(path, ‘wb’) as fp:
   num_rows = Xdata.shape[0]
   for i in range(1,num_rows):
   output = labels[Ydata.iloc[i]] + “ “ + Xdata.iloc[i]
   fp.write(output.encode(“utf-8”))
   fp.write(“\n”.encode(‘utf-8’))

Поскольку данные можно было считывать в кадр данных Pandas, я просто использовал стандартную функцию scikit-learn train-test-split, чтобы разделить их (проверка на 30%), а затем используйте эту функцию, чтобы записать их в 2 файла: jira_largeset_train.lst и jira_largeset_test.lst. Оба файла находятся в репозитории gitlab.

Примечание. В записную книжку BlazingTextDataPrepTrainEval.ipynb я также включил график меток, чтобы показать, насколько несбалансированы данные.

Полученные файлы выглядят следующим образом:

__label__3 Form Item’s asterix is not getting placed vertically ... 
__label__4 New beans.xml wizard should warn if the file already ... 
__label__6 focusAlpha not working This bug was imported from ...

Затем вам нужно загрузить эти 2 файла в корзину S3.

Создание базовой модели

Следующим шагом является построение базовой модели. Есть 2 способа сделать это:

  1. Использование пользовательского интерфейса Sagemaker
  2. Использование блокнота Jupyter на экземпляре Sagemaker Jupyter

Сначала мы обсудим (1) здесь и представим (2) в разделе «Оценка модели».

Первый шаг — нажать «Обучающие задания» на странице Sagemaker.

Затем нажмите «Создать задание на обучение».

Дайте вашей работе название. Что касается роли IAM, вам придется использовать существующую роль или создать новую роль для выполнения задач Sagemaker. У него должен быть доступ к вашей корзине S3. Также и S3, и ваш экземпляр Sagemaker должны находиться в одном регионе, например. us-east-1

Выберите режим ввода «BlazingText» и «Файл».

Выберите конфигурацию ресурса. Я выбрал хранилище ml.c5.4xlarge и 100Gb (что, вероятно, излишне).

Для гиперпараметров я использовал следующее не по умолчанию:

mode: supervised
epochs: 15
early_stopping: true

Для «Конфигурации входных данных» вам нужно будет добавить местоположение S3 для каналов обучения и проверки.

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

Далее вам нужно будет настроить, куда будет поступать вывод. Добавьте допустимое расположение S3 для выходного пути.

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

Вы, должно быть, уже задаетесь вопросом, как вы проверяете точность обучения и проверки. Это вам нужно будет использовать Cloudwatch. Перейдите к учебному заданию, нажмите на него и перейдите в «Монитор». Нажмите на ссылку «Просмотреть журналы», и вы сможете просмотреть журналы тренировочного прогона.

После завершения обучения вы также можете щелкнуть ссылку «Просмотреть показатели алгоритма», чтобы проверить точность обучения и проверки.

Для моего прогона я получил точность обучения 0,69 и точность проверки 0,572, что немного лучше, чем у 1D CNN.

Настройка гиперпараметров

Amazon Sagemaker предоставляет очень интуитивно понятный инструмент пользовательского интерфейса для выполнения настройки гиперпараметров для встроенных алгоритмов. В прошлом я использовал scikit-learn для создания простой настройки случайного и поиска по сетке для классификатора случайного леса (см. ModelAnalysis.ipynb в репозитории Octopus2 gitlab) на основе [2]. Это было ново, так как инструмент Sagemaker содержал встроенный байесовский алгоритм настройки, поэтому мне не терпелось попробовать его.

Первый шаг — щелкнуть «Задания по настройке гиперпараметров» на странице Sagemaker.

Затем нажмите кнопку «Создать задание по настройке гиперпараметров».

Затем дайте имя своей работе и включите раннюю остановку

Выберите «Байесовский» для настройки стратегии

Нажмите «Далее». Затем нажмите «Добавить определение задания на обучение».

Дайте определение своему заданию по обучению и заполните «Параметры алгоритма» точно так же, как вы делали это в «Создать задание по обучению», т.е. выберите BlazingText и т. д. Затем выберите validation:accuracy в поле «Целевая метрика» (см. скриншот ниже):

Для Настройки гиперпараметров я следовал инструкциям в https://docs.aws.amazon.com/sagemaker/latest/dg/blazingtext-tuning.html. Следует отметить, что если вариантов нет, вам нужно установить тип Статический. Затем нажмите Далее.

На следующей странице вас попросят заполнить каналы обучения и проверки, контрольные точки и выходные местоположения S3. Это то же самое, что и в разделе «Создание базовой модели».

Затем в «Конфигурации ресурсов» я использовал ml.c5.4xlarge со 100 ГБ и условием остановки, которое я установил на максимум 30 минут для каждого запуска (оно должно быть намного меньше).

Для лимитов ресурсов это зависит от того, что вы настроили в качестве лимитов расходов. Для меня мне пришлось установить максимальное количество параллельных учебных заданий на 8 и максимальное количество учебных заданий на 100.

Наконец, нажмите «Создать задание по настройке гиперпараметров».

Это запустит весь процесс запуска процесса настройки гиперпараметров, и это займет некоторое время. После завершения вы увидите что-то вроде этого:

Нажмите на задание, и вы увидите свои результаты:

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

Оценка модели

Как я упоминал в начале, есть еще один способ построить модель — использовать экземпляр ноутбука Sagemaker. Прежде всего, вам нужно создать экземпляр. Для этого следуйте инструкциям здесь.

Примечание. За запуск экземпляров блокнота Sagemaker взимается плата. Чтобы сэкономить деньги, обязательно отключайте их (не удаляйте!), Когда они не используются. Вы всегда можете перезапустить их снова со всеми сохраненными файлами.

В этом разделе я расскажу о содержимом блокнота blazingtext_text_classification_jira.ipynb, который находится в папке BlazingText/supervised основного репозитория gitlab.

Этот блокнот был изменен на основе примера блокнота, предоставленного AWS.

Первый шаг — подключить источники данных и места вывода:

и

Затем настройте контейнер для задания обучения.

Настройка параметров тренировки

А потом тренироваться! (это займет некоторое время, конечно)

Затем создайте конечную точку Sagemaker.

Примечание. Если конечная точка не используется, убедитесь, что вы удалили конечную точку, иначе с вас будет взиматься плата за ее поддержание в рабочем состоянии. Вы всегда можете перезапустить его, запустив эту команду на ноутбуке позже, и Sagemaker знает, что нужно выбрать последнюю обученную модель. Чтобы удалить конечную точку, внизу блокнота есть команда:

В следующей части показано, как выполнять прогнозы в конечной точке модели:

Ответ представляет собой JSON с вероятностью и предсказанной меткой.

Оценка модели

Мне нравится простота создания, обучения и развертывания (как вы увидите в следующем разделе) модели с использованием AWS Sagemaker и цепочки инструментов AWS, но меня очень раздражает отсутствие инструментов для оценки модели. Поэтому мне пришлось создавать эту часть с нуля.

Что я хотел сделать, так это использовать набор проверочных данных и запустить его с помощью алгоритма прогнозирования, создать матрицу путаницы и рассчитать стандартные показатели, такие как точность, отзыв и точность. Для этого мне пришлось создать нулевую матрицу и заполнить ее

Мне удалось найти код для расчета метрик точности/отзыва на странице https://www.python-course.eu/confusion_matrix.php и сгенерировать метрики:

Затем я использовал матрицу путаницы, чтобы создать тепловую карту, используя matplotlib.

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

Примечание: похоже, что было какое-то деление на ноль, так как набор данных не включал некоторые ярлыки, поэтому я проигнорирую их, поскольку это дало мне информацию, которую я искал, т.е. насколько хорошо алгоритм работает с совершенно новым набором данных.

Хотя общая точность не очень хорошая (менее 50%), точность приличная. Затем я хотел проверить матрицу путаницы:

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

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

Развертывание модели

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

  1. Используя задание обучения, созданное в «Создание базовой модели» или «Задание настройки гиперпараметров», создайте модель
  2. Использование этой модели для создания конечной точки Sagemaker
  3. Создайте Amazon Lambda для обработки входящих запросов на прогнозирование
  4. Создайте шлюз API для предоставления API HTTP POST

Создание модели и конечной точки Sagemaker

Сначала выберите задание обучения: это может быть либо первое задание обучения, либо задание обучения из задания настройки гиперпараметров. Затем, оказавшись там, нажмите кнопку «Создать модель».

Дайте модели имя, выберите правильную роль IAM. Я использовал значения по умолчанию для «Определение контейнера» и «Сеть». Затем я нажал на кнопку «Создать модель».

Далее перед вами появится список созданных вами моделей. Выберите новую модель и нажмите «Создать конечную точку».

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

Затем нажмите «Создать конечную точку».

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

Создание лямбды

Перейдите к Amazon Lambda. Нажмите «Создать функцию».

Выберите «Автор с нуля». Дайте функции имя, выберите среду выполнения (я использовал Python 3.6). Нажмите «Создать функцию».

На следующей странице вы строите и тестируете свою Lambda. В разделе «Код функции» я использовал следующее:

import json
import os
import boto3
ENDPOINT_NAME = os.environ['ENDPOINT_NAME']
sgm_runtime = boto3.client('runtime.sagemaker')
reverse_label_map = {"__label__1": "Optional",
                     "__label__2": "Trivial",
                     "__label__3": "Minor",
                     "__label__4": "Major",
                     "__label__5": "Critical",
                     "__label__6": "Blocker"}
def format_payload(data):
   list = []
   list.append(data)
   payload = {"instances": list}
   return json.dumps(payload)
def lambda_handler(event, context):
   data = event['body']
   payload = format_payload(data)
   response = 
      sgm_runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,  
                                  ContentType='application/json',
                                  Body=payload)
   prediction = json.loads(response['Body'].read().decode())
   prediction_label = prediction[0]['label'][0]
   mapped_prediction = reverse_label_map[prediction_label]
   return {
      'statusCode': 200,
      'body': mapped_prediction}

По сути, что он делает, он получает полезную нагрузку, которая выглядит так

{ "body": "some text to classify"}

и создайте полезную нагрузку в виде

{ "instances": ["some text to classify"]}

и отправить его в механизм прогнозирования. Мы видели эту форму в предыдущем разделе «Оценка модели». Как только ответ получен, он затем извлекает label часть полезной нагрузки ответа и выполняет преобразование от __label__X до фактического приоритета ошибки.

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

Существует испытательный центр, где вы можете передать тестовую полезную нагрузку для тестирования Lambda. Я бы рекомендовал вам использовать его, чтобы убедиться, что он работает. Это довольно понятно, и для этого есть документация в Интернете.

Создание шлюза API

Перейдите к шлюзу API Amazon. Выберите для создания REST API.

Заполните то же самое и обычно, а затем нажмите Создать API. После этого выполните действия, описанные в разделе Создание API Hello World на странице https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for. -лямбда.html». Конечно, убедитесь, что вы используете свою лямбда-функцию вместо предоставленной там.

После этого вам будет предоставлен URL-адрес шлюза API для вашего метода, и вы сможете свернуть свой API с полезной нагрузкой.

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

[1] Социальный репозиторий Jira, Марко Орту и др. https://github.com/marcoortu/jira-social-repository

[2] Hyperparameter Tuning the Random Forest in Python, Will Koehrsen, январь 2018 г. https://towardsdatascience.com/hyperparameter-tuning-the-random-forest-in-python-using-scikit-learn-28d2aa77dd74

[3] Объяснение Word2Vec!, The Python Programmer (YouTube) https://youtu.be/yFFp9RYpOb0

[4] Серия вебинаров по встроенным алгоритмам Amazon SageMaker: Blazing Text, Amazon, https://youtu.be/G2tX0YpNHfc