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

Оптимизируйте планирование задач в блокнотах Amazon SageMaker и эффективно управляйте многоуровневыми рабочими процессами с помощью API.

Amazon SageMaker Studio предоставляет полностью управляемое решение для взаимодействия специалистов по анализу данных с интерактивной средой для создания, обучения и развертывания моделей машинного обучения (ML). Задания тетрадки Amazon SageMaker позволяют специалистам по данным запускать свои тетрадки по требованию или по расписанию всего в несколько щелчков в SageMaker Studio. С помощью этого запуска вы можете программно запускать тетрадки в качестве заданий, используя API, предоставленные Amazon SageMaker Pipelines, функцию оркестрации рабочего процесса ML в Amazon SageMaker. Кроме того, вы можете создавать многоэтапные рабочие процессы ML с несколькими зависимыми тетрадками, используя эти API.

SageMaker Pipelines – это инструмент оркестрации рабочего процесса для построения ML-пайплайнов, которые используют преимущества прямой интеграции с SageMaker. Каждый пайплайн SageMaker состоит из шагов, которые соответствуют отдельным задачам, таким как обработка, обучение или обработка данных с использованием Amazon EMR. Задания тетради SageMaker теперь доступны в качестве встроенного типа шага в пайплайнах SageMaker. Вы можете использовать этот шаг задания тетрадки, чтобы легко запускать тетрадки в виде заданий всего в нескольких строках кода с использованием Amazon SageMaker Python SDK. Кроме того, вы можете соединять несколько зависимых тетрадок, чтобы создать рабочий процесс в виде направленных ациклических графов (DAG). Затем вы можете запускать эти задания тетрадок или DAG и управлять и визуализировать их с помощью SageMaker Studio.

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

  • Запуск долгосрочных тетрадок в фоновом режиме
  • Регулярный запуск вывода модели для создания отчетов
  • Масштабирование от подготовки небольших наборов данных до работы с данными больших объемов петабайт
  • Переобучение и развертывание моделей в соответствии с графиком
  • Выполнение заданий для контроля качества модели или мониторинга изменения данных
  • Исследование параметров для улучшения моделей

Хотя эта функциональность позволяет специалистам по данным автоматизировать автономные тетрадки, рабочие процессы ML часто состоят из нескольких тетрадок, каждая из которых выполняет определенную задачу с комплексными зависимостями. Например, тетрадка, отслеживающая изменение данных модели, должна иметь предварительный шаг, позволяющий извлекать, преобразовывать и загружать (ETL) новые данные, и пост-шаг обновления и тренировки модели, если обнаруживается значительное изменение. Кроме того, специалисты по данным могут захотеть запускать этот рабочий процесс по расписанию для обновления модели на основе новых данных. Чтобы облегчить автоматизацию ваших тетрадок и создать такие сложные рабочие процессы, задания тетрадки SageMaker теперь доступны в качестве шага в SageMaker Pipelines. В этой статье мы покажем, как вы можете решить следующие проблемы с помощью нескольких строк кода:

  • Программно запускать автономную тетрадку немедленно или по расписанию
  • Создавать многоэтапные рабочие процессы тетрадок в виде DAG для непрерывной интеграции и непрерывной доставки (CI/CD), которые могут быть управляемы через пользовательский интерфейс SageMaker Studio

Обзор решения

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

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

В нашем примере по задаче машинного обучения мы создаем модель анализа настроения, которая является типом задачи классификации текста. Самые распространенные применения анализа настроения включают мониторинг социальных медиа, управление службой поддержки клиентов и анализ отзывов клиентов. В качестве набора данных, используемого в этом примере, выбран набор данных Stanford Sentiment Treebank (SST2), который состоит из обзоров фильмов вместе с целочисленным значением (0 или 1), указывающим положительное или отрицательное настроение обзора.

Ниже приведен пример файла data.csv, соответствующего набору данных SST2, в котором показаны значения в его первых двух столбцах. Обратите внимание, что файл не должен содержать заголовок.

Столбец 1 Столбец 2
0 сокрывает новые выделения от родительских единиц
0 не содержит остроумия, только выработанные шутки
1 что любит своих персонажей и передает что-то довольно красивое о человеческой природе
0 остается абсолютно удовлетворенным оставаться неизменным
0 по самым плохим клише о мести умников, которые удалось раздобыть создателям фильма
0 это слишком трагично, чтобы заслужить такую поверхностную обработку
1 демонстрирует, что режиссер таких голливудских блокбастеров, как “Партизанские игры”, все еще может создавать небольшие, личные фильмы с эмоциональным ударом.

В данном примере задачи машинного обучения мы должны выполнить несколько задач:

  1. Выполнить инженерию признаков, чтобы подготовить этот набор данных в формате, понятном нашей модели.
  2. После инженерии признаков запустить этап обучения, который использует Transformers.
  3. Настроить партионное выводное использование донастроенной модели для помощи в прогнозировании настроения новых обзоров, поступающих в систему.
  4. Настроить этап мониторинга данных, чтобы мы могли регулярно следить за новыми данными и обнаруживать изменения качества, которые могут потребовать повторного обучения весов модели.

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

  • Предварительная обработка – Загрузите общедоступный набор данных SST2 с помощью Amazon Simple Storage Service (Amazon S3) и создайте файл CSV для блокнота, который будет использоваться на шаге 2. Набор данных SST2 является набором данных классификации текста с двумя метками (0 и 1) и столбцом текста для категоризации.
  • Обучение – Возьмите сформированный файл CSV и запустите донастройку с использованием BERT для классификации текста с помощью библиотек Transformers. В рамках этого шага мы используем блокнот подготовки тестовых данных, который является зависимостью для этапов донастройки и партионного вывода. После завершения донастройки этот блокнот запускается с использованием магической команды run и готовит тестовый набор данных для проверки работы донастроенной модели.
  • Преобразование и мониторинг – Выполните партионный вывод и настройте контроль качества данных с использованием мониторинга модели, чтобы получить предложение об исходном наборе данных.

Запускать ноутбуки

Образец кода для этого решения доступен на GitHub.

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

  • Входной ноутбук – Название ноутбука, который будет оркестрироваться этим шагом работы с ноутбуком. Здесь вы можете указать локальный путь к входному ноутбуку. По желанию, если этот ноутбук содержит другие ноутбуки, которые он выполняет, вы можете передать их через параметр AdditionalDependencies для шага работы с ноутбуком.
  • URI образа – Образ Docker, используемый в шаге работы с ноутбуком. Это могут быть заранее определенные образы, которые уже предоставляет SageMaker, или пользовательский образ, который вы определили и отправили в Реестр контейнеров Amazon Elastic (Amazon ECR). См. Секцию о соображениях в конце этого сообщения для поддерживаемых образов.
  • Имя ядра – Имя используемого ядра в SageMaker Studio. Эта спецификация ядра зарегистрирована в образе, который вы указали.
  • Тип экземпляра (дополнительно) – Тип экземпляра Облачных вычислений Amazon Elastic (Amazon EC2) для работы с ноутбуком, который вы определили и будете запускать.
  • Параметры (дополнительно) – Параметры, которые вы можете передать в ваш ноутбук, и к которым можно обратиться. Они могут быть определены в виде пар ключ-значение. Кроме того, эти параметры можно изменять между различными запусками ноутбуков или выполнениями конвейера.

Наш пример содержит пять ноутбуков:

  • nb-job-pipeline.ipynb – Это наш основной ноутбук, в котором определена наша конвейер и рабочий процесс.
  • preprocess.ipynb – Этот ноутбук является первым шагом в нашем рабочем процессе и содержит код, который извлекает публичный набор данных AWS и создает из него CSV-файл.
  • training.ipynb – Этот ноутбук является вторым шагом в нашем рабочем процессе и содержит код для локального обучения и настройки. Этот шаг также зависит от ноутбука prepare-test-set.ipynb, который загружает тестовый набор данных для примера вывода с помощью настроенной модели.
  • prepare-test-set.ipynb – Этот ноутбук создает тестовый набор данных, который будет использоваться вторым шагом нашего обучающего ноутбука и использоваться для примера вывода через настроенную модель.
  • transform-monitor.ipynb – Этот ноутбук является третьим шагом в нашем рабочем процессе и запускает задание пакетного преобразования для базовой модели BERT, а также настраивает контроль качества данных с модельным мониторингом.

Затем мы идем по основному ноутбуку nb-job-pipeline.ipynb, который объединяет все под-ноутбуки в конвейер и выполняет рабочий процесс от начала до конца. Обратите внимание, что, хотя в следующем примере ноутбук выполняется только один раз, вы также можете запланировать выполнение конвейера для многократного выполнения ноутбука. См. документацию SageMaker для подробных инструкций.

Для нашего первого шага работы с ноутбуком мы передаем параметр с заданным корзиной S3. Мы можем использовать эту корзину для сохранения любых артефактов, которые хотим использовать в других шагах нашего конвейера. Для первого ноутбука (preprocess.ipynb) мы загружаем публичный набор данных обучения SST2 AWS и создаем из него обучающий CSV-файл, который мы загружаем в эту корзину S3. См. следующий код:

# Параметрыprint(default_s3_bucket)!aws s3 cp s3://sagemaker-sample-files/datasets/text/SST2/sst2.train sst2.train# будем читать только первые 500 строк для более быстрого выполненияwith open('sst2.train', 'r') as f:    lines = f.readlines()[:500] data = []for line in lines:    label, text = line.strip().split(' ', 1)    data.append((int(label), text))df = pd.DataFrame(data, columns=['label', 'text'])df.to_csv("train.csv", index=False) #создаем файл csv с более небольшим набором данных!aws s3 cp "train.csv" {default_s3_bucket}

Затем мы можем преобразовать этот блокнот в NotebookJobStep с помощью следующего кода в нашем основном блокноте:

# выдаем S3 Bucket для сохранения артефактовnb_job_params = {"default_s3_bucket": notebook_artifacts}preprocess_nb_step = NotebookJobStep(name=preprocess_step_name,description=preprocess_description,notebook_job_name=preprocess_job_name,image_uri=image_uri,kernel_name=kernel_name,display_name=display_name,role=role,input_notebook=preprocess_notebook,instance_type="ml.m5.4xlarge",parameters=nb_job_params,)

Теперь, когда у нас есть образец файла CSV, мы можем начать обучать нашу модель в учебнике по обучению. Наш учебник по обучению принимает тот же параметр с S3-ведром и загружает обучающий набор данных из этого местоположения. Затем мы выполняем согласование, используя объект тренера Transformers с помощью следующего фрагмента кода:

from transformers import TrainingArguments, Trainertraining_args = TrainingArguments(output_dir="test_trainer", evaluation_strategy="epoch")trainer = Trainer(    model=model,    args=training_args,    train_dataset=small_train_dataset,    eval_dataset=small_eval_dataset,    compute_metrics=compute_metrics,)trainer.train()

После согласования мы хотим выполнить некоторое пакетное вычисление, чтобы увидеть, как модель работает. Это делается с помощью отдельного блокнота (prepare-test-set.ipynb) в том же локальном пути, который создает тестовый набор данных для выполнения внедрения с использованием нашей обученной модели. Мы можем выполнить дополнительный блокнот в нашем блокноте по обучению с помощью следующей магической ячейки:

%run 'prepare-test-set.ipynb'

Мы определяем эту дополнительную зависимость блокнота в параметре AdditionalDependencies в нашем втором шаге блокнота:

train_nb_step = NotebookJobStep(name=training_step_name,description=training_description,notebook_job_name=training_job_name,input_notebook=training_notebook,additional_dependencies=[test_data_prep_notebook],image_uri=image_uri,kernel_name=kernel_name,display_name=display_name,instance_type="ml.m5.12xlarge",role=role,parameters=nb_job_params,)

Нам также необходимо указать, что шаг работы с учебником по обучению (Шаг 2) зависит от шага работы с предварительной обработкой учебника (Шаг 1), используя вызов API add_depends_on следующим образом:

train_nb_step.add_depends_on([preprocess_nb_step])

На последнем шаге мы запускаем модель BERT на SageMaker Batch Transform, а также настраиваем захват и контроль качества с помощью SageMaker Model Monitor. Обратите внимание, что это отличается от использования встроенных шагов Transform или Capture через Pipelines. Наш блокнот для этого шага будет выполнять те же самые API, но будет отслеживаться как шаг работы с учебником. Этот шаг зависит от предварительно определенного шага обучения, поэтому мы также фиксируем это с помощью флага depends_on.

batch_monitor_step = NotebookJobStep(name=batch_monitor_step_name,description=batch_monitor_description,notebook_job_name=batch_monitor_job_name,input_notebook=batch_monitor_notebook,image_uri=image_uri,kernel_name=kernel_name,display_name=display_name,instance_type="ml.m5.12xlarge",role=role,parameters=nb_job_params,)batch_monitor_step.add_depends_on([train_nb_step])

После того, как различные шаги нашего рабочего процесса определены, мы можем создать и запустить конвейер end-to-end:

# создать конвейлер pipeline = Pipeline(name=pipeline_name,steps=[preprocess_nb_step, train_nb_step, batch_monitor_step],)# выполнить конвейлерpipeline.create(session.get_execution_role())execution = pipeline.start(parameters={})execution.wait(delay=30, max_attempts=60)execution_steps = execution.list_steps()print(execution_steps)

Отслеживание выполнения конвейеров

Вы можете отслеживать и контролировать выполнение шагов блокнота с помощью графика DAG SageMaker Pipelines, как показано на следующем снимке экрана.

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

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

Очистка

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

Учетные записи

Вот несколько важных аспектов этой функции:

  • Ограничения SDK – Шаг задания блокнота может быть создан только с помощью SageMaker Python SDK.
  • Ограничения образа – Шаг задания блокнота поддерживает следующие образы:

Заключение

С запуском этой функции сотрудники по работе с данными теперь могут программно запускать свои блокноты с помощью нескольких строк кода, используя SageMaker Python SDK. Кроме того, вы можете создавать сложные многошаговые рабочие процессы, используя свои блокноты, что значительно сокращает время, необходимое для перехода от блокнота к конвейеру CI/CD. После создания конвейера вы можете использовать SageMaker Studio для просмотра и запуска DAG-ов для ваших конвейеров, а также для управления и сравнения выполненных операций. Независимо от того, запланированные ли у вас рабочие процессы ML end-to-end или часть из них, мы настоятельно рекомендуем попробовать рабочие процессы, основанные на блокнотах.