Как обсуждалось ранее, Apache MXNet теперь доступен как серверная часть для Keras 2, также известного как Keras-MXNet.

В этом посте вы узнаете, как обучить рабочие места Keras-MXNet на Amazon SageMaker. Я покажу вам, как:

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

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

Настройка Keras для MXNet

Все, что требуется, - это действительно установить backend на mxnet в .keras / keras.json, но установить image_data_format 'на' channels_first 'ускорит обучение MXNet.

При работе с данными изображения форма ввода может быть либо «channels_first», то есть (количество каналов, высота, ширина), либо «channels_last», то есть (высота, ширина, количество каналов). Для MNIST это будет либо (1, 28, 28), либо (28, 28, 1): один канал (черно-белые изображения), 28 пикселей на 28 пикселей. Для ImageNet это будет (3, 224, 224) или (224, 224, 3): три канала (красный, зеленый и синий), 224 на 224 пикселя.

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

Создание нестандартных контейнеров

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

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

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

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

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

Вот файл Docker.

Мы начинаем с образа Ubuntu 16.04 и устанавливаем:

  • Python 3, а также собственные зависимости для MXNet.
  • новейшие и лучшие пакеты MXNet и Keras-MXNet.

Вам не нужно устанавливать предварительные версии пакетов. Я просто люблю жить опасно и добавлять изюминку в свои тихие будни: *)

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

  • сценарий Keras в / opt / program с правильным именем («train»), и мы делаем его исполняемым.

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

  • файл конфигурации Keras в /root/.keras/keras.json.

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

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

Создание контейнера Docker на базе графического процессора

Теперь давайте создадим его аналог на GPU. Он отличается всего двумя способами:

  • мы начнем с образа CUDA 9.0, который также основан на Ubuntu 16.04. У этого есть все библиотеки CUDA, которые нужны MXNet (в отличие от меньшей версии 9.0, не пытайтесь ее пробовать).
  • мы устанавливаем пакет MXNet с поддержкой CUDA 9.0.

В остальном все как раньше.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Настройка обучения на нескольких GPU

Как объяснялось в предыдущем посте, Keras-MXNet позволяет очень легко настроить обучение с использованием нескольких графических процессоров. В зависимости от гиперпараметра gpu_count нам просто нужно обернуть нашу модель специальным API Keras перед ее компиляцией:

Разве жизнь не велика?

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

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

Фактически, мы собираемся сохранить обученную модель в двух разных форматах: в формате Keras (то есть в файле HDF5) и в собственном формате MXNet (то есть в файле JSON и файл. params). Это позволит нам использовать его с обеими библиотеками!

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

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

Хорошо, запустим версию для GPU! Мы будем обучаться на 2 графических процессорах, размещенных в экземпляре p3.8xlarge.

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

$ aws s3 ls $BUCKET/keras-mxnet-gpu/output/keras-mxnet-mnist-cnn-2018-05-30-17-39-50-724/output/
2018-05-30 17:43:34    8916913 model.tar.gz
$ aws s3 cp $BUCKET/keras-mxnet-gpu/output/keras-mxnet-mnist-cnn-2018-05-30-17-39-50-724/output/model.tar.gz .
$ tar tvfz model.tar.gz
-rw-r--r-- 0/0   4822688 2018-05-30 17:43 mnist-cnn-10.hd5
-rw-r--r-- 0/0   4800092 2018-05-30 17:43 mnist-cnn-10-0000.params
-rw-r--r-- 0/0      4817 2018-05-30 17:43 mnist-cnn-10-symbol.json

Wunderbar, как говорят на другом берегу Рейна;) Теперь мы можем использовать эти модели где угодно.

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

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

Время сжигать ... несколько тактов :)