Как стать автором
Обновить

Комментарии 8

Вы тестировали статические графы тензорфлоу, используя плейсхолдеры, а не датаслайсеры и пайпы?

Верхнеуровнево я использовал keras и tf.keras. Насколько мне известно, keras внутри использует плейсхолдеры.

Плейсхолдеры — это самый неэффективный и тормозной метод кормления сети. Это написано даже в документации к TF. Мол использовать плейсхолдеры для чего-то настоящего не рекомендуется, только для элементарщины и обучения, так как они — самые простые в понимании.

Хотите измерить скорость обучения сети с TF правильно? Используйте чистый TF, без Keras, и нормальные datapipe. Будете удивлены.

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

Достаточно ожидаемые, PyTorch не ориентирован на оптимизацию производительности на CPU.

Позволю высказать критику вашего теста.

  1. Вы упускаете, что несмотря на простоту дебага "динамического графа", статический при этом все же быстрее (параллельность выполнения неблокирующих друг друга веток).

  2. Статический граф можно оптимизировать https://www.tensorflow.org/guide/graph_optimization // Например, сюда относится оптимизация NHWC -> NCHW при тренировке на GPU ибо так быстрее считается. В Pytorch такое порядок каналов идет по умолчанию, а TF приходится думать "конвертировать или нет" / "будет быстрее считаться или нет"

  3. TF v2 не отказался от статического графа. В этом и прикол, что когда нужно подебажить можно скомпилировать модель с run_eagerly=True, а когда нужна производительность с False

  4. Не являюсь большим знатоком в PyTorch, но кажется он подает данные в модель подготавливая их в многопроцессном режиме. Для адекватного сравнения я бы ожидал увидеть подачу в TF данных через tf.data.Dataset с prefetch-ем который использует плюсовый бекенд и многопоточность и с с генерацией ранодомных данных через tf.random.* а не конвертацией из numpy. Ну и как бы желательно делать model.train с указанием количества эпох, а не train_on_batch

  5. Также для полноты картины хотелось бы чтобы при тестировании в TF был включен XLA (по ощущениям ускоряет тренировку больших моделей процентов на 10-15, в частности заменяет BatchNorm на fused-реализацию) и замерялись 2-я и последующие эпохи (на 1й TF делает оптимизации), а сами эпохи длились хотя бы минут по 5.

и замерялись 2-я и последующие эпохи (на 1й TF делает оптимизации)

Хотел бы уточнить, что TF делает оптимизации не на первой эпохе, а на первом шаге обучения/инференса. Этот момент был учтён.

НЛО прилетело и опубликовало эту надпись здесь

Второе. Налажал с кормежкой. Плейсхолдеры - ужасный метод подачи данных.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий