Как обсуждалось ранее, 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 канал.
Время сжигать ... несколько тактов :)