сравнение фреймворков глубокого обучения

Фреймворк глубокого обучения в 2019: выбираем из 10 лучших

Как выбрать фреймворк глубокого обучения? Сравниваем 10 популярных сред тренировки нейросетей. Преимущества, недостатки, подводные камни.

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

1. TensorFlow

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

Начнем с очевидного. TensorFlow, без сомнения, – популярнейший инструмент для обучения нейросетей. Google активно использует собственный фреймворк глубокого обучения для таких крупномасштабных сервисов как Gmail и Google Translate. TensorFlow уже применили к своим сервисам и такие значительные бренды как Uber, Airbnb, Dropbox и многие другие. Он оказал огромное влияние на разработку.

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

Наиболее удобным клиентским языком работы с TensorFlow является Python, но доступны и экспериментальные интерфейсы на JavaScript, C++, Java и Go. Сообщество open source разработало также решения для C# и Julia.

Следствием популярности фреймворка стала подробная документация, включающая не только версию на официальном сайте, но и сторонние источники. Документация описывает как структуру фреймворка TensorFlow, так и инструменты, позволяющие отследить сам процесс обучения нейросети, например, визуализация с TensorBoard.

Важно, что проект учитывает не только мощные вычислительные кластеры, но и возможность запуска моделей на мобильных платформах, как iOS и Android.

Тем не менее, TensorFlow – это низкоуровневый инструмент. Вам нужно тщательно продумывать архитектуру нейросети, правильно оценивать размерность и объемы входных и выходных данных. Таким образом, работа с TensorFlow требует написания значительного количества программного кода.

TensorFlow оперирует статическим вычислительным графом. То есть вначале мы определяем граф, далее запускаем вычисления и, если необходимо внести изменения в архитектуру, заново обучаем модель. Такой подход выбран ради эффективности, но многие современные нейросетевые инструменты умеют учитывать уточнения в процессе обучения без существенной потери скорости обучения. В этом плане основным конкурентом TensorFlow является фреймворк глубокого обучения PyTorch.

2. PyTorch

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

В отличие от TensorFlow, библиотека PyTorch оперирует динамически обновляемым графом. То есть позволяет вносить изменения в архитектуру в процессе работы.

Фреймворк PyTorch был разработан для сервисов Facebook, но уже используется для собственных задач такими компаниями как Twitter и Salesforce. В PyTorch можно использовать стандартные дебаггеры, например, pdb или PyCharm. Процесс тренировки нейросети прост и ясен. При этом PyTorch поддерживает модель параллелизма данных и распределенного обучения, а также содержит множество предобученных моделей.

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

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

В материалах конференций по искусственному интеллекту и в конкурсах Kaggle исследователи нередко отдают предпочтение PyTorch, а не TensorFlow. Связано это с тем, что PyTorch гораздо лучше подходит для небольших проектов и прототипирования. Когда же речь заходит о кросплатформенных решениях, TensorFlow выглядит более подходящим выбором. Однако стоит отметить, что для тех же задач можно использовать представленный в 2017 году мобильный фреймворк Caffe2. Ведь он умеет работать в связке с PyTorch.

3. Sonnet

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

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

Идея Sonnet состоит в первичном конструировании объектов Python, соответствующих определенной части нейросети. Далее эти объекты независимо подключаются к вычислительному графу TensorFlow. Разделение процессов создания объектов и связывания их с графом упрощает конструирование высокоуровневых архитектур. Подробнее об этих принципах можно прочитать в документации фреймворка.

4. Keras

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

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

Таким образом, Keras – лучший Deep Learning фреймворк для тех, кто только начинает. Идеально подходит для обучения и прототипирования простых концептов, чтобы понять самую суть различных моделей и процессов их обучения.

5. MXNet

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

MXNet представляет собой фреймворк глубокого обучения, разрабатываемый компанией Amazon. Фреймворк исходно поддерживает большое количество языков (C++, Python, R, Julia, JavaScript, Scala, Go и даже Perl). Основной акцент сделан на том, что фреймворк очень эффективно параллелится на множестве GPU и многих машинах. Это, в частности, продемонстрировано и его работой на Amazon Web Services.

6. Gluon

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

Специфика проекта Gluon – гибкий интерфейс, упрощающий создание прототипов, построение и обучение моделей глубокого обучения без ущерба для скорости обучения. Gluon базируется на MXNet и предлагает простое API, упрощающее создание моделей глубокого обучения. Аналогично PyTorch, фреймворк Gluon поддерживает работу с динамическим графом, сочетая это с высокой производительностью MXNet. В этом ракурсе Gluon выглядит крайне интересной альтернативой Keras для распределенных вычислений.

7. CNTK

Как вы могли заметить, все мировые гиганты IT находятся в гонке за глубокое обучение. Исключением не стала и компания Microsoft.

Фреймворк глубокого обучения CNTK (он же Microsoft Cognitive Toolkit) содержит множество готовых решений для распознавания речи и изображений. Работает с C++, Python, С# и Java. Поддерживает Apache Spark и Microsoft Azure Virtual Machine. Однако по понятным причинам CNTK в большей мере ориентирован на Windows.

8. Chainer

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

Chainer – фреймворк глубокого обучения, созданный японским стартапом и поддерживаемый IBM, Intel, Microsoft и Nvidia. Код написан на чистом Python поверх библиотек Numpy и CuPy. Chainer – первый фреймворк, который стал оперировать динамической моделью архитектуры (как в PyTorch). Кроме того, Chainer несколько раз бил рекорды по эффективности масштабирования при моделировании задач, решаемых нейронными сетями.

9. DL4J

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

Тем, кто на короткой ноге с Java или Scala, стоит обратить внимание на DL4J (сокращение от Deep Learning for Java). Обучение нейросетей в DL4J осуществляется параллельно по итерациям через кластеры. Процесс поддерживается архитектурами Hadoop и Spark. Использование Java позволяет применять библиотеку в цикле разработке программ для Android-устройств. Заметим, что разработчикам под iOS стоит обратить внимание на фреймворк Core ML.

10. ONNX

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

Проект ONNX родился в результате сотрудничества Microsoft и Facebook как поиск открытого формата для представления моделей глубокого обучения. ONNX упрощает процесс переноса моделей между различными средствами работы с искусственным интеллектом. Таким образом, ONNX позволяет сочтать преимущества различных Deep Learning фреймворков.

Заключение

Подведем итог. При выборе фреймворка обратите внимание на таблицу сравнения различных фреймворков и библиотек. Если вы только начинаете и хотите разобраться, что к чему, лучший выбор – Keras. В исследовательских целях наиболее востребован PyTorch. Для продакшена нужно ориентироваться на среду. Так, для Google Cloud лучший выбор – это TensorFlow, для AWS – MXNet и Gluon, для Microsoft Azure – CNTK. Разработчикам под Android стоит обратить внимание на D4LJ, для iOS подобный круг задач решает Core ML. Наконец, в вопросах взаимодействия между различными фреймворками поможет ONNX.

Если фрейморк глубокого обучения уже выбран:

Источник

TensorFlow vs PyTorch в 2021: сравнение фреймворков глубокого обучения

Всем привет! Меня зовут Дмитрий, я занимаюсь разработкой в области компьютерного зрения в команде MTS AI. Так исторически сложилось, что в своей работе я использую, как правило, связку устаревшей версии TensorFlow 1 и Keras. Пришло время двигаться дальше, но прежде чем полностью перейти на TensorFlow 2, я решил сравнить наиболее популярные на сегодня фреймворки глубокого обучения: TensorFlow и PyTorch. Эта статья будет полезна всем Data Scientist’ам, кто желает узнать чуть больше про особенности и производительность TensorFlow и PyTorch.

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

TensorFlow и Keras

TensorFlow был впервые представлен компанией Google в ноябре 2015 года. Он появился на основе собственного решения Google для задач машинного обучения. Название фреймворка отражает суть его работы: данные представляются в виде тензоров, а при выполнении операций с ними формируется граф потока данных (граф вычислений), в котором отслеживается изменение данных и поддерживается автоматическое дифференцирование. В первой версии TensorFlow граф вычислений был статическим.

Версия TensorFlow 2.x была представлена в сентябре 2019, её главным отличием от первой версии был переход от статического к динамическому графу вычислений. При этом сохранилась поддержка статического графа вычислений:

TensorFlow предоставляет несколько полезных для разработки API: TensorFlow Lite позволяет легко оптимизировать и подготовить обученные модели для запуска на различных мобильных устройствах и устройствах IoT; TensorFlow.js позволяет использовать JavaScript для обучения моделей и запуска обученных моделей; TensorFlow Extended предоставляет множество компонентов, в том числе REST API, для реализации пайплайнов машинного обучения в готовых продуктах.

PyTorch

PyTorch был впервые представлен компанией Facebook в октябре 2016 года. PyTorch основан на Torch – Matlab-подобной библиотеки для Lua, поддержка которой практически прекратилась в 2017 году. PyTorch также поддерживает автоматическое дифференцирование и использует динамический граф вычислений.

PyTorch достаточно удобен и прост: работа с тензорами очень похожа на работу с numpy arrays, что в совокупности с динамическим графом вычислений облегчает разработку и дебагинг.

Статический и динамический графы вычислений

При использовании статического графа вычислений программа работает следующим образом. Код, описывающий различные операции с тензорами, выполняется только один раз, в результате чего формируется статический граф вычислений (объект tf.Graph() в TensorFlow 1.x). Чтобы получить результаты вычисления графа, необходимо подать данные в граф и запустить вычисления для необходимых тензоров:

При использовании динамического графа вычисления происходят сразу при определении операций:

Таким образом, динамический граф вычислений является более удобным:

вычисления выполняются сразу при определении операций;

результаты вычислений доступны на любом шаге;

более лёгкая и гибкая разработка, упрощённый дебагинг.

Сравнение производительности TensorFlow и PyTorch

При использовании различных версий TensorFlow и PyTorch я неоднократно замечал различия в производительности, однако в гугле я практическине нашел подробной информации с числами. Из наиболее интересных данных, здесь автор вопроса сравнивал скорость обучения при использовании TensorFlow 1.х и TensorFlow 2.х., а в этой статье 2017 года представлено сравнение производительности нескольких фреймворков глубокого обучения, однако на сегодня она уже является устаревшей.

Мне, как активному пользователю этих фреймворков, наиболее интересно сравнить скорость обучения (на GPU), скорость инференса (на GPU и на CPU), а также количество выделяемой видеопамяти при обучении и инференсе.

Обучение и инференс:

В каждом шаге обучения выполняется forward propagation – прямое распространение сигнала вдоль нейронной сети и получение предсказаний, вычисление функции потерь и backward propagation – алгоритм обратного распространения ошибки и обновление обучаемых параметров. Инференс же представляет собой только forward propagation, за счёт чего расчёты выполняются быстрее с меньшим потреблением памяти.

Для сравнения я выбрал несколько классических архитектур свёрточных нейронных сетей, которые отличаются размером, количеством и типом свёрточных слоёв и функций активации. Помимо этого, я варьировал наиболее часто изменяемые параметры: размер батча (количество одновременно обрабатываемых нейронной сетью изображений) и размер входных изображений.

GPU: Nvidia GeForce RTX 2060;

CPU: Intel(R) Core(TM) i7-9750H.

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

1. Скорость обучения (на GPU)

Для каждой комбинации нейронной сети, размера входных изображений и размера батча было выполнено 100 шагов обучения и измерено среднее время шага обучения. Полные результаты измерений представлены в таблице 1. Прочерки в таблицах соответствуют такой комбинации параметров, при которой для процесса не хватило видеопамяти. На рисунке 1 представлены кривые, соответствующие относительному времени шага обучения фреймворков для каждой выбранной комбинации входных параметров (за единицу принято наименьшее время шага в данной комбинации).

Таблица 1. Среднее время шага обучения (в секундах).

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

В большинстве случаев PyTorch показывает лучшую производительность по сравнению с TensorFlow. Грубая оценка такая: скорость обучения в PyTorch 1.9.0 на 30% быстрее, чем в TensorFlow 2.5.0, и на 45% быстрее, чем в TensorFlow 1.15.0. Однако заметно, что при обучении vgg16 и efficientnet в TensorFlow 2.5.0 показывает лучшую производительность, хотя и в целом близкую к производительности в PyTorch 1.9.0. Оптимизация видеопамяти в TensorFlow 2.5.0 улучшилась по сравнению с TensorFlow 1.15.0, благодаря чему удалось запустить обучение для большего числа нейронных сетей. Оптимизация видеопамяти в PyTorch 1.9.0 выглядит чуть более превосходящей, чем в TensorFlow 2.5.0.

2. Скорость инференса (на GPU)

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

Таблица 2. Среднее время шага инференса на GPU (в секундах).

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

При инференсе на GPU TensorFlow 1.15.0 и PyTorch 1.9.0 показывают примерно одинаковую производительность: при грубой оценке, PyTorch 1.9.0 оказывается в среднем на 5% быстрее при использовании архитектур ResNet и VGG, а TensorFlow 1.15.0 в среднем на 5% быстрее при использовании архитектур MobileNet и EfficientNet. При этом TensorFlow 2.5.0 во всех случаях в среднем на 30% медленнее. Основная причина в этом, на мой взгляд, использование динамического графа вычислений: при переходе к статическому, скорость инференса в TensorFlow 2.5.0 становится практически такой же, как и в TensorFlow 1.15.0.

3. Скорость инференса (на CPU)

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

Таблица 3. Среднее время шага инференса на CPU (в секундах).

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

Здесь результаты получились довольно неожиданные: в большинстве случаев PyTorch 1.9.0 показывает низкую производительность, причём чем сложнее нейронная сеть, тем ниже производительность. Грубая оценка скорости инференса на CPU: TensorFlow 2.5.0 в среднем на 5% быстрее, чем TensorFlow 1.15.0 и в среднем на 40% быстрее, чем PyTorch 1.9.0.

Интересно, что при инференсе на CPU переход от динамического графа к статическому в TensorFlow 2.5.0 не влияет на скорость.

4. Количество выделяемой видеопамяти

Для измерения выделяемой видеопамяти я использовал python-оболочку для nvidia-smi. Благодаря этой библиотеке, в конце процесса обучения/инференса я получал информацию о количестве выделенной видеопамяти под текущий процесс. К сожалению, видеопамять в TensorFlow выделяется не совсем понятным образом: как правило, значительная часть доступной видеопамяти выделяется независимо от параметров обучаемой нейронной сети. При этом я несколько раз замечал, что там, где ожидается большее потребление видеопамяти, TensorFlow выделяет её меньше. Например, для обучения ResNet18 с входным размером изображения (128, 128, 3) и размером батча 1 выделяется 4679 Мб видеопамяти, а для обучения той же ResNet18 с входным размером изображения (320, 320, 3) и размером батча 1 выделяется 3911 Мб видеопамяти. В PyTorch выделение видеопамяти более понятно: для описанных конфигураций выделяется 1329 Мб и 1355 Мб видеопамяти соответственно.

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

Таблица 4. Количество выделяемой видеопамяти при обучении и инференсе в PyTorch 1.9.0 (в Мб).

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

Заключение

Проанализировав результаты измерений, я сделал для себя несколько выводов:

помимо того, что TensorFlow 1 уже морально устарел, TensorFlow 2 является в целом более производительным при обучении свёрточных нейронных сетей и инференсе без использования GPU;

использовать tf.keras для инференса на GPU в TensorFlow 2 можно на этапе разработки и тестирования моделей, а для встраивания обученных моделей желательно использовать другие средства TensorFlow, обеспечивающие бóльшую производительность, например, в TensorFlow 2 осталось доступна заморозка графа;

PyTorch радует своей производительностью при использовании GPU, но если планируется запускать обученные модели на CPU, то необходимо использовать другие средства, например, onnxruntime. На мой взгляд, onnxruntime обеспечивает наилучшую производительность при запуске нейронных сетей на CPU.

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

1 – небольшое описание и сравнение TensorFlow и PyTorch;

2 – сравнение TensorFlow и PyTorch с примерами кода;

3 – краткое описание 8 различных фреймворков глубокого обучения.

Весь код, использованный мной для выполнения этих измерений, а также результаты измерений опубликованы в моём репозитории.

Источник

TensorFlow vs PyTorch в 2021: сравнение фреймворков глубокого обучения

Всем привет! Меня зовут Дмитрий, я занимаюсь разработкой в области компьютерного зрения в команде MTS AI. Так исторически сложилось, что в своей работе я использую, как правило, связку устаревшей версии TensorFlow 1 и Keras. Пришло время двигаться дальше, но прежде чем полностью перейти на TensorFlow 2, я решил сравнить наиболее популярные на сегодня фреймворки глубокого обучения: TensorFlow и PyTorch. Эта статья будет полезна всем Data Scientist’ам, кто желает узнать чуть больше про особенности и производительность TensorFlow и PyTorch.

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

TensorFlow и Keras

TensorFlow был впервые представлен компанией Google в ноябре 2015 года. Он появился на основе собственного решения Google для задач машинного обучения. Название фреймворка отражает суть его работы: данные представляются в виде тензоров, а при выполнении операций с ними формируется граф потока данных (граф вычислений), в котором отслеживается изменение данных и поддерживается автоматическое дифференцирование. В первой версии TensorFlow граф вычислений был статическим.

Версия TensorFlow 2.x была представлена в сентябре 2019, её главным отличием от первой версии был переход от статического к динамическому графу вычислений. При этом сохранилась поддержка статического графа вычислений:

TensorFlow предоставляет несколько полезных для разработки API: TensorFlow Lite позволяет легко оптимизировать и подготовить обученные модели для запуска на различных мобильных устройствахи устройствах IoT; TensorFlow.js позволяет использовать JavaScript для обучения моделей и запуска обученных моделей; TensorFlow Extended предоставляет множество компонентов, в том числе REST API, для реализации пайплайнов машинного обучения в готовых продуктах.

PyTorch

PyTorch был впервые представлен компанией Facebook в октябре 2016 года. PyTorch основан на Torch – Matlab-подобной библиотеки для Lua, поддержка которой практически прекратилась в 2017 году. PyTorch также поддерживает автоматическое дифференцирование и использует динамический граф вычислений.

PyTorch достаточно удобен и прост: работа с тензорами очень похожа на работу с numpy arrays, что в совокупности с динамическим графом вычислений облегчает разработку и дебагинг.

Статический и динамический графы вычислений

При использовании статического графа вычислений программа работает следующим образом. Код, описывающий различные операции с тензорами, выполняется только один раз, в результате чего формируется статический граф вычислений (объект tf.Graph() в TensorFlow 1.x). Чтобы получить результаты вычисления графа, необходимо подать данные в граф и запустить вычисления для необходимых тензоров:

При использовании динамического графа вычисления происходят сразу при определении операций:

Таким образом, динамический граф вычислений является более удобным:

вычисления выполняются сразу при определении операций;

результаты вычислений доступны на любом шаге;

более лёгкая и гибкая разработка, упрощённый дебагинг.

Сравнение производительности TensorFlow и PyTorch

При использовании различных версий TensorFlow и PyTorch я неоднократно замечал различия в производительности, однако в гугле я практическине нашел подробной информации с числами. Из наиболее интересных данных, здесь автор вопроса сравнивал скорость обучения при использовании TensorFlow 1.х и TensorFlow 2.х., а в этой статье 2017 года представлено сравнение производительности нескольких фреймворков глубокого обучения, однако на сегодня она уже является устаревшей.

Мне, как активному пользователю этих фреймворков, наиболее интересно сравнить скорость обучения (на GPU), скорость инференса (на GPU и на CPU), а также количество выделяемой видеопамяти при обучении и инференсе.

Обучение и инференс:

В каждом шаге обучения выполняется forward propagation – прямое распространение сигнала вдоль нейронной сети и получение предсказаний, вычисление функции потерь и backward propagation – алгоритм обратного распространения ошибки и обновление обучаемых параметров. Инференс же представляет собой только forward propagation, за счёт чего расчёты выполняются быстрее с меньшим потреблением памяти.

Для сравнения я выбрал несколько классических архитектур свёрточных нейронных сетей, которые отличаются размером, количеством и типом свёрточных слоёв и функций активации. Помимо этого, я варьировал наиболее часто изменяемые параметры: размер батча (количество одновременно обрабатываемых нейронной сетью изображений) и размер входных изображений.

GPU: Nvidia GeForce RTX 2060;

CPU: Intel(R) Core(TM) i7-9750H.

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

1. Скорость обучения (на GPU)

Для каждой комбинации нейронной сети, размера входных изображений и размера батча было выполнено 100 шагов обучения и измерено среднее время шага обучения. Полные результаты измерений представлены в таблице 1. Прочерки в таблицах соответствуют такой комбинации параметров, при которой для процесса не хватило видеопамяти. На рисунке 1 представлены кривые, соответствующие относительному времени шага обучения фреймворков для каждой выбранной комбинации входных параметров (за единицу принято наименьшее время шага в данной комбинации).

Таблица 1. Среднее время шага обучения (в секундах).

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

В большинстве случаев PyTorch показывает лучшую производительность по сравнению с TensorFlow. Грубая оценка такая: скорость обучения в PyTorch 1.9.0 на 30% быстрее, чем в TensorFlow 2.5.0, и на 45% быстрее, чем в TensorFlow 1.15.0. Однако заметно, что при обучении vgg16 и efficientnet в TensorFlow 2.5.0 показывает лучшую производительность, хотя и в целом близкую к производительности в PyTorch 1.9.0. Оптимизация видеопамяти в TensorFlow 2.5.0 улучшилась по сравнению с TensorFlow 1.15.0, благодаря чему удалось запустить обучение для большего числа нейронных сетей. Оптимизация видеопамяти в PyTorch 1.9.0 выглядит чуть более превосходящей, чем в TensorFlow 2.5.0.

2. Скорость инференса (на GPU)

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

Таблица 2. Среднее время шага инференса на GPU (в секундах).

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

При инференсе на GPU TensorFlow 1.15.0 и PyTorch 1.9.0 показывают примерно одинаковую производительность: при грубой оценке, PyTorch 1.9.0 оказывается в среднем на 5% быстрее при использовании архитектур ResNet и VGG, а TensorFlow 1.15.0 в среднем на 5% быстрее при использовании архитектур MobileNet и EfficientNet. При этом TensorFlow 2.5.0 во всех случаях в среднем на 30% медленнее. Основная причина в этом, на мой взгляд, использование динамического графа вычислений: при переходе к статическому, скорость инференса в TensorFlow 2.5.0 становится практически такой же, как и в TensorFlow 1.15.0.

3. Скорость инференса (на CPU)

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

Таблица 3. Среднее время шага инференса на CPU (в секундах).

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

Здесь результаты получились довольно неожиданные: в большинстве случаев PyTorch 1.9.0 показывает низкую производительность, причём чем сложнее нейронная сеть, тем ниже производительность. Грубая оценка скорости инференса на CPU: TensorFlow 2.5.0 в среднем на 5% быстрее, чем TensorFlow 1.15.0 и в среднем на 40% быстрее, чем PyTorch 1.9.0.

Интересно, что при инференсе на CPU переход от динамического графа к статическому в TensorFlow 2.5.0 не влияет на скорость.

4. Количество выделяемой видеопамяти

Для измерения выделяемой видеопамяти я использовал python-оболочку для nvidia-smi. Благодаря этой библиотеке, в конце процесса обучения/инференса я получал информацию о количестве выделенной видеопамяти под текущий процесс. К сожалению, видеопамять в TensorFlow выделяется не совсем понятным образом: как правило, значительная часть доступной видеопамяти выделяется независимо от параметров обучаемой нейронной сети. При этом я несколько раз замечал, что там, где ожидается большее потребление видеопамяти, TensorFlow выделяет её меньше. Например, для обучения ResNet18 с входным размером изображения (128, 128, 3) и размером батча 1 выделяется 4679 Мб видеопамяти, а для обучения той же ResNet18 с входным размером изображения (320, 320, 3) и размером батча 1 выделяется 3911 Мб видеопамяти. В PyTorch выделение видеопамяти более понятно: для описанных конфигураций выделяется 1329 Мб и 1355 Мб видеопамяти соответственно.

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

Таблица 4. Количество выделяемой видеопамяти при обучении и инференсе в PyTorch 1.9.0 (в Мб).

сравнение фреймворков глубокого обучения. Смотреть фото сравнение фреймворков глубокого обучения. Смотреть картинку сравнение фреймворков глубокого обучения. Картинка про сравнение фреймворков глубокого обучения. Фото сравнение фреймворков глубокого обучения

Заключение

Проанализировав результаты измерений, я сделал для себя несколько выводов:

помимо того, что TensorFlow 1 уже морально устарел, TensorFlow 2 является в целом более производительным при обучении свёрточных нейронных сетей и инференсе без использования GPU;

использовать tf.keras для инференса на GPU в TensorFlow 2 можно на этапе разработки и тестирования моделей, а для встраивания обученных моделей желательно использовать другие средства TensorFlow, обеспечивающие бóльшую производительность, например, в TensorFlow 2 осталось доступна заморозка графа;

PyTorch радует своей производительностью при использовании GPU, но если планируется запускать обученные модели на CPU, то необходимо использовать другие средства, например, onnxruntime. На мой взгляд, onnxruntime обеспечивает наилучшую производительность при запуске нейронных сетей на CPU.

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

1 – небольшое описание и сравнение TensorFlow и PyTorch;

2 – сравнение TensorFlow и PyTorch с примерами кода;

3 – краткое описание 8 различных фреймворков глубокого обучения.

Весь код, использованный мной для выполнения этих измерений, а также результаты измерений опубликованы в моём репозитории.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *