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

Speil

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

Контекст

Недавний день инноваций Tigerspike, в ходе которого мы начали сотрудничать с транспортным провайдером и AWS, дал мне возможность заняться машинным обучением. Гипотеза:

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

Входные данные

Для меня это означало проверку общедоступных данных, доступных в OpenData. Для вас это означает объединение CSV данных, включающих столбец, который вы хотите прогнозировать, и параметры, которые могут на него повлиять. В моем примере меня интересует поле «Capacity Bucker» в качестве выходных данных, чтобы представить, насколько заполнена шина.

Полезные советы: в первый раз, когда я сделал это, я включил все поля в набор данных, это не сработало, так как это запутало модель с нерелевантными входными данными и увеличило время, необходимое для генерировать модель экспоненциально. Если вы знаете, что столбец нерелевантен, удалите его. Кроме того, убедитесь, что ваши данные правильно помечены как строка, где это необходимо (заключите их в кавычки), поскольку это помогает модели определить, какое значение является категориальным, а какое числовым. В приведенном ниже примере я помечаю маршрут автобуса как категориальный, используя кавычки, чтобы сообщить SageMaker, что существует набор автобусных маршрутов, а не числовое значение 372, относящееся к шине.

Начало работы с SageMaker AutoPilot

А теперь самое интересное! Войдите в AWS и перейдите в AWS SageMaker. Вы должны увидеть ссылку на студию AWS SageMaker. Добавьте пользователя, если у вас его еще нет (вы можете использовать значения по умолчанию), и как только это будет завершено, нажмите «Открыть Studio», чтобы запустить Jupyter lab.

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

Здесь вы настраиваете свой эксперимент и здесь проявляет себя AutoPilot. Он делает массу предположений относительно ваших данных, поэтому вам нужно предоставить только несколько деталей:

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

Расположение входных данных в S3: я не буду вдаваться в подробности этого шага. Создайте корзину AWS и загрузите в нее файлы csv (убедитесь, что имя соответствует разрешениям пользователя, которого вы настроили). Если вы правильно настроили своего пользователя, вам не нужно ничего менять в настройках сегмента по умолчанию.

Имя целевого атрибута. Это имя столбца, которое вы пытаетесь предсказать.

Расположение S3 для выходных данных: здесь можно создать отдельную корзину или использовать папку в первой корзине. Здесь будет храниться ваша актуальная модель.

Тип проблемы с машинным обучением. Ни один из этих вариантов ничего не значил для меня как новичка в области науки о данных. К счастью, появляется Автопилот и предлагает решить эту проблему за вас, так что вы можете оставить его как «Авто».

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

Магия

Дальше предстоит немного подождать, пока всю тяжелую работу сделает автопилот. Если вы эффективно обрезали столбцы, это не займет много времени.

Верхний совет. Что вы заметите после завершения первого шага «Анализ данных», так это то, что в правом верхнем углу окна появятся две кнопки. Это не обязательно, но я настоятельно рекомендую прочитать «Блокнот для исследования данных», чтобы получить несколько советов о том, как очистить данные и улучшить модель. Так я понял, что нужно отмечать определенные столбцы как категориальные. Это отличный способ убить время, ожидая, пока AWS превратит вас в специалиста по данным.

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

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

Что касается темы, вы можете сделать следующий экран довольно простым. Дайте конечной точке имя и выберите тип экземпляра. Если вы просто играете или экономите, выберите самый низкий тип инстанса, который вы можете. Когда закончите, нажмите «Развернуть модель».

Тестирование с помощью API Gateway и Lambda

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

Я не буду вдаваться в подробности об API Gateway и Lambda, поскольку это не входит в объем данной статьи. При этом следующие быстрые шаги должны помочь вам:

  1. Перейдите в Lambda в консоли AWS и нажмите Создать функцию.
  2. Дайте ему имя и выберите Python в качестве среды выполнения.
  3. Выберите Создать новую роль с базовыми разрешениями Lambda в разделе Роль выполнения.
  4. На следующем экране прокрутите вниз до «Execution Role» и откройте свою новую роль в IAM. Прикрепите политику AmazonSageMakerReadOnly, чтобы разрешить ей вызывать вашу новую конечную точку. Вам также необходимо предоставить ему разрешения sagemaker: InvokeEndpoint, используя приведенный ниже фрагмент.
  5. Добавьте приведенный ниже фрагмент кода в качестве содержимого вашей функции.
  6. Добавьте переменную среды ENDPOINT_NAME в качестве имени (не ARN) развернутой модели. В моем случае это «опаловая отделка».
  7. Нажмите Сохранить, и все готово.
  8. Перейдите в API Gateway в консоли AWS и нажмите Создать API.
  9. Выберите Rest API и нажмите Сборка.
  10. Дайте ему имя и нажмите Создать.
  11. В меню Действия выберите Создать метод и выберите ОПУБЛИКОВАТЬ.
  12. Выберите ранее созданную лямбда-функцию и нажмите Сохранить.
  13. В меню Действия выберите Развернуть API, выберите этап и нажмите Развернуть.
  14. Теперь у вас должен быть URL-адрес для вызова!
import os
import io
import boto3
import json
import csv
# grab environment variables
ENDPOINT_NAME = os.environ['ENDPOINT_NAME']
runtime= boto3.client('runtime.sagemaker')
def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    
    data = json.loads(json.dumps(event))
    payload = data['data']
response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
                                       ContentType='text/csv',
                                       Body=payload)
return response['Body'].read()

Приведенный выше фрагмент просто вызовет вашу конечную точку с данными CSV, которые вы ей предоставите.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sagemaker:InvokeEndpoint",
            "Resource": "!!!SPECIFIC_RESOURCE_ARN or *!!!"
        }
    ]
}

Это пример политики, которая понадобится вашей лямбде для вызова развернутой модели.

Тестирование модели

Теперь, когда он развернут и обернут открытой конечной точкой шлюза API, приступим! Откройте предпочтительный клиент, я использую Postman, и создайте запрос POST с вашей новой конечной точкой. Тело будет похоже на строку CSV с данными обучения, за исключением столбца, который вы пытались вычислить. Вот пример из моего набора данных.

{
  "data": "30-DEC-16,372,Inbound,202129,06:26:00,59"
}

Запустив API, вы увидите, что возвращается прогнозируемое значение модели! Вот и все, вы только что создали и развернули алгоритм машинного обучения, который можно использовать для чего угодно.

Следующие шаги

Хорошо, это казалось достаточно простым благодаря AWS SageMaker AutoPilot, выполняющему большую часть тяжелой работы. Проблема в том, что у нас осталась модель, которая, вероятно, не совсем точна. Автопилот, вероятно, принял некоторые решения, которые повысили его общую точность, а не умность. В моем примере поле вывода содержало только 3 категориальных значения, представляющих емкость шины, а не числовую шкалу, которая фиксировала бы незначительные приращения и могла бы привести к более точному чтению. Я заканчиваю неудачным сценарием, когда моя модель рассматривает случай «Доступно много мест» как настолько популярный, что он может гарантировать разумный уровень точности, просто всегда возвращая его.

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

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