我是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上看到过一些讨论,其中某些功能并未实现用于多设备使用。我将如何确认这一理论?还有我应该检查的其他解释吗?
答案 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)]