Выбор между CPU и GPU для обучения нейронной сети

29

Я видел дискуссии о «накладных расходах» графического процессора и о том, что для «небольших» сетей обучение на процессоре (или сети процессоров) может быть быстрее, чем на графическом процессоре.

Что означает «маленький»?

Например, будет ли «однослойный» MLP со 100 скрытыми единицами «маленьким»?

Меняется ли наше определение «малого» для рекуррентных архитектур?

Есть ли другие критерии, которые следует учитывать при принятии решения о том, тренироваться ли на CPU или GPU?

РЕДАКТИРОВАТЬ 1:

Я только что нашел сообщение в блоге (возможно, устаревшее? Это с 2014 года):

«... Большинство сетевых карт работают только с памятью, зарегистрированной в ЦП, поэтому передача между графическим процессором и графическим процессором между двумя узлами будет выглядеть следующим образом: графический процессор 1 - процессор 1 - сетевая карта 1 - сетевая карта 2 - процессор 2 к графическому процессору 2. Это означает, что если выбрать медленную сетевую карту, то на одном компьютере не может быть ускорений. Даже с быстрыми сетевыми картами, если кластер большой, он даже не получает ускорений от графических процессоров по сравнению процессорам, поскольку графические процессоры работают слишком быстро, чтобы сетевые карты не отставали от них.

По этой причине многие крупные компании, такие как Google и Microsoft, используют ЦП, а не кластеры ГП для обучения своих больших нейронных сетей. "

Так что в какой-то момент, согласно этому посту, было бы быстрее использовать процессоры. Это все еще так?

РЕДАКТИРОВАТЬ 2: Да, это сообщение в блоге вполне может быть устаревшим, потому что:

Теперь кажется, что графические процессоры в узле связаны через шину PCIe, поэтому связь может происходить со скоростью около 6 ГБ / с. (Например: https://www.youtube.com/watch?v=el1iSlP1uOs , около 35 минут). Динамик подразумевает, что это быстрее, чем переход от GPU1 к CPU к GPU2. Это означало бы, что сетевая карта больше не является узким местом.

StatsSorceress
источник
Этот парень с его сообщением в блоге приносит хорошие очки. Я не понял всех его оправданий. Однако тот факт, что Google, Facebook, Twitter и все ведущие академические группы с глубоким обучением используют свои коды в основном на графических процессорах, говорит о том, что это хорошая идея. Несмотря на предвзятость: nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

Ответы:

28

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

Что означает «маленький»? Например, будет ли «однослойный» MLP со 100 скрытыми единицами «маленьким»?

Да, это определенно очень мало по современным стандартам. Если у вас нет GPU, идеально подходящего для тренировок (например, NVIDIA 1080 или NVIDIA Titan), я не удивлюсь, обнаружив, что ваш процессор работает быстрее.

Обратите внимание, что сложность вашей нейронной сети также зависит от количества входных объектов, а не только от количества блоков в скрытом слое. Если ваш скрытый слой имеет 100 единиц, и каждое наблюдение в вашем наборе данных имеет 4 входных объекта, то ваша сеть крошечная (~ 400 параметров). Если каждое наблюдение имеет 1М входных функций, как в некоторых медицинских / биотехнологических контекстах, то ваша сеть довольно велика с точки зрения количества параметров. В оставшейся части моего ответа я предполагаю, что у вас довольно мало функций ввода pr. наблюдение.

Один хороший пример сравнения производительности CPU и GPU, который я нашел, был, когда я обучал покерного бота с помощью обучения с подкреплением. Для обучения с подкреплением вам часто не нужно столько слоев в вашей нейронной сети, и мы обнаружили, что нам нужно всего несколько слоев с несколькими параметрами. Более того, количество входных функций было довольно низким. Первоначально я тренировался на GPU (NVIDIA Titan), но это занимало много времени, так как обучение с подкреплением требует много итераций. К счастью, я обнаружил, что тренировка на моем процессоре заставила мою тренировку идти в 10 раз быстрее! Это просто говорит о том, что процессоры иногда могут быть лучше для обучения.

Есть ли другие критерии, которые следует учитывать при принятии решения о том, тренироваться ли на CPU или GPU?

Важно отметить, что в то время как на GPU вы всегда захотите заполнить всю память GPU, увеличив размер своего пакета, это не относится к процессору. На процессоре увеличение размера пакета увеличит время pr. партия. Поэтому, если для вас важно иметь очень большой размер пакета (например, из-за очень шумного сигнала), может быть полезно использовать графический процессор. Я не испытывал это на практике, хотя обычно предпочтительны небольшие размеры партий.

PIR
источник
Спасибо @pir! У вас есть конкретные ссылки, где я могу прочитать больше?
StatsSorceress
Вы можете легко найти количество параметров, например, VGG для сравнения и увидеть, что ваша сеть крошечная по сравнению.
пир
3
Я не видел много CPU / GPU сравнения на маленьких сети , потому что это не то , что крупные компании и исследовательские лаборатории заинтересованы в том .
пир
@StatsSorceress Если вы хотите протестировать его самостоятельно, почему бы просто не установить простую MLP Keras и проверить производительность на GPU или CPU? Также см. Мой обновленный ответ относительно. размер вашей сети.
пир
5

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

Если вы используете какой-либо популярный язык программирования для машинного обучения, например, python или MATLAB, это всего лишь строка кода, сообщающая вашему компьютеру, что вы хотите, чтобы операции выполнялись на вашем GPU.

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

JahKnows
источник
4
Я обнаружил, что иногда накладные расходы на передачу данных в и из GPU полностью уничтожают увеличение скорости от параллелизма. Это не всегда хорошая идея, чтобы перейти на GPU.
Адриан
1
Это зависит от сложности вашей модели. Если вы тренируете простой K-NN, то, возможно, это не стоит. Однако, если вы обучаете какую-либо модель, для которой требуется обратная матрица или нейронная сеть, для которой требуется много последовательных матричных операций, всегда полезно выбрать графический процессор.
JahKnows
1
@AdrianKeister Я согласен. Это то, что я пытался понять в своем ответе. Для сети, упомянутой OP, это, вероятно, будет узким местом.
пир
1
100 скрытых юнитов быстрее на GPU, используя мою машину. Мне нужно очень небольшое количество скрытых блоков, чтобы процессор работал быстрее. Более того, я всегда стараюсь тренироваться партиями. В этом случае я сомневаюсь, что процессор будет узким местом, учитывая достаточно плотные данные.
JahKnows
3

Сначала я приведу несколько цитат из похожих вопросов:

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

Параллельная архитектура в GPU хорошо адаптирована для векторных и матричных операций. источник

Поэтому, если вы прочитаете эти вопросы, вы увидите, что они советуют использовать GPU независимо от случая; это всегда обеспечит некоторое улучшение.

Причина, по которой вы, возможно, читали, что «малые» сети должны обучаться с использованием ЦП, заключается в том, что внедрение обучения на GPU для небольшой сети может занять больше времени, чем простое обучение на CPU - это не означает, что GPU будет работать медленнее.

Сеть со 100 скрытыми единицами вроде небольшая , я бы назвал ее небольшой сетью относительно больших глубоких сетей. Рекуррентные архитектуры (в основном) имеют больше синапсов, чем сети с прямой связью, поэтому RNN со 100 скрытыми единицами «больше», чем FFN со 100 скрытыми единицами.

Томас В.
источник
Разве не правда, что если у вас есть MLP с одним скрытым слоем в 100 единиц, который имеет то же количество параметров, что и стандартный RNN со 100 скрытыми единицами, из-за распределения веса? В нем больше «синапсов» - больше «активаций» - но столько же параметров, верно?
StatsSorceress
я не знаком с термином «разделение веса». У него такое же количество активаций, но больше соединений, поэтому больше параметров ...
Томас В.
Распределение веса означает, что матрица веса от одного скрытого слоя в RNN до следующего скрытого слоя одинакова; это та же самая матрица «U», реплицированная во времени. Кроме того, веса от входа до скрытого слоя одинаковы во времени.
StatsSorceress
@StatsSorceress Я не знаком с работой с матрицами. Да, весовая матрица от скрытого слоя к следующему одинакова. Тем не менее, существует больше соединений (потому что слой также может быть подключен к ПРЕДЫДУЩЕМУ уровню). Я не уверен, как я могу объяснить, но RNN всегда будет иметь больше параметров, поскольку есть больше связанных слоев ..
Томас У
Да, я понимаю, что есть физически больше параметров, но многие из этих параметров принимают одно и то же значение, что означает эффективное число параметров в MLP и RNN с таким же количеством входных измерений и таким же количеством скрытых измерений. одно и тоже.
StatsSorceress