Обзор

AWS недавно объявила о выпуске бэкэнда Apache MXNet для Keras 2, который может дать вам до 3-х кратное увеличение скорости по сравнению с бэкэндом по умолчанию с несколькими GPU. Он демонстрирует улучшенную производительность как для обучения, так и для вывода. В этом выпуске вы теперь можете экспортировать обученную модель Keras (с бэкэндом MXNet) как родную модель MXNet, без зависимости от привязки к конкретному языку. Эта новая возможность экспорта позволяет использовать различные инструменты, являющиеся частью экосистемы MXNet.

В этом сообщении блога мы продемонстрируем использование моделей Keras-MXNet с Сервером моделей MXNet. Мы обучим модель обнаружению улыбок на изображениях, а затем разместим ее для онлайн-вывода через веб-API с помощью MXNet Model Server. MXNet Model Server - это инструмент для обслуживания моделей глубокого обучения, который поддерживает модели MXNet и Open Neural Network Exchange (ONNX) и обрабатывает различные аспекты обслуживания моделей в производственной среде, включая конечные точки HTTP, масштабируемость, метрики в реальном времени и многое другое. .

Часть 1 - Обучение модели с помощью Keras-MXNet

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

Сначала мы настраиваем среду, устанавливая необходимые пакеты. Если вы используете компьютер на базе ЦП:

pip install mxnet
pip install keras-mxnet

Для машин на базе GPU с установленным cuda 9.0 запустите «pip install mxnet-cu90»

Примечание. Подробные инструкции по установке Keras-MXNet можно найти здесь. Машины с графическим процессором (например, типы инстансов AWS P или G) обеспечивают лучшую производительность обучения. Этого можно добиться, запустив AMI AWS Deep Learning.

Затем мы создали форк репозитория SmileCNN, изменили записные книжки и преобразовали их в файлы python, чтобы они соответствовали нашему существующему варианту использования для вывода с использованием MXNet Model Server. Доступ к измененным файлам можно получить, клонировав следующее:

git clone https://github.com/kalyc/SmileCNN
cd SmileCNN

Этот репозиторий содержит три файла python - подготовка набора данных, обучение и оценка.

Сначала мы устанавливаем необходимые зависимости для этого пакета, используя:

sudo python setup.py install

Затем мы подготавливаем обучающие данные, запустив файл подготовки набора данных.

python datasetprep.py

При запуске этого файла загружается набор обучающих данных. Набор данных - это почти 40 МБ примеров неулыбающихся и улыбающихся лиц. В наборе данных есть папка для каждого из положительных и отрицательных обучающих изображений. Этот сценарий берет эти изображения и изменяет их размер с 64 x 64 до 32 x 32 пикселей. Затем он преобразует их в массивы numpy и обновляет их формат для использования с Keras-MXNet.

Когда данные готовы к использованию, мы обучаем модель с помощью обучающего файла. Модель сохранения в Keras-MXNet в настоящее время поддерживается только для формата данных channels_first, который, как известно, имеет лучшую производительность согласно Руководству по производительности Keras-MXNet. Необходимо обновить конфигурацию Keras, чтобы использовать формат данных channels_first image :

К файлу конфигурации Keras можно получить доступ по адресу $ HOME / .keras / keras.json.

{
 “backend”: “mxnet”,
 “image_data_format”: “channels_first”
}

Затем мы используем функцию to_channels_first () для преобразования входных данных в формат channels_first в обучающем скрипте в строке 24.

import keras as k
X = k.utils.to_channels_first(X)

Модифицируем исходный сценарий обучения для сохранения модели и добавляем строку 64:

# Save the trained Keras Model as MXNet Model
keras.models.save_mxnet_model(model=model, prefix='smileCNN_model')

После обновления конфигурации запускаем обучающий скрипт.

python train.py

Тренировочная сеть построена на примере mnist_cnn. Обучение этой модели может занять разное время в зависимости от конфигурации вашего оборудования. В этом случае мы обучили модель для 100 эпох на p2.16xlarge на Base Deep Learning AMI. Прошло около 3 минут. Экземпляр P поставляется с графическим процессором, что сокращает время обучения. На оборудовании на базе ЦП обучение может занять намного больше времени.

Test accuracy: 0.9638663504942575

После завершения обучения функция save_mxnet_model () возвращает следующий результат:

MXNet Backend: Successfully exported the model as MXNet model!
MXNet symbol file -  smileCNN_model-symbol.json 
MXNet params file -  smileCNN_model-0000.params
Model input data_names and data_shapes are:
data_names :  ['/conv2d_1_input1']
data_shapes :  [DataDesc[/conv2d_1_input1,(4L, 1L, 32L, 32L),float32,NCHW]]

Примечание. В приведенных выше data_shapes первое измерение представляет batch_size, используемый для обучения модели. Вы можете изменить batch_size для привязки модуля на основе вашего вывода batch_size.

Функция save_mxnet_model () создает файлы smileCNN_model-symbol и smileCNN_model-0000.params после успешного сохранения модели. Эти файлы определяют структуру сети и соответствующие веса. По сути, они определяют обученную модель MXNet. Входной символ - / conv2d_1_input1, формы (4L, 1, 32, 32).

Файлы smileCNN_model-symbol.json и smileCNN_model-0000.params создаются в корне каталога.

Мы можем проверить точность модели с помощью оценочного скрипта.

python evaluation.py

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

     ('non-smiling', '------------------------###-', 'smiling')

Приведенные выше результаты ясно показывают, что изображение классифицировано правильно. Сценарий оценки использует модель, сохраненную в Keras-MXNet, и загружает ее для использования в прогнозировании.

Часть 2 - Вывод с сервером модели MXNet

Затем давайте посмотрим, как мы можем использовать MXNet Model Server (MMS) для обслуживания этой модели.

Следуя руководству по быстрому запуску с MMS, мы устанавливаем MXNet Model Server на наших машинах.

В Ubuntu запустите:

sudo apt-get install protobuf-compiler libprotoc-dev
pip install mxnet-model-server

На Mac запустить:

conda install -c conda-forge protobuf
pip install mxnet-model-server

Мы создали каталог архива модели с именем keras-mms в репозитории SmileCNN . Мы перемещаем файлы символов и параметров сохраненной обученной модели в каталог keras-mms, который будет использоваться для вывода модели на сервере MXNet Model Server.

cp smileCNN_model-* ./keras-mms/
cd keras-mms/

Примечание. В следующем разделе рассматривается процесс создания файлов, которые уже существуют в каталоге keras-mms.

Каталог архива модели (keras-mms) содержит следующие файлы:

- signature.json
- synset.txt
- smileCNN_model-symbol.json
- smileCNN_model-0000.params
- custom_service.py

Чтобы сообщить MMS, какой входной символ и какую форму использовать для вывода, мы используем вывод функции save_mxnet_model () и настраиваем файл signature.json в том же каталог следующим образом:

Подпись указывает, что вход, ожидаемый для вывода, является изображением в формате JPEG. Тип вывода - JSON. Форма выходных данных варьируется от 0 до 1, поскольку модель предсказывает только 2 класса: улыбающийся и неулыбчивый.

Мы добавляем необходимый файл synset.txt в список меток - по одной метке на строку, как указано в README экспорта MXNet-Model Server. Этот файл зависит от набора данных и содержит список классов, которые модель может предсказать.

В примере с обнаружением улыбки метки класса:

non-smiling
smiling

Затем мы пишем файл custom_service.py, который определяет пользовательский вывод предварительной обработки и постобработки.

Затем мы генерируем файл MMS .model, используя файлы в каталоге keras-mms с помощью следующей команды:

mxnet-model-export --model-name smileCNN --model-path . --service-file-path custom_service.py

Будет создан файл smileCNN.model. Проще говоря, этот файл является артефактом, который содержит все зависимости, необходимые для запуска нашей модели как веб-сервиса с MMS.

Наконец, мы запускаем эту команду, чтобы запустить сервер:

mxnet-model-server --models smileCNN=smileCNN.model

Модельный сервер установлен и готов к работе!

Пора опробовать модель!

Примечание. Все изображения ниже были увеличены для наглядности.

curl -X POST http://127.0.0.1:8080/smileCNN/predict -F "/[email protected]"

Результирующий прогноз:

{
    "prediction": [
        [
            {
                "class": "smiling",
                "probability": 1.0
            },
            {
                "class": "non-smiling",
                "probability": 0.0
            }
        ]
    ]
}

И вуаля! Вот как мы обучаем модель с помощью Keras с бэкэндом MXNet и выполняем логический вывод через MXNet Model Server.

Предполагаемые вероятности модели могут казаться искаженными, поскольку сервер MXNet Model Server округляет их в большую сторону.

Для дальнейшей оценки модели мы протестируем ее на другом примере.

curl -X POST http://127.0.0.1:8080/smileCNN/predict -F "/[email protected]"

Результирующий прогноз

{
    "prediction": [
        [
            {
                "class": "non-smiling",
                "probability": 1.0
            },
            {
                "class": "smiling",
                "probability": 0.0
            }
        ]
    ]
}

Мы видим, что прогнозы, сделанные этой простой моделью CNN, уже довольно хороши!

Это игрушечная модель, но у нее могут быть реальные приложения. Например, чтобы убедиться, что ваши коллеги всегда улыбаются, когда входят в офис, вы можете добавить веб-камеру над входной дверью офиса и потребовать улыбки, чтобы получить доступ к зданию! :)

Подробнее
Последняя версия Keras-MXNet позволяет пользователям обучать крупномасштабные модели с более высокой скоростью и экспортировать обученную модель в собственный формат MXNet, что позволяет делать выводы на нескольких платформах, включая MXNet-Модель-Сервер. Чтобы узнать больше о Keras-MXNet - обязательно следите за репозиторием кода Keras-MXNet. Более подробную информацию о MXNet Model Server можно найти в Репозитории кода MXNet Model Server. Приветствуются комментарии и отзывы сообщества!

Если вам понравилось то, что вы читаете - следите за каналом Apache MXNet на Medium, чтобы быть в курсе последних событий экосистемы MXNet. Хотите вместо этого сделать вывод в Spark с помощью Scala? Прочтите в нашем блоге обучение с Keras и использование API MXNet Scala для вывода!

Цитаты

  1. SmileCNN: «Кайл Макдональд, 2016».
  2. SMILEsmileD: «Хорни, октябрь 2010 г.»