mxnet:在模型中使用RNN时,模型初始化程序在多个GPU的上下文中崩溃

时间:2018-11-29 20:46:20

标签: python gpu mxnet

我是mxnet的新手,正在运行一个脚本,该脚本是根据RNN with gluon上的文档进行了轻微修改的。我修改了代码,以便使用严格的数字时间序列,而不是NLP问题。在修改此行之前,一切运行良好:

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-在其中我还用多个GPU交换了一个,并且运行良好。

这使我认为它是RNN,实际上,当我删除代码的RNN部分(因此它实质上只是一个前馈网络)时,它在任何有效数量的GPU上都可以正常运行。另外,我尝试使用'rnn_relu'选项和'gru'选项,但均因相同的错误而失败。

所以我的问题是:目前mxnet的RNN是否可以通过gluon API与mxnet中的多个GPU(一台机器)一起使用?,我没有看到讨论过的一个方式或其他方式,尽管我在github上看到过一些讨论,其中某些功能并未实现用于多设备使用。我将如何确认这一理论?还有我应该检查的其他解释吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以在MXNet中跨多个GPU(和多台机器)训练RNN。我刚刚确认以下代码可在具有4个GPU的计算机上与MXNet v1.3.0一起使用。

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)]