服务已保存的模型时如何解决“已设置Retval [0]”

时间:2018-12-26 21:21:38

标签: tensorflow tensorflow-serving

我有一个有效的SavedModel(即在python中还原时可以工作的已保存模型),当在tensorflow服务上运行时失败了。 服务器上的错误消息是:

OP_REQUIRES failed at function_ops.cc:68 : Internal: Retval[0] has already been set.
The REST API returns 500 and specifies the node on the graph:
[[{{node _retval_loop/concat_0_0}}]

复制的确切步骤 (https://drive.google.com/file/d/1at1CQ9iHgcPHCn-MkvSGcgtbVM2lrKJn/view)链接到保存的模型。可以还原并成功在python中运行,但是如果在模型服务器上运行,则会抛出错误。 (将图像作为输入:

sess.run(fetches=["loop/Exit_1:0"],feed_dict={"image_bytes:0": image})

源代码/日志 相关源代码(希望): (包含一个带有concat的while循环)

val, idx =tf.nn.top_k(softmax ,name="topk")
sentence = tf.Variable([vocab.start_id],False,name="sentence",)
sentence = tf.concat([sentence, idx[0]], 0)#

def cond(sentence,state):
    return tf.math.not_equal( 
sentence[-1],tf.constant(vocab.end_id))

def body(sentence,state):
    input_seqs = tf.expand_dims([sentence[-1]], 1)

    seq_embeddings = tf.nn.embedding_lookup(self.embedding_map, 
input_seqs)
    embed = seq_embeddings

    # In inference mode, use concatenated states for convenient feeding and
    # fetching.
    state_feed = tf.concat(axis=1, values=state, name="state")

    # Placeholder for feeding a batch of concatenated states.
    # state_feed = tf.placeholder(dtype=tf.float32,
     #                             shape=[None, 
  sum(lstm_cell.state_size)],
       #                             name="state_feed")
    state_tuple = tf.split(value=state_feed, num_or_size_splits=2, axis=1)

    # Run a single LSTM step.
    lstm_outputs, new_state_tuple = lstm_cell(
        inputs=tf.squeeze(embed, axis=[1]),
        state=state_tuple)

    # Concatentate the resulting state.
    state = tf.concat(axis=1, values=new_state_tuple, name="state")

    # Stack batches vertically.

     lstm_outputs = tf.reshape(lstm_outputs, [-1, lstm_cell.output_size])

    with tf.variable_scope("logits") as logits_scope:
        logits = tf.contrib.layers.fully_connected(
        inputs=lstm_outputs,
        num_outputs=self.config.vocab_size,
        activation_fn=None,
        weights_initializer=self.initializer,
        scope=logits_scope, reuse = True
    )

     softmax = tf.nn.softmax(logits, name="softmax")
     self.softmax = softmax
     val, idx = tf.nn.top_k(softmax, name="topk")

     sentence = tf.concat([sentence,idx[0]],0)
     self.output = sentence
     return [sentence, state]
 out = tf.while_loop(cond, body, [sentence, state],parallel_iterations=1,maximum_iterations=20,name="loop",shape_invariants=[tf.TensorShape([None]),tf.TensorShape([None,None])])

 return out

失败,并显示错误:

W external/org_tensorflow/tensorflow/core/framework/op_kernel.cc:1401] OP_REQUIRES failed at function_ops.cc:68 : Internal: Retval[0] has already been set.

1 个答案:

答案 0 :(得分:0)

可能是sess.run中的输出节点,其节点类型包含EnterMergeLoopCondSwitchExit,{{ 1}}等。