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

  • создать собственный контейнер Docker для обучения ЦП и ГП,
  • передать параметры скрипту PyTorch,
  • сохраните обученную модель.

Мой код, как обычно, вы найдете на Github :)

Создание собственного контейнера

SageMaker предоставляет набор встроенных алгоритмов, а также среды для TensorFlow и MXNet… но не для PyTorch. К счастью, у разработчиков есть возможность создавать собственные контейнеры для обучения и прогнозирования.

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

  • Имя сценариев обучения и прогнозирования: по умолчанию для них должно быть установлено соответственно «train» и «serve», они должны быть исполняемыми и иметь без расширения. SageMaker начнет обучение, запустив «docker run your_container train».
  • Расположение гиперпараметров в контейнере: /opt/ml/input/config/hyperparameters.json.
  • Расположение параметров входных данных в контейнере: / opt / ml / input / data.

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

Создание контейнера Docker

Вот файл Docker.

Начнем с образа CUDA 9.0, который также основан на Ubuntu 16.04. В нем есть все библиотеки CUDA, которые нужны PyTorch. Затем мы добавляем Python 3 и пакеты PyTorch.

В отличие от MXNet, PyTorch поставляется в едином пакете, который поддерживает обучение как процессора, так и графического процессора.

Как только это будет сделано, мы очищаем различные кеши, чтобы немного уменьшить размер контейнера. Затем мы копируем скрипт PyTorch в / opt / program с правильным именем («train») и делаем его исполняемым.

Для большей гибкости мы могли бы написать общую программу запуска, которая будет извлекать фактический обучающий сценарий из местоположения S3, переданного как гиперпараметр. Это оставлено в качестве упражнения для читателя;)

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

Это небольшой файл, но, как всегда, важна каждая деталь.

Создание репозитория Docker в Amazon ECR

SageMaker требует, чтобы извлекаемые им контейнеры размещались в Amazon ECR. Давайте создадим репо и войдем в него.

Сборка и продвижение наших контейнеров на ECR

Хорошо, теперь пора создать оба контейнера и отправить их в репозиторий. Мы сделаем это отдельно для версий CPU и GPU. Строго о Docker. Подробную информацию о переменных см. В записной книжке.

Когда мы закончим, все должно выглядеть так, и вы также должны увидеть свой контейнер в ECR.

Часть Docker окончена. Теперь давайте настроим наше учебное задание в SageMaker.

Настройка учебного задания

На самом деле это совсем не впечатляет, и это отличная новость: ничем особо не отличается от обучения по встроенному алгоритму!

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

Затем мы настраиваем задание на обучение следующим образом:

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

В отличие от Keras, PyTorch имеет API-интерфейсы для проверки доступности CUDA и определения количества доступных графических процессоров. Таким образом, нам не нужно передавать эту информацию в гиперпараметре. Обучение работе с несколькими GPU тоже возможно, но требует дополнительной работы: MXNet делает его намного проще.

Это для тренировки. Последняя часть, которую нам не хватает, - это адаптация нашего скрипта PyTorch для SageMaker. Давай перейдем к делу.

Адаптация скрипта PyTorch для SageMaker

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

Передача гиперпараметров и конфигурация входных данных

Как упоминалось ранее, SageMaker копирует гиперпараметры в /opt/ml/input/config/hyperparameters.json. Все, что нам нужно сделать, это прочитать этот файл, извлечь параметры и, при необходимости, установить значения по умолчанию.

Аналогичным образом SageMaker копирует конфигурацию входных данных в / opt / ml / input / data. Мы будем действовать точно так же.

В этом примере мне не нужна эта информация о конфигурации, но вот как бы вы ее прочитали, если бы она была :)

Загрузка набора для обучения и проверки

При обучении в файловом режиме (как в данном случае) SageMaker автоматически копирует набор данных в / opt / ml / input / ‹channel_name›: здесь мы определили Каналы обучения и проверки, поэтому нам придется:

  • читать файлы MNIST из соответствующих каталогов,
  • построить объекты DataSet для обучающего и проверочного набора,
  • загрузить их с помощью объекта DataLoader.

Сохранение модели

Последнее, что нам нужно сделать после завершения обучения, - это сохранить модель в / opt / ml / model:. SageMaker захватит все артефакты, присутствующие в этом каталоге, построит файл с именем model.tar.gz и скопируйте его в корзину S3, используемую учебным заданием.

Вот и все. Как видите, все дело в взаимодействии вашего скрипта с вводом и выводом SageMaker. Основная часть вашего кода PyTorch не требует каких-либо изменений.

Запуск скрипта

Хорошо, давайте запустим это на экземпляре p3.2xlarge.

Давайте проверим сегмент S3.

$ aws s3 ls $BUCKET/pytorch/output/pytorch-mnist-cnn-2018-06-02-08-16-11-355/output/
2018-06-02 08:20:28      86507 model.tar.gz
$ aws s3 cp $BUCKET/pytorch/output/pytorch-mnist-cnn-2018-06-02-08-16-11-355/output/ .
$ tar tvfz model.tar.gz
-rw-r--r-- 0/0   99436 2018-06-02 08:20 mnist-cnn-10.pt

Довольно круто, правда? Теперь мы можем использовать эту модель где угодно.

На сегодня все. Еще один (надеюсь) хороший пример использования SageMaker для обучения пользовательских заданий в полностью управляемой инфраструктуре!

С удовольствием отвечу на вопросы здесь или в Твиттере. Чтобы узнать больше, посетите мой YouTube канал.

Очевидный выбор;)