Amazon SageMaker упрощает обучение (и развертывание) моделей машинного обучения в любом масштабе. Благодаря Python SDK разработчики могут сначала поэкспериментировать со своим набором данных и моделью, используя экземпляр ноутбука. Когда они довольны моделью, вполне вероятно, что им придется тренировать ее снова и снова с новыми данными или новыми параметрами.

В этом посте я покажу вам, как переобучить модель SageMaker двумя простыми способами:

1 - По запросу с использованием веб-службы, реализованной с помощью AWS Chalice.

2 - Периодически с использованием запланированной лямбда-функции, развернутой с бессерверной.

Обучение модели SageMaker

SageMaker SDK отлично подходит для экспериментов, но он слишком велик, чтобы поместиться в пакет Lambda. Впрочем, не беспокойтесь: клиент SageMaker в boto3 включает API CreateTrainingJob, который отлично послужит нашей цели.

Список параметров может показаться устрашающим, но имейте в виду, что мы переобучаем существующую модель. Все эти параметры уже переданы: мы возьмем их с помощью API DescribeTrainingJob и повторно используем большинство из них как есть, просто изменив некоторые из них для большей гибкости.

Давай приступим к работе :)

Обучение по запросу с помощью веб-сервиса Chalice

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

Наш веб-сервис будет предоставлять три API:

  • / list / {results}: список последних результатов учебных заданий, отсортированных по дате завершения по убыванию. Мы вернем только название задания и статус задания, как это предусмотрено API ListTrainingJobs.
  • / get / {name}: опишите работу по обучению. Мы вернем результат API DescribeTrainingJob.
  • / train / {name}: переподготовьте работу с CreateTrainingJob. В теле запроса мы передадим новое имя (обязательно), выходной путь S3 для хранения модели (необязательно), тип экземпляра (необязательно) и количество экземпляров (необязательно).

Определение разрешений IAM

Chalice может автоматически создавать политики IAM, но здесь этого не будет. Действительно, нам нужно добавить специальное разрешение, позволяющее функции Lambda, развернутой Chalice, передавать служебную роль SageMaker.

Обоснование: разрешение на вызов API службы не означает, что у вас должны быть те же разрешения, что и у самой службы. Таким образом, чтобы предотвратить повышение привилегий, пользователю должно быть явно разрешено передавать роль службы, то есть наследовать разрешения, предоставленные службе.

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

Вот как должна выглядеть политика в консоли IAM.

Теперь, когда мы разобрались с разрешениями, приступим к написанию наших API.

Список вакансий

Ничего особенного: просто вызовите API ListTrainingJobs и верните два интересующих нас поля.

Здесь следует предостеречь: при локальном запуске службы Chalice использует учетные данные AWS текущего пользователя, а не политику, определенную в файле конфигурации. Учтите это при тестировании и отладке!

Описание работы

Очень просто. DescribeTrainingJob - это все, что нам нужно.

Переподготовка на работу

Для этого потребуется немного больше работы:

  • Опишите старую работу по обучению.
  • Прочтите из тела запроса, задайте имя для нового задания по обучению, а также необязательное новое местоположение вывода, тип экземпляра и количество экземпляров.
  • Повторно используйте все остальные параметры. VpcConfig вызывает дублирование кода, так как он не может быть установлен на пустой словарь (проблема создана, не стесняйтесь +1).
  • Обучите новую работу.
  • Верните ответ от CreateTrainingJobAPI.

Давайте развернем наш сервис и протестируем!

Хорошо, это работает! Теперь у нас есть простой способ переобучить любое задание SageMaker по запросу с новыми параметрами (код на Github).

Что, если нам нужно было переобучиться по определенному графику? Не пишите задания cron, развернутые на инстансе EC2! Есть способ получше :)

Периодическое обучение с запланированной лямбдой

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

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

Настройка лямбда-функции

Конфигурация проста:

  • Определите разрешения. Не нужно беспокоиться о разрешениях CloudWatch Logs, они добавляются автоматически. Убедитесь, что вы используете ту же роль службы, которая использовалась для обучения начальной работе.
  • Определите функцию с именем «main».
  • Определите источник события с периодом 5 минут (*** это только для целей тестирования: пожалуйста, измените это! ***). Мы также могли бы использовать выражение cron.
  • Определите переменные среды, в которых хранятся имя старого задания, префикс имени для нового задания, тип экземпляра. и количество экземпляров. Это предоставит начальные значения для новых тренировок, которые можно обновить в любое время в консоли или с помощью API UpdateFunctionConfiguration.

Написание лямбда-функции

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

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

Развертывание лямбда-функции

Как и в случае с Chalice, достаточно одной команды CLI.

Мы можем проверить нашу функцию в консоли Lambda.

Также видны переменные среды.

Все выглядит нормально. Через несколько минут в консоли SageMaker начнут появляться учебные задания. Ура!

Теперь у нас есть полностью автоматизированный способ переобучения моделей SageMaker (код на Github). Если бы мы хотели переобучить разные модели, мы бы просто развернули дополнительные лямбда-функции с другими параметрами.

Заключение

Используя всего несколько строк кода, мы создали два разных решения для переобучения моделей SageMaker и развернули каждое с помощью одной единственной команды. Оба решения просты, надежны, масштабируемы… и имеют практически нулевую стоимость. Что не нравится? Полагаю, бессерверные операции ML - это вещь, тогда: *)

На сегодня все. Спасибо за чтение, с удовольствием отвечу на вопросы здесь или в Твиттере.

Чтобы узнать больше, посетите мой YouTube канал.

AWS на Евровидении: D Гитары и огонь!