Я видел дискуссии о «накладных расходах» графического процессора и о том, что для «небольших» сетей обучение на процессоре (или сети процессоров) может быть быстрее, чем на графическом процессоре.
Что означает «маленький»?
Например, будет ли «однослойный» 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. Это означало бы, что сетевая карта больше не является узким местом.
источник
Ответы:
В отличие от некоторых других ответов, я настоятельно рекомендую всегда тренироваться на графических процессорах, не задумываясь. Это обусловлено использованием методов глубокого обучения на изображениях и текстах, где данные очень богаты (например, много пикселей = много переменных), и модель также имеет много миллионов параметров. Для других доменов это может быть не так.
Да, это определенно очень мало по современным стандартам. Если у вас нет GPU, идеально подходящего для тренировок (например, NVIDIA 1080 или NVIDIA Titan), я не удивлюсь, обнаружив, что ваш процессор работает быстрее.
Обратите внимание, что сложность вашей нейронной сети также зависит от количества входных объектов, а не только от количества блоков в скрытом слое. Если ваш скрытый слой имеет 100 единиц, и каждое наблюдение в вашем наборе данных имеет 4 входных объекта, то ваша сеть крошечная (~ 400 параметров). Если каждое наблюдение имеет 1М входных функций, как в некоторых медицинских / биотехнологических контекстах, то ваша сеть довольно велика с точки зрения количества параметров. В оставшейся части моего ответа я предполагаю, что у вас довольно мало функций ввода pr. наблюдение.
Один хороший пример сравнения производительности CPU и GPU, который я нашел, был, когда я обучал покерного бота с помощью обучения с подкреплением. Для обучения с подкреплением вам часто не нужно столько слоев в вашей нейронной сети, и мы обнаружили, что нам нужно всего несколько слоев с несколькими параметрами. Более того, количество входных функций было довольно низким. Первоначально я тренировался на GPU (NVIDIA Titan), но это занимало много времени, так как обучение с подкреплением требует много итераций. К счастью, я обнаружил, что тренировка на моем процессоре заставила мою тренировку идти в 10 раз быстрее! Это просто говорит о том, что процессоры иногда могут быть лучше для обучения.
Важно отметить, что в то время как на GPU вы всегда захотите заполнить всю память GPU, увеличив размер своего пакета, это не относится к процессору. На процессоре увеличение размера пакета увеличит время pr. партия. Поэтому, если для вас важно иметь очень большой размер пакета (например, из-за очень шумного сигнала), может быть полезно использовать графический процессор. Я не испытывал это на практике, хотя обычно предпочтительны небольшие размеры партий.
источник
Процессор является менеджером филиала, он может делать все что угодно, но он не так хорош, за исключением делегирования задач. Тем не менее, GPU - это специальный математик, скрывающийся в вашей машине. Если вы выполняете какие-либо сложные математические процессы, вам следует использовать свой графический процессор. Всегда.
Если вы используете какой-либо популярный язык программирования для машинного обучения, например, python или MATLAB, это всего лишь строка кода, сообщающая вашему компьютеру, что вы хотите, чтобы операции выполнялись на вашем GPU.
Вы также должны убедиться, что используете все ядра вашей машины. Это означает использование параллельных вычислений. Особенно для нейронных сетей, где операции могут выполняться независимо, это значительно увеличит вашу скорость.
источник
Сначала я приведу несколько цитат из похожих вопросов:
Поэтому, если вы прочитаете эти вопросы, вы увидите, что они советуют использовать GPU независимо от случая; это всегда обеспечит некоторое улучшение.
Причина, по которой вы, возможно, читали, что «малые» сети должны обучаться с использованием ЦП, заключается в том, что внедрение обучения на GPU для небольшой сети может занять больше времени, чем простое обучение на CPU - это не означает, что GPU будет работать медленнее.
Сеть со 100 скрытыми единицами вроде небольшая , я бы назвал ее небольшой сетью относительно больших глубоких сетей. Рекуррентные архитектуры (в основном) имеют больше синапсов, чем сети с прямой связью, поэтому RNN со 100 скрытыми единицами «больше», чем FFN со 100 скрытыми единицами.
источник