Структурирование, отладка и обучение пользовательских моделей в FireVisor с использованием AWS SageMaker

Почти все, что мы видим вокруг себя сегодня, производится на фабриках. Однако производство в том виде, в каком мы его видим сегодня, в основном устарело. Производители тратят до 15–20% выручки от продаж за счет затрат на низкое качество (COPQ) [ссылка]. Сюда входят затраты на обнаружение и предотвращение отказов продукта. Чем позже обнаружен дефект, тем больше ресурсов было потрачено впустую на дефектную часть.

Одна производственная линия может производить терабайты данных каждый день. Эти данные имеют большое значение, поскольку они могут сообщить производителям, почему происходят сбои. Но ни один человек не способен просмотреть этот объем данных. FireVisor создает фабрики с самосознанием, которые понимают характер дефектов и повышают производительность. Он делает это, помогая инженерам-технологам использовать возможности науки о данных.

Каждый день наша платформа искусственного интеллекта (ИИ) анализирует более миллиона продуктов. Это помогает снизить COPQ за счет раннего выявления дефектов и помощи инженерам в выявлении основных причин.

Болевые точки

Создание ИИ, который понимает данные производителей для выявления аномальных событий, — немалый подвиг. Мы обрабатываем данные миллионов деталей с различными профилями дефектов. Наша команда по машинному обучению (ML) постоянно экспериментирует с различными параметрами обучения и конфигурациями наборов данных нейронных сетей. Возможность быстро повторять эти эксперименты с доступной стоимостью вычислений является для нас ключевым элементом при рассмотрении инфраструктуры обучения машинному обучению.

Изначально мы запускаем большую часть наших учебных рабочих нагрузок в Amazon Elastic Compute Cloud (EC2) экземпляры с графическим процессором. Поскольку мы использовали несколько экземпляров, стоимость была для нас одной из самых больших проблем. Если бы мы выбрали вариант использования ванильных точечных инстансов EC2 для экономии средств, нам пришлось бы приложить дополнительные инженерные усилия для обработки состояний машины и обучения. Мало того, масштабирование нашей тренировочной нагрузки по горизонтали было нетривиальной задачей. Нам пришлось бы реплицировать нашу среду обучения в разных экземплярах. Это также привело к увеличению накладных расходов на отслеживание экспериментов в нескольких экземплярах.

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

Amazon SageMaker и его преимущества для FireVisor

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

Обучение рабочим нагрузкам машинного обучения на SageMaker может быть более экономичным и удобным, чем обучение на инстансах EC2 по требованию. При использовании SageMaker плата за вычислительные ресурсы выставляется только в том случае, если выполняется наше задание по обучению. Однако на этом экономия средств с помощью SageMaker не заканчивается. Можно сэкономить еще больше, используя управляемое точечное обучение SageMaker. В FireVisor мы ежемесячно экономим примерно до 60 % на вычислительных затратах на обучение машинному обучению благодаря управляемому точечному обучению SageMaker. Следует отметить, что спотовые экземпляры могут прерываться, и в результате время обучения может занять больше времени. В зависимости от срочности вашего эксперимента вы можете легко тренироваться быстрее или дешевле с помощью SageMaker.

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

Раньше мы хранили наши обучающие эксперименты на томах Amazon Elastic Block Store (EBS), подключенных к инстансам EC2. Теперь мы храним их все на Amazon Simple Storage Service (S3). Это повысило наглядность обучающих экспериментов. Теперь каждый член команды может просматривать журналы обучающих экспериментов и результаты любых других членов команды на S3 без необходимости удаленного доступа к экземплярам. На рисунке 1 ниже показано сравнение нашей традиционной установки и нашей текущей установки. Amazon Elastic Container Registry (ECR) используется для хранения образа контейнера, используемого для обучения.

Мы кратко описали наши проблемы и то, как SageMaker может стать их решением. Теперь мы хотим описать, как FireVisor настроил рабочий процесс обучения с помощью Sagemaker.

Настройка SageMaker для удовлетворения потребностей группы машинного обучения FireVisor

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

Для каждого нового эксперимента член команды создает новую конфигурацию как для учебного задания SageMaker, так и для самого обучения. Мы называем их SageMaker Config и Training Config. Затем они могут запустить скрипт run_sagemaker_job.py, чтобы запустить весь процесс обучения. Сценарий загружает SageMaker и Training Config в S3 и запускает задание обучения SageMaker с помощью SDK. Если какой-либо другой член команды захочет повторить эксперимент, загруженные конфиги содержат все необходимые параметры для его повторения. На рис. 2 показан поток этого процесса.

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

Настройка конфигураций

Управление конфигурациями

Существуют различные способы управления конфигурациями. В FireVisor используется YACS, где мы должны создавать шаблоны конфигурации по умолчанию. Затем он использует файл YAML, созданный пользователем, для переопределения значений по умолчанию.

Шаблоны конфигурации по умолчанию служат универсальным ориентиром для всех настраиваемых параметров. Они должны быть хорошо задокументированы и должны обеспечивать разумные значения по умолчанию для всех параметров. Это одна из основных причин, по которой мы выбрали YACS, а не просто считывали конфигурации из JSON для файлов YAML напрямую. Разработчики теперь могут понять, что делает каждый параметр конфигурации и каково разумное значение по умолчанию для каждого из них, без необходимости искать, где он используется в исходном коде.

Конфигурации по умолчанию для параметров, связанных с SageMaker, находятся в sagemaker_default_config.py. Параметры, связанные с обучением, находятся в sagemaker_container/training_default_config.py. Структура папок показана на рисунке 3 ниже.

Конфигурация SageMaker

Файл sagemaker_default_config.py содержит все возможные параметры SageMaker Config вместе со значениями по умолчанию. Если разработчик хочет обновить параметры по умолчанию, можно создать отдельный файл конфигурации, например configs/sagemaker_config.yaml, с параметрами, специфичными для эксперимента. Это позволяет членам команды машинного обучения проводить различные эксперименты. Структура папок выглядит так, как показано ниже.

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

Конфигурация для обучения

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

Файл sagemaker_container/training_default_config.py содержит все возможные параметры обучения вместе со значениями по умолчанию. Если пользователь хочет обновить параметры по умолчанию, он может создать файл конфигурации обучения, например configs/training_config.yaml. Пользователю также необходимо обновить значение TRAINING.CONFIG_FILE в файле конфигурации SageMaker. Структура папок выглядит так, как показано ниже.

Создание образа Docker

Поскольку нам нужны были настраиваемые зависимости для нашего конвейера обучения, мы расширили базовый образ Docker PyTorch, предоставленный AWS. Полный список доступных базовых образов Deep Learning Container см. здесь.

Используя наш шаблон, образ контейнера создается путем запуска build_and_push.sh, который извлечет базовый образ, создаст репозиторий ECR, если необходимо, создаст и пометит образ, а затем отправит его в ECR.

Локальный запуск задания SageMaker

Запуск учебного задания SageMaker в облаке требует некоторого времени для запуска экземпляра, загрузки данных из S3 и загрузки образа контейнера. Это может быть совершенно непродуктивно, если вам приходится снова и снова исправлять простые проблемы с вашим кодом, такие как синтаксические ошибки. В FireVisor мы запускаем пробную версию обучающего задания SageMaker в локальном режиме перед запуском реального задания в облаке. Таким образом, нам не нужно загружать образ Docker из ECR и обучающие данные из S3 каждый раз, когда мы запускаем пробное обучающее задание.

Учебное задание SageMaker можно запустить в локальном режиме, задав instance_type значение local или local_gpu при создании экземпляра объекта Estimator. Образ Docker из ECR вместе с данными, которые вы указали в качестве входных каналов, будут загружены на ваш локальный компьютер. Если образ Docker существует локально, он больше не будет извлечен. Однако обучающие данные, указанные во входном канале, будут повторно загружены. Если это нежелательно, вы можете загрузить обучающие данные в локальную файловую систему и указать путь в локальной файловой системе для входного канала к обучающим данным. Таким образом, задание обучения в локальном режиме будет использовать локальные данные. Фрагмент кода приведен ниже.

Отладка в локальном режиме

Решение проблем в вашем коде может быть намного проще, если вы используете правильный отладчик, а не наблюдаете за журналами. В сочетании с возможностью запуска SageMaker в локальном режиме у нас также может быть правильный сеанс отладки для кода Python, запускаемого SageMaker в контейнере Docker. При отладке рекомендуется устанавливать меньшие эпохи обучения, а также частые контрольные точки. Если вы решите сохранить то же количество эпох, рекомендуется уменьшить размер обучающей выборки, чтобы можно было быстрее отлаживать весь процесс обучения. Перед выполнением следующих шагов убедитесь, что для параметра instance_type установлено значение localили local_gpu.

Шаг 1: Установите точку останова

Вы можете установить точки останова, используя стандартный модуль Python Debugger (pdb). В качестве альтернативы вы также можете использовать PuDB, консольный визуальный отладчик для Python. Если вы выберете PuDB, вы должны включить его в файл requirements.txt. Фрагмент кода ниже показывает, как установить точку останова в main.py с помощью PuDB.

Шаг 2. Пересоберите образ докера

После установки точек останова вам необходимо пересобрать образ контейнера. Для отладки на локальном компьютере вы можете создать образ локально, не отправляя его в ECR. Этого можно добиться, указав флаг --local при запуске скрипта build_and_push.shshell.

Шаг 3. Запуск обучающего задания SageMaker и вход в среду отладки

Теперь вы можете запустить задание SageMaker с помощью следующей команды:

python run_sagemaker_job.py --config <sagemaker_config>

Хотя выходные журналы остановятся в точке останова, выходные данные не переведут вас в интерактивную консоль, которую вы ожидаете от отладчика Python. Это потому, что вы просто видите стандартные журналы вывода. Чтобы подключиться к интерактивной консоли работающего контейнера, определите идентификатор контейнера, связанный с заданием SageMaker, запустив docker ps и найдя запись с именем изображения, которое соответствует training_image_uri, указанному вами при создании объекта Estimator. Затем вы можете запустить:

docker attach <container ID>

С этого момента вы можете использовать отладчик консоли Python как обычно.

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

docker exec -it <container ID> /bin/bash

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

Вы можете посмотреть видео с демонстрационным сеансом отладки в локальном режиме: https://www.youtube.com/watch?v=Mhl7j9BsXLA

Обучение работе с SageMaker

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

  • Убедитесь, что вы удалили все точки останова, установленные pdb или PuDB, пересобрали образ Docker и отправили последний образ Docker в ECR.
  • Обновите INSTANCE_TYPE в конфигурации SageMaker до типа экземпляра, на котором вы хотите тренироваться.
  • Запустите задание SageMaker, используя наш шаблон, выполнив:

python run_sagemaker_job.py --config configs/sagemaker_config.yaml

Заключение

Использование SageMaker не означает, что мы отказываемся от возможности сделать наши обучающие эксперименты прозрачными и легко отлаживаемыми. Поскольку мы перенесли нашу рабочую нагрузку по обучению на SageMaker, мы сократили наши затраты AWS на обучение машинному обучению на 50–70 %. Мы надеемся, что эта запись в блоге вдохновит вас на то, как вы можете настраивать, отслеживать и отлаживать свои эксперименты при использовании SageMaker.