Используйте собственные сценарии обучения и автоматически выбирайте лучшую модель с помощью оптимизации гиперпараметров в Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

Успех любого конвейера машинного обучения (ML) зависит не только от качества используемой модели, но и от способности обучать и повторять эту модель. Один из ключевых способов улучшить модель машинного обучения — выбрать лучшие настраиваемые параметры, известные как гиперпараметры. Это известно как оптимизация гиперпараметров (HPO). Однако выполнение этой настройки вручную часто может быть обременительным из-за размера пространства поиска, иногда требующего тысяч итераций обучения.

Этот пост показывает, как Создатель мудреца Амазонки позволяет не только использовать собственный алгоритм модели в режиме сценария, но и использовать встроенный алгоритм HPO. Вы узнаете, как легко вывести выбранную оценочную метрику в Amazon CloudWatch, из которого можно извлечь эту метрику для управления автоматическим алгоритмом HPO. Затем вы можете создать задание настройки HPO, которое управляет несколькими заданиями обучения и связанными вычислительными ресурсами. По завершению вы можете увидеть лучшую учебную работу по метрике оценки.

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

Проходим следующие этапы:

  1. Используйте режим сценария SageMaker, чтобы разместить нашу собственную модель поверх контейнера, управляемого AWS.
  2. Рефакторинг нашего сценария обучения, чтобы распечатать нашу оценочную метрику.
  3. Найдите метрику в журналах CloudWatch.
  4. Извлеките метрику из CloudWatch.
  5. Используйте HPO, чтобы выбрать лучшую модель, настроив эту оценочную метрику.
  6. Контролируйте HPO и найдите лучшую учебную работу.

Предпосылки

Для этого прохождения у вас должны быть следующие предпосылки:

Используйте собственные алгоритмы в контейнере, управляемом AWS

Обратитесь к Создайте собственную модель в режиме сценария Amazon SageMaker для получения более подробной информации о переносе пользовательской модели в SageMaker с помощью контейнера, управляемого AWS.

Мы используем Набор данных MNIST для этого примера. MNIST — широко используемый набор данных для классификации рукописных цифр, состоящий из 70,000 28 помеченных изображений рукописных цифр размером 28×60,000 пикселей в оттенках серого. Набор данных разбит на 10,000 10 обучающих изображений и XNUMX XNUMX тестовых изображений, содержащих XNUMX классов (по одному на каждую цифру).

  1. Откройте экземпляр записной книжки и выполните следующую команду, чтобы загрузить mnist.py файл:
    !wget https://raw.githubusercontent.com/aws/amazon-sagemaker-examples/main/hyperparameter_tuning/pytorch_mnist/mnist.py

    Прежде чем мы получим и сохраним данные, давайте создадим сеанс SageMaker. Мы также должны указать корзину S3 и префикс для использования для обучения и данных модели. Он должен находиться в том же регионе, что и экземпляр записной книжки, обучение и размещение. В следующем коде используется сегмент по умолчанию если он уже существует, или создает новый, если его нет. Мы также должны включить роль IAM ARN, чтобы предоставить доступ к вашим данным для обучения и хостинга. Мы используем get_execution_role() чтобы получить роль IAM, созданную для экземпляра записной книжки.

  2. Создайте сеанс со следующим кодом:
    import sagemaker
    from sagemaker.tuner import (
    IntegerParameter,
    CategoricalParameter,
    ContinuousParameter,
    HyperparameterTuner,
    )
    session = sagemaker.Session()
    bucket = session.default_bucket()
    prefix = "sagemaker/DEMO-custom-hpo"
    role = sagemaker.get_execution_role()

  3. Теперь давайте получим данные, сохраним их в нашей локальной папке /dataи загрузите его на Amazon S3:
    from torchvision.datasets import MNIST
    from torchvision import transforms
    MNIST.mirrors = ["https://sagemaker-sample-files.s3.amazonaws.com/datasets/image/MNIST/"]
    MNIST(
    "data",
    download=True,
    transform=transforms.Compose(
    [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]
    ),
    )
    inputs = session.upload_data(path="data", bucket=bucket, key_prefix=prefix)

    Теперь мы можем создать оценщик для настройки задания обучения PyTorch. Здесь мы не сосредотачиваемся на фактическом обучающем коде (mnist.py) очень подробно. Давайте посмотрим, как мы можем легко вызвать этот сценарий обучения для инициализации задания обучения.

  4. В следующий код мы включаем сценарий точки входа с именем mnist.py, который содержит наш пользовательский обучающий код:
    from sagemaker.pytorch import PyTorch
    estimator = PyTorch(
    entry_point="mnist.py",
    role=role,
    py_version="py3",
    framework_version="1.8.0",
    instance_count=1,
    instance_type="ml.c5.2xlarge",
    hyperparameters={"epochs": 5},
    )

  5. Чтобы убедиться, что это задание обучения настроено правильно, с рабочим кодом обучения, мы можем запустить задание обучения, сопоставив его с данными, которые мы загрузили в Amazon S3. SageMaker обеспечивает доступность наших данных в локальной файловой системе, поэтому наш обучающий скрипт может просто прочитать данные с диска:
    estimator.fit({"training": inputs})

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

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

  • Имя
  • Тип (параметры могут быть целыми, непрерывными или категориальными)
  • Диапазон значений для изучения
  • Тип масштабирования (линейное, логарифмическое, обратное логарифмическое или автоматическое); это позволяет нам контролировать, как будет исследоваться конкретный диапазон параметров

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

Если мы посмотрим на строку 181 в mnist.py, мы увидим, как мы печатаем в регистраторе:

logger.info(
"Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)n".format(
test_loss, correct, len(test_loader.dataset), 100.0 * correct / len(test_loader.dataset)
)

На самом деле, мы можем увидеть этот вывод в журналах только что запущенного задания обучения. Открыв группу журналов /aws/sagemaker/TrainingJobs на консоли CloudWatch у нас должно быть событие журнала, начинающееся с pytorch-training- за которым следует отметка времени и сгенерированное имя.

На следующем снимке экрана показан журнал, который мы ищем.

Давайте теперь приступим к созданию нашей работы по настройке гиперпараметров.

  1. Как уже упоминалось, мы должны сначала определить некоторую информацию о гиперпараметрах под объектом следующим образом:
    hyperparameter_ranges = {
    "lr": ContinuousParameter(0.001, 0.1),
    "batch-size": CategoricalParameter([32, 64, 128, 256, 512]),
    }

    Здесь мы определили два наших гиперпараметра. Скорость обучения (lr) является непрерывным параметром (следовательно, непрерывным значением) в диапазоне от 0.001 до 0.1. Размер партии (batch-size) — это категориальный параметр с предшествующими дискретными значениями.

    Затем мы указываем объективную метрику, которую мы хотели бы настроить, и ее определение. Сюда входит регулярное выражение (регулярное выражение), необходимое для извлечения этой метрики из журналов CloudWatch задания обучения, которое мы видели ранее. Мы также указываем описательное имя средней потери теста и тип цели как Минимизировать, поэтому настройка гиперпараметра стремится минимизировать целевую метрику при поиске наилучшей настройки гиперпараметра.

  2. Укажите метрику с помощью следующего кода:
    metric_definitions = [{"Name": "average test loss", "Regex": "Test set: Average loss: ([0-9.]+)"}]
    objective_metric_name = "average test loss"
    objective_type = "Minimize"

    Теперь мы готовы создать наш HyperparameterTuner объект. В дополнение к названию, типу и определению объективной метрики мы передаем hyperparameter_ranges объект и оценщик, который мы ранее создали. Мы также указываем общее количество заданий, которые мы хотим запустить, а также количество, которое должно выполняться параллельно. Мы выбрали максимальное количество заданий, равное 9, но обычно вы выбираете гораздо большее число (например, 50) для оптимальной производительности.

  3. Создайте HyperparameterTuner объект со следующим кодом:
    tuner = HyperparameterTuner(
    estimator,
    objective_metric_name,
    hyperparameter_ranges,
    metric_definitions,
    max_jobs=9,
    max_parallel_jobs=3,
    objective_type=objective_type,
    )

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

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

Однако вы можете указать другие стратегии поиска. В SageMaker поддерживаются следующие стратегии:

  • Поиск по сетке – Пробует все возможные комбинации из указанного диапазона гиперпараметров.
  • Случайный поиск – Пробует случайные комбинации из указанного диапазона значений. Это не зависит от результатов предыдущих заданий обучения, поэтому вы можете запускать максимальное количество одновременных заданий обучения, не влияя на производительность настройки.
  • Гиперполосный поиск – Использует как промежуточные, так и окончательные результаты обучающих заданий для перераспределения эпох в хорошо используемые конфигурации гиперпараметров и автоматически останавливает неэффективные.

Вы также можете использовать свой собственный алгоритм, как описано в Добавьте свой собственный алгоритм оптимизации гиперпараметров в Amazon SageMaker.

  1. Затем мы запускаем обучение на самом объекте тюнера (не на оценщике), вызывая .fit() и передавая путь S3 к нашему набору данных поезда и теста:
    tuner.fit({"training": inputs})

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

Затем легко просмотреть все отдельные задания по обучению, которые были завершены или выполняются, а также связанное с ними значение объективной метрики. На следующем снимке экрана мы видим, что завершена первая партия обучающих заданий, которая содержит всего три задания в соответствии с указанными нами. max_parallel_jobs значение 3. По завершении мы можем найти наилучшую обучающую задачу — ту, которая минимизирует среднюю потерю теста — на Лучшая учебная работа меню.

Скриншот списка обучающих заданий

Убирать

Чтобы избежать будущих расходов, удалите ресурсы, которые вы инициализировали. Это корзина S3, роль IAM и экземпляр блокнота SageMaker.

Заключение

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

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


Об авторе

Используйте собственные сценарии обучения и автоматически выбирайте лучшую модель с помощью оптимизации гиперпараметров в Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.Сэм Прайс является консультантом по профессиональным услугам, специализирующимся на AI/ML и анализе данных в Amazon Web Services. Он тесно сотрудничает с заказчиками из государственного сектора в области здравоохранения и медико-биологических наук для решения сложных проблем. В свободное от этого время Сэм любит играть на гитаре и в теннис, а также смотреть свои любимые инди-группы.

Отметка времени:

Больше от Машинное обучение AWS