Как работает использование GPU в контексте обучения нейронной сети? - PullRequest
0 голосов
/ 04 мая 2018

Я использую экземпляр AWS p3.2xlarge с Deep Learning AMI (DLAMI). Этот экземпляр имеет один Tesla V100 (640 тензорных ядер и 5120 ядер CUDA). Когда я запустил ноутбук PyTorch Seq2Seq Jupyter, я заметил, что используется только 25% графического процессора. Я наблюдаю за использованием графического процессора с помощью следующей команды watch -n 1 nvidia-smi.

Мой вопрос: что определяет использование графического процессора? Или почему использование графического процессора не 100%? Причина этого вопроса связана не только с неэффективностью, которая может быть результатом кода, но и с затратами ($ 3,06 / час). Мне интересно, могу ли я сделать что-то еще, чтобы максимально увеличить использование графического процессора.

Конечно, это модель глубокого обучения, которая изучается, и обучающий код отправляет один образец за раз по сети для обучения. Я думаю, что мини-пакетное обучение может быть неуместным (например, отправка нескольких образцов до обратного распространения). Мне также интересно, ограничивает ли архитектура сети (количество слоев, их параметры, их размеры входного тензора и т. Д.) Использование графического процессора. Например, если я добавлю больше слоев или добавлю больше скрытых узлов, стоит ли ожидать увеличения использования графического процессора?

1 Ответ

0 голосов
/ 04 мая 2018

Сила графических процессоров над процессорами заключается в одновременном выполнении множества операций. Однако архивирование этого высокого уровня распараллеливания не всегда легко. Фреймворки, такие как Tensorflow или PyTorch, делают все возможное, чтобы оптимизировать все для GPU и распараллеливания, но это не всегда возможно.

Вычисления в LSTM и RNN в целом могут быть распараллелены только в очень ограниченной степени. Проблема заключается в их последовательной структуре, LSTM и RNN обрабатывают только один вход за раз, и им нужно обрабатывать все в хронологическом порядке (для вычисления n + 1 вам всегда нужно вычислять n раньше) - в противном случае это не имеет смысла.

Таким образом, естественный способ обработки данных в RNN полностью противоположен распараллеливанию, использование мини-пакетирования очень помогает, но не решает фундаментальную проблему LSTM.

Если вам не нужна большая степень распараллеливания, вам нужно использовать такие архитектуры, как «Трансформер» , предложенный в статье «Внимание - это все, что вам нужно» от Google.

Резюме

Степень распараллеливания соотв. ускорение GPU вашей модели во многом зависит от архитектуры самой модели. В некоторых архитектурах, таких как RNN, распараллеливание возможно только в ограниченной степени.

Edit:

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

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

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

Это теория - на практике вы можете увидеть некоторые незначительные различия в использовании GPU, в зависимости от фактической реализации платформы.

...