Каким должно быть значение параллельных итераций в реализациях тензорного RNN?
tf.nn.dynamic_rnn()
а также tf.nn.raw_rnn()
возьмите аргумент под названием parallel_iterations. В документации сказано:
параллельные_терации: (по умолчанию: 32). Количество итераций для параллельного запуска. Те операции, которые не имеют никакой временной зависимости и могут выполняться параллельно, будут. Этот параметр меняет время на пространство. Значения >> 1 используют больше памяти, но занимают меньше времени, в то время как меньшие значения используют меньше памяти, но вычисления занимают больше времени.
Если память не является ограничением, я не всегда должен сохранять ее значение равным количеству процессоров, доступных со мной на GPU.
Здесь у меня есть первый вопрос: правильно ли я считаю, что число процессоров на графическом процессоре означает число параллельных вычислений с плавающей запятой, которые он может выполнить (я не думаю, что графические процессоры тоже реализуют 2 потока на процессоры, как в процессорах)?
Теперь машина GRU: (обратите внимание, что смещения не показаны на изображении, но должны использоваться для повышения производительности)
Для меня значение 32 кажется слишком низким, чтобы сохранить его по умолчанию. Если у меня есть GRU с 250-мерным скрытым состоянием и 100-мерным вводом, у меня будет (2 x 250 x 350 x batch_size) плавающее умножение, которое я могу выполнять параллельно (вычисляя r и u), а затем (250 x batch_size) добавление с плавающей точкой что я могу работать параллельно с последующими (250 x batch_size) сигмоидными приложениями, которые имеют как минимум (250 x batch_size) потенциальные параллельные вычисления. Затем это параллельные вычисления (250 x batch_size) при применении шлюза сброса, за которыми следуют параллельные вычисления (1 x 250 x 350 x batch_size), а затем (250 x batch_size) параллельные вычисления для смещений. Теперь на последнем шаге это (250 x batch_size) вычислений с плавающей точкой для вычисления (1 - обновление строба) с последующими (500 x batch_size) параллельными вычислениями с плавающей точкой для выходного состояния. Мне кажется, что узкими местами в параллельных реализациях, использующих GPU, было бы наличие слишком большого количества низкоразмерных слоев, которые, например, здесь, представляют собой сложения смещения после умножения матриц (во всяком случае, они все еще имеют большой размер в 250 раз, так что в любом случае будут использовать GPU по максимуму)
Правильно ли я думаю во втором абзаце, анализируя глубокую сеть для смутного представления о том, как оборудование сможет повлиять на время работы?