0

当我们运行时models/syntaxnet/$ echo "sentence to parse" | ./syntaxnet/demo.sh,哪个特定的张量会收到“要解析的句子”?

我制作了一个 SyntaxNet 服务器(AWS、django)来帮助我完成其他对话任务。每次我向我的服务器发送一个句子查询时,大约需要 3.5 秒才能得到解析的句子。

这对我的任务来说还不够快。所以我试图找到瓶颈在哪里。我发现import tensorflow as tf需要 0.8sec ,实际上需要 1.6 秒(2*0.8 秒),因为 SyntaxNet 有两个步骤(POS 标记和解析),甚至在它加载参数和构建图表之前。

我希望我的服务器始终“清醒”并准备好使用预加载的图形和参数解析句子。所以我尝试调整 SyntaxNet 使其如下工作。会话通过不断地接收用户输入input()并打印计算的张量并且永远不会关闭。

import tensorflow as tf
def multiplication(sess):
    x1 = int(input())
    matrix1 = tf.constant([[x1, x1]]
    matrix2 = tf.constant([[2],[2]])
    product = sess.run([tf.matmul(matrix1, matrix2)])   
    return product
with tf.Session() as sess:
    while True:
        print(multiplication(sess))
------------------------------------------
1
[array([[4]], dtype=int32)]
2
[array([[8]], dtype=int32)]
3
[array([[12]], dtype=int32)]

但是,我无法在哪里实施input()部分。当我们运行时, demo.shmodels/syntaxnet/$ echo "sentence to parse" | ./syntaxnet/demo.sh是如何接收标准输入的?换句话说,“要解析的句子”去哪儿了?我在 bash 脚本中找不到任何内容。read

所以我只是直接运行 parser_eval

python bazel-bin/syntaxnet/parser_eval \
  --input=stdin \
  --output=stdout-conll \
  --hidden_layer_sizes=64 \
  --arg_prefix=brain_tagger \
  --graph_builder=structured \
  --task_context=syntaxnet/models/parsey_mcparseface/context.pbtxt \
  --model_path=syntaxnet/models/parsey_mcparseface/tagger-params \
  --slim_model \
  --batch_size=1024 \
  --alsologtostderr \

并试图找到 python 文件syntaxnet/parser_eval.py在哪里接收输入。

似乎下面的 parser.evaluation['documents'] 以某种方式接收标准输入。

def Eval(sess):
...
...
    while True:
    tf_eval_epochs, tf_eval_metrics, tf_documents = sess.run([
              parser.evaluation['epochs'],
              parser.evaluation['eval_metrics'],
              parser.evaluation['documents'],
          ])

          if len(tf_documents):
            logging.info('Processed %d documents', len(tf_documents))
            num_documents += len(tf_documents)
            sess.run(sink, feed_dict={sink_documents: tf_documents})

          num_tokens += tf_eval_metrics[0]
          num_correct += tf_eval_metrics[1]
          if num_epochs is None:
            num_epochs = tf_eval_epochs
          elif num_epochs < tf_eval_epochs:
            break
...
...
def main(unused_argv):
  print >> sys.stderr, "parser_eval.py main start", time.time()
  logging.set_verbosity(logging.INFO)
  temp_counter = 0

  while True:
    with tf.Session() as sess:
      Eval(sess, temp_counter)
      temp_counter +=1

if __name__ == '__main__':
  tf.app.run()

我也追踪了graph_builder.py, gen_parser_ops.py,但还没有找到哪个特定的张量或变量接收标准输入语句。

您能否解释一下 SyntaxNet 在哪里接收标准输入语句?

如果您能回答一些相关问题,这也会很有帮助。

  • 如何while True:在 parser_eval.py 中放置循环(我在 尝试了一些部分parser_eval.py,但它只接收一次标准输入。)
  • tensorflow 服务可以解决这个问题吗?

提前致谢。

4

1 回答 1

0

syntaxnet protoio包具有执行此读取的实用程序。

于 2016-11-28T19:32:57.627 回答