Сила графических процессоров над процессорами заключается в одновременном выполнении множества операций. Однако архивирование этого высокого уровня распараллеливания не всегда легко. Фреймворки, такие как Tensorflow или PyTorch, делают все возможное, чтобы оптимизировать все для GPU и распараллеливания, но это не всегда возможно.
Вычисления в LSTM и RNN в целом могут быть распараллелены только в очень ограниченной степени. Проблема заключается в их последовательной структуре, LSTM и RNN обрабатывают только один вход за раз, и им нужно обрабатывать все в хронологическом порядке (для вычисления n + 1 вам всегда нужно вычислять n раньше) - в противном случае это не имеет смысла.
Таким образом, естественный способ обработки данных в RNN полностью противоположен распараллеливанию, использование мини-пакетирования очень помогает, но не решает фундаментальную проблему LSTM.
Если вам не нужна большая степень распараллеливания, вам нужно использовать такие архитектуры, как «Трансформер» , предложенный в статье «Внимание - это все, что вам нужно» от Google.
Резюме
Степень распараллеливания соотв. ускорение GPU вашей модели во многом зависит от архитектуры самой модели.
В некоторых архитектурах, таких как RNN, распараллеливание возможно только в ограниченной степени.
Edit:
Например, если я добавлю больше слоев или добавлю больше скрытых узлов, стоит ли ожидать увеличения использования графического процессора?
При увеличении количества единиц внутри вы должны ожидать увеличения использования графического процессора, матричные операции, такие как передача ввода в скрытый слой, могут быть хорошо распараллелены.
Добавление слоев отличается, там у вас та же проблема, которая заставляет RNN работать медленно на GPU. Для вычисления следующего слоя у вас должен быть уже результат предыдущего слоя. Поэтому вам нужно вычислять один слой за другим, невозможно вычислить все одновременно.
Это теория - на практике вы можете увидеть некоторые незначительные различия в использовании GPU, в зависимости от фактической реализации платформы.