Tensorflow-无法在Estimator中使用带有MirroredStrategy分布的BasicLSTMCell

时间:2019-10-30 19:13:34

标签: python tensorflow google-cloud-platform google-cloud-ml

我有一个tf.nn.rnn_cell.BasicLSTMCell作为我的NN体系结构的一部分。我使用for循环,因为它在输入中递归固定数量的时间步长。像这样:

    lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=lstm_dimensionality, name="forward_lstm")
    _, (lstm_memory, lstm_hidden) = lstm_cell(input_m, state=[lstm_memory, lstm_hidden])

    for i in range(3):
        # HERE is where the error is thrown
        _, (lstm_memory, lstm_hidden) = lstm_cell(input_m, state=[lstm_memory, lstm_hidden])

在单个设备上本地运行效果很好。它也可以在单个GPU上的Google ML Engine中正常运行。但是,当我尝试使用tf.distribute.MirroredStrategy分配给4个GPU时,会抛出异常

ValueError: At least one of name (None) and default_name (None) must be provided.

可调用的lstm_cell甚至都没有使用name参数,因此很混乱。

这里没有太多的细节空间,因此我在此Github repo中创建了一个玩具示例,以重现ML Engine中的错误。特别是在this line上引发错误的地方。

Tensorflow:1.13.1 ML引擎:--runtime-version 1.13

1 个答案:

答案 0 :(得分:1)

在代码here中,您可以在函数compute_initial_lstm_state中使用范围。

您重用了两个返回的值here

您使用范围来生成值,然后分配它们而没有范围。

这应该是您的根本错误。使用单个GPU,可以自动推断范围。但是对于多GPU,这是不可能的,并且会失败。