Для получения дополнительных галантерейных товаров, пожалуйста, обратите внимание на публичный аккаунт WeChat «AI Frontline» (ID: ai-front)
https://github.com/ilkarman/DeepLearningFrameworks
Мы думаем о фреймворках глубокого обучения как о языках: конечно, многие люди используют английский, но каждый язык имеет свою полезность. Мы создаем общий код для нескольких разных фреймворков и используем эти языки во многих разных фреймворках. Наша идея состоит в том, чтобы создать структуру глубокого обучения, аналогичную программе для изучения иностранных языков Rosetta Stone, позволяющую людям свободно использовать различные среды. Проблема возникает, когда публикуется статья о совершенно новом коде или языке фреймворка, чем писать модель с нуля в любимом фреймворке, проще использовать «чужой» язык.
Мы хотели бы поблагодарить команды CNTK, Pytorch, Chainer, Caffe2 и Knet, а также всех наших друзей из сообщества открытого исходного кода за их вклад в этот репозиторий за последние несколько месяцев.
Таким образом, наша цель при публикации этого репозитория состоит в том, чтобы создать:
«Розеттский камень» фреймворков глубокого обучения, который позволяет специалистам по данным легко применять свой опыт в различных фреймворках.
Набор кода графического процессора, оптимизированный с использованием новейших современных API.
Общая настройка для сравнения разных графических процессоров (вероятно, версия CUDA и точность).
Общая настройка для сравнения разных языков (Python, Julia, R).
Возможность проверить ожидаемую производительность используемого вами фреймворка.
Сотрудничество между различными сообществами открытого исходного кода.
В следующих разделах мы рассмотрим время обучения для каждой модели CNN, извлечение признаков для предварительно обученной модели ResNet50 и результаты теста времени обучения для каждой модели RNN. Наши эксперименты проводились на виртуальных машинах глубокого обучения Azure с использованием K80 и новее P100.
Входными данными для модели является стандартный набор данных CIFAR-10, состоящий из 50 000 обучающих изображений и 10 000 тестовых изображений, равномерно разделенных на 10 классов. Каждое изображение 32x32 задается как тензор (3,32,32) с масштабированием интенсивности пикселей от 0-255 до 0-1.
Caffe2: https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Caffe2_Inference.ipynb
Цепочка: https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Chainer_Inference.ipynb
CNTK: https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/CNTK_Inference.ipynb
Керас (CNTK): https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Keras_CNTK_Inference.ipynb
Керас (TF): https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Keras_TF_Inference.ipynb
Tensorflow: https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Tensorflow_Inference.ipynb
MXNet: https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/MXNet_Inference.ipynb
PyTorch: https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/PyTorch_Inference.ipynb
Юлия – Кнет: https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Knet_Inference.ipynb
Загрузите и усеките предварительно обученную модель ResNet50 после того, как среднее объединение заканчивается в (7,7), выводя размерный вектор 2048D. Здесь можно вставить слой softmax или другие классификаторы (например, усиленные деревья) для передачи обучения. Это приурочено только к слою avg_pool для учета теплых запусков.
Примечание. Размер пакета остается прежним, но заполнение ОЗУ на графическом процессоре еще больше повысит производительность (лучше, чем на графическом процессоре с большим объемом памяти).
Входными данными для этой модели является стандартный набор данных обзоров фильмов IMDB, который содержит 25 000 обзоров обучения и 25 000 обзоров тестирования, равномерно разделенных на 2 категории (положительные/отрицательные). Используя подход Кераса, где начальный символ установлен на 1, внесловарный запас (с использованием словарного запаса размером 30 КБ) представлен как 2, а индекс слова начинается с 3. Каждый комментарий дополняется нулями/усекается до 150 слов.
* Указывает, что эксперимент не проводился.
Использовать автонастройку: большинство фреймворков используют cuDNN cudnnFindConvolutionForwardAlgorithm() для выполнения исчерпывающего поиска и оптимизации алгоритма сверточного прямого распространения для изображений фиксированного размера, обычно этот параметр включен по умолчанию, но в некоторых фреймворках может потребоваться ручная маркировка, например torch.backends.cudnn.benchmark=Истина и другие флаги.
Используйте cuDNN как можно чаще: для обычных RNN (например, GRU/LSTM) вы обычно можете вызвать оболочку cuDNN (https://devblogs.nvidia.com/optimizing-recurrent-neural-networks-cudnn-5/) для повышения скорости, например, cudnn_rnn .CudnnGRU() вместо rnn.GRUCell(). Но недостатком этого подхода является то, что он затрудняет дальнейшие выводы на ЦП.
Сопоставление форм: при работе на cuDNN сопоставление порядка каналов CNN NCHW и RNN TNC сокращает время настройки, и пользователи могут напрямую выполнять умножение матриц.
Собственные генераторы: используйте собственные генераторы фреймворка для повышения скорости за счет линейного выполнения асинхронных улучшений и даже предварительной обработки (например, перетасовки, перетасовки).
На этапе вывода обязательно отметьте места, где могут быть сохранены ненужные вычисления градиента, и убедитесь, что слои пакетной нормы и отсева применяются правильно.
Изначально при создании этого репозитория нам пришлось использовать множество маленьких хитростей и уловок, чтобы убедиться, что мы используем одну и ту же модель во всех фреймворках, и это было сделано оптимально. Однако за последние несколько месяцев эти фреймворки развивались с невероятной скоростью, и многие из них были обновлены, так что многие из наших оптимизаций 2017 года теперь устарели.
Например, в Keras с бэкэндом TF порядок каналов жестко запрограммирован как последний (неоптимальный для cuDNN), поэтому указание приоритетного канала означает, что он будет перенастраиваться после обработки каждого пакета (жестко запрограммированное значение), что значительно замедляет скорость обучения. Keras, поддерживающий TF, теперь позволяет локальным каналам иметь приоритет. Мы могли бы ускорить Tensorflow, указав флаг для использования алгоритма Винограда для свертки, но это больше не работает. Ознакомьтесь с нашим предыдущим репо для выводов, если интересно.
Выполняя комплексные решения в разных средах, можно сравнивать разные среды несколькими способами. Поскольку каждый фреймворк использует одну и ту же архитектуру модели и данные, точность всех фреймворков одинакова (на самом деле, это способ для нас протестировать наш код, чтобы убедиться, что разные фреймворки используют одну и ту же модель!) Разработанный позволяет нам легко сравнивать различные фреймворки, не обязательно с точки зрения скорости.
Конечно, хотя нам легко сравнивать различные платформы по таким параметрам, как скорость, время вывода и т. д., результаты не подразумевают каких-либо проблем с общей производительностью платформ, поскольку этот подход опускает сравнения между важными параметрами, такими как как: справка и поддержка, доступность предварительно обученных моделей, настраиваемые слои и архитектуры, загрузчики данных, отладка, поддержка различных платформ, распределенное обучение и многое другое! Этот подход просто показывает, как создать одну и ту же сеть в разных фреймворках, и производительность фреймворка на примере.
В сообществе существует множество популярных фреймворков глубокого обучения, которые помогают разработчикам ИИ и специалистам по данным решать проблемы с использованием разных фреймворков глубокого обучения в различных ситуациях. Среди них Open Neural Network Exchange с открытым исходным кодом (ONNX, https://github.com/onnx/onnx) стал стандартом для применения совместимости моделей глубокого обучения между различными платформами. Например, ONNX полезен, когда вы используете одну платформу для разработки модели, но вам нужно оценить модель в другой. Аналогично, MMdnn (https://github.com/Microsoft/MMdnn) служит набором инструментов, помогающих пользователям напрямую переводить данные между различными фреймворками и визуализировать архитектуры моделей.
«Попутчик» фреймворков глубокого обучения, таких как ONNX и MMdnn, похож на автоматическую машину машинного перевода. Напротив, репозиторий полной версии 1.0, который мы выпустили сегодня, подобен Розеттскому камню среди фреймворков глубокого обучения, демонстрируя полный процесс построения моделей между различными фреймворками. Когда все собирают дрова и пламя разгорается, объединенные усилия всех людей могут позволить всем разработчикам глубокого обучения лучше «плавать» в многоязычной среде.
Оригинальная ссылка:
https://blogs.technet.microsoft.com/machinelearning/2018/03/14/comparing-deep-learning-frameworks-a-rosetta-stone-approach/
Для большего содержания сухих товаров вы можете обратить внимание на AI Frontline, ID:ai-front, фоновый ответ "AI", "TF", "Большие данные«Вы можете получить серию мини-книг в формате PDF и карт навыков «AI Frontline».