mxnet: при использовании RNN в модели происходит сбой инициализатора модели в контексте нескольких графических процессоров - PullRequest
0 голосов
/ 29 ноября 2018

Я новичок в mxnet и запускаю скрипт, слегка модифицированный из документации по RNN с глюоном .Я изменил код так, чтобы я работал со строго числовыми временными рядами, а не с проблемой НЛП.Все работало отлично, пока я не изменил эту строку:

context = mx.gpu()

до

GPU_COUNT = 3
context = [mx.gpu(i) for i in range(GPU_COUNT)]

Теперь инициализация переменной вызывает ошибку, которая вызывает сбой, в частности, в этой строке:

model.collect_params().initialize(mx.init.Xavier(), ctx=context)

Строка вызывает эту ошибку:

mxnet.base.MXNetError: include/mxnet/./base.h:388: Invalid context string[]

Я использую mxnet только несколько дней, поэтому я не очень хорошо знаю, что может пойти не так.Тем не менее, я запустил другой пример сценария - для MLP - где я также поменял несколько графических процессоров на один, и он работал нормально.

Это заставило меня подумать, что это RNN, и действительно, когда я удалил часть кода RNN (так что это просто сеть с прямой связью), он справляется с проблемной строкой с любым допустимым числомГрафические процессоры.Кроме того, я попробовал оба с опцией 'rnn_relu' и опцией 'gru', и они оба потерпели неудачу с одной и той же ошибкой.

Поэтому мой вопрос: do mxnet RNN работают с многократными графическими процессорами(одна машина) в mxnet в настоящее время через API глюона? Я не вижу, чтобы это обсуждалось так или иначе в документах, хотя я видел некоторые обсуждения по github относительно некоторыхфункции не реализуются для использования несколькими устройствами.Как бы я подтвердил эту теорию?Также есть другие объяснения, которые я должен проверять?

1 Ответ

0 голосов
/ 30 ноября 2018

Да, вы можете обучать RNN на нескольких GPU (и нескольких машинах) в MXNet.Я только что подтвердил, что приведенный ниже код работает с MXNet v1.3.0 на компьютере с 4 графическими процессорами.

import mxnet as mx

GPU_COUNT = 4
context = [mx.gpu(i) for i in range(GPU_COUNT)]

model = mx.gluon.rnn.RNN(hidden_size=10, num_layers=1)
model.collect_params().initialize(mx.init.Xavier(), ctx=context)

Возможно, вы захотите дважды проверить, что ничто не переопределяет ваш контекст, так как похоже, что вы используете пустой контекст здесь (то есть string[]).Вы также получите похожую ошибку при попытке создать массив в нескольких контекстах одновременно.

mx.nd.zeros(shape=(10,10), ctx=context)

Выдает следующую ошибку (обратите внимание, что контекст содержит несколько устройств):

MXNetError: [20:15:03] include/mxnet/./base.h:388: Invalid context string [gpu(0), gpu(1), gpu(2), gpu(3)]
...