Авторы: Викеш Пандей, Осман Хамзауи

В разделе Переход с локального jupyter на Amazon SageMaker — часть 1 мы рассказали, как взять готовый пример из руководств по PyTorch и запустить его с помощью обучающего API SageMaker. Мы рассмотрели, как мы можем запускать код на эфемерных управляемых обучающих кластерах и как сохранять ваши модели, сохраняя их в S3 после завершения обучения. В этой части мы объясним, как указать ваш сценарий обучения на ваши собственные данные и как добавить свои собственные гиперпараметры и файлы конфигурации.

Мы разделим этот блог на следующие разделы:

  1. Измените местоположение данных обучения на S3 и определите гиперпараметры
  2. Изменения в сценарии обучения
  3. Изменения в обучающем API SageMaker

Предположения

Здесь мы предполагаем, что вы уже прошли часть 1 и настроили SageMaker Studio IDE. Вы выполнили упражнение из части 1 и успешно обучили модель.

С учетом сказанного, давайте двигаться вперед.

1. Измените местоположение данных обучения на S3 и определите гиперпараметры.

В первой части мы использовали PyTorch DataSet API для чтения набора данных, который уже был размещен в PyTorch. Это не относится ни к одному реальному варианту использования.
В вашем проекте у вас будут данные, находящиеся в каком-то озере данных или хранилище данных, или даже на вашем локальном компьютере. Давайте расширим ту же записную книжку и сценарий обучения, которые мы использовали в части 1, и внесем необходимые изменения для чтения данных из удаленного места. SageMaker имеет встроенную интеграцию с Amazon S3, поэтому мы продемонстрируем изменения, предполагая, что ваши данные находятся в S3.

ПРИМЕЧАНИЕ. Если вы запустили блокнот, относящийся к Части 1, данные уже были загружены в вашу среду Studio в папку с именем data. Итак, сейчас мы собираемся сделать следующее:

  1. Загрузите данные из локальной папки в папку S3.
  2. Скажите SageMaker, чтобы он указывал на местоположения S3 для получения данных.
  3. Внесите изменения в скрипт обучения части 1, чтобы указать расположение данных и гиперпараметры через переменные среды SageMaker.
  4. Внесите изменения в метод fit (), чтобы предоставить местоположения обучающих данных из S3.

Шаг 1. Загрузите данные в Amazon S3

Ниже приведен код для загрузки файлов в Amazon S3. Здесь мы используем ведро по умолчанию, предоставленное SageMaker, но вы можете заменить его своим собственным:

from sagemaker.s3 import S3Uploader

#Upload training data
S3Uploader.upload(local_path = "data/FashionMNIST/raw/train-images-idx3-ubyte.gz", 
                  desired_s3_uri = "s3://"+bucket+train_prefix, 
                  kms_key=None, 
                  sagemaker_session=session)
S3Uploader.upload(local_path = "data/FashionMNIST/raw/train-labels-idx1-ubyte.gz", 
                  desired_s3_uri = "s3://"+bucket+train_prefix, 
                  kms_key=None, 
                  sagemaker_session=session)
#Upload test data
S3Uploader.upload(local_path = "data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz", 
                  desired_s3_uri = "s3://"+bucket+test_prefix, 
                  kms_key=None, 
                  sagemaker_session=session)
S3Uploader.upload(local_path = "data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz", 
                  desired_s3_uri = "s3://"+bucket+test_prefix, 
                  kms_key=None, 
                  sagemaker_session=session)

Шаг 2. Укажите местонахождение обучающих данных из S3.

Теперь мы создаем что-то, называемое объектами TrainingInput, которые содержат местоположения S3, где присутствуют фактические данные. Мы создаем уникальный объект для обучения и тестирования данных соответственно. Код выглядит следующим образом:

from sagemaker.inputs import TrainingInput
train_input = TrainingInput(s3_data="s3://"+bucket+train_prefix)
test_input = TrainingInput(s3_data="s3://"+bucket+test_prefix)

Шаг 3: Определите гиперпараметры

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

  1. Параметры, которые вы редко обновляете, но которые все же стоит представить в виде параметров, например имя корзины S3, в которой вы храните свои данные или тип экземпляра, используемый для обучения.
  2. Жестко закодированные значения и параметры, которые вы часто обновляете с каждым новым заданием на обучение, такие как размер пакета, скорость обучения, количество эпох и т. д.

Давайте посмотрим, какие изменения необходимо внести в сценарий обучения.

2. Изменения в сценарии обучения

Нам необходимо внести ряд изменений в сценарий обучения. Изменения можно разделить на две части:

Изменения, связанные с обработкой данных:

  1. Удалите код, загружающий набор данных из PyTorch.
  2. Анализировать значения переменных среды SM_CHANNEL_TRAIN и SM_CHANNEL_TEST в качестве аргументов командной строки. Это переменные, которые содержат данные о поездах и тестах внутри обучающего контейнера.
  3. Добавьте метод для загрузки и анализа набора данных и преобразования его в объекты PyTorch Tensor.
  4. Создайте наш собственный пользовательский класс, наследуемый от класса PyTorch Dataset, чтобы хранить необработанный набор данных и вызовите метод выше, чтобы преобразовать его в PyTorch Tensor.
  5. Используйте пользовательский класс набора данных, созданный выше, для создания загрузчиков данных PyTorch.

Изменения, связанные с гиперпараметрами:

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

Мы можем указать параметры в качестве аргумента командной строки и прочитать их через ArgumentParser вместе с другими переменными среды, поступающими из SageMaker (см. пункт 2 в разделе выше).

Ниже приведен пример, где мы добавляем batch_size в качестве гиперпараметра:

parser = argparse.ArgumentParser()
parser.add_argument("--batch_size", type=str, default=32)
args = parser.parse_args() 
batch_size = int(args.batch_size)

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

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

ПРИМЕЧАНИЕ. Единственное изменение, представленное SageMaker, находится в пункте 2, остальные изменения не зависят от SageMaker и потребуются, если вы хотите, чтобы сценарий обучения указывал на ваш собственный набор данных, а не на предварительно подготовленные, предоставленные PyTorch. Добавление синтаксического анализатора аргументов также является хорошей практикой независимо от SageMaker, поскольку это делает ваши сценарии более модульными и простыми в выполнении.

3. Изменения в обучающем API SageMaker

Последним шагом будет внесение изменений в код вызова для API обучения, чтобы предоставить местоположения S3 и гиперпараметры. Следовательно, мы создаем словарь для inputs, который содержит объекты, указывающие на местоположение S3 набора данных. А затем мы просто передаем словарь методу fit(). Для гиперпараметров давайте добавим Итак, давайте передадим объект json, содержащий наши гиперпараметры.

Взгляните на код ниже:

#Create the estimator object for PyTorch
estimator = PyTorch(
    entry_point = "train.py", # training script
    framework_version = "1.12", #PyTorch Framework version, keep it same as used in default example
    py_version = "py38", # Compatible Python version to use
    instance_count = 1, #number of EC2 instances needed for training
    instance_type = "ml.c5.xlarge", #Type of EC2 instance/s needed for training
    disable_profiler = True, #Disable profiler, as not needed
    role = execution_role, #Execution role used by training job
    hyperparameters={'batch_size': 64} #Hyperparameters  
)

inputs = {"train":train_input, "test": test_input}
#Start the training
estimator.fit(inputs)

Вот и все. Теперь вы можете проводить обучение в SageMaker, используя данные из местоположения S3 и контролируя значения гиперпараметров во время выполнения. Ознакомьтесь с полным кодом блога в этом репозитории github.

Заключение

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

Как и было обещано в Часть-1, мы рассмотрели все, кроме того, как перенести свой собственный учебный контейнер в SageMaker и использовать его вместо предоставленного SageMaker контейнера PyTorch. И это то, что мы рассмотрим в следующем блоге.

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

Твиттер обрабатывает: @vikep0, @OHamzaoui1