[Перевод] Deep Learning: Сравнение фреймворков для символьного глубокого обучения

Цикл статей «Deep Learning»
1. Сравнение фреймворков для символьного глубокого обучения.
2. Transfer learning и тонкая настройка глубоких сверточных нейронных сетей.
3. Cочетание глубокой сверточной нейронной сети с рекуррентной нейронной сетью.
Примечание: далее повествование будет вестись от имени автора.
Символьные фреймворки
Фреймворки для символьных вычислений (MXNET, TensorFlow, Theano) характеризуются символьными графами векторных операций, таких как матричное сложение/умножение или свертка. Слой является просто набором таких операций. Благодаря разделению на небольшие составные компоненты (операции) пользователи могут создавать новые сложные типы слоев без использования низкоуровневых языков (как в Caffe).
У меня есть опыт использования различных фреймворков для символьных вычислений. Как оказалось, в устройстве и текущей реализации у них у всех есть как преимущества, так и недостатки, но ни один из них не отвечает в полной мере всем требованиям. Однако в данный момент я отдаю предпочтение Theano.
Далее мы сравним перечисленные фреймворки для символьных вычислений.
| Характеристика | Theano | TensorFlow | MXNET |
|---|---|---|---|
| Программное обеспечение | Theano | TensorFlow | MXNET |
| Автор | Монреальский университет | Команда Google Brain | Сообщество Distributed (Deep) Machine Learning Community |
| Лицензия на программное обеспечение | Лицензия BSD | Apache 2.0 | Apache 2.0 |
| Открытый исходный код | Да | Да | Да |
| Платформа | Кросс-платформенное решение | Linux, Mac OS X, планируется поддержка Windows | Ubuntu, OS X, Windows, AWS, Android, iOS, JavaScript |
| Язык программирования | Python | C++, Python | C++, Python, Julia, Matlab, R, Scala |
| Интерфейс | Python | C/C++, Python | C++, Python, Julia, Matlab, JavaScript, R, Scala |
| Поддержка CUDA | Да | Да | Да |
| Автоматическая дифференциация | Да | Да | Да |
| Наличие предварительно обученных моделей | С помощью model zoo в Lasagne | Нет | Да |
| Рекуррентные сети | Да | Да | Да |
| Сверточные сети | Да | Да | Да |
| Ограниченные машины Больцмана/глубокие сети доверия | Да | Да | Да |
Сравнение символьных и несимвольных фреймворков
Несимвольные фреймворки
Преимущества:
- Несимвольные (императивные) фреймворки нейронных сетей, такие как torch и caffe, как правило, имеют очень похожее устройство вычислительной части.
- С точки зрения выразительности императивные фреймворки устроены достаточно неплохо, в них может быть интерфейс на основе графов (например, torch/nngraph).
Недостатки:
- Основным недостатком императивных фреймворков является оптимизация вручную. Например, операции на месте требуется реализовать вручную.
- Большинство императивных фреймворков проигрывают символьным по выразительности.
Символьные фрейморки
Преимущества:
- В символьных фреймворках возможна автоматическая оптимизация на основе графов зависимостей.
- В символьных фреймворках можно получить гораздо больше возможностей многократного использования памяти. Например, это прекрасно реализовано в MXNET.
- Символьные фреймворки могут автоматически вычислять оптимальный график. Подробнее можно узнать здесь.
Недостатки:
- Доступные символьные фреймворки с открытым исходным кодом пока еще недостаточно развиты и уступают императивным по производительности.
Добавление новых операций
Во всех этих фреймворках добавление операций с сохранением приемлемой производительности весьма непросто.
| Theano/MXNET | TensorFlow |
|---|---|
| Можно добавлять операции на Python с поддержкой встроенных операторов C. | Forward на C++, symbolic gradient на Python. |
Многократное использование кода
Для обучения глубоких сетей требуется немало времени. Поэтому Caffe выпустили несколько заранее обученных моделей (model zoo), которые можно было бы использовать в качестве изначальных образцов при передаче обучения или при тонкой настройке глубоких сетей для определенных областей знаний или пользовательских образов.
| Theano | TensorFlow | MXNET |
|---|---|---|
| Lasagne — высокоуровневая платформа на основе Theano. В Lasagne очень просто использовать заранее обученные модели Caffe | Нет поддержки заранее обученных моделей | В MXNET предусмотрен инструмент caffe_converter, предназначенный для преобразования заранее обученных моделей caffe в формат MXNET |
Низкоуровневые операторы Tensor
Достаточно эффективная реализация низкоуровневых операторов: их можно использовать в качестве составных компонентов при создании новых моделей, не затрачивая усилия на написание новых операторов.
| Theano | TensorFlow | MXNET |
|---|---|---|
| Множество простых операций | Вполне хорошо | Очень мало |
Операторы управления потоком
Операторы управления потоком повышают выразительность и универсальность символьной системы.
| Theano | TensorFlow | MXNET |
|---|---|---|
| Поддерживаются | В формате эксперимента | Не поддерживаются |
Высокоуровневая поддержка
| Theano | TensorFlow | MXNET |
|---|---|---|
| «Чистый» символьный вычислительный фреймворк. Можно создавать высокоуровневые платформы в соответствии с требованиями. Среди успешных примеров — Keras, Lasagne, blocks | Неплохое устройство с точки зрения обучения нейтронных сетей, но при этом данный фреймворк не ориентирован исключительно на нейтронные сети, что очень хорошо. Можно использовать коллекции графов, очереди и дополнения образов в качестве составных компонентов для высокоуровневых оболочек | Помимо символьной части, в MXNET также предусмотрены все необходимые компоненты для классификации образов, от загрузки данных до построения моделей с методами для начала обучения. |
Производительность
Измерение производительности Single-GPU
В моих тестах производительность модели LeNet для набора данных MNIST измерена для конфигурации с одним графическим процессором (GPU NVIDIA Quadro K1200).
| Theano | TensorFlow | MXNET |
|---|---|---|
| Отлично | Средне | Превосходно |
Память
Объем памяти GPU ограничен, поэтому использование для больших моделей может быть проблематично.
| Theano | TensorFlow | MXNET |
|---|---|---|
| Отлично | Средне | Превосходно |
Скорость Single-GPU
Theano очень долго компилирует графы, особенно в сложных моделях. TensorFlow еще немного медленнее.
| Theano/MXNET | TensorFlow |
|---|---|
| Сравнимо с CuDNNv4 | Примерно вдвое медленнее |
Поддержка параллельных и распределенных вычислений
| Theano | TensorFlow | MXNET |
|---|---|---|
| Экспериментальная поддержка Multi-GPU | Multi-GPU | Распределенная |
Заключение
Theano (с высокоуровневыми решениями Lasagne и Keras) — это отличный выбор для моделей глубокого обучения. С помощью Lasagne/Keras очень просто создавать новые сети и изменять существующие. Я предпочитаю Python, поэтому выбираю Lasagne/Keras благодаря очень развитому интерфейсу Python. Впрочем, эти решения не поддерживают R. Возможности передачи обучения и тонкой настройки в Lasagne/Keras показывают, что там очень просто модифицировать существующие сети, а также настраивать под предметно-ориентированные пользовательские данные.
После сравнения фреймворков можно сделать вывод, что самым оптимальным решением будет MXNET (более высокая производительность, эффективное использование памяти). Кроме того, в нем отличная поддержка R. Собственно говоря, это единственная платформа, в которой поддерживаются все функции на R. В MXNET передача обучения и тонкая настройка сетей возможны, но выполнять их довольно сложно (по сравнению с Lasagne/Keras). Из-за этого будет сложно не только модифицировать существующие сети обучения, но и настраивать под предметно-ориентированные пользовательские данные.
Если вы увидели неточность перевода, сообщите пожалуйста об этом в личные сообщения.
