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

В Часть-1 и Часть-2 мы показали, как можно легко обучить свою модель на Amazon SageMaker, а также предоставить свои собственные данные и конфигурации. Хотя Amazon SageMaker предоставляет контейнеры для большинства популярных платформ глубокого обучения, таких как Tensorflow, PyTorch, MxNet, HuggingFace, XGBoost и т. д., могут быть случаи, когда вы захотите использовать Bring Your Own Container (BYOC) для обучения своей модели.

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

  • Когда использовать BYOC, а когда вам это не нужно.
  • Должны ли вы обернуть обучающий код внутри контейнера?
  • Как использовать BYOC в SageMaker
  • Что меняется, а что нет при использовании BYOC (по сравнению с использованием управляемого контейнера SageMaker)

ПРИМЕЧАНИЕ. Этот блог посвящен только обучению, но вы также можете использовать BYOC для обработки данных и логических выводов.

Когда использовать BYOC:

  • Если контейнеры управляемой платформы SageMaker не являются теми, которые вы хотите использовать.
  • Если контейнеры, предоставленные SageMaker, содержат одну или несколько зависимостей, которые вам не нужны в вашей среде обучения/логического вывода. Вы можете проверить Dockerfile для всех контейнеров, управляемых SageMaker, здесь.
  • У вас есть нормативные требования и требования соответствия, чтобы использовать только те контейнеры, которые вы обслуживаете.
  • Вы предоставляете множество зависимостей (через requirement.txt) для контейнера, предоставленного SageMaker, и эта установка занимает много времени при выполнении задания обучения.
  • Ваша среда не требует подключения к Интернету для загрузки пакетов.
  • Вам нужны надежные гарантии воспроизводимости используемых контейнеров.

Когда вам действительно не нужен BYOC:

  • Контейнеры управляемой среды SageMaker (PyTorch, Tensorflow и т. д.) и их версии соответствуют вашим требованиям. Вы можете просмотреть список управляемых контейнеров SageMaker здесь.
  • Вы хотите включить несколько сторонних библиотек. В этом случае просто поместите файл requirements.txt в локальный каталог и укажите ссылку на него, используя параметр source_dir в оценщике SageMaker. SageMaker установит эти библиотеки во время выполнения. Предупреждение. Этот метод устанавливает файл requirements.txt в начале задания обучения. Если процесс установки слишком долгий, это может снизить вашу производительность.
  • Вы хотите добавить дополнительные скрипты (помимо вашего основного тренировочного файла). Как и в предыдущем пункте, вы можете поместить их в локальный каталог и ссылаться на них, используя параметр source_dir или параметр dependencies в оценщике SageMaker.

Включаете ли вы обучающий код внутрь контейнера?

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

После этого давайте продолжим рассказ о том, как использовать BYOC в SageMaker.

Как использовать BYOC в SageMaker

В этом разделе мы увидим, как создать собственный контейнер PyTorch и использовать его для обучения модели. Используя BYOC, вам вообще не нужно будет вносить какие-либо изменения в код обучения. Вот шаги, которые мы будем выполнять:

  1. Сборка образа Docker — та же версия (1.12), что и в предыдущем примере.
  2. Отправить образ Docker в частный репозиторий Amazon ECR
  3. Используйте собственное изображение для обучения — вместо управляемого SageMaker контейнера PyTorch. Кроме того, здесь вы предоставляете код обучения, внешний по отношению к контейнеру. Подробнее об этом позже.

1. Создайте образ докера

Примечание. Здесь мы не будем рассматривать основы Docker. Но если вы не знакомы с докером, вы можете проверить следующий учебник Docker 101 Tutorial.

1.1 Создайте Dockerfile

Есть два способа адаптировать ваш пользовательский контейнер для работы в SageMaker.

  1. Использование Обучающего инструментария, предоставленного SageMaker Pytorch — это предпочтительный подход, поскольку набор инструментов установит для вас следующее:
    — Места (внутри контейнера) для хранения кода, модели и другие ресурсы.
    — точка входа, содержащая код для запуска при запуске контейнера. Теперь вы можете либо скопировать код обучения в образ докера при создании самого образа, либо предоставить сценарий обучения во время выполнения извне контейнера.
    — Другие переменные среды и конфигурация, которые требуются SageMaker, используют докер для обучение.
  2. Без предоставленного SageMaker набора инструментов для обучения Pytorch — в этом случае вам необходимо убедиться, что докер придерживается рекомендаций этой документации.

Здесь мы собираемся использовать (и рекомендовать) первый подход.

Ниже приведен пример Dockerfile:

from pytorch/pytorch:1.12.0-cuda11.3-cudnn8-runtime

RUN apt-get update && apt-get install gcc -y

RUN pip install sagemaker-pytorch-training

Мы выбрали базовый образ из Официального репозитория PyTorch с версией 1.12 и установили gcc, так как эта зависимость нужна sagemaker-pytorch-training, и, наконец, мы устанавливаем sagemaker-pytorch-training.

1.2 Создайте образ

Для создания образа вы можете выбрать либо свой локальный компьютер, либо экземпляр/среду в облаке, где установлен Docker. Просто перейдите в каталог, содержащий файл Dockerfile (созданный в версии 1.1), и запустите в своем терминале:

docker build -t {Your_AWS_Account_ID}.dkr.ecr.
{Your_AWS_Region}.amazonaws.com/{Custom_Image_Name}:{tag} .

2. Отправьте образ докера в Amazon ECR.

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

2.1 Сначала выполните аутентификацию в ECR

aws ecr get-login-password -region {Your_AWS_Region} | docker login -username AWS -password-stdin {Your_AWS_Account_ID}.dkr.ecr.{Your_AWS_Account_ID}.amazonaws.com

2.2 Создайте репозиторий ECR

aws ecr create-repository -repository-name "custom-pytorch-1-12"

2.3 И отправьте образ Docker в ECR.

docker push {Your_AWS_Account_ID}.dkr.ecr.{Your_AWS_Region}.amazonaws.com/{Custom_Image_Name}:{tag}

Вот и все ! Теперь мы готовы использовать этот образ для обучения работе с SageMaker. Подробные инструкции по отправке образа в ECR см. в разделе Отправка образа Docker.

3. Используйте собственное изображение для обучения

Чтобы использовать это изображение вместо предоставленного SageMaker изображения PyTorch, мы используем тот же PyTorch Estimator, который использовался в предыдущих сообщениях в блоге. Единственный новый аргумент здесь — image_uri. Кроме этого, все остальные аргументы одинаковы

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

Изменения кода вызова показаны ниже:

#Create the estimator object for PyTorch

from sagemaker.pytorch.estimator import PyTorch # import PyTorch Estimator class 

estimator = PyTorch(
    image_uri=custom_image_uri, #our custom pytorch image URI
    entry_point = "train.py", # training script
    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 it's not needed
    role = execution_role, #Execution role used by training job
    hyperparameters={'batch_size': 64}
)



inputs = {"train":train_input, "test": test_input}

#Start the training in the ephemeral remote compute 
estimator.fit(inputs, wait=True)

Что изменилось, а что нет:

Итак, давайте подытожим, чем этот подход отличается от того, что было показано в Часть-1 и Часть-2.

Что изменилось

  • Контейнер выполнения, в котором выполняется ваш обучающий скрипт. Теперь это ваш собственный контейнер вместо управляемого SageMaker. Это также означает, что вы несете ответственность за его исправление и поддержку. Таким образом, общая стоимость владения при управлении контейнером и его эксплуатации выше.
  • Мы предоставили наш пользовательский URI изображения через аргумент image_uri в оценщике PyTorch.

Что не изменилось

  • SageMaker управляет эфемерным обучающим вычислительным кластером. Вращение и выключение после завершения обучения.
  • Рабочие каталоги контейнеров, пути к данным, коду и модели, зарезервированные SageMaker. Благодаря SageMaker предоставил обучающий инструментарий Pytorch. Таким образом, SageMaker запускает ваш контейнер так же, как и свои управляемые контейнеры. Подробнее об этом можно прочитать в разделе Использование Наборов инструментов для обучения и вывода SageMaker.
  • Тренировочный код. Ваш код не зависит от того, использовали ли вы управляемый контейнер или BYOC.
  • Все аргументы, предоставляемые обучающему коду, работают одинаково, опять же заслуга SageMaker предоставила обучающий инструментарий Pytorch.
  • Вы предоставили сценарий обучения, внешний по отношению к контейнеру, что является огромным преимуществом для итеративной разработки. Вы по-прежнему можете обернуть сценарий обучения внутри своего контейнера, но тогда для каждого изменения кода вам придется заново создавать контейнер, что отнимает много времени. Помните, Время - деньги!! :)

Заключение

В этом блоге вы узнали, как добавить в SageMaker собственный образ докера и использовать его для обучения. Ключевым моментом этого подхода было то, что вы могли предоставить код обучения, внешний по отношению к контейнеру, во время выполнения. Весь справочный код этого блога доступен в Github Repository. Для дальнейшего чтения, пожалуйста, ознакомьтесь с разделом Использование контейнеров Docker с SageMaker.

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